aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2022-06-22 14:28:52 -0500
committerEric Sandeen <sandeen@sandeen.net>2022-06-22 14:28:52 -0500
commit227a3b639d2a457ecaaeb4fd15d6bc9a835f65eb (patch)
treededa8659c8e281e4b75f2abac5cef3d5532fb1bc
parent5a282e43fd719e37b866f797c9aacac199d08a19 (diff)
downloadxfsprogs-dev-227a3b639d2a457ecaaeb4fd15d6bc9a835f65eb.tar.gz
xfs: hide log iovec alignment constraints
Source kernel commit: b2c28035cea290edbcec697504e5b7a4b1e023e7 Callers currently have to round out the size of buffers to match the aligment constraints of log iovecs and xlog_write(). They should not need to know this detail, so introduce a new function to calculate the iovec length (for use in ->iop_size implementations). Also modify xlog_finish_iovec() to round up the length to the correct alignment so the callers don't need to do this, either. Convert the only user - inode forks - of this alignment rounding to use the new interface. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Allison Henderson <allison.henderson@oracle.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Dave Chinner <david@fromorbit.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--libxfs/xfs_inode_fork.c20
1 files changed, 4 insertions, 16 deletions
diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c
index ac3692b5fc..cf0dd52eb3 100644
--- a/libxfs/xfs_inode_fork.c
+++ b/libxfs/xfs_inode_fork.c
@@ -34,7 +34,7 @@ xfs_init_local_fork(
int64_t size)
{
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
- int mem_size = size, real_size = 0;
+ int mem_size = size;
bool zero_terminate;
/*
@@ -48,13 +48,7 @@ xfs_init_local_fork(
mem_size++;
if (size) {
- /*
- * As we round up the allocation here, we need to ensure the
- * bytes we don't copy data into are zeroed because the log
- * vectors still copy them into the journal.
- */
- real_size = roundup(mem_size, 4);
- ifp->if_u1.if_data = kmem_zalloc(real_size, KM_NOFS);
+ ifp->if_u1.if_data = kmem_alloc(mem_size, KM_NOFS);
memcpy(ifp->if_u1.if_data, data, size);
if (zero_terminate)
ifp->if_u1.if_data[size] = '\0';
@@ -500,14 +494,8 @@ xfs_idata_realloc(
return;
}
- /*
- * For inline data, the underlying buffer must be a multiple of 4 bytes
- * in size so that it can be logged and stay on word boundaries.
- * We enforce that here, and use __GFP_ZERO to ensure that size
- * extensions always zero the unused roundup area.
- */
- ifp->if_u1.if_data = krealloc(ifp->if_u1.if_data, roundup(new_size, 4),
- GFP_NOFS | __GFP_NOFAIL | __GFP_ZERO);
+ ifp->if_u1.if_data = krealloc(ifp->if_u1.if_data, new_size,
+ GFP_NOFS | __GFP_NOFAIL);
ifp->if_bytes = new_size;
}