pNFS: Sync the layout state bits in pnfs_cache_lseg_for_layoutreturn
authorTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 30 Nov 2016 15:47:48 +0000 (10:47 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 1 Dec 2016 22:21:49 +0000 (17:21 -0500)
Ensure that the layout state bits are synced when we cache a layout
segment for layoutreturn using an appropriate call to
pnfs_set_plh_return_info.

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

index a3a51860563c7211e119ef6791b52b08d178aa4a..08acfa49f115a3780b694ce523b228ed34f72c82 100644 (file)
@@ -305,6 +305,20 @@ pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo)
        }
 }
 
+static void
+pnfs_set_plh_return_info(struct pnfs_layout_hdr *lo, enum pnfs_iomode iomode,
+                        u32 seq)
+{
+       if (lo->plh_return_iomode != 0 && lo->plh_return_iomode != iomode)
+               iomode = IOMODE_ANY;
+       lo->plh_return_iomode = iomode;
+       set_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags);
+       if (seq != 0) {
+               WARN_ON_ONCE(lo->plh_return_seq != 0 && lo->plh_return_seq != seq);
+               lo->plh_return_seq = seq;
+       }
+}
+
 static void
 pnfs_clear_layoutreturn_info(struct pnfs_layout_hdr *lo)
 {
@@ -456,6 +470,7 @@ pnfs_cache_lseg_for_layoutreturn(struct pnfs_layout_hdr *lo,
 {
        if (test_and_clear_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags) &&
            pnfs_layout_is_valid(lo)) {
+               pnfs_set_plh_return_info(lo, lseg->pls_range.iomode, 0);
                list_move_tail(&lseg->pls_list, &lo->plh_return_segs);
                return true;
        }
@@ -1001,20 +1016,6 @@ out_unlock:
 
 }
 
-static void
-pnfs_set_plh_return_info(struct pnfs_layout_hdr *lo, enum pnfs_iomode iomode,
-                        u32 seq)
-{
-       if (lo->plh_return_iomode != 0 && lo->plh_return_iomode != iomode)
-               iomode = IOMODE_ANY;
-       lo->plh_return_iomode = iomode;
-       set_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags);
-       if (seq != 0) {
-               WARN_ON_ONCE(lo->plh_return_seq != 0 && lo->plh_return_seq != seq);
-               lo->plh_return_seq = seq;
-       }
-}
-
 static bool
 pnfs_prepare_layoutreturn(struct pnfs_layout_hdr *lo,
                nfs4_stateid *stateid,