Skip to content

Commit

Permalink
lockd: push lock_flocks down
Browse files Browse the repository at this point in the history
lockd should use lock_flocks() instead of lock_kernel()
to lock against posix locks accessing the i_flock list.

This is a prerequisite to turning lock_flocks into a
spinlock.

Signed-off-by: Arnd Bergmann <[email protected]>
Acked-by: J. Bruce Fields <[email protected]>
  • Loading branch information
arndb committed Oct 27, 2010
1 parent f9ba537 commit 763641d
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 14 deletions.
11 changes: 0 additions & 11 deletions fs/lockd/svc.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include <linux/in.h>
#include <linux/uio.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/mutex.h>
#include <linux/kthread.h>
#include <linux/freezer.h>
Expand Down Expand Up @@ -130,15 +129,6 @@ lockd(void *vrqstp)

dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n");

/*
* FIXME: it would be nice if lockd didn't spend its entire life
* running under the BKL. At the very least, it would be good to
* have someone clarify what it's intended to protect here. I've
* seen some handwavy posts about posix locking needing to be
* done under the BKL, but it's far from clear.
*/
lock_kernel();

if (!nlm_timeout)
nlm_timeout = LOCKD_DFLT_TIMEO;
nlmsvc_timeout = nlm_timeout * HZ;
Expand Down Expand Up @@ -195,7 +185,6 @@ lockd(void *vrqstp)
if (nlmsvc_ops)
nlmsvc_invalidate_all();
nlm_shutdown_hosts();
unlock_kernel();
return 0;
}

Expand Down
9 changes: 8 additions & 1 deletion fs/lockd/svcsubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,

again:
file->f_locks = 0;
lock_flocks(); /* protects i_flock list */
for (fl = inode->i_flock; fl; fl = fl->fl_next) {
if (fl->fl_lmops != &nlmsvc_lock_operations)
continue;
Expand All @@ -181,6 +182,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
if (match(lockhost, host)) {
struct file_lock lock = *fl;

unlock_flocks();
lock.fl_type = F_UNLCK;
lock.fl_start = 0;
lock.fl_end = OFFSET_MAX;
Expand All @@ -192,6 +194,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
goto again;
}
}
unlock_flocks();

return 0;
}
Expand Down Expand Up @@ -226,10 +229,14 @@ nlm_file_inuse(struct nlm_file *file)
if (file->f_count || !list_empty(&file->f_blocks) || file->f_shares)
return 1;

lock_flocks();
for (fl = inode->i_flock; fl; fl = fl->fl_next) {
if (fl->fl_lmops == &nlmsvc_lock_operations)
if (fl->fl_lmops == &nlmsvc_lock_operations) {
unlock_flocks();
return 1;
}
}
unlock_flocks();
file->f_locks = 0;
return 0;
}
Expand Down
1 change: 0 additions & 1 deletion fs/nfs/Kconfig
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
config NFS_FS
tristate "NFS client support"
depends on INET && FILE_LOCKING
depends on BKL # fix as soon as lockd is done
select LOCKD
select SUNRPC
select NFS_ACL_SUPPORT if NFS_V3_ACL
Expand Down
1 change: 0 additions & 1 deletion fs/nfsd/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ config NFSD
tristate "NFS server support"
depends on INET
depends on FILE_LOCKING
depends on BKL # fix as soon as lockd is done
select LOCKD
select SUNRPC
select EXPORTFS
Expand Down

0 comments on commit 763641d

Please sign in to comment.