@@ -953,9 +953,13 @@ xfs_attr_defer_remove(
{
struct xfs_attr_intent *new;
+ int op_flag = XFS_ATTRI_OP_FLAGS_REMOVE;
int error;
- error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REMOVE, &new);
+ if (args->op_flags & XFS_DA_OP_VLOOKUP)
+ op_flag = XFS_ATTRI_OP_FLAGS_NVREMOVE;
+
+ error = xfs_attr_intent_init(args, op_flag, &new);
if (error)
return error;
@@ -959,6 +959,7 @@ struct xfs_icreate_log {
#define XFS_ATTRI_OP_FLAGS_REMOVE 2 /* Remove the attribute */
#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_TYPE_MASK 0xFF /* Flags type mask */
/*
@@ -544,6 +544,7 @@ xfs_attri_validate(
case XFS_ATTRI_OP_FLAGS_REPLACE:
case XFS_ATTRI_OP_FLAGS_REMOVE:
case XFS_ATTRI_OP_FLAGS_NVREPLACE:
+ case XFS_ATTRI_OP_FLAGS_NVREMOVE:
break;
default:
return false;
@@ -643,6 +644,11 @@ xfs_attri_item_recover(
else
attr->xattri_dela_state = xfs_attr_init_add_state(args);
break;
+ case XFS_ATTRI_OP_FLAGS_NVREMOVE:
+ args->op_flags |= XFS_DA_OP_VLOOKUP;
+ args->value = nv->value.i_addr;
+ args->valuelen = nv->value.i_len;
+ fallthrough;
case XFS_ATTRI_OP_FLAGS_REMOVE:
if (!xfs_inode_hasattr(args->dp))
goto out;
@@ -769,6 +775,7 @@ xlog_recover_attri_commit_pass2(
switch (op) {
case XFS_ATTRI_OP_FLAGS_SET:
case XFS_ATTRI_OP_FLAGS_REPLACE:
+ case XFS_ATTRI_OP_FLAGS_NVREMOVE:
if (item->ri_total != 3 && item->ri_total != 2) {
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
attri_formatp, len);