mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 01:51:00 +03:00
Fix infinite scan on a pool with only special allocations
Attempt to run scrub or resilver on a new pool containing only special allocations (special vdev added on creation) caused infinite loop because of dsl_scan_should_clear() limiting memory usage to 5% of pool size, which it calculated accounting only normal allocation class. Addition of special and just in case dedup classes fixes the issue. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored-By: iXsystems, Inc. Closes #10106 Closes #8694
This commit is contained in:
parent
94eb65b4c1
commit
fa130e010c
@ -1194,10 +1194,13 @@ scan_ds_queue_sync(dsl_scan_t *scn, dmu_tx_t *tx)
|
||||
static boolean_t
|
||||
dsl_scan_should_clear(dsl_scan_t *scn)
|
||||
{
|
||||
spa_t *spa = scn->scn_dp->dp_spa;
|
||||
vdev_t *rvd = scn->scn_dp->dp_spa->spa_root_vdev;
|
||||
uint64_t mlim_hard, mlim_soft, mused;
|
||||
uint64_t alloc = metaslab_class_get_alloc(spa_normal_class(
|
||||
scn->scn_dp->dp_spa));
|
||||
uint64_t alloc, mlim_hard, mlim_soft, mused;
|
||||
|
||||
alloc = metaslab_class_get_alloc(spa_normal_class(spa));
|
||||
alloc += metaslab_class_get_alloc(spa_special_class(spa));
|
||||
alloc += metaslab_class_get_alloc(spa_dedup_class(spa));
|
||||
|
||||
mlim_hard = MAX((physmem / zfs_scan_mem_lim_fact) * PAGESIZE,
|
||||
zfs_scan_mem_lim_min);
|
||||
|
Loading…
Reference in New Issue
Block a user