aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2016-01-11 13:46:29 -0800
committerBrian Behlendorf <[email protected]>2016-01-11 14:10:30 -0800
commitb870c7e5f4fe4520a32277bcc57b10a200a390aa (patch)
treece8218d79bbe9fb5fb2ec809029becefb3a464fa /module
parent928c58dd0f297024363f8703cc57670fa9c96db7 (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')
-rw-r--r--module/zfs/spa.c31
-rw-r--r--module/zfs/spa_config.c65
2 files changed, 20 insertions, 76 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c
index ffefbd345..d7b800adf 100644
--- a/module/zfs/spa.c
+++ b/module/zfs/spa.c
@@ -82,12 +82,6 @@
#include "zfs_prop.h"
#include "zfs_comutil.h"
-/*
- * The interval, in seconds, at which failed configuration cache file writes
- * should be retried.
- */
-static int zfs_ccw_retry_interval = 300;
-
typedef enum zti_modes {
ZTI_MODE_FIXED, /* value is # of threads (min 1) */
ZTI_MODE_BATCH, /* cpu-intensive; value is ignored */
@@ -5918,34 +5912,13 @@ spa_async_resume(spa_t *spa)
mutex_exit(&spa->spa_async_lock);
}
-static boolean_t
-spa_async_tasks_pending(spa_t *spa)
-{
- uint_t non_config_tasks;
- uint_t config_task;
- boolean_t config_task_suspended;
-
- non_config_tasks = spa->spa_async_tasks & ~SPA_ASYNC_CONFIG_UPDATE;
- config_task = spa->spa_async_tasks & SPA_ASYNC_CONFIG_UPDATE;
- if (spa->spa_ccw_fail_time == 0) {
- config_task_suspended = B_FALSE;
- } else {
- config_task_suspended =
- (gethrtime() - spa->spa_ccw_fail_time) <
- (zfs_ccw_retry_interval * NANOSEC);
- }
-
- return (non_config_tasks || (config_task && !config_task_suspended));
-}
-
static void
spa_async_dispatch(spa_t *spa)
{
mutex_enter(&spa->spa_async_lock);
- if (spa_async_tasks_pending(spa) &&
- !spa->spa_async_suspended &&
+ if (spa->spa_async_tasks && !spa->spa_async_suspended &&
spa->spa_async_thread == NULL &&
- rootdir != NULL)
+ rootdir != NULL && !vn_is_readonly(rootdir))
spa->spa_async_thread = thread_create(NULL, 0,
spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri);
mutex_exit(&spa->spa_async_lock);
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.
*/