All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 21/30] xfs: scrub inodes
Date: Mon, 16 Oct 2017 14:16:47 +1100	[thread overview]
Message-ID: <20171016031647.GX3666@dastard> (raw)
In-Reply-To: <20171012223250.GN7122@magnolia>

On Thu, Oct 12, 2017 at 03:32:50PM -0700, Darrick J. Wong wrote:
> On Wed, Oct 11, 2017 at 06:43:00PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Scrub the fields within an inode.

.....

> > +
> > +/*
> > + * Given an inode and the scrub control structure, grab either the
> > + * inode referenced in the control structure or the inode passed in.
> > + * The inode is not locked.
> > + */
> > +int
> > +xfs_scrub_get_inode(
> > +	struct xfs_scrub_context	*sc,
> > +	struct xfs_inode		*ip_in)
> > +{
> > +	struct xfs_mount		*mp = sc->mp;
> > +	struct xfs_inode		*ip = NULL;
> > +	int				error;
> > +
> > +	/*
> > +	 * If userspace passed us an AG number or a generation number
> > +	 * without an inode number, they haven't got a clue so bail out
> > +	 * immediately.
> > +	 */
> > +	if (sc->sm->sm_agno || (sc->sm->sm_gen && !sc->sm->sm_ino))
> > +		return -EINVAL;
> > +
> > +	/* We want to scan the inode we already had opened. */
> > +	if (sc->sm->sm_ino == 0 || sc->sm->sm_ino == ip_in->i_ino) {
> > +		sc->ip = ip_in;
> > +		return 0;
> > +	}
> > +
> > +	/* Look up the inode, see if the generation number matches. */
> > +	if (xfs_internal_inum(mp, sc->sm->sm_ino))
> > +		return -ENOENT;
> > +	error = xfs_iget(mp, NULL, sc->sm->sm_ino,
> > +			XFS_IGET_UNTRUSTED | XFS_IGET_DONTCACHE, 0, &ip);
> > +	if (error == -ENOENT || error == -EINVAL) {
> > +		/* inode doesn't exist... */
> > +		return -ENOENT;
> > +	} else if (error) {
> > +		trace_xfs_scrub_op_error(sc,
> > +				XFS_INO_TO_AGNO(mp, sc->sm->sm_ino),
> > +				XFS_INO_TO_AGBNO(mp, sc->sm->sm_ino),
> > +				error, __return_address);
> > +		return error;
> > +	}
> > +	if (VFS_I(ip)->i_generation != sc->sm->sm_gen) {
> > +		iput(VFS_I(ip));
> > +		return -ENOENT;
> > +	}
> > +
> > +	sc->ip = ip;
> > +	return 0;
> > +}

Much nicer with the way everything is clearly spelled out :P

> > +/* Inode core */
> > +
> > +/*
> > + * di_extsize hint validation is somewhat cumbersome. Rules are:
> > + *
> > + * 1. extent size hint is only valid for directories and regular files
> > + * 2. DIFLAG_EXTSIZE is only valid for regular files
> > + * 3. DIFLAG_EXTSZINHERIT is only valid for directories.
> > + * 4. extsize hint of 0 turns off hints, clears inode flags.
> > + * 5. either flag must be set if extsize != 0
> > + * 6. Extent size must be a multiple of the appropriate block size.
> > + * 7. extent size hint cannot be longer than maximum extent length
> > + * 8. for non-realtime files, the extent size hint must be limited
> > + *    to half the AG size to avoid alignment extending the extent
> > + *    beyond the limits of the AG.
> > + */
> > +STATIC void
> > +xfs_scrub_inode_extsize(
> > +	struct xfs_scrub_context	*sc,
> > +	struct xfs_buf			*bp,
> > +	struct xfs_dinode		*dip,
> > +	xfs_ino_t			ino,
> > +	uint16_t			mode,
> > +	uint16_t			flags)
> > +{
> > +	struct xfs_mount		*mp = sc->mp;
> > +	bool				rt_flag;
> > +	bool				hint_flag;
> > +	bool				inherit_flag;
> > +	uint32_t			extsize;
> > +	uint32_t			extsize_bytes;
> > +	uint32_t			blocksize_bytes;
> > +
> > +	rt_flag = (flags & XFS_DIFLAG_REALTIME);
> > +	hint_flag = (flags & XFS_DIFLAG_EXTSIZE);
> > +	inherit_flag = (flags & XFS_DIFLAG_EXTSZINHERIT);
> > +	extsize = be32_to_cpu(dip->di_extsize);
> > +	extsize_bytes = XFS_FSB_TO_B(sc->mp, extsize);
> > +
> > +	if (rt_flag)
> > +		blocksize_bytes = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog;
> > +	else
> > +		blocksize_bytes = mp->m_sb.sb_blocksize;
> > +
> > +	if ((hint_flag || inherit_flag) && (!S_ISDIR(mode) && !S_ISREG(mode)))

Logic is a correct but reads funny:

	if ((hint_flag || inherit_flag) &&
	    !(S_ISREG(mode) || S_ISDIR(mode)))

> > +/*
> > + * di_cowextsize hint validation is somewhat cumbersome. Rules are:
> > + *
> > + * 1. flag requires reflink feature
> > + * 2. cow extent size hint is only valid for directories and regular files
> > + * 3. cow extsize hint of 0 turns off hints, clears inode flags.
> > + * 4. either flag must be set if cow extsize != 0
> > + * 5. flag cannot be set for rt files
> > + * 6. Extent size must be a multiple of the appropriate block size.
> > + * 7. extent size hint cannot be longer than maximum extent length
> > + * 8. the extent size hint must be limited
> > + *    to half the AG size to avoid alignment extending the extent
> > + *    beyond the limits of the AG.
> > + */

Perhaps this comment doesn't need duplicating for a 3rd time. Maybe
for both di_extsize and di_cowextsize just say:

/*
 * Extent size hints have explicit rules. They are documented at
 * xfs_ioctl_setattr_check_extsize() - these functions need to be
 * kept in sync with each other.
 */

> > +STATIC void
> > +xfs_scrub_inode_cowextsize(
> > +	struct xfs_scrub_context	*sc,
> > +	struct xfs_buf			*bp,
> > +	struct xfs_dinode		*dip,
> > +	xfs_ino_t			ino,
> > +	uint16_t			mode,
> > +	uint16_t			flags,
> > +	uint64_t			flags2)
> > +{
> > +	struct xfs_mount		*mp = sc->mp;
> > +	bool				rt_flag;
> > +	bool				hint_flag;
> > +	uint32_t			extsize;
> > +	uint32_t			extsize_bytes;
> > +
> > +	rt_flag = (flags & XFS_DIFLAG_REALTIME);
> > +	hint_flag = (flags2 & XFS_DIFLAG2_COWEXTSIZE);
> > +	extsize = be32_to_cpu(dip->di_extsize);
> 
> Doh, this ought to be extsize = be32_to_cpu(dip->di_cowextsize); will fix.

Yup, with that fix in place all the spurious inode warnings I was
getting went away.

> > +/* Map and read a raw inode. */
> > +STATIC int
> > +xfs_scrub_inode_map_raw(
> > +	struct xfs_scrub_context	*sc,
> > +	xfs_ino_t			ino,
> > +	struct xfs_buf			**bpp,
> > +	struct xfs_dinode		**dipp)
> > +{
> > +	struct xfs_imap			imap;
> > +	struct xfs_mount		*mp = sc->mp;
> > +	struct xfs_buf			*bp;
> > +	struct xfs_dinode		*dip;
> > +	int				error;
> > +
> > +	error = xfs_imap(mp, sc->tp, ino, &imap, XFS_IGET_UNTRUSTED);
> > +	if (error == -EINVAL) {
> > +		/*
> > +		 * Inode could have gotten deleted out from under us;
> > +		 * just forget about it.
> > +		 */
> > +		error = -ENOENT;
> > +		goto out;
> > +	}
> > +	if (!xfs_scrub_process_error(sc, XFS_INO_TO_AGNO(mp, ino),
> > +			XFS_INO_TO_AGBNO(mp, ino), &error))
> > +		goto out;
> > +
> > +	error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp,
> > +			imap.im_blkno, imap.im_len, XBF_UNMAPPED, &bp,
> > +			NULL);
> > +	if (!xfs_scrub_process_error(sc, XFS_INO_TO_AGNO(mp, ino),
> > +			XFS_INO_TO_AGBNO(mp, ino), &error))
> > +		goto out;
> > +
> > +	/* Is this really an inode? */
> > +	bp->b_ops = &xfs_inode_buf_ops;

A comment here on why we skip the read verifier when pulling in the
inode buffer would be nice.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2017-10-16  3:16 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-12  1:40 [PATCH v12 00/30] xfs: online scrub support Darrick J. Wong
2017-10-12  1:40 ` [PATCH 01/30] xfs: return a distinct error code value for IGET_INCORE cache misses Darrick J. Wong
2017-10-12  5:25   ` Dave Chinner
2017-10-12  1:40 ` [PATCH 02/30] xfs: create block pointer check functions Darrick J. Wong
2017-10-12  5:28   ` Dave Chinner
2017-10-12  5:48     ` Dave Chinner
2017-10-16 19:46       ` Darrick J. Wong
2017-10-12  1:41 ` [PATCH 03/30] xfs: refactor btree pointer checks Darrick J. Wong
2017-10-12  5:51   ` Dave Chinner
2017-10-12  1:41 ` [PATCH 04/30] xfs: refactor btree block header checking functions Darrick J. Wong
2017-10-13  1:01   ` Dave Chinner
2017-10-13 21:15     ` Darrick J. Wong
2017-10-16 19:48   ` [PATCH v2 " Darrick J. Wong
2017-10-16 23:36     ` Dave Chinner
2017-10-12  1:41 ` [PATCH 05/30] xfs: create inode pointer verifiers Darrick J. Wong
2017-10-12 20:23   ` Darrick J. Wong
2017-10-13  5:22     ` Dave Chinner
2017-10-13 16:16       ` Darrick J. Wong
2017-10-16 19:49   ` [PATCH v2 " Darrick J. Wong
2017-10-16 23:53     ` Dave Chinner
2017-10-12  1:41 ` [PATCH 06/30] xfs: create an ioctl to scrub AG metadata Darrick J. Wong
2017-10-16  0:08   ` Dave Chinner
2017-10-12  1:41 ` [PATCH 07/30] xfs: dispatch metadata scrub subcommands Darrick J. Wong
2017-10-16  0:26   ` Dave Chinner
2017-10-12  1:41 ` [PATCH 08/30] xfs: probe the scrub ioctl Darrick J. Wong
2017-10-16  0:39   ` Dave Chinner
2017-10-16 19:54     ` Darrick J. Wong
2017-10-16 23:05       ` Dave Chinner
2017-10-12  1:41 ` [PATCH 09/30] xfs: create helpers to record and deal with scrub problems Darrick J. Wong
2017-10-16  0:40   ` Dave Chinner
2017-10-12  1:41 ` [PATCH 10/30] xfs: create helpers to scrub a metadata btree Darrick J. Wong
2017-10-16  0:56   ` Dave Chinner
2017-10-12  1:41 ` [PATCH 11/30] xfs: scrub the shape of " Darrick J. Wong
2017-10-16  1:29   ` Dave Chinner
2017-10-16 20:09     ` Darrick J. Wong
2017-10-12  1:42 ` [PATCH 12/30] xfs: scrub btree keys and records Darrick J. Wong
2017-10-16  1:31   ` Dave Chinner
2017-10-12  1:42 ` [PATCH 13/30] xfs: create helpers to scan an allocation group Darrick J. Wong
2017-10-16  1:32   ` Dave Chinner
2017-10-12  1:42 ` [PATCH 14/30] xfs: scrub the secondary superblocks Darrick J. Wong
2017-10-16  5:16   ` Dave Chinner
2017-10-20 23:34     ` Darrick J. Wong
2017-10-12  1:42 ` [PATCH 15/30] xfs: scrub AGF and AGFL Darrick J. Wong
2017-10-16  2:18   ` Dave Chinner
2017-10-12  1:42 ` [PATCH 16/30] xfs: scrub the AGI Darrick J. Wong
2017-10-16  2:19   ` Dave Chinner
2017-10-12  1:42 ` [PATCH 17/30] xfs: scrub free space btrees Darrick J. Wong
2017-10-16  2:25   ` Dave Chinner
2017-10-16 20:36     ` Darrick J. Wong
2017-10-12  1:42 ` [PATCH 18/30] xfs: scrub inode btrees Darrick J. Wong
2017-10-16  2:55   ` Dave Chinner
2017-10-16 22:16     ` Darrick J. Wong
2017-10-17  0:11   ` [PATCH v2 " Darrick J. Wong
2017-10-17 21:59     ` Dave Chinner
2017-10-12  1:42 ` [PATCH 19/30] xfs: scrub rmap btrees Darrick J. Wong
2017-10-16  3:01   ` Dave Chinner
2017-10-12  1:42 ` [PATCH 20/30] xfs: scrub refcount btrees Darrick J. Wong
2017-10-16  3:02   ` Dave Chinner
2017-10-12  1:43 ` [PATCH 21/30] xfs: scrub inodes Darrick J. Wong
2017-10-12 22:32   ` Darrick J. Wong
2017-10-16  3:16     ` Dave Chinner [this message]
2017-10-16 22:08       ` Darrick J. Wong
2017-10-17  0:13   ` [PATCH v2 " Darrick J. Wong
2017-10-17 22:01     ` Dave Chinner
2017-10-12  1:43 ` [PATCH 22/30] xfs: scrub inode block mappings Darrick J. Wong
2017-10-16  3:26   ` Dave Chinner
2017-10-16 20:43     ` Darrick J. Wong
2017-10-12  1:43 ` [PATCH 23/30] xfs: scrub directory/attribute btrees Darrick J. Wong
2017-10-16  4:13   ` Dave Chinner
2017-10-12  1:43 ` [PATCH 24/30] xfs: scrub directory metadata Darrick J. Wong
2017-10-16  4:29   ` Dave Chinner
2017-10-16 20:46     ` Darrick J. Wong
2017-10-17  0:14   ` [PATCH v2 " Darrick J. Wong
2017-10-17 22:06     ` Dave Chinner
2017-10-12  1:43 ` [PATCH 25/30] xfs: scrub directory freespace Darrick J. Wong
2017-10-16  4:49   ` Dave Chinner
2017-10-16 22:37     ` Darrick J. Wong
2017-10-16 23:11       ` Darrick J. Wong
2017-10-16 23:14       ` Dave Chinner
2017-10-16 23:38         ` Darrick J. Wong
2017-10-17  1:10   ` [PATCH v2 " Darrick J. Wong
2017-10-17 22:08     ` Dave Chinner
2017-10-17 23:51       ` Darrick J. Wong
2017-10-12  1:43 ` [PATCH 26/30] xfs: scrub extended attributes Darrick J. Wong
2017-10-16  4:50   ` Dave Chinner
2017-10-12  1:43 ` [PATCH 27/30] xfs: scrub symbolic links Darrick J. Wong
2017-10-16  4:52   ` Dave Chinner
2017-10-12  1:43 ` [PATCH 28/30] xfs: scrub directory parent pointers Darrick J. Wong
2017-10-16  5:09   ` Dave Chinner
2017-10-16 21:46     ` Darrick J. Wong
2017-10-16 23:30       ` Dave Chinner
2017-10-16 23:58         ` Darrick J. Wong
2017-10-17  0:16   ` [PATCH v2 " Darrick J. Wong
2017-10-17 22:11     ` Dave Chinner
2017-10-12  1:43 ` [PATCH 29/30] xfs: scrub realtime bitmap/summary Darrick J. Wong
2017-10-16  5:11   ` Dave Chinner
2017-10-12  1:44 ` [PATCH 30/30] xfs: scrub quota information Darrick J. Wong
2017-10-16  5:12   ` Dave Chinner
2017-10-17  1:11     ` 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=20171016031647.GX3666@dastard \
    --to=david@fromorbit.com \
    --cc=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 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.