Illumos 6414 - vdev_config_sync could be simpler
6414 vdev_config_sync could be simpler Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Approved by: Robert Mustacchi <rm@joyent.com> References: https://www.illumos.org/issues/6414 https://github.com/illumos/illumos-gate/commit/eb5bb58 Ported-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
This commit is contained in:
parent
1a04bab348
commit
b6fcb792ca
|
@ -121,8 +121,7 @@ extern void vdev_queue_io_done(zio_t *zio);
|
||||||
|
|
||||||
extern void vdev_config_dirty(vdev_t *vd);
|
extern void vdev_config_dirty(vdev_t *vd);
|
||||||
extern void vdev_config_clean(vdev_t *vd);
|
extern void vdev_config_clean(vdev_t *vd);
|
||||||
extern int vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg,
|
extern int vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg);
|
||||||
boolean_t);
|
|
||||||
|
|
||||||
extern void vdev_state_dirty(vdev_t *vd);
|
extern void vdev_state_dirty(vdev_t *vd);
|
||||||
extern void vdev_state_clean(vdev_t *vd);
|
extern void vdev_state_clean(vdev_t *vd);
|
||||||
|
|
|
@ -6518,16 +6518,10 @@ spa_sync(spa_t *spa, uint64_t txg)
|
||||||
if (svdcount == SPA_DVAS_PER_BP)
|
if (svdcount == SPA_DVAS_PER_BP)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
error = vdev_config_sync(svd, svdcount, txg, B_FALSE);
|
error = vdev_config_sync(svd, svdcount, txg);
|
||||||
if (error != 0)
|
|
||||||
error = vdev_config_sync(svd, svdcount, txg,
|
|
||||||
B_TRUE);
|
|
||||||
} else {
|
} else {
|
||||||
error = vdev_config_sync(rvd->vdev_child,
|
error = vdev_config_sync(rvd->vdev_child,
|
||||||
rvd->vdev_children, txg, B_FALSE);
|
rvd->vdev_children, txg);
|
||||||
if (error != 0)
|
|
||||||
error = vdev_config_sync(rvd->vdev_child,
|
|
||||||
rvd->vdev_children, txg, B_TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
|
|
|
@ -1187,15 +1187,16 @@ vdev_label_sync_list(spa_t *spa, int l, uint64_t txg, int flags)
|
||||||
* at any time, you can just call it again, and it will resume its work.
|
* at any time, you can just call it again, and it will resume its work.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg, boolean_t tryhard)
|
vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg)
|
||||||
{
|
{
|
||||||
spa_t *spa = svd[0]->vdev_spa;
|
spa_t *spa = svd[0]->vdev_spa;
|
||||||
uberblock_t *ub = &spa->spa_uberblock;
|
uberblock_t *ub = &spa->spa_uberblock;
|
||||||
vdev_t *vd;
|
vdev_t *vd;
|
||||||
zio_t *zio;
|
zio_t *zio;
|
||||||
int error;
|
int error = 0;
|
||||||
int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL;
|
int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL;
|
||||||
|
|
||||||
|
retry:
|
||||||
/*
|
/*
|
||||||
* Normally, we don't want to try too hard to write every label and
|
* Normally, we don't want to try too hard to write every label and
|
||||||
* uberblock. If there is a flaky disk, we don't want the rest of the
|
* uberblock. If there is a flaky disk, we don't want the rest of the
|
||||||
|
@ -1203,8 +1204,11 @@ vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg, boolean_t tryhard)
|
||||||
* single label out, we should retry with ZIO_FLAG_TRYHARD before
|
* single label out, we should retry with ZIO_FLAG_TRYHARD before
|
||||||
* bailing out and declaring the pool faulted.
|
* bailing out and declaring the pool faulted.
|
||||||
*/
|
*/
|
||||||
if (tryhard)
|
if (error != 0) {
|
||||||
|
if ((flags & ZIO_FLAG_TRYHARD) != 0)
|
||||||
|
return (error);
|
||||||
flags |= ZIO_FLAG_TRYHARD;
|
flags |= ZIO_FLAG_TRYHARD;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT(ub->ub_txg <= txg);
|
ASSERT(ub->ub_txg <= txg);
|
||||||
|
|
||||||
|
@ -1248,7 +1252,7 @@ vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg, boolean_t tryhard)
|
||||||
* are committed to stable storage before the uberblock update.
|
* are committed to stable storage before the uberblock update.
|
||||||
*/
|
*/
|
||||||
if ((error = vdev_label_sync_list(spa, 0, txg, flags)) != 0)
|
if ((error = vdev_label_sync_list(spa, 0, txg, flags)) != 0)
|
||||||
return (error);
|
goto retry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sync the uberblocks to all vdevs in svd[].
|
* Sync the uberblocks to all vdevs in svd[].
|
||||||
|
@ -1266,7 +1270,7 @@ vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg, boolean_t tryhard)
|
||||||
* to the new uberblocks.
|
* to the new uberblocks.
|
||||||
*/
|
*/
|
||||||
if ((error = vdev_uberblock_sync_list(svd, svdcount, ub, flags)) != 0)
|
if ((error = vdev_uberblock_sync_list(svd, svdcount, ub, flags)) != 0)
|
||||||
return (error);
|
goto retry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sync out odd labels for every dirty vdev. If the system dies
|
* Sync out odd labels for every dirty vdev. If the system dies
|
||||||
|
@ -1278,5 +1282,8 @@ vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg, boolean_t tryhard)
|
||||||
* to disk to ensure that all odd-label updates are committed to
|
* to disk to ensure that all odd-label updates are committed to
|
||||||
* stable storage before the next transaction group begins.
|
* stable storage before the next transaction group begins.
|
||||||
*/
|
*/
|
||||||
return (vdev_label_sync_list(spa, 1, txg, flags));
|
if ((error = vdev_label_sync_list(spa, 1, txg, flags)) != 0)
|
||||||
|
goto retry;
|
||||||
|
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue