summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Chase <[email protected]>2018-03-13 12:43:14 -0500
committerBrian Behlendorf <[email protected]>2018-03-13 10:43:14 -0700
commit02638a30efb0e9800fdc8834d5b7ab66432db00a (patch)
tree297c7f37319b1ffbd0478bd874e14069d2b32b34
parent83362e8e676a3ffae6b3b21f350f9b999a068605 (diff)
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 <[email protected]> Signed-off-by: Tim Chase <[email protected]> Closes #7293
-rw-r--r--man/man5/zfs-module-parameters.514
-rw-r--r--module/zfs/vdev.c16
2 files changed, 30 insertions, 0 deletions
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
@@ -1715,6 +1715,20 @@ Default value: \fB3,000\fR.
.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
\fBzfs_scrub_min_time_ms\fR (int)
.ad
.RS 12n
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
@@ -67,6 +67,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.
*/
@@ -1964,6 +1970,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
* excise regions on vdevs that were available during
@@ -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