linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Allison Henderson <allison.henderson@oracle.com>
To: linux-xfs@vger.kernel.org
Subject: [PATCH v2 06/27] xfsprogs: Set up infastructure for deferred attribute operations
Date: Sat,  9 Jun 2018 22:07:31 -0700	[thread overview]
Message-ID: <1528607272-11122-7-git-send-email-allison.henderson@oracle.com> (raw)
In-Reply-To: <1528607272-11122-1-git-send-email-allison.henderson@oracle.com>

This patch adds two new log item types for setting or
removing attributes as deferred operations.  The
xfs_attri_log_item logs an intent to set or remove an
attribute.  The corresponding xfs_attrd_log_item holds
a reference to the xfs_attri_log_item and is freed once
the transaction is done.  Both log items use a generic
xfs_attr_log_format structure that contains the attribute
name, value, flags, inode, and an op_flag that indicates
if the operations is a set or remove.

At the moment, this feature will only be used by the parent
pointer patch set which uses attributes to store information
about an inodes parent.

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
---
 libxfs/xfs_attr.c       |  5 +++--
 libxfs/xfs_attr.h       | 24 +++++++++++++++++++++++-
 libxfs/xfs_defer.h      |  1 +
 libxfs/xfs_log_format.h | 44 ++++++++++++++++++++++++++++++++++++++++++--
 libxfs/xfs_types.h      |  1 +
 5 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c
index 13271bb..e894468 100644
--- a/libxfs/xfs_attr.c
+++ b/libxfs/xfs_attr.c
@@ -36,6 +36,7 @@
 #include "xfs_attr_remote.h"
 #include "xfs_trans_space.h"
 #include "xfs_trace.h"
+#include "xfs_attr_item.h"
 
 /*
  * xfs_attr.c
@@ -69,7 +70,7 @@ STATIC int xfs_attr_fillstate(xfs_da_state_t *state);
 STATIC int xfs_attr_refillstate(xfs_da_state_t *state);
 
 
-STATIC int
+int
 xfs_attr_args_init(
 	struct xfs_da_args	*args,
 	struct xfs_inode	*dp,
@@ -165,7 +166,7 @@ xfs_attr_get(
 /*
  * Calculate how many blocks we need for the new attribute,
  */
-STATIC int
+int
 xfs_attr_calc_size(
 	struct xfs_da_args	*args,
 	int			*local)
diff --git a/libxfs/xfs_attr.h b/libxfs/xfs_attr.h
index de2b99f..eebfad7 100644
--- a/libxfs/xfs_attr.h
+++ b/libxfs/xfs_attr.h
@@ -87,6 +87,26 @@ typedef struct attrlist_ent {	/* data from attr_list() */
 } attrlist_ent_t;
 
 /*
+ * List of attrs to commit later.
+ */
+struct xfs_attr_item {
+	struct xfs_inode  *xattri_ip;
+	uint32_t	  xattri_op_flags;
+	uint32_t	  xattri_value_len;   /* length of value */
+	uint32_t	  xattri_name_len;    /* length of name */
+	uint32_t	  xattri_flags;       /* attr flags */
+	struct list_head  xattri_list;
+
+	/*
+	 * A byte array follows the header containing the file name and
+	 * attribute value.
+	 */
+};
+
+#define XFS_ATTR_ITEM_SIZEOF(namelen, valuelen)	\
+	(sizeof(struct xfs_attr_item) + (namelen) + (valuelen))
+
+/*
  * Given a pointer to the (char*) buffer containing the attr_list() result,
  * and an index, return a pointer to the indicated attribute in the buffer.
  */
@@ -155,6 +175,8 @@ int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, int flags);
 int xfs_attr_remove_args(struct xfs_da_args *args, int flags, bool roll_trans);
 int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize,
 		  int flags, struct attrlist_cursor_kern *cursor);
-
+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);
 
 #endif	/* __XFS_ATTR_H__ */
diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h
index 045beac..11e1690 100644
--- a/libxfs/xfs_defer.h
+++ b/libxfs/xfs_defer.h
@@ -55,6 +55,7 @@ enum xfs_defer_ops_type {
 	XFS_DEFER_OPS_TYPE_REFCOUNT,
 	XFS_DEFER_OPS_TYPE_RMAP,
 	XFS_DEFER_OPS_TYPE_FREE,
+	XFS_DEFER_OPS_TYPE_ATTR,
 	XFS_DEFER_OPS_TYPE_MAX,
 };
 
diff --git a/libxfs/xfs_log_format.h b/libxfs/xfs_log_format.h
index 349d9f8..291e5ff 100644
--- a/libxfs/xfs_log_format.h
+++ b/libxfs/xfs_log_format.h
@@ -116,7 +116,12 @@ static inline uint xlog_get_cycle(char *ptr)
 #define XLOG_REG_TYPE_CUD_FORMAT	24
 #define XLOG_REG_TYPE_BUI_FORMAT	25
 #define XLOG_REG_TYPE_BUD_FORMAT	26
-#define XLOG_REG_TYPE_MAX		26
+#define XLOG_REG_TYPE_ATTRI_FORMAT	27
+#define XLOG_REG_TYPE_ATTRD_FORMAT	28
+#define XLOG_REG_TYPE_ATTR_NAME	29
+#define XLOG_REG_TYPE_ATTR_VALUE	30
+#define XLOG_REG_TYPE_MAX		31
+
 
 /*
  * Flags to log operation header
@@ -239,6 +244,8 @@ typedef struct xfs_trans_header {
 #define	XFS_LI_CUD		0x1243
 #define	XFS_LI_BUI		0x1244	/* bmbt update intent */
 #define	XFS_LI_BUD		0x1245
+#define	XFS_LI_ATTRI		0x1246  /* attr set/remove intent*/
+#define	XFS_LI_ATTRD		0x1247  /* attr set/remove done */
 
 #define XFS_LI_TYPE_DESC \
 	{ XFS_LI_EFI,		"XFS_LI_EFI" }, \
@@ -254,7 +261,9 @@ typedef struct xfs_trans_header {
 	{ XFS_LI_CUI,		"XFS_LI_CUI" }, \
 	{ XFS_LI_CUD,		"XFS_LI_CUD" }, \
 	{ XFS_LI_BUI,		"XFS_LI_BUI" }, \
-	{ XFS_LI_BUD,		"XFS_LI_BUD" }
+	{ XFS_LI_BUD,		"XFS_LI_BUD" }, \
+	{ XFS_LI_ATTRI,		"XFS_LI_ATTRI" }, \
+	{ XFS_LI_ATTRD,		"XFS_LI_ATTRD" }
 
 /*
  * Inode Log Item Format definitions.
@@ -852,4 +861,35 @@ struct xfs_icreate_log {
 	__be32		icl_gen;	/* inode generation number to use */
 };
 
+/*
+ * Flags for deferred attribute operations.
+ * Upper bits are flags, lower byte is type code
+ */
+#define XFS_ATTR_OP_FLAGS_SET		1	/* Set the attribute */
+#define XFS_ATTR_OP_FLAGS_REMOVE	2	/* Remove the attribute */
+#define XFS_ATTR_OP_FLAGS_TYPE_MASK	0x0FF	/* Flags type mask */
+
+/*
+ * This is the structure used to lay out an attr log item in the
+ * log.
+ */
+struct xfs_attri_log_format {
+	uint16_t	alfi_type;	/* attri log item type */
+	uint16_t	alfi_size;	/* size of this item */
+	uint32_t	__pad;		/* pad to 64 bit aligned */
+	uint64_t	alfi_id;	/* attri identifier */
+	xfs_ino_t       alfi_ino;	/* the inode for this attr operation */
+	uint32_t        alfi_op_flags;	/* marks the op as a set or remove */
+	uint32_t        alfi_name_len;	/* attr name length */
+	uint32_t        alfi_value_len;	/* attr value length */
+	uint32_t        alfi_attr_flags;/* attr flags */
+};
+
+struct xfs_attrd_log_format {
+	uint16_t	alfd_type;	/* attrd log item type */
+	uint16_t	alfd_size;	/* size of this item */
+	uint32_t	__pad;		/* pad to 64 bit aligned */
+	uint64_t	alfd_alf_id;	/* id of corresponding attrd */
+};
+
 #endif /* __XFS_LOG_FORMAT_H__ */
diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h
index 3c56069..2905ce3 100644
--- a/libxfs/xfs_types.h
+++ b/libxfs/xfs_types.h
@@ -23,6 +23,7 @@ typedef uint32_t	prid_t;		/* project ID */
 typedef uint32_t	xfs_agblock_t;	/* blockno in alloc. group */
 typedef uint32_t	xfs_agino_t;	/* inode # within allocation grp */
 typedef uint32_t	xfs_extlen_t;	/* extent length in blocks */
+typedef uint32_t	xfs_attrlen_t;	/* attr length */
 typedef uint32_t	xfs_agnumber_t;	/* allocation group number */
 typedef int32_t		xfs_extnum_t;	/* # of extents in a file */
 typedef int16_t		xfs_aextnum_t;	/* # extents in an attribute fork */
-- 
2.7.4


  parent reply	other threads:[~2018-06-10  5:10 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-10  5:07 [PATCH v2 00/27] xfsprogs: parent pointers v2 Allison Henderson
2018-06-10  5:07 ` [PATCH v2 01/27] xfsprogs: Move xfs_attr.h to libxfs Allison Henderson
2018-06-10  5:07 ` [PATCH v2 02/27] xfsprogs: Add helper function xfs_attr_try_sf_addname Allison Henderson
2018-06-10  5:07 ` [PATCH v2 03/27] xfsprogs: Add trans toggle to attr routines Allison Henderson
2018-06-10  7:02   ` Amir Goldstein
2018-06-10 16:19     ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 04/27] xfsprogs: Add attibute set and helper functions Allison Henderson
2018-06-10  5:07 ` [PATCH v2 05/27] xfsprogs: Add attibute remove " Allison Henderson
2018-06-10  5:07 ` Allison Henderson [this message]
2018-06-10  5:07 ` [PATCH v2 07/27] xfsprogs: Add xfs_attr_set_deferred and xfs_attr_remove_deferred Allison Henderson
2018-06-10  5:07 ` [PATCH v2 08/27] xfsprogs: Remove all strlen calls in all xfs_attr_* functions for attr names Allison Henderson
2018-06-10  5:07 ` [PATCH v2 09/27] xfsprogs: get directory offset when adding directory name Allison Henderson
2018-06-10  5:07 ` [PATCH v2 10/27] xfsprogs: get directory offset when removing " Allison Henderson
2018-06-10  5:07 ` [PATCH v2 11/27] xfsprogs: get directory offset when replacing a " Allison Henderson
2018-06-10  5:07 ` [PATCH v2 12/27] xfsprogs: add parent pointer support to attribute code Allison Henderson
2018-06-10  5:07 ` [PATCH v2 13/27] xfsprogs: define parent pointer xattr format Allison Henderson
2018-06-10  5:07 ` [PATCH v2 14/27] xfsprogs: extent transaction reservations for parent attributes Allison Henderson
2018-06-10  5:07 ` [PATCH v2 15/27] xfsprogs: parent pointer attribute creation Allison Henderson
2018-06-10  5:07 ` [PATCH v2 16/27] xfsprogs: Add the parent pointer support to the superblock version 5 Allison Henderson
2018-06-10  5:07 ` [PATCH v2 17/27] xfsprogs: Add helper function xfs_attr_list_context_init Allison Henderson
2018-06-10  5:07 ` [PATCH v2 18/27] xfsprogs: Add parent pointer ioctl Allison Henderson
2018-06-10  5:07 ` [PATCH v2 19/27] xfsprogs: Add delayed attributes error tag Allison Henderson
2018-06-11 17:28   ` Darrick J. Wong
2018-06-11 19:59     ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 20/27] xfsprogs: Add parent pointer flag to cmd Allison Henderson
2018-06-11 17:43   ` Darrick J. Wong
2018-06-11 20:00     ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 21/27] xfsprogs: Remove single byte array from struct parent Allison Henderson
2018-06-10 11:21   ` Amir Goldstein
2018-06-10 15:25     ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 22/27] xfsprogs: Add log item printing for ATTRI and ATTRD Allison Henderson
2018-06-10  5:07 ` [PATCH v2 23/27] xfsprogs: Do not use namechecks on parent pointers Allison Henderson
2018-06-11 18:00   ` Darrick J. Wong
2018-06-11 20:00     ` Allison Henderson
2018-06-11 20:23       ` Darrick J. Wong
2018-06-11 20:38         ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 24/27] xfsprogs: Add parent pointers to recreated inodes Allison Henderson
2018-06-10 11:27   ` Amir Goldstein
2018-06-10 17:19     ` Allison Henderson
2018-06-11 17:31       ` Darrick J. Wong
2018-06-11 18:06   ` Darrick J. Wong
2018-06-11 20:00     ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 25/27] xfsprogs: Add parent pointers during protofile creation Allison Henderson
2018-06-10 11:32   ` Amir Goldstein
2018-06-11 18:15   ` Darrick J. Wong
2018-06-11 19:58     ` Allison Henderson
2018-06-10  5:07 ` [PATCH v2 26/27] xfsprogs: implement the upper half of parent pointers Allison Henderson
2018-06-10 12:06   ` Amir Goldstein
2018-06-10  5:07 ` [PATCH v2 27/27] xfsprogs: Clean up old parent pointer definitions Allison Henderson
2018-06-11 18:20   ` Darrick J. Wong
2018-06-11 20:06     ` Allison Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1528607272-11122-7-git-send-email-allison.henderson@oracle.com \
    --to=allison.henderson@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).