X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=fs%2Fgfs2%2Flocking.c;h=663fee7287832baf70a2d644239d97ecf4db1523;hb=b196fc69f7be7b4454781add9c2d5173f44d509b;hp=0f4c50ebcbade69848bbd5f9e2d460d6acc95186;hpb=76467874b83835129dc454e3a7a8e5d1186101b0;p=powerpc.git diff --git a/fs/gfs2/locking.c b/fs/gfs2/locking.c index 0f4c50ebcb..663fee7287 100644 --- a/fs/gfs2/locking.c +++ b/fs/gfs2/locking.c @@ -1,10 +1,10 @@ /* * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. - * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU General Public License v.2. + * of the GNU General Public License version 2. */ #include @@ -16,36 +16,35 @@ #include #include #include - -#include "lm_interface.h" +#include struct lmh_wrapper { struct list_head lw_list; - struct lm_lockops *lw_ops; + const struct lm_lockops *lw_ops; }; /* 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 struct list_head lmh_list; -static struct semaphore lmh_lock; +static LIST_HEAD(lmh_list); +static DEFINE_MUTEX(lmh_lock); /** - * gfs_register_lockproto - Register a low-level locking protocol + * gfs2_register_lockproto - Register a low-level locking protocol * @proto: the protocol definition * * Returns: 0 on success, -EXXX on failure */ -int gfs_register_lockproto(struct lm_lockops *proto) +int gfs2_register_lockproto(const struct lm_lockops *proto) { struct lmh_wrapper *lw; - down(&lmh_lock); + mutex_lock(&lmh_lock); list_for_each_entry(lw, &lmh_list, lw_list) { if (!strcmp(lw->lw_ops->lm_proto_name, proto->lm_proto_name)) { - up(&lmh_lock); + mutex_unlock(&lmh_lock); printk(KERN_INFO "GFS2: protocol %s already exists\n", proto->lm_proto_name); return -EEXIST; @@ -54,40 +53,40 @@ int gfs_register_lockproto(struct lm_lockops *proto) lw = kzalloc(sizeof(struct lmh_wrapper), GFP_KERNEL); if (!lw) { - up(&lmh_lock); + mutex_unlock(&lmh_lock); return -ENOMEM; } lw->lw_ops = proto; list_add(&lw->lw_list, &lmh_list); - up(&lmh_lock); + mutex_unlock(&lmh_lock); return 0; } /** - * gfs_unregister_lockproto - Unregister a low-level locking protocol + * gfs2_unregister_lockproto - Unregister a low-level locking protocol * @proto: the protocol definition * */ -void gfs_unregister_lockproto(struct lm_lockops *proto) +void gfs2_unregister_lockproto(const struct lm_lockops *proto) { struct lmh_wrapper *lw; - down(&lmh_lock); + mutex_lock(&lmh_lock); list_for_each_entry(lw, &lmh_list, lw_list) { if (!strcmp(lw->lw_ops->lm_proto_name, proto->lm_proto_name)) { list_del(&lw->lw_list); - up(&lmh_lock); + mutex_unlock(&lmh_lock); kfree(lw); return; } } - up(&lmh_lock); + mutex_unlock(&lmh_lock); printk(KERN_WARNING "GFS2: can't unregister lock protocol %s\n", proto->lm_proto_name); @@ -99,7 +98,7 @@ void gfs_unregister_lockproto(struct lm_lockops *proto) * @table_name - the name of the lock space * @host_data - data specific to this host * @cb - the callback to the code using the lock module - * @fsdata - data to pass back with the callback + * @sdp - The GFS2 superblock * @min_lvb_size - the mininum LVB size that the caller can deal with * @flags - LM_MFLAG_* * @lockstruct - a structure returned describing the mount @@ -108,7 +107,7 @@ void gfs_unregister_lockproto(struct lm_lockops *proto) */ int gfs2_mount_lockproto(char *proto_name, char *table_name, char *host_data, - lm_callback_t cb, lm_fsdata_t *fsdata, + lm_callback_t cb, void *cb_data, unsigned int min_lvb_size, int flags, struct lm_lockstruct *lockstruct, struct kobject *fskobj) @@ -117,8 +116,8 @@ int gfs2_mount_lockproto(char *proto_name, char *table_name, char *host_data, int try = 0; int error, found; - retry: - down(&lmh_lock); +retry: + mutex_lock(&lmh_lock); found = 0; list_for_each_entry(lw, &lmh_list, lw_list) { @@ -131,7 +130,7 @@ int gfs2_mount_lockproto(char *proto_name, char *table_name, char *host_data, if (!found) { if (!try && capable(CAP_SYS_MODULE)) { try = 1; - up(&lmh_lock); + mutex_unlock(&lmh_lock); request_module(proto_name); goto retry; } @@ -142,27 +141,27 @@ int gfs2_mount_lockproto(char *proto_name, char *table_name, char *host_data, if (!try_module_get(lw->lw_ops->lm_owner)) { try = 0; - up(&lmh_lock); + mutex_unlock(&lmh_lock); msleep(1000); goto retry; } - error = lw->lw_ops->lm_mount(table_name, host_data, cb, fsdata, + error = lw->lw_ops->lm_mount(table_name, host_data, cb, cb_data, min_lvb_size, flags, lockstruct, fskobj); if (error) module_put(lw->lw_ops->lm_owner); - out: - up(&lmh_lock); +out: + mutex_unlock(&lmh_lock); return error; } void gfs2_unmount_lockproto(struct lm_lockstruct *lockstruct) { - down(&lmh_lock); + mutex_lock(&lmh_lock); lockstruct->ls_ops->lm_unmount(lockstruct->ls_lockspace); if (lockstruct->ls_ops->lm_owner) module_put(lockstruct->ls_ops->lm_owner); - up(&lmh_lock); + mutex_unlock(&lmh_lock); } /** @@ -173,19 +172,13 @@ void gfs2_unmount_lockproto(struct lm_lockstruct *lockstruct) void gfs2_withdraw_lockproto(struct lm_lockstruct *lockstruct) { - down(&lmh_lock); + mutex_lock(&lmh_lock); lockstruct->ls_ops->lm_withdraw(lockstruct->ls_lockspace); if (lockstruct->ls_ops->lm_owner) module_put(lockstruct->ls_ops->lm_owner); - up(&lmh_lock); -} - -void __init gfs2_init_lmh(void) -{ - init_MUTEX(&lmh_lock); - INIT_LIST_HEAD(&lmh_list); + mutex_unlock(&lmh_lock); } -EXPORT_SYMBOL_GPL(gfs_register_lockproto); -EXPORT_SYMBOL_GPL(gfs_unregister_lockproto); +EXPORT_SYMBOL_GPL(gfs2_register_lockproto); +EXPORT_SYMBOL_GPL(gfs2_unregister_lockproto);