skip LAYOUTRETURN if layout is invalid
authorOlga Kornievskaia <olga.kornievskaia@gmail.com>
Mon, 11 Jun 2018 19:32:06 +0000 (15:32 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 12 Jun 2018 12:48:04 +0000 (08:48 -0400)
Currently, when IO to DS fails, client returns the layout and
retries against the MDS. However, then on umounting (inode eviction)
it returns the layout again.

This is because pnfs_return_layout() was changed in
commit d78471d32bb6 ("pnfs/blocklayout: set PNFS_LAYOUTRETURN_ON_ERROR")
to always set NFS_LAYOUT_RETURN_REQUESTED so even if we returned
the layout, it will be returned again. Instead, let's also check
if we have already marked the layout invalid.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/pnfs.c

index d93942fa3817d9c2c63397c122960e567787efc8..bcc3addec3c5376436f55f4d7cabad564bc41ea7 100644 (file)
@@ -1211,7 +1211,7 @@ _pnfs_return_layout(struct inode *ino)
        LIST_HEAD(tmp_list);
        nfs4_stateid stateid;
        int status = 0;
-       bool send;
+       bool send, valid_layout;
 
        dprintk("NFS: %s for inode %lu\n", __func__, ino->i_ino);
 
@@ -1232,6 +1232,7 @@ _pnfs_return_layout(struct inode *ino)
                        goto out_put_layout_hdr;
                spin_lock(&ino->i_lock);
        }
+       valid_layout = pnfs_layout_is_valid(lo);
        pnfs_clear_layoutcommit(ino, &tmp_list);
        pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0);
 
@@ -1245,7 +1246,8 @@ _pnfs_return_layout(struct inode *ino)
        }
 
        /* Don't send a LAYOUTRETURN if list was initially empty */
-       if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) {
+       if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) ||
+                       !valid_layout) {
                spin_unlock(&ino->i_lock);
                dprintk("NFS: %s no layout segments to return\n", __func__);
                goto out_put_layout_hdr;