aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs/vdev.c
diff options
context:
space:
mode:
authorOlaf Faaland <[email protected]>2017-05-02 13:55:24 -0700
committerBrian Behlendorf <[email protected]>2017-05-02 13:55:24 -0700
commit9d3f7b87919b7d0d869153ca72844f565cd0bf52 (patch)
treecdfb1aae9160c70ad29405d39cff1a5fb8ba7607 /module/zfs/vdev.c
parente7fbeb606a18b9f04daadddc19b9c4f9a9b34841 (diff)
Write label 2,3 uberblocks when vdev expands
When vdev_psize increases, the location of labels 2 and 3 changes because their location is relative to the end of the device. The configs for labels 2 and 3 are written during the next spa_sync() because the vdev is added to the dirty config list. However, the uberblock rings are not re-written in their new location, leaving the device vulnerable to the beginning of the device being overwritten or damaged. This patch copies the uberblock ring from label 0 to labels 2 and 3, in their new locations, at the next sync after vdev_psize increases. Also, add a test zpool_expand_004_pos.ksh to confirm the uberblocks are copied. Reviewed-by: BearBabyLiu <[email protected]> Reviewed-by: Andreas Dilger <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Olaf Faaland <[email protected]> Closes #5108
Diffstat (limited to 'module/zfs/vdev.c')
-rw-r--r--module/zfs/vdev.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
index da0639102..dfb1ef522 100644
--- a/module/zfs/vdev.c
+++ b/module/zfs/vdev.c
@@ -1330,6 +1330,13 @@ vdev_open(vdev_t *vd)
max_asize = max_osize;
}
+ /*
+ * If the vdev was expanded, record this so that we can re-create the
+ * uberblock rings in labels {2,3}, during the next sync.
+ */
+ if ((psize > vd->vdev_psize) && (vd->vdev_psize != 0))
+ vd->vdev_copy_uberblocks = B_TRUE;
+
vd->vdev_psize = psize;
/*