pNFS: Don't mark layout segments invalid on layoutreturn in pnfs_roc
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 15 Nov 2016 23:29:59 +0000 (18:29 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 1 Dec 2016 22:21:45 +0000 (17:21 -0500)
The layoutreturn call will take care of invalidating the layout segments
once the call is successful.

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

index 330f3a012f8eed29ee0a8136d21cbae23313cc8d..d7b5ad437b1408cfb11753562f705b5b28961aac 100644 (file)
@@ -1205,22 +1205,28 @@ bool pnfs_roc(struct inode *ino)
                        goto out_noroc;
        }
 
-       /* always send layoutreturn if being marked so */
-       if (test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
-               layoutreturn = pnfs_prepare_layoutreturn(lo,
-                               &stateid, NULL);
 
-       list_for_each_entry_safe(lseg, tmp, &lo->plh_segs, pls_list)
+       list_for_each_entry_safe(lseg, tmp, &lo->plh_segs, pls_list) {
                /* If we are sending layoutreturn, invalidate all valid lsegs */
-               if (layoutreturn || test_bit(NFS_LSEG_ROC, &lseg->pls_flags)) {
+               if (test_bit(NFS_LSEG_ROC, &lseg->pls_flags)) {
                        mark_lseg_invalid(lseg, &tmp_list);
                        found = true;
                }
+       }
+
+       /* always send layoutreturn if being marked so */
+       if (test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) {
+               layoutreturn = pnfs_prepare_layoutreturn(lo,
+                               &stateid, NULL);
+               if (layoutreturn)
+                       goto out_noroc;
+       }
+
        /* ROC in two conditions:
         * 1. there are ROC lsegs
         * 2. we don't send layoutreturn
         */
-       if (found && !layoutreturn) {
+       if (found) {
                /* lo ref dropped in pnfs_roc_release() */
                pnfs_get_layout_hdr(lo);
                roc = true;