linux/fs/nfsd
NeilBrown bbddca8e8f nfsd: don't hold i_mutex over userspace upcalls
We need information about exports when crossing mountpoints during
lookup or NFSv4 readdir.  If we don't already have that information
cached, we may have to ask (and wait for) rpc.mountd.

In both cases we currently hold the i_mutex on the parent of the
directory we're asking rpc.mountd about.  We've seen situations where
rpc.mountd performs some operation on that directory that tries to take
the i_mutex again, resulting in deadlock.

With some care, we may be able to avoid that in rpc.mountd.  But it
seems better just to avoid holding a mutex while waiting on userspace.

It appears that lookup_one_len is pretty much the only operation that
needs the i_mutex.  So we could just drop the i_mutex elsewhere and do
something like

	mutex_lock()
	lookup_one_len()
	mutex_unlock()

In many cases though the lookup would have been cached and not required
the i_mutex, so it's more efficient to create a lookup_one_len() variant
that only takes the i_mutex when necessary.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2016-01-09 03:07:52 -05:00
..
acl.h nfsd4: remove nfs4_acl_new 2014-07-08 17:14:27 -04:00
auth.c nfsd: silence sparse warning about accessing credentials 2014-07-17 16:15:35 -04:00
auth.h nfsd: Remove nfsd_luid, nfsd_lgid, nfsd_ruid and nfsd_rgid 2013-02-13 06:15:51 -08:00
blocklayout.c nfsd/blocklayout: accept any minlength 2015-10-09 16:11:40 -04:00
blocklayoutxdr.c pnfs: move common blocklayout XDR defintions to nfs4.h 2015-08-17 13:22:49 -05:00
blocklayoutxdr.h pnfs: move common blocklayout XDR defintions to nfs4.h 2015-08-17 13:22:49 -05:00
cache.h nfsd: Remove the cache_hash list 2014-08-17 12:00:12 -04:00
current_stateid.h
export.c sunrpc/nfsd: Remove redundant code by exports seq_operations functions 2015-08-13 08:59:02 -04:00
export.h nfsd: include linux/nfs4.h in export.h 2015-08-13 10:21:21 -04:00
fault_inject.c nfsd: remove old fault injection infrastructure 2014-08-05 10:55:10 -04:00
idmap.h nfsd: Remove duplicate define of IDMAP_NAMESZ/IDMAP_TYPE_xx 2015-07-20 14:58:46 -04:00
Kconfig Merge branch 'for-4.1' of git://linux-nfs.org/~bfields/linux 2015-04-24 07:46:05 -07:00
lockd.c
Makefile nfsd: pNFS block layout driver 2015-02-05 14:35:18 +01:00
netns.h nfsd: New counter for generating client confirm verifier 2015-08-10 16:05:47 -04:00
nfs2acl.c nfsd: Add macro NFS_ACL_MASK for ACL 2015-07-20 14:58:46 -04:00
nfs3acl.c nfsd: Add macro NFS_ACL_MASK for ACL 2015-07-20 14:58:46 -04:00
nfs3proc.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
nfs3xdr.c nfsd: don't hold i_mutex over userspace upcalls 2016-01-09 03:07:52 -05:00
nfs4acl.c nfsd: Fix two typos in comments 2015-08-13 10:26:24 -04:00
nfs4callback.c nfsd: New helper nfsd4_cb_sequence_done() for processing more cb errors 2015-08-13 08:57:06 -04:00
nfs4idmap.c nfsd: Remove duplicate define of IDMAP_NAMESZ/IDMAP_TYPE_xx 2015-07-20 14:58:46 -04:00
nfs4layouts.c nfsd: don't hold ls_mutex across a layout recall 2015-12-16 11:49:58 -05:00
nfs4proc.c nfsd: serialize layout stateid morphing operations 2015-10-23 15:57:32 -04:00
nfs4recover.c nfsd: don't WARN/backtrace for invalid container deployment. 2015-08-31 16:32:08 -04:00
nfs4state.c nfsd: fix race with open / open upgrade stateids 2015-11-10 09:29:45 -05:00
nfs4xdr.c nfsd: don't hold i_mutex over userspace upcalls 2016-01-09 03:07:52 -05:00
nfscache.c nfsd: remove recurring workqueue job to clean DRC 2015-11-10 09:25:51 -05:00
nfsctl.c nfsd: fix nsfd startup race triggering BUG_ON 2015-04-21 16:16:03 -04:00
nfsd.h nfsd: eliminate NFSD_DEBUG 2015-04-21 16:16:02 -04:00
nfsfh.c nfsd: switch unsigned char flags in svc_fh to bools 2015-10-12 17:31:04 -04:00
nfsfh.h nfsd: switch unsigned char flags in svc_fh to bools 2015-10-12 17:31:04 -04:00
nfsproc.c nfsd: Disable NFSv2 timestamp workaround for NFSv3+ 2015-05-29 11:04:01 -04:00
nfssvc.c nfsd/sunrpc: abstract out svc_set_num_threads to sv_ops 2015-08-10 16:05:43 -04:00
nfsxdr.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
pnfs.h nfsd4: fix v3-less build 2015-02-16 11:43:13 -05:00
state.h nfsd: ensure that seqid morphing operations are atomic wrt to copies 2015-10-23 15:57:33 -04:00
stats.c nfsd: move <linux/nfsd/stats.h> to fs/nfsd 2014-05-06 17:54:55 -04:00
stats.h nfsd: move <linux/nfsd/stats.h> to fs/nfsd 2014-05-06 17:54:55 -04:00
trace.c nfsd: move include of state.h from trace.c to trace.h 2015-10-23 15:57:29 -04:00
trace.h nfsd: move include of state.h from trace.c to trace.h 2015-10-23 15:57:29 -04:00
vfs.c nfsd: don't hold i_mutex over userspace upcalls 2016-01-09 03:07:52 -05:00
vfs.h nfsd: switch unsigned char flags in svc_fh to bools 2015-10-12 17:31:04 -04:00
xdr3.h nfsd: fix encode_entryplus_baggage stack usage 2014-01-23 13:50:27 -05:00
xdr4.h nfsd: switch unsigned char flags in svc_fh to bools 2015-10-12 17:31:04 -04:00
xdr4cb.h nfsd: implement pNFS layout recalls 2015-02-02 18:09:43 +01:00
xdr.h nfsd: handle vfs_getattr errors in acl protocol 2013-02-26 02:46:09 -05:00