OSDN Git Service

pNFS/flexfile: Don't merge layout segments if the mirrors don't match
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 23 Mar 2020 19:40:20 +0000 (15:40 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 27 Mar 2020 20:34:35 +0000 (16:34 -0400)
Check that the number of mirrors, and the mirror information matches
before deciding to merge layout segments in pNFS/flexfiles.

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

index d37883a..3221001 100644 (file)
@@ -284,6 +284,23 @@ static void _ff_layout_free_lseg(struct nfs4_ff_layout_segment *fls)
 }
 
 static bool
+ff_lseg_match_mirrors(struct pnfs_layout_segment *l1,
+               struct pnfs_layout_segment *l2)
+{
+       const struct nfs4_ff_layout_segment *fl1 = FF_LAYOUT_LSEG(l1);
+       const struct nfs4_ff_layout_segment *fl2 = FF_LAYOUT_LSEG(l1);
+       u32 i;
+
+       if (fl1->mirror_array_cnt != fl2->mirror_array_cnt)
+               return false;
+       for (i = 0; i < fl1->mirror_array_cnt; i++) {
+               if (fl1->mirror_array[i] != fl2->mirror_array[i])
+                       return false;
+       }
+       return true;
+}
+
+static bool
 ff_lseg_range_is_after(const struct pnfs_layout_range *l1,
                const struct pnfs_layout_range *l2)
 {
@@ -318,6 +335,8 @@ ff_lseg_merge(struct pnfs_layout_segment *new,
                        new->pls_range.length);
        if (new_end < old->pls_range.offset)
                return false;
+       if (!ff_lseg_match_mirrors(new, old))
+               return false;
 
        /* Mergeable: copy info from 'old' to 'new' */
        if (new_end < old_end)