From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org
Cc: linux-xfs@vger.kernel.org, hch@lst.de
Subject: [PATCH 15/24] xfs: separate the icreate logic around INIT_XATTRS
Date: Thu, 20 Jun 2024 16:02:18 -0700 [thread overview]
Message-ID: <171892418155.3183075.2421928430504613482.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <171892417831.3183075.10759987417835165626.stgit@frogsfrogsfrogs>
From: Darrick J. Wong <djwong@kernel.org>
INIT_XATTRS is overloaded here -- it's set during the creat process when
we think that we're immediately going to set some ACL xattrs to save
time. However, it's also used by the parent pointers code to enable the
attr fork in preparation to receive ppptr xattrs. This results in
xfs_has_parent() branches scattered around the codebase to turn on
INIT_XATTRS.
Linkable files are created far more commonly than unlinkable temporary
files or directory tree roots, so we should centralize this logic in
xfs_inode_init. For the three callers that don't want parent pointers
(online repiar tempfiles, unlinkable tempfiles, rootdir creation) we
provide an UNLINKABLE flag to skip attr fork initialization.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
fs/xfs/libxfs/xfs_inode_util.c | 36 ++++++++++++++++++++++++++----------
fs/xfs/libxfs/xfs_inode_util.h | 1 +
fs/xfs/scrub/tempfile.c | 2 +-
fs/xfs/xfs_inode.c | 3 ---
fs/xfs/xfs_iops.c | 11 ++++-------
fs/xfs/xfs_qm.c | 1 +
fs/xfs/xfs_symlink.c | 3 ---
7 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/fs/xfs/libxfs/xfs_inode_util.c b/fs/xfs/libxfs/xfs_inode_util.c
index 214976ecefd77..5795445ef4bd2 100644
--- a/fs/xfs/libxfs/xfs_inode_util.c
+++ b/fs/xfs/libxfs/xfs_inode_util.c
@@ -233,6 +233,31 @@ xfs_inode_inherit_flags2(
}
}
+/*
+ * If we need to create attributes immediately after allocating the inode,
+ * initialise an empty attribute fork right now. We use the default fork offset
+ * for attributes here as we don't know exactly what size or how many
+ * attributes we might be adding. We can do this safely here because we know
+ * the data fork is completely empty and this saves us from needing to run a
+ * separate transaction to set the fork offset in the immediate future.
+ *
+ * If we have parent pointers and the caller hasn't told us that the file will
+ * never be linked into a directory tree, we /must/ create the attr fork.
+ */
+static inline bool
+xfs_icreate_want_attrfork(
+ struct xfs_mount *mp,
+ const struct xfs_icreate_args *args)
+{
+ if (args->flags & XFS_ICREATE_INIT_XATTRS)
+ return true;
+
+ if (!(args->flags & XFS_ICREATE_UNLINKABLE) && xfs_has_parent(mp))
+ return true;
+
+ return false;
+}
+
/* Initialise an inode's attributes. */
void
xfs_inode_init(
@@ -325,16 +350,7 @@ xfs_inode_init(
ASSERT(0);
}
- /*
- * If we need to create attributes immediately after allocating the
- * inode, initialise an empty attribute fork right now. We use the
- * default fork offset for attributes here as we don't know exactly what
- * size or how many attributes we might be adding. We can do this
- * safely here because we know the data fork is completely empty and
- * this saves us from needing to run a separate transaction to set the
- * fork offset in the immediate future.
- */
- if (args->flags & XFS_ICREATE_INIT_XATTRS) {
+ if (xfs_icreate_want_attrfork(mp, args)) {
ip->i_forkoff = xfs_default_attroffset(ip) >> 3;
xfs_ifork_init_attr(ip, XFS_DINODE_FMT_EXTENTS, 0);
diff --git a/fs/xfs/libxfs/xfs_inode_util.h b/fs/xfs/libxfs/xfs_inode_util.h
index 50c14ba6ca5a2..1c54c3b0cf262 100644
--- a/fs/xfs/libxfs/xfs_inode_util.h
+++ b/fs/xfs/libxfs/xfs_inode_util.h
@@ -32,6 +32,7 @@ struct xfs_icreate_args {
#define XFS_ICREATE_TMPFILE (1U << 0) /* create an unlinked file */
#define XFS_ICREATE_INIT_XATTRS (1U << 1) /* will set xattrs immediately */
+#define XFS_ICREATE_UNLINKABLE (1U << 2) /* cannot link into dir tree */
uint16_t flags;
};
diff --git a/fs/xfs/scrub/tempfile.c b/fs/xfs/scrub/tempfile.c
index 523971a15a72a..d390d56cd8751 100644
--- a/fs/xfs/scrub/tempfile.c
+++ b/fs/xfs/scrub/tempfile.c
@@ -43,7 +43,7 @@ xrep_tempfile_create(
struct xfs_icreate_args args = {
.pip = sc->mp->m_rootip,
.mode = mode,
- .flags = XFS_ICREATE_TMPFILE,
+ .flags = XFS_ICREATE_TMPFILE | XFS_ICREATE_UNLINKABLE,
};
struct xfs_mount *mp = sc->mp;
struct xfs_trans *tp = NULL;
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index c59c6321e361a..dd8e189175d53 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2512,9 +2512,6 @@ xfs_rename_alloc_whiteout(
struct qstr name;
int error;
- if (xfs_has_parent(dp->i_mount))
- args.flags |= XFS_ICREATE_INIT_XATTRS;
-
error = xfs_create_tmpfile(&args, &tmpfile);
if (error)
return error;
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index 4563ba440570b..07f736c42460b 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c
@@ -158,8 +158,6 @@ xfs_create_need_xattr(
if (dir->i_sb->s_security)
return true;
#endif
- if (xfs_has_parent(XFS_I(dir)->i_mount))
- return true;
return false;
}
@@ -215,12 +213,11 @@ xfs_generic_create(
args.flags |= XFS_ICREATE_TMPFILE;
/*
- * If this temporary file will be linkable, set up the file
- * with an attr fork to receive a parent pointer.
+ * If this temporary file will not be linkable, don't bother
+ * creating an attr fork to receive a parent pointer.
*/
- if (!(tmpfile->f_flags & O_EXCL) &&
- xfs_has_parent(XFS_I(dir)->i_mount))
- args.flags |= XFS_ICREATE_INIT_XATTRS;
+ if (tmpfile->f_flags & O_EXCL)
+ args.flags |= XFS_ICREATE_UNLINKABLE;
error = xfs_create_tmpfile(&args, &ip);
}
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
index 78f839630c624..9490b913a4ab4 100644
--- a/fs/xfs/xfs_qm.c
+++ b/fs/xfs/xfs_qm.c
@@ -795,6 +795,7 @@ xfs_qm_qino_alloc(
if (need_alloc) {
struct xfs_icreate_args args = {
.mode = S_IFREG,
+ .flags = XFS_ICREATE_UNLINKABLE,
};
xfs_ino_t ino;
diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
index 6ff736e5c4e7f..e471369f6b634 100644
--- a/fs/xfs/xfs_symlink.c
+++ b/fs/xfs/xfs_symlink.c
@@ -115,9 +115,6 @@ xfs_symlink(
if (xfs_is_shutdown(mp))
return -EIO;
- if (xfs_has_parent(mp))
- args.flags |= XFS_ICREATE_INIT_XATTRS;
-
/*
* Check component lengths of the target path name.
*/
next prev parent reply other threads:[~2024-06-20 23:02 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-20 22:50 [PATCHBOMB 6.11] xfs: inode cleanups for metadata directories Darrick J. Wong
2024-06-20 22:57 ` [PATCHSET v3.0 1/5] xfs: hoist inode operations to libxfs Darrick J. Wong
2024-06-20 22:58 ` [PATCH 01/24] xfs: use consistent uid/gid when grabbing dquots for inodes Darrick J. Wong
2024-06-21 4:37 ` Christoph Hellwig
2024-06-20 22:58 ` [PATCH 02/24] xfs: move inode copy-on-write predicates to xfs_inode.[ch] Darrick J. Wong
2024-06-21 4:37 ` Christoph Hellwig
2024-06-20 22:59 ` [PATCH 03/24] xfs: hoist extent size helpers to libxfs Darrick J. Wong
2024-06-21 4:37 ` Christoph Hellwig
2024-06-20 22:59 ` [PATCH 04/24] xfs: hoist inode flag conversion functions " Darrick J. Wong
2024-06-21 4:38 ` Christoph Hellwig
2024-06-20 22:59 ` [PATCH 05/24] xfs: hoist project id get/set " Darrick J. Wong
2024-06-21 4:38 ` Christoph Hellwig
2024-06-20 22:59 ` [PATCH 06/24] xfs: pack icreate initialization parameters into a separate structure Darrick J. Wong
2024-06-21 4:39 ` Christoph Hellwig
2024-06-20 23:00 ` [PATCH 07/24] xfs: implement atime updates in xfs_trans_ichgtime Darrick J. Wong
2024-06-21 4:39 ` Christoph Hellwig
2024-06-20 23:00 ` [PATCH 08/24] xfs: use xfs_trans_ichgtime to set times when allocating inode Darrick J. Wong
2024-06-21 4:39 ` Christoph Hellwig
2024-06-20 23:00 ` [PATCH 09/24] xfs: split new inode creation into two pieces Darrick J. Wong
2024-06-21 4:40 ` Christoph Hellwig
2024-06-20 23:01 ` [PATCH 10/24] xfs: hoist new inode initialization functions to libxfs Darrick J. Wong
2024-06-21 4:40 ` Christoph Hellwig
2024-06-20 23:01 ` [PATCH 11/24] xfs: push xfs_icreate_args creation out of xfs_create* Darrick J. Wong
2024-06-21 4:40 ` Christoph Hellwig
2024-06-20 23:01 ` [PATCH 12/24] xfs: wrap inode creation dqalloc calls Darrick J. Wong
2024-06-21 4:41 ` Christoph Hellwig
2024-06-20 23:01 ` [PATCH 13/24] xfs: hoist xfs_iunlink to libxfs Darrick J. Wong
2024-06-21 4:41 ` Christoph Hellwig
2024-06-20 23:02 ` [PATCH 14/24] xfs: hoist xfs_{bump,drop}link " Darrick J. Wong
2024-06-21 4:41 ` Christoph Hellwig
2024-06-20 23:02 ` Darrick J. Wong [this message]
2024-06-21 4:42 ` [PATCH 15/24] xfs: separate the icreate logic around INIT_XATTRS Christoph Hellwig
2024-06-20 23:02 ` [PATCH 16/24] xfs: create libxfs helper to link a new inode into a directory Darrick J. Wong
2024-06-21 4:42 ` Christoph Hellwig
2024-06-20 23:02 ` [PATCH 17/24] xfs: create libxfs helper to link an existing " Darrick J. Wong
2024-06-21 4:44 ` Christoph Hellwig
2024-06-20 23:03 ` [PATCH 18/24] xfs: hoist inode free function to libxfs Darrick J. Wong
2024-06-21 4:44 ` Christoph Hellwig
2024-06-20 23:03 ` [PATCH 19/24] xfs: create libxfs helper to remove an existing inode/name from a directory Darrick J. Wong
2024-06-21 4:44 ` Christoph Hellwig
2024-06-20 23:03 ` [PATCH 20/24] xfs: create libxfs helper to exchange two directory entries Darrick J. Wong
2024-06-21 4:45 ` Christoph Hellwig
2024-06-20 23:03 ` [PATCH 21/24] xfs: create libxfs helper to rename " Darrick J. Wong
2024-06-21 4:45 ` Christoph Hellwig
2024-06-20 23:04 ` [PATCH 22/24] xfs: move dirent update hooks to xfs_dir2.c Darrick J. Wong
2024-06-21 4:45 ` Christoph Hellwig
2024-06-20 23:04 ` [PATCH 23/24] xfs: get rid of trivial rename helpers Darrick J. Wong
2024-06-21 4:45 ` Christoph Hellwig
2024-06-20 23:04 ` [PATCH 24/24] xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb Darrick J. Wong
2024-06-21 4:46 ` Christoph Hellwig
2024-06-20 22:57 ` [PATCHSET v3.0 2/5] xfs: extent free log intent cleanups Darrick J. Wong
2024-06-20 23:04 ` [PATCH 1/9] xfs: clean up extent free log intent item tracepoint callsites Darrick J. Wong
2024-06-21 4:46 ` Christoph Hellwig
2024-06-20 23:05 ` [PATCH 2/9] xfs: convert "skip_discard" to a proper flags bitset Darrick J. Wong
2024-06-21 4:47 ` Christoph Hellwig
2024-06-20 23:05 ` [PATCH 3/9] xfs: pass the fsbno to xfs_perag_intent_get Darrick J. Wong
2024-06-20 23:05 ` [PATCH 4/9] xfs: add a xefi_entry helper Darrick J. Wong
2024-06-20 23:05 ` [PATCH 5/9] xfs: reuse xfs_extent_free_cancel_item Darrick J. Wong
2024-06-20 23:06 ` [PATCH 6/9] xfs: factor out a xfs_efd_add_extent helper Darrick J. Wong
2024-06-20 23:06 ` [PATCH 7/9] xfs: remove duplicate asserts in xfs_defer_extent_free Darrick J. Wong
2024-06-20 23:06 ` [PATCH 8/9] xfs: remove xfs_defer_agfl_block Darrick J. Wong
2024-07-03 8:07 ` kernel test robot
2024-06-20 23:07 ` [PATCH 9/9] xfs: move xfs_extent_free_defer_add to xfs_extfree_item.c Darrick J. Wong
2024-06-21 4:48 ` Christoph Hellwig
2024-06-20 22:57 ` [PATCHSET v3.0 3/5] xfs: rmap log intent cleanups Darrick J. Wong
2024-06-20 23:07 ` [PATCH 1/9] xfs: give rmap btree cursor error tracepoints their own class Darrick J. Wong
2024-06-21 4:48 ` Christoph Hellwig
2024-06-20 23:07 ` [PATCH 2/9] xfs: prepare rmap btree tracepoints for widening Darrick J. Wong
2024-06-21 4:49 ` Christoph Hellwig
2024-06-21 18:07 ` Darrick J. Wong
2024-06-20 23:07 ` [PATCH 3/9] xfs: clean up rmap log intent item tracepoint callsites Darrick J. Wong
2024-06-21 4:50 ` Christoph Hellwig
2024-06-20 23:08 ` [PATCH 4/9] xfs: remove xfs_trans_set_rmap_flags Darrick J. Wong
2024-06-21 4:50 ` Christoph Hellwig
2024-06-20 23:08 ` [PATCH 5/9] xfs: add a ri_entry helper Darrick J. Wong
2024-06-20 23:08 ` [PATCH 6/9] xfs: reuse xfs_rmap_update_cancel_item Darrick J. Wong
2024-06-20 23:08 ` [PATCH 7/9] xfs: don't bother calling xfs_rmap_finish_one_cleanup in xfs_rmap_finish_one Darrick J. Wong
2024-06-20 23:09 ` [PATCH 8/9] xfs: simplify usage of the rcur local variable " Darrick J. Wong
2024-06-20 23:09 ` [PATCH 9/9] xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c Darrick J. Wong
2024-06-21 4:51 ` Christoph Hellwig
2024-06-20 22:58 ` [PATCHSET v3.0 4/5] xfs: refcount log intent cleanups Darrick J. Wong
2024-06-20 23:09 ` [PATCH 01/10] xfs: give refcount btree cursor error tracepoints their own class Darrick J. Wong
2024-06-21 4:51 ` Christoph Hellwig
2024-06-20 23:09 ` [PATCH 02/10] xfs: create specialized classes for refcount tracepoints Darrick J. Wong
2024-06-21 4:51 ` Christoph Hellwig
2024-06-20 23:10 ` [PATCH 03/10] xfs: prepare refcount btree tracepoints for widening Darrick J. Wong
2024-06-21 4:52 ` Christoph Hellwig
2024-06-20 23:10 ` [PATCH 04/10] xfs: clean up refcount log intent item tracepoint callsites Darrick J. Wong
2024-06-21 4:52 ` Christoph Hellwig
2024-06-20 23:10 ` [PATCH 05/10] xfs: remove xfs_trans_set_refcount_flags Darrick J. Wong
2024-06-21 4:53 ` Christoph Hellwig
2024-06-20 23:10 ` [PATCH 06/10] xfs: add a ci_entry helper Darrick J. Wong
2024-06-21 4:53 ` Christoph Hellwig
2024-06-20 23:11 ` [PATCH 07/10] xfs: reuse xfs_refcount_update_cancel_item Darrick J. Wong
2024-06-21 4:54 ` Christoph Hellwig
2024-06-20 23:11 ` [PATCH 08/10] xfs: don't bother calling xfs_refcount_finish_one_cleanup in xfs_refcount_finish_one Darrick J. Wong
2024-06-21 4:54 ` Christoph Hellwig
2024-06-20 23:11 ` [PATCH 09/10] xfs: simplify usage of the rcur local variable " Darrick J. Wong
2024-06-21 4:54 ` Christoph Hellwig
2024-06-20 23:11 ` [PATCH 10/10] xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c Darrick J. Wong
2024-06-21 4:54 ` Christoph Hellwig
2024-06-20 22:58 ` [PATCHSET v3.0 5/5] xfs: enable FITRIM for the realtime section Darrick J. Wong
2024-06-20 23:12 ` [PATCH 1/1] xfs: enable FITRIM on the realtime device Darrick J. Wong
2024-06-21 5:00 ` Christoph Hellwig
2024-06-21 18:23 ` Darrick J. Wong
2024-06-24 15:04 ` [PATCH v2 " Darrick J. Wong
2024-06-24 15:12 ` Christoph Hellwig
2024-06-27 6:13 ` Chandan Babu R
2024-06-27 6:35 ` Christoph Hellwig
2024-06-27 6:38 ` Christoph Hellwig
2024-06-27 20:54 ` Darrick J. Wong
[not found] ` <2O52BJOH5Y79X.3A332GBFVJ9K7@gmail.com>
[not found] ` <20240723032327.GU1998502@frogsfrogsfrogs>
[not found] ` <2NTNQAOVQB88C.3NX279FOIEOI0@gmail.com>
[not found] ` <20240723232805.GX1998502@frogsfrogsfrogs>
[not found] ` <1YL3BJOD4E6EC.2JWNIADIUU7OD@gmail.com>
[not found] ` <20240724235707.GG1646003@frogsfrogsfrogs>
[not found] ` <3UKNEUV4T2OLQ.30FMK239EJTGG@gmail.com>
[not found] ` <20240806163246.GD623936@frogsfrogsfrogs>
[not found] ` <20240806230656.GD623922@frogsfrogsfrogs>
2024-08-19 16:01 ` [PATCH " Konst Mayer
2024-06-21 3:09 ` [PATCHSET v3.0 5/5] xfs: enable FITRIM for the realtime section Konst Mayer
2024-06-21 18:26 ` Darrick J. Wong
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=171892418155.3183075.2421928430504613482.stgit@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=hch@lst.de \
--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