From: Brian Foster <bfoster@redhat.com>
To: Christoph Hellwig <hch@lst.de>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 04/12] xfs: handle unallocated inodes in xfs_inode_from_disk
Date: Fri, 1 May 2020 09:34:44 -0400 [thread overview]
Message-ID: <20200501133444.GK40250@bfoster> (raw)
In-Reply-To: <20200501081424.2598914-5-hch@lst.de>
On Fri, May 01, 2020 at 10:14:16AM +0200, Christoph Hellwig wrote:
> Handle inodes with a 0 di_mode in xfs_inode_from_disk, instead of partially
> duplicating inode reading in xfs_iread.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/xfs/libxfs/xfs_inode_buf.c | 54 ++++++++++++-----------------------
> 1 file changed, 18 insertions(+), 36 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c
> index 983beb680e81a..b136f29f7d9d3 100644
> --- a/fs/xfs/libxfs/xfs_inode_buf.c
> +++ b/fs/xfs/libxfs/xfs_inode_buf.c
> @@ -198,6 +198,21 @@ xfs_inode_from_disk(
> ASSERT(ip->i_cowfp == NULL);
> ASSERT(ip->i_afp == NULL);
>
> + /*
> + * Get the truly permanent information first that is not overwritten by
> + * xfs_ialloc first. This also includes i_mode so that a newly read
> + * in inode structure for an allocation is marked as already free.
> + */
The first sentence has a wording issue and the second is kind of
confusing. I think this can be simplified and condensed further (see the
diff below for example). Otherwise looks good.
Brian
diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c
index b136f29f7d9d..ed02649138aa 100644
--- a/fs/xfs/libxfs/xfs_inode_buf.c
+++ b/fs/xfs/libxfs/xfs_inode_buf.c
@@ -199,17 +199,14 @@ xfs_inode_from_disk(
ASSERT(ip->i_afp == NULL);
/*
- * Get the truly permanent information first that is not overwritten by
- * xfs_ialloc first. This also includes i_mode so that a newly read
- * in inode structure for an allocation is marked as already free.
+ * First get the permanent information that is needed to allocate an
+ * inode. If the inode is unused, mode is zero and we shouldn't mess
+ * with the unitialized part of it.
*/
+ to->di_flushiter = be16_to_cpu(from->di_flushiter);
inode->i_generation = be32_to_cpu(from->di_gen);
inode->i_mode = be16_to_cpu(from->di_mode);
- to->di_flushiter = be16_to_cpu(from->di_flushiter);
- /*
- * Only copy the rest if the inode is actually allocated.
- */
if (!inode->i_mode)
return 0;
> + inode->i_generation = be32_to_cpu(from->di_gen);
> + inode->i_mode = be16_to_cpu(from->di_mode);
> + to->di_flushiter = be16_to_cpu(from->di_flushiter);
> +
> + /*
> + * Only copy the rest if the inode is actually allocated.
> + */
> + if (!inode->i_mode)
> + return 0;
> +
> /*
> * Convert v1 inodes immediately to v2 inode format as this is the
> * minimum inode version format we support in the rest of the code.
> @@ -215,7 +230,6 @@ xfs_inode_from_disk(
> to->di_format = from->di_format;
> i_uid_write(inode, be32_to_cpu(from->di_uid));
> i_gid_write(inode, be32_to_cpu(from->di_gid));
> - to->di_flushiter = be16_to_cpu(from->di_flushiter);
>
> /*
> * Time is signed, so need to convert to signed 32 bit before
> @@ -229,8 +243,6 @@ xfs_inode_from_disk(
> inode->i_mtime.tv_nsec = (int)be32_to_cpu(from->di_mtime.t_nsec);
> inode->i_ctime.tv_sec = (int)be32_to_cpu(from->di_ctime.t_sec);
> inode->i_ctime.tv_nsec = (int)be32_to_cpu(from->di_ctime.t_nsec);
> - inode->i_generation = be32_to_cpu(from->di_gen);
> - inode->i_mode = be16_to_cpu(from->di_mode);
>
> to->di_size = be64_to_cpu(from->di_size);
> to->di_nblocks = be64_to_cpu(from->di_nblocks);
> @@ -659,39 +671,9 @@ xfs_iread(
> goto out_brelse;
> }
>
> - /*
> - * If the on-disk inode is already linked to a directory
> - * entry, copy all of the inode into the in-core inode.
> - * xfs_iformat_fork() handles copying in the inode format
> - * specific information.
> - * Otherwise, just get the truly permanent information.
> - */
> - if (dip->di_mode) {
> - error = xfs_inode_from_disk(ip, dip);
> - if (error) {
> -#ifdef DEBUG
> - xfs_alert(mp, "%s: xfs_iformat() returned error %d",
> - __func__, error);
> -#endif /* DEBUG */
> - goto out_brelse;
> - }
> - } else {
> - /*
> - * Partial initialisation of the in-core inode. Just the bits
> - * that xfs_ialloc won't overwrite or relies on being correct.
> - */
> - VFS_I(ip)->i_generation = be32_to_cpu(dip->di_gen);
> - ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter);
> -
> - /*
> - * Make sure to pull in the mode here as well in
> - * case the inode is released without being used.
> - * This ensures that xfs_inactive() will see that
> - * the inode is already free and not try to mess
> - * with the uninitialized part of it.
> - */
> - VFS_I(ip)->i_mode = 0;
> - }
> + error = xfs_inode_from_disk(ip, dip);
> + if (error)
> + goto out_brelse;
>
> ip->i_delayed_blks = 0;
>
> --
> 2.26.2
>
next prev parent reply other threads:[~2020-05-01 13:54 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-01 8:14 dinode reading cleanups Christoph Hellwig
2020-05-01 8:14 ` [PATCH 01/12] xfs: xfs_bmapi_read doesn't take a fork id as the last argument Christoph Hellwig
2020-05-01 13:33 ` Brian Foster
2020-05-01 8:14 ` [PATCH 02/12] xfs: call xfs_iformat_fork from xfs_inode_from_disk Christoph Hellwig
2020-05-01 13:33 ` Brian Foster
2020-05-01 8:14 ` [PATCH 03/12] xfs: split xfs_iformat_fork Christoph Hellwig
2020-05-01 13:34 ` Brian Foster
2020-05-07 12:27 ` Christoph Hellwig
2020-05-07 13:40 ` Brian Foster
2020-05-07 13:42 ` Christoph Hellwig
2020-05-01 8:14 ` [PATCH 04/12] xfs: handle unallocated inodes in xfs_inode_from_disk Christoph Hellwig
2020-05-01 13:34 ` Brian Foster [this message]
2020-05-01 8:14 ` [PATCH 05/12] xfs: call xfs_dinode_verify from xfs_inode_from_disk Christoph Hellwig
2020-05-01 13:34 ` Brian Foster
2020-05-01 8:14 ` [PATCH 06/12] xfs: don't reset i_delayed_blks in xfs_iread Christoph Hellwig
2020-05-01 13:34 ` Brian Foster
2020-05-01 8:14 ` [PATCH 07/12] xfs: remove xfs_iread Christoph Hellwig
2020-05-01 15:56 ` Brian Foster
2020-05-01 8:14 ` [PATCH 08/12] xfs: remove xfs_ifork_ops Christoph Hellwig
2020-05-01 15:56 ` Brian Foster
2020-05-01 16:08 ` Darrick J. Wong
2020-05-01 16:38 ` Christoph Hellwig
2020-05-01 16:50 ` Christoph Hellwig
2020-05-01 18:23 ` Brian Foster
2020-05-07 12:34 ` Christoph Hellwig
2020-05-07 13:43 ` Brian Foster
2020-05-07 16:28 ` Brian Foster
2020-05-07 17:18 ` Christoph Hellwig
2020-05-12 23:50 ` Darrick J. Wong
2020-05-01 8:14 ` [PATCH 09/12] xfs: refactor xfs_inode_verify_forks Christoph Hellwig
2020-05-01 15:57 ` Brian Foster
2020-05-01 16:40 ` Christoph Hellwig
2020-05-01 17:02 ` Brian Foster
2020-05-01 17:08 ` Christoph Hellwig
2020-05-01 8:14 ` [PATCH 10/12] xfs: improve local fork verification Christoph Hellwig
2020-05-01 8:14 ` [PATCH 11/12] xfs: remove the special COW fork handling in xfs_bmapi_read Christoph Hellwig
2020-05-01 15:57 ` Brian Foster
2020-05-01 8:14 ` [PATCH 12/12] xfs: remove the NULL " Christoph Hellwig
2020-05-01 15:58 ` Brian Foster
-- strict thread matches above, loose matches on Subject: below --
2020-05-08 6:34 dinode reading cleanups v2 Christoph Hellwig
2020-05-08 6:34 ` [PATCH 04/12] xfs: handle unallocated inodes in xfs_inode_from_disk Christoph Hellwig
2020-05-08 15:05 ` Brian Foster
2020-05-16 17:38 ` 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=20200501133444.GK40250@bfoster \
--to=bfoster@redhat.com \
--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