diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-15 10:38:46 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-15 10:38:46 -0700 |
commit | 38c46578ffd8ffbfec514c2a9876d527303322d6 (patch) | |
tree | d55ad8a52048f70bc6ef51d388c0f21ff467155e /fs/gfs2/locking.c | |
parent | e7849f16c13476288fe4fbd420975e8456c75aa0 (diff) | |
parent | 4abaca17e758e3326c96ced88b2cd9b7b84922f6 (diff) | |
download | blackbird-obmc-linux-38c46578ffd8ffbfec514c2a9876d527303322d6.tar.gz blackbird-obmc-linux-38c46578ffd8ffbfec514c2a9876d527303322d6.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
* git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw:
[GFS2] Fix GFS2's use of do_div() in its quota calculations
[GFS2] Remove unused declaration
[GFS2] Remove support for unused and pointless flag
[GFS2] Replace rgrp "recent list" with mru list
[GFS2] Allow local DF locks when holding a cached EX glock
[GFS2] Fix delayed demote race
[GFS2] don't call permission()
[GFS2] Fix module building
[GFS2] Glock documentation
[GFS2] Remove all_list from lock_dlm
[GFS2] Remove obsolete conversion deadlock avoidance code
[GFS2] Remove remote lock dropping code
[GFS2] kernel panic mounting volume
[GFS2] Revise readpage locking
[GFS2] Fix ordering of args for list_add
[GFS2] trivial sparse lock annotations
[GFS2] No lock_nolock
[GFS2] Fix ordering bug in lock_dlm
[GFS2] Clean up the glock core
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 { const struct lm_lockops *lw_ops; }; +static int nolock_mount(char *table_name, char *host_data, + lm_callback_t cb, void *cb_data, + unsigned int min_lvb_size, int flags, + struct lm_lockstruct *lockstruct, + struct kobject *fskobj); + /* List of registered low-level locking protocols. A file system selects one of them by name at mount time, e.g. lock_nolock, lock_dlm. */ +static const struct lm_lockops nolock_ops = { + .lm_proto_name = "lock_nolock", + .lm_mount = nolock_mount, +}; + +static struct lmh_wrapper nolock_proto = { + .lw_list = LIST_HEAD_INIT(nolock_proto.lw_list), + .lw_ops = &nolock_ops, +}; + static LIST_HEAD(lmh_list); static DEFINE_MUTEX(lmh_lock); +static int nolock_mount(char *table_name, char *host_data, + lm_callback_t cb, void *cb_data, + unsigned int min_lvb_size, int flags, + struct lm_lockstruct *lockstruct, + struct kobject *fskobj) +{ + char *c; + unsigned int jid; + + c = strstr(host_data, "jid="); + if (!c) + jid = 0; + else { + c += 4; + sscanf(c, "%u", &jid); + } + + lockstruct->ls_jid = jid; + lockstruct->ls_first = 1; + lockstruct->ls_lvb_size = min_lvb_size; + lockstruct->ls_ops = &nolock_ops; + lockstruct->ls_flags = LM_LSFLAG_LOCAL; + + return 0; +} + /** * gfs2_register_lockproto - Register a low-level locking protocol * @proto: the protocol definition @@ -116,9 +158,13 @@ int gfs2_mount_lockproto(char *proto_name, char *table_name, char *host_data, int try = 0; int error, found; + retry: mutex_lock(&lmh_lock); + if (list_empty(&nolock_proto.lw_list)) + list_add(&nolock_proto.lw_list, &lmh_list); + found = 0; list_for_each_entry(lw, &lmh_list, lw_list) { if (!strcmp(lw->lw_ops->lm_proto_name, proto_name)) { @@ -139,7 +185,8 @@ retry: goto out; } - if (!try_module_get(lw->lw_ops->lm_owner)) { + if (lw->lw_ops->lm_owner && + !try_module_get(lw->lw_ops->lm_owner)) { try = 0; mutex_unlock(&lmh_lock); msleep(1000); @@ -158,7 +205,8 @@ out: void gfs2_unmount_lockproto(struct lm_lockstruct *lockstruct) { mutex_lock(&lmh_lock); - lockstruct->ls_ops->lm_unmount(lockstruct->ls_lockspace); + if (lockstruct->ls_ops->lm_unmount) + lockstruct->ls_ops->lm_unmount(lockstruct->ls_lockspace); if (lockstruct->ls_ops->lm_owner) module_put(lockstruct->ls_ops->lm_owner); mutex_unlock(&lmh_lock); |