Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 820a554f authored by Mark Tinguely's avatar Mark Tinguely Committed by Ben Myers
Browse files

xfs: fix segment in xfs_buf_item_format_segment



Not every segment in a multi-segment buffer is dirty in a
transaction and they will not be outputted. The assert in
xfs_buf_item_format_segment() that checks for the at least
one chunk of data in the segment to be used is not necessary
true for multi-segmented buffers.

Signed-off-by: default avatarMark Tinguely <tinguely@sgi.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent b9438173
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -287,6 +287,17 @@ xfs_buf_item_format_segment(
	 */
	base_size = offsetof(struct xfs_buf_log_format, blf_data_map) +
			(blfp->blf_map_size * sizeof(blfp->blf_data_map[0]));

	nvecs = 0;
	first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0);
	if (!(bip->bli_flags & XFS_BLI_STALE) && first_bit == -1) {
		/*
		 * If the map is not be dirty in the transaction, mark
		 * the size as zero and do not advance the vector pointer.
		 */
		goto out;
	}

	vecp->i_addr = blfp;
	vecp->i_len = base_size;
	vecp->i_type = XLOG_REG_TYPE_BFORMAT;
@@ -301,15 +312,13 @@ xfs_buf_item_format_segment(
		 */
		trace_xfs_buf_item_format_stale(bip);
		ASSERT(blfp->blf_flags & XFS_BLF_CANCEL);
		blfp->blf_size = nvecs;
		return vecp;
		goto out;
	}

	/*
	 * Fill in an iovec for each set of contiguous chunks.
	 */
	first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0);
	ASSERT(first_bit != -1);

	last_bit = first_bit;
	nbits = 1;
	for (;;) {
@@ -371,7 +380,8 @@ xfs_buf_item_format_segment(
			nbits++;
		}
	}
	bip->__bli_format.blf_size = nvecs;
out:
	blfp->blf_size = nvecs;
	return vecp;
}