[pnfs] [PATCH 1/1] SQUASHME: pnfsblock: fixup blksize alignment in bl_setup_layoutcommit

Benny Halevy bhalevy at panasas.com
Tue Aug 25 14:20:17 EDT 2009


lseg.offset adjustment needs to be added to lseg.length
before rounding it up to the next blksize.

For example:
	pnfs_blksize = 4096;
	lseg.offset = 2048;
	lseg.length = 4096;

To adjust this range to pnfs_blksize boundaries we want
to set lseg.offset = 0 and lseg.length = 8192.

but, before this fix:
	arg->lseg.offset &= ~mask;	=> lseg.offset = 0;
	arg->lseg.length += mask;	=> lseg.length = 8191;
	arg->lseg.length &= ~mask;	=> lseg.length = 4096;

with this fix:
	offset = arg->lseg.offset & mask;	=> offset = 2048;

	arg->lseg.offset -= offset;		=> lseg.offset = 0;
	arg->lseg.length += offset + mask;	=> lseg.length = 10239;
	arg->lseg.length &= ~mask;		=> lseg.length = 8192;

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/blocklayout/blocklayout.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 68aabc4..10199a9 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -628,8 +628,10 @@ bl_setup_layoutcommit(struct pnfs_layout_type *lo,
 	/* Need to ensure commit is block-size aligned */
 	if (nfss->pnfs_blksize) {
 		u64 mask = nfss->pnfs_blksize - 1;
-		arg->lseg.offset &= ~mask;
-		arg->lseg.length += mask;
+		u64 offset = arg->lseg.offset & mask;
+
+		arg->lseg.offset -= offset;
+		arg->lseg.length += offset + mask;
 		arg->lseg.length &= ~mask;
 	}
 	return encode_pnfs_block_layoutupdate4(BLK_LO2EXT(lo), arg);
-- 
1.6.4



More information about the pNFS mailing list