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: Arnd Bergmann <arnd@arndb.de> Acked-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
f9ba5375a8
commit
763641d812
|
@ -22,7 +22,6 @@
|
||||||
#include <linux/in.h>
|
#include <linux/in.h>
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/freezer.h>
|
#include <linux/freezer.h>
|
||||||
|
@ -130,15 +129,6 @@ lockd(void *vrqstp)
|
||||||
|
|
||||||
dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n");
|
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)
|
if (!nlm_timeout)
|
||||||
nlm_timeout = LOCKD_DFLT_TIMEO;
|
nlm_timeout = LOCKD_DFLT_TIMEO;
|
||||||
nlmsvc_timeout = nlm_timeout * HZ;
|
nlmsvc_timeout = nlm_timeout * HZ;
|
||||||
|
@ -195,7 +185,6 @@ lockd(void *vrqstp)
|
||||||
if (nlmsvc_ops)
|
if (nlmsvc_ops)
|
||||||
nlmsvc_invalidate_all();
|
nlmsvc_invalidate_all();
|
||||||
nlm_shutdown_hosts();
|
nlm_shutdown_hosts();
|
||||||
unlock_kernel();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -170,6 +170,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
|
||||||
|
|
||||||
again:
|
again:
|
||||||
file->f_locks = 0;
|
file->f_locks = 0;
|
||||||
|
lock_flocks(); /* protects i_flock list */
|
||||||
for (fl = inode->i_flock; fl; fl = fl->fl_next) {
|
for (fl = inode->i_flock; fl; fl = fl->fl_next) {
|
||||||
if (fl->fl_lmops != &nlmsvc_lock_operations)
|
if (fl->fl_lmops != &nlmsvc_lock_operations)
|
||||||
continue;
|
continue;
|
||||||
|
@ -181,6 +182,7 @@ again:
|
||||||
if (match(lockhost, host)) {
|
if (match(lockhost, host)) {
|
||||||
struct file_lock lock = *fl;
|
struct file_lock lock = *fl;
|
||||||
|
|
||||||
|
unlock_flocks();
|
||||||
lock.fl_type = F_UNLCK;
|
lock.fl_type = F_UNLCK;
|
||||||
lock.fl_start = 0;
|
lock.fl_start = 0;
|
||||||
lock.fl_end = OFFSET_MAX;
|
lock.fl_end = OFFSET_MAX;
|
||||||
|
@ -192,6 +194,7 @@ again:
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
unlock_flocks();
|
||||||
|
|
||||||
return 0;
|
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)
|
if (file->f_count || !list_empty(&file->f_blocks) || file->f_shares)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
lock_flocks();
|
||||||
for (fl = inode->i_flock; fl; fl = fl->fl_next) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
unlock_flocks();
|
||||||
file->f_locks = 0;
|
file->f_locks = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
config NFS_FS
|
config NFS_FS
|
||||||
tristate "NFS client support"
|
tristate "NFS client support"
|
||||||
depends on INET && FILE_LOCKING
|
depends on INET && FILE_LOCKING
|
||||||
depends on BKL # fix as soon as lockd is done
|
|
||||||
select LOCKD
|
select LOCKD
|
||||||
select SUNRPC
|
select SUNRPC
|
||||||
select NFS_ACL_SUPPORT if NFS_V3_ACL
|
select NFS_ACL_SUPPORT if NFS_V3_ACL
|
||||||
|
|
|
@ -2,7 +2,6 @@ config NFSD
|
||||||
tristate "NFS server support"
|
tristate "NFS server support"
|
||||||
depends on INET
|
depends on INET
|
||||||
depends on FILE_LOCKING
|
depends on FILE_LOCKING
|
||||||
depends on BKL # fix as soon as lockd is done
|
|
||||||
select LOCKD
|
select LOCKD
|
||||||
select SUNRPC
|
select SUNRPC
|
||||||
select EXPORTFS
|
select EXPORTFS
|
||||||
|
|
Loading…
Reference in New Issue