diff options
author | David Teigland <teigland@redhat.com> | 2008-08-18 11:43:30 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2008-08-28 11:49:43 -0500 |
commit | dc68c7ed362a00a48290252573a8eb9f74463c3a (patch) | |
tree | 99b8b64ea08d4990373d09e01b7bac2566ad3879 /fs/dlm/lockspace.c | |
parent | 0f8e0d9a317406612700426fad3efab0b7bbc467 (diff) | |
download | linux-dc68c7ed362a00a48290252573a8eb9f74463c3a.tar.gz linux-dc68c7ed362a00a48290252573a8eb9f74463c3a.tar.bz2 linux-dc68c7ed362a00a48290252573a8eb9f74463c3a.zip |
dlm: detect available userspace daemon
If dlm_controld (the userspace daemon that controls the setup and
recovery of the dlm) fails, the kernel should shut down the lockspaces
in the kernel rather than leaving them running. This is detected by
having dlm_controld hold a misc device open while running, and if
the kernel detects a close while the daemon is still needed, it stops
the lockspaces in the kernel.
Knowing that the userspace daemon isn't running also allows the
lockspace create/remove routines to avoid waiting on the daemon
for join/leave operations.
Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/dlm/lockspace.c')
-rw-r--r-- | fs/dlm/lockspace.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index 56eae4e4a954..ba672fe0a601 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c @@ -378,6 +378,11 @@ static int new_lockspace(char *name, int namelen, void **lockspace, if (!try_module_get(THIS_MODULE)) return -EINVAL; + if (!dlm_user_daemon_available()) { + module_put(THIS_MODULE); + return -EUNATCH; + } + error = 0; spin_lock(&lslist_lock); @@ -669,7 +674,7 @@ static int release_lockspace(struct dlm_ls *ls, int force) dlm_device_deregister(ls); - if (force < 3) + if (force < 3 && dlm_user_daemon_available()) do_uevent(ls, 0); dlm_recoverd_stop(ls); @@ -791,3 +796,20 @@ int dlm_release_lockspace(void *lockspace, int force) return error; } +void dlm_stop_lockspaces(void) +{ + struct dlm_ls *ls; + + restart: + spin_lock(&lslist_lock); + list_for_each_entry(ls, &lslist, ls_list) { + if (!test_bit(LSFL_RUNNING, &ls->ls_flags)) + continue; + spin_unlock(&lslist_lock); + log_error(ls, "no userland control daemon, stopping lockspace"); + dlm_ls_stop(ls); + goto restart; + } + spin_unlock(&lslist_lock); +} + |