diff options
author | mishra <none@none> | 2007-02-22 13:40:56 -0800 |
---|---|---|
committer | mishra <none@none> | 2007-02-22 13:40:56 -0800 |
commit | 05b2b3b80d84f3c379ea0df61a0f73fd87db2748 (patch) | |
tree | 241aa7e212dcd7e0621782545e4c0f49235b5cf6 /usr/src/uts/common/fs/zfs/vdev.c | |
parent | e9e2cfb27ea426a3f9e26db3c7cf506e0c20ced0 (diff) | |
download | illumos-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.c | 9 |
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; } /* |