All of lore.kernel.org
 help / color / mirror / Atom feed
From: Allison Henderson <allison.henderson@oracle.com>
To: linux-xfs@vger.kernel.org
Subject: [PATCH v16 02/28] xfsprogs: Add helper for checking per-inode extent count overflow
Date: Thu, 25 Mar 2021 17:31:05 -0700	[thread overview]
Message-ID: <20210326003131.32642-3-allison.henderson@oracle.com> (raw)
In-Reply-To: <20210326003131.32642-1-allison.henderson@oracle.com>

From: Chandan Babu R <chandanrlinux@gmail.com>

Source kernel commit: b9b7e1dc56c5ca8d6fc37c410b054e9f26737d2e

XFS does not check for possible overflow of per-inode extent counter
fields when adding extents to either data or attr fork.

For e.g.
1. Insert 5 million xattrs (each having a value size of 255 bytes) and
then delete 50% of them in an alternating manner.

2. On a 4k block sized XFS filesystem instance, the above causes 98511
extents to be created in the attr fork of the inode.

xfsaild/loop0  2008 [003]  1475.127209: probe:xfs_inode_to_disk: (ffffffffa43fb6b0) if_nextents=98511 i_ino=131

3. The incore inode fork extent counter is a signed 32-bit
quantity. However the on-disk extent counter is an unsigned 16-bit
quantity and hence cannot hold 98511 extents.

4. The following incorrect value is stored in the attr extent counter,
core.naextents = -32561

This commit adds a new helper function (i.e.
xfs_iext_count_may_overflow()) to check for overflow of the per-inode
data and xattr extent counters. Future patches will use this function to
make sure that an FS operation won't cause the extent counter to
overflow.

Suggested-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
---
 libxfs/xfs_inode_fork.c | 23 +++++++++++++++++++++++
 libxfs/xfs_inode_fork.h |  2 ++
 2 files changed, 25 insertions(+)

diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c
index 0b1af501..83866cd 100644
--- a/libxfs/xfs_inode_fork.c
+++ b/libxfs/xfs_inode_fork.c
@@ -21,6 +21,7 @@
 #include "xfs_da_btree.h"
 #include "xfs_dir2_priv.h"
 #include "xfs_attr_leaf.h"
+#include "xfs_types.h"
 
 kmem_zone_t *xfs_ifork_zone;
 
@@ -726,3 +727,25 @@ xfs_ifork_verify_local_attr(
 
 	return 0;
 }
+
+int
+xfs_iext_count_may_overflow(
+	struct xfs_inode	*ip,
+	int			whichfork,
+	int			nr_to_add)
+{
+	struct xfs_ifork	*ifp = XFS_IFORK_PTR(ip, whichfork);
+	uint64_t		max_exts;
+	uint64_t		nr_exts;
+
+	if (whichfork == XFS_COW_FORK)
+		return 0;
+
+	max_exts = (whichfork == XFS_ATTR_FORK) ? MAXAEXTNUM : MAXEXTNUM;
+
+	nr_exts = ifp->if_nextents + nr_to_add;
+	if (nr_exts < ifp->if_nextents || nr_exts > max_exts)
+		return -EFBIG;
+
+	return 0;
+}
diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h
index a4953e9..0beb8e2 100644
--- a/libxfs/xfs_inode_fork.h
+++ b/libxfs/xfs_inode_fork.h
@@ -172,5 +172,7 @@ extern void xfs_ifork_init_cow(struct xfs_inode *ip);
 
 int xfs_ifork_verify_local_data(struct xfs_inode *ip);
 int xfs_ifork_verify_local_attr(struct xfs_inode *ip);
+int xfs_iext_count_may_overflow(struct xfs_inode *ip, int whichfork,
+		int nr_to_add);
 
 #endif	/* __XFS_INODE_FORK_H__ */
-- 
2.7.4


  parent reply	other threads:[~2021-03-26  0:32 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-26  0:31 [PATCH v16 00/28] xfsprogs: Delay Ready Attributes Allison Henderson
2021-03-26  0:31 ` [PATCH v16 01/28] xfsprogs: fix an ABBA deadlock in xfs_rename Allison Henderson
2021-03-26  0:31 ` Allison Henderson [this message]
2021-03-26  0:31 ` [PATCH v16 03/28] xfsprogs: Check for extent overflow when trivally adding a new extent Allison Henderson
2021-03-26  0:31 ` [PATCH v16 04/28] xfsprogs: Check for extent overflow when punching a hole Allison Henderson
2021-03-26  0:31 ` [PATCH v16 05/28] xfsprogs: Check for extent overflow when adding dir entries Allison Henderson
2021-03-26  0:31 ` [PATCH v16 06/28] xfsprogs: Check for extent overflow when removing " Allison Henderson
2021-03-26  0:31 ` [PATCH v16 07/28] xfsprogs: Check for extent overflow when renaming " Allison Henderson
2021-03-26  0:31 ` [PATCH v16 08/28] xfsprogs: Check for extent overflow when adding/removing xattrs Allison Henderson
2021-03-26  0:31 ` [PATCH v16 09/28] xfsprogs: Check for extent overflow when writing to unwritten extent Allison Henderson
2021-03-26  0:31 ` [PATCH v16 10/28] xfsprogs: Check for extent overflow when moving extent from cow to data fork Allison Henderson
2021-03-26  0:31 ` [PATCH v16 11/28] xfsprogs: Check for extent overflow when swapping extents Allison Henderson
2021-03-26  0:31 ` [PATCH v16 12/28] xfsprogs: Introduce error injection to reduce maximum inode fork extent count Allison Henderson
2021-03-26  0:31 ` [PATCH v16 13/28] xfsprogs: Remove duplicate assert statement in xfs_bmap_btalloc() Allison Henderson
2021-03-26  0:31 ` [PATCH v16 14/28] xfsprogs: Compute bmap extent alignments in a separate function Allison Henderson
2021-03-26  0:31 ` [PATCH v16 15/28] xfsprogs: Process allocated extent " Allison Henderson
2021-03-26  0:31 ` [PATCH v16 16/28] xfsprogs: Introduce error injection to allocate only minlen size extents for files Allison Henderson
2021-03-26  0:31 ` [PATCH v16 17/28] libxfs: expose inobtcount in xfs geometry Allison Henderson
2021-03-26  0:31 ` [PATCH v16 18/28] xfsprogs: Reverse apply 72b97ea40d Allison Henderson
2021-03-26  0:31 ` [PATCH v16 19/28] xfsprogs: Add xfs_attr_node_remove_cleanup Allison Henderson
2021-03-26  0:31 ` [PATCH v16 20/28] xfsprogs: Hoist xfs_attr_set_shortform Allison Henderson
2021-03-26  0:31 ` [PATCH v16 21/28] xfsprogs: Add helper xfs_attr_set_fmt Allison Henderson
2021-03-26  0:31 ` [PATCH v16 22/28] xfsprogs: Separate xfs_attr_node_addname and xfs_attr_node_addname_clear_incomplete Allison Henderson
2021-03-26  0:31 ` [PATCH v16 23/28] xfsprogs: Add helper xfs_attr_node_addname_find_attr Allison Henderson
2021-03-26  0:31 ` [PATCH v16 24/28] xfsprogs: Hoist xfs_attr_node_addname Allison Henderson
2021-03-26  0:31 ` [PATCH v16 25/28] xfsprogs: Hoist xfs_attr_leaf_addname Allison Henderson
2021-03-26  0:31 ` [PATCH v16 26/28] xfsprogs: Hoist node transaction handling Allison Henderson
2021-03-26  0:31 ` [PATCH v16 27/28] xfsprogs: Add delay ready attr remove routines Allison Henderson
2021-03-26  0:31 ` [PATCH v16 28/28] xfsprogs: Add delay ready attr set routines 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=20210326003131.32642-3-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.