pNFS: Wait on outstanding layoutreturns to complete in pnfs_roc()
authorTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 30 Nov 2016 21:23:38 +0000 (16:23 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 1 Dec 2016 22:21:50 +0000 (17:21 -0500)
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/pnfs.c

index 57ec46b57364f5b7606f0486ef30dd61d092bb1a..550010826bdd3c8263ae2356d5417b5aaa042c79 100644 (file)
@@ -1245,11 +1245,20 @@ bool pnfs_roc(struct inode *ino,
 
        if (!nfs_have_layout(ino))
                return false;
+retry:
        spin_lock(&ino->i_lock);
        lo = nfsi->layout;
        if (!lo || !pnfs_layout_is_valid(lo) ||
            test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags))
                goto out_noroc;
+       if (test_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags)) {
+               pnfs_get_layout_hdr(lo);
+               spin_unlock(&ino->i_lock);
+               wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN,
+                               TASK_UNINTERRUPTIBLE);
+               pnfs_put_layout_hdr(lo);
+               goto retry;
+       }
 
        /* no roc if we hold a delegation */
        if (nfs4_check_delegation(ino, FMODE_READ))