Mercurial > illumos > illumos-gate
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 |