summaryrefslogtreecommitdiffstats
path: root/module/zfs/spa_misc.c
diff options
context:
space:
mode:
authorMatthew Ahrens <[email protected]>2013-05-16 14:18:06 -0700
committerBrian Behlendorf <[email protected]>2013-11-05 12:14:48 -0800
commit498877baf5038b32c1531e5ec96b435023200f4d (patch)
tree741845c71f02bf2dca826e3a988c7125c8958117 /module/zfs/spa_misc.c
parent03c6040bee6c87a9413b7da41d9f580f79a8ab62 (diff)
Illumos #3112, #3113, #3114
3112 ztest does not honor ZFS_DEBUG 3113 ztest should use watchpoints to protect frozen arc bufs 3114 some leaked nvlists in zfsdev_ioctl Reviewed by: Adam Leventhal <[email protected]> Reviewed by: Matt Amdur <[email protected]> Reviewed by: George Wilson <[email protected]> Reviewed by: Christopher Siden <[email protected]> Approved by: Eric Schrock <[email protected]> References: https://www.illumos.org/issues/3112 https://www.illumos.org/issues/3113 https://www.illumos.org/issues/3114 illumos/illumos-gate@cd1c8b85eb30b568e9816221430c479ace7a559d The /proc/self/cmd watchpoint interface is specific to Solaris. Therefore, the #3113 implementation was reworked to use the more portable mprotect(2) system call. When the pages are watched they are marked read-only for protection. Any write to the protected address range immediately trigger a SIGSEGV. The pages are marked writable again when they are unwatched. Ported-by: Brian Behlendorf <[email protected]> Issue #1489
Diffstat (limited to 'module/zfs/spa_misc.c')
-rw-r--r--module/zfs/spa_misc.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c
index 7bdfbf738..91e7fdf35 100644
--- a/module/zfs/spa_misc.c
+++ b/module/zfs/spa_misc.c
@@ -1630,6 +1630,23 @@ spa_init(int mode)
spa_mode_global = mode;
+#ifndef _KERNEL
+ if (spa_mode_global != FREAD && dprintf_find_string("watch")) {
+ struct sigaction sa;
+
+ sa.sa_flags = SA_SIGINFO;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_sigaction = arc_buf_sigsegv;
+
+ if (sigaction(SIGSEGV, &sa, NULL) == -1) {
+ perror("could not enable watchpoints: "
+ "sigaction(SIGSEGV, ...) = ");
+ } else {
+ arc_watch = B_TRUE;
+ }
+ }
+#endif
+
fm_init();
refcount_init();
unique_init();