diff options
author | Olaf Faaland <[email protected]> | 2017-05-02 13:55:24 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-05-02 13:55:24 -0700 |
commit | 9d3f7b87919b7d0d869153ca72844f565cd0bf52 (patch) | |
tree | cdfb1aae9160c70ad29405d39cff1a5fb8ba7607 /module/zfs/vdev.c | |
parent | e7fbeb606a18b9f04daadddc19b9c4f9a9b34841 (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.c | 7 |
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; /* |