Re: [PATCH 04/17] xfs: don't use a xfs_log_iovec for attr_item names and values

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

 



On Tue, Jun 10, 2025 at 07:15:01AM +0200, Christoph Hellwig wrote:
> These buffers are not directly logged, just use a kvec and remove the
> xlog_copy_from_iovec helper only used here.

This looks correct, I'm not much sure if using a kvec here is ok, so I'll rely
on other reviewers regarding this. So take my review more related to code
correctness.

Reviewed-by: Carlos Maiolino <cmaiolino@xxxxxxxxxx>

> 
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
> ---
>  fs/xfs/xfs_attr_item.c | 111 +++++++++++++++++++++--------------------
>  fs/xfs/xfs_attr_item.h |   8 +--
>  fs/xfs/xfs_log.h       |   7 ---
>  3 files changed, 60 insertions(+), 66 deletions(-)
> 
> diff --git a/fs/xfs/xfs_attr_item.c b/fs/xfs/xfs_attr_item.c
> index f683b7a9323f..2b3dde2eec9c 100644
> --- a/fs/xfs/xfs_attr_item.c
> +++ b/fs/xfs/xfs_attr_item.c
> @@ -91,41 +91,37 @@ xfs_attri_log_nameval_alloc(
>  					name_len + new_name_len + value_len +
>  					new_value_len);
> 
> -	nv->name.i_addr = nv + 1;
> -	nv->name.i_len = name_len;
> -	nv->name.i_type = XLOG_REG_TYPE_ATTR_NAME;
> -	memcpy(nv->name.i_addr, name, name_len);
> +	nv->name.iov_base = nv + 1;
> +	nv->name.iov_len = name_len;
> +	memcpy(nv->name.iov_base, name, name_len);
> 
>  	if (new_name_len) {
> -		nv->new_name.i_addr = nv->name.i_addr + name_len;
> -		nv->new_name.i_len = new_name_len;
> -		memcpy(nv->new_name.i_addr, new_name, new_name_len);
> +		nv->new_name.iov_base = nv->name.iov_base + name_len;
> +		nv->new_name.iov_len = new_name_len;
> +		memcpy(nv->new_name.iov_base, new_name, new_name_len);
>  	} else {
> -		nv->new_name.i_addr = NULL;
> -		nv->new_name.i_len = 0;
> +		nv->new_name.iov_base = NULL;
> +		nv->new_name.iov_len = 0;
>  	}
> -	nv->new_name.i_type = XLOG_REG_TYPE_ATTR_NEWNAME;
> 
>  	if (value_len) {
> -		nv->value.i_addr = nv->name.i_addr + name_len + new_name_len;
> -		nv->value.i_len = value_len;
> -		memcpy(nv->value.i_addr, value, value_len);
> +		nv->value.iov_base = nv->name.iov_base + name_len + new_name_len;
> +		nv->value.iov_len = value_len;
> +		memcpy(nv->value.iov_base, value, value_len);
>  	} else {
> -		nv->value.i_addr = NULL;
> -		nv->value.i_len = 0;
> +		nv->value.iov_base = NULL;
> +		nv->value.iov_len = 0;
>  	}
> -	nv->value.i_type = XLOG_REG_TYPE_ATTR_VALUE;
> 
>  	if (new_value_len) {
> -		nv->new_value.i_addr = nv->name.i_addr + name_len +
> +		nv->new_value.iov_base = nv->name.iov_base + name_len +
>  						new_name_len + value_len;
> -		nv->new_value.i_len = new_value_len;
> -		memcpy(nv->new_value.i_addr, new_value, new_value_len);
> +		nv->new_value.iov_len = new_value_len;
> +		memcpy(nv->new_value.iov_base, new_value, new_value_len);
>  	} else {
> -		nv->new_value.i_addr = NULL;
> -		nv->new_value.i_len = 0;
> +		nv->new_value.iov_base = NULL;
> +		nv->new_value.iov_len = 0;
>  	}
> -	nv->new_value.i_type = XLOG_REG_TYPE_ATTR_NEWVALUE;
> 
>  	refcount_set(&nv->refcount, 1);
>  	return nv;
> @@ -170,21 +166,21 @@ xfs_attri_item_size(
> 
>  	*nvecs += 2;
>  	*nbytes += sizeof(struct xfs_attri_log_format) +
> -			xlog_calc_iovec_len(nv->name.i_len);
> +			xlog_calc_iovec_len(nv->name.iov_len);
> 
> -	if (nv->new_name.i_len) {
> +	if (nv->new_name.iov_len) {
>  		*nvecs += 1;
> -		*nbytes += xlog_calc_iovec_len(nv->new_name.i_len);
> +		*nbytes += xlog_calc_iovec_len(nv->new_name.iov_len);
>  	}
> 
> -	if (nv->value.i_len) {
> +	if (nv->value.iov_len) {
>  		*nvecs += 1;
> -		*nbytes += xlog_calc_iovec_len(nv->value.i_len);
> +		*nbytes += xlog_calc_iovec_len(nv->value.iov_len);
>  	}
> 
> -	if (nv->new_value.i_len) {
> +	if (nv->new_value.iov_len) {
>  		*nvecs += 1;
> -		*nbytes += xlog_calc_iovec_len(nv->new_value.i_len);
> +		*nbytes += xlog_calc_iovec_len(nv->new_value.iov_len);
>  	}
>  }
> 
> @@ -212,31 +208,36 @@ xfs_attri_item_format(
>  	 * the log recovery.
>  	 */
> 
> -	ASSERT(nv->name.i_len > 0);
> +	ASSERT(nv->name.iov_len > 0);
>  	attrip->attri_format.alfi_size++;
> 
> -	if (nv->new_name.i_len > 0)
> +	if (nv->new_name.iov_len > 0)
>  		attrip->attri_format.alfi_size++;
> 
> -	if (nv->value.i_len > 0)
> +	if (nv->value.iov_len > 0)
>  		attrip->attri_format.alfi_size++;
> 
> -	if (nv->new_value.i_len > 0)
> +	if (nv->new_value.iov_len > 0)
>  		attrip->attri_format.alfi_size++;
> 
>  	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTRI_FORMAT,
>  			&attrip->attri_format,
>  			sizeof(struct xfs_attri_log_format));
> -	xlog_copy_from_iovec(lv, &vecp, &nv->name);
> 
> -	if (nv->new_name.i_len > 0)
> -		xlog_copy_from_iovec(lv, &vecp, &nv->new_name);
> +	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTR_NAME, nv->name.iov_base,
> +			nv->name.iov_len);
> 
> -	if (nv->value.i_len > 0)
> -		xlog_copy_from_iovec(lv, &vecp, &nv->value);
> +	if (nv->new_name.iov_len > 0)
> +		xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTR_NEWNAME,
> +			nv->new_name.iov_base, nv->new_name.iov_len);
> 
> -	if (nv->new_value.i_len > 0)
> -		xlog_copy_from_iovec(lv, &vecp, &nv->new_value);
> +	if (nv->value.iov_len > 0)
> +		xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTR_VALUE,
> +			nv->value.iov_base, nv->value.iov_len);
> +
> +	if (nv->new_value.iov_len > 0)
> +		xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTR_NEWVALUE,
> +			nv->new_value.iov_base, nv->new_value.iov_len);
>  }
> 
>  /*
> @@ -383,22 +384,22 @@ xfs_attr_log_item(
>  	attrp->alfi_ino = args->dp->i_ino;
>  	ASSERT(!(attr->xattri_op_flags & ~XFS_ATTRI_OP_FLAGS_TYPE_MASK));
>  	attrp->alfi_op_flags = attr->xattri_op_flags;
> -	attrp->alfi_value_len = nv->value.i_len;
> +	attrp->alfi_value_len = nv->value.iov_len;
> 
>  	switch (xfs_attr_log_item_op(attrp)) {
>  	case XFS_ATTRI_OP_FLAGS_PPTR_REPLACE:
> -		ASSERT(nv->value.i_len == nv->new_value.i_len);
> +		ASSERT(nv->value.iov_len == nv->new_value.iov_len);
> 
>  		attrp->alfi_igen = VFS_I(args->dp)->i_generation;
> -		attrp->alfi_old_name_len = nv->name.i_len;
> -		attrp->alfi_new_name_len = nv->new_name.i_len;
> +		attrp->alfi_old_name_len = nv->name.iov_len;
> +		attrp->alfi_new_name_len = nv->new_name.iov_len;
>  		break;
>  	case XFS_ATTRI_OP_FLAGS_PPTR_REMOVE:
>  	case XFS_ATTRI_OP_FLAGS_PPTR_SET:
>  		attrp->alfi_igen = VFS_I(args->dp)->i_generation;
>  		fallthrough;
>  	default:
> -		attrp->alfi_name_len = nv->name.i_len;
> +		attrp->alfi_name_len = nv->name.iov_len;
>  		break;
>  	}
> 
> @@ -690,14 +691,14 @@ xfs_attri_recover_work(
>  	args->dp = ip;
>  	args->geo = mp->m_attr_geo;
>  	args->whichfork = XFS_ATTR_FORK;
> -	args->name = nv->name.i_addr;
> -	args->namelen = nv->name.i_len;
> -	args->new_name = nv->new_name.i_addr;
> -	args->new_namelen = nv->new_name.i_len;
> -	args->value = nv->value.i_addr;
> -	args->valuelen = nv->value.i_len;
> -	args->new_value = nv->new_value.i_addr;
> -	args->new_valuelen = nv->new_value.i_len;
> +	args->name = nv->name.iov_base;
> +	args->namelen = nv->name.iov_len;
> +	args->new_name = nv->new_name.iov_base;
> +	args->new_namelen = nv->new_name.iov_len;
> +	args->value = nv->value.iov_base;
> +	args->valuelen = nv->value.iov_len;
> +	args->new_value = nv->new_value.iov_base;
> +	args->new_valuelen = nv->new_value.iov_len;
>  	args->attr_filter = attrp->alfi_attr_filter & XFS_ATTRI_FILTER_MASK;
>  	args->op_flags = XFS_DA_OP_RECOVERY | XFS_DA_OP_OKNOENT |
>  			 XFS_DA_OP_LOGGED;
> @@ -754,8 +755,8 @@ xfs_attr_recover_work(
>  	 */
>  	attrp = &attrip->attri_format;
>  	if (!xfs_attri_validate(mp, attrp) ||
> -	    !xfs_attr_namecheck(attrp->alfi_attr_filter, nv->name.i_addr,
> -				nv->name.i_len))
> +	    !xfs_attr_namecheck(attrp->alfi_attr_filter, nv->name.iov_base,
> +				nv->name.iov_len))
>  		return -EFSCORRUPTED;
> 
>  	attr = xfs_attri_recover_work(mp, dfp, attrp, &ip, nv);
> diff --git a/fs/xfs/xfs_attr_item.h b/fs/xfs/xfs_attr_item.h
> index e74128cbb722..d108a11b55ae 100644
> --- a/fs/xfs/xfs_attr_item.h
> +++ b/fs/xfs/xfs_attr_item.h
> @@ -12,10 +12,10 @@ struct xfs_mount;
>  struct kmem_zone;
> 
>  struct xfs_attri_log_nameval {
> -	struct xfs_log_iovec	name;
> -	struct xfs_log_iovec	new_name;	/* PPTR_REPLACE only */
> -	struct xfs_log_iovec	value;
> -	struct xfs_log_iovec	new_value;	/* PPTR_REPLACE only */
> +	struct kvec		name;
> +	struct kvec		new_name;	/* PPTR_REPLACE only */
> +	struct kvec		value;
> +	struct kvec		new_value;	/* PPTR_REPLACE only */
>  	refcount_t		refcount;
> 
>  	/* name and value follow the end of this struct */
> diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h
> index f239fce4f260..af6daf4f6792 100644
> --- a/fs/xfs/xfs_log.h
> +++ b/fs/xfs/xfs_log.h
> @@ -88,13 +88,6 @@ xlog_copy_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
>  	return buf;
>  }
> 
> -static inline void *
> -xlog_copy_from_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
> -		const struct xfs_log_iovec *src)
> -{
> -	return xlog_copy_iovec(lv, vecp, src->i_type, src->i_addr, src->i_len);
> -}
> -
>  /*
>   * By comparing each component, we don't have to worry about extra
>   * endian issues in treating two 32 bit numbers as one 64 bit number
> --
> 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