• NeilBrown's avatar
    NFS: prepare for RCU-walk support but pushing tests later in code. · d51ac1a8
    NeilBrown authored
    nfs_lookup_revalidate, nfs4_lookup_revalidate, and nfs_permission
    all need to understand and handle RCU-walk for NFS to gain the
    benefits of RCU-walk for cached information.
    
    Currently these functions all immediately return -ECHILD
    if the relevant flag (LOOKUP_RCU or MAY_NOT_BLOCK) is set.
    
    This patch pushes those tests later in the code so that we only abort
    immediately before we enter rcu-unsafe code.  As subsequent patches
    make that rcu-unsafe code rcu-safe, several of these new tests will
    disappear.
    
    With this patch there are several paths through the code which will no
    longer return -ECHILD during an RCU-walk.  However these are mostly
    error paths or other uninteresting cases.
    
    A noteworthy change in nfs_lookup_revalidate is that we don't take
    (or put) the reference to ->d_parent when LOOKUP_RCU is set.
    Rather we rcu_dereference ->d_parent, and check that ->d_inode
    is not NULL.  We also check that ->d_parent hasn't changed after
    all the tests.
    
    In nfs4_lookup_revalidate we simply avoid testing LOOKUP_RCU on the
    path that only calls nfs_lookup_revalidate() as that function
    already performs the required test.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    d51ac1a8
dir.c 60.6 KB