pNFS: Clear out all layout segments if the server unsets lrp->res.lrs_present
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 3 Sep 2016 15:05:28 +0000 (11:05 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 3 Sep 2016 16:10:38 +0000 (12:10 -0400)
If the server fails to set lrp->res.lrs_present in the LAYOUTRETURN reply,
then that means it believes the client holds no more layout state for that
file, and that the layout stateid is now invalid.

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

index f5aecaabcb7c7ba01a89e5f06c5f78cf3bdc3d20..c380d2ee413776ecd7807c9bc52f22c5960b6d68 100644 (file)
@@ -8190,10 +8190,13 @@ static void nfs4_layoutreturn_release(void *calldata)
 
        dprintk("--> %s\n", __func__);
        spin_lock(&lo->plh_inode->i_lock);
-       pnfs_mark_matching_lsegs_invalid(lo, &freeme, &lrp->args.range,
-                       be32_to_cpu(lrp->args.stateid.seqid));
-       if (lrp->res.lrs_present && pnfs_layout_is_valid(lo))
+       if (lrp->res.lrs_present) {
+               pnfs_mark_matching_lsegs_invalid(lo, &freeme,
+                               &lrp->args.range,
+                               be32_to_cpu(lrp->args.stateid.seqid));
                pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
+       } else
+               pnfs_mark_layout_stateid_invalid(lo, &freeme);
        pnfs_clear_layoutreturn_waitbit(lo);
        spin_unlock(&lo->plh_inode->i_lock);
        nfs4_sequence_free_slot(&lrp->res.seq_res);