]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFSv4/pnfs: Clean up nfs_layout_find_inode()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 27 Feb 2020 16:24:06 +0000 (11:24 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 16 Mar 2020 12:34:29 +0000 (08:34 -0400)
Now that we can rely on just the rcu_read_lock(), remove the
clp->cl_lock and clean up.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/callback_proc.c

index eb9d035451a2705a23d3a03a0a455afc9f7849bd..97084804a95371b4ff04db45f994fff3f96a0325 100644 (file)
@@ -121,33 +121,31 @@ out:
  */
 static struct inode *nfs_layout_find_inode_by_stateid(struct nfs_client *clp,
                const nfs4_stateid *stateid)
+       __must_hold(RCU)
 {
        struct nfs_server *server;
        struct inode *inode;
        struct pnfs_layout_hdr *lo;
 
+       rcu_read_lock();
        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
-               list_for_each_entry(lo, &server->layouts, plh_layouts) {
+               list_for_each_entry_rcu(lo, &server->layouts, plh_layouts) {
                        if (!pnfs_layout_is_valid(lo))
                                continue;
                        if (stateid != NULL &&
                            !nfs4_stateid_match_other(stateid, &lo->plh_stateid))
                                continue;
+                       if (!nfs_sb_active(server->super))
+                               continue;
                        inode = igrab(lo->plh_inode);
-                       if (!inode)
-                               return ERR_PTR(-EAGAIN);
-                       if (!nfs_sb_active(inode->i_sb)) {
-                               rcu_read_unlock();
-                               spin_unlock(&clp->cl_lock);
-                               iput(inode);
-                               spin_lock(&clp->cl_lock);
-                               rcu_read_lock();
-                               return ERR_PTR(-EAGAIN);
-                       }
-                       return inode;
+                       rcu_read_unlock();
+                       if (inode)
+                               return inode;
+                       nfs_sb_deactive(server->super);
+                       return ERR_PTR(-EAGAIN);
                }
        }
-
+       rcu_read_unlock();
        return ERR_PTR(-ENOENT);
 }
 
@@ -165,28 +163,25 @@ static struct inode *nfs_layout_find_inode_by_fh(struct nfs_client *clp,
        struct inode *inode;
        struct pnfs_layout_hdr *lo;
 
+       rcu_read_lock();
        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
-               list_for_each_entry(lo, &server->layouts, plh_layouts) {
+               list_for_each_entry_rcu(lo, &server->layouts, plh_layouts) {
                        nfsi = NFS_I(lo->plh_inode);
                        if (nfs_compare_fh(fh, &nfsi->fh))
                                continue;
                        if (nfsi->layout != lo)
                                continue;
+                       if (!nfs_sb_active(server->super))
+                               continue;
                        inode = igrab(lo->plh_inode);
-                       if (!inode)
-                               return ERR_PTR(-EAGAIN);
-                       if (!nfs_sb_active(inode->i_sb)) {
-                               rcu_read_unlock();
-                               spin_unlock(&clp->cl_lock);
-                               iput(inode);
-                               spin_lock(&clp->cl_lock);
-                               rcu_read_lock();
-                               return ERR_PTR(-EAGAIN);
-                       }
-                       return inode;
+                       rcu_read_unlock();
+                       if (inode)
+                               return inode;
+                       nfs_sb_deactive(server->super);
+                       return ERR_PTR(-EAGAIN);
                }
        }
-
+       rcu_read_unlock();
        return ERR_PTR(-ENOENT);
 }
 
@@ -196,14 +191,9 @@ static struct inode *nfs_layout_find_inode(struct nfs_client *clp,
 {
        struct inode *inode;
 
-       spin_lock(&clp->cl_lock);
-       rcu_read_lock();
        inode = nfs_layout_find_inode_by_stateid(clp, stateid);
        if (inode == ERR_PTR(-ENOENT))
                inode = nfs_layout_find_inode_by_fh(clp, fh);
-       rcu_read_unlock();
-       spin_unlock(&clp->cl_lock);
-
        return inode;
 }