Commit 660d1eb2 authored by Trond Myklebust's avatar Trond Myklebust

pNFS/flexfile: Don't merge layout segments if the mirrors don't match

Check that the number of mirrors, and the mirror information matches
before deciding to merge layout segments in pNFS/flexfiles.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent e18c18eb
...@@ -283,6 +283,23 @@ static void _ff_layout_free_lseg(struct nfs4_ff_layout_segment *fls) ...@@ -283,6 +283,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 static bool
ff_lseg_range_is_after(const struct pnfs_layout_range *l1, ff_lseg_range_is_after(const struct pnfs_layout_range *l1,
const struct pnfs_layout_range *l2) const struct pnfs_layout_range *l2)
...@@ -318,6 +335,8 @@ ff_lseg_merge(struct pnfs_layout_segment *new, ...@@ -318,6 +335,8 @@ ff_lseg_merge(struct pnfs_layout_segment *new,
new->pls_range.length); new->pls_range.length);
if (new_end < old->pls_range.offset) if (new_end < old->pls_range.offset)
return false; return false;
if (!ff_lseg_match_mirrors(new, old))
return false;
/* Mergeable: copy info from 'old' to 'new' */ /* Mergeable: copy info from 'old' to 'new' */
if (new_end < old_end) if (new_end < old_end)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment