diff options
author | Brian Behlendorf <[email protected]> | 2016-01-11 13:46:29 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-01-11 14:10:30 -0800 |
commit | b870c7e5f4fe4520a32277bcc57b10a200a390aa (patch) | |
tree | ce8218d79bbe9fb5fb2ec809029becefb3a464fa /module/zfs/spa_config.c | |
parent | 928c58dd0f297024363f8703cc57670fa9c96db7 (diff) |
Revert "Illumos 3749 - zfs event processing should work on R/O root filesystems"
This reverts commit b47637ecdc7b647ec5bd9dfca888179eecfaa72d which
introduced a regression in ztest.
$ ./cmd/ztest/ztest -V
5 vdevs, 7 datasets, 23 threads, 300 seconds...
*** Error in `/rpool/home/behlendo/src/git/zfs/cmd/ztest/.libs/lt-ztest':
double free or corruption (fasttop): 0x0000000000d339f0 ***
Diffstat (limited to 'module/zfs/spa_config.c')
-rw-r--r-- | module/zfs/spa_config.c | 65 |
1 files changed, 18 insertions, 47 deletions
diff --git a/module/zfs/spa_config.c b/module/zfs/spa_config.c index 831eca7f5..19432e0a0 100644 --- a/module/zfs/spa_config.c +++ b/module/zfs/spa_config.c @@ -26,7 +26,6 @@ */ #include <sys/spa.h> -#include <sys/fm/fs/zfs.h> #include <sys/spa_impl.h> #include <sys/nvpair.h> #include <sys/uio.h> @@ -146,22 +145,22 @@ out: kobj_close_file(file); } -static int +static void spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl) { size_t buflen; char *buf; vnode_t *vp; int oflags = FWRITE | FTRUNC | FCREAT | FOFFMAX; + int error; char *temp; - int err; /* * If the nvlist is empty (NULL), then remove the old cachefile. */ if (nvl == NULL) { - err = vn_remove(dp->scd_path, UIO_SYSSPACE, RMFILE); - return (err); + (void) vn_remove(dp->scd_path, UIO_SYSSPACE, RMFILE); + return; } /* @@ -182,16 +181,16 @@ spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl) * and overwritten in place. In the event of an error the file is * unlinked to make sure we always have a consistent view of the data. */ - err = vn_open(dp->scd_path, UIO_SYSSPACE, oflags, 0644, &vp, 0, 0); - if (err == 0) { - err = vn_rdwr(UIO_WRITE, vp, buf, buflen, 0, + error = vn_open(dp->scd_path, UIO_SYSSPACE, oflags, 0644, &vp, 0, 0); + if (error == 0) { + error = vn_rdwr(UIO_WRITE, vp, buf, buflen, 0, UIO_SYSSPACE, 0, RLIM64_INFINITY, kcred, NULL); - if (err == 0) - err = VOP_FSYNC(vp, FSYNC, kcred, NULL); + if (error == 0) + error = VOP_FSYNC(vp, FSYNC, kcred, NULL); (void) VOP_CLOSE(vp, oflags, 1, 0, kcred, NULL); - if (err) + if (error) (void) vn_remove(dp->scd_path, UIO_SYSSPACE, RMFILE); } #else @@ -202,16 +201,14 @@ spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl) */ (void) snprintf(temp, MAXPATHLEN, "%s.tmp", dp->scd_path); - err = vn_open(temp, UIO_SYSSPACE, oflags, 0644, &vp, CRCREAT, 0); - if (err == 0) { - err = vn_rdwr(UIO_WRITE, vp, buf, buflen, 0, UIO_SYSSPACE, - 0, RLIM64_INFINITY, kcred, NULL); - if (err == 0) - err = VOP_FSYNC(vp, FSYNC, kcred, NULL); - if (err == 0) - err = vn_rename(temp, dp->scd_path, UIO_SYSSPACE); + error = vn_open(temp, UIO_SYSSPACE, oflags, 0644, &vp, CRCREAT, 0); + if (error == 0) { + if (vn_rdwr(UIO_WRITE, vp, buf, buflen, 0, UIO_SYSSPACE, + 0, RLIM64_INFINITY, kcred, NULL) == 0 && + VOP_FSYNC(vp, FSYNC, kcred, NULL) == 0) { + (void) vn_rename(temp, dp->scd_path, UIO_SYSSPACE); + } (void) VOP_CLOSE(vp, oflags, 1, 0, kcred, NULL); - VN_RELE(vp); } (void) vn_remove(temp, UIO_SYSSPACE, RMFILE); @@ -219,7 +216,6 @@ spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl) vmem_free(buf, buflen); kmem_free(temp, MAXPATHLEN); - return (err); } /* @@ -237,8 +233,6 @@ spa_config_sync(spa_t *target, boolean_t removing, boolean_t postsysevent) spa_config_dirent_t *dp, *tdp; nvlist_t *nvl; char *pool_name; - boolean_t ccw_failure; - int error = 0; ASSERT(MUTEX_HELD(&spa_namespace_lock)); @@ -250,7 +244,6 @@ spa_config_sync(spa_t *target, boolean_t removing, boolean_t postsysevent) * cachefile is changed, the new one is pushed onto this list, allowing * us to update previous cachefiles that no longer contain this pool. */ - ccw_failure = B_FALSE; for (dp = list_head(&target->spa_config_list); dp != NULL; dp = list_next(&target->spa_config_list, dp)) { spa_t *spa = NULL; @@ -297,32 +290,10 @@ spa_config_sync(spa_t *target, boolean_t removing, boolean_t postsysevent) mutex_exit(&spa->spa_props_lock); } - error = spa_config_write(dp, nvl); - if (error != 0) - ccw_failure = B_TRUE; + spa_config_write(dp, nvl); nvlist_free(nvl); } - if (ccw_failure) { - /* - * Keep trying so that configuration data is - * written if/when any temporary filesystem - * resource issues are resolved. - */ - if (target->spa_ccw_fail_time == 0) { - zfs_ereport_post(FM_EREPORT_ZFS_CONFIG_CACHE_WRITE, - target, NULL, NULL, 0, 0); - } - target->spa_ccw_fail_time = gethrtime(); - spa_async_request(target, SPA_ASYNC_CONFIG_UPDATE); - } else { - /* - * Do not rate limit future attempts to update - * the config cache. - */ - target->spa_ccw_fail_time = 0; - } - /* * Remove any config entries older than the current one. */ |