@@ -910,9 +910,13 @@ xfs_attr_defer_add(
struct xfs_da_args *args)
{
struct xfs_attr_intent *new;
+ int op_flag = XFS_ATTRI_OP_FLAGS_SET;
int error = 0;
- error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_SET, &new);
+ if (args->op_flags & XFS_DA_OP_VLOOKUP)
+ op_flag = XFS_ATTRI_OP_FLAGS_NVSET;
+
+ error = xfs_attr_intent_init(args, op_flag, &new);
if (error)
return error;
@@ -960,6 +960,7 @@ struct xfs_icreate_log {
#define XFS_ATTRI_OP_FLAGS_REPLACE 3 /* Replace the attribute */
#define XFS_ATTRI_OP_FLAGS_NVREPLACE 4 /* Replace attr name and val */
#define XFS_ATTRI_OP_FLAGS_NVREMOVE 5 /* Remove attr w/ vlookup */
+#define XFS_ATTRI_OP_FLAGS_NVSET 6 /* Set attr with w/ vlookup */
#define XFS_ATTRI_OP_FLAGS_TYPE_MASK 0xFF /* Flags type mask */
/*
@@ -545,6 +545,7 @@ xfs_attri_validate(
case XFS_ATTRI_OP_FLAGS_REMOVE:
case XFS_ATTRI_OP_FLAGS_NVREPLACE:
case XFS_ATTRI_OP_FLAGS_NVREMOVE:
+ case XFS_ATTRI_OP_FLAGS_NVSET:
break;
default:
return false;
@@ -633,6 +634,9 @@ xfs_attri_item_recover(
ASSERT(xfs_sb_version_haslogxattrs(&mp->m_sb));
switch (attr->xattri_op_flags) {
+ case XFS_ATTRI_OP_FLAGS_NVSET:
+ args->op_flags |= XFS_DA_OP_VLOOKUP;
+ fallthrough;
case XFS_ATTRI_OP_FLAGS_SET:
case XFS_ATTRI_OP_FLAGS_REPLACE:
case XFS_ATTRI_OP_FLAGS_NVREPLACE:
@@ -773,6 +777,7 @@ xlog_recover_attri_commit_pass2(
op = attri_formatp->alfi_op_flags & XFS_ATTRI_OP_FLAGS_TYPE_MASK;
switch (op) {
+ case XFS_ATTRI_OP_FLAGS_NVSET:
case XFS_ATTRI_OP_FLAGS_SET:
case XFS_ATTRI_OP_FLAGS_REPLACE:
case XFS_ATTRI_OP_FLAGS_NVREMOVE: