NFSv4.1: Get rid of the NFS_LAYOUT_DESTROYED state
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 21 Sep 2012 18:48:04 +0000 (14:48 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 28 Sep 2012 20:03:16 +0000 (16:03 -0400)
We already have a mechanism for blocking LAYOUTGET by means of the
plh_block_lgets counter. The only "service" that NFS_LAYOUT_DESTROYED
provides at this point is to block layoutget once the layout segment
list is empty, which basically means that you have to wait until
the pnfs_layout_hdr is destroyed before you can do pNFS on that file
again.

This patch enables the reuse of the pnfs_layout_hdr if the layout
segment list is empty.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4filelayout.c
fs/nfs/pnfs.c
fs/nfs/pnfs.h

index 6cce57e7fe55cda70f27f056d3bf570c42998c55..52d8472120663de91855690fa0996cdf03e4a8a4 100644 (file)
@@ -279,8 +279,7 @@ filelayout_reset_to_mds(struct pnfs_layout_segment *lseg)
 {
        struct nfs4_deviceid_node *node = FILELAYOUT_DEVID_NODE(lseg);
 
-       return pnfs_test_layout_destroyed(lseg->pls_layout) ||
-               filelayout_test_devid_unavailable(node);
+       return filelayout_test_devid_unavailable(node);
 }
 
 /*
index fcc72ecf2fd7aca75e0d63149d680ba7f4005a5c..bda88a275071226a0d5844bc5ad5baf8d32424f1 100644 (file)
@@ -331,8 +331,6 @@ pnfs_layout_remove_lseg(struct pnfs_layout_hdr *lo,
        list_del_init(&lseg->pls_list);
        /* Matched by pnfs_get_layout_hdr in pnfs_layout_insert_lseg */
        atomic_dec(&lo->plh_refcount);
-       if (list_empty(&lo->plh_segs))
-               set_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags);
        rpc_wake_up(&NFS_SERVER(inode)->roc_rpcwaitq);
 }
 
@@ -463,10 +461,8 @@ pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
 
        dprintk("%s:Begin lo %p\n", __func__, lo);
 
-       if (list_empty(&lo->plh_segs)) {
-               set_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags);
+       if (list_empty(&lo->plh_segs))
                return 0;
-       }
        list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
                if (!recall_range ||
                    should_free_lseg(&lseg->pls_range, recall_range)) {
@@ -590,7 +586,6 @@ pnfs_layoutgets_blocked(struct pnfs_layout_hdr *lo, nfs4_stateid *stateid,
            (int)(lo->plh_barrier - be32_to_cpu(stateid->seqid)) >= 0)
                return true;
        return lo->plh_block_lgets ||
-               test_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags) ||
                test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
                (list_empty(&lo->plh_segs) &&
                 (atomic_read(&lo->plh_outstanding) > lget));
@@ -912,8 +907,6 @@ pnfs_find_alloc_layout(struct inode *ino,
        dprintk("%s Begin ino=%p layout=%p\n", __func__, ino, nfsi->layout);
 
        if (nfsi->layout) {
-               if (test_bit(NFS_LAYOUT_DESTROYED, &nfsi->layout->plh_flags))
-                       return NULL;
                pnfs_get_layout_hdr(nfsi->layout);
                return nfsi->layout;
        }
index aacda7fbb536d5981658c9e672dca1b19893785c..92f6ce6532ba728793e1c5dc09e8e7e4ffe869b1 100644 (file)
@@ -62,7 +62,6 @@ enum {
        NFS_LAYOUT_RW_FAILED,           /* get rw layout failed stop trying */
        NFS_LAYOUT_BULK_RECALL,         /* bulk recall affecting layout */
        NFS_LAYOUT_ROC,                 /* some lseg had roc bit set */
-       NFS_LAYOUT_DESTROYED,           /* no new use of layout allowed */
        NFS_LAYOUT_RETURNED,            /* layout has already been returned */
 };
 
@@ -278,12 +277,6 @@ pnfs_test_layout_returned(struct pnfs_layout_hdr *lo)
        return test_bit(NFS_LAYOUT_RETURNED, &lo->plh_flags);
 }
 
-static inline bool
-pnfs_test_layout_destroyed(struct pnfs_layout_hdr *lo)
-{
-       return test_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags);
-}
-
 static inline struct pnfs_layout_segment *
 pnfs_get_lseg(struct pnfs_layout_segment *lseg)
 {