[1/3] xfs_db: stop misusing an onstack inode
diff mbox series

Message ID 159476320311.3156851.15212854498898688157.stgit@magnolia
State Accepted
Headers show
Series
  • xfs: preparation for syncing with 5.8
Related show

Commit Message

Darrick J. Wong July 14, 2020, 9:46 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

The onstack inode in xfs_check's process_inode is a potential landmine
since it's not a /real/ incore inode.  The upcoming 5.8 merge will make
this messier wrt inode forks, so just remove the onstack inode and
reference the ondisk fields directly.  This also reduces the amount of
thinking that I have to do w.r.t. future libxfs porting efforts.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/check.c |  100 ++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 56 insertions(+), 44 deletions(-)

Comments

Christoph Hellwig July 15, 2020, 6:38 p.m. UTC | #1
On Tue, Jul 14, 2020 at 02:46:43PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> The onstack inode in xfs_check's process_inode is a potential landmine
> since it's not a /real/ incore inode.  The upcoming 5.8 merge will make
> this messier wrt inode forks, so just remove the onstack inode and
> reference the ondisk fields directly.  This also reduces the amount of
> thinking that I have to do w.r.t. future libxfs porting efforts.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Comparing this to my version here:

http://git.infradead.org/users/hch/xfsprogs.git/commitdiff/791d7d324290dbb83be7bf35fe15f9898f5df1c1

>  	mode_t			mode;
> +	uint16_t		diflags;
> +	uint64_t		diflags2 = 0;
> +	xfs_nlink_t		nlink;
> +	xfs_dqid_t		uid;
> +	xfs_dqid_t		gid;
> +	xfs_dqid_t		prid;

Not sure we really need the local variables, as they are mostly just
used once except for error messages..

> +	if (dip->di_version == 1) {
> +		nlink = be16_to_cpu(dip->di_onlink);
> +		prid = 0;
> +	} else {
> +		nlink = be32_to_cpu(dip->di_nlink);
> +		prid = (xfs_dqid_t)be16_to_cpu(dip->di_projid_hi) << 16 |
> +				   be16_to_cpu(dip->di_projid_lo);
> +	}

I mad the assumption that we don't support v1 inodes anymore, but
it appears we actually do.  So we might need to keep these two.

>  	if (isfree) {
> -		if (xino.i_d.di_nblocks != 0) {
> +		if (be64_to_cpu(dip->di_nblocks) != 0) {

No need to byte swap for a comparism with 0.

> -	if ((unsigned int)xino.i_d.di_aformat > XFS_DINODE_FMT_BTREE)  {
> +	if ((unsigned int)dip->di_aformat > XFS_DINODE_FMT_BTREE)  {

No need for the (pre-existing) cast here.

> +			fmtnames[(int)dip->di_aformat],

Same here.
Darrick J. Wong Aug. 10, 2020, 8 p.m. UTC | #2
On Wed, Jul 15, 2020 at 07:38:49PM +0100, Christoph Hellwig wrote:
> On Tue, Jul 14, 2020 at 02:46:43PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > The onstack inode in xfs_check's process_inode is a potential landmine
> > since it's not a /real/ incore inode.  The upcoming 5.8 merge will make
> > this messier wrt inode forks, so just remove the onstack inode and
> > reference the ondisk fields directly.  This also reduces the amount of
> > thinking that I have to do w.r.t. future libxfs porting efforts.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Comparing this to my version here:
> 
> http://git.infradead.org/users/hch/xfsprogs.git/commitdiff/791d7d324290dbb83be7bf35fe15f9898f5df1c1
> 
> >  	mode_t			mode;
> > +	uint16_t		diflags;
> > +	uint64_t		diflags2 = 0;

<shrug> I'd rather just leave these over cluttering up the function with
repeated flags/flags2 endian conversions.

> > +	xfs_nlink_t		nlink;

Actually, we do need this one for proper error reporting because we
still (sort of) have to have v1 disk format support.  For that matter,
the nlink checking further in that function looks totally wrong; it
should be using nlink and not accessing the raw field directly.

> > +	xfs_dqid_t		uid;
> > +	xfs_dqid_t		gid;
> > +	xfs_dqid_t		prid;

These actually are needed, because the quota_add function that uses them
requires pointers to xfs_dqid_t to do some hazy magic to skip quota
accounting if the pointer is null, which implies local variables since
the ondisk inode has be32 values...

That whole thing is messy (and gets worse with the project id) but I'd
rather not go rearchitecting more of db/check.c seeing as we can
probably just kill it after xfsprogs 5.8 releases.

> Not sure we really need the local variables, as they are mostly just
> used once except for error messages..
> 
> > +	if (dip->di_version == 1) {
> > +		nlink = be16_to_cpu(dip->di_onlink);
> > +		prid = 0;
> > +	} else {
> > +		nlink = be32_to_cpu(dip->di_nlink);
> > +		prid = (xfs_dqid_t)be16_to_cpu(dip->di_projid_hi) << 16 |
> > +				   be16_to_cpu(dip->di_projid_lo);
> > +	}
> 
> I mad the assumption that we don't support v1 inodes anymore, but
> it appears we actually do.  So we might need to keep these two.

<nod>

> >  	if (isfree) {
> > -		if (xino.i_d.di_nblocks != 0) {
> > +		if (be64_to_cpu(dip->di_nblocks) != 0) {
> 
> No need to byte swap for a comparism with 0.
> 
> > -	if ((unsigned int)xino.i_d.di_aformat > XFS_DINODE_FMT_BTREE)  {
> > +	if ((unsigned int)dip->di_aformat > XFS_DINODE_FMT_BTREE)  {
> 
> No need for the (pre-existing) cast here.
>
> > +			fmtnames[(int)dip->di_aformat],

Fixed all of these.

--D

> 
> Same here.
Eric Sandeen Aug. 10, 2020, 11:21 p.m. UTC | #3
On 7/14/20 2:46 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> The onstack inode in xfs_check's process_inode is a potential landmine
> since it's not a /real/ incore inode.  The upcoming 5.8 merge will make
> this messier wrt inode forks, so just remove the onstack inode and
> reference the ondisk fields directly.  This also reduces the amount of
> thinking that I have to do w.r.t. future libxfs porting efforts.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

I ended up merging & testing the original patch last week, and Darrick's
recent response indicates that likely only the cosmetic changes seemed
worth making; given that I've already run regression on this patch as is,
I'm going to go ahead & give it my rvb, and keep it merged.  We can clean
up the other stuff in another patch if needed.

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

> ---
>  db/check.c |  100 ++++++++++++++++++++++++++++++++++--------------------------
>  1 file changed, 56 insertions(+), 44 deletions(-)
> 
> 
> diff --git a/db/check.c b/db/check.c
> index 12c03b6d..96abea21 100644
> --- a/db/check.c
> +++ b/db/check.c
> @@ -2707,7 +2707,6 @@ process_inode(
>  {
>  	blkmap_t		*blkmap;
>  	xfs_fsblock_t		bno = 0;
> -	struct xfs_inode	xino;
>  	inodata_t		*id = NULL;
>  	xfs_ino_t		ino;
>  	xfs_extnum_t		nextents = 0;
> @@ -2724,6 +2723,12 @@ process_inode(
>  	xfs_qcnt_t		rc = 0;
>  	int			v = 0;
>  	mode_t			mode;
> +	uint16_t		diflags;
> +	uint64_t		diflags2 = 0;
> +	xfs_nlink_t		nlink;
> +	xfs_dqid_t		uid;
> +	xfs_dqid_t		gid;
> +	xfs_dqid_t		prid;
>  	static char		okfmts[] = {
>  		0,				/* type 0 unused */
>  		1 << XFS_DINODE_FMT_DEV,	/* FIFO */
> @@ -2750,10 +2755,6 @@ process_inode(
>  		"dev", "local", "extents", "btree", "uuid"
>  	};
>  
> -	/* xfs_inode_from_disk expects to have an mp to work with */
> -	xino.i_mount = mp;
> -	libxfs_inode_from_disk(&xino, dip);
> -
>  	ino = XFS_AGINO_TO_INO(mp, be32_to_cpu(agf->agf_seqno), agino);
>  	if (!isfree) {
>  		id = find_inode(ino, 1);
> @@ -2775,12 +2776,25 @@ process_inode(
>  		error++;
>  		return;
>  	}
> +	if (dip->di_version == 1) {
> +		nlink = be16_to_cpu(dip->di_onlink);
> +		prid = 0;
> +	} else {
> +		nlink = be32_to_cpu(dip->di_nlink);
> +		prid = (xfs_dqid_t)be16_to_cpu(dip->di_projid_hi) << 16 |
> +				   be16_to_cpu(dip->di_projid_lo);
> +	}
> +	uid = be32_to_cpu(dip->di_uid);
> +	gid = be32_to_cpu(dip->di_gid);
> +	diflags = be16_to_cpu(dip->di_flags);
> +	if (xfs_sb_version_has_v3inode(&mp->m_sb))
> +		diflags2 = be64_to_cpu(dip->di_flags2);
>  	if (isfree) {
> -		if (xino.i_d.di_nblocks != 0) {
> +		if (be64_to_cpu(dip->di_nblocks) != 0) {
>  			if (v)
>  				dbprintf(_("bad nblocks %lld for free inode "
>  					 "%lld\n"),
> -					xino.i_d.di_nblocks, ino);
> +					be64_to_cpu(dip->di_nblocks), ino);
>  			error++;
>  		}
>  		if (dip->di_nlink != 0) {
> @@ -2809,24 +2823,24 @@ process_inode(
>  	 */
>  	mode = be16_to_cpu(dip->di_mode);
>  	if ((((mode & S_IFMT) >> 12) > 15) ||
> -	    (!(okfmts[(mode & S_IFMT) >> 12] & (1 << xino.i_d.di_format)))) {
> +	    (!(okfmts[(mode & S_IFMT) >> 12] & (1 << dip->di_format)))) {
>  		if (v)
>  			dbprintf(_("bad format %d for inode %lld type %#o\n"),
> -				xino.i_d.di_format, id->ino, mode & S_IFMT);
> +				dip->di_format, id->ino, mode & S_IFMT);
>  		error++;
>  		return;
>  	}
>  	if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) {
>  		if (v)
>  			dbprintf(_("bad fork offset %d for inode %lld\n"),
> -				xino.i_d.di_forkoff, id->ino);
> +				dip->di_forkoff, id->ino);
>  		error++;
>  		return;
>  	}
> -	if ((unsigned int)xino.i_d.di_aformat > XFS_DINODE_FMT_BTREE)  {
> +	if ((unsigned int)dip->di_aformat > XFS_DINODE_FMT_BTREE)  {
>  		if (v)
>  			dbprintf(_("bad attribute format %d for inode %lld\n"),
> -				xino.i_d.di_aformat, id->ino);
> +				dip->di_aformat, id->ino);
>  		error++;
>  		return;
>  	}
> @@ -2834,43 +2848,43 @@ process_inode(
>  		dbprintf(_("inode %lld mode %#o fmt %s "
>  			 "afmt %s "
>  			 "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"),
> -			id->ino, mode, fmtnames[(int)xino.i_d.di_format],
> -			fmtnames[(int)xino.i_d.di_aformat],
> -			xino.i_d.di_nextents,
> -			xino.i_d.di_anextents,
> -			xino.i_d.di_nblocks, xino.i_d.di_size,
> -			xino.i_d.di_flags & XFS_DIFLAG_REALTIME ? " rt" : "",
> -			xino.i_d.di_flags & XFS_DIFLAG_PREALLOC ? " pre" : "",
> -			xino.i_d.di_flags & XFS_DIFLAG_IMMUTABLE? " imm" : "",
> -			xino.i_d.di_flags & XFS_DIFLAG_APPEND   ? " app" : "",
> -			xino.i_d.di_flags & XFS_DIFLAG_SYNC     ? " syn" : "",
> -			xino.i_d.di_flags & XFS_DIFLAG_NOATIME  ? " noa" : "",
> -			xino.i_d.di_flags & XFS_DIFLAG_NODUMP   ? " nod" : "");
> +			id->ino, mode, fmtnames[(int)dip->di_format],
> +			fmtnames[(int)dip->di_aformat],
> +			be32_to_cpu(dip->di_nextents),
> +			be16_to_cpu(dip->di_anextents),
> +			be64_to_cpu(dip->di_nblocks), be64_to_cpu(dip->di_size),
> +			diflags & XFS_DIFLAG_REALTIME ? " rt" : "",
> +			diflags & XFS_DIFLAG_PREALLOC ? " pre" : "",
> +			diflags & XFS_DIFLAG_IMMUTABLE? " imm" : "",
> +			diflags & XFS_DIFLAG_APPEND   ? " app" : "",
> +			diflags & XFS_DIFLAG_SYNC     ? " syn" : "",
> +			diflags & XFS_DIFLAG_NOATIME  ? " noa" : "",
> +			diflags & XFS_DIFLAG_NODUMP   ? " nod" : "");
>  	security = 0;
>  	switch (mode & S_IFMT) {
>  	case S_IFDIR:
>  		type = DBM_DIR;
> -		if (xino.i_d.di_format == XFS_DINODE_FMT_LOCAL)
> +		if (dip->di_format == XFS_DINODE_FMT_LOCAL)
>  			break;
> -		blkmap = blkmap_alloc(xino.i_d.di_nextents);
> +		blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
>  		break;
>  	case S_IFREG:
> -		if (xino.i_d.di_flags & XFS_DIFLAG_REALTIME)
> +		if (diflags & XFS_DIFLAG_REALTIME)
>  			type = DBM_RTDATA;
>  		else if (id->ino == mp->m_sb.sb_rbmino) {
>  			type = DBM_RTBITMAP;
> -			blkmap = blkmap_alloc(xino.i_d.di_nextents);
> +			blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
>  			addlink_inode(id);
>  		} else if (id->ino == mp->m_sb.sb_rsumino) {
>  			type = DBM_RTSUM;
> -			blkmap = blkmap_alloc(xino.i_d.di_nextents);
> +			blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
>  			addlink_inode(id);
>  		}
>  		else if (id->ino == mp->m_sb.sb_uquotino ||
>  			 id->ino == mp->m_sb.sb_gquotino ||
>  			 id->ino == mp->m_sb.sb_pquotino) {
>  			type = DBM_QUOTA;
> -			blkmap = blkmap_alloc(xino.i_d.di_nextents);
> +			blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
>  			addlink_inode(id);
>  		}
>  		else
> @@ -2887,10 +2901,10 @@ process_inode(
>  		break;
>  	}
>  
> -	id->isreflink = !!(xino.i_d.di_flags2 & XFS_DIFLAG2_REFLINK);
> -	setlink_inode(id, VFS_I(&xino)->i_nlink, type == DBM_DIR, security);
> +	id->isreflink = !!(diflags2 & XFS_DIFLAG2_REFLINK);
> +	setlink_inode(id, nlink, type == DBM_DIR, security);
>  
> -	switch (xino.i_d.di_format) {
> +	switch (dip->di_format) {
>  	case XFS_DINODE_FMT_LOCAL:
>  		process_lclinode(id, dip, type, &totdblocks, &totiblocks,
>  			&nextents, &blkmap, XFS_DATA_FORK);
> @@ -2906,7 +2920,7 @@ process_inode(
>  	}
>  	if (XFS_DFORK_Q(dip)) {
>  		sbversion |= XFS_SB_VERSION_ATTRBIT;
> -		switch (xino.i_d.di_aformat) {
> +		switch (dip->di_aformat) {
>  		case XFS_DINODE_FMT_LOCAL:
>  			process_lclinode(id, dip, DBM_ATTR, &atotdblocks,
>  				&atotiblocks, &anextents, NULL, XFS_ATTR_FORK);
> @@ -2941,30 +2955,28 @@ process_inode(
>  		default:
>  			break;
>  		}
> -		if (ic) {
> -			quota_add(&xino.i_d.di_projid, &VFS_I(&xino)->i_gid,
> -				  &VFS_I(&xino)->i_uid, 0, bc, ic, rc);
> -		}
> +		if (ic)
> +			quota_add(&prid, &gid, &uid, 0, bc, ic, rc);
>  	}
>  	totblocks = totdblocks + totiblocks + atotdblocks + atotiblocks;
> -	if (totblocks != xino.i_d.di_nblocks) {
> +	if (totblocks != be64_to_cpu(dip->di_nblocks)) {
>  		if (v)
>  			dbprintf(_("bad nblocks %lld for inode %lld, counted "
>  				 "%lld\n"),
> -				xino.i_d.di_nblocks, id->ino, totblocks);
> +				be64_to_cpu(dip->di_nblocks), id->ino, totblocks);
>  		error++;
>  	}
> -	if (nextents != xino.i_d.di_nextents) {
> +	if (nextents != be32_to_cpu(dip->di_nextents)) {
>  		if (v)
>  			dbprintf(_("bad nextents %d for inode %lld, counted %d\n"),
> -				xino.i_d.di_nextents, id->ino, nextents);
> +				be32_to_cpu(dip->di_nextents), id->ino, nextents);
>  		error++;
>  	}
> -	if (anextents != xino.i_d.di_anextents) {
> +	if (anextents != be16_to_cpu(dip->di_anextents)) {
>  		if (v)
>  			dbprintf(_("bad anextents %d for inode %lld, counted "
>  				 "%d\n"),
> -				xino.i_d.di_anextents, id->ino, anextents);
> +				be16_to_cpu(dip->di_anextents), id->ino, anextents);
>  		error++;
>  	}
>  	if (type == DBM_DIR)
>

Patch
diff mbox series

diff --git a/db/check.c b/db/check.c
index 12c03b6d..96abea21 100644
--- a/db/check.c
+++ b/db/check.c
@@ -2707,7 +2707,6 @@  process_inode(
 {
 	blkmap_t		*blkmap;
 	xfs_fsblock_t		bno = 0;
-	struct xfs_inode	xino;
 	inodata_t		*id = NULL;
 	xfs_ino_t		ino;
 	xfs_extnum_t		nextents = 0;
@@ -2724,6 +2723,12 @@  process_inode(
 	xfs_qcnt_t		rc = 0;
 	int			v = 0;
 	mode_t			mode;
+	uint16_t		diflags;
+	uint64_t		diflags2 = 0;
+	xfs_nlink_t		nlink;
+	xfs_dqid_t		uid;
+	xfs_dqid_t		gid;
+	xfs_dqid_t		prid;
 	static char		okfmts[] = {
 		0,				/* type 0 unused */
 		1 << XFS_DINODE_FMT_DEV,	/* FIFO */
@@ -2750,10 +2755,6 @@  process_inode(
 		"dev", "local", "extents", "btree", "uuid"
 	};
 
-	/* xfs_inode_from_disk expects to have an mp to work with */
-	xino.i_mount = mp;
-	libxfs_inode_from_disk(&xino, dip);
-
 	ino = XFS_AGINO_TO_INO(mp, be32_to_cpu(agf->agf_seqno), agino);
 	if (!isfree) {
 		id = find_inode(ino, 1);
@@ -2775,12 +2776,25 @@  process_inode(
 		error++;
 		return;
 	}
+	if (dip->di_version == 1) {
+		nlink = be16_to_cpu(dip->di_onlink);
+		prid = 0;
+	} else {
+		nlink = be32_to_cpu(dip->di_nlink);
+		prid = (xfs_dqid_t)be16_to_cpu(dip->di_projid_hi) << 16 |
+				   be16_to_cpu(dip->di_projid_lo);
+	}
+	uid = be32_to_cpu(dip->di_uid);
+	gid = be32_to_cpu(dip->di_gid);
+	diflags = be16_to_cpu(dip->di_flags);
+	if (xfs_sb_version_has_v3inode(&mp->m_sb))
+		diflags2 = be64_to_cpu(dip->di_flags2);
 	if (isfree) {
-		if (xino.i_d.di_nblocks != 0) {
+		if (be64_to_cpu(dip->di_nblocks) != 0) {
 			if (v)
 				dbprintf(_("bad nblocks %lld for free inode "
 					 "%lld\n"),
-					xino.i_d.di_nblocks, ino);
+					be64_to_cpu(dip->di_nblocks), ino);
 			error++;
 		}
 		if (dip->di_nlink != 0) {
@@ -2809,24 +2823,24 @@  process_inode(
 	 */
 	mode = be16_to_cpu(dip->di_mode);
 	if ((((mode & S_IFMT) >> 12) > 15) ||
-	    (!(okfmts[(mode & S_IFMT) >> 12] & (1 << xino.i_d.di_format)))) {
+	    (!(okfmts[(mode & S_IFMT) >> 12] & (1 << dip->di_format)))) {
 		if (v)
 			dbprintf(_("bad format %d for inode %lld type %#o\n"),
-				xino.i_d.di_format, id->ino, mode & S_IFMT);
+				dip->di_format, id->ino, mode & S_IFMT);
 		error++;
 		return;
 	}
 	if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) {
 		if (v)
 			dbprintf(_("bad fork offset %d for inode %lld\n"),
-				xino.i_d.di_forkoff, id->ino);
+				dip->di_forkoff, id->ino);
 		error++;
 		return;
 	}
-	if ((unsigned int)xino.i_d.di_aformat > XFS_DINODE_FMT_BTREE)  {
+	if ((unsigned int)dip->di_aformat > XFS_DINODE_FMT_BTREE)  {
 		if (v)
 			dbprintf(_("bad attribute format %d for inode %lld\n"),
-				xino.i_d.di_aformat, id->ino);
+				dip->di_aformat, id->ino);
 		error++;
 		return;
 	}
@@ -2834,43 +2848,43 @@  process_inode(
 		dbprintf(_("inode %lld mode %#o fmt %s "
 			 "afmt %s "
 			 "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"),
-			id->ino, mode, fmtnames[(int)xino.i_d.di_format],
-			fmtnames[(int)xino.i_d.di_aformat],
-			xino.i_d.di_nextents,
-			xino.i_d.di_anextents,
-			xino.i_d.di_nblocks, xino.i_d.di_size,
-			xino.i_d.di_flags & XFS_DIFLAG_REALTIME ? " rt" : "",
-			xino.i_d.di_flags & XFS_DIFLAG_PREALLOC ? " pre" : "",
-			xino.i_d.di_flags & XFS_DIFLAG_IMMUTABLE? " imm" : "",
-			xino.i_d.di_flags & XFS_DIFLAG_APPEND   ? " app" : "",
-			xino.i_d.di_flags & XFS_DIFLAG_SYNC     ? " syn" : "",
-			xino.i_d.di_flags & XFS_DIFLAG_NOATIME  ? " noa" : "",
-			xino.i_d.di_flags & XFS_DIFLAG_NODUMP   ? " nod" : "");
+			id->ino, mode, fmtnames[(int)dip->di_format],
+			fmtnames[(int)dip->di_aformat],
+			be32_to_cpu(dip->di_nextents),
+			be16_to_cpu(dip->di_anextents),
+			be64_to_cpu(dip->di_nblocks), be64_to_cpu(dip->di_size),
+			diflags & XFS_DIFLAG_REALTIME ? " rt" : "",
+			diflags & XFS_DIFLAG_PREALLOC ? " pre" : "",
+			diflags & XFS_DIFLAG_IMMUTABLE? " imm" : "",
+			diflags & XFS_DIFLAG_APPEND   ? " app" : "",
+			diflags & XFS_DIFLAG_SYNC     ? " syn" : "",
+			diflags & XFS_DIFLAG_NOATIME  ? " noa" : "",
+			diflags & XFS_DIFLAG_NODUMP   ? " nod" : "");
 	security = 0;
 	switch (mode & S_IFMT) {
 	case S_IFDIR:
 		type = DBM_DIR;
-		if (xino.i_d.di_format == XFS_DINODE_FMT_LOCAL)
+		if (dip->di_format == XFS_DINODE_FMT_LOCAL)
 			break;
-		blkmap = blkmap_alloc(xino.i_d.di_nextents);
+		blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
 		break;
 	case S_IFREG:
-		if (xino.i_d.di_flags & XFS_DIFLAG_REALTIME)
+		if (diflags & XFS_DIFLAG_REALTIME)
 			type = DBM_RTDATA;
 		else if (id->ino == mp->m_sb.sb_rbmino) {
 			type = DBM_RTBITMAP;
-			blkmap = blkmap_alloc(xino.i_d.di_nextents);
+			blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
 			addlink_inode(id);
 		} else if (id->ino == mp->m_sb.sb_rsumino) {
 			type = DBM_RTSUM;
-			blkmap = blkmap_alloc(xino.i_d.di_nextents);
+			blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
 			addlink_inode(id);
 		}
 		else if (id->ino == mp->m_sb.sb_uquotino ||
 			 id->ino == mp->m_sb.sb_gquotino ||
 			 id->ino == mp->m_sb.sb_pquotino) {
 			type = DBM_QUOTA;
-			blkmap = blkmap_alloc(xino.i_d.di_nextents);
+			blkmap = blkmap_alloc(be32_to_cpu(dip->di_nextents));
 			addlink_inode(id);
 		}
 		else
@@ -2887,10 +2901,10 @@  process_inode(
 		break;
 	}
 
-	id->isreflink = !!(xino.i_d.di_flags2 & XFS_DIFLAG2_REFLINK);
-	setlink_inode(id, VFS_I(&xino)->i_nlink, type == DBM_DIR, security);
+	id->isreflink = !!(diflags2 & XFS_DIFLAG2_REFLINK);
+	setlink_inode(id, nlink, type == DBM_DIR, security);
 
-	switch (xino.i_d.di_format) {
+	switch (dip->di_format) {
 	case XFS_DINODE_FMT_LOCAL:
 		process_lclinode(id, dip, type, &totdblocks, &totiblocks,
 			&nextents, &blkmap, XFS_DATA_FORK);
@@ -2906,7 +2920,7 @@  process_inode(
 	}
 	if (XFS_DFORK_Q(dip)) {
 		sbversion |= XFS_SB_VERSION_ATTRBIT;
-		switch (xino.i_d.di_aformat) {
+		switch (dip->di_aformat) {
 		case XFS_DINODE_FMT_LOCAL:
 			process_lclinode(id, dip, DBM_ATTR, &atotdblocks,
 				&atotiblocks, &anextents, NULL, XFS_ATTR_FORK);
@@ -2941,30 +2955,28 @@  process_inode(
 		default:
 			break;
 		}
-		if (ic) {
-			quota_add(&xino.i_d.di_projid, &VFS_I(&xino)->i_gid,
-				  &VFS_I(&xino)->i_uid, 0, bc, ic, rc);
-		}
+		if (ic)
+			quota_add(&prid, &gid, &uid, 0, bc, ic, rc);
 	}
 	totblocks = totdblocks + totiblocks + atotdblocks + atotiblocks;
-	if (totblocks != xino.i_d.di_nblocks) {
+	if (totblocks != be64_to_cpu(dip->di_nblocks)) {
 		if (v)
 			dbprintf(_("bad nblocks %lld for inode %lld, counted "
 				 "%lld\n"),
-				xino.i_d.di_nblocks, id->ino, totblocks);
+				be64_to_cpu(dip->di_nblocks), id->ino, totblocks);
 		error++;
 	}
-	if (nextents != xino.i_d.di_nextents) {
+	if (nextents != be32_to_cpu(dip->di_nextents)) {
 		if (v)
 			dbprintf(_("bad nextents %d for inode %lld, counted %d\n"),
-				xino.i_d.di_nextents, id->ino, nextents);
+				be32_to_cpu(dip->di_nextents), id->ino, nextents);
 		error++;
 	}
-	if (anextents != xino.i_d.di_anextents) {
+	if (anextents != be16_to_cpu(dip->di_anextents)) {
 		if (v)
 			dbprintf(_("bad anextents %d for inode %lld, counted "
 				 "%d\n"),
-				xino.i_d.di_anextents, id->ino, anextents);
+				be16_to_cpu(dip->di_anextents), id->ino, anextents);
 		error++;
 	}
 	if (type == DBM_DIR)