diff options
author | Dave Chinner <dchinner@redhat.com> | 2022-05-12 08:12:56 +0300 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2022-05-12 08:12:56 +0300 |
commit | e7f358dee4e5cf1ce8b11ff2e65d5ccb1ced24db (patch) | |
tree | 2fa9db34b65b482be51677455e2864f7151d14bd /fs/xfs/libxfs/xfs_attr.h | |
parent | 59782a236b622a983ff101b2cb1333f714e4ed4e (diff) | |
download | linux-e7f358dee4e5cf1ce8b11ff2e65d5ccb1ced24db.tar.xz |
xfs: use XFS_DA_OP flags in deferred attr ops
We currently store the high level attr operation in
args->attr_flags. This field contains what the VFS is telling us to
do, but don't necessarily match what we are doing in the low level
modification state machine. e.g. XATTR_REPLACE implies both
XFS_DA_OP_ADDNAME and XFS_DA_OP_RENAME because it is doing both a
remove and adding a new attr.
However, deep in the individual state machine operations, we check
errors against this high level VFS op flags, not the low level
XFS_DA_OP flags. Indeed, we don't even have a low level flag for
a REMOVE operation, so the only way we know we are doing a remove
is the complete absence of XATTR_REPLACE, XATTR_CREATE,
XFS_DA_OP_ADDNAME and XFS_DA_OP_RENAME. And because there are other
flags in these fields, this is a pain to check if we need to.
As the XFS_DA_OP flags are only needed once the deferred operations
are set up, set these flags appropriately when we set the initial
operation state. We also introduce a XFS_DA_OP_REMOVE flag to make
it easy to know that we are doing a remove operation.
With these, we can remove the use of XATTR_REPLACE and XATTR_CREATE
in low level lookup operations, and manipulate the low level flags
according to the low level context that is operating. e.g. log
recovery does not have a VFS xattr operation state to copy into
args->attr_flags, and the low level state machine ops we do for
recovery do not match the high level VFS operations that were in
progress when the system failed...
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/libxfs/xfs_attr.h')
-rw-r--r-- | fs/xfs/libxfs/xfs_attr.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 41d70ad62cbf..689a96689f1a 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -584,7 +584,6 @@ xfs_attr_is_shortform( static inline enum xfs_delattr_state xfs_attr_init_add_state(struct xfs_da_args *args) { - /* * When called from the completion of a attr remove to determine the * next state, the attribute fork may be null. This can occur only occur @@ -595,6 +594,8 @@ xfs_attr_init_add_state(struct xfs_da_args *args) */ if (!args->dp->i_afp) return XFS_DAS_DONE; + + args->op_flags |= XFS_DA_OP_ADDNAME; if (xfs_attr_is_shortform(args->dp)) return XFS_DAS_SF_ADD; if (xfs_attr_is_leaf(args->dp)) @@ -605,6 +606,7 @@ xfs_attr_init_add_state(struct xfs_da_args *args) static inline enum xfs_delattr_state xfs_attr_init_remove_state(struct xfs_da_args *args) { + args->op_flags |= XFS_DA_OP_REMOVE; if (xfs_attr_is_shortform(args->dp)) return XFS_DAS_SF_REMOVE; if (xfs_attr_is_leaf(args->dp)) @@ -615,6 +617,7 @@ xfs_attr_init_remove_state(struct xfs_da_args *args) static inline enum xfs_delattr_state xfs_attr_init_replace_state(struct xfs_da_args *args) { + args->op_flags |= XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE; return xfs_attr_init_add_state(args); } |