Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Mar 2020 19:03:11 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r359018 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <202003161903.02GJ3BhB002790@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Mar 16 19:03:10 2020
New Revision: 359018
URL: https://svnweb.freebsd.org/changeset/base/359018

Log:
  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
  openzfs/zfs@fa130e010c2ff9b33aba11d2699b667e454b3ccb

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c	Mon Mar 16 16:17:58 2020	(r359017)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c	Mon Mar 16 19:03:10 2020	(r359018)
@@ -1105,10 +1105,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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202003161903.02GJ3BhB002790>