]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: regularize iclog space accounting in xlog_write_partial
authorChristoph Hellwig <hch@lst.de>
Wed, 12 Nov 2025 12:14:22 +0000 (13:14 +0100)
committerCarlos Maiolino <cem@kernel.org>
Wed, 21 Jan 2026 11:57:16 +0000 (12:57 +0100)
When xlog_write_partial splits a log region over multiple iclogs, it
has to include the continuation ophder in the length requested for the
new iclog.  Currently is simply adds that to the request, which makes
the accounting of the used space below look slightly different from the
other users of iclog space that decrement it.

To prepare for more code sharing, add the ophdr size to the len variable
that tracks the number of bytes still are left in this xlog_write
operation before the calling xlog_write_get_more_iclog_space, and then
decrement it later when consuming that space.

This changes the value of len when xlog_write_get_more_iclog_space
returns an error, but as nothing looks at len in that case the
difference doesn't matter.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_log.c

index 1d2cdea1e3ac0170e37308195b8fc255f847520c..ddb1a13d4850af593258fa23c5c9c3a2250e2319 100644 (file)
@@ -2050,10 +2050,10 @@ xlog_write_partial(
                         * consumes hasn't been accounted to the lv we are
                         * writing.
                         */
+                       *len += sizeof(struct xlog_op_header);
                        error = xlog_write_get_more_iclog_space(ticket,
-                                       &iclog, log_offset,
-                                       *len + sizeof(struct xlog_op_header),
-                                       record_cnt, data_cnt);
+                                       &iclog, log_offset, *len, record_cnt,
+                                       data_cnt);
                        if (error)
                                return error;
 
@@ -2066,6 +2066,7 @@ xlog_write_partial(
                        ticket->t_curr_res -= sizeof(struct xlog_op_header);
                        *log_offset += sizeof(struct xlog_op_header);
                        *data_cnt += sizeof(struct xlog_op_header);
+                       *len -= sizeof(struct xlog_op_header);
 
                        /*
                         * If rlen fits in the iclog, then end the region