[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: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
bc5fea4299
commit
89e63ef609
4 changed files with 19 additions and 18 deletions
|
@ -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,
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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 @@ restart:
|
||||||
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,
|
||||||
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 @@ again:
|
||||||
|
|
||||||
/* 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 @@ again:
|
||||||
/* 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)
|
||||||
(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,
|
||||||
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 {
|
||||||
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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue