linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: linux-xfs@vger.kernel.org
Subject: [PATCH v2 1/7] xfs: fix toctou race when locking an inode to access the data map
Date: Tue, 31 Jan 2017 18:34:54 -0800	[thread overview]
Message-ID: <20170201023454.GK9134@birch.djwong.org> (raw)
In-Reply-To: <148582219035.12293.12084220786527965512.stgit@birch.djwong.org>

We use di_format and if_flags to decide whether we're grabbing the ilock
in btree mode (btree extents not loaded) or shared mode (anything else),
but the state of those fields can be changed by other threads that are
also trying to load the btree extents -- IFEXTENTS gets set before the
_bmap_read_extents call and cleared if it fails.

We don't actually need to have IFEXTENTS set until after the bmbt
records are successfully loaded and validated, which will fix the race
between multiple threads trying to read the same directory.  The next
patch strengthens directory bmbt validation by refusing to open the
directory if reading the bmbt to start directory readahead fails.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/libxfs/xfs_inode_fork.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c
index 222e103..421341f 100644
--- a/fs/xfs/libxfs/xfs_inode_fork.c
+++ b/fs/xfs/libxfs/xfs_inode_fork.c
@@ -497,15 +497,14 @@ xfs_iread_extents(
 	 * We know that the size is valid (it's checked in iformat_btree)
 	 */
 	ifp->if_bytes = ifp->if_real_bytes = 0;
-	ifp->if_flags |= XFS_IFEXTENTS;
 	xfs_iext_add(ifp, 0, nextents);
 	error = xfs_bmap_read_extents(tp, ip, whichfork);
 	if (error) {
 		xfs_iext_destroy(ifp);
-		ifp->if_flags &= ~XFS_IFEXTENTS;
 		return error;
 	}
 	xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip));
+	ifp->if_flags |= XFS_IFEXTENTS;
 	return 0;
 }
 /*

  parent reply	other threads:[~2017-02-01  2:35 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-31  0:23 [PATCH 0/7] xfs: random fixes Darrick J. Wong
2017-01-31  0:23 ` [PATCH 1/7] xfs: fix toctou race when locking an inode to access the data map Darrick J. Wong
2017-01-31  3:01   ` Eric Sandeen
2017-01-31 13:26   ` Christoph Hellwig
2017-01-31 19:45     ` Darrick J. Wong
2017-01-31 21:40       ` Darrick J. Wong
2017-02-01  2:34   ` Darrick J. Wong [this message]
2017-02-01 14:48     ` [PATCH v2 " Christoph Hellwig
2017-01-31  0:23 ` [PATCH 2/7] xfs: fail _dir_open when readahead fails Darrick J. Wong
2017-01-31  4:12   ` Eric Sandeen
2017-01-31 13:29   ` Christoph Hellwig
2017-01-31  0:23 ` [PATCH 3/7] xfs: filter out obviously bad btree pointers Darrick J. Wong
2017-01-31  4:39   ` Eric Sandeen
2017-01-31 20:09     ` Darrick J. Wong
2017-01-31 20:37       ` Eric Sandeen
2017-01-31  0:23 ` [PATCH 4/7] xfs: check for obviously bad level values in the bmbt root Darrick J. Wong
2017-01-31 13:31   ` Christoph Hellwig
2017-01-31  0:23 ` [PATCH 5/7] xfs: verify free block header fields Darrick J. Wong
2017-01-31 13:42   ` Christoph Hellwig
2017-01-31  0:23 ` [PATCH 6/7] xfs: allow unwritten extents in the CoW fork Darrick J. Wong
2017-02-01  2:35   ` [PATCH v2 " Darrick J. Wong
2017-02-01 18:06     ` Christoph Hellwig
2017-01-31  0:23 ` [PATCH 7/7] xfs: mark speculative prealloc CoW fork extents unwritten Darrick J. Wong
2017-01-31 13:41   ` Christoph Hellwig
2017-01-31 19:11     ` Darrick J. Wong
2017-02-01  1:28       ` Darrick J. Wong
2017-02-01  2:36   ` [PATCH v2 " Darrick J. Wong
2017-02-01 18:36     ` Christoph Hellwig
2017-02-02 15:04     ` Brian Foster
2017-02-02 17:04       ` Darrick J. Wong
2017-02-02 19:42         ` Brian Foster

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=20170201023454.GK9134@birch.djwong.org \
    --to=darrick.wong@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).