summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/zfs/vdev.c
diff options
context:
space:
mode:
authormishra <none@none>2007-02-22 13:40:56 -0800
committermishra <none@none>2007-02-22 13:40:56 -0800
commit05b2b3b80d84f3c379ea0df61a0f73fd87db2748 (patch)
tree241aa7e212dcd7e0621782545e4c0f49235b5cf6 /usr/src/uts/common/fs/zfs/vdev.c
parente9e2cfb27ea426a3f9e26db3c7cf506e0c20ced0 (diff)
downloadillumos-gate-05b2b3b80d84f3c379ea0df61a0f73fd87db2748.tar.gz
6456888 zpool scrubbing leads to memory exhaustion and system hang
Diffstat (limited to 'usr/src/uts/common/fs/zfs/vdev.c')
-rw-r--r--usr/src/uts/common/fs/zfs/vdev.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/zfs/vdev.c b/usr/src/uts/common/fs/zfs/vdev.c
index 0e96289ef4..03bf05d6ae 100644
--- a/usr/src/uts/common/fs/zfs/vdev.c
+++ b/usr/src/uts/common/fs/zfs/vdev.c
@@ -57,6 +57,9 @@ static vdev_ops_t *vdev_ops_table[] = {
NULL
};
+/* maximum scrub/resilver I/O queue */
+int zfs_scrub_limit = 70;
+
/*
* Given a vdev type, return the appropriate ops vector.
*/
@@ -194,6 +197,9 @@ vdev_add_child(vdev_t *pvd, vdev_t *cvd)
*/
for (; pvd != NULL; pvd = pvd->vdev_parent)
pvd->vdev_guid_sum += cvd->vdev_guid_sum;
+
+ if (cvd->vdev_ops->vdev_op_leaf)
+ cvd->vdev_spa->spa_scrub_maxinflight += zfs_scrub_limit;
}
void
@@ -228,6 +234,9 @@ vdev_remove_child(vdev_t *pvd, vdev_t *cvd)
*/
for (; pvd != NULL; pvd = pvd->vdev_parent)
pvd->vdev_guid_sum -= cvd->vdev_guid_sum;
+
+ if (cvd->vdev_ops->vdev_op_leaf)
+ cvd->vdev_spa->spa_scrub_maxinflight -= zfs_scrub_limit;
}
/*