pnfs: don't merge new ff lsegs with ones that have LAYOUTRETURN bit set
authorJeff Layton <jlayton@poochiereds.net>
Tue, 17 May 2016 16:28:39 +0000 (12:28 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 17 May 2016 19:48:09 +0000 (15:48 -0400)
Otherwise, we'll end up returning layouts that we've just received if
the client issues a new LAYOUTGET prior to the LAYOUTRETURN.

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/flexfilelayout/flexfilelayout.c

index 2911ceda8cd92288fe46960d0f7ac3bca74895f7..3bac2094c175babb4b99357bf50fa1cba034734a 100644 (file)
@@ -299,6 +299,8 @@ ff_lseg_merge(struct pnfs_layout_segment *new,
 {
        u64 new_end, old_end;
 
+       if (test_bit(NFS_LSEG_LAYOUTRETURN, &old->pls_flags))
+               return false;
        if (new->pls_range.iomode != old->pls_range.iomode)
                return false;
        old_end = pnfs_calc_offset_end(old->pls_range.offset,
@@ -319,8 +321,6 @@ ff_lseg_merge(struct pnfs_layout_segment *new,
                        new_end);
        if (test_bit(NFS_LSEG_ROC, &old->pls_flags))
                set_bit(NFS_LSEG_ROC, &new->pls_flags);
-       if (test_bit(NFS_LSEG_LAYOUTRETURN, &old->pls_flags))
-               set_bit(NFS_LSEG_LAYOUTRETURN, &new->pls_flags);
        return true;
 }