Re: [PATCH 02/17] xfs: cleanup the ordered item logic in xlog_cil_insert_format_items

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 10, 2025 at 07:14:59AM +0200, Christoph Hellwig wrote:
> Split out handling of ordered items into a single branch in
> xlog_cil_insert_format_items so that the rest of the code becomes more
> clear.
> 
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
> ---
>  fs/xfs/xfs_log_cil.c | 31 +++++++++++++------------------
>  1 file changed, 13 insertions(+), 18 deletions(-)
> 
> diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c
> index c3db01b2ea47..81b6780e0afc 100644
> --- a/fs/xfs/xfs_log_cil.c
> +++ b/fs/xfs/xfs_log_cil.c
> @@ -452,9 +452,8 @@ xlog_cil_insert_format_items(
>  	}
> 
>  	list_for_each_entry(lip, &tp->t_items, li_trans) {
> -		struct xfs_log_vec *lv;
> -		struct xfs_log_vec *shadow;
> -		bool	ordered = false;
> +		struct xfs_log_vec *lv = lip->li_lv;
> +		struct xfs_log_vec *shadow = lip->li_lv_shadow;
> 
>  		/* Skip items which aren't dirty in this transaction. */
>  		if (!test_bit(XFS_LI_DIRTY, &lip->li_flags))
> @@ -464,21 +463,23 @@ xlog_cil_insert_format_items(
>  		 * The formatting size information is already attached to
>  		 * the shadow lv on the log item.
>  		 */
> -		shadow = lip->li_lv_shadow;
> -		if (shadow->lv_buf_len == XFS_LOG_VEC_ORDERED)
> -			ordered = true;
> +		if (shadow->lv_buf_len == XFS_LOG_VEC_ORDERED) {
> +			if (!lv) {
> +				lv = shadow;
> +				lv->lv_item = lip;
> +			}
> +			ASSERT(shadow->lv_size == lv->lv_size);

			This assert is kind of confusing me. if we have an
			ORDERED vector here, couldn't we still have a shadow
			size smaller than the current vector?

> +			xfs_cil_prepare_item(log, lip, lv, diff_len);
> +			continue;
> +		}
> 
>  		/* Skip items that do not have any vectors for writing */
> -		if (!shadow->lv_niovecs && !ordered)
> +		if (!shadow->lv_niovecs)
>  			continue;
> 
>  		/* compare to existing item size */
> -		if (lip->li_lv && shadow->lv_size <= lip->li_lv->lv_size) {
> +		if (lv && shadow->lv_size <= lv->lv_size) {
>  			/* same or smaller, optimise common overwrite case */
> -			lv = lip->li_lv;
> -
> -			if (ordered)
> -				goto insert;
> 
>  			/*
>  			 * set the item up as though it is a new insertion so
> @@ -498,16 +499,10 @@ xlog_cil_insert_format_items(
>  			/* switch to shadow buffer! */
>  			lv = shadow;
>  			lv->lv_item = lip;
> -			if (ordered) {
> -				/* track as an ordered logvec */
> -				ASSERT(lip->li_lv == NULL);
> -				goto insert;
> -			}
>  		}
> 
>  		ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t)));
>  		lip->li_ops->iop_format(lip, lv);
> -insert:
>  		xfs_cil_prepare_item(log, lip, lv, diff_len);
>  	}
>  }
> --
> 2.47.2
> 
> 




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux