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..523243a13a21 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(&nolock_proto.lw_list, &lmh_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); |
