* [PATCH 1/2] NFSv4/flexfiles: calculate stripe boundaries from the file offset [not found] <20261022164826.38125-1-mora@netapp.com> @ 2026-10-22 16:48 ` Jorge Mora 2026-10-22 17:11 ` Mora, Jorge 0 siblings, 1 reply; 3+ messages in thread From: Jorge Mora @ 2026-10-22 16:48 UTC (permalink / raw) To: Jorge.Mora, jorge_luis_mora; +Cc: Jorge Mora, stable ff_layout_pg_test() subtracted the layout segment offset when splitting I/O across stripes. Device selection in nfs4_ff_layout_calc_dss_id() uses the absolute file offset, which is also how RFC 8435 sparse layouts number stripes. A LAYOUTGET reply that starts off a stripe boundary therefore moves the clipping point while the data server is still chosen from the file offset. After a data-server error, a direct write that crosses a stripe is joined and resent past the real boundary, and a later read of that range is not split. Clip with the same file offset used to select the data server. The segment offset remains the covered byte range; pnfs_generic_pg_test() already limits coalescing to that range. Fixes: 4934ccbeaed3 ("NFSv4/flexfiles: Read path updates for striped layouts") Cc: stable@vger.kernel.org Signed-off-by: Jorge Mora <mora@netapp.com> --- fs/nfs/flexfilelayout/flexfilelayout.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 7fe8b91fa..09d44de26 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -996,7 +996,6 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, unsigned int size; u64 p_stripe, r_stripe; u32 stripe_offset; - u64 segment_offset = pgio->pg_lseg->pls_range.offset; u32 stripe_unit = FF_LAYOUT_LSEG(pgio->pg_lseg)->stripe_unit; /* calls nfs_generic_pg_test */ @@ -1006,10 +1005,17 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, else if (!ff_layout_lseg_is_striped(FF_LAYOUT_LSEG(pgio->pg_lseg))) return size; - /* see if req and prev are in the same stripe */ + /* + * Sparse flexfiles stripes by logical file offset, the same value + * nfs4_ff_layout_calc_dss_id() uses to choose a data server. The + * layout segment offset is only the covered byte range. + * pnfs_generic_pg_test() already stops coalescing at the end of it. + * Subtracting that offset here shifts the stripe phase whenever a + * LAYOUTGET reply starts off a stripe boundary. + */ if (prev) { - p_stripe = (u64)req_offset(prev) - segment_offset; - r_stripe = (u64)req_offset(req) - segment_offset; + p_stripe = req_offset(prev); + r_stripe = req_offset(req); do_div(p_stripe, stripe_unit); do_div(r_stripe, stripe_unit); @@ -1018,9 +1024,7 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, } /* calculate remaining bytes in the current stripe */ - div_u64_rem((u64)req_offset(req) - segment_offset, - stripe_unit, - &stripe_offset); + div_u64_rem(req_offset(req), stripe_unit, &stripe_offset); WARN_ON_ONCE(stripe_offset > stripe_unit); if (stripe_offset >= stripe_unit) return 0; -- 2.52.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] NFSv4/flexfiles: calculate stripe boundaries from the file offset 2026-10-22 16:48 ` [PATCH 1/2] NFSv4/flexfiles: calculate stripe boundaries from the file offset Jorge Mora @ 2026-10-22 17:11 ` Mora, Jorge 0 siblings, 0 replies; 3+ messages in thread From: Mora, Jorge @ 2026-10-22 17:11 UTC (permalink / raw) To: Jorge Mora, jorge_luis_mora@yahoo.com; +Cc: stable@vger.kernel.org Please disregard this message. I was testing my git sendmail configuration and it automatically send it to stable@vger.kernel.org even though I did not add it to --to or --cc list. Also, this is no my patch and the author will re-send it soon. ________________________________________ From: Jorge Mora <jmora1300@gmail.com> Sent: Thursday, October 22, 2026 10:48 AM To: Mora, Jorge; jorge_luis_mora@yahoo.com Cc: Mora, Jorge; stable@vger.kernel.org Subject: [PATCH 1/2] NFSv4/flexfiles: calculate stripe boundaries from the file offset [You don't often get email from jmora1300@gmail.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] EXTERNAL EMAIL - USE CAUTION when clicking links or attachments ff_layout_pg_test() subtracted the layout segment offset when splitting I/O across stripes. Device selection in nfs4_ff_layout_calc_dss_id() uses the absolute file offset, which is also how RFC 8435 sparse layouts number stripes. A LAYOUTGET reply that starts off a stripe boundary therefore moves the clipping point while the data server is still chosen from the file offset. After a data-server error, a direct write that crosses a stripe is joined and resent past the real boundary, and a later read of that range is not split. Clip with the same file offset used to select the data server. The segment offset remains the covered byte range; pnfs_generic_pg_test() already limits coalescing to that range. Fixes: 4934ccbeaed3 ("NFSv4/flexfiles: Read path updates for striped layouts") Cc: stable@vger.kernel.org Signed-off-by: Jorge Mora <mora@netapp.com> --- fs/nfs/flexfilelayout/flexfilelayout.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 7fe8b91fa..09d44de26 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -996,7 +996,6 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, unsigned int size; u64 p_stripe, r_stripe; u32 stripe_offset; - u64 segment_offset = pgio->pg_lseg->pls_range.offset; u32 stripe_unit = FF_LAYOUT_LSEG(pgio->pg_lseg)->stripe_unit; /* calls nfs_generic_pg_test */ @@ -1006,10 +1005,17 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, else if (!ff_layout_lseg_is_striped(FF_LAYOUT_LSEG(pgio->pg_lseg))) return size; - /* see if req and prev are in the same stripe */ + /* + * Sparse flexfiles stripes by logical file offset, the same value + * nfs4_ff_layout_calc_dss_id() uses to choose a data server. The + * layout segment offset is only the covered byte range. + * pnfs_generic_pg_test() already stops coalescing at the end of it. + * Subtracting that offset here shifts the stripe phase whenever a + * LAYOUTGET reply starts off a stripe boundary. + */ if (prev) { - p_stripe = (u64)req_offset(prev) - segment_offset; - r_stripe = (u64)req_offset(req) - segment_offset; + p_stripe = req_offset(prev); + r_stripe = req_offset(req); do_div(p_stripe, stripe_unit); do_div(r_stripe, stripe_unit); @@ -1018,9 +1024,7 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, } /* calculate remaining bytes in the current stripe */ - div_u64_rem((u64)req_offset(req) - segment_offset, - stripe_unit, - &stripe_offset); + div_u64_rem(req_offset(req), stripe_unit, &stripe_offset); WARN_ON_ONCE(stripe_offset > stripe_unit); if (stripe_offset >= stripe_unit) return 0; -- 2.52.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
[parent not found: <20261022164046.38079-1-mora@netapp.com>]
* [PATCH 1/2] NFSv4/flexfiles: calculate stripe boundaries from the file offset [not found] <20261022164046.38079-1-mora@netapp.com> @ 2026-10-22 16:40 ` Jorge Mora 0 siblings, 0 replies; 3+ messages in thread From: Jorge Mora @ 2026-10-22 16:40 UTC (permalink / raw) To: Jorge.Mora; +Cc: jorge_luis_mora, Jorge Mora, stable ff_layout_pg_test() subtracted the layout segment offset when splitting I/O across stripes. Device selection in nfs4_ff_layout_calc_dss_id() uses the absolute file offset, which is also how RFC 8435 sparse layouts number stripes. A LAYOUTGET reply that starts off a stripe boundary therefore moves the clipping point while the data server is still chosen from the file offset. After a data-server error, a direct write that crosses a stripe is joined and resent past the real boundary, and a later read of that range is not split. Clip with the same file offset used to select the data server. The segment offset remains the covered byte range; pnfs_generic_pg_test() already limits coalescing to that range. Fixes: 4934ccbeaed3 ("NFSv4/flexfiles: Read path updates for striped layouts") Cc: stable@vger.kernel.org Signed-off-by: Jorge Mora <mora@netapp.com> --- fs/nfs/flexfilelayout/flexfilelayout.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 7fe8b91fa..09d44de26 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -996,7 +996,6 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, unsigned int size; u64 p_stripe, r_stripe; u32 stripe_offset; - u64 segment_offset = pgio->pg_lseg->pls_range.offset; u32 stripe_unit = FF_LAYOUT_LSEG(pgio->pg_lseg)->stripe_unit; /* calls nfs_generic_pg_test */ @@ -1006,10 +1005,17 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, else if (!ff_layout_lseg_is_striped(FF_LAYOUT_LSEG(pgio->pg_lseg))) return size; - /* see if req and prev are in the same stripe */ + /* + * Sparse flexfiles stripes by logical file offset, the same value + * nfs4_ff_layout_calc_dss_id() uses to choose a data server. The + * layout segment offset is only the covered byte range. + * pnfs_generic_pg_test() already stops coalescing at the end of it. + * Subtracting that offset here shifts the stripe phase whenever a + * LAYOUTGET reply starts off a stripe boundary. + */ if (prev) { - p_stripe = (u64)req_offset(prev) - segment_offset; - r_stripe = (u64)req_offset(req) - segment_offset; + p_stripe = req_offset(prev); + r_stripe = req_offset(req); do_div(p_stripe, stripe_unit); do_div(r_stripe, stripe_unit); @@ -1018,9 +1024,7 @@ ff_layout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, } /* calculate remaining bytes in the current stripe */ - div_u64_rem((u64)req_offset(req) - segment_offset, - stripe_unit, - &stripe_offset); + div_u64_rem(req_offset(req), stripe_unit, &stripe_offset); WARN_ON_ONCE(stripe_offset > stripe_unit); if (stripe_offset >= stripe_unit) return 0; -- 2.52.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-22 17:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20261022164826.38125-1-mora@netapp.com>
2026-10-22 16:48 ` [PATCH 1/2] NFSv4/flexfiles: calculate stripe boundaries from the file offset Jorge Mora
2026-10-22 17:11 ` Mora, Jorge
[not found] <20261022164046.38079-1-mora@netapp.com>
2026-10-22 16:40 ` Jorge Mora
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox