diff options
Diffstat (limited to 'fs/gfs2/locking.c')
-rw-r--r-- | fs/gfs2/locking.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/fs/gfs2/locking.c b/fs/gfs2/locking.c index 663fee728783..a4a367aa5cc1 100644 --- a/fs/gfs2/locking.c +++ b/fs/gfs2/locking.c | |||
@@ -23,12 +23,54 @@ struct lmh_wrapper { | |||
23 | const struct lm_lockops *lw_ops; | 23 | const struct lm_lockops *lw_ops; |
24 | }; | 24 | }; |
25 | 25 | ||
26 | static int nolock_mount(char *table_name, char *host_data, | ||
27 | lm_callback_t cb, void *cb_data, | ||
28 | unsigned int min_lvb_size, int flags, | ||
29 | struct lm_lockstruct *lockstruct, | ||
30 | struct kobject *fskobj); | ||
31 | |||
26 | /* List of registered low-level locking protocols. A file system selects one | 32 | /* List of registered low-level locking protocols. A file system selects one |
27 | of them by name at mount time, e.g. lock_nolock, lock_dlm. */ | 33 | of them by name at mount time, e.g. lock_nolock, lock_dlm. */ |
28 | 34 | ||
35 | static const struct lm_lockops nolock_ops = { | ||
36 | .lm_proto_name = "lock_nolock", | ||
37 | .lm_mount = nolock_mount, | ||
38 | }; | ||
39 | |||
40 | static struct lmh_wrapper nolock_proto = { | ||
41 | .lw_list = LIST_HEAD_INIT(nolock_proto.lw_list), | ||
42 | .lw_ops = &nolock_ops, | ||
43 | }; | ||
44 | |||
29 | static LIST_HEAD(lmh_list); | 45 | static LIST_HEAD(lmh_list); |
30 | static DEFINE_MUTEX(lmh_lock); | 46 | static DEFINE_MUTEX(lmh_lock); |
31 | 47 | ||
48 | static int nolock_mount(char *table_name, char *host_data, | ||
49 | lm_callback_t cb, void *cb_data, | ||
50 | unsigned int min_lvb_size, int flags, | ||
51 | struct lm_lockstruct *lockstruct, | ||
52 | struct kobject *fskobj) | ||
53 | { | ||
54 | char *c; | ||
55 | unsigned int jid; | ||
56 | |||
57 | c = strstr(host_data, "jid="); | ||
58 | if (!c) | ||
59 | jid = 0; | ||
60 | else { | ||
61 | c += 4; | ||
62 | sscanf(c, "%u", &jid); | ||
63 | } | ||
64 | |||
65 | lockstruct->ls_jid = jid; | ||
66 | lockstruct->ls_first = 1; | ||
67 | lockstruct->ls_lvb_size = min_lvb_size; | ||
68 | lockstruct->ls_ops = &nolock_ops; | ||
69 | lockstruct->ls_flags = LM_LSFLAG_LOCAL; | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | |||
32 | /** | 74 | /** |
33 | * gfs2_register_lockproto - Register a low-level locking protocol | 75 | * gfs2_register_lockproto - Register a low-level locking protocol |
34 | * @proto: the protocol definition | 76 | * @proto: the protocol definition |
@@ -116,9 +158,13 @@ int gfs2_mount_lockproto(char *proto_name, char *table_name, char *host_data, | |||
116 | int try = 0; | 158 | int try = 0; |
117 | int error, found; | 159 | int error, found; |
118 | 160 | ||
161 | |||
119 | retry: | 162 | retry: |
120 | mutex_lock(&lmh_lock); | 163 | mutex_lock(&lmh_lock); |
121 | 164 | ||
165 | if (list_empty(&nolock_proto.lw_list)) | ||
166 | list_add(&lmh_list, &nolock_proto.lw_list); | ||
167 | |||
122 | found = 0; | 168 | found = 0; |
123 | list_for_each_entry(lw, &lmh_list, lw_list) { | 169 | list_for_each_entry(lw, &lmh_list, lw_list) { |
124 | if (!strcmp(lw->lw_ops->lm_proto_name, proto_name)) { | 170 | if (!strcmp(lw->lw_ops->lm_proto_name, proto_name)) { |
@@ -139,7 +185,8 @@ retry: | |||
139 | goto out; | 185 | goto out; |
140 | } | 186 | } |
141 | 187 | ||
142 | if (!try_module_get(lw->lw_ops->lm_owner)) { | 188 | if (lw->lw_ops->lm_owner && |
189 | !try_module_get(lw->lw_ops->lm_owner)) { | ||
143 | try = 0; | 190 | try = 0; |
144 | mutex_unlock(&lmh_lock); | 191 | mutex_unlock(&lmh_lock); |
145 | msleep(1000); | 192 | msleep(1000); |
@@ -158,7 +205,8 @@ out: | |||
158 | void gfs2_unmount_lockproto(struct lm_lockstruct *lockstruct) | 205 | void gfs2_unmount_lockproto(struct lm_lockstruct *lockstruct) |
159 | { | 206 | { |
160 | mutex_lock(&lmh_lock); | 207 | mutex_lock(&lmh_lock); |
161 | lockstruct->ls_ops->lm_unmount(lockstruct->ls_lockspace); | 208 | if (lockstruct->ls_ops->lm_unmount) |
209 | lockstruct->ls_ops->lm_unmount(lockstruct->ls_lockspace); | ||
162 | if (lockstruct->ls_ops->lm_owner) | 210 | if (lockstruct->ls_ops->lm_owner) |
163 | module_put(lockstruct->ls_ops->lm_owner); | 211 | module_put(lockstruct->ls_ops->lm_owner); |
164 | mutex_unlock(&lmh_lock); | 212 | mutex_unlock(&lmh_lock); |