NFSv4.1/pnfs: Don't prevent layoutgets when doing return-on-close
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 4 Aug 2015 19:57:13 +0000 (15:57 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 12 Aug 2015 18:56:19 +0000 (14:56 -0400)
If there is an outstanding return-on-close, then we just want new
layoutget requests to wait rather than fail.

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

index e3a47ee154743da5647ac0ad1c0b184a38be8d71..8c5f9f59efbb2ea1249648a088d39560a6dad945 100644 (file)
@@ -1105,7 +1105,9 @@ bool pnfs_roc(struct inode *ino)
                }
        if (!found)
                goto out_noroc;
-       lo->plh_block_lgets++;
+       if (test_and_set_bit(NFS_LAYOUT_RETURN, &lo->plh_flags))
+               goto out_noroc;
+       lo->plh_return_iomode = IOMODE_ANY;
        pnfs_get_layout_hdr(lo); /* matched in pnfs_roc_release */
        spin_unlock(&ino->i_lock);
        pnfs_free_lseg_list(&tmp_list);
@@ -1133,7 +1135,7 @@ void pnfs_roc_release(struct inode *ino)
 
        spin_lock(&ino->i_lock);
        lo = NFS_I(ino)->layout;
-       lo->plh_block_lgets--;
+       pnfs_clear_layoutreturn_waitbit(lo);
        if (atomic_dec_and_test(&lo->plh_refcount)) {
                pnfs_detach_layout_hdr(lo);
                spin_unlock(&ino->i_lock);