mirror of https://github.com/torvalds/linux.git
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:
parent
e870cbe6fa
commit
8bf931f99e
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue