From 02638a30efb0e9800fdc8834d5b7ab66432db00a Mon Sep 17 00:00:00 2001 From: Tim Chase Date: Tue, 13 Mar 2018 12:43:14 -0500 Subject: [PATCH] Add zfs_scan_ignore_errors tunable When it's set, a DTL range will be cleared even if its scan/scrub had errors. This allows to work around resilver/scrub upon import when the pool has errors. Reviewed-by: Brian Behlendorf Signed-off-by: Tim Chase Closes #7293 --- man/man5/zfs-module-parameters.5 | 14 ++++++++++++++ module/zfs/vdev.c | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5 index a4b6b4f3a..8515bf087 100644 --- a/man/man5/zfs-module-parameters.5 +++ b/man/man5/zfs-module-parameters.5 @@ -1712,6 +1712,20 @@ at least this much time working on a resilver between txg flushes. Default value: \fB3,000\fR. .RE +.sp +.ne 2 +.na +\fBzfs_scan_ignore_errors\fR (int) +.ad +.RS 12n +If set to a nonzero value, remove the DTL (dirty time list) upon +completion of a pool scan (scrub) even if there were unrepairable +errors. It is intended to be used during pool repair or recovery to +stop resilvering when the pool is next imported. +.sp +Default value: \fB0\fR. +.RE + .sp .ne 2 .na diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c index 172485f6e..8ab996434 100644 --- a/module/zfs/vdev.c +++ b/module/zfs/vdev.c @@ -66,6 +66,12 @@ unsigned int zfs_delays_per_second = 20; */ unsigned int zfs_checksums_per_second = 20; +/* + * Ignore errors during scrub/resilver. Allows to work around resilver + * upon import when there are pool errors. + */ +int zfs_scan_ignore_errors = 0; + /* * Virtual device management. */ @@ -1963,6 +1969,12 @@ vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, int scrub_done) mutex_enter(&vd->vdev_dtl_lock); + /* + * If requested, pretend the scan completed cleanly. + */ + if (zfs_scan_ignore_errors && scn) + scn->scn_phys.scn_errors = 0; + /* * If we've completed a scan cleanly then determine * if this vdev should remove any DTLs. We only want to @@ -3777,5 +3789,9 @@ module_param(zfs_checksums_per_second, uint, 0644); MODULE_PARM_DESC(zfs_checksums_per_second, "Rate limit checksum events " "to this many checksum errors per second (do not set below zed" "threshold)."); + +module_param(zfs_scan_ignore_errors, int, 0644); +MODULE_PARM_DESC(zfs_scan_ignore_errors, + "Ignore errors during resilver/scrub"); /* END CSTYLED */ #endif