[PATCH v8 08/28] xfs: Add xfs_attr_set_deferred and xfs_attr_remove_deferred
From: Allison Henderson <hidden>
Date: 2018-08-28 23:17:59
Subsystem:
filesystems (vfs and infrastructure), the rest, xfs filesystem · Maintainers:
Alexander Viro, Christian Brauner, Linus Torvalds, Carlos Maiolino
These routines set up set and start a new deferred attribute operation. These functions are meant to be called by other code needing to initiate a deferred attribute operation. We will use these routines later in the parent pointer patches. Signed-off-by: Allison Henderson <redacted> --- fs/xfs/libxfs/xfs_attr.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_attr.h | 5 +++ 2 files changed, 84 insertions(+)
diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index 94fbde4..afcb4e9 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c@@ -447,6 +447,52 @@ xfs_attr_set( return error; } +/* Sets an attribute for an inode as a deferred operation */ +int +xfs_attr_set_deferred( + struct xfs_inode *dp, + struct xfs_trans *tp, + void *name, + unsigned int namelen, + void *value, + unsigned int valuelen, + int flags) +{ + + struct xfs_attr_item *new; + char *name_value; + + /* + * All set operations must have a name + * but not necessarily a value. + * Generic 062 + */ + if (!namelen) { + ASSERT(0); + return -EFSCORRUPTED; + } + + new = kmem_alloc(XFS_ATTR_ITEM_SIZEOF(namelen, valuelen), + KM_SLEEP|KM_NOFS); + name_value = ((char *)new) + sizeof(struct xfs_attr_item); + memset(new, 0, XFS_ATTR_ITEM_SIZEOF(namelen, valuelen)); + new->xattri_ip = dp; + new->xattri_op_flags = XFS_ATTR_OP_FLAGS_SET; + new->xattri_name_len = namelen; + new->xattri_value_len = valuelen; + new->xattri_flags = flags; + memcpy(&name_value[0], name, namelen); + new->xattri_name = name_value; + new->xattri_value = name_value + namelen; + + if (valuelen > 0) + memcpy(&name_value[namelen], value, valuelen); + + xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); + + return 0; +} + /* * Generic handler routine to remove a name from an attribute list. * Transitions attribute list from Btree to shortform as necessary.
@@ -530,6 +576,39 @@ xfs_attr_remove( return error; } +/* Removes an attribute for an inode as a deferred operation */ +int +xfs_attr_remove_deferred( + struct xfs_inode *dp, + struct xfs_trans *tp, + void *name, + unsigned int namelen, + int flags) +{ + + struct xfs_attr_item *new; + char *name_value; + + if (!namelen) { + ASSERT(0); + return -EFSCORRUPTED; + } + + new = kmem_alloc(XFS_ATTR_ITEM_SIZEOF(namelen, 0), KM_SLEEP|KM_NOFS); + name_value = ((char *)new) + sizeof(struct xfs_attr_item); + memset(new, 0, XFS_ATTR_ITEM_SIZEOF(namelen, 0)); + new->xattri_ip = dp; + new->xattri_op_flags = XFS_ATTR_OP_FLAGS_REMOVE; + new->xattri_name_len = namelen; + new->xattri_value_len = 0; + new->xattri_flags = flags; + memcpy(name_value, name, namelen); + + xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); + + return 0; +} + /*======================================================================== * External routines when attribute list is inside the inode *========================================================================*/
diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h
index 5a5adc0..5c49120 100644
--- a/fs/xfs/libxfs/xfs_attr.h
+++ b/fs/xfs/libxfs/xfs_attr.h@@ -171,5 +171,10 @@ int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, int xfs_attr_args_init(struct xfs_da_args *args, struct xfs_inode *dp, const unsigned char *name, int flags); int xfs_attr_calc_size(struct xfs_da_args *args, int *local); +int xfs_attr_set_deferred(struct xfs_inode *dp, struct xfs_trans *tp, + void *name, unsigned int name_len, void *value, + unsigned int valuelen, int flags); +int xfs_attr_remove_deferred(struct xfs_inode *dp, struct xfs_trans *tp, + void *name, unsigned int namelen, int flags); #endif /* __XFS_ATTR_H__ */
--
2.7.4