• Dave Chinner's avatar
    xfs: use XFS_DA_OP flags in deferred attr ops · e7f358de
    Dave Chinner authored
    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: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: default avatarAllison Henderson <allison.henderson@oracle.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    e7f358de
xfs_attr.h 22.8 KB