提交 89e63ef6 编写于 作者: N Neil Brown 提交者: Linus Torvalds

[PATCH] Convert lockd to use the newer mutex instead of the older semaphore

Both the (recently introduces) nsm_sema and the older f_sema are converted
over.

Cc: Olaf Kirch <okir@suse.de>
Signed-off-by: NNeil Brown <neilb@suse.de>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 bc5fea42
...@@ -436,7 +436,7 @@ nlm_gc_hosts(void) ...@@ -436,7 +436,7 @@ nlm_gc_hosts(void)
* Manage NSM handles * Manage NSM handles
*/ */
static LIST_HEAD(nsm_handles); static LIST_HEAD(nsm_handles);
static DECLARE_MUTEX(nsm_sema); static DEFINE_MUTEX(nsm_mutex);
static struct nsm_handle * static struct nsm_handle *
__nsm_find(const struct sockaddr_in *sin, __nsm_find(const struct sockaddr_in *sin,
...@@ -458,7 +458,7 @@ __nsm_find(const struct sockaddr_in *sin, ...@@ -458,7 +458,7 @@ __nsm_find(const struct sockaddr_in *sin,
return NULL; return NULL;
} }
down(&nsm_sema); mutex_lock(&nsm_mutex);
list_for_each(pos, &nsm_handles) { list_for_each(pos, &nsm_handles) {
nsm = list_entry(pos, struct nsm_handle, sm_link); nsm = list_entry(pos, struct nsm_handle, sm_link);
...@@ -488,7 +488,8 @@ __nsm_find(const struct sockaddr_in *sin, ...@@ -488,7 +488,8 @@ __nsm_find(const struct sockaddr_in *sin,
list_add(&nsm->sm_link, &nsm_handles); list_add(&nsm->sm_link, &nsm_handles);
} }
out: up(&nsm_sema); out:
mutex_unlock(&nsm_mutex);
return nsm; return nsm;
} }
...@@ -507,11 +508,11 @@ nsm_release(struct nsm_handle *nsm) ...@@ -507,11 +508,11 @@ nsm_release(struct nsm_handle *nsm)
if (!nsm) if (!nsm)
return; return;
if (atomic_dec_and_test(&nsm->sm_count)) { if (atomic_dec_and_test(&nsm->sm_count)) {
down(&nsm_sema); mutex_lock(&nsm_mutex);
if (atomic_read(&nsm->sm_count) == 0) { if (atomic_read(&nsm->sm_count) == 0) {
list_del(&nsm->sm_link); list_del(&nsm->sm_link);
kfree(nsm); kfree(nsm);
} }
up(&nsm_sema); mutex_unlock(&nsm_mutex);
} }
} }
...@@ -254,9 +254,9 @@ static void nlmsvc_free_block(struct kref *kref) ...@@ -254,9 +254,9 @@ static void nlmsvc_free_block(struct kref *kref)
dprintk("lockd: freeing block %p...\n", block); dprintk("lockd: freeing block %p...\n", block);
/* Remove block from file's list of blocks */ /* Remove block from file's list of blocks */
down(&file->f_sema); mutex_lock(&file->f_mutex);
list_del_init(&block->b_flist); list_del_init(&block->b_flist);
up(&file->f_sema); mutex_unlock(&file->f_mutex);
nlmsvc_freegrantargs(block->b_call); nlmsvc_freegrantargs(block->b_call);
nlm_release_call(block->b_call); nlm_release_call(block->b_call);
...@@ -281,7 +281,7 @@ void nlmsvc_traverse_blocks(struct nlm_host *host, ...@@ -281,7 +281,7 @@ void nlmsvc_traverse_blocks(struct nlm_host *host,
struct nlm_block *block, *next; struct nlm_block *block, *next;
restart: restart:
down(&file->f_sema); mutex_lock(&file->f_mutex);
list_for_each_entry_safe(block, next, &file->f_blocks, b_flist) { list_for_each_entry_safe(block, next, &file->f_blocks, b_flist) {
if (!match(block->b_host, host)) if (!match(block->b_host, host))
continue; continue;
...@@ -290,12 +290,12 @@ void nlmsvc_traverse_blocks(struct nlm_host *host, ...@@ -290,12 +290,12 @@ void nlmsvc_traverse_blocks(struct nlm_host *host,
if (list_empty(&block->b_list)) if (list_empty(&block->b_list))
continue; continue;
kref_get(&block->b_count); kref_get(&block->b_count);
up(&file->f_sema); mutex_unlock(&file->f_mutex);
nlmsvc_unlink_block(block); nlmsvc_unlink_block(block);
nlmsvc_release_block(block); nlmsvc_release_block(block);
goto restart; goto restart;
} }
up(&file->f_sema); mutex_unlock(&file->f_mutex);
} }
/* /*
...@@ -354,7 +354,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, ...@@ -354,7 +354,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
lock->fl.fl_flags &= ~FL_SLEEP; lock->fl.fl_flags &= ~FL_SLEEP;
again: again:
/* Lock file against concurrent access */ /* Lock file against concurrent access */
down(&file->f_sema); mutex_lock(&file->f_mutex);
/* Get existing block (in case client is busy-waiting) */ /* Get existing block (in case client is busy-waiting) */
block = nlmsvc_lookup_block(file, lock); block = nlmsvc_lookup_block(file, lock);
if (block == NULL) { if (block == NULL) {
...@@ -392,10 +392,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, ...@@ -392,10 +392,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
/* If we don't have a block, create and initialize it. Then /* If we don't have a block, create and initialize it. Then
* retry because we may have slept in kmalloc. */ * retry because we may have slept in kmalloc. */
/* We have to release f_sema as nlmsvc_create_block may try to /* We have to release f_mutex as nlmsvc_create_block may try to
* to claim it while doing host garbage collection */ * to claim it while doing host garbage collection */
if (newblock == NULL) { if (newblock == NULL) {
up(&file->f_sema); mutex_unlock(&file->f_mutex);
dprintk("lockd: blocking on this lock (allocating).\n"); dprintk("lockd: blocking on this lock (allocating).\n");
if (!(newblock = nlmsvc_create_block(rqstp, file, lock, cookie))) if (!(newblock = nlmsvc_create_block(rqstp, file, lock, cookie)))
return nlm_lck_denied_nolocks; return nlm_lck_denied_nolocks;
...@@ -405,7 +405,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, ...@@ -405,7 +405,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
/* Append to list of blocked */ /* Append to list of blocked */
nlmsvc_insert_block(newblock, NLM_NEVER); nlmsvc_insert_block(newblock, NLM_NEVER);
out: out:
up(&file->f_sema); mutex_unlock(&file->f_mutex);
nlmsvc_release_block(newblock); nlmsvc_release_block(newblock);
nlmsvc_release_block(block); nlmsvc_release_block(block);
dprintk("lockd: nlmsvc_lock returned %u\n", ret); dprintk("lockd: nlmsvc_lock returned %u\n", ret);
...@@ -489,9 +489,9 @@ nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock) ...@@ -489,9 +489,9 @@ nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock)
(long long)lock->fl.fl_start, (long long)lock->fl.fl_start,
(long long)lock->fl.fl_end); (long long)lock->fl.fl_end);
down(&file->f_sema); mutex_lock(&file->f_mutex);
block = nlmsvc_lookup_block(file, lock); block = nlmsvc_lookup_block(file, lock);
up(&file->f_sema); mutex_unlock(&file->f_mutex);
if (block != NULL) { if (block != NULL) {
status = nlmsvc_unlink_block(block); status = nlmsvc_unlink_block(block);
nlmsvc_release_block(block); nlmsvc_release_block(block);
......
...@@ -106,7 +106,7 @@ nlm_lookup_file(struct svc_rqst *rqstp, struct nlm_file **result, ...@@ -106,7 +106,7 @@ nlm_lookup_file(struct svc_rqst *rqstp, struct nlm_file **result,
goto out_unlock; goto out_unlock;
memcpy(&file->f_handle, f, sizeof(struct nfs_fh)); memcpy(&file->f_handle, f, sizeof(struct nfs_fh));
init_MUTEX(&file->f_sema); mutex_init(&file->f_mutex);
INIT_HLIST_NODE(&file->f_list); INIT_HLIST_NODE(&file->f_list);
INIT_LIST_HEAD(&file->f_blocks); INIT_LIST_HEAD(&file->f_blocks);
......
...@@ -111,7 +111,7 @@ struct nlm_file { ...@@ -111,7 +111,7 @@ struct nlm_file {
struct list_head f_blocks; /* blocked locks */ struct list_head f_blocks; /* blocked locks */
unsigned int f_locks; /* guesstimate # of locks */ unsigned int f_locks; /* guesstimate # of locks */
unsigned int f_count; /* reference count */ unsigned int f_count; /* reference count */
struct semaphore f_sema; /* avoid concurrent access */ struct mutex f_mutex; /* avoid concurrent access */
}; };
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册