summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2025-11-12 13:14:26 +0100
committerCarlos Maiolino <cem@kernel.org>2026-01-21 12:57:16 +0100
commita10b44cf1018f5f94d5a4caefef581d181c70f5d (patch)
tree22fb0156fd0003a6ab3870462f734e742c317947
parente2663443da71445a0c847199480b6a53ddec35e5 (diff)
xfs: factor out a xlog_write_space_advance helper
Add a new xlog_write_space_advance that returns the current place in the iclog that data is written to, and advances the various counters by the amount taken from xlog_write_iovec, and also use it xlog_write_partial, which open codes the counter adjustments, but misses the asserts. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
-rw-r--r--fs/xfs/xfs_log.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 6d0319388e29..8ddd25970471 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1885,21 +1885,31 @@ static inline uint32_t xlog_write_space_left(struct xlog_write_data *data)
return data->iclog->ic_size - data->log_offset;
}
+static void *
+xlog_write_space_advance(
+ struct xlog_write_data *data,
+ unsigned int len)
+{
+ void *p = data->iclog->ic_datap + data->log_offset;
+
+ ASSERT(xlog_write_space_left(data) >= len);
+ ASSERT(data->log_offset % sizeof(int32_t) == 0);
+ ASSERT(len % sizeof(int32_t) == 0);
+
+ data->data_cnt += len;
+ data->log_offset += len;
+ data->bytes_left -= len;
+ return p;
+}
+
static inline void
xlog_write_iovec(
struct xlog_write_data *data,
void *buf,
uint32_t buf_len)
{
- ASSERT(xlog_write_space_left(data) >= buf_len);
- ASSERT(data->log_offset % sizeof(int32_t) == 0);
- ASSERT(buf_len % sizeof(int32_t) == 0);
-
- memcpy(data->iclog->ic_datap + data->log_offset, buf, buf_len);
- data->log_offset += buf_len;
- data->bytes_left -= buf_len;
+ memcpy(xlog_write_space_advance(data, buf_len), buf, buf_len);
data->record_cnt++;
- data->data_cnt += buf_len;
}
/*
@@ -2040,7 +2050,8 @@ xlog_write_partial(
if (error)
return error;
- ophdr = data->iclog->ic_datap + data->log_offset;
+ ophdr = xlog_write_space_advance(data,
+ sizeof(struct xlog_op_header));
ophdr->oh_tid = cpu_to_be32(data->ticket->t_tid);
ophdr->oh_clientid = XFS_TRANSACTION;
ophdr->oh_res2 = 0;
@@ -2048,9 +2059,6 @@ xlog_write_partial(
data->ticket->t_curr_res -=
sizeof(struct xlog_op_header);
- data->log_offset += sizeof(struct xlog_op_header);
- data->data_cnt += sizeof(struct xlog_op_header);
- data->bytes_left -= sizeof(struct xlog_op_header);
/*
* If rlen fits in the iclog, then end the region