comparison usr/src/uts/common/fs/zfs/spa.c @ 14051:849852750426

3749 zfs event processing should work on R/O root filesystems Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Eric Schrock <eric.schrock@delphix.com> Approved by: Christopher Siden <christopher.siden@delphix.com>
author Will Andrews <will@firepipe.net>
date Tue, 11 Jun 2013 09:13:55 -0800
parents 6a5a2f4a47db
children e9e346400fef
comparison
equal deleted inserted replaced
14050:0c8d9998d589 14051:849852750426
77 #endif /* _KERNEL */ 77 #endif /* _KERNEL */
78 78
79 #include "zfs_prop.h" 79 #include "zfs_prop.h"
80 #include "zfs_comutil.h" 80 #include "zfs_comutil.h"
81 81
82 /*
83 * The interval, in seconds, at which failed configuration cache file writes
84 * should be retried.
85 */
86 static int zfs_ccw_retry_interval = 300;
87
82 typedef enum zti_modes { 88 typedef enum zti_modes {
83 ZTI_MODE_FIXED, /* value is # of threads (min 1) */ 89 ZTI_MODE_FIXED, /* value is # of threads (min 1) */
84 ZTI_MODE_ONLINE_PERCENT, /* value is % of online CPUs */ 90 ZTI_MODE_ONLINE_PERCENT, /* value is % of online CPUs */
85 ZTI_MODE_BATCH, /* cpu-intensive; value is ignored */ 91 ZTI_MODE_BATCH, /* cpu-intensive; value is ignored */
86 ZTI_MODE_NULL, /* don't create a taskq */ 92 ZTI_MODE_NULL, /* don't create a taskq */
5660 ASSERT(spa->spa_async_suspended != 0); 5666 ASSERT(spa->spa_async_suspended != 0);
5661 spa->spa_async_suspended--; 5667 spa->spa_async_suspended--;
5662 mutex_exit(&spa->spa_async_lock); 5668 mutex_exit(&spa->spa_async_lock);
5663 } 5669 }
5664 5670
5671 static boolean_t
5672 spa_async_tasks_pending(spa_t *spa)
5673 {
5674 uint_t non_config_tasks;
5675 uint_t config_task;
5676 boolean_t config_task_suspended;
5677
5678 non_config_tasks = spa->spa_async_tasks & ~SPA_ASYNC_CONFIG_UPDATE;
5679 config_task = spa->spa_async_tasks & SPA_ASYNC_CONFIG_UPDATE;
5680 if (spa->spa_ccw_fail_time == 0) {
5681 config_task_suspended = B_FALSE;
5682 } else {
5683 config_task_suspended =
5684 (gethrtime() - spa->spa_ccw_fail_time) <
5685 (zfs_ccw_retry_interval * NANOSEC);
5686 }
5687
5688 return (non_config_tasks || (config_task && !config_task_suspended));
5689 }
5690
5665 static void 5691 static void
5666 spa_async_dispatch(spa_t *spa) 5692 spa_async_dispatch(spa_t *spa)
5667 { 5693 {
5668 mutex_enter(&spa->spa_async_lock); 5694 mutex_enter(&spa->spa_async_lock);
5669 if (spa->spa_async_tasks && !spa->spa_async_suspended && 5695 if (spa_async_tasks_pending(spa) &&
5696 !spa->spa_async_suspended &&
5670 spa->spa_async_thread == NULL && 5697 spa->spa_async_thread == NULL &&
5671 rootdir != NULL && !vn_is_readonly(rootdir)) 5698 rootdir != NULL)
5672 spa->spa_async_thread = thread_create(NULL, 0, 5699 spa->spa_async_thread = thread_create(NULL, 0,
5673 spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri); 5700 spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri);
5674 mutex_exit(&spa->spa_async_lock); 5701 mutex_exit(&spa->spa_async_lock);
5675 } 5702 }
5676 5703