summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorMatthew Ahrens <[email protected]>2016-12-16 10:31:01 -0800
committerBrian Behlendorf <[email protected]>2018-04-17 10:45:47 -0700
commit7f96cc23acf78a325897498b91416b7831a539e3 (patch)
tree4585f722704837dc6fcdf9bd6b122ebe980bd18e /module
parentd830d4795a210b5ba85482fe26909e64857af763 (diff)
OpenZFS 9192 - explicitly pass good_writes to vdev_uberblock/label_sync
Authored by: Matthew Ahrens <[email protected]> Reviewed by: Pavel Zakharov <[email protected]> Reviewed by: George Wilson <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Approved by: Richard Lowe <[email protected]> Ported-by: Giuseppe Di Natale <[email protected]> Currently vdev_label_sync and vdev_uberblock_sync take a zio_t and assume that its io_private is a pointer to the good_writes count. They should instead accept this argument explicitly. OpenZFS-issue: https://www.illumos.org/issues/9192 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/3f4c0b602d Closes #7446
Diffstat (limited to 'module')
-rw-r--r--module/zfs/vdev_label.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/module/zfs/vdev_label.c b/module/zfs/vdev_label.c
index 70d68d903..b91e332de 100644
--- a/module/zfs/vdev_label.c
+++ b/module/zfs/vdev_label.c
@@ -1280,10 +1280,13 @@ vdev_uberblock_sync_done(zio_t *zio)
* Write the uberblock to all labels of all leaves of the specified vdev.
*/
static void
-vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags)
+vdev_uberblock_sync(zio_t *zio, uint64_t *good_writes,
+ uberblock_t *ub, vdev_t *vd, int flags)
{
- for (int c = 0; c < vd->vdev_children; c++)
- vdev_uberblock_sync(zio, ub, vd->vdev_child[c], flags);
+ for (uint64_t c = 0; c < vd->vdev_children; c++) {
+ vdev_uberblock_sync(zio, good_writes,
+ ub, vd->vdev_child[c], flags);
+ }
if (!vd->vdev_ops->vdev_op_leaf)
return;
@@ -1309,7 +1312,7 @@ vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags)
for (int l = 0; l < VDEV_LABELS; l++)
vdev_label_write(zio, vd, l, ub_abd,
VDEV_UBERBLOCK_OFFSET(vd, n), VDEV_UBERBLOCK_SIZE(vd),
- vdev_uberblock_sync_done, zio->io_private,
+ vdev_uberblock_sync_done, good_writes,
flags | ZIO_FLAG_DONT_PROPAGATE);
abd_free(ub_abd);
@@ -1323,10 +1326,10 @@ vdev_uberblock_sync_list(vdev_t **svd, int svdcount, uberblock_t *ub, int flags)
zio_t *zio;
uint64_t good_writes = 0;
- zio = zio_root(spa, NULL, &good_writes, flags);
+ zio = zio_root(spa, NULL, NULL, flags);
for (int v = 0; v < svdcount; v++)
- vdev_uberblock_sync(zio, ub, svd[v], flags);
+ vdev_uberblock_sync(zio, &good_writes, ub, svd[v], flags);
(void) zio_wait(zio);
@@ -1387,7 +1390,8 @@ vdev_label_sync_ignore_done(zio_t *zio)
* Write all even or odd labels to all leaves of the specified vdev.
*/
static void
-vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
+vdev_label_sync(zio_t *zio, uint64_t *good_writes,
+ vdev_t *vd, int l, uint64_t txg, int flags)
{
nvlist_t *label;
vdev_phys_t *vp;
@@ -1395,8 +1399,10 @@ vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
char *buf;
size_t buflen;
- for (int c = 0; c < vd->vdev_children; c++)
- vdev_label_sync(zio, vd->vdev_child[c], l, txg, flags);
+ for (int c = 0; c < vd->vdev_children; c++) {
+ vdev_label_sync(zio, good_writes,
+ vd->vdev_child[c], l, txg, flags);
+ }
if (!vd->vdev_ops->vdev_op_leaf)
return;
@@ -1421,7 +1427,7 @@ vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
vdev_label_write(zio, vd, l, vp_abd,
offsetof(vdev_label_t, vl_vdev_phys),
sizeof (vdev_phys_t),
- vdev_label_sync_done, zio->io_private,
+ vdev_label_sync_done, good_writes,
flags | ZIO_FLAG_DONT_PROPAGATE);
}
}
@@ -1453,7 +1459,7 @@ vdev_label_sync_list(spa_t *spa, int l, uint64_t txg, int flags)
(vd->vdev_islog || vd->vdev_aux != NULL) ?
vdev_label_sync_ignore_done : vdev_label_sync_top_done,
good_writes, flags);
- vdev_label_sync(vio, vd, l, txg, flags);
+ vdev_label_sync(vio, good_writes, vd, l, txg, flags);
zio_nowait(vio);
}