diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-08-29 09:00:01 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-22 20:48:20 -0400 |
commit | c5aa1e554a20fb3542c62688ae46049c9225a965 (patch) | |
tree | 8dd6c11b16f9615bced5b43f3918f3e992466b80 /fs/lockd/svclock.c | |
parent | 156cacb1d0d36b0d0582d9e798e58e0044f516b3 (diff) |
close the race in nlmsvc_free_block()
we need to grab mutex before the reference counter reaches 0
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/lockd/svclock.c')
-rw-r--r-- | fs/lockd/svclock.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index fb1a2bedbe97..8d80c990dffd 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c | |||
@@ -289,7 +289,6 @@ static void nlmsvc_free_block(struct kref *kref) | |||
289 | dprintk("lockd: freeing block %p...\n", block); | 289 | dprintk("lockd: freeing block %p...\n", block); |
290 | 290 | ||
291 | /* Remove block from file's list of blocks */ | 291 | /* Remove block from file's list of blocks */ |
292 | mutex_lock(&file->f_mutex); | ||
293 | list_del_init(&block->b_flist); | 292 | list_del_init(&block->b_flist); |
294 | mutex_unlock(&file->f_mutex); | 293 | mutex_unlock(&file->f_mutex); |
295 | 294 | ||
@@ -303,7 +302,7 @@ static void nlmsvc_free_block(struct kref *kref) | |||
303 | static void nlmsvc_release_block(struct nlm_block *block) | 302 | static void nlmsvc_release_block(struct nlm_block *block) |
304 | { | 303 | { |
305 | if (block != NULL) | 304 | if (block != NULL) |
306 | kref_put(&block->b_count, nlmsvc_free_block); | 305 | kref_put_mutex(&block->b_count, nlmsvc_free_block, &block->b_file->f_mutex); |
307 | } | 306 | } |
308 | 307 | ||
309 | /* | 308 | /* |