xfs: don't use a xfs_log_iovec for attr_item names and values

These buffers are not directly logged, just use a kvec and remove the
xlog_copy_from_iovec helper only used here.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
Christoph Hellwig 2025-07-15 14:30:09 +02:00 committed by Carlos Maiolino
parent e870cbe6fa
commit 8bf931f99e
3 changed files with 60 additions and 66 deletions

View File

@ -91,41 +91,37 @@ xfs_attri_log_nameval_alloc(
name_len + new_name_len + value_len + name_len + new_name_len + value_len +
new_value_len); new_value_len);
nv->name.i_addr = nv + 1; nv->name.iov_base = nv + 1;
nv->name.i_len = name_len; nv->name.iov_len = name_len;
nv->name.i_type = XLOG_REG_TYPE_ATTR_NAME; memcpy(nv->name.iov_base, name, name_len);
memcpy(nv->name.i_addr, name, name_len);
if (new_name_len) { if (new_name_len) {
nv->new_name.i_addr = nv->name.i_addr + name_len; nv->new_name.iov_base = nv->name.iov_base + name_len;
nv->new_name.i_len = new_name_len; nv->new_name.iov_len = new_name_len;
memcpy(nv->new_name.i_addr, new_name, new_name_len); memcpy(nv->new_name.iov_base, new_name, new_name_len);
} else { } else {
nv->new_name.i_addr = NULL; nv->new_name.iov_base = NULL;
nv->new_name.i_len = 0; nv->new_name.iov_len = 0;
} }
nv->new_name.i_type = XLOG_REG_TYPE_ATTR_NEWNAME;
if (value_len) { if (value_len) {
nv->value.i_addr = nv->name.i_addr + name_len + new_name_len; nv->value.iov_base = nv->name.iov_base + name_len + new_name_len;
nv->value.i_len = value_len; nv->value.iov_len = value_len;
memcpy(nv->value.i_addr, value, value_len); memcpy(nv->value.iov_base, value, value_len);
} else { } else {
nv->value.i_addr = NULL; nv->value.iov_base = NULL;
nv->value.i_len = 0; nv->value.iov_len = 0;
} }
nv->value.i_type = XLOG_REG_TYPE_ATTR_VALUE;
if (new_value_len) { 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; new_name_len + value_len;
nv->new_value.i_len = new_value_len; nv->new_value.iov_len = new_value_len;
memcpy(nv->new_value.i_addr, new_value, new_value_len); memcpy(nv->new_value.iov_base, new_value, new_value_len);
} else { } else {
nv->new_value.i_addr = NULL; nv->new_value.iov_base = NULL;
nv->new_value.i_len = 0; nv->new_value.iov_len = 0;
} }
nv->new_value.i_type = XLOG_REG_TYPE_ATTR_NEWVALUE;
refcount_set(&nv->refcount, 1); refcount_set(&nv->refcount, 1);
return nv; return nv;
@ -170,21 +166,21 @@ xfs_attri_item_size(
*nvecs += 2; *nvecs += 2;
*nbytes += sizeof(struct xfs_attri_log_format) + *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; *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; *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; *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. * the log recovery.
*/ */
ASSERT(nv->name.i_len > 0); ASSERT(nv->name.iov_len > 0);
attrip->attri_format.alfi_size++; attrip->attri_format.alfi_size++;
if (nv->new_name.i_len > 0) if (nv->new_name.iov_len > 0)
attrip->attri_format.alfi_size++; attrip->attri_format.alfi_size++;
if (nv->value.i_len > 0) if (nv->value.iov_len > 0)
attrip->attri_format.alfi_size++; attrip->attri_format.alfi_size++;
if (nv->new_value.i_len > 0) if (nv->new_value.iov_len > 0)
attrip->attri_format.alfi_size++; attrip->attri_format.alfi_size++;
xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTRI_FORMAT, xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTRI_FORMAT,
&attrip->attri_format, &attrip->attri_format,
sizeof(struct xfs_attri_log_format)); sizeof(struct xfs_attri_log_format));
xlog_copy_from_iovec(lv, &vecp, &nv->name);
if (nv->new_name.i_len > 0) xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTR_NAME, nv->name.iov_base,
xlog_copy_from_iovec(lv, &vecp, &nv->new_name); nv->name.iov_len);
if (nv->value.i_len > 0) if (nv->new_name.iov_len > 0)
xlog_copy_from_iovec(lv, &vecp, &nv->value); 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) if (nv->value.iov_len > 0)
xlog_copy_from_iovec(lv, &vecp, &nv->new_value); 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; attrp->alfi_ino = args->dp->i_ino;
ASSERT(!(attr->xattri_op_flags & ~XFS_ATTRI_OP_FLAGS_TYPE_MASK)); ASSERT(!(attr->xattri_op_flags & ~XFS_ATTRI_OP_FLAGS_TYPE_MASK));
attrp->alfi_op_flags = attr->xattri_op_flags; 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)) { switch (xfs_attr_log_item_op(attrp)) {
case XFS_ATTRI_OP_FLAGS_PPTR_REPLACE: 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_igen = VFS_I(args->dp)->i_generation;
attrp->alfi_old_name_len = nv->name.i_len; attrp->alfi_old_name_len = nv->name.iov_len;
attrp->alfi_new_name_len = nv->new_name.i_len; attrp->alfi_new_name_len = nv->new_name.iov_len;
break; break;
case XFS_ATTRI_OP_FLAGS_PPTR_REMOVE: case XFS_ATTRI_OP_FLAGS_PPTR_REMOVE:
case XFS_ATTRI_OP_FLAGS_PPTR_SET: case XFS_ATTRI_OP_FLAGS_PPTR_SET:
attrp->alfi_igen = VFS_I(args->dp)->i_generation; attrp->alfi_igen = VFS_I(args->dp)->i_generation;
fallthrough; fallthrough;
default: default:
attrp->alfi_name_len = nv->name.i_len; attrp->alfi_name_len = nv->name.iov_len;
break; break;
} }
@ -687,14 +688,14 @@ xfs_attri_recover_work(
args->dp = ip; args->dp = ip;
args->geo = mp->m_attr_geo; args->geo = mp->m_attr_geo;
args->whichfork = XFS_ATTR_FORK; args->whichfork = XFS_ATTR_FORK;
args->name = nv->name.i_addr; args->name = nv->name.iov_base;
args->namelen = nv->name.i_len; args->namelen = nv->name.iov_len;
args->new_name = nv->new_name.i_addr; args->new_name = nv->new_name.iov_base;
args->new_namelen = nv->new_name.i_len; args->new_namelen = nv->new_name.iov_len;
args->value = nv->value.i_addr; args->value = nv->value.iov_base;
args->valuelen = nv->value.i_len; args->valuelen = nv->value.iov_len;
args->new_value = nv->new_value.i_addr; args->new_value = nv->new_value.iov_base;
args->new_valuelen = nv->new_value.i_len; args->new_valuelen = nv->new_value.iov_len;
args->attr_filter = attrp->alfi_attr_filter & XFS_ATTRI_FILTER_MASK; args->attr_filter = attrp->alfi_attr_filter & XFS_ATTRI_FILTER_MASK;
args->op_flags = XFS_DA_OP_RECOVERY | XFS_DA_OP_OKNOENT | args->op_flags = XFS_DA_OP_RECOVERY | XFS_DA_OP_OKNOENT |
XFS_DA_OP_LOGGED; XFS_DA_OP_LOGGED;
@ -751,8 +752,8 @@ xfs_attr_recover_work(
*/ */
attrp = &attrip->attri_format; attrp = &attrip->attri_format;
if (!xfs_attri_validate(mp, attrp) || if (!xfs_attri_validate(mp, attrp) ||
!xfs_attr_namecheck(attrp->alfi_attr_filter, nv->name.i_addr, !xfs_attr_namecheck(attrp->alfi_attr_filter, nv->name.iov_base,
nv->name.i_len)) nv->name.iov_len))
return -EFSCORRUPTED; return -EFSCORRUPTED;
attr = xfs_attri_recover_work(mp, dfp, attrp, &ip, nv); attr = xfs_attri_recover_work(mp, dfp, attrp, &ip, nv);

View File

@ -12,10 +12,10 @@ struct xfs_mount;
struct kmem_zone; struct kmem_zone;
struct xfs_attri_log_nameval { struct xfs_attri_log_nameval {
struct xfs_log_iovec name; struct kvec name;
struct xfs_log_iovec new_name; /* PPTR_REPLACE only */ struct kvec new_name; /* PPTR_REPLACE only */
struct xfs_log_iovec value; struct kvec value;
struct xfs_log_iovec new_value; /* PPTR_REPLACE only */ struct kvec new_value; /* PPTR_REPLACE only */
refcount_t refcount; refcount_t refcount;
/* name and value follow the end of this struct */ /* name and value follow the end of this struct */

View File

@ -88,13 +88,6 @@ xlog_copy_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
return buf; 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 * 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 * endian issues in treating two 32 bit numbers as one 64 bit number