Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 763641d8 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

lockd: push lock_flocks down



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: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent f9ba5375
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -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>
@@ -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;
@@ -195,7 +185,6 @@ lockd(void *vrqstp)
	if (nlmsvc_ops)
		nlmsvc_invalidate_all();
	nlm_shutdown_hosts();
	unlock_kernel();
	return 0;
}

+8 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -192,6 +194,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
			goto again;
		}
	}
	unlock_flocks();

	return 0;
}
@@ -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;
}
+0 −1
Original line number Diff line number Diff line
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
+0 −1
Original line number Diff line number Diff line
@@ -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