diff options
author | David Teigland <teigland@redhat.com> | 2012-04-26 16:54:29 -0400 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2012-05-02 15:15:27 -0400 |
commit | 4875647a08e35f77274838d97ca8fa44158d50e2 (patch) | |
tree | bf8a39eaf3219af5d661ed3e347545306fd84bda /fs/gfs2 | |
parent | 6d40c4a708e0e996fd9c60d4093aebba5fe1f749 (diff) |
dlm: fixes for nodir mode
The "nodir" mode (statically assign master nodes instead
of using the resource directory) has always been highly
experimental, and never seriously used. This commit
fixes a number of problems, making nodir much more usable.
- Major change to recovery: recover all locks and restart
all in-progress operations after recovery. In some
cases it's not possible to know which in-progess locks
to recover, so recover all. (Most require recovery
in nodir mode anyway since rehashing changes most
master nodes.)
- Change the way nodir mode is enabled, from a command
line mount arg passed through gfs2, into a sysfs
file managed by dlm_controld, consistent with the
other config settings.
- Allow recovering MSTCPY locks on an rsb that has not
yet been turned into a master copy.
- Ignore RCOM_LOCK and RCOM_LOCK_REPLY recovery messages
from a previous, aborted recovery cycle. Base this
on the local recovery status not being in the state
where any nodes should be sending LOCK messages for the
current recovery cycle.
- Hold rsb lock around dlm_purge_mstcpy_locks() because it
may run concurrently with dlm_recover_master_copy().
- Maintain highbast on process-copy lkb's (in addition to
the master as is usual), because the lkb can switch
back and forth between being a master and being a
process copy as the master node changes in recovery.
- When recovering MSTCPY locks, flag rsb's that have
non-empty convert or waiting queues for granting
at the end of recovery. (Rename flag from LOCKS_PURGED
to RECOVER_GRANT and similar for the recovery function,
because it's not only resources with purged locks
that need grant a grant attempt.)
- Replace a couple of unnecessary assertion panics with
error messages.
Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/incore.h | 1 | ||||
-rw-r--r-- | fs/gfs2/lock_dlm.c | 2 | ||||
-rw-r--r-- | fs/gfs2/ops_fstype.c | 7 |
3 files changed, 1 insertions, 9 deletions
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 47d0bda5ac2b..c7975bf4fd43 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
@@ -556,7 +556,6 @@ struct gfs2_sb_host { | |||
556 | struct lm_lockstruct { | 556 | struct lm_lockstruct { |
557 | int ls_jid; | 557 | int ls_jid; |
558 | unsigned int ls_first; | 558 | unsigned int ls_first; |
559 | unsigned int ls_nodir; | ||
560 | const struct lm_lockops *ls_ops; | 559 | const struct lm_lockops *ls_ops; |
561 | dlm_lockspace_t *ls_dlm; | 560 | dlm_lockspace_t *ls_dlm; |
562 | 561 | ||
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 5f5e70e047dc..4a38db739ca0 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c | |||
@@ -1209,8 +1209,6 @@ static int gdlm_mount(struct gfs2_sbd *sdp, const char *table) | |||
1209 | fsname++; | 1209 | fsname++; |
1210 | 1210 | ||
1211 | flags = DLM_LSFL_FS | DLM_LSFL_NEWEXCL; | 1211 | flags = DLM_LSFL_FS | DLM_LSFL_NEWEXCL; |
1212 | if (ls->ls_nodir) | ||
1213 | flags |= DLM_LSFL_NODIR; | ||
1214 | 1212 | ||
1215 | /* | 1213 | /* |
1216 | * create/join lockspace | 1214 | * create/join lockspace |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 6f3a18f9e176..018b4c13db92 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -994,6 +994,7 @@ static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent) | |||
994 | ls->ls_jid = option; | 994 | ls->ls_jid = option; |
995 | break; | 995 | break; |
996 | case Opt_id: | 996 | case Opt_id: |
997 | case Opt_nodir: | ||
997 | /* Obsolete, but left for backward compat purposes */ | 998 | /* Obsolete, but left for backward compat purposes */ |
998 | break; | 999 | break; |
999 | case Opt_first: | 1000 | case Opt_first: |
@@ -1002,12 +1003,6 @@ static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent) | |||
1002 | goto hostdata_error; | 1003 | goto hostdata_error; |
1003 | ls->ls_first = option; | 1004 | ls->ls_first = option; |
1004 | break; | 1005 | break; |
1005 | case Opt_nodir: | ||
1006 | ret = match_int(&tmp[0], &option); | ||
1007 | if (ret || (option != 0 && option != 1)) | ||
1008 | goto hostdata_error; | ||
1009 | ls->ls_nodir = option; | ||
1010 | break; | ||
1011 | case Opt_err: | 1006 | case Opt_err: |
1012 | default: | 1007 | default: |
1013 | hostdata_error: | 1008 | hostdata_error: |