NeilBrown f3324a2a94 NFS: support RCU_WALK in nfs_permission()
nfs_permission makes two calls which are not always safe in RCU_WALK,
rpc_lookup_cred and nfs_do_access.

The second can easily be made rcu-safe by aborting with -ECHILD before
making the RPC call.

The former can be made rcu-safe by calling rpc_lookup_cred_nonblock()
instead.
As this will almost always succeed, we use it even when RCU_WALK
isn't being used as it still saves some spinlocks in a common case.
We only fall back to rpc_lookup_cred() if rpc_lookup_cred_nonblock()
fails and MAY_NOT_BLOCK isn't set.

This optimisation (always trying rpc_lookup_cred_nonblock()) is
particularly important when a security module is active.
In that case inode_permission() may return -ECHILD from
security_inode_permission() even though ->permission() succeeded in
RCU_WALK mode.
This leads to may_lookup() retrying inode_permission after performing
unlazy_walk().  The spinlock that rpc_lookup_cred() takes is often
more expensive than anything security_inode_permission() does, so that
spinlock becomes the main bottleneck.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
2014-08-03 17:14:12 -04:00
..
2013-06-08 16:20:18 -04:00
2014-07-12 18:22:58 -04:00
2014-07-12 18:22:58 -04:00
2013-11-15 13:41:43 -05:00
2012-10-02 08:17:02 -07:00
2012-07-30 19:06:41 -04:00
2014-07-12 18:43:47 -04:00
2012-07-30 19:06:52 -04:00
2014-08-03 17:05:25 -04:00
2014-08-03 17:05:25 -04:00
2014-06-24 18:47:00 -04:00
2014-06-25 19:01:27 -04:00