All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] xfsprogs: 4.13 rollup
@ 2017-07-31 21:06 Darrick J. Wong
  2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
                   ` (7 more replies)
  0 siblings, 8 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:06 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

Hi all,

Here are a few patches I have for xfsprogs 4.13.  The first two continue
some cleanups we did in libxfs, and a fix for 4.12's metadump stdout
switcheroo.  The next two are patches to xfs_db to enable dumping and
writing of directory and attribute block fields.  Finally, introduce the
fuzz command that enables us to do easy fuzz testing of XFS metadata.

--Darrick

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH 1/7] xfs: remove double-underscore integer types
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
@ 2017-07-31 21:06 ` Darrick J. Wong
  2017-07-31 21:23   ` Eric Sandeen
  2017-08-02  9:13   ` Carlos Maiolino
  2017-07-31 21:07 ` [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN Darrick J. Wong
                   ` (6 subsequent siblings)
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:06 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

This is a purely mechanical patch that removes the private
__{u,}int{8,16,32,64}_t typedefs in favor of using the system
{u,}int{8,16,32,64}_t typedefs.  This is the sed script used to perform
the transformation and fix the resulting whitespace and indentation
errors:

s/typedef\t__uint8_t/typedef __uint8_t\t/g
s/typedef\t__uint/typedef __uint/g
s/typedef\t__int\([0-9]*\)_t/typedef int\1_t\t/g
s/__uint8_t\t/__uint8_t\t\t/g
s/__uint/uint/g
s/__int\([0-9]*\)_t\t/__int\1_t\t\t/g
s/__int/int/g
/^typedef.*int[0-9]*_t;$/d

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 copy/xfs_copy.c           |   14 ++++----
 copy/xfs_copy.h           |    2 +
 db/attr.c                 |    8 ++---
 db/attrshort.c            |    4 +-
 db/bit.c                  |    4 +-
 db/bit.h                  |    2 +
 db/block.c                |    8 ++---
 db/check.c                |   18 +++++------
 db/convert.c              |   28 ++++++++---------
 db/faddr.c                |   14 ++++----
 db/field.c                |   44 +++++++++++++-------------
 db/fprint.c               |    8 ++---
 db/frag.c                 |    8 ++---
 db/inode.c                |   34 ++++++++++----------
 db/io.c                   |    2 +
 db/io.h                   |    6 ++--
 db/metadump.c             |   12 ++++---
 db/sb.c                   |    6 ++--
 fsr/xfs_fsr.c             |    2 +
 include/darwin.h          |   18 +++++------
 include/freebsd.h         |    6 ++--
 include/gnukfreebsd.h     |    6 ++--
 include/libxcmd.h         |    6 ++--
 include/linux.h           |    8 ++---
 include/xfs_arch.h        |   22 +++++++------
 include/xfs_inode.h       |    4 +-
 include/xfs_log_recover.h |    2 +
 include/xfs_metadump.h    |    4 +-
 include/xfs_mount.h       |   22 +++++++------
 libhandle/handle.c        |    2 +
 libhandle/jdm.c           |    2 +
 libxcmd/topology.c        |   14 ++++----
 libxfs/darwin.c           |    2 +
 libxfs/freebsd.c          |    2 +
 libxfs/init.c             |    2 +
 libxfs/irix.c             |    2 +
 libxfs/libxfs_priv.h      |    4 +-
 libxfs/linux.c            |    2 +
 libxfs/logitem.c          |    2 +
 libxfs/radix-tree.c       |    8 ++---
 libxfs/rdwr.c             |    6 ++--
 libxfs/util.c             |    8 ++---
 logprint/log_misc.c       |    6 ++--
 mdrestore/xfs_mdrestore.c |    2 +
 mkfs/proto.c              |    2 +
 mkfs/xfs_mkfs.c           |   76 +++++++++++++++++++++++----------------------
 quota/edit.c              |   64 +++++++++++++++++++-------------------
 quota/free.c              |   44 +++++++++++++-------------
 quota/quot.c              |   24 +++++++-------
 quota/quota.c             |    4 +-
 quota/quota.h             |   12 ++++---
 quota/report.c            |    4 +-
 quota/state.c             |    2 +
 quota/util.c              |   66 ++++++++++++++++++++-------------------
 repair/README             |    2 +
 repair/agheader.h         |   14 ++++----
 repair/attr_repair.h      |   26 ++++++++-------
 repair/avl64.c            |   38 +++++++++++------------
 repair/avl64.h            |   18 +++++------
 repair/dinode.c           |   38 +++++++++++------------
 repair/dinode.h           |    4 +-
 repair/dir2.c             |    2 +
 repair/globals.h          |   16 +++++----
 repair/incore.c           |   10 +++---
 repair/incore.h           |   46 ++++++++++++++-------------
 repair/incore_ext.c       |    6 ++--
 repair/incore_ino.c       |   72 +++++++++++++++++++++----------------------
 repair/phase2.c           |    2 +
 repair/phase3.c           |    6 ++--
 repair/phase4.c           |    4 +-
 repair/phase5.c           |   28 ++++++++---------
 repair/phase6.c           |   16 +++++----
 repair/phase7.c           |    6 ++--
 repair/progress.c         |   30 +++++++++---------
 repair/progress.h         |    4 +-
 repair/rmap.c             |   18 +++++------
 repair/rmap.h             |    2 +
 repair/sb.c               |   24 +++++++-------
 repair/scan.c             |   50 +++++++++++++++---------------
 repair/scan.h             |   12 ++++---
 80 files changed, 589 insertions(+), 589 deletions(-)


diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c
index a7da824..33e05df 100644
--- a/copy/xfs_copy.c
+++ b/copy/xfs_copy.c
@@ -43,7 +43,7 @@ unsigned int	source_sectorsize;	/* source disk sectorsize */
 
 xfs_agblock_t	first_agbno;
 
-__uint64_t	barcount[11];
+uint64_t	barcount[11];
 
 unsigned int	num_targets;
 target_control	*target;
@@ -313,7 +313,7 @@ usage(void)
 }
 
 void
-init_bar(__uint64_t source_blocks)
+init_bar(uint64_t source_blocks)
 {
 	int	i;
 
@@ -322,7 +322,7 @@ init_bar(__uint64_t source_blocks)
 }
 
 int
-bump_bar(int tenths, __uint64_t numblocks)
+bump_bar(int tenths, uint64_t numblocks)
 {
 	static char *bar[11] = {
 		" 0% ",
@@ -534,8 +534,8 @@ main(int argc, char **argv)
 	xfs_off_t	pos;
 	size_t		length;
 	int		c;
-	__uint64_t	size, sizeb;
-	__uint64_t	numblocks = 0;
+	uint64_t	size, sizeb;
+	uint64_t	numblocks = 0;
 	int		wblocks = 0;
 	int		num_threads = 0;
 	struct dioattr	d;
@@ -951,8 +951,8 @@ main(int argc, char **argv)
 	num_ags = mp->m_sb.sb_agcount;
 
 	init_bar(mp->m_sb.sb_blocksize / BBSIZE
-			* ((__uint64_t)mp->m_sb.sb_dblocks
-			    - (__uint64_t)mp->m_sb.sb_fdblocks + 10 * num_ags));
+			* ((uint64_t)mp->m_sb.sb_dblocks
+			    - (uint64_t)mp->m_sb.sb_fdblocks + 10 * num_ags));
 
 	kids = num_targets;
 
diff --git a/copy/xfs_copy.h b/copy/xfs_copy.h
index 2737068..53c6e42 100644
--- a/copy/xfs_copy.h
+++ b/copy/xfs_copy.h
@@ -76,7 +76,7 @@ typedef struct {
 
 typedef int thread_id;
 typedef int tm_index;			/* index into thread mask array */
-typedef __uint32_t thread_mask;		/* a thread mask */
+typedef uint32_t thread_mask;		/* a thread mask */
 
 typedef struct {
 	char		*name;
diff --git a/db/attr.c b/db/attr.c
index 31536a8..23ffcd5 100644
--- a/db/attr.c
+++ b/db/attr.c
@@ -77,16 +77,16 @@ const field_t	attr_leaf_entry_flds[] = {
 	{ "nameidx", FLDT_UINT16D, OI(LEOFF(nameidx)), C1, 0, TYP_NONE },
 	{ "flags", FLDT_UINT8X, OI(LEOFF(flags)), C1, FLD_SKIPALL, TYP_NONE },
 	{ "incomplete", FLDT_UINT1,
-	  OI(LEOFF(flags) + bitsz(__uint8_t) - XFS_ATTR_INCOMPLETE_BIT - 1), C1,
+	  OI(LEOFF(flags) + bitsz(uint8_t) - XFS_ATTR_INCOMPLETE_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "root", FLDT_UINT1,
-	  OI(LEOFF(flags) + bitsz(__uint8_t) - XFS_ATTR_ROOT_BIT - 1), C1, 0,
+	  OI(LEOFF(flags) + bitsz(uint8_t) - XFS_ATTR_ROOT_BIT - 1), C1, 0,
 	  TYP_NONE },
 	{ "secure", FLDT_UINT1,
-	  OI(LEOFF(flags) + bitsz(__uint8_t) - XFS_ATTR_SECURE_BIT - 1), C1, 0,
+	  OI(LEOFF(flags) + bitsz(uint8_t) - XFS_ATTR_SECURE_BIT - 1), C1, 0,
 	  TYP_NONE },
 	{ "local", FLDT_UINT1,
-	  OI(LEOFF(flags) + bitsz(__uint8_t) - XFS_ATTR_LOCAL_BIT - 1), C1, 0,
+	  OI(LEOFF(flags) + bitsz(uint8_t) - XFS_ATTR_LOCAL_BIT - 1), C1, 0,
 	  TYP_NONE },
 	{ "pad2", FLDT_UINT8X, OI(LEOFF(pad2)), C1, FLD_SKIPALL, TYP_NONE },
 	{ NULL }
diff --git a/db/attrshort.c b/db/attrshort.c
index d82559c..2ef358f 100644
--- a/db/attrshort.c
+++ b/db/attrshort.c
@@ -51,10 +51,10 @@ const field_t	attr_sf_entry_flds[] = {
 	{ "valuelen", FLDT_UINT8D, OI(EOFF(valuelen)), C1, 0, TYP_NONE },
 	{ "flags", FLDT_UINT8X, OI(EOFF(flags)), C1, FLD_SKIPALL, TYP_NONE },
 	{ "root", FLDT_UINT1,
-	  OI(EOFF(flags) + bitsz(__uint8_t) - XFS_ATTR_ROOT_BIT - 1), C1, 0,
+	  OI(EOFF(flags) + bitsz(uint8_t) - XFS_ATTR_ROOT_BIT - 1), C1, 0,
 	  TYP_NONE },
 	{ "secure", FLDT_UINT1,
-	  OI(EOFF(flags) + bitsz(__uint8_t) - XFS_ATTR_SECURE_BIT - 1), C1, 0,
+	  OI(EOFF(flags) + bitsz(uint8_t) - XFS_ATTR_SECURE_BIT - 1), C1, 0,
 	  TYP_NONE },
 	{ "name", FLDT_CHARNS, OI(EOFF(nameval)), attr_sf_entry_name_count,
 	  FLD_COUNT, TYP_NONE },
diff --git a/db/bit.c b/db/bit.c
index 24872bf..f5ebf68 100644
--- a/db/bit.c
+++ b/db/bit.c
@@ -60,7 +60,7 @@ setbit(
 	}
 }
 
-__int64_t
+int64_t
 getbitval(
 	void		*obj,
 	int		bitoff,
@@ -70,7 +70,7 @@ getbitval(
 	int		bit;
 	int		i;
 	char		*p;
-	__int64_t	rval;
+	int64_t		rval;
 	int		signext;
 	int		z1, z2, z3, z4;
 
diff --git a/db/bit.h b/db/bit.h
index 80ba24c..9fd71f4 100644
--- a/db/bit.h
+++ b/db/bit.h
@@ -25,5 +25,5 @@
 #define	BVUNSIGNED	0
 #define	BVSIGNED	1
 
-extern __int64_t	getbitval(void *obj, int bitoff, int nbits, int flags);
+extern int64_t		getbitval(void *obj, int bitoff, int nbits, int flags);
 extern void             setbitval(void *obuf, int bitoff, int nbits, void *ibuf);
diff --git a/db/block.c b/db/block.c
index 4a357ce..5ecd687 100644
--- a/db/block.c
+++ b/db/block.c
@@ -98,7 +98,7 @@ ablock_f(
 	}
 	dfsbno = bm.startblock + (bno - bm.startoff);
 	ASSERT(typtab[TYP_ATTR].typnm == TYP_ATTR);
-	set_cur(&typtab[TYP_ATTR], (__int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
+	set_cur(&typtab[TYP_ATTR], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
 		blkbb, DB_RING_ADD, NULL);
 	return 0;
 }
@@ -128,14 +128,14 @@ daddr_f(
 	int		argc,
 	char		**argv)
 {
-	__int64_t	d;
+	int64_t		d;
 	char		*p;
 
 	if (argc == 1) {
 		dbprintf(_("current daddr is %lld\n"), iocur_top->off >> BBSHIFT);
 		return 0;
 	}
-	d = (__int64_t)strtoull(argv[1], &p, 0);
+	d = (int64_t)strtoull(argv[1], &p, 0);
 	if (*p != '\0' ||
 	    d >= mp->m_sb.sb_dblocks << (mp->m_sb.sb_blocklog - BBSHIFT)) {
 		dbprintf(_("bad daddr %s\n"), argv[1]);
@@ -197,7 +197,7 @@ dblock_f(
 	ASSERT(typtab[type].typnm == type);
 	if (nex > 1)
 		make_bbmap(&bbmap, nex, bmp);
-	set_cur(&typtab[type], (__int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
+	set_cur(&typtab[type], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
 		nb * blkbb, DB_RING_ADD, nex > 1 ? &bbmap : NULL);
 	free(bmp);
 	return 0;
diff --git a/db/check.c b/db/check.c
index 8e618a2..81ba63a 100644
--- a/db/check.c
+++ b/db/check.c
@@ -114,8 +114,8 @@ typedef struct dirhash {
 
 static xfs_extlen_t	agffreeblks;
 static xfs_extlen_t	agflongest;
-static __uint64_t	agf_aggr_freeblks;	/* aggregate count over all */
-static __uint32_t	agfbtreeblks;
+static uint64_t	agf_aggr_freeblks;	/* aggregate count over all */
+static uint32_t	agfbtreeblks;
 static int		lazycount;
 static xfs_agino_t	agicount;
 static xfs_agino_t	agifreecount;
@@ -124,10 +124,10 @@ static int		blist_size;
 static char		**dbmap;	/* really dbm_t:8 */
 static dirhash_t	**dirhash;
 static int		error;
-static __uint64_t	fdblocks;
-static __uint64_t	frextents;
-static __uint64_t	icount;
-static __uint64_t	ifree;
+static uint64_t	fdblocks;
+static uint64_t	frextents;
+static uint64_t	icount;
+static uint64_t	ifree;
 static inodata_t	***inodata;
 static int		inodata_hash_size;
 static inodata_t	***inomap;
@@ -1187,7 +1187,7 @@ blocktrash_f(
 		goto out;
 	}
 	for (i = 0; i < count; i++) {
-		randb = (xfs_rfsblock_t)((((__int64_t)random() << 32) |
+		randb = (xfs_rfsblock_t)((((int64_t)random() << 32) |
 					 random()) % blocks);
 		for (bi = 0, agno = 0, done = 0;
 		     !done && agno < mp->m_sb.sb_agcount;
@@ -3032,7 +3032,7 @@ process_leaf_node_dir_v2(
 		}
 		if (v)
 			dbprintf(_("dir inode %lld block %u=%llu\n"), id->ino,
-				(__uint32_t)dbno,
+				(uint32_t)dbno,
 				(xfs_fsblock_t)bmp->startblock);
 		push_cur();
 		if (nex > 1)
@@ -3045,7 +3045,7 @@ process_leaf_node_dir_v2(
 			if (!sflag || v)
 				dbprintf(_("can't read block %u for directory "
 					 "inode %lld\n"),
-					(__uint32_t)dbno, id->ino);
+					(uint32_t)dbno, id->ino);
 			error++;
 			pop_cur();
 			dbno += mp->m_dir_geo->fsbcount - 1;
diff --git a/db/convert.c b/db/convert.c
index a337abe..fa4f962 100644
--- a/db/convert.c
+++ b/db/convert.c
@@ -24,13 +24,13 @@
 
 #define	M(A)	(1 << CT_ ## A)
 #define	agblock_to_bytes(x)	\
-	((__uint64_t)(x) << mp->m_sb.sb_blocklog)
+	((uint64_t)(x) << mp->m_sb.sb_blocklog)
 #define	agino_to_bytes(x)	\
-	((__uint64_t)(x) << mp->m_sb.sb_inodelog)
+	((uint64_t)(x) << mp->m_sb.sb_inodelog)
 #define	agnumber_to_bytes(x)	\
-	agblock_to_bytes((__uint64_t)(x) * mp->m_sb.sb_agblocks)
+	agblock_to_bytes((uint64_t)(x) * mp->m_sb.sb_agblocks)
 #define	daddr_to_bytes(x)	\
-	((__uint64_t)(x) << BBSHIFT)
+	((uint64_t)(x) << BBSHIFT)
 #define	fsblock_to_bytes(x)	\
 	(agnumber_to_bytes(XFS_FSB_TO_AGNO(mp, (x))) + \
 	 agblock_to_bytes(XFS_FSB_TO_AGBNO(mp, (x))))
@@ -38,7 +38,7 @@
 	(agnumber_to_bytes(XFS_INO_TO_AGNO(mp, (x))) + \
 	 agino_to_bytes(XFS_INO_TO_AGINO(mp, (x))))
 #define	inoidx_to_bytes(x)	\
-	((__uint64_t)(x) << mp->m_sb.sb_inodelog)
+	((uint64_t)(x) << mp->m_sb.sb_inodelog)
 
 typedef enum {
 	CT_NONE = -1,
@@ -68,7 +68,7 @@ typedef union {
 	xfs_agnumber_t	agnumber;
 	int		bboff;
 	int		blkoff;
-	__uint64_t	byte;
+	uint64_t	byte;
 	xfs_daddr_t	daddr;
 	xfs_fsblock_t	fsblock;
 	xfs_ino_t	ino;
@@ -76,7 +76,7 @@ typedef union {
 	int		inooff;
 } cval_t;
 
-static __uint64_t		bytevalue(ctype_t ctype, cval_t *val);
+static uint64_t		bytevalue(ctype_t ctype, cval_t *val);
 static int		convert_f(int argc, char **argv);
 static int		getvalue(char *s, ctype_t ctype, cval_t *val);
 static ctype_t		lookupcty(char *ctyname);
@@ -118,7 +118,7 @@ static const cmdinfo_t	convert_cmd =
 	{ "convert", NULL, convert_f, 3, 9, 0, "type num [type num]... type",
 	  "convert from one address form to another", NULL };
 
-static __uint64_t
+static uint64_t
 bytevalue(ctype_t ctype, cval_t *val)
 {
 	switch (ctype) {
@@ -129,9 +129,9 @@ bytevalue(ctype_t ctype, cval_t *val)
 	case CT_AGNUMBER:
 		return agnumber_to_bytes(val->agnumber);
 	case CT_BBOFF:
-		return (__uint64_t)val->bboff;
+		return (uint64_t)val->bboff;
 	case CT_BLKOFF:
-		return (__uint64_t)val->blkoff;
+		return (uint64_t)val->blkoff;
 	case CT_BYTE:
 		return val->byte;
 	case CT_DADDR:
@@ -143,7 +143,7 @@ bytevalue(ctype_t ctype, cval_t *val)
 	case CT_INOIDX:
 		return inoidx_to_bytes(val->inoidx);
 	case CT_INOOFF:
-		return (__uint64_t)val->inooff;
+		return (uint64_t)val->inooff;
 	case CT_NONE:
 	case NCTS:
 		break;
@@ -160,7 +160,7 @@ convert_f(int argc, char **argv)
 	cval_t		cvals[NCTS] = {};
 	int		i;
 	int		mask;
-	__uint64_t	v;
+	uint64_t	v;
 	ctype_t		wtype;
 
 	/* move past the "convert" command */
@@ -262,7 +262,7 @@ static int
 getvalue(char *s, ctype_t ctype, cval_t *val)
 {
 	char		*p;
-	__uint64_t	v;
+	uint64_t	v;
 
 	v = strtoull(s, &p, 0);
 	if (*p != '\0') {
@@ -286,7 +286,7 @@ getvalue(char *s, ctype_t ctype, cval_t *val)
 		val->blkoff = (int)v;
 		break;
 	case CT_BYTE:
-		val->byte = (__uint64_t)v;
+		val->byte = (uint64_t)v;
 		break;
 	case CT_DADDR:
 		val->daddr = (xfs_daddr_t)v;
diff --git a/db/faddr.c b/db/faddr.c
index 877200b..5620764 100644
--- a/db/faddr.c
+++ b/db/faddr.c
@@ -79,11 +79,11 @@ fa_attrblock(
 	typnm_t		next)
 {
 	bmap_ext_t	bm;
-	__uint32_t	bno;
+	uint32_t	bno;
 	xfs_fsblock_t	dfsbno;
 	int		nex;
 
-	bno = (__uint32_t)getbitval(obj, bit, bitsz(bno), BVUNSIGNED);
+	bno = (uint32_t)getbitval(obj, bit, bitsz(bno), BVUNSIGNED);
 	if (bno == 0) {
 		dbprintf(_("null attribute block number, cannot set new addr\n"));
 		return;
@@ -96,7 +96,7 @@ fa_attrblock(
 	}
 	dfsbno = bm.startblock + (bno - bm.startoff);
 	ASSERT(typtab[next].typnm == next);
-	set_cur(&typtab[next], (__int64_t)XFS_FSB_TO_DADDR(mp, dfsbno), blkbb,
+	set_cur(&typtab[next], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno), blkbb,
 		DB_RING_ADD, NULL);
 }
 
@@ -276,11 +276,11 @@ fa_dirblock(
 {
 	bbmap_t		bbmap;
 	bmap_ext_t	*bmp;
-	__uint32_t	bno;
+	uint32_t	bno;
 	xfs_fsblock_t	dfsbno;
 	int		nex;
 
-	bno = (__uint32_t)getbitval(obj, bit, bitsz(bno), BVUNSIGNED);
+	bno = (uint32_t)getbitval(obj, bit, bitsz(bno), BVUNSIGNED);
 	if (bno == 0) {
 		dbprintf(_("null directory block number, cannot set new addr\n"));
 		return;
@@ -297,7 +297,7 @@ fa_dirblock(
 	ASSERT(typtab[next].typnm == next);
 	if (nex > 1)
 		make_bbmap(&bbmap, nex, bmp);
-	set_cur(&typtab[next], (__int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
+	set_cur(&typtab[next], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
 		XFS_FSB_TO_BB(mp, mp->m_dir_geo->fsbcount), DB_RING_ADD,
 		nex > 1 ? &bbmap : NULL);
 	free(bmp);
@@ -317,7 +317,7 @@ fa_drfsbno(
 		return;
 	}
 	ASSERT(typtab[next].typnm == next);
-	set_cur(&typtab[next], (__int64_t)XFS_FSB_TO_BB(mp, bno), blkbb,
+	set_cur(&typtab[next], (int64_t)XFS_FSB_TO_BB(mp, bno), blkbb,
 		DB_RING_ADD, NULL);
 }
 
diff --git a/db/field.c b/db/field.c
index 865b0b7..f1e5f35 100644
--- a/db/field.c
+++ b/db/field.c
@@ -83,7 +83,7 @@ const ftattr_t	ftattrtab[] = {
 	  attr_sf_entry_size, FTARG_SIZE, NULL, attr_sf_entry_flds },
 	{ FLDT_ATTR_SF_HDR, "attr_sf_hdr", NULL, (char *)attr_sf_hdr_flds,
 	  SI(bitsz(struct xfs_attr_sf_hdr)), 0, NULL, attr_sf_hdr_flds },
-	{ FLDT_ATTRBLOCK, "attrblock", fp_num, "%u", SI(bitsz(__uint32_t)), 0,
+	{ FLDT_ATTRBLOCK, "attrblock", fp_num, "%u", SI(bitsz(uint32_t)), 0,
 	  fa_attrblock, NULL },
 	{ FLDT_ATTRSHORT, "attrshort", NULL, (char *)attr_shortform_flds,
 	  attrshort_size, FTARG_SIZE, NULL, attr_shortform_flds },
@@ -199,7 +199,7 @@ const ftattr_t	ftattrtab[] = {
 	  SI(bitsz(struct xfs_refcount_rec)), 0, NULL, refcbt_rec_flds },
 
 /* CRC field */
-	{ FLDT_CRC, "crc", fp_crc, "%#x (%s)", SI(bitsz(__uint32_t)),
+	{ FLDT_CRC, "crc", fp_crc, "%#x (%s)", SI(bitsz(uint32_t)),
 	  0, NULL, NULL },
 
 	{ FLDT_DEV, "dev", fp_num, "%#x", SI(bitsz(xfs_dev_t)), 0, NULL, NULL },
@@ -214,7 +214,7 @@ const ftattr_t	ftattrtab[] = {
 	{ FLDT_DINODE_CORE, "dinode_core", NULL, (char *)inode_core_flds,
 	  SI(bitsz(xfs_dinode_t)), 0, NULL, inode_core_flds },
 	{ FLDT_DINODE_FMT, "dinode_fmt", fp_dinode_fmt, NULL,
-	  SI(bitsz(__int8_t)), 0, NULL, NULL },
+	  SI(bitsz(int8_t)), 0, NULL, NULL },
 	{ FLDT_DINODE_U, "dinode_u", NULL, (char *)inode_u_flds, inode_u_size,
 	  FTARG_SIZE|FTARG_OKEMPTY, NULL, inode_u_flds },
 	{ FLDT_DINODE_V3, "dinode_v3", NULL, (char *)inode_v3_flds,
@@ -295,7 +295,7 @@ const ftattr_t	ftattrtab[] = {
 	{ FLDT_DA3_NODE_HDR, "dir_node_hdr", NULL, (char *)da3_node_hdr_flds,
 	  SI(bitsz(struct xfs_da3_node_hdr)), 0, NULL, da3_node_hdr_flds },
 
-	{ FLDT_DIRBLOCK, "dirblock", fp_num, "%u", SI(bitsz(__uint32_t)), 0,
+	{ FLDT_DIRBLOCK, "dirblock", fp_num, "%u", SI(bitsz(uint32_t)), 0,
 	  fa_dirblock, NULL },
 	{ FLDT_DISK_DQUOT, "disk_dquot", NULL, (char *)disk_dquot_flds,
 	  SI(bitsz(xfs_disk_dquot_t)), 0, NULL, disk_dquot_flds },
@@ -335,15 +335,15 @@ const ftattr_t	ftattrtab[] = {
 	  FTARG_SIZE, NULL, inode_crc_flds },
 	{ FLDT_INOFREE, "inofree", fp_num, "%#llx", SI(bitsz(xfs_inofree_t)), 0,
 	  NULL, NULL },
-	{ FLDT_INT16D, "int16d", fp_num, "%d", SI(bitsz(__int16_t)),
+	{ FLDT_INT16D, "int16d", fp_num, "%d", SI(bitsz(int16_t)),
 	  FTARG_SIGNED, NULL, NULL },
-	{ FLDT_INT32D, "int32d", fp_num, "%d", SI(bitsz(__int32_t)),
+	{ FLDT_INT32D, "int32d", fp_num, "%d", SI(bitsz(int32_t)),
 	  FTARG_SIGNED, NULL, NULL },
-	{ FLDT_INT64D, "int64d", fp_num, "%lld", SI(bitsz(__int64_t)),
+	{ FLDT_INT64D, "int64d", fp_num, "%lld", SI(bitsz(int64_t)),
 	  FTARG_SIGNED, NULL, NULL },
-	{ FLDT_INT8D, "int8d", fp_num, "%d", SI(bitsz(__int8_t)), FTARG_SIGNED,
+	{ FLDT_INT8D, "int8d", fp_num, "%d", SI(bitsz(int8_t)), FTARG_SIGNED,
 	  NULL, NULL },
-	{ FLDT_NSEC, "nsec", fp_num, "%09d", SI(bitsz(__int32_t)), FTARG_SIGNED,
+	{ FLDT_NSEC, "nsec", fp_num, "%09d", SI(bitsz(int32_t)), FTARG_SIGNED,
 	  NULL, NULL },
 	{ FLDT_QCNT, "qcnt", fp_num, "%llu", SI(bitsz(xfs_qcnt_t)), 0, NULL,
 	  NULL },
@@ -356,34 +356,34 @@ const ftattr_t	ftattrtab[] = {
 	{ FLDT_SYMLINK_CRC, "symlink", NULL, (char *)symlink_crc_flds,
 	  symlink_size, FTARG_SIZE, NULL, symlink_crc_flds },
 
-	{ FLDT_TIME, "time", fp_time, NULL, SI(bitsz(__int32_t)), FTARG_SIGNED,
+	{ FLDT_TIME, "time", fp_time, NULL, SI(bitsz(int32_t)), FTARG_SIGNED,
 	  NULL, NULL },
 	{ FLDT_TIMESTAMP, "timestamp", NULL, (char *)timestamp_flds,
 	  SI(bitsz(xfs_timestamp_t)), 0, NULL, timestamp_flds },
 	{ FLDT_UINT1, "uint1", fp_num, "%u", SI(1), 0, NULL, NULL },
-	{ FLDT_UINT16D, "uint16d", fp_num, "%u", SI(bitsz(__uint16_t)), 0, NULL,
+	{ FLDT_UINT16D, "uint16d", fp_num, "%u", SI(bitsz(uint16_t)), 0, NULL,
 	  NULL },
-	{ FLDT_UINT16O, "uint16o", fp_num, "%#o", SI(bitsz(__uint16_t)), 0,
+	{ FLDT_UINT16O, "uint16o", fp_num, "%#o", SI(bitsz(uint16_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT16X, "uint16x", fp_num, "%#x", SI(bitsz(__uint16_t)), 0,
+	{ FLDT_UINT16X, "uint16x", fp_num, "%#x", SI(bitsz(uint16_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT32D, "uint32d", fp_num, "%u", SI(bitsz(__uint32_t)), 0, NULL,
+	{ FLDT_UINT32D, "uint32d", fp_num, "%u", SI(bitsz(uint32_t)), 0, NULL,
 	  NULL },
-	{ FLDT_UINT32O, "uint32o", fp_num, "%#o", SI(bitsz(__uint32_t)), 0,
+	{ FLDT_UINT32O, "uint32o", fp_num, "%#o", SI(bitsz(uint32_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT32X, "uint32x", fp_num, "%#x", SI(bitsz(__uint32_t)), 0,
+	{ FLDT_UINT32X, "uint32x", fp_num, "%#x", SI(bitsz(uint32_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT64D, "uint64d", fp_num, "%llu", SI(bitsz(__uint64_t)), 0,
+	{ FLDT_UINT64D, "uint64d", fp_num, "%llu", SI(bitsz(uint64_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT64O, "uint64o", fp_num, "%#llo", SI(bitsz(__uint64_t)), 0,
+	{ FLDT_UINT64O, "uint64o", fp_num, "%#llo", SI(bitsz(uint64_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT64X, "uint64x", fp_num, "%#llx", SI(bitsz(__uint64_t)), 0,
+	{ FLDT_UINT64X, "uint64x", fp_num, "%#llx", SI(bitsz(uint64_t)), 0,
 	  NULL, NULL },
-	{ FLDT_UINT8D, "uint8d", fp_num, "%u", SI(bitsz(__uint8_t)), 0, NULL,
+	{ FLDT_UINT8D, "uint8d", fp_num, "%u", SI(bitsz(uint8_t)), 0, NULL,
 	  NULL },
-	{ FLDT_UINT8O, "uint8o", fp_num, "%#o", SI(bitsz(__uint8_t)), 0, NULL,
+	{ FLDT_UINT8O, "uint8o", fp_num, "%#o", SI(bitsz(uint8_t)), 0, NULL,
 	  NULL },
-	{ FLDT_UINT8X, "uint8x", fp_num, "%#x", SI(bitsz(__uint8_t)), 0, NULL,
+	{ FLDT_UINT8X, "uint8x", fp_num, "%#x", SI(bitsz(uint8_t)), 0, NULL,
 	  NULL },
 	{ FLDT_UUID, "uuid", fp_uuid, NULL, SI(bitsz(uuid_t)), 0, NULL, NULL },
 	{ FLDT_ZZZ, NULL }
diff --git a/db/fprint.c b/db/fprint.c
index fd7e7f4..261a31e 100644
--- a/db/fprint.c
+++ b/db/fprint.c
@@ -80,7 +80,7 @@ fp_num(
 	int		bitpos;
 	int		i;
 	int		isnull;
-	__int64_t	val;
+	int64_t		val;
 
 	for (i = 0, bitpos = bit;
 	     i < count && !seenint();
@@ -100,7 +100,7 @@ fp_num(
 		else if (size > 32)
 			dbprintf(fmtstr, val);
 		else
-			dbprintf(fmtstr, (__int32_t)val);
+			dbprintf(fmtstr, (int32_t)val);
 		if (i < count - 1)
 			dbprintf(" ");
 	}
@@ -203,7 +203,7 @@ fp_crc(
 {
 	int		bitpos;
 	int		i;
-	__int64_t	val;
+	int64_t		val;
 	char		*ok;
 
 	switch (iocur_crc_valid()) {
@@ -230,7 +230,7 @@ fp_crc(
 		if (size > 32)
 			dbprintf(fmtstr, val, ok);
 		else
-			dbprintf(fmtstr, (__int32_t)val, ok);
+			dbprintf(fmtstr, (int32_t)val, ok);
 		if (i < count - 1)
 			dbprintf(" ");
 	}
diff --git a/db/frag.c b/db/frag.c
index 8005e45..d224f0c 100644
--- a/db/frag.c
+++ b/db/frag.c
@@ -42,8 +42,8 @@ typedef	struct extmap {
 
 static int		aflag;
 static int		dflag;
-static __uint64_t	extcount_actual;
-static __uint64_t	extcount_ideal;
+static uint64_t	extcount_actual;
+static uint64_t	extcount_ideal;
 static int		fflag;
 static int		lflag;
 static int		qflag;
@@ -310,8 +310,8 @@ process_inode(
 	xfs_agino_t		agino,
 	xfs_dinode_t		*dip)
 {
-	__uint64_t		actual;
-	__uint64_t		ideal;
+	uint64_t		actual;
+	uint64_t		ideal;
 	xfs_ino_t		ino;
 	int			skipa;
 	int			skipd;
diff --git a/db/inode.c b/db/inode.c
index 8b7a41e..7538ee0 100644
--- a/db/inode.c
+++ b/db/inode.c
@@ -119,49 +119,49 @@ const field_t	inode_core_flds[] = {
 	{ "dmstate", FLDT_UINT16D, OI(COFF(dmstate)), C1, 0, TYP_NONE },
 	{ "flags", FLDT_UINT16X, OI(COFF(flags)), C1, FLD_SKIPALL, TYP_NONE },
 	{ "newrtbm", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_NEWRTBM_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NEWRTBM_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "prealloc", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_PREALLOC_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_PREALLOC_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "realtime", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_REALTIME_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_REALTIME_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "immutable", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_IMMUTABLE_BIT-1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_IMMUTABLE_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "append", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_APPEND_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_APPEND_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "sync", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_SYNC_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_SYNC_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "noatime", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_NOATIME_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NOATIME_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "nodump", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_NODUMP_BIT - 1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NODUMP_BIT - 1), C1,
 	  0, TYP_NONE },
 	{ "rtinherit", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_RTINHERIT_BIT-1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_RTINHERIT_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "projinherit", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_PROJINHERIT_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_PROJINHERIT_BIT-1),C1,
 	  0, TYP_NONE },
 	{ "nosymlinks", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_NOSYMLINKS_BIT-1), C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NOSYMLINKS_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "extsz", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_EXTSIZE_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSIZE_BIT-1),C1,
 	  0, TYP_NONE },
 	{ "extszinherit", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_EXTSZINHERIT_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSZINHERIT_BIT-1),C1,
 	  0, TYP_NONE },
 	{ "nodefrag", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_NODEFRAG_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NODEFRAG_BIT-1),C1,
 	  0, TYP_NONE },
 	{ "filestream", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1),C1,
 	  0, TYP_NONE },
 	{ "gen", FLDT_UINT32D, OI(COFF(gen)), C1, 0, TYP_NONE },
 	{ NULL }
@@ -177,10 +177,10 @@ const field_t	inode_v3_flds[] = {
 	{ "inumber", FLDT_INO, OI(COFF(ino)), C1, 0, TYP_NONE },
 	{ "uuid", FLDT_UUID, OI(COFF(uuid)), C1, 0, TYP_NONE },
 	{ "reflink", FLDT_UINT1,
-	  OI(COFF(flags2) + bitsz(__uint64_t) - XFS_DIFLAG2_REFLINK_BIT-1), C1,
+	  OI(COFF(flags2) + bitsz(uint64_t) - XFS_DIFLAG2_REFLINK_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "cowextsz", FLDT_UINT1,
-	  OI(COFF(flags2) + bitsz(__uint64_t) - XFS_DIFLAG2_COWEXTSIZE_BIT-1), C1,
+	  OI(COFF(flags2) + bitsz(uint64_t) - XFS_DIFLAG2_COWEXTSIZE_BIT-1), C1,
 	  0, TYP_NONE },
 	{ NULL }
 };
diff --git a/db/io.c b/db/io.c
index 1f27f6b..fd9b9f4 100644
--- a/db/io.c
+++ b/db/io.c
@@ -545,7 +545,7 @@ set_cur(
 	struct xfs_buf	*bp;
 	xfs_ino_t	dirino;
 	xfs_ino_t	ino;
-	__uint16_t	mode;
+	uint16_t	mode;
 	const struct xfs_buf_ops *ops = type ? type->bops : NULL;
 
 	if (iocur_sp < 0) {
diff --git a/db/io.h b/db/io.h
index 9973004..df0fdd7 100644
--- a/db/io.h
+++ b/db/io.h
@@ -25,7 +25,7 @@ typedef struct bbmap {
 } bbmap_t;
 
 typedef struct iocur {
-	__int64_t		bb;	/* BB number in filesystem of buf */
+	int64_t			bb;	/* BB number in filesystem of buf */
 	int			blen;	/* length of "buf", bb's */
 	int			boff;	/* data - buf */
 	void			*buf;	/* base address of buffer */
@@ -33,7 +33,7 @@ typedef struct iocur {
 	xfs_ino_t		dirino;	/* current directory inode number */
 	xfs_ino_t		ino;	/* current inode number */
 	int			len;	/* length of "data", bytes */
-	__uint16_t		mode;	/* current inode's mode */
+	uint16_t		mode;	/* current inode's mode */
 	xfs_off_t		off;	/* fs offset of "data" in bytes */
 	const struct typ	*typ;	/* type of "data" */
 	bbmap_t			*bbmap;	/* map daddr if fragmented */
@@ -57,7 +57,7 @@ extern void	off_cur(int off, int len);
 extern void	pop_cur(void);
 extern void	print_iocur(char *tag, iocur_t *ioc);
 extern void	push_cur(void);
-extern int	read_buf(__int64_t daddr, int count, void *bufp);
+extern int	read_buf(int64_t daddr, int count, void *bufp);
 extern void     write_cur(void);
 extern void	set_cur(const struct typ *type, xfs_daddr_t blknum,
 			int len, int ring_add, bbmap_t *bbmap);
diff --git a/db/metadump.c b/db/metadump.c
index 96641e0..be2e712 100644
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -175,7 +175,7 @@ write_index(void)
 static int
 write_buf_segment(
 	char		*data,
-	__int64_t	off,
+	int64_t		off,
 	int		len)
 {
 	int		i;
@@ -1256,7 +1256,7 @@ process_sf_dir(
 {
 	struct xfs_dir2_sf_hdr	*sfp;
 	xfs_dir2_sf_entry_t	*sfep;
-	__uint64_t		ino_dir_size;
+	uint64_t		ino_dir_size;
 	int			i;
 
 	sfp = (struct xfs_dir2_sf_hdr *)XFS_DFORK_DPTR(dip);
@@ -1322,7 +1322,7 @@ process_sf_dir(
 static void
 obfuscate_path_components(
 	char			*buf,
-	__uint64_t		len)
+	uint64_t		len)
 {
 	unsigned char		*comp = (unsigned char *)buf;
 	unsigned char		*end = comp + len;
@@ -1359,7 +1359,7 @@ static void
 process_sf_symlink(
 	xfs_dinode_t		*dip)
 {
-	__uint64_t		len;
+	uint64_t		len;
 	char			*buf;
 
 	len = be64_to_cpu(dip->di_size);
@@ -1631,7 +1631,7 @@ process_attr_block(
 	xfs_attr_leaf_entry_t 		*entry;
 	xfs_attr_leaf_name_local_t 	*local;
 	xfs_attr_leaf_name_remote_t 	*remote;
-	__uint32_t			bs = mp->m_sb.sb_blocksize;
+	uint32_t			bs = mp->m_sb.sb_blocksize;
 	char				*first_name;
 
 
@@ -2270,7 +2270,7 @@ process_inode(
 	return success;
 }
 
-static __uint32_t	inodes_copied = 0;
+static uint32_t	inodes_copied = 0;
 
 static int
 copy_inode_chunk(
diff --git a/db/sb.c b/db/sb.c
index 8e7722c..f19248d 100644
--- a/db/sb.c
+++ b/db/sb.c
@@ -606,7 +606,7 @@ version_help(void)
 }
 
 static int
-do_version(xfs_agnumber_t agno, __uint16_t version, __uint32_t features)
+do_version(xfs_agnumber_t agno, uint16_t version, uint32_t features)
 {
 	xfs_sb_t	tsb;
 
@@ -710,8 +710,8 @@ version_f(
 	int		argc,
 	char		**argv)
 {
-	__uint16_t	version = 0;
-	__uint32_t	features = 0;
+	uint16_t	version = 0;
+	uint32_t	features = 0;
 	xfs_agnumber_t	ag;
 
 	if (argc == 2) {	/* WRITE VERSION */
diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
index 517b75f..d4846a3 100644
--- a/fsr/xfs_fsr.c
+++ b/fsr/xfs_fsr.c
@@ -54,7 +54,7 @@ struct getbmap  *outmap = NULL;
 int             outmap_size = 0;
 int		RealUid;
 int		tmp_agi;
-static __int64_t	minimumfree = 2048;
+static int64_t		minimumfree = 2048;
 
 #define MNTTYPE_XFS             "xfs"
 
diff --git a/include/darwin.h b/include/darwin.h
index 7bbd576..51031c4 100644
--- a/include/darwin.h
+++ b/include/darwin.h
@@ -125,15 +125,15 @@ typedef signed int		__s32;
 typedef unsigned long long int	__u64;
 typedef signed long long int	__s64;
 
-#define __int8_t	int8_t
-#define __int16_t	int16_t
-#define __int32_t	int32_t
-#define __int32_t	int32_t
-#define __int64_t	int64_t
-#define __uint8_t	u_int8_t
-#define __uint16_t	u_int16_t
-#define __uint32_t	u_int32_t
-#define __uint64_t	u_int64_t
+#define int8_t		int8_t
+#define int16_t		int16_t
+#define int32_t		int32_t
+#define int32_t		int32_t
+#define int64_t		int64_t
+#define uint8_t		u_int8_t
+#define uint16_t	u_int16_t
+#define uint32_t	u_int32_t
+#define uint64_t	u_int64_t
 
 typedef off_t		xfs_off_t;
 typedef u_int64_t	xfs_ino_t;
diff --git a/include/freebsd.h b/include/freebsd.h
index fb318b8..f52ed0a 100644
--- a/include/freebsd.h
+++ b/include/freebsd.h
@@ -50,9 +50,9 @@ typedef unsigned long long int	__u64;
 typedef signed long long int	__s64;
 
 typedef off_t		xfs_off_t;
-typedef __uint64_t	xfs_ino_t;
-typedef __uint32_t	xfs_dev_t;
-typedef __int64_t	xfs_daddr_t;
+typedef uint64_t	xfs_ino_t;
+typedef uint32_t	xfs_dev_t;
+typedef int64_t		xfs_daddr_t;
 typedef __u32		xfs_nlink_t;
 
 #define	O_LARGEFILE	0
diff --git a/include/gnukfreebsd.h b/include/gnukfreebsd.h
index 6916e65..1db3f4f 100644
--- a/include/gnukfreebsd.h
+++ b/include/gnukfreebsd.h
@@ -46,9 +46,9 @@ typedef unsigned long long int	__u64;
 typedef signed long long int	__s64;
 
 typedef off_t		xfs_off_t;
-typedef __uint64_t	xfs_ino_t;
-typedef __uint32_t	xfs_dev_t;
-typedef __int64_t	xfs_daddr_t;
+typedef uint64_t	xfs_ino_t;
+typedef uint32_t	xfs_dev_t;
+typedef int64_t		xfs_daddr_t;
 typedef __u32		xfs_nlink_t;
 
 #define HAVE_FID	1
diff --git a/include/libxcmd.h b/include/libxcmd.h
index e8d2ffc..6806380 100644
--- a/include/libxcmd.h
+++ b/include/libxcmd.h
@@ -42,10 +42,10 @@ get_topology(
 extern void
 calc_default_ag_geometry(
 	int		blocklog,
-	__uint64_t	dblocks,
+	uint64_t	dblocks,
 	int		multidisk,
-	__uint64_t	*agsize,
-	__uint64_t	*agcount);
+	uint64_t	*agsize,
+	uint64_t	*agcount);
 
 extern int
 check_overwrite(
diff --git a/include/linux.h b/include/linux.h
index 9611a37..6ce344c 100644
--- a/include/linux.h
+++ b/include/linux.h
@@ -132,7 +132,7 @@ static __inline__ void platform_uuid_copy(uuid_t *dst, uuid_t *src)
 static __inline__ int
 platform_discard_blocks(int fd, uint64_t start, uint64_t len)
 {
-	__uint64_t range[2] = { start, len };
+	uint64_t range[2] = { start, len };
 
 	if (ioctl(fd, BLKDISCARD, &range) < 0)
 		return errno;
@@ -144,9 +144,9 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len)
 #define EFSBADCRC	EBADMSG	/* Bad CRC detected */
 
 typedef off_t		xfs_off_t;
-typedef __uint64_t	xfs_ino_t;
-typedef __uint32_t	xfs_dev_t;
-typedef __int64_t	xfs_daddr_t;
+typedef uint64_t	xfs_ino_t;
+typedef uint32_t	xfs_dev_t;
+typedef int64_t		xfs_daddr_t;
 typedef __u32		xfs_nlink_t;
 
 /**
diff --git a/include/xfs_arch.h b/include/xfs_arch.h
index 12cd43e..186cadb 100644
--- a/include/xfs_arch.h
+++ b/include/xfs_arch.h
@@ -244,39 +244,39 @@ static inline void be64_add_cpu(__be64 *a, __s64 b)
 	*a = cpu_to_be64(be64_to_cpu(*a) + b);
 }
 
-static inline __uint16_t get_unaligned_be16(void *p)
+static inline uint16_t get_unaligned_be16(void *p)
 {
-	__uint8_t *__p = p;
+	uint8_t *__p = p;
 	return __p[0] << 8 | __p[1];
 }
 
-static inline __uint32_t get_unaligned_be32(void *p)
+static inline uint32_t get_unaligned_be32(void *p)
 {
-	__uint8_t *__p = p;
+	uint8_t *__p = p;
         return __p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3];
 }
 
-static inline __uint64_t get_unaligned_be64(void *p)
+static inline uint64_t get_unaligned_be64(void *p)
 {
-	return (__uint64_t)get_unaligned_be32(p) << 32 |
+	return (uint64_t)get_unaligned_be32(p) << 32 |
 			   get_unaligned_be32(p + 4);
 }
 
-static inline void put_unaligned_be16(__uint16_t val, void *p)
+static inline void put_unaligned_be16(uint16_t val, void *p)
 {
-	__uint8_t *__p = p;
+	uint8_t *__p = p;
 	*__p++ = val >> 8;
 	*__p++ = val;
 }
 
-static inline void put_unaligned_be32(__uint32_t val, void *p)
+static inline void put_unaligned_be32(uint32_t val, void *p)
 {
-	__uint8_t *__p = p;
+	uint8_t *__p = p;
 	put_unaligned_be16(val >> 16, __p);
 	put_unaligned_be16(val, __p + 2);
 }
 
-static inline void put_unaligned_be64(__uint64_t val, void *p)
+static inline void put_unaligned_be64(uint64_t val, void *p)
 {
 	put_unaligned_be32(val >> 32, p);
 	put_unaligned_be32(val, p + 4);
diff --git a/include/xfs_inode.h b/include/xfs_inode.h
index fb6b542..8766024 100644
--- a/include/xfs_inode.h
+++ b/include/xfs_inode.h
@@ -123,8 +123,8 @@ xfs_get_projid(struct xfs_icdinode *id)
 static inline void
 xfs_set_projid(struct xfs_icdinode *id, prid_t projid)
 {
-	id->di_projid_hi = (__uint16_t) (projid >> 16);
-	id->di_projid_lo = (__uint16_t) (projid & 0xffff);
+	id->di_projid_hi = (uint16_t) (projid >> 16);
+	id->di_projid_lo = (uint16_t) (projid & 0xffff);
 }
 
 static inline bool xfs_is_reflink_inode(struct xfs_inode *ip)
diff --git a/include/xfs_log_recover.h b/include/xfs_log_recover.h
index 7582676..0d09862 100644
--- a/include/xfs_log_recover.h
+++ b/include/xfs_log_recover.h
@@ -26,7 +26,7 @@
 #define XLOG_RHASH_SIZE	16
 #define XLOG_RHASH_SHIFT 2
 #define XLOG_RHASH(tid)	\
-	((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1))
+	((((uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1))
 
 #define XLOG_MAX_REGIONS_IN_ITEM   (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1)
 
diff --git a/include/xfs_metadump.h b/include/xfs_metadump.h
index 7f3039e..13afb8d 100644
--- a/include/xfs_metadump.h
+++ b/include/xfs_metadump.h
@@ -24,8 +24,8 @@
 typedef struct xfs_metablock {
 	__be32		mb_magic;
 	__be16		mb_count;
-	__uint8_t	mb_blocklog;
-	__uint8_t	mb_info;
+	uint8_t		mb_blocklog;
+	uint8_t		mb_info;
 	/* followed by an array of xfs_daddr_t */
 } xfs_metablock_t;
 
diff --git a/include/xfs_mount.h b/include/xfs_mount.h
index 5ff24eb..5b323bb 100644
--- a/include/xfs_mount.h
+++ b/include/xfs_mount.h
@@ -48,12 +48,12 @@ typedef struct xfs_mount {
 #define m_dev		m_ddev_targp
 #define m_logdev	m_logdev_targp
 #define m_rtdev		m_rtdev_targp
-	__uint8_t		m_dircook_elog;	/* log d-cookie entry bits */
-	__uint8_t		m_blkbit_log;	/* blocklog + NBBY */
-	__uint8_t		m_blkbb_log;	/* blocklog - BBSHIFT */
-	__uint8_t		m_sectbb_log;	/* sectorlog - BBSHIFT */
-	__uint8_t		m_agno_log;	/* log #ag's */
-	__uint8_t		m_agino_log;	/* #bits for agino in inum */
+	uint8_t			m_dircook_elog;	/* log d-cookie entry bits */
+	uint8_t			m_blkbit_log;	/* blocklog + NBBY */
+	uint8_t			m_blkbb_log;	/* blocklog - BBSHIFT */
+	uint8_t			m_sectbb_log;	/* sectorlog - BBSHIFT */
+	uint8_t			m_agno_log;	/* log #ag's */
+	uint8_t			m_agino_log;	/* #bits for agino in inum */
 	uint			m_inode_cluster_size;/* min inode buf size */
 	uint			m_blockmask;	/* sb_blocksize-1 */
 	uint			m_blockwsize;	/* sb_blocksize in words */
@@ -88,7 +88,7 @@ typedef struct xfs_mount {
 	int			m_litino;	/* size of inode union area */
 	int			m_inoalign_mask;/* mask sb_inoalignmt if used */
 	struct xfs_trans_resv	m_resv;		/* precomputed res values */
-	__uint64_t		m_maxicount;	/* maximum inode count */
+	uint64_t		m_maxicount;	/* maximum inode count */
 	int			m_dalign;	/* stripe unit */
 	int			m_swidth;	/* stripe width */
 	int			m_sinoalign;	/* stripe unit inode alignmnt */
@@ -144,12 +144,12 @@ typedef struct xfs_perag {
 	char		pagi_init;	/* this agi's entry is initialized */
 	char		pagf_metadata;	/* the agf is preferred to be metadata */
 	char		pagi_inodeok;	/* The agi is ok for inodes */
-	__uint8_t	pagf_levels[XFS_BTNUM_AGF];
+	uint8_t		pagf_levels[XFS_BTNUM_AGF];
 					/* # of levels in bno & cnt btree */
-	__uint32_t	pagf_flcount;	/* count of blocks in freelist */
+	uint32_t	pagf_flcount;	/* count of blocks in freelist */
 	xfs_extlen_t	pagf_freeblks;	/* total free blocks */
 	xfs_extlen_t	pagf_longest;	/* longest free space */
-	__uint32_t	pagf_btreeblks;	/* # of blocks held in AGF btrees */
+	uint32_t	pagf_btreeblks;	/* # of blocks held in AGF btrees */
 	xfs_agino_t	pagi_freecount;	/* number of free inodes */
 	xfs_agino_t	pagi_count;	/* number of allocated inodes */
 
@@ -169,7 +169,7 @@ typedef struct xfs_perag {
 	struct xfs_ag_resv	pag_agfl_resv;
 
 	/* reference count */
-	__uint8_t	pagf_refcount_level;
+	uint8_t		pagf_refcount_level;
 } xfs_perag_t;
 
 static inline struct xfs_ag_resv *
diff --git a/libhandle/handle.c b/libhandle/handle.c
index 236ed22..00127b3 100644
--- a/libhandle/handle.c
+++ b/libhandle/handle.c
@@ -232,7 +232,7 @@ obj_to_handle(
 {
 	char		hbuf [MAXHANSIZ];
 	int		ret;
-	__uint32_t	handlen;
+	uint32_t	handlen;
 	xfs_fsop_handlereq_t hreq;
 
 	if (opcode == XFS_IOC_FD_TO_HANDLE) {
diff --git a/libhandle/jdm.c b/libhandle/jdm.c
index e52f5d8..821061b 100644
--- a/libhandle/jdm.c
+++ b/libhandle/jdm.c
@@ -36,7 +36,7 @@ typedef struct filehandle {
 	fshandle_t fh_fshandle;		/* handle of fs containing this inode */
 	int16_t fh_sz_following;	/* bytes in handle after this member */
 	char fh_pad[FILEHANDLE_SZ_PAD];	/* padding, must be zeroed */
-	__uint32_t fh_gen;		/* generation count */
+	uint32_t fh_gen;		/* generation count */
 	xfs_ino_t fh_ino;		/* 64 bit ino */
 } filehandle_t;
 
diff --git a/libxcmd/topology.c b/libxcmd/topology.c
index 8b0276a..f66dd1b 100644
--- a/libxcmd/topology.c
+++ b/libxcmd/topology.c
@@ -23,19 +23,19 @@
 #endif /* ENABLE_BLKID */
 #include "xfs_multidisk.h"
 
-#define TERABYTES(count, blog)	((__uint64_t)(count) << (40 - (blog)))
-#define GIGABYTES(count, blog)	((__uint64_t)(count) << (30 - (blog)))
-#define MEGABYTES(count, blog)	((__uint64_t)(count) << (20 - (blog)))
+#define TERABYTES(count, blog)	((uint64_t)(count) << (40 - (blog)))
+#define GIGABYTES(count, blog)	((uint64_t)(count) << (30 - (blog)))
+#define MEGABYTES(count, blog)	((uint64_t)(count) << (20 - (blog)))
 
 void
 calc_default_ag_geometry(
 	int		blocklog,
-	__uint64_t	dblocks,
+	uint64_t	dblocks,
 	int		multidisk,
-	__uint64_t	*agsize,
-	__uint64_t	*agcount)
+	uint64_t	*agsize,
+	uint64_t	*agcount)
 {
-	__uint64_t	blocks = 0;
+	uint64_t	blocks = 0;
 	int		shift = 0;
 
 	/*
diff --git a/libxfs/darwin.c b/libxfs/darwin.c
index 74507e8..16d2c35 100644
--- a/libxfs/darwin.c
+++ b/libxfs/darwin.c
@@ -68,7 +68,7 @@ platform_flush_device(int fd, dev_t device)
 void
 platform_findsizes(char *path, int fd, long long *sz, int *bsz)
 {
-	__uint64_t	size;
+	uint64_t	size;
 	struct stat	st;
 
 	if (fstat(fd, &st) < 0) {
diff --git a/libxfs/freebsd.c b/libxfs/freebsd.c
index 4667d1f..d7bca14 100644
--- a/libxfs/freebsd.c
+++ b/libxfs/freebsd.c
@@ -109,7 +109,7 @@ void
 platform_findsizes(char *path, int fd, long long *sz, int *bsz)
 {
 	struct stat	st;
-	__int64_t	size;
+	int64_t		size;
 	u_int		ssize;
 
 	if (fstat(fd, &st) < 0) {
diff --git a/libxfs/init.c b/libxfs/init.c
index fc14c5e..0f41a85 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -546,7 +546,7 @@ libxfs_initialize_perag(
 		 * the max inode percentage.
 		 */
 		if (mp->m_maxicount) {
-			__uint64_t	icount;
+			uint64_t	icount;
 
 			icount = sbp->sb_dblocks * sbp->sb_imax_pct;
 			do_div(icount, 100);
diff --git a/libxfs/irix.c b/libxfs/irix.c
index 32fcb3e..0f14aec 100644
--- a/libxfs/irix.c
+++ b/libxfs/irix.c
@@ -22,7 +22,7 @@
 
 int platform_has_uuid = 0;
 extern char *progname;
-extern __int64_t findsize(char *);
+extern int64_t findsize(char *);
 
 int
 platform_check_ismounted(char *name, char *block, struct stat *s, int verbose)
diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h
index b4f766d..d525b66 100644
--- a/libxfs/libxfs_priv.h
+++ b/libxfs/libxfs_priv.h
@@ -296,8 +296,8 @@ roundup_pow_of_two(uint v)
 	return 0;
 }
 
-static inline __uint64_t
-roundup_64(__uint64_t x, __uint32_t y)
+static inline uint64_t
+roundup_64(uint64_t x, uint32_t y)
 {
 	x += y - 1;
 	do_div(x, y);
diff --git a/libxfs/linux.c b/libxfs/linux.c
index 69f04ad..0bace3e 100644
--- a/libxfs/linux.c
+++ b/libxfs/linux.c
@@ -163,7 +163,7 @@ void
 platform_findsizes(char *path, int fd, long long *sz, int *bsz)
 {
 	struct stat	st;
-	__uint64_t	size;
+	uint64_t	size;
 	int		error;
 
 	if (fstat(fd, &st) < 0) {
diff --git a/libxfs/logitem.c b/libxfs/logitem.c
index 7e93f60..466b442 100644
--- a/libxfs/logitem.c
+++ b/libxfs/logitem.c
@@ -121,7 +121,7 @@ xfs_buf_item_init(
 	bip->bli_item.li_mountp = mp;
 	bip->bli_buf = bp;
 	bip->bli_format.blf_type = XFS_LI_BUF;
-	bip->bli_format.blf_blkno = (__int64_t)XFS_BUF_ADDR(bp);
+	bip->bli_format.blf_blkno = (int64_t)XFS_BUF_ADDR(bp);
 	bip->bli_format.blf_len = (unsigned short)BTOBB(XFS_BUF_COUNT(bp));
 	XFS_BUF_SET_FSPRIVATE(bp, bip);
 }
diff --git a/libxfs/radix-tree.c b/libxfs/radix-tree.c
index eef9c36..3f0257f 100644
--- a/libxfs/radix-tree.c
+++ b/libxfs/radix-tree.c
@@ -66,21 +66,21 @@ static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH];
 static inline void tag_set(struct radix_tree_node *node, unsigned int tag,
 		int offset)
 {
-	*((__uint32_t *)node->tags[tag] + (offset >> 5)) |= (1 << (offset & 31));
+	*((uint32_t *)node->tags[tag] + (offset >> 5)) |= (1 << (offset & 31));
 }
 
 static inline void tag_clear(struct radix_tree_node *node, unsigned int tag,
 		int offset)
 {
-	__uint32_t 	*p = (__uint32_t*)node->tags[tag] + (offset >> 5);
-	__uint32_t 	m = 1 << (offset & 31);
+	uint32_t 	*p = (uint32_t*)node->tags[tag] + (offset >> 5);
+	uint32_t 	m = 1 << (offset & 31);
 	*p &= ~m;
 }
 
 static inline int tag_get(struct radix_tree_node *node, unsigned int tag,
 		int offset)
 {
-	return 1 & (((const __uint32_t *)node->tags[tag])[offset >> 5] >> (offset & 31));
+	return 1 & (((const uint32_t *)node->tags[tag])[offset >> 5] >> (offset & 31));
 }
 
 /*
diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
index 6c8a192..43b4f1d 100644
--- a/libxfs/rdwr.c
+++ b/libxfs/rdwr.c
@@ -118,9 +118,9 @@ static void unmount_record(void *p)
 	xlog_op_header_t	*op = (xlog_op_header_t *)p;
 	/* the data section must be 32 bit size aligned */
 	struct {
-	    __uint16_t magic;
-	    __uint16_t pad1;
-	    __uint32_t pad2; /* may as well make it 64 bits */
+	    uint16_t magic;
+	    uint16_t pad1;
+	    uint32_t pad2; /* may as well make it 64 bits */
 	} magic = { XLOG_UNMOUNT_TYPE, 0, 0 };
 
 	memset(p, 0, BBSIZE);
diff --git a/libxfs/util.c b/libxfs/util.c
index dcfca39..7938e31 100644
--- a/libxfs/util.c
+++ b/libxfs/util.c
@@ -170,8 +170,8 @@ libxfs_trans_ichgtime(
 	if (flags & XFS_ICHGTIME_CHG)
 		VFS_I(ip)->i_ctime = tv;
 	if (flags & XFS_ICHGTIME_CREATE) {
-		ip->i_d.di_crtime.t_sec = (__int32_t)tv.tv_sec;
-		ip->i_d.di_crtime.t_nsec = (__int32_t)tv.tv_nsec;
+		ip->i_d.di_crtime.t_sec = (int32_t)tv.tv_sec;
+		ip->i_d.di_crtime.t_nsec = (int32_t)tv.tv_nsec;
 	}
 }
 
@@ -261,8 +261,8 @@ libxfs_ialloc(
 		ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid));
 		VFS_I(ip)->i_version = 1;
 		ip->i_d.di_flags2 = 0;
-		ip->i_d.di_crtime.t_sec = (__int32_t)VFS_I(ip)->i_mtime.tv_sec;
-		ip->i_d.di_crtime.t_nsec = (__int32_t)VFS_I(ip)->i_mtime.tv_nsec;
+		ip->i_d.di_crtime.t_sec = (int32_t)VFS_I(ip)->i_mtime.tv_sec;
+		ip->i_d.di_crtime.t_nsec = (int32_t)VFS_I(ip)->i_mtime.tv_nsec;
 	}
 
 	flags = XFS_ILOG_CORE;
diff --git a/logprint/log_misc.c b/logprint/log_misc.c
index 0dfcfd1..fe27f15 100644
--- a/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -166,12 +166,12 @@ xlog_print_trans_header(char **ptr, int len)
 {
     xfs_trans_header_t  *h;
     char		*cptr = *ptr;
-    __uint32_t          magic;
+    uint32_t          magic;
     char                *magic_c = (char *)&magic;
 
     *ptr += len;
 
-    magic=*(__uint32_t*)cptr; /* XXX be32_to_cpu soon */
+    magic=*(uint32_t*)cptr; /* XXX be32_to_cpu soon */
 
     if (len >= 4) {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -201,7 +201,7 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int num_ops)
     int			 num, skip;
     int			 super_block = 0;
     int			 bucket, col, buckets;
-    __int64_t		 blkno;
+    int64_t			 blkno;
     xfs_buf_log_format_t lbuf;
     int			 size, blen, map_size, struct_size;
     __be64		 x, y;
diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c
index 9d1b4e8..c49c13a 100644
--- a/mdrestore/xfs_mdrestore.c
+++ b/mdrestore/xfs_mdrestore.c
@@ -66,7 +66,7 @@ perform_restore(
 	int			mb_count;
 	xfs_metablock_t		tmb;
 	xfs_sb_t		sb;
-	__int64_t		bytes_read;
+	int64_t			bytes_read;
 
 	/*
 	 * read in first blocks (superblock 0), set "inprogress" flag for it,
diff --git a/mkfs/proto.c b/mkfs/proto.c
index 89cd237..cf8cc39 100644
--- a/mkfs/proto.c
+++ b/mkfs/proto.c
@@ -667,7 +667,7 @@ rtinit(
 	mp->m_sb.sb_rbmino = rbmip->i_ino;
 	rbmip->i_d.di_size = mp->m_sb.sb_rbmblocks * mp->m_sb.sb_blocksize;
 	rbmip->i_d.di_flags = XFS_DIFLAG_NEWRTBM;
-	*(__uint64_t *)&VFS_I(rbmip)->i_atime = 0;
+	*(uint64_t *)&VFS_I(rbmip)->i_atime = 0;
 	libxfs_trans_log_inode(tp, rbmip, XFS_ILOG_CORE);
 	libxfs_log_sb(tp);
 	mp->m_rbmip = rbmip;
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index b5c3a57..7bb6408 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -705,9 +705,9 @@ struct opt_params mopts = {
 	},
 };
 
-#define TERABYTES(count, blog)	((__uint64_t)(count) << (40 - (blog)))
-#define GIGABYTES(count, blog)	((__uint64_t)(count) << (30 - (blog)))
-#define MEGABYTES(count, blog)	((__uint64_t)(count) << (20 - (blog)))
+#define TERABYTES(count, blog)	((uint64_t)(count) << (40 - (blog)))
+#define GIGABYTES(count, blog)	((uint64_t)(count) << (30 - (blog)))
+#define MEGABYTES(count, blog)	((uint64_t)(count) << (20 - (blog)))
 
 /*
  * Use this macro before we have superblock and mount structure
@@ -878,7 +878,7 @@ fixup_log_stripe_unit(
 	xfs_rfsblock_t	*logblocks,
 	int		blocklog)
 {
-	__uint64_t	tmp_logblocks;
+	uint64_t	tmp_logblocks;
 
 	/*
 	 * Make sure that the log size is a multiple of the stripe unit
@@ -910,7 +910,7 @@ fixup_internal_log_stripe(
 	xfs_mount_t	*mp,
 	int		lsflag,
 	xfs_fsblock_t	logstart,
-	__uint64_t	agsize,
+	uint64_t	agsize,
 	int		sunit,
 	xfs_rfsblock_t	*logblocks,
 	int		blocklog,
@@ -934,7 +934,7 @@ fixup_internal_log_stripe(
 }
 
 void
-validate_log_size(__uint64_t logblocks, int blocklog, int min_logblocks)
+validate_log_size(uint64_t logblocks, int blocklog, int min_logblocks)
 {
 	if (logblocks < min_logblocks) {
 		fprintf(stderr,
@@ -959,7 +959,7 @@ validate_log_size(__uint64_t logblocks, int blocklog, int min_logblocks)
 static int
 calc_default_imaxpct(
 	int		blocklog,
-	__uint64_t	dblocks)
+	uint64_t	dblocks)
 {
 	/*
 	 * This returns the % of the disk space that is used for
@@ -981,9 +981,9 @@ calc_default_imaxpct(
 static void
 validate_ag_geometry(
 	int		blocklog,
-	__uint64_t	dblocks,
-	__uint64_t	agsize,
-	__uint64_t	agcount)
+	uint64_t	dblocks,
+	uint64_t	agsize,
+	uint64_t	agcount)
 {
 	if (agsize < XFS_AG_MIN_BLOCKS(blocklog)) {
 		fprintf(stderr,
@@ -1059,7 +1059,7 @@ zero_old_xfs_structures(
 {
 	void 			*buf;
 	xfs_sb_t 		sb;
-	__uint32_t		bsize;
+	uint32_t		bsize;
 	int			i;
 	xfs_off_t		off;
 
@@ -1112,8 +1112,8 @@ zero_old_xfs_structures(
 			i != sb.sb_blocklog)
 		goto done;
 
-	if (sb.sb_dblocks > ((__uint64_t)sb.sb_agcount * sb.sb_agblocks) ||
-			sb.sb_dblocks < ((__uint64_t)(sb.sb_agcount - 1) *
+	if (sb.sb_dblocks > ((uint64_t)sb.sb_agcount * sb.sb_agblocks) ||
+			sb.sb_dblocks < ((uint64_t)(sb.sb_agcount - 1) *
 					 sb.sb_agblocks + XFS_MIN_AG_BLOCKS))
 		goto done;
 
@@ -1133,7 +1133,7 @@ zero_old_xfs_structures(
 }
 
 static void
-discard_blocks(dev_t dev, __uint64_t nsectors)
+discard_blocks(dev_t dev, uint64_t nsectors)
 {
 	int fd;
 
@@ -1395,11 +1395,11 @@ main(
 	int			argc,
 	char			**argv)
 {
-	__uint64_t		agcount;
+	uint64_t		agcount;
 	xfs_agf_t		*agf;
 	xfs_agi_t		*agi;
 	xfs_agnumber_t		agno;
-	__uint64_t		agsize;
+	uint64_t		agsize;
 	xfs_alloc_rec_t		*arec;
 	struct xfs_btree_block	*block;
 	int			blflag;
@@ -1475,10 +1475,10 @@ main(
 	char			*rtsize;
 	xfs_sb_t		*sbp;
 	int			sectorlog;
-	__uint64_t		sector_mask;
+	uint64_t		sector_mask;
 	int			slflag;
 	int			ssflag;
-	__uint64_t		tmp_agsize;
+	uint64_t		tmp_agsize;
 	uuid_t			uuid;
 	int			worst_freelist;
 	libxfs_init_t		xi;
@@ -2167,7 +2167,7 @@ _("rmapbt not supported with realtime devices\n"));
 
 
 	if (dsize) {
-		__uint64_t dbytes;
+		uint64_t dbytes;
 
 		dbytes = getnum(dsize, &dopts, D_SIZE);
 		if (dbytes % XFS_MIN_BLOCKSIZE) {
@@ -2199,7 +2199,7 @@ _("rmapbt not supported with realtime devices\n"));
 	}
 
 	if (logsize) {
-		__uint64_t logbytes;
+		uint64_t logbytes;
 
 		logbytes = getnum(logsize, &lopts, L_SIZE);
 		if (logbytes % XFS_MIN_BLOCKSIZE) {
@@ -2216,7 +2216,7 @@ _("rmapbt not supported with realtime devices\n"));
 				(long long)(logblocks << blocklog));
 	}
 	if (rtsize) {
-		__uint64_t rtbytes;
+		uint64_t rtbytes;
 
 		rtbytes = getnum(rtsize, &ropts, R_SIZE);
 		if (rtbytes % XFS_MIN_BLOCKSIZE) {
@@ -2236,7 +2236,7 @@ _("rmapbt not supported with realtime devices\n"));
 	 * If specified, check rt extent size against its constraints.
 	 */
 	if (rtextsize) {
-		__uint64_t rtextbytes;
+		uint64_t rtextbytes;
 
 		rtextbytes = getnum(rtextsize, &ropts, R_EXTSIZE);
 		if (rtextbytes % blocksize) {
@@ -2252,8 +2252,8 @@ _("rmapbt not supported with realtime devices\n"));
 		 * and the underlying volume is striped, then set rtextblocks
 		 * to the stripe width.
 		 */
-		__uint64_t	rswidth;
-		__uint64_t	rtextbytes;
+		uint64_t	rswidth;
+		uint64_t	rtextbytes;
 
 		if (!norsflag && !xi.risfile && !(!rtsize && xi.disfile))
 			rswidth = ft.rtswidth;
@@ -2335,10 +2335,10 @@ _("rmapbt not supported with realtime devices\n"));
 	 * multiple of the sector size, or 1024, whichever is larger.
 	 */
 
-	sector_mask = (__uint64_t)-1 << (MAX(sectorlog, 10) - BBSHIFT);
+	sector_mask = (uint64_t)-1 << (MAX(sectorlog, 10) - BBSHIFT);
 	xi.dsize &= sector_mask;
 	xi.rtsize &= sector_mask;
-	xi.logBBsize &= (__uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT);
+	xi.logBBsize &= (uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT);
 
 
 	/* don't do discards on print-only runs or on files */
@@ -2696,9 +2696,9 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
 	mp = &mbuf;
 	sbp = &mp->m_sb;
 	memset(mp, 0, sizeof(xfs_mount_t));
-	sbp->sb_blocklog = (__uint8_t)blocklog;
-	sbp->sb_sectlog = (__uint8_t)sectorlog;
-	sbp->sb_agblklog = (__uint8_t)libxfs_log2_roundup((unsigned int)agsize);
+	sbp->sb_blocklog = (uint8_t)blocklog;
+	sbp->sb_sectlog = (uint8_t)sectorlog;
+	sbp->sb_agblklog = (uint8_t)libxfs_log2_roundup((unsigned int)agsize);
 	sbp->sb_agblocks = (xfs_agblock_t)agsize;
 	mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
 	mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT;
@@ -2805,14 +2805,14 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
 	sbp->sb_agcount = (xfs_agnumber_t)agcount;
 	sbp->sb_rbmblocks = nbmblocks;
 	sbp->sb_logblocks = (xfs_extlen_t)logblocks;
-	sbp->sb_sectsize = (__uint16_t)sectorsize;
-	sbp->sb_inodesize = (__uint16_t)isize;
-	sbp->sb_inopblock = (__uint16_t)(blocksize / isize);
-	sbp->sb_sectlog = (__uint8_t)sectorlog;
-	sbp->sb_inodelog = (__uint8_t)inodelog;
-	sbp->sb_inopblog = (__uint8_t)(blocklog - inodelog);
+	sbp->sb_sectsize = (uint16_t)sectorsize;
+	sbp->sb_inodesize = (uint16_t)isize;
+	sbp->sb_inopblock = (uint16_t)(blocksize / isize);
+	sbp->sb_sectlog = (uint8_t)sectorlog;
+	sbp->sb_inodelog = (uint8_t)inodelog;
+	sbp->sb_inopblog = (uint8_t)(blocklog - inodelog);
 	sbp->sb_rextslog =
-		(__uint8_t)(rtextents ?
+		(uint8_t)(rtextents ?
 			libxfs_highbit32((unsigned int)rtextents) : 0);
 	sbp->sb_inprogress = 1;	/* mkfs is in progress */
 	sbp->sb_imax_pct = imaxpct;
@@ -2840,8 +2840,8 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
 	} else
 		sbp->sb_inoalignmt = 0;
 	if (lsectorsize != BBSIZE || sectorsize != BBSIZE) {
-		sbp->sb_logsectlog = (__uint8_t)lsectorlog;
-		sbp->sb_logsectsize = (__uint16_t)lsectorsize;
+		sbp->sb_logsectlog = (uint8_t)lsectorlog;
+		sbp->sb_logsectsize = (uint16_t)lsectorsize;
 	} else {
 		sbp->sb_logsectlog = 0;
 		sbp->sb_logsectsize = 0;
diff --git a/quota/edit.c b/quota/edit.c
index 36b327a..8418e85 100644
--- a/quota/edit.c
+++ b/quota/edit.c
@@ -115,16 +115,16 @@ warn_help(void)
 
 static void
 set_limits(
-	__uint32_t	id,
+	uint32_t	id,
 	uint		type,
 	uint		mask,
 	char		*dev,
-	__uint64_t	*bsoft,
-	__uint64_t	*bhard,
-	__uint64_t	*isoft,
-	__uint64_t	*ihard,
-	__uint64_t	*rtbsoft,
-	__uint64_t	*rtbhard)
+	uint64_t	*bsoft,
+	uint64_t	*bhard,
+	uint64_t	*isoft,
+	uint64_t	*ihard,
+	uint64_t	*rtbsoft,
+	uint64_t	*rtbhard)
 {
 	fs_disk_quota_t	d;
 
@@ -152,12 +152,12 @@ set_user_limits(
 	char		*name,
 	uint		type,
 	uint		mask,
-	__uint64_t	*bsoft,
-	__uint64_t	*bhard,
-	__uint64_t	*isoft,
-	__uint64_t	*ihard,
-	__uint64_t	*rtbsoft,
-	__uint64_t	*rtbhard)
+	uint64_t	*bsoft,
+	uint64_t	*bhard,
+	uint64_t	*isoft,
+	uint64_t	*ihard,
+	uint64_t	*rtbsoft,
+	uint64_t	*rtbhard)
 {
 	uid_t		uid = uid_from_string(name);
 
@@ -175,12 +175,12 @@ set_group_limits(
 	char		*name,
 	uint		type,
 	uint		mask,
-	__uint64_t	*bsoft,
-	__uint64_t	*bhard,
-	__uint64_t	*isoft,
-	__uint64_t	*ihard,
-	__uint64_t	*rtbsoft,
-	__uint64_t	*rtbhard)
+	uint64_t	*bsoft,
+	uint64_t	*bhard,
+	uint64_t	*isoft,
+	uint64_t	*ihard,
+	uint64_t	*rtbsoft,
+	uint64_t	*rtbhard)
 {
 	gid_t		gid = gid_from_string(name);
 
@@ -198,12 +198,12 @@ set_project_limits(
 	char		*name,
 	uint		type,
 	uint		mask,
-	__uint64_t	*bsoft,
-	__uint64_t	*bhard,
-	__uint64_t	*isoft,
-	__uint64_t	*ihard,
-	__uint64_t	*rtbsoft,
-	__uint64_t	*rtbhard)
+	uint64_t	*bsoft,
+	uint64_t	*bhard,
+	uint64_t	*isoft,
+	uint64_t	*ihard,
+	uint64_t	*rtbsoft,
+	uint64_t	*rtbhard)
 {
 	prid_t		prid = prid_from_string(name);
 
@@ -224,7 +224,7 @@ extractb(
 	int		length,
 	uint		blocksize,
 	uint		sectorsize,
-	__uint64_t	*value)
+	uint64_t	*value)
 {
 	long long	v;
 	char		*s = string;
@@ -238,7 +238,7 @@ extractb(
 				progname, s);
 			return 0;
 		}
-		*value = (__uint64_t)v >> 9;	/* syscalls use basic blocks */
+		*value = (uint64_t)v >> 9;	/* syscalls use basic blocks */
 		if (v > 0 && *value == 0)
 			fprintf(stderr, _("%s: Warning: `%s' in quota blocks is 0 (unlimited).\n"), progname, s);
 		return 1;
@@ -252,7 +252,7 @@ extracti(
 	char		*string,
 	const char	*prefix,
 	int		length,
-	__uint64_t	*value)
+	uint64_t	*value)
 {
 	char		*sp, *s = string;
 
@@ -270,7 +270,7 @@ limit_f(
 	char		**argv)
 {
 	char		*name;
-	__uint64_t	bsoft, bhard, isoft, ihard, rtbsoft, rtbhard;
+	uint64_t	bsoft, bhard, isoft, ihard, rtbsoft, rtbhard;
 	int		c, type = 0, mask = 0, flags = 0;
 	uint		bsize, ssize, endoptions;
 
@@ -384,8 +384,8 @@ restore_file(
 	char		*dev = NULL;
 	uint		mask;
 	int		cnt;
-	__uint32_t	id;
-	__uint64_t	bsoft, bhard, isoft, ihard, rtbsoft, rtbhard;
+	uint32_t	id;
+	uint64_t	bsoft, bhard, isoft, ihard, rtbsoft, rtbhard;
 
 	while (fgets(buffer, sizeof(buffer), fp) != NULL) {
 		if (strncmp("fs = ", buffer, 5) == 0) {
@@ -546,7 +546,7 @@ timer_f(
 
 static void
 set_warnings(
-	__uint32_t	id,
+	uint32_t	id,
 	uint		type,
 	uint		mask,
 	char		*dev,
diff --git a/quota/free.c b/quota/free.c
index cee15ee..1f8378d 100644
--- a/quota/free.c
+++ b/quota/free.c
@@ -49,20 +49,20 @@ free_help(void)
 static int
 mount_free_space_data(
 	struct fs_path		*mount,
-	__uint64_t		*bcount,
-	__uint64_t		*bused,
-	__uint64_t		*bfree,
-	__uint64_t		*icount,
-	__uint64_t		*iused,
-	__uint64_t		*ifree,
-	__uint64_t		*rcount,
-	__uint64_t		*rused,
-	__uint64_t		*rfree)
+	uint64_t		*bcount,
+	uint64_t		*bused,
+	uint64_t		*bfree,
+	uint64_t		*icount,
+	uint64_t		*iused,
+	uint64_t		*ifree,
+	uint64_t		*rcount,
+	uint64_t		*rused,
+	uint64_t		*rfree)
 {
 	struct xfs_fsop_counts	fscounts;
 	struct xfs_fsop_geom	fsgeo;
 	struct statfs		st;
-	__uint64_t		logsize, count, free;
+	uint64_t		logsize, count, free;
 	int			fd;
 
 	if ((fd = open(mount->fs_dir, O_RDONLY)) < 0) {
@@ -132,15 +132,15 @@ mount_free_space_data(
 static int
 projects_free_space_data(
 	struct fs_path		*path,
-	__uint64_t		*bcount,
-	__uint64_t		*bused,
-	__uint64_t		*bfree,
-	__uint64_t		*icount,
-	__uint64_t		*iused,
-	__uint64_t		*ifree,
-	__uint64_t		*rcount,
-	__uint64_t		*rused,
-	__uint64_t		*rfree)
+	uint64_t		*bcount,
+	uint64_t		*bused,
+	uint64_t		*bfree,
+	uint64_t		*icount,
+	uint64_t		*iused,
+	uint64_t		*ifree,
+	uint64_t		*rcount,
+	uint64_t		*rused,
+	uint64_t		*rfree)
 {
 	fs_quota_stat_t		qfs;
 	fs_disk_quota_t		d;
@@ -226,9 +226,9 @@ free_space(
 	fs_path_t	*path,
 	uint		flags)
 {
-	__uint64_t	bcount, bused, bfree;
-	__uint64_t	icount, iused, ifree;
-	__uint64_t	rcount, rused, rfree;
+	uint64_t	bcount, bused, bfree;
+	uint64_t	icount, iused, ifree;
+	uint64_t	rcount, rused, rfree;
 	char		a[8], s[8], u[8], p[8];
 	int		count;
 
diff --git a/quota/quot.c b/quota/quot.c
index ccc154f..6378fbb 100644
--- a/quota/quot.c
+++ b/quota/quot.c
@@ -26,17 +26,17 @@
 
 typedef struct du {
 	struct du	*next;
-	__uint64_t	blocks;
-	__uint64_t	blocks30;
-	__uint64_t	blocks60;
-	__uint64_t	blocks90;
-	__uint64_t	nfiles;
-	__uint32_t	id;
+	uint64_t	blocks;
+	uint64_t	blocks30;
+	uint64_t	blocks60;
+	uint64_t	blocks90;
+	uint64_t	nfiles;
+	uint32_t	id;
 } du_t;
 
 #define	TSIZE		500
-static __uint64_t	sizes[TSIZE];
-static __uint64_t	overflow;
+static uint64_t	sizes[TSIZE];
+static uint64_t	overflow;
 
 #define	NDU		60000
 #define	DUHASH		8209
@@ -84,8 +84,8 @@ quot_bulkstat_add(
 {
 	du_t		*dp;
 	du_t		**hp;
-	__uint64_t	size;
-	__uint32_t	i, id;
+	uint64_t	size;
+	uint32_t	i, id;
 
 	if ((p->bs_mode & S_IFMT) == 0)
 		return;
@@ -203,7 +203,7 @@ qcompare(
 	return 0;
 }
 
-typedef char *(*idtoname_t)(__uint32_t);
+typedef char *(*idtoname_t)(uint32_t);
 
 static void
 quot_report_mount_any_type(
@@ -291,7 +291,7 @@ quot_histogram_mount(
 	fs_path_t	*mount,
 	uint		flags)
 {
-	__uint64_t	t = 0;
+	uint64_t	t = 0;
 	int		i;
 
 	fprintf(fp, _("%s (%s):\n"), mount->fs_name, mount->fs_dir);
diff --git a/quota/quota.c b/quota/quota.c
index d09e239..479b970 100644
--- a/quota/quota.c
+++ b/quota/quota.c
@@ -52,7 +52,7 @@ quota_help(void)
 static int
 quota_mount(
 	FILE		*fp,
-	__uint32_t	id,
+	uint32_t	id,
 	char		*name,
 	uint		form,
 	uint		type,
@@ -181,7 +181,7 @@ quota_mount(
 static void
 quota(
 	FILE		*fp,
-	__uint32_t	id,
+	uint32_t	id,
 	char		*name,
 	uint		form,
 	uint		type,
diff --git a/quota/quota.h b/quota/quota.h
index 4bde351..9ed28be 100644
--- a/quota/quota.h
+++ b/quota/quota.h
@@ -53,9 +53,9 @@ enum {
 extern char *type_to_string(uint __type);
 extern char *form_to_string(uint __form);
 extern char *time_to_string(time_t __time, uint __flags);
-extern char *bbs_to_string(__uint64_t __v, char *__c, uint __size);
-extern char *num_to_string(__uint64_t __v, char *__c, uint __size);
-extern char *pct_to_string(__uint64_t __v, __uint64_t __t, char *__c, uint __s);
+extern char *bbs_to_string(uint64_t __v, char *__c, uint __size);
+extern char *num_to_string(uint64_t __v, char *__c, uint __size);
+extern char *pct_to_string(uint64_t __v, uint64_t __t, char *__c, uint __s);
 
 extern FILE *fopen_write_secure(char *__filename);
 
@@ -81,7 +81,7 @@ enum {
  * Identifier (uid/gid/prid) cache routines
  */
 #define NMAX 32
-extern char *uid_to_name(__uint32_t __uid);
-extern char *gid_to_name(__uint32_t __gid);
-extern char *prid_to_name(__uint32_t __prid);
+extern char *uid_to_name(uint32_t __uid);
+extern char *gid_to_name(uint32_t __gid);
+extern char *prid_to_name(uint32_t __prid);
 extern bool isdigits_only(const char *);
diff --git a/quota/report.c b/quota/report.c
index d0509c2..b2ea3bb 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -333,9 +333,9 @@ report_header(
 static int
 report_mount(
 	FILE		*fp,
-	__uint32_t	id,
+	uint32_t	id,
 	char		*name,
-	__uint32_t	*oid,
+	uint32_t	*oid,
 	uint		form,
 	uint		type,
 	fs_path_t	*mount,
diff --git a/quota/state.c b/quota/state.c
index 09dfa70..b08bf50 100644
--- a/quota/state.c
+++ b/quota/state.c
@@ -135,7 +135,7 @@ static void
 state_timelimit(
 	FILE		*fp,
 	uint		form,
-	__uint32_t	timelimit)
+	uint32_t	timelimit)
 {
 	fprintf(fp, _("%s grace time: %s\n"),
 		form_to_string(form),
diff --git a/quota/util.c b/quota/util.c
index cafd45f..37840a8 100644
--- a/quota/util.c
+++ b/quota/util.c
@@ -94,8 +94,8 @@ round_snprintf(
 	size_t		size,
 	const char	*fmt_round,
 	const char	*fmt_not_round,
-	__uint64_t	value,
-	__uint64_t	divisor)
+	uint64_t	value,
+	uint64_t	divisor)
 {
 	double		v = (double)value / divisor;
 
@@ -107,23 +107,23 @@ round_snprintf(
 }
 
 /* Basic blocks (512) bytes are returned from quotactl */
-#define BBS_TO_EXABYTES(bbs)	((__uint64_t)(bbs)>>51)
-#define BBS_TO_PETABYTES(bbs)	((__uint64_t)(bbs)>>41)
-#define BBS_TO_TERABYTES(bbs)	((__uint64_t)(bbs)>>31)
-#define BBS_TO_GIGABYTES(bbs)	((__uint64_t)(bbs)>>21)
-#define BBS_TO_MEGABYTES(bbs)	((__uint64_t)(bbs)>>11)
-#define BBS_TO_KILOBYTES(bbs)	((__uint64_t)(bbs)>>1)
-
-#define BBEXABYTE		((__uint64_t)1<<51)
-#define BBPETABYTE		((__uint64_t)1<<41)
-#define BBTERABYTE		((__uint64_t)1<<31)
-#define BBGIGABYTE		((__uint64_t)1<<21)
-#define BBMEGABYTE		((__uint64_t)1<<11)
-#define BBKILOBYTE		((__uint64_t)1<< 1)
+#define BBS_TO_EXABYTES(bbs)	((uint64_t)(bbs)>>51)
+#define BBS_TO_PETABYTES(bbs)	((uint64_t)(bbs)>>41)
+#define BBS_TO_TERABYTES(bbs)	((uint64_t)(bbs)>>31)
+#define BBS_TO_GIGABYTES(bbs)	((uint64_t)(bbs)>>21)
+#define BBS_TO_MEGABYTES(bbs)	((uint64_t)(bbs)>>11)
+#define BBS_TO_KILOBYTES(bbs)	((uint64_t)(bbs)>>1)
+
+#define BBEXABYTE		((uint64_t)1<<51)
+#define BBPETABYTE		((uint64_t)1<<41)
+#define BBTERABYTE		((uint64_t)1<<31)
+#define BBGIGABYTE		((uint64_t)1<<21)
+#define BBMEGABYTE		((uint64_t)1<<11)
+#define BBKILOBYTE		((uint64_t)1<< 1)
 
 char *
 bbs_to_string(
-	__uint64_t	v,
+	uint64_t	v,
 	char		*sp,
 	uint		size)
 {
@@ -146,17 +146,17 @@ bbs_to_string(
 	return sp;
 }
 
-#define THOUSAND		((__uint64_t)1000)
-#define MILLION			((__uint64_t)1000*1000)
-#define BILLION			((__uint64_t)1000*1000*1000)
-#define TRILLION		((__uint64_t)1000*1000*1000*1000)
-#define GAZILLION		((__uint64_t)1000*1000*1000*1000*1000)
-#define RIDICULOUS		((__uint64_t)1000*1000*1000*1000*1000*1000)
-#define STOPALREADY		((__uint64_t)1000*1000*1000*1000*1000*1000*1000)
+#define THOUSAND		((uint64_t)1000)
+#define MILLION			((uint64_t)1000*1000)
+#define BILLION			((uint64_t)1000*1000*1000)
+#define TRILLION		((uint64_t)1000*1000*1000*1000)
+#define GAZILLION		((uint64_t)1000*1000*1000*1000*1000)
+#define RIDICULOUS		((uint64_t)1000*1000*1000*1000*1000*1000)
+#define STOPALREADY		((uint64_t)1000*1000*1000*1000*1000*1000*1000)
 
 char *
 num_to_string(
-	__uint64_t	v,
+	uint64_t	v,
 	char		*sp,
 	uint		size)
 {
@@ -183,8 +183,8 @@ num_to_string(
 
 char *
 pct_to_string(
-	__uint64_t	portion,
-	__uint64_t	whole,
+	uint64_t	portion,
+	uint64_t	whole,
 	char		*buf,
 	uint		size)
 {
@@ -237,7 +237,7 @@ type_to_string(
 #define IDMASK		(NID-1)
 
 typedef struct {
-	__uint32_t	id;
+	uint32_t	id;
 	char		name[NMAX+1];
 } idcache_t;
 
@@ -250,7 +250,7 @@ static int		pentriesleft = NID;
 
 static idcache_t *
 getnextpwent(
-	__uint32_t	id,
+	uint32_t	id,
 	int		byid)
 {
 	struct passwd	*pw;
@@ -266,7 +266,7 @@ getnextpwent(
 
 static idcache_t *
 getnextgrent(
-	__uint32_t	id,
+	uint32_t	id,
 	int		byid)
 {
 	struct group	*gr;
@@ -281,7 +281,7 @@ getnextgrent(
 
 static idcache_t *
 getnextprent(
-	__uint32_t	id,
+	uint32_t	id,
 	int		byid)
 {
 	fs_project_t	*pr;
@@ -296,7 +296,7 @@ getnextprent(
 
 char *
 uid_to_name(
-	__uint32_t	id)
+	uint32_t	id)
 {
 	idcache_t	*ncp, *idp;
 
@@ -333,7 +333,7 @@ uid_to_name(
 
 char *
 gid_to_name(
-	__uint32_t	id)
+	uint32_t	id)
 {
 	idcache_t	*ncp, *idp;
 
@@ -370,7 +370,7 @@ gid_to_name(
 
 char *
 prid_to_name(
-	__uint32_t	id)
+	uint32_t	id)
 {
 	idcache_t	*ncp, *idp;
 
diff --git a/repair/README b/repair/README
index 7f168e6..4692463 100644
--- a/repair/README
+++ b/repair/README
@@ -189,7 +189,7 @@ D - 0) look at usage of XFS_MAKE_IPTR().  It does the right
 
 
 D - 0) look at references to XFS_INODES_PER_CHUNK.  change the
-	ones that really mean sizeof(__uint64_t)*NBBY to
+	ones that really mean sizeof(uint64_t)*NBBY to
 	something else (like that only defined as a constant
 	INOS_PER_IREC. this isn't as important since
 	XFS_INODES_PER_CHUNK will never chang
diff --git a/repair/agheader.h b/repair/agheader.h
index 6b2974c..2f7246d 100644
--- a/repair/agheader.h
+++ b/repair/agheader.h
@@ -20,7 +20,7 @@ typedef struct fs_geometry  {
 	/*
 	 * these types should match the superblock types
 	 */
-	__uint32_t	sb_blocksize;	/* blocksize (bytes) */
+	uint32_t	sb_blocksize;	/* blocksize (bytes) */
 	xfs_rfsblock_t	sb_dblocks;	/* # data blocks */
 	xfs_rfsblock_t	sb_rblocks;	/* # realtime blocks */
 	xfs_rtblock_t	sb_rextents;	/* # realtime extents */
@@ -30,9 +30,9 @@ typedef struct fs_geometry  {
 	xfs_agnumber_t	sb_agcount;	/* # of ags */
 	xfs_extlen_t	sb_rbmblocks;	/* # of rt bitmap blocks */
 	xfs_extlen_t	sb_logblocks;	/* # of log blocks */
-	__uint16_t	sb_sectsize;	/* volume sector size (bytes) */
-	__uint16_t	sb_inodesize;	/* inode size (bytes) */
-	__uint8_t	sb_imax_pct;	/* max % of fs for inode space */
+	uint16_t	sb_sectsize;	/* volume sector size (bytes) */
+	uint16_t	sb_inodesize;	/* inode size (bytes) */
+	uint8_t		sb_imax_pct;	/* max % of fs for inode space */
 
 	/*
 	 * these don't have to match the superblock types but are placed
@@ -49,10 +49,10 @@ typedef struct fs_geometry  {
 	/*
 	 * fields after this point have to be checked manually in compare_sb()
 	 */
-	__uint8_t	sb_shared_vn;	/* shared version number */
+	uint8_t		sb_shared_vn;	/* shared version number */
 	xfs_extlen_t	sb_inoalignmt;	/* inode chunk alignment, fsblocks */
-	__uint32_t	sb_unit;	/* stripe or raid unit */
-	__uint32_t	sb_width;	/* stripe or width unit */
+	uint32_t	sb_unit;	/* stripe or raid unit */
+	uint32_t	sb_width;	/* stripe or width unit */
 
 	/*
 	 * these don't have to match, they track superblock properties
diff --git a/repair/attr_repair.h b/repair/attr_repair.h
index 7010e4f..294fad4 100644
--- a/repair/attr_repair.h
+++ b/repair/attr_repair.h
@@ -32,10 +32,10 @@
 #define ACL_WRITE	02
 #define ACL_EXECUTE	01
 
-typedef __uint16_t	xfs_acl_perm_t;
-typedef __int32_t	xfs_acl_type_t;
-typedef __int32_t	xfs_acl_tag_t;
-typedef __int32_t	xfs_acl_id_t;
+typedef uint16_t	xfs_acl_perm_t;
+typedef int32_t		xfs_acl_type_t;
+typedef int32_t		xfs_acl_tag_t;
+typedef int32_t		xfs_acl_id_t;
 
 /*
  * "icacl" = in-core ACL. There is no equivalent in the XFS kernel code,
@@ -50,7 +50,7 @@ struct xfs_icacl_entry {
 };
 
 struct xfs_icacl {
-	__int32_t		acl_cnt;
+	int32_t			acl_cnt;
 	struct xfs_icacl_entry	acl_entry[0];
 };
 
@@ -59,14 +59,14 @@ struct xfs_icacl {
  */
 #define XFS_MAC_MAX_SETS	250
 typedef struct xfs_mac_label {
-	__uint8_t       ml_msen_type;	/* MSEN label type */
-	__uint8_t       ml_mint_type;	/* MINT label type */
-	__uint8_t       ml_level;	/* Hierarchical level */
-	__uint8_t       ml_grade;	/* Hierarchical grade */
-	__uint16_t      ml_catcount;	/* Category count */
-	__uint16_t      ml_divcount;	/* Division count */
+	uint8_t       ml_msen_type;	/* MSEN label type */
+	uint8_t       ml_mint_type;	/* MINT label type */
+	uint8_t       ml_level;	/* Hierarchical level */
+	uint8_t       ml_grade;	/* Hierarchical grade */
+	uint16_t      ml_catcount;	/* Category count */
+	uint16_t      ml_divcount;	/* Division count */
 					/* Category set, then Division set */
-	__uint16_t      ml_list[XFS_MAC_MAX_SETS];
+	uint16_t      ml_list[XFS_MAC_MAX_SETS];
 } xfs_mac_label_t;
 
 /* MSEN label type names. Choose an upper case ASCII character.  */
@@ -93,7 +93,7 @@ typedef struct xfs_mac_label {
 /*
  * Capabilities (IRIX)
  */
-typedef __uint64_t xfs_cap_value_t;
+typedef uint64_t xfs_cap_value_t;
 
 typedef struct xfs_cap_set {
 	xfs_cap_value_t	cap_effective;  /* use in capability checks */
diff --git a/repair/avl64.c b/repair/avl64.c
index 51cd624..8f4a121 100644
--- a/repair/avl64.c
+++ b/repair/avl64.c
@@ -70,8 +70,8 @@ avl64_checktree(
 	avl64node_t *root)
 {
 	avl64node_t *nlast, *nnext, *np;
-	__uint64_t offset = 0;
-	__uint64_t end;
+	uint64_t offset = 0;
+	uint64_t end;
 
 	nlast = nnext = root;
 
@@ -583,8 +583,8 @@ avl64_delete(
 avl64node_t *
 avl64_findanyrange(
 	avl64tree_desc_t *tree,
-	__uint64_t start,
-	__uint64_t end,
+	uint64_t start,
+	uint64_t end,
 	int	checklen)
 {
 	avl64node_t *np = tree->avl_root;
@@ -655,7 +655,7 @@ avl64_findanyrange(
 avl64node_t *
 avl64_findrange(
 	avl64tree_desc_t *tree,
-	__uint64_t value)
+	uint64_t value)
 {
 	avl64node_t *np = tree->avl_root;
 
@@ -682,10 +682,10 @@ avl64_findrange(
 avl64node_t *
 avl64_find(
 	avl64tree_desc_t *tree,
-	__uint64_t value)
+	uint64_t value)
 {
 	avl64node_t *np = tree->avl_root;
-	__uint64_t nvalue;
+	uint64_t nvalue;
 
 	while (np) {
 		nvalue = AVL_START(tree, np);
@@ -909,8 +909,8 @@ static
 avl64node_t *
 avl64_insert_find_growth(
 		avl64tree_desc_t *tree,
-		__uint64_t start,	/* range start at start, */
-		__uint64_t end,	/* exclusive */
+		uint64_t start,	/* range start at start, */
+		uint64_t end,	/* exclusive */
 		int   *growthp)	/* OUT */
 {
 	avl64node_t *root = tree->avl_root;
@@ -963,7 +963,7 @@ avl64_insert_grow(
 	int growth)
 {
 	avl64node_t *nnext;
-	__uint64_t start = AVL_START(tree, newnode);
+	uint64_t start = AVL_START(tree, newnode);
 
 	if (growth == AVL_BACK) {
 
@@ -1005,8 +1005,8 @@ avl64_insert(
 	avl64node_t *newnode)
 {
 	avl64node_t *np;
-	__uint64_t start = AVL_START(tree, newnode);
-	__uint64_t end = AVL_END(tree, newnode);
+	uint64_t start = AVL_START(tree, newnode);
+	uint64_t end = AVL_END(tree, newnode);
 	int growth;
 
 	ASSERT(newnode);
@@ -1159,16 +1159,16 @@ avl64ops_t avl_debug_ops = {
 	avl_debug_end,
 }
 
-static __uint64_t
+static uint64_t
 avl64_debug_start(avl64node_t *node)
 {
-	return (__uint64_t)(struct avl_debug_node *)node->avl_start;
+	return (uint64_t)(struct avl_debug_node *)node->avl_start;
 }
 
-static __uint64_t
+static uint64_t
 avl64_debug_end(avl64node_t *node)
 {
-	return (__uint64_t)
+	return (uint64_t)
 		((struct avl_debug_node *)node->avl_start +
 		 (struct avl_debug_node *)node->avl_size);
 }
@@ -1304,7 +1304,7 @@ main()
 avl64node_t *
 avl64_findadjacent(
 	avl64tree_desc_t *tree,
-	__uint64_t value,
+	uint64_t value,
 	int		dir)
 {
 	avl64node_t *np = tree->avl_root;
@@ -1378,8 +1378,8 @@ avl64_findadjacent(
 void
 avl64_findranges(
 	avl64tree_desc_t *tree,
-	__uint64_t start,
-	__uint64_t end,
+	uint64_t start,
+	uint64_t end,
 	avl64node_t	        **startp,
 	avl64node_t		**endp)
 {
diff --git a/repair/avl64.h b/repair/avl64.h
index fd19321..cd079a0 100644
--- a/repair/avl64.h
+++ b/repair/avl64.h
@@ -32,8 +32,8 @@ typedef struct	avl64node {
  * avl-tree operations
  */
 typedef struct avl64ops {
-	__uint64_t	(*avl_start)(avl64node_t *);
-	__uint64_t	(*avl_end)(avl64node_t *);
+	uint64_t	(*avl_start)(avl64node_t *);
+	uint64_t	(*avl_end)(avl64node_t *);
 } avl64ops_t;
 
 /*
@@ -89,32 +89,32 @@ avl64_init_tree(
 avl64node_t *
 avl64_findrange(
 	avl64tree_desc_t *tree,
-	__uint64_t value);
+	uint64_t value);
 
 avl64node_t *
 avl64_find(
 	avl64tree_desc_t *tree,
-	__uint64_t value);
+	uint64_t value);
 
 avl64node_t *
 avl64_findanyrange(
 	avl64tree_desc_t *tree,
-	__uint64_t	start,
-	__uint64_t	end,
+	uint64_t	start,
+	uint64_t	end,
 	int     checklen);
 
 
 avl64node_t *
 avl64_findadjacent(
 	avl64tree_desc_t *tree,
-	__uint64_t	value,
+	uint64_t	value,
 	int		dir);
 
 void
 avl64_findranges(
 	avl64tree_desc_t *tree,
-	__uint64_t	start,
-	__uint64_t	end,
+	uint64_t	start,
+	uint64_t	end,
 	avl64node_t	        **startp,
 	avl64node_t		**endp);
 
diff --git a/repair/dinode.c b/repair/dinode.c
index d664f87..da87217 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -746,7 +746,7 @@ _("%s fork in ino %" PRIu64 " claims dup extent, "
 			case XR_E_FREE1:
 				do_warn(
 _("%s fork in ino %" PRIu64 " claims free block %" PRIu64 "\n"),
-					forkname, ino, (__uint64_t) b);
+					forkname, ino, (uint64_t) b);
 				/* fall through ... */
 			case XR_E_INUSE1:	/* seen by rmap */
 			case XR_E_UNKNOWN:
@@ -923,7 +923,7 @@ process_btinode(
 	int			type,
 	int			*dirty,
 	xfs_rfsblock_t		*tot,
-	__uint64_t		*nex,
+	uint64_t		*nex,
 	blkmap_t		**blkmapp,
 	int			whichfork,
 	int			check_dups)
@@ -939,7 +939,7 @@ process_btinode(
 	int			level;
 	int			numrecs;
 	bmap_cursor_t		cursor;
-	__uint64_t		magic;
+	uint64_t		magic;
 
 	dib = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork);
 	lino = XFS_AGINO_TO_INO(mp, agno, ino);
@@ -1098,7 +1098,7 @@ process_exinode(
 	int			type,
 	int			*dirty,
 	xfs_rfsblock_t		*tot,
-	__uint64_t		*nex,
+	uint64_t		*nex,
 	blkmap_t		**blkmapp,
 	int			whichfork,
 	int			check_dups)
@@ -1200,14 +1200,14 @@ process_symlink_extlist(xfs_mount_t *mp, xfs_ino_t lino, xfs_dinode_t *dino)
 		do_warn(
 _("mismatch between format (%d) and size (%" PRId64 ") in symlink ino %" PRIu64 "\n"),
 			dino->di_format,
-			(__int64_t)be64_to_cpu(dino->di_size), lino);
+			(int64_t)be64_to_cpu(dino->di_size), lino);
 		return 1;
 	}
 	if (dino->di_format == XFS_DINODE_FMT_LOCAL) {
 		do_warn(
 _("mismatch between format (%d) and size (%" PRId64 ") in symlink inode %" PRIu64 "\n"),
 			dino->di_format,
-			(__int64_t)be64_to_cpu(dino->di_size), lino);
+			(int64_t)be64_to_cpu(dino->di_size), lino);
 		return 1;
 	}
 
@@ -1454,22 +1454,22 @@ _("inode %" PRIu64 " has bad inode type (IFMNT)\n"), lino);
 		case XR_INO_CHRDEV:
 			do_warn(
 _("size of character device inode %" PRIu64 " != 0 (%" PRId64 " bytes)\n"), lino,
-				(__int64_t)be64_to_cpu(dino->di_size));
+				(int64_t)be64_to_cpu(dino->di_size));
 			break;
 		case XR_INO_BLKDEV:
 			do_warn(
 _("size of block device inode %" PRIu64 " != 0 (%" PRId64 " bytes)\n"), lino,
-				(__int64_t)be64_to_cpu(dino->di_size));
+				(int64_t)be64_to_cpu(dino->di_size));
 			break;
 		case XR_INO_SOCK:
 			do_warn(
 _("size of socket inode %" PRIu64 " != 0 (%" PRId64 " bytes)\n"), lino,
-				(__int64_t)be64_to_cpu(dino->di_size));
+				(int64_t)be64_to_cpu(dino->di_size));
 			break;
 		case XR_INO_FIFO:
 			do_warn(
 _("size of fifo inode %" PRIu64 " != 0 (%" PRId64 " bytes)\n"), lino,
-				(__int64_t)be64_to_cpu(dino->di_size));
+				(int64_t)be64_to_cpu(dino->di_size));
 			break;
 		default:
 			do_warn(_("Internal error - process_misc_ino_types, "
@@ -1743,12 +1743,12 @@ _("found inode %" PRIu64 " claiming to be a real-time file\n"), lino);
 		break;
 
 	case XR_INO_RTBITMAP:
-		if (size != (__int64_t)mp->m_sb.sb_rbmblocks *
+		if (size != (int64_t)mp->m_sb.sb_rbmblocks *
 					mp->m_sb.sb_blocksize) {
 			do_warn(
 _("realtime bitmap inode %" PRIu64 " has bad size %" PRId64 " (should be %" PRIu64 ")\n"),
 				lino, size,
-				(__int64_t) mp->m_sb.sb_rbmblocks *
+				(int64_t) mp->m_sb.sb_rbmblocks *
 					mp->m_sb.sb_blocksize);
 			return 1;
 		}
@@ -1817,8 +1817,8 @@ static int
 process_inode_blocks_and_extents(
 	xfs_dinode_t	*dino,
 	xfs_rfsblock_t	nblocks,
-	__uint64_t	nextents,
-	__uint64_t	anextents,
+	uint64_t	nextents,
+	uint64_t	anextents,
 	xfs_ino_t	lino,
 	int		*dirty)
 {
@@ -1908,7 +1908,7 @@ process_inode_data_fork(
 	int		type,
 	int		*dirty,
 	xfs_rfsblock_t	*totblocks,
-	__uint64_t	*nextents,
+	uint64_t	*nextents,
 	blkmap_t	**dblkmap,
 	int		check_dups)
 {
@@ -2017,7 +2017,7 @@ process_inode_attr_fork(
 	int		type,
 	int		*dirty,
 	xfs_rfsblock_t	*atotblocks,
-	__uint64_t	*anextents,
+	uint64_t	*anextents,
 	int		check_dups,
 	int		extra_attr_check,
 	int		*retval)
@@ -2228,8 +2228,8 @@ process_dinode_int(xfs_mount_t *mp,
 	int			di_mode;
 	int			type;
 	int			retval = 0;
-	__uint64_t		nextents;
-	__uint64_t		anextents;
+	uint64_t		nextents;
+	uint64_t		anextents;
 	xfs_ino_t		lino;
 	const int		is_free = 0;
 	const int		is_used = 1;
@@ -2346,7 +2346,7 @@ _("inode identifier %llu mismatch on inode %" PRIu64 "\n"),
 		if (!uncertain)
 			do_warn(
 _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"),
-				(__int64_t)be64_to_cpu(dino->di_size),
+				(int64_t)be64_to_cpu(dino->di_size),
 				lino);
 		if (verify_mode)
 			return 1;
diff --git a/repair/dinode.h b/repair/dinode.h
index 61d0736..39d6a72 100644
--- a/repair/dinode.h
+++ b/repair/dinode.h
@@ -46,8 +46,8 @@ process_bmbt_reclist(xfs_mount_t	*mp,
 		xfs_ino_t		ino,
 		xfs_rfsblock_t		*tot,
 		struct blkmap		**blkmapp,
-		__uint64_t		*first_key,
-		__uint64_t		*last_key,
+		uint64_t		*first_key,
+		uint64_t		*last_key,
 		int			whichfork);
 
 int
diff --git a/repair/dir2.c b/repair/dir2.c
index e6415e4..73dff90 100644
--- a/repair/dir2.c
+++ b/repair/dir2.c
@@ -160,7 +160,7 @@ process_sf_dir2(
 	int			bad_sfnamelen;
 	int			i;
 	int			i8;
-	__int64_t		ino_dir_size;
+	int64_t			ino_dir_size;
 	int			ino_off;
 	ino_tree_node_t		*irec_p;
 	int			junkit;
diff --git a/repair/globals.h b/repair/globals.h
index 4085ccc..800128a 100644
--- a/repair/globals.h
+++ b/repair/globals.h
@@ -141,7 +141,7 @@ EXTERN int		inodes_per_cluster;
 EXTERN unsigned int	glob_agcount;
 EXTERN int		chunks_pblock;	/* # of 64-ino chunks per allocation */
 EXTERN int		max_symlink_blocks;
-EXTERN __int64_t	fs_max_file_offset;
+EXTERN int64_t		fs_max_file_offset;
 
 /* realtime info */
 
@@ -161,16 +161,16 @@ EXTERN int		full_ino_ex_data;/*
 
 /* superblock counters */
 
-EXTERN __uint64_t	sb_icount;	/* allocated (made) inodes */
-EXTERN __uint64_t	sb_ifree;	/* free inodes */
-EXTERN __uint64_t	sb_fdblocks;	/* free data blocks */
-EXTERN __uint64_t	sb_frextents;	/* free realtime extents */
+EXTERN uint64_t	sb_icount;	/* allocated (made) inodes */
+EXTERN uint64_t	sb_ifree;	/* free inodes */
+EXTERN uint64_t	sb_fdblocks;	/* free data blocks */
+EXTERN uint64_t	sb_frextents;	/* free realtime extents */
 
 /* superblock geometry info */
 
 EXTERN xfs_extlen_t	sb_inoalignmt;
-EXTERN __uint32_t	sb_unit;
-EXTERN __uint32_t	sb_width;
+EXTERN uint32_t	sb_unit;
+EXTERN uint32_t	sb_width;
 
 struct aglock {
 	pthread_mutex_t	lock __attribute__((__aligned__(64)));
@@ -178,7 +178,7 @@ struct aglock {
 EXTERN struct aglock	*ag_locks;
 
 EXTERN int 		report_interval;
-EXTERN __uint64_t 	*prog_rpt_done;
+EXTERN uint64_t 	*prog_rpt_done;
 
 EXTERN int		ag_stride;
 EXTERN int		thread_count;
diff --git a/repair/incore.c b/repair/incore.c
index cb57316..a9191ae 100644
--- a/repair/incore.c
+++ b/repair/incore.c
@@ -179,7 +179,7 @@ get_bmap_ext(
 static uint64_t		*rt_bmap;
 static size_t		rt_bmap_size;
 
-/* block records fit into __uint64_t's units */
+/* block records fit into uint64_t's units */
 #define XR_BB_UNIT	64			/* number of bits/unit */
 #define XR_BB		4			/* bits per block record */
 #define XR_BB_NUM	(XR_BB_UNIT/XR_BB)	/* number of records per unit */
@@ -203,8 +203,8 @@ set_rtbmap(
 {
 	*(rt_bmap + bno / XR_BB_NUM) =
 	 ((*(rt_bmap + bno / XR_BB_NUM) &
-	  (~((__uint64_t) XR_BB_MASK << ((bno % XR_BB_NUM) * XR_BB)))) |
-	 (((__uint64_t) state) << ((bno % XR_BB_NUM) * XR_BB)));
+	  (~((uint64_t) XR_BB_MASK << ((bno % XR_BB_NUM) * XR_BB)))) |
+	 (((uint64_t) state) << ((bno % XR_BB_NUM) * XR_BB)));
 }
 
 static void
@@ -222,9 +222,9 @@ init_rt_bmap(
 		return;
 
 	rt_bmap_size = roundup(mp->m_sb.sb_rextents / (NBBY / XR_BB),
-			       sizeof(__uint64_t));
+			       sizeof(uint64_t));
 
-	rt_bmap = memalign(sizeof(__uint64_t), rt_bmap_size);
+	rt_bmap = memalign(sizeof(uint64_t), rt_bmap_size);
 	if (!rt_bmap) {
 		do_error(
 	_("couldn't allocate realtime block map, size = %" PRIu64 "\n"),
diff --git a/repair/incore.h b/repair/incore.h
index c23a3a3..fd66084 100644
--- a/repair/incore.h
+++ b/repair/incore.h
@@ -257,7 +257,7 @@ typedef xfs_ino_t parent_entry_t;
 struct nlink_ops;
 
 typedef struct parent_list  {
-	__uint64_t		pmask;
+	uint64_t		pmask;
 	parent_entry_t		*pentries;
 #ifdef DEBUG
 	short			cnt;
@@ -265,14 +265,14 @@ typedef struct parent_list  {
 } parent_list_t;
 
 union ino_nlink {
-	__uint8_t	*un8;
-	__uint16_t	*un16;
-	__uint32_t	*un32;
+	uint8_t		*un8;
+	uint16_t	*un16;
+	uint32_t	*un32;
 };
 
 typedef struct ino_ex_data  {
-	__uint64_t		ino_reached;	/* bit == 1 if reached */
-	__uint64_t		ino_processed;	/* reference checked bit mask */
+	uint64_t		ino_reached;	/* bit == 1 if reached */
+	uint64_t		ino_processed;	/* reference checked bit mask */
 	parent_list_t		*parents;
 	union ino_nlink		counted_nlinks;/* counted nlinks in P6 */
 } ino_ex_data_t;
@@ -281,22 +281,22 @@ typedef struct ino_tree_node  {
 	avlnode_t		avl_node;
 	xfs_agino_t		ino_startnum;	/* starting inode # */
 	xfs_inofree_t		ir_free;	/* inode free bit mask */
-	__uint64_t		ir_sparse;	/* sparse inode bitmask */
-	__uint64_t		ino_confirmed;	/* confirmed bitmask */
-	__uint64_t		ino_isa_dir;	/* bit == 1 if a directory */
-	__uint64_t		ino_was_rl;	/* bit == 1 if reflink flag set */
-	__uint64_t		ino_is_rl;	/* bit == 1 if reflink flag should be set */
-	__uint8_t		nlink_size;
+	uint64_t		ir_sparse;	/* sparse inode bitmask */
+	uint64_t		ino_confirmed;	/* confirmed bitmask */
+	uint64_t		ino_isa_dir;	/* bit == 1 if a directory */
+	uint64_t		ino_was_rl;	/* bit == 1 if reflink flag set */
+	uint64_t		ino_is_rl;	/* bit == 1 if reflink flag should be set */
+	uint8_t			nlink_size;
 	union ino_nlink		disk_nlinks;	/* on-disk nlinks, set in P3 */
 	union  {
 		ino_ex_data_t	*ex_data;	/* phases 6,7 */
 		parent_list_t	*plist;		/* phases 2-5 */
 	} ino_un;
-	__uint8_t		*ftypes;	/* phases 3,6 */
+	uint8_t			*ftypes;	/* phases 3,6 */
 } ino_tree_node_t;
 
-#define INOS_PER_IREC	(sizeof(__uint64_t) * NBBY)
-#define	IREC_MASK(i)	((__uint64_t)1 << (i))
+#define INOS_PER_IREC	(sizeof(uint64_t) * NBBY)
+#define	IREC_MASK(i)	((uint64_t)1 << (i))
 
 void		add_ino_ex_data(xfs_mount_t *mp);
 
@@ -543,10 +543,10 @@ static inline int inode_is_rl(struct ino_tree_node *irec, int offset)
  */
 void add_inode_ref(struct ino_tree_node *irec, int offset);
 void drop_inode_ref(struct ino_tree_node *irec, int offset);
-__uint32_t num_inode_references(struct ino_tree_node *irec, int offset);
+uint32_t num_inode_references(struct ino_tree_node *irec, int offset);
 
-void set_inode_disk_nlinks(struct ino_tree_node *irec, int offset, __uint32_t nlinks);
-__uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int offset);
+void set_inode_disk_nlinks(struct ino_tree_node *irec, int offset, uint32_t nlinks);
+uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int offset);
 
 static inline int is_inode_reached(struct ino_tree_node *irec, int offset)
 {
@@ -567,13 +567,13 @@ static inline void add_inode_reached(struct ino_tree_node *irec, int offset)
 static inline void
 set_inode_ftype(struct ino_tree_node *irec,
 	int		ino_offset,
-	__uint8_t	ftype)
+	uint8_t		ftype)
 {
 	if (irec->ftypes)
 		irec->ftypes[ino_offset] = ftype;
 }
 
-static inline __uint8_t
+static inline uint8_t
 get_inode_ftype(
 	struct ino_tree_node *irec,
 	int		ino_offset)
@@ -606,11 +606,11 @@ typedef struct bm_level_state  {
 	xfs_fsblock_t		fsbno;
 	xfs_fsblock_t		left_fsbno;
 	xfs_fsblock_t		right_fsbno;
-	__uint64_t		first_key;
-	__uint64_t		last_key;
+	uint64_t		first_key;
+	uint64_t		last_key;
 /*
 	int			level;
-	__uint64_t		prev_last_key;
+	uint64_t		prev_last_key;
 	xfs_buf_t		*bp;
 	xfs_bmbt_block_t	*block;
 */
diff --git a/repair/incore_ext.c b/repair/incore_ext.c
index 7e6786c..0a8138a 100644
--- a/repair/incore_ext.c
+++ b/repair/incore_ext.c
@@ -721,13 +721,13 @@ search_rt_dup_extent(xfs_mount_t *mp, xfs_rtblock_t bno)
 	return(ret);
 }
 
-static __uint64_t
+static uint64_t
 avl64_rt_ext_start(avl64node_t *node)
 {
 	return(((rt_extent_tree_node_t *) node)->rt_startblock);
 }
 
-static __uint64_t
+static uint64_t
 avl64_ext_end(avl64node_t *node)
 {
 	return(((rt_extent_tree_node_t *) node)->rt_startblock +
@@ -834,7 +834,7 @@ count_extents(xfs_agnumber_t agno, avltree_desc_t *tree, int whichtree)
 int
 count_bno_extents_blocks(xfs_agnumber_t agno, uint *numblocks)
 {
-	__uint64_t nblocks;
+	uint64_t nblocks;
 	extent_tree_node_t *node;
 	int i = 0;
 
diff --git a/repair/incore_ino.c b/repair/incore_ino.c
index 2ec1765..3b6b44d 100644
--- a/repair/incore_ino.c
+++ b/repair/incore_ino.c
@@ -38,7 +38,7 @@ static avltree_desc_t	**inode_uncertain_tree_ptrs;
 /* memory optimised nlink counting for all inodes */
 
 static void *
-alloc_nlink_array(__uint8_t nlink_size)
+alloc_nlink_array(uint8_t nlink_size)
 {
 	void *ptr;
 
@@ -51,10 +51,10 @@ alloc_nlink_array(__uint8_t nlink_size)
 static void
 nlink_grow_8_to_16(ino_tree_node_t *irec)
 {
-	__uint16_t	*new_nlinks;
+	uint16_t	*new_nlinks;
 	int		i;
 
-	irec->nlink_size = sizeof(__uint16_t);
+	irec->nlink_size = sizeof(uint16_t);
 
 	new_nlinks = alloc_nlink_array(irec->nlink_size);
 	for (i = 0; i < XFS_INODES_PER_CHUNK; i++)
@@ -76,10 +76,10 @@ nlink_grow_8_to_16(ino_tree_node_t *irec)
 static void
 nlink_grow_16_to_32(ino_tree_node_t *irec)
 {
-	__uint32_t	*new_nlinks;
+	uint32_t	*new_nlinks;
 	int		i;
 
-	irec->nlink_size = sizeof(__uint32_t);
+	irec->nlink_size = sizeof(uint32_t);
 
 	new_nlinks = alloc_nlink_array(irec->nlink_size);
 	for (i = 0; i < XFS_INODES_PER_CHUNK; i++)
@@ -104,21 +104,21 @@ void add_inode_ref(struct ino_tree_node *irec, int ino_offset)
 	ASSERT(irec->ino_un.ex_data != NULL);
 
 	switch (irec->nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		if (irec->ino_un.ex_data->counted_nlinks.un8[ino_offset] < 0xff) {
 			irec->ino_un.ex_data->counted_nlinks.un8[ino_offset]++;
 			break;
 		}
 		nlink_grow_8_to_16(irec);
 		/*FALLTHRU*/
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		if (irec->ino_un.ex_data->counted_nlinks.un16[ino_offset] < 0xffff) {
 			irec->ino_un.ex_data->counted_nlinks.un16[ino_offset]++;
 			break;
 		}
 		nlink_grow_16_to_32(irec);
 		/*FALLTHRU*/
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		irec->ino_un.ex_data->counted_nlinks.un32[ino_offset]++;
 		break;
 	default:
@@ -128,20 +128,20 @@ void add_inode_ref(struct ino_tree_node *irec, int ino_offset)
 
 void drop_inode_ref(struct ino_tree_node *irec, int ino_offset)
 {
-	__uint32_t	refs = 0;
+	uint32_t	refs = 0;
 
 	ASSERT(irec->ino_un.ex_data != NULL);
 
 	switch (irec->nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		ASSERT(irec->ino_un.ex_data->counted_nlinks.un8[ino_offset] > 0);
 		refs = --irec->ino_un.ex_data->counted_nlinks.un8[ino_offset];
 		break;
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		ASSERT(irec->ino_un.ex_data->counted_nlinks.un16[ino_offset] > 0);
 		refs = --irec->ino_un.ex_data->counted_nlinks.un16[ino_offset];
 		break;
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		ASSERT(irec->ino_un.ex_data->counted_nlinks.un32[ino_offset] > 0);
 		refs = --irec->ino_un.ex_data->counted_nlinks.un32[ino_offset];
 		break;
@@ -153,16 +153,16 @@ void drop_inode_ref(struct ino_tree_node *irec, int ino_offset)
 		irec->ino_un.ex_data->ino_reached &= ~IREC_MASK(ino_offset);
 }
 
-__uint32_t num_inode_references(struct ino_tree_node *irec, int ino_offset)
+uint32_t num_inode_references(struct ino_tree_node *irec, int ino_offset)
 {
 	ASSERT(irec->ino_un.ex_data != NULL);
 
 	switch (irec->nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		return irec->ino_un.ex_data->counted_nlinks.un8[ino_offset];
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		return irec->ino_un.ex_data->counted_nlinks.un16[ino_offset];
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		return irec->ino_un.ex_data->counted_nlinks.un32[ino_offset];
 	default:
 		ASSERT(0);
@@ -171,24 +171,24 @@ __uint32_t num_inode_references(struct ino_tree_node *irec, int ino_offset)
 }
 
 void set_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset,
-		__uint32_t nlinks)
+		uint32_t nlinks)
 {
 	switch (irec->nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		if (nlinks < 0xff) {
 			irec->disk_nlinks.un8[ino_offset] = nlinks;
 			break;
 		}
 		nlink_grow_8_to_16(irec);
 		/*FALLTHRU*/
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		if (nlinks < 0xffff) {
 			irec->disk_nlinks.un16[ino_offset] = nlinks;
 			break;
 		}
 		nlink_grow_16_to_32(irec);
 		/*FALLTHRU*/
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		irec->disk_nlinks.un32[ino_offset] = nlinks;
 		break;
 	default:
@@ -196,14 +196,14 @@ void set_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset,
 	}
 }
 
-__uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset)
+uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset)
 {
 	switch (irec->nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		return irec->disk_nlinks.un8[ino_offset];
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		return irec->disk_nlinks.un16[ino_offset];
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		return irec->disk_nlinks.un32[ino_offset];
 	default:
 		ASSERT(0);
@@ -211,11 +211,11 @@ __uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset)
 	return 0;
 }
 
-static __uint8_t *
+static uint8_t *
 alloc_ftypes_array(
 	struct xfs_mount *mp)
 {
-	__uint8_t	*ptr;
+	uint8_t		*ptr;
 
 	if (!xfs_sb_version_hasftype(&mp->m_sb))
 		return NULL;
@@ -262,23 +262,23 @@ alloc_ino_node(
 	irec->ir_free = (xfs_inofree_t) - 1;
 	irec->ir_sparse = 0;
 	irec->ino_un.ex_data = NULL;
-	irec->nlink_size = sizeof(__uint8_t);
+	irec->nlink_size = sizeof(uint8_t);
 	irec->disk_nlinks.un8 = alloc_nlink_array(irec->nlink_size);
 	irec->ftypes = alloc_ftypes_array(mp);
 	return irec;
 }
 
 static void
-free_nlink_array(union ino_nlink nlinks, __uint8_t nlink_size)
+free_nlink_array(union ino_nlink nlinks, uint8_t nlink_size)
 {
 	switch (nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		free(nlinks.un8);
 		break;
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		free(nlinks.un16);
 		break;
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		free(nlinks.un32);
 		break;
 	default:
@@ -609,7 +609,7 @@ set_inode_parent(
 	int			i;
 	int			cnt;
 	int			target;
-	__uint64_t		bitmask;
+	uint64_t		bitmask;
 	parent_entry_t		*tmp;
 
 	if (full_ino_ex_data)
@@ -699,7 +699,7 @@ set_inode_parent(
 xfs_ino_t
 get_inode_parent(ino_tree_node_t *irec, int offset)
 {
-	__uint64_t	bitmask;
+	uint64_t	bitmask;
 	parent_list_t	*ptbl;
 	int		i;
 	int		target;
@@ -740,15 +740,15 @@ alloc_ex_data(ino_tree_node_t *irec)
 	irec->ino_un.ex_data->parents = ptbl;
 
 	switch (irec->nlink_size) {
-	case sizeof(__uint8_t):
+	case sizeof(uint8_t):
 		irec->ino_un.ex_data->counted_nlinks.un8 =
 			alloc_nlink_array(irec->nlink_size);
 		break;
-	case sizeof(__uint16_t):
+	case sizeof(uint16_t):
 		irec->ino_un.ex_data->counted_nlinks.un16 =
 			alloc_nlink_array(irec->nlink_size);
 		break;
-	case sizeof(__uint32_t):
+	case sizeof(uint32_t):
 		irec->ino_un.ex_data->counted_nlinks.un32 =
 			alloc_nlink_array(irec->nlink_size);
 		break;
diff --git a/repair/phase2.c b/repair/phase2.c
index c21778b..0085732 100644
--- a/repair/phase2.c
+++ b/repair/phase2.c
@@ -179,7 +179,7 @@ phase2(
 
 	bad_ino_btree = 0;
 
-	set_progress_msg(PROG_FMT_SCAN_AG, (__uint64_t) glob_agcount);
+	set_progress_msg(PROG_FMT_SCAN_AG, (uint64_t) glob_agcount);
 
 	scan_ags(mp, scan_threads);
 
diff --git a/repair/phase3.c b/repair/phase3.c
index 0890a27..17b1c28 100644
--- a/repair/phase3.c
+++ b/repair/phase3.c
@@ -122,7 +122,7 @@ phase3(
 	else
 		do_log(_("        - scan (but don't clear) agi unlinked lists...\n"));
 
-	set_progress_msg(PROG_FMT_AGI_UNLINKED, (__uint64_t) glob_agcount);
+	set_progress_msg(PROG_FMT_AGI_UNLINKED, (uint64_t) glob_agcount);
 
 	/* first clear the agi unlinked AGI list */
 	if (!no_modify) {
@@ -142,7 +142,7 @@ phase3(
 	do_log(_(
 	    "        - process known inodes and perform inode discovery...\n"));
 
-	set_progress_msg(PROG_FMT_PROCESS_INO, (__uint64_t) mp->m_sb.sb_icount);
+	set_progress_msg(PROG_FMT_PROCESS_INO, (uint64_t) mp->m_sb.sb_icount);
 
 	process_ags(mp);
 
@@ -152,7 +152,7 @@ phase3(
 	 * process newly discovered inode chunks
 	 */
 	do_log(_("        - process newly discovered inodes...\n"));
-	set_progress_msg(PROG_FMT_NEW_INODES, (__uint64_t) glob_agcount);
+	set_progress_msg(PROG_FMT_NEW_INODES, (uint64_t) glob_agcount);
 
 	counts = calloc(sizeof(*counts), mp->m_sb.sb_agcount);
 	if (!counts) {
diff --git a/repair/phase4.c b/repair/phase4.c
index e59464b..cc17ec0 100644
--- a/repair/phase4.c
+++ b/repair/phase4.c
@@ -290,7 +290,7 @@ phase4(xfs_mount_t *mp)
 	do_log(_("Phase 4 - check for duplicate blocks...\n"));
 	do_log(_("        - setting up duplicate extent list...\n"));
 
-	set_progress_msg(PROG_FMT_DUP_EXTENT, (__uint64_t) glob_agcount);
+	set_progress_msg(PROG_FMT_DUP_EXTENT, (uint64_t) glob_agcount);
 
 	irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
 				XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino));
@@ -404,7 +404,7 @@ phase4(xfs_mount_t *mp)
 	reset_bmaps(mp);
 
 	do_log(_("        - check for inodes claiming duplicate blocks...\n"));
-	set_progress_msg(PROG_FMT_DUP_BLOCKS, (__uint64_t) mp->m_sb.sb_icount);
+	set_progress_msg(PROG_FMT_DUP_BLOCKS, (uint64_t) mp->m_sb.sb_icount);
 
 	/*
 	 * ok, now process the inodes -- signal 2-pass check per inode.
diff --git a/repair/phase5.c b/repair/phase5.c
index 0b833f1..bf86730 100644
--- a/repair/phase5.c
+++ b/repair/phase5.c
@@ -86,9 +86,9 @@ struct agi_stat {
 	xfs_agino_t		freecount;
 };
 
-static __uint64_t	*sb_icount_ag;		/* allocated inodes per ag */
-static __uint64_t	*sb_ifree_ag;		/* free inodes per ag */
-static __uint64_t	*sb_fdblocks_ag;	/* free data blocks per ag */
+static uint64_t	*sb_icount_ag;		/* allocated inodes per ag */
+static uint64_t	*sb_ifree_ag;		/* free inodes per ag */
+static uint64_t	*sb_fdblocks_ag;	/* free data blocks per ag */
 
 static int
 mk_incore_fstree(xfs_mount_t *mp, xfs_agnumber_t agno)
@@ -886,10 +886,10 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
  */
 static void
 init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs,
-		__uint64_t *num_inos, __uint64_t *num_free_inos, int finobt)
+		uint64_t *num_inos, uint64_t *num_free_inos, int finobt)
 {
-	__uint64_t		ninos;
-	__uint64_t		nfinos;
+	uint64_t		ninos;
+	uint64_t		nfinos;
 	int			rec_nfinos;
 	int			rec_ninos;
 	ino_tree_node_t		*ino_rec;
@@ -2193,10 +2193,10 @@ phase5_func(
 	xfs_agnumber_t	agno,
 	struct xfs_slab	*lost_fsb)
 {
-	__uint64_t	num_inos;
-	__uint64_t	num_free_inos;
-	__uint64_t	finobt_num_inos;
-	__uint64_t	finobt_num_free_inos;
+	uint64_t	num_inos;
+	uint64_t	num_free_inos;
+	uint64_t	finobt_num_inos;
+	uint64_t	finobt_num_free_inos;
 	bt_status_t	bno_btree_curs;
 	bt_status_t	bcnt_btree_curs;
 	bt_status_t	ino_btree_curs;
@@ -2471,7 +2471,7 @@ phase5(xfs_mount_t *mp)
 	int			error;
 
 	do_log(_("Phase 5 - rebuild AG headers and trees...\n"));
-	set_progress_msg(PROG_FMT_REBUILD_AG, (__uint64_t )glob_agcount);
+	set_progress_msg(PROG_FMT_REBUILD_AG, (uint64_t )glob_agcount);
 
 #ifdef XR_BLD_FREE_TRACE
 	fprintf(stderr, "inobt level 1, maxrec = %d, minrec = %d\n",
@@ -2497,15 +2497,15 @@ phase5(xfs_mount_t *mp)
 	keep_fsinos(mp);
 
 	/* allocate per ag counters */
-	sb_icount_ag = calloc(mp->m_sb.sb_agcount, sizeof(__uint64_t));
+	sb_icount_ag = calloc(mp->m_sb.sb_agcount, sizeof(uint64_t));
 	if (sb_icount_ag == NULL)
 		do_error(_("cannot alloc sb_icount_ag buffers\n"));
 
-	sb_ifree_ag = calloc(mp->m_sb.sb_agcount, sizeof(__uint64_t));
+	sb_ifree_ag = calloc(mp->m_sb.sb_agcount, sizeof(uint64_t));
 	if (sb_ifree_ag == NULL)
 		do_error(_("cannot alloc sb_ifree_ag buffers\n"));
 
-	sb_fdblocks_ag = calloc(mp->m_sb.sb_agcount, sizeof(__uint64_t));
+	sb_fdblocks_ag = calloc(mp->m_sb.sb_agcount, sizeof(uint64_t));
 	if (sb_fdblocks_ag == NULL)
 		do_error(_("cannot alloc sb_fdblocks_ag buffers\n"));
 
diff --git a/repair/phase6.c b/repair/phase6.c
index 08636dc..373b1a5 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -82,7 +82,7 @@ typedef struct dir_hash_ent {
 	struct dir_hash_ent	*nextbyhash;	/* next in name bucket */
 	struct dir_hash_ent	*nextbyorder;	/* next in order added */
 	xfs_dahash_t		hashval;	/* hash value of name */
-	__uint32_t		address;	/* offset of data entry */
+	uint32_t		address;	/* offset of data entry */
 	xfs_ino_t 		inum;		/* inode num of entry */
 	short			junkit;		/* name starts with / */
 	short			seen;		/* have seen leaf entry */
@@ -170,11 +170,11 @@ static int
 dir_hash_add(
 	xfs_mount_t		*mp,
 	dir_hash_tab_t		*hashtab,
-	__uint32_t		addr,
+	uint32_t		addr,
 	xfs_ino_t		inum,
 	int			namelen,
 	unsigned char		*name,
-	__uint8_t		ftype)
+	uint8_t			ftype)
 {
 	xfs_dahash_t		hash = 0;
 	int			byaddr;
@@ -357,7 +357,7 @@ static void
 dir_hash_update_ftype(
 	dir_hash_tab_t		*hashtab,
 	xfs_dir2_dataptr_t	addr,
-	__uint8_t		ftype)
+	uint8_t			ftype)
 {
 	int			i;
 	dir_hash_ent_t		*p;
@@ -1791,8 +1791,8 @@ longform_dir2_entry_check_data(
 
 		/* validate ftype field if supported */
 		if (xfs_sb_version_hasftype(&mp->m_sb)) {
-			__uint8_t dir_ftype;
-			__uint8_t ino_ftype;
+			uint8_t dir_ftype;
+			uint8_t ino_ftype;
 
 			dir_ftype = M_DIROPS(mp)->data_get_ftype(dep);
 			ino_ftype = get_inode_ftype(irec, ino_offset);
@@ -2703,8 +2703,8 @@ _("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name"),
 
 		/* validate ftype field if supported */
 		if (xfs_sb_version_hasftype(&mp->m_sb)) {
-			__uint8_t dir_ftype;
-			__uint8_t ino_ftype;
+			uint8_t dir_ftype;
+			uint8_t ino_ftype;
 
 			dir_ftype = M_DIROPS(mp)->sf_get_ftype(sfep);
 			ino_ftype = get_inode_ftype(irec, ino_offset);
diff --git a/repair/phase7.c b/repair/phase7.c
index 8bce117..4ffb81a 100644
--- a/repair/phase7.c
+++ b/repair/phase7.c
@@ -32,7 +32,7 @@ static void
 update_inode_nlinks(
 	xfs_mount_t 		*mp,
 	xfs_ino_t		ino,
-	__uint32_t		nlinks)
+	uint32_t		nlinks)
 {
 	xfs_trans_t		*tp;
 	xfs_inode_t		*ip;
@@ -104,7 +104,7 @@ do_link_updates(
 {
 	ino_tree_node_t		*irec;
 	int			j;
-	__uint32_t		nrefs;
+	uint32_t		nrefs;
 
 	for (irec = findfirst_inode_rec(agno); irec;
 	     irec = next_ino_rec(irec)) {
@@ -143,7 +143,7 @@ phase7(
 	else
 		do_log(_("Phase 7 - verify link counts...\n"));
 
-	set_progress_msg(PROGRESS_FMT_CORR_LINK, (__uint64_t) glob_agcount);
+	set_progress_msg(PROGRESS_FMT_CORR_LINK, (uint64_t) glob_agcount);
 
 	create_work_queue(&wq, mp, scan_threads);
 
diff --git a/repair/progress.c b/repair/progress.c
index 2a09b23..3a2e9a2 100644
--- a/repair/progress.c
+++ b/repair/progress.c
@@ -85,8 +85,8 @@ pthread_t	report_thread;
 typedef struct msg_block_s {
 	pthread_mutex_t	mutex;
 	progress_rpt_t	*format;
-	__uint64_t	*done;
-	__uint64_t	*total;
+	uint64_t	*done;
+	uint64_t	*total;
 	int		count;
 	int		interval;
 } msg_block_t;
@@ -96,14 +96,14 @@ typedef struct phase_times_s {
 	time_t		start;
 	time_t		end;
 	time_t		duration;
-	__uint64_t	item_counts[4];
+	uint64_t	item_counts[4];
 } phase_times_t;
 static phase_times_t phase_times[8];
 
 static void *progress_rpt_thread(void *);
 static int current_phase;
 static int running;
-static __uint64_t prog_rpt_total;
+static uint64_t prog_rpt_total;
 
 void
 init_progress_rpt (void)
@@ -113,11 +113,11 @@ init_progress_rpt (void)
 	 *  allocate the done vector
 	 */
 
-	if ((prog_rpt_done = (__uint64_t *)
-		malloc(sizeof(__uint64_t)*glob_agcount)) == NULL ) {
+	if ((prog_rpt_done = (uint64_t *)
+		malloc(sizeof(uint64_t)*glob_agcount)) == NULL ) {
 		do_error(_("cannot malloc pointer to done vector\n"));
 	}
-	bzero(prog_rpt_done, sizeof(__uint64_t)*glob_agcount);
+	bzero(prog_rpt_done, sizeof(uint64_t)*glob_agcount);
 
 	/*
 	 *  Setup comm block, start the thread
@@ -165,10 +165,10 @@ progress_rpt_thread (void *p)
 	timer_t timerid;
 	struct itimerspec timespec;
 	char *msgbuf;
-	__uint64_t *donep;
-	__uint64_t sum;
+	uint64_t *donep;
+	uint64_t sum;
 	msg_block_t *msgp = (msg_block_t *)p;
-	__uint64_t percent;
+	uint64_t percent;
 
 	/* It's possible to get here very early w/ no progress msg set */
 	if (!msgp->format)
@@ -286,7 +286,7 @@ progress_rpt_thread (void *p)
 }
 
 int
-set_progress_msg (int report, __uint64_t total)
+set_progress_msg (int report, uint64_t total)
 {
 
 	if (!ag_stride)
@@ -300,7 +300,7 @@ set_progress_msg (int report, __uint64_t total)
 
 	/* reset all the accumulative totals */
 	if (prog_rpt_done)
-		bzero(prog_rpt_done, sizeof(__uint64_t)*glob_agcount);
+		bzero(prog_rpt_done, sizeof(uint64_t)*glob_agcount);
 
 	if (pthread_mutex_unlock(&global_msgs.mutex))
 		do_error(_("set_progress_msg: cannot unlock progress mutex\n"));
@@ -308,14 +308,14 @@ set_progress_msg (int report, __uint64_t total)
 	return (0);
 }
 
-__uint64_t
+uint64_t
 print_final_rpt(void)
 {
 	int i;
 	struct tm *tmp;
 	time_t now;
-	__uint64_t *donep;
-	__uint64_t sum;
+	uint64_t *donep;
+	uint64_t sum;
 	msg_block_t 	*msgp = &global_msgs;
 	char		msgbuf[DURATION_BUF_SIZE];
 
diff --git a/repair/progress.h b/repair/progress.h
index 33db834..5152648 100644
--- a/repair/progress.h
+++ b/repair/progress.h
@@ -32,8 +32,8 @@
 extern void init_progress_rpt(void);
 extern void stop_progress_rpt(void);
 extern void summary_report(void);
-extern int  set_progress_msg(int report, __uint64_t total);
-extern __uint64_t print_final_rpt(void);
+extern int  set_progress_msg(int report, uint64_t total);
+extern uint64_t print_final_rpt(void);
 extern char *timestamp(int end, int phase, char *buf);
 extern char *duration(int val, char *buf);
 extern int do_parallel;
diff --git a/repair/rmap.c b/repair/rmap.c
index ab6e583..01d6f0f 100644
--- a/repair/rmap.c
+++ b/repair/rmap.c
@@ -343,7 +343,7 @@ _("Insufficient memory while allocating raw metadata reverse mapping slabs."));
 
 static int
 find_first_zero_bit(
-	__uint64_t	mask)
+	uint64_t	mask)
 {
 	int		n;
 	int		b = 0;
@@ -356,7 +356,7 @@ find_first_zero_bit(
 
 static int
 popcnt(
-	__uint64_t	mask)
+	uint64_t	mask)
 {
 	int		n;
 	int		b = 0;
@@ -1064,14 +1064,14 @@ _("Incorrect reverse-mapping: saw (%u/%u) %slen %u owner %"PRId64" %s%soff \
  * Compare the key fields of two rmap records -- positive if key1 > key2,
  * negative if key1 < key2, and zero if equal.
  */
-__int64_t
+int64_t
 rmap_diffkeys(
 	struct xfs_rmap_irec	*kp1,
 	struct xfs_rmap_irec	*kp2)
 {
 	__u64			oa;
 	__u64			ob;
-	__int64_t		d;
+	int64_t			d;
 	struct xfs_rmap_irec	tmp;
 
 	tmp = *kp1;
@@ -1081,7 +1081,7 @@ rmap_diffkeys(
 	tmp.rm_flags &= ~XFS_RMAP_REC_FLAGS;
 	ob = libxfs_rmap_irec_offset_pack(&tmp);
 
-	d = (__int64_t)kp1->rm_startblock - kp2->rm_startblock;
+	d = (int64_t)kp1->rm_startblock - kp2->rm_startblock;
 	if (d)
 		return d;
 
@@ -1192,10 +1192,10 @@ fix_inode_reflink_flags(
 {
 	struct ino_tree_node	*irec;
 	int			bit;
-	__uint64_t		was;
-	__uint64_t		is;
-	__uint64_t		diff;
-	__uint64_t		mask;
+	uint64_t		was;
+	uint64_t		is;
+	uint64_t		diff;
+	uint64_t		mask;
 	int			error = 0;
 	xfs_agino_t		agino;
 
diff --git a/repair/rmap.h b/repair/rmap.h
index 752ece8..1616ab7 100644
--- a/repair/rmap.h
+++ b/repair/rmap.h
@@ -44,7 +44,7 @@ extern int rmap_init_cursor(xfs_agnumber_t, struct xfs_slab_cursor **);
 extern void rmap_avoid_check(void);
 extern int rmaps_verify_btree(struct xfs_mount *, xfs_agnumber_t);
 
-extern __int64_t rmap_diffkeys(struct xfs_rmap_irec *kp1,
+extern int64_t rmap_diffkeys(struct xfs_rmap_irec *kp1,
 		struct xfs_rmap_irec *kp2);
 extern void rmap_high_key_from_rec(struct xfs_rmap_irec *rec,
 		struct xfs_rmap_irec *key);
diff --git a/repair/sb.c b/repair/sb.c
index 77e5154..acc9283 100644
--- a/repair/sb.c
+++ b/repair/sb.c
@@ -40,7 +40,7 @@ copy_sb(xfs_sb_t *source, xfs_sb_t *dest)
 	xfs_ino_t	uquotino;
 	xfs_ino_t	gquotino;
 	xfs_ino_t	pquotino;
-	__uint16_t	versionnum;
+	uint16_t	versionnum;
 
 	rootino = dest->sb_rootino;
 	rbmino = dest->sb_rbmino;
@@ -106,8 +106,8 @@ verify_sb_blocksize(xfs_sb_t *sb)
 static int
 __find_secondary_sb(
 	xfs_sb_t	*rsb,
-	__uint64_t	start,
-	__uint64_t	skip)
+	uint64_t	start,
+	uint64_t	skip)
 {
 	xfs_off_t	off;
 	xfs_sb_t	*sb;
@@ -187,13 +187,13 @@ __find_secondary_sb(
 
 static int
 guess_default_geometry(
-	__uint64_t		*agsize,
-	__uint64_t		*agcount,
+	uint64_t		*agsize,
+	uint64_t		*agcount,
 	libxfs_init_t		*x)
 {
 	struct fs_topology	ft;
 	int			blocklog;
-	__uint64_t		dblocks;
+	uint64_t		dblocks;
 	int			multidisk;
 
 	memset(&ft, 0, sizeof(ft));
@@ -216,9 +216,9 @@ int
 find_secondary_sb(xfs_sb_t *rsb)
 {
 	int		retval = 0;
-	__uint64_t	agcount;
-	__uint64_t	agsize;
-	__uint64_t	skip;
+	uint64_t	agcount;
+	uint64_t	agsize;
+	uint64_t	skip;
 	int		blocklog;
 
 	/*
@@ -229,7 +229,7 @@ find_secondary_sb(xfs_sb_t *rsb)
 	do_warn(_("\nattempting to find secondary superblock...\n"));
 
 	if (verify_sb_blocksize(rsb) == 0) {
-		skip = (__uint64_t)rsb->sb_agblocks * rsb->sb_blocksize;
+		skip = (uint64_t)rsb->sb_agblocks * rsb->sb_blocksize;
 		if (skip >= XFS_AG_MIN_BYTES && skip <= XFS_AG_MAX_BYTES)
 			retval = __find_secondary_sb(rsb, skip, skip);
 	}
@@ -343,7 +343,7 @@ sb_validate_ino_align(struct xfs_sb *sb)
 int
 verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb)
 {
-	__uint32_t	bsize;
+	uint32_t	bsize;
 	int		i;
 	int		ret;
 
@@ -399,7 +399,7 @@ verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb)
 		sb->sb_dblocks < XFS_MIN_DBLOCKS(sb))
 		return(XR_BAD_FS_SIZE_DATA);
 
-	if (sb->sb_agblklog != (__uint8_t)libxfs_log2_roundup(sb->sb_agblocks))
+	if (sb->sb_agblklog != (uint8_t)libxfs_log2_roundup(sb->sb_agblocks))
 		return(XR_BAD_FS_SIZE_DATA);
 
 	if (sb->sb_inodesize < XFS_DINODE_MIN_SIZE                     ||
diff --git a/repair/scan.c b/repair/scan.c
index b9ef4dc..447611a 100644
--- a/repair/scan.c
+++ b/repair/scan.c
@@ -42,13 +42,13 @@ struct aghdr_cnts {
 	xfs_agnumber_t	agno;
 	xfs_extlen_t	agffreeblks;
 	xfs_extlen_t	agflongest;
-	__uint64_t	agfbtreeblks;
-	__uint32_t	agicount;
-	__uint32_t	agifreecount;
-	__uint64_t	fdblocks;
-	__uint64_t	usedblocks;
-	__uint64_t	ifreecount;
-	__uint32_t	fibtfreecount;
+	uint64_t	agfbtreeblks;
+	uint32_t	agicount;
+	uint32_t	agifreecount;
+	uint64_t	fdblocks;
+	uint64_t	usedblocks;
+	uint64_t	ifreecount;
+	uint32_t	fibtfreecount;
 };
 
 void
@@ -70,10 +70,10 @@ scan_sbtree(
 				xfs_agnumber_t		agno,
 				int			suspect,
 				int			isroot,
-				__uint32_t		magic,
+				uint32_t		magic,
 				void			*priv),
 	int		isroot,
-	__uint32_t	magic,
+	uint32_t	magic,
 	void		*priv,
 	const struct xfs_buf_ops *ops)
 {
@@ -110,23 +110,23 @@ scan_lbtree(
 				xfs_fsblock_t		bno,
 				xfs_ino_t		ino,
 				xfs_rfsblock_t		*tot,
-				__uint64_t		*nex,
+				uint64_t		*nex,
 				blkmap_t		**blkmapp,
 				bmap_cursor_t		*bm_cursor,
 				int			isroot,
 				int			check_dups,
 				int			*dirty,
-				__uint64_t		magic),
+				uint64_t		magic),
 	int		type,
 	int		whichfork,
 	xfs_ino_t	ino,
 	xfs_rfsblock_t	*tot,
-	__uint64_t	*nex,
+	uint64_t	*nex,
 	blkmap_t	**blkmapp,
 	bmap_cursor_t	*bm_cursor,
 	int		isroot,
 	int		check_dups,
-	__uint64_t	magic,
+	uint64_t	magic,
 	const struct xfs_buf_ops *ops)
 {
 	xfs_buf_t	*bp;
@@ -179,13 +179,13 @@ scan_bmapbt(
 	xfs_fsblock_t		bno,
 	xfs_ino_t		ino,
 	xfs_rfsblock_t		*tot,
-	__uint64_t		*nex,
+	uint64_t		*nex,
 	blkmap_t		**blkmapp,
 	bmap_cursor_t		*bm_cursor,
 	int			isroot,
 	int			check_dups,
 	int			*dirty,
-	__uint64_t		magic)
+	uint64_t		magic)
 {
 	int			i;
 	int			err;
@@ -548,7 +548,7 @@ scan_allocbt(
 	xfs_agnumber_t		agno,
 	int			suspect,
 	int			isroot,
-	__uint32_t		magic,
+	uint32_t		magic,
 	void			*priv)
 {
 	struct aghdr_cnts	*agcnts = priv;
@@ -930,7 +930,7 @@ scan_rmapbt(
 	xfs_agnumber_t		agno,
 	int			suspect,
 	int			isroot,
-	__uint32_t		magic,
+	uint32_t		magic,
 	void			*priv)
 {
 	const char		*name = "rmap";
@@ -1233,7 +1233,7 @@ scan_refcbt(
 	xfs_agnumber_t		agno,
 	int			suspect,
 	int			isroot,
-	__uint32_t		magic,
+	uint32_t		magic,
 	void			*priv)
 {
 	const char		*name = "refcount";
@@ -1939,7 +1939,7 @@ scan_inobt(
 	xfs_agnumber_t		agno,
 	int			suspect,
 	int			isroot,
-	__uint32_t		magic,
+	uint32_t		magic,
 	void			*priv)
 {
 	struct aghdr_cnts	*agcnts = priv;
@@ -2176,7 +2176,7 @@ validate_agf(
 	struct aghdr_cnts	*agcnts)
 {
 	xfs_agblock_t		bno;
-	__uint32_t		magic;
+	uint32_t		magic;
 
 	bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]);
 	if (bno != 0 && verify_agbno(mp, agno, bno)) {
@@ -2274,7 +2274,7 @@ validate_agi(
 {
 	xfs_agblock_t		bno;
 	int			i;
-	__uint32_t		magic;
+	uint32_t		magic;
 
 	bno = be32_to_cpu(agi->agi_root);
 	if (bno != 0 && verify_agbno(mp, agno, bno)) {
@@ -2499,10 +2499,10 @@ scan_ags(
 	int			scan_threads)
 {
 	struct aghdr_cnts *agcnts;
-	__uint64_t	fdblocks = 0;
-	__uint64_t	icount = 0;
-	__uint64_t	ifreecount = 0;
-	__uint64_t	usedblocks = 0;
+	uint64_t	fdblocks = 0;
+	uint64_t	icount = 0;
+	uint64_t	ifreecount = 0;
+	uint64_t	usedblocks = 0;
 	xfs_agnumber_t	i;
 	work_queue_t	wq;
 
diff --git a/repair/scan.h b/repair/scan.h
index ea8c0bf..9bbe1e6 100644
--- a/repair/scan.h
+++ b/repair/scan.h
@@ -30,23 +30,23 @@ int scan_lbtree(
 				xfs_fsblock_t		bno,
 				xfs_ino_t		ino,
 				xfs_rfsblock_t		*tot,
-				__uint64_t		*nex,
+				uint64_t		*nex,
 				struct blkmap		**blkmapp,
 				bmap_cursor_t		*bm_cursor,
 				int			isroot,
 				int			check_dups,
 				int			*dirty,
-				__uint64_t		magic),
+				uint64_t		magic),
 	int		type,
 	int		whichfork,
 	xfs_ino_t	ino,
 	xfs_rfsblock_t	*tot,
-	__uint64_t	*nex,
+	uint64_t	*nex,
 	struct blkmap	**blkmapp,
 	bmap_cursor_t	*bm_cursor,
 	int		isroot,
 	int		check_dups,
-	__uint64_t	magic,
+	uint64_t	magic,
 	const struct xfs_buf_ops *ops);
 
 int scan_bmapbt(
@@ -57,13 +57,13 @@ int scan_bmapbt(
 	xfs_fsblock_t		bno,
 	xfs_ino_t		ino,
 	xfs_rfsblock_t		*tot,
-	__uint64_t		*nex,
+	uint64_t		*nex,
 	struct blkmap		**blkmapp,
 	bmap_cursor_t		*bm_cursor,
 	int			isroot,
 	int			check_dups,
 	int			*dirty,
-	__uint64_t		magic);
+	uint64_t		magic);
 
 void
 scan_ags(


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
  2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
@ 2017-07-31 21:07 ` Darrick J. Wong
  2017-07-31 21:42   ` Eric Sandeen
  2017-08-02  9:14   ` Carlos Maiolino
  2017-07-31 21:07 ` [PATCH 3/7] xfs_db: fix metadump redirection (again) Darrick J. Wong
                   ` (5 subsequent siblings)
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:07 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

XFS has a maximum symlink target length of 1024 bytes; this is a
holdover from the Irix days.  Unfortunately, the constant establishing
this was 'MAXPATHLEN', and is /not/ the same as the Linux MAXPATHLEN,
which is 4096.

The kernel enforces its 1024 byte MAXPATHLEN on symlink targets, but
xfsprogs picks up the (Linux) system 4096 byte MAXPATHLEN, which means
that xfs_repair doesn't complain about oversized symlinks.

Since this is an on-disk format constraint, put the define in the XFS
namespace.  As a side effect of the rename, xfs_repair wil detect
oversized symlinks and clean them off the system.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 repair/dinode.c     |    6 +++---
 repair/xfs_repair.c |    2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)


diff --git a/repair/dinode.c b/repair/dinode.c
index da87217..f005335 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -1259,7 +1259,7 @@ null_check(char *name, int length)
 {
 	int i;
 
-	ASSERT(length < MAXPATHLEN);
+	ASSERT(length < XFS_SYMLINK_MAXLEN);
 
 	for (i = 0; i < length; i++, name++)  {
 		if (*name == '\0')
@@ -1371,7 +1371,7 @@ process_symlink(
 	blkmap_t 	*blkmap)
 {
 	char			*symlink;
-	char			data[MAXPATHLEN];
+	char			data[XFS_SYMLINK_MAXLEN];
 
 	/*
 	 * check size against kernel symlink limits.  we know
@@ -1379,7 +1379,7 @@ process_symlink(
 	 * the inode is structurally ok so we don't have to check
 	 * for that
 	 */
-	if (be64_to_cpu(dino->di_size) >= MAXPATHLEN)  {
+	if (be64_to_cpu(dino->di_size) >= XFS_SYMLINK_MAXLEN)  {
 	       do_warn(_("symlink in inode %" PRIu64 " too long (%llu chars)\n"),
 		       lino, (unsigned long long) be64_to_cpu(dino->di_size));
 		return(1);
diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
index ab60c0f..b2dd91b 100644
--- a/repair/xfs_repair.c
+++ b/repair/xfs_repair.c
@@ -761,7 +761,7 @@ main(int argc, char **argv)
 	glob_agcount = mp->m_sb.sb_agcount;
 
 	chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK;
-	max_symlink_blocks = libxfs_symlink_blocks(mp, MAXPATHLEN);
+	max_symlink_blocks = libxfs_symlink_blocks(mp, XFS_SYMLINK_MAXLEN);
 	inodes_per_cluster = MAX(mp->m_sb.sb_inopblock,
 			mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog);
 


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 3/7] xfs_db: fix metadump redirection (again)
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
  2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
  2017-07-31 21:07 ` [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN Darrick J. Wong
@ 2017-07-31 21:07 ` Darrick J. Wong
  2017-07-31 21:57   ` Eric Sandeen
  2017-08-01 16:23   ` [PATCH v2 " Darrick J. Wong
  2017-07-31 21:07 ` [PATCH 4/7] xfs_db: dump dir/attr btrees Darrick J. Wong
                   ` (4 subsequent siblings)
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:07 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

In patch 4944defad4 ("xfs_db: redirect printfs when metadumping to
stdout"), we solved the problem of xfs_db printfs ending up in the
metadump stream by reassigning stdout for the duration of a stdout
metadump.  Unfortunately, musl doesn't allow stdout to be reassigned (in
their view "extern FILE *stdout" means "extern FILE * const stdout"), so
we abandon the old approach in favor of playing games with dup() to
switch the raw file descriptors.

While we're at it, fix a regression where an unconverted outf test
allows progress info to end up in the metadump stream.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/metadump.c |   47 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 36 insertions(+), 11 deletions(-)


diff --git a/db/metadump.c b/db/metadump.c
index be2e712..227796b 100644
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -78,6 +78,7 @@ static int		obfuscate = 1;
 static int		zero_stale_data = 1;
 static int		show_warnings = 0;
 static int		progress_since_warning = 0;
+static bool		stdout_metadump;
 
 void
 metadump_init(void)
@@ -137,7 +138,7 @@ print_progress(const char *fmt, ...)
 	va_end(ap);
 	buf[sizeof(buf)-1] = '\0';
 
-	f = (outf == stdout) ? stderr : stdout;
+	f = stdout_metadump ? stderr : stdout;
 	fprintf(f, "\r%-59s", buf);
 	fflush(f);
 	progress_since_warning = 1;
@@ -2750,7 +2751,8 @@ metadump_f(
 	xfs_agnumber_t	agno;
 	int		c;
 	int		start_iocur_sp;
-	bool		stdout_metadump = false;
+	int		outfd = -1;
+	int		ret;
 	char		*p;
 
 	exitcode = 1;
@@ -2870,16 +2872,35 @@ metadump_f(
 		 * metadump operation so that dbprintf and other messages
 		 * are sent to the console instead of polluting the
 		 * metadump stream.
+		 *
+		 * We get to do this the hard way because musl doesn't
+		 * allow reassignment of stdout.
 		 */
-		outf = stdout;
-		stdout = stderr;
+		fflush(stdout);
+		outfd = dup(STDOUT_FILENO);
+		if (outfd < 0) {
+			perror("opening dump stream");
+			goto out;
+		}
+		ret = dup2(STDERR_FILENO, STDOUT_FILENO);
+		if (ret < 0) {
+			perror("redirecting stdout");
+			close(outfd);
+			goto out;
+		}
+		outf = fdopen(outfd, "a");
+		if (outf == NULL) {
+			fprintf(stderr, "cannot create dump stream\n");
+			dup2(outfd, 1);
+			close(outfd);
+			goto out;
+		}
 		stdout_metadump = true;
 	} else {
 		outf = fopen(argv[optind], "wb");
 		if (outf == NULL) {
 			print_warning("cannot create dump file");
-			free(metablock);
-			return 0;
+			goto out;
 		}
 	}
 
@@ -2907,15 +2928,19 @@ metadump_f(
 	if (progress_since_warning)
 		fputc('\n', stdout_metadump ? stderr : stdout);
 
-	if (stdout_metadump)
-		stdout = outf;
-	else
-		fclose(outf);
+	if (stdout_metadump) {
+		fflush(outf);
+		fflush(stdout);
+		ret = dup2(outfd, STDOUT_FILENO);
+		if (ret < 0)
+			perror("un-redirecting stdout");
+	}
+	fclose(outf);
 
 	/* cleanup iocur stack */
 	while (iocur_sp > start_iocur_sp)
 		pop_cur();
-
+out:
 	free(metablock);
 
 	return 0;


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 4/7] xfs_db: dump dir/attr btrees
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
                   ` (2 preceding siblings ...)
  2017-07-31 21:07 ` [PATCH 3/7] xfs_db: fix metadump redirection (again) Darrick J. Wong
@ 2017-07-31 21:07 ` Darrick J. Wong
  2017-07-31 22:05   ` Eric Sandeen
  2017-08-01 15:40   ` [PATCH v2 " Darrick J. Wong
  2017-07-31 21:07 ` [PATCH 5/7] xfs_db: print attribute remote value blocks Darrick J. Wong
                   ` (3 subsequent siblings)
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:07 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

Dump the directory or extended attribute btree contents.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/btdump.c       |  251 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 man/man8/xfs_db.8 |    1 
 2 files changed, 252 insertions(+)


diff --git a/db/btdump.c b/db/btdump.c
index 3b76e17..e351202 100644
--- a/db/btdump.c
+++ b/db/btdump.c
@@ -227,6 +227,252 @@ dump_inode(
 	return ret;
 }
 
+static bool
+dir_has_rightsib(
+	void				*block,
+	int				level)
+{
+	struct xfs_dir3_icleaf_hdr	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	if (level > 0) {
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.forw != 0;
+	}
+	M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
+	return lhdr.forw != 0;
+}
+
+static int
+dir_level(
+	void				*block)
+{
+	struct xfs_dir3_icleaf_hdr	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_DIR2_LEAF1_MAGIC):
+	case cpu_to_be16(XFS_DIR2_LEAFN_MAGIC):
+		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+static int
+dir3_level(
+	void				*block)
+{
+	struct xfs_dir3_icleaf_hdr	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
+	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
+		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+static bool
+attr_has_rightsib(
+	void				*block,
+	int				level)
+{
+        struct xfs_attr_leafblock	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	if (level > 0) {
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.forw != 0;
+	}
+	xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
+	return lhdr.hdr.info.forw != 0;
+}
+
+static int
+attr_level(
+	void				*block)
+{
+        struct xfs_attr_leafblock	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
+		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+static int
+attr3_level(
+	void				*block)
+{
+        struct xfs_attr_leafblock	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
+		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+struct dabprinter {
+	const char		*print_node_entries;
+	const char		*print_leaf_entries;
+	const char		*go_node_forward;
+	const char		*go_leaf_forward;
+	const char		*go_down;
+	bool			(*has_rightsib)(void *, int);
+	int			(*level)(void *);
+};
+
+static struct dabprinter attr_print = {
+	.print_node_entries	= "btree",
+	.print_leaf_entries	= "entries nvlist",
+	.go_node_forward	= "hdr.info.forw",
+	.go_leaf_forward	= "hdr.info.forw",
+	.go_down		= "btree[0].before",
+	.has_rightsib		= attr_has_rightsib,
+	.level			= attr_level,
+};
+
+static struct dabprinter attr3_print = {
+	.print_node_entries	= "btree",
+	.print_leaf_entries	= "entries nvlist",
+	.go_node_forward	= "hdr.info.hdr.forw",
+	.go_leaf_forward	= "hdr.info.hdr.forw",
+	.go_down		= "btree[0].before",
+	.has_rightsib		= attr_has_rightsib,
+	.level			= attr3_level,
+};
+
+static struct dabprinter dir_print = {
+	.print_node_entries	= "nbtree",
+	.print_leaf_entries	= "lents",
+	.go_node_forward	= "nhdr.info.hdr.forw",
+	.go_leaf_forward	= "lhdr.info.hdr.forw",
+	.go_down		= "nbtree[0].before",
+	.has_rightsib		= dir_has_rightsib,
+	.level			= dir_level,
+};
+
+static struct dabprinter dir3_print = {
+	.print_node_entries	= "nbtree",
+	.print_leaf_entries	= "lents",
+	.go_node_forward	= "nhdr.info.forw",
+	.go_leaf_forward	= "lhdr.info.forw",
+	.go_down		= "nbtree[0].before",
+	.has_rightsib		= dir_has_rightsib,
+	.level			= dir3_level,
+};
+
+static int
+dump_dablevel(
+	int			level,
+	struct dabprinter	*dbp)
+{
+	xfs_daddr_t		orig_daddr = iocur_top->bb;
+	xfs_daddr_t		last_daddr;
+	unsigned int		nr;
+	int			ret;
+
+	ret = eval("push");
+	if (ret)
+		return ret;
+
+	nr = 1;
+	do {
+		last_daddr = iocur_top->bb;
+		dbprintf(_("%s level %u block %u daddr %llu\n"),
+			 iocur_top->typ->name, level, nr, last_daddr);
+		ret = eval("print %s", level > 0 ? dbp->print_node_entries :
+						   dbp->print_leaf_entries);
+		if (ret)
+			goto err;
+		if (dbp->has_rightsib(iocur_top->data, level)) {
+			ret = eval("addr %s", level > 0 ? dbp->go_node_forward :
+							  dbp->go_leaf_forward);
+			if (ret)
+				goto err;
+		}
+		nr++;
+	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
+
+	ret = eval("pop");
+	return ret;
+err:
+	eval("pop");
+	return ret;
+}
+
+static int
+dump_dabtree(
+	bool				dump_node_blocks,
+	struct dabprinter		*dbp)
+{
+	xfs_daddr_t			orig_daddr = iocur_top->bb;
+	xfs_daddr_t			last_daddr;
+	int				level;
+	int				ret;
+
+	ret = eval("push");
+	if (ret)
+		return ret;
+
+	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
+	level = dbp->level(iocur_top->data);
+	if (level < 0) {
+		printf(_("Current location is not part of a dir/attr btree.\n"));
+		goto err;
+	}
+
+	do {
+		last_daddr = iocur_top->bb;
+		if (level > 0) {
+			if (dump_node_blocks) {
+				ret = dump_dablevel(level, dbp);
+				if (ret)
+					goto err;
+			}
+			ret = eval("addr %s", dbp->go_down);
+		} else {
+			ret = dump_dablevel(level, dbp);
+		}
+		if (ret)
+			goto err;
+		level--;
+	} while (level >= 0 &&
+		 iocur_top->bb != orig_daddr &&
+		 iocur_top->bb != last_daddr);
+
+	ret = eval("pop");
+	return ret;
+err:
+	eval("pop");
+	return ret;
+}
+
 static int
 btdump_f(
 	int		argc,
@@ -234,6 +480,7 @@ btdump_f(
 {
 	bool		aflag = false;
 	bool		iflag = false;
+	bool		crc = xfs_sb_version_hascrc(&mp->m_sb);
 	int		c;
 
 	if (cur_typ == NULL) {
@@ -276,6 +523,10 @@ btdump_f(
 		return dump_btree_long(iflag);
 	case TYP_INODE:
 		return dump_inode(iflag, aflag);
+	case TYP_ATTR:
+		return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
+	case TYP_DIR2:
+		return dump_dabtree(iflag, crc ? &dir3_print : &dir_print);
 	default:
 		dbprintf(_("type \"%s\" is not a btree type or inode\n"),
 				cur_typ->name);
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index 6a97504..b3129f7 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -335,6 +335,7 @@ area of the inode, if neither option is given then both areas are shown.
 .B btdump [-a] [-i]
 If the cursor points to a btree node, dump the btree from that block downward.
 If instead the cursor points to an inode, dump the data fork block mapping btree if there is one.
+If the cursor points to a directory or extended attribute btree node, dump that.
 By default, only records stored in the btree are dumped.
 .RS 1.0i
 .TP 0.4i


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 5/7] xfs_db: print attribute remote value blocks
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
                   ` (3 preceding siblings ...)
  2017-07-31 21:07 ` [PATCH 4/7] xfs_db: dump dir/attr btrees Darrick J. Wong
@ 2017-07-31 21:07 ` Darrick J. Wong
  2017-08-01 17:15   ` Eric Sandeen
  2017-08-01 21:04   ` [PATCH v2 " Darrick J. Wong
  2017-07-31 21:07 ` [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs Darrick J. Wong
                   ` (2 subsequent siblings)
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:07 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

Teach xfs_db how to print the contents of xattr remote value blocks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/attr.c  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 db/attr.h  |    1 +
 db/field.c |    3 +++
 db/field.h |    1 +
 4 files changed, 64 insertions(+)


diff --git a/db/attr.c b/db/attr.c
index 23ffcd5..98fb069 100644
--- a/db/attr.c
+++ b/db/attr.c
@@ -41,6 +41,9 @@ static int	attr_leaf_nvlist_offset(void *obj, int startoff, int idx);
 static int	attr_node_btree_count(void *obj, int startoff);
 static int	attr_node_hdr_count(void *obj, int startoff);
 
+static int	attr_remote_count(void *obj, int startoff);
+static int	attr3_remote_count(void *obj, int startoff);
+
 const field_t	attr_hfld[] = {
 	{ "", FLDT_ATTR, OI(0), C1, 0, TYP_NONE },
 	{ NULL }
@@ -53,6 +56,7 @@ const field_t	attr_flds[] = {
 	  FLD_COUNT, TYP_NONE },
 	{ "hdr", FLDT_ATTR_NODE_HDR, OI(NOFF(hdr)), attr_node_hdr_count,
 	  FLD_COUNT, TYP_NONE },
+	{ "data", FLDT_CHARNS, OI(0), attr_remote_count, FLD_COUNT, TYP_NONE },
 	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)),
 	  attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
 	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count,
@@ -197,6 +201,33 @@ attr3_leaf_hdr_count(
 	return be16_to_cpu(leaf->hdr.info.hdr.magic) == XFS_ATTR3_LEAF_MAGIC;
 }
 
+static int
+attr_remote_count(
+	void		*obj,
+	int		startoff)
+{
+	if (attr_leaf_hdr_count(obj, startoff) == 0 &&
+	    attr_node_hdr_count(obj, startoff) == 0)
+		return mp->m_sb.sb_blocksize;
+	return 0;
+}
+
+static int
+attr3_remote_count(
+	void		*obj,
+	int		startoff)
+{
+	struct xfs_attr3_rmt_hdr	*hdr = obj;
+
+	ASSERT(startoff == 0);
+
+	if (hdr->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC))
+		return 0;
+	if (be32_to_cpu(hdr->rm_bytes) + sizeof(*hdr) > mp->m_sb.sb_blocksize)
+		return mp->m_sb.sb_blocksize - sizeof(*hdr);
+	return be32_to_cpu(hdr->rm_bytes);
+}
+
 typedef int (*attr_leaf_entry_walk_f)(struct xfs_attr_leafblock *,
 				      struct xfs_attr_leaf_entry *, int);
 static int
@@ -477,6 +508,17 @@ attr3_node_hdr_count(
 	return be16_to_cpu(node->hdr.info.hdr.magic) == XFS_DA3_NODE_MAGIC;
 }
 
+static int
+attr3_remote_hdr_count(
+	void			*obj,
+	int			startoff)
+{
+	struct xfs_attr3_rmt_hdr	*node = obj;
+
+	ASSERT(startoff == 0);
+	return be32_to_cpu(node->rm_magic) == XFS_ATTR3_RMT_MAGIC;
+}
+
 int
 attr_size(
 	void	*obj,
@@ -501,6 +543,8 @@ const field_t	attr3_flds[] = {
 	  FLD_COUNT, TYP_NONE },
 	{ "hdr", FLDT_ATTR3_NODE_HDR, OI(N3OFF(hdr)), attr3_node_hdr_count,
 	  FLD_COUNT, TYP_NONE },
+	{ "hdr", FLDT_ATTR3_REMOTE_HDR, OI(0), attr3_remote_hdr_count,
+	  FLD_COUNT, TYP_NONE },
 	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(L3OFF(entries)),
 	  attr3_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
 	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(N3OFF(__btree)),
@@ -543,6 +587,21 @@ const field_t	attr3_node_hdr_flds[] = {
 	{ NULL }
 };
 
+#define	RM3OFF(f)	bitize(offsetof(struct xfs_attr3_rmt_hdr, rm_ ## f))
+const struct field	attr3_remote_crc_flds[] = {
+	{ "magic", FLDT_UINT32X, OI(RM3OFF(magic)), C1, 0, TYP_NONE },
+	{ "offset", FLDT_UINT32D, OI(RM3OFF(offset)), C1, 0, TYP_NONE },
+	{ "bytes", FLDT_UINT32D, OI(RM3OFF(bytes)), C1, 0, TYP_NONE },
+	{ "crc", FLDT_CRC, OI(RM3OFF(crc)), C1, 0, TYP_NONE },
+	{ "uuid", FLDT_UUID, OI(RM3OFF(uuid)), C1, 0, TYP_NONE },
+	{ "owner", FLDT_INO, OI(RM3OFF(owner)), C1, 0, TYP_NONE },
+	{ "bno", FLDT_DFSBNO, OI(RM3OFF(blkno)), C1, 0, TYP_BMAPBTD },
+	{ "lsn", FLDT_UINT64X, OI(RM3OFF(lsn)), C1, 0, TYP_NONE },
+	{ "data", FLDT_CHARNS, OI(bitize(sizeof(struct xfs_attr3_rmt_hdr))),
+		attr3_remote_count, FLD_COUNT, TYP_NONE },
+	{ NULL }
+};
+
 /*
  * Special read verifier for attribute buffers. Detect the magic number
  * appropriately and set the correct verifier and call it.
diff --git a/db/attr.h b/db/attr.h
index 21848c1..565d6d8 100644
--- a/db/attr.h
+++ b/db/attr.h
@@ -32,6 +32,7 @@ extern const field_t	attr3_leaf_hdr_flds[];
 extern const field_t	attr3_node_hdr_flds[];
 extern const field_t	attr3_blkinfo_flds[];
 extern const field_t	attr3_node_hdr_flds[];
+extern const field_t	attr3_remote_crc_flds[];
 
 extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
 extern int	attr_size(void *obj, int startoff, int idx);
diff --git a/db/field.c b/db/field.c
index f1e5f35..ae4c805 100644
--- a/db/field.c
+++ b/db/field.c
@@ -99,6 +99,9 @@ const ftattr_t	ftattrtab[] = {
 	{ FLDT_ATTR3_NODE_HDR, "attr3_node_hdr", NULL,
 	  (char *)attr3_node_hdr_flds, SI(bitsz(struct xfs_da3_node_hdr)),
 	  0, NULL, attr3_node_hdr_flds },
+	{ FLDT_ATTR3_REMOTE_HDR, "attr3_remote_hdr", NULL,
+	  (char *)attr3_remote_crc_flds, attr_size, FTARG_SIZE, NULL,
+	  attr3_remote_crc_flds },
 
 	{ FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size,
 	  FTARG_SIZE, NULL, bmapbta_flds },
diff --git a/db/field.h b/db/field.h
index d1a7095..a8df29b 100644
--- a/db/field.h
+++ b/db/field.h
@@ -47,6 +47,7 @@ typedef enum fldt	{
 	FLDT_ATTR3_BLKINFO,
 	FLDT_ATTR3_LEAF_HDR,
 	FLDT_ATTR3_NODE_HDR,
+	FLDT_ATTR3_REMOTE_HDR,
 
 	FLDT_BMAPBTA,
 	FLDT_BMAPBTA_CRC,


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
                   ` (4 preceding siblings ...)
  2017-07-31 21:07 ` [PATCH 5/7] xfs_db: print attribute remote value blocks Darrick J. Wong
@ 2017-07-31 21:07 ` Darrick J. Wong
  2017-08-02  9:40   ` Carlos Maiolino
  2017-08-03 16:02   ` Eric Sandeen
  2017-07-31 21:07 ` [PATCH 7/7] xfs_db: introduce fuzz command Darrick J. Wong
  2017-08-03 17:04 ` [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor Darrick J. Wong
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:07 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

Extend typ_t to (optionally) store a pointer to a function to calculate
the CRC of the block, provide functions to do this for the dir3 and
attr3 types, and then wire up the write command so that we can modify
directory and extended attribute block fields.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/attr.c  |   32 ++++++++++++++++++++++++++++++++
 db/attr.h  |    1 +
 db/dir2.c  |   37 +++++++++++++++++++++++++++++++++++++
 db/dir2.h  |    1 +
 db/type.c  |    8 ++++----
 db/type.h  |    2 ++
 db/write.c |    3 +++
 7 files changed, 80 insertions(+), 4 deletions(-)


diff --git a/db/attr.c b/db/attr.c
index 98fb069..2fa6690 100644
--- a/db/attr.c
+++ b/db/attr.c
@@ -602,6 +602,38 @@ const struct field	attr3_remote_crc_flds[] = {
 	{ NULL }
 };
 
+/* Set the CRC. */
+void
+xfs_attr3_set_crc(
+	struct xfs_buf		*bp)
+{
+	__be32			magic32;
+	__be16			magic16;
+
+	magic32 = *(__be32 *)bp->b_addr;
+	magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
+
+	switch (magic16) {
+	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF);
+		return;
+	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
+		return;
+	default:
+		break;
+	}
+
+	switch (magic32) {
+	case cpu_to_be32(XFS_ATTR3_RMT_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_ATTR3_RMT_CRC_OFF);
+		return;
+	default:
+		dbprintf(_("Unknown attribute buffer type!\n"));
+		break;
+	}
+}
+
 /*
  * Special read verifier for attribute buffers. Detect the magic number
  * appropriately and set the correct verifier and call it.
diff --git a/db/attr.h b/db/attr.h
index 565d6d8..ba23480 100644
--- a/db/attr.h
+++ b/db/attr.h
@@ -36,5 +36,6 @@ extern const field_t	attr3_remote_crc_flds[];
 
 extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
 extern int	attr_size(void *obj, int startoff, int idx);
+extern void	xfs_attr3_set_crc(struct xfs_buf *bp);
 
 extern const struct xfs_buf_ops xfs_attr3_db_buf_ops;
diff --git a/db/dir2.c b/db/dir2.c
index 533f705..3e21a7b 100644
--- a/db/dir2.c
+++ b/db/dir2.c
@@ -981,6 +981,43 @@ const field_t	da3_node_hdr_flds[] = {
 	{ NULL }
 };
 
+/* Set the CRC. */
+void
+xfs_dir3_set_crc(
+	struct xfs_buf		*bp)
+{
+	__be32			magic32;
+	__be16			magic16;
+
+	magic32 = *(__be32 *)bp->b_addr;
+	magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
+
+	switch (magic32) {
+	case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
+	case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF);
+		return;
+	case cpu_to_be32(XFS_DIR3_FREE_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_DIR3_FREE_CRC_OFF);
+		return;
+	default:
+		break;
+	}
+
+	switch (magic16) {
+	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
+	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_DIR3_LEAF_CRC_OFF);
+		return;
+	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+		xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
+		return;
+	default:
+		dbprintf(_("Unknown directory buffer type! %x %x\n"), magic32, magic16);
+		break;
+	}
+}
+
 /*
  * Special read verifier for directory buffers. Detect the magic number
  * appropriately and set the correct verifier and call it.
diff --git a/db/dir2.h b/db/dir2.h
index 0c2a62e..1b87cd2 100644
--- a/db/dir2.h
+++ b/db/dir2.h
@@ -60,5 +60,6 @@ static inline uint8_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep)
 
 extern int	dir2_data_union_size(void *obj, int startoff, int idx);
 extern int	dir2_size(void *obj, int startoff, int idx);
+extern void	xfs_dir3_set_crc(struct xfs_buf *bp);
 
 extern const struct xfs_buf_ops xfs_dir3_db_buf_ops;
diff --git a/db/type.c b/db/type.c
index 10fa54e..bf31e04 100644
--- a/db/type.c
+++ b/db/type.c
@@ -87,7 +87,7 @@ static const typ_t	__typtab_crc[] = {
 	{ TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agi_buf_ops,
 		XFS_AGI_CRC_OFF },
 	{ TYP_ATTR, "attr3", handle_struct, attr3_hfld,
-		&xfs_attr3_db_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_attr3_db_buf_ops, TYP_F_CRC_FUNC, xfs_attr3_set_crc },
 	{ TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld,
 		&xfs_bmbt_buf_ops, XFS_BTREE_LBLOCK_CRC_OFF },
 	{ TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld,
@@ -102,7 +102,7 @@ static const typ_t	__typtab_crc[] = {
 		&xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
 	{ TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
-		&xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
 	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
 		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
 	{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
@@ -131,7 +131,7 @@ static const typ_t	__typtab_spcrc[] = {
 	{ TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agi_buf_ops ,
 		XFS_AGI_CRC_OFF },
 	{ TYP_ATTR, "attr3", handle_struct, attr3_hfld,
-		&xfs_attr3_db_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_attr3_db_buf_ops, TYP_F_CRC_FUNC, xfs_attr3_set_crc },
 	{ TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld,
 		&xfs_bmbt_buf_ops, XFS_BTREE_LBLOCK_CRC_OFF },
 	{ TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld,
@@ -146,7 +146,7 @@ static const typ_t	__typtab_spcrc[] = {
 		&xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
 	{ TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
-		&xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
 	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
 		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
 	{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,
diff --git a/db/type.h b/db/type.h
index 87ff107..85d89c7 100644
--- a/db/type.h
+++ b/db/type.h
@@ -45,6 +45,8 @@ typedef struct typ
 	const struct xfs_buf_ops *bops;
 	unsigned long		crc_off;
 #define TYP_F_NO_CRC_OFF	(-1UL)
+#define TYP_F_CRC_FUNC		(-2UL)
+	void			(*set_crc)(struct xfs_buf *);
 } typ_t;
 extern const typ_t	*typtab, *cur_typ;
 
diff --git a/db/write.c b/db/write.c
index d24ea05..266bde4 100644
--- a/db/write.c
+++ b/db/write.c
@@ -173,6 +173,9 @@ write_f(
 	} else if (iocur_top->dquot_buf) {
 		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
 		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
+	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
+		local_ops.verify_write = iocur_top->typ->set_crc;
+		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
 	} else { /* invalid data */
 		local_ops.verify_write = xfs_verify_recalc_crc;
 		dbprintf(_("Allowing write of corrupted data with good CRC\n"));


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 7/7] xfs_db: introduce fuzz command
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
                   ` (5 preceding siblings ...)
  2017-07-31 21:07 ` [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs Darrick J. Wong
@ 2017-07-31 21:07 ` Darrick J. Wong
  2017-08-02 11:06   ` Carlos Maiolino
  2017-08-03 16:47   ` [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Eric Sandeen
  2017-08-03 17:04 ` [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor Darrick J. Wong
  7 siblings, 2 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:07 UTC (permalink / raw)
  To: sandeen, darrick.wong; +Cc: linux-xfs

From: Darrick J. Wong <darrick.wong@oracle.com>

Introduce a new 'fuzz' command to write creative values into
disk structure fields.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/Makefile       |    3 
 db/bit.c          |   17 +-
 db/bit.h          |    5 -
 db/command.c      |    2 
 db/fuzz.c         |  467 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 db/fuzz.h         |   21 ++
 db/type.c         |   44 ++++-
 db/type.h         |    1 
 man/man8/xfs_db.8 |   49 ++++++
 9 files changed, 589 insertions(+), 20 deletions(-)
 create mode 100644 db/fuzz.c
 create mode 100644 db/fuzz.h


diff --git a/db/Makefile b/db/Makefile
index 6618bff..8111bf1 100644
--- a/db/Makefile
+++ b/db/Makefile
@@ -12,7 +12,8 @@ HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \
 	dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \
 	flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \
 	io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \
-	 sig.h strvec.h text.h type.h write.h attrset.h symlink.h fsmap.h
+	sig.h strvec.h text.h type.h write.h attrset.h symlink.h fsmap.h \
+	fuzz.h
 CFILES = $(HFILES:.h=.c) btdump.c
 LSRCFILES = xfs_admin.sh xfs_ncheck.sh xfs_metadump.sh
 
diff --git a/db/bit.c b/db/bit.c
index f5ebf68..a20b6ba 100644
--- a/db/bit.c
+++ b/db/bit.c
@@ -19,13 +19,8 @@
 #include "libxfs.h"
 #include "bit.h"
 
-#undef setbit	/* defined in param.h on Linux */
-
-static int	getbit(char *ptr, int bit);
-static void	setbit(char *ptr, int bit, int val);
-
-static int
-getbit(
+int
+getbit_l(
 	char	*ptr,
 	int	bit)
 {
@@ -39,8 +34,8 @@ getbit(
 	return (*ptr & mask) >> shift;
 }
 
-static void
-setbit(
+void
+setbit_l(
 	char *ptr,
 	int  bit,
 	int  val)
@@ -106,7 +101,7 @@ getbitval(
 
 
 	for (i = 0, rval = 0LL; i < nbits; i++) {
-		if (getbit(p, bit + i)) {
+		if (getbit_l(p, bit + i)) {
 			/* If the last bit is on and we care about sign
 			 * bits and we don't have a full 64 bit
 			 * container, turn all bits on between the
@@ -162,7 +157,7 @@ setbitval(
 
 	if (bitoff % NBBY || nbits % NBBY) {
 		for (bit = 0; bit < nbits; bit++)
-			setbit(out, bit + bitoff, getbit(in, bit));
+			setbit_l(out, bit + bitoff, getbit_l(in, bit));
 	} else
 		memcpy(out + byteize(bitoff), in, byteize(nbits));
 }
diff --git a/db/bit.h b/db/bit.h
index 9fd71f4..78fcd05 100644
--- a/db/bit.h
+++ b/db/bit.h
@@ -21,9 +21,12 @@
 #define	bitszof(x,y)	bitize(szof(x,y))
 #define	byteize(s)	((s) / NBBY)
 #define	bitoffs(s)	((s) % NBBY)
+#define	byteize_up(s)	(((s) + NBBY - 1) / NBBY)
 
 #define	BVUNSIGNED	0
 #define	BVSIGNED	1
 
 extern int64_t		getbitval(void *obj, int bitoff, int nbits, int flags);
-extern void             setbitval(void *obuf, int bitoff, int nbits, void *ibuf);
+extern void		setbitval(void *obuf, int bitoff, int nbits, void *ibuf);
+extern int		getbit_l(char *ptr, int bit);
+extern void		setbit_l(char *ptr, int bit, int val);
diff --git a/db/command.c b/db/command.c
index c90c85c..5ff3c4f 100644
--- a/db/command.c
+++ b/db/command.c
@@ -51,6 +51,7 @@
 #include "dquot.h"
 #include "fsmap.h"
 #include "crc.h"
+#include "fuzz.h"
 
 cmdinfo_t	*cmdtab;
 int		ncmds;
@@ -147,4 +148,5 @@ init_commands(void)
 	type_init();
 	write_init();
 	dquot_init();
+	fuzz_init();
 }
diff --git a/db/fuzz.c b/db/fuzz.c
new file mode 100644
index 0000000..b4c62ca
--- /dev/null
+++ b/db/fuzz.c
@@ -0,0 +1,467 @@
+/*
+ * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "libxfs.h"
+#include <ctype.h>
+#include <time.h>
+#include "bit.h"
+#include "block.h"
+#include "command.h"
+#include "type.h"
+#include "faddr.h"
+#include "fprint.h"
+#include "field.h"
+#include "flist.h"
+#include "io.h"
+#include "init.h"
+#include "output.h"
+#include "print.h"
+#include "write.h"
+#include "malloc.h"
+
+static int	fuzz_f(int argc, char **argv);
+static void     fuzz_help(void);
+
+static const cmdinfo_t	fuzz_cmd =
+	{ "fuzz", NULL, fuzz_f, 0, -1, 0, N_("[-c] [-d] field fuzzcmd..."),
+	  N_("fuzz values on disk"), fuzz_help };
+
+void
+fuzz_init(void)
+{
+	if (!expert_mode)
+		return;
+
+	add_command(&fuzz_cmd);
+	srand48(clock());
+}
+
+static void
+fuzz_help(void)
+{
+	dbprintf(_(
+"\n"
+" The 'fuzz' command fuzzes fields in any on-disk data structure.  For\n"
+" block fuzzing, see the 'blocktrash' or 'write' commands."
+"\n"
+" Examples:\n"
+"  Struct mode: 'fuzz core.uid zeroes'    - set an inode uid field to 0.\n"
+"               'fuzz crc ones'           - set a crc filed to all ones.\n"
+"               'fuzz bno[11] firstbit'   - set the high bit of a block array.\n"
+"               'fuzz keys[5].startblock add'    - increase a btree key value.\n"
+"               'fuzz uuid random'        - randomize the superblock uuid.\n"
+"\n"
+" In data mode type 'fuzz' by itself for a list of specific commands.\n\n"
+" Specifying the -c option will allow writes of invalid (corrupt) data with\n"
+" an invalid CRC. Specifying the -d option will allow writes of invalid data,\n"
+" but still recalculate the CRC so we are forced to check and detect the\n"
+" invalid data appropriately.\n\n"
+));
+
+}
+
+static int
+fuzz_f(
+	int		argc,
+	char		**argv)
+{
+	pfunc_t	pf;
+	extern char *progname;
+	int c;
+	bool corrupt = false;	/* Allow write of bad data w/ invalid CRC */
+	bool invalid_data = false; /* Allow write of bad data w/ valid CRC */
+	struct xfs_buf_ops local_ops;
+	const struct xfs_buf_ops *stashed_ops = NULL;
+
+	if (x.isreadonly & LIBXFS_ISREADONLY) {
+		dbprintf(_("%s started in read only mode, fuzzing disabled\n"),
+			progname);
+		return 0;
+	}
+
+	if (cur_typ == NULL) {
+		dbprintf(_("no current type\n"));
+		return 0;
+	}
+
+	pf = cur_typ->pfunc;
+	if (pf == NULL) {
+		dbprintf(_("no handler function for type %s, fuzz unsupported.\n"),
+			 cur_typ->name);
+		return 0;
+	}
+
+	while ((c = getopt(argc, argv, "cd")) != EOF) {
+		switch (c) {
+		case 'c':
+			corrupt = true;
+			break;
+		case 'd':
+			invalid_data = true;
+			break;
+		default:
+			dbprintf(_("bad option for fuzz command\n"));
+			return 0;
+		}
+	}
+
+	if (corrupt && invalid_data) {
+		dbprintf(_("Cannot specify both -c and -d options\n"));
+		return 0;
+	}
+
+	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
+			!iocur_top->ino_buf && !iocur_top->dquot_buf) {
+		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
+		return 0;
+	}
+
+	argc -= optind;
+	argv += optind;
+
+	/*
+	 * If the buffer has no verifier or we are using standard verifier
+	 * paths, then just fuzz it and return
+	 */
+	if (!iocur_top->bp->b_ops ||
+	    !(corrupt || invalid_data)) {
+		(*pf)(DB_FUZZ, cur_typ->fields, argc, argv);
+		return 0;
+	}
+
+
+	/* Temporarily remove write verifier to write bad data */
+	stashed_ops = iocur_top->bp->b_ops;
+	local_ops.verify_read = stashed_ops->verify_read;
+	iocur_top->bp->b_ops = &local_ops;
+
+	if (corrupt) {
+		local_ops.verify_write = xfs_dummy_verify;
+		dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n"));
+	} else if (iocur_top->ino_buf) {
+		local_ops.verify_write = xfs_verify_recalc_inode_crc;
+		dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n"));
+	} else if (iocur_top->dquot_buf) {
+		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
+		dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n"));
+	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
+		local_ops.verify_write = iocur_top->typ->set_crc;
+		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
+	} else { /* invalid data */
+		local_ops.verify_write = xfs_verify_recalc_crc;
+		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
+	}
+
+	(*pf)(DB_FUZZ, cur_typ->fields, argc, argv);
+
+	iocur_top->bp->b_ops = stashed_ops;
+
+	return 0;
+}
+
+/* Write zeroes to the field */
+static bool
+fuzz_zeroes(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	char		*out = buf;
+	int		bit;
+
+	if (bitoff % NBBY || nbits % NBBY) {
+		for (bit = 0; bit < nbits; bit++)
+			setbit_l(out, bit + bitoff, 0);
+	} else
+		memset(out + byteize(bitoff), 0, byteize(nbits));
+	return true;
+}
+
+/* Write ones to the field */
+static bool
+fuzz_ones(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	char		*out = buf;
+	int		bit;
+
+	if (bitoff % NBBY || nbits % NBBY) {
+		for (bit = 0; bit < nbits; bit++)
+			setbit_l(out, bit + bitoff, 1);
+	} else
+		memset(out + byteize(bitoff), 0xFF, byteize(nbits));
+	return true;
+}
+
+/* Flip the high bit in the (presumably big-endian) field */
+static bool
+fuzz_firstbit(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	setbit_l((char *)buf, bitoff, !getbit_l((char *)buf, bitoff));
+	return true;
+}
+
+/* Flip the low bit in the (presumably big-endian) field */
+static bool
+fuzz_lastbit(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	setbit_l((char *)buf, bitoff + nbits - 1,
+			!getbit_l((char *)buf, bitoff));
+	return true;
+}
+
+/* Flip the middle bit in the (presumably big-endian) field */
+static bool
+fuzz_middlebit(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	setbit_l((char *)buf, bitoff + nbits / 2,
+			!getbit_l((char *)buf, bitoff));
+	return true;
+}
+
+/* Format and shift a number into a buffer for setbitval. */
+static char *
+format_number(
+	uint64_t	val,
+	__be64		*out,
+	int		bit_length)
+{
+	int		offset;
+	char		*rbuf = (char *)out;
+
+	/*
+	 * If the length of the field is not a multiple of a byte, push
+	 * the bits up in the field, so the most signicant field bit is
+	 * the most significant bit in the byte:
+	 *
+	 * before:
+	 * val  |----|----|----|----|----|--MM|mmmm|llll|
+	 * after
+	 * val  |----|----|----|----|----|MMmm|mmll|ll00|
+	 */
+	offset = bit_length % NBBY;
+	if (offset)
+		val <<= (NBBY - offset);
+
+	/*
+	 * convert to big endian and copy into the array
+	 * rbuf |----|----|----|----|----|MMmm|mmll|ll00|
+	 */
+	*out = cpu_to_be64(val);
+
+	/*
+	 * Align the array to point to the field in the array.
+	 *  rbuf  = |MMmm|mmll|ll00|
+	 */
+	offset = sizeof(__be64) - 1 - ((bit_length - 1) / sizeof(__be64));
+	return rbuf + offset;
+}
+
+/* Increase the value by some small prime number. */
+static bool
+fuzz_add(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	uint64_t	val;
+	__be64		out;
+	char		*b;
+
+	if (nbits > 64)
+		return false;
+
+	val = getbitval(buf, bitoff, nbits, BVUNSIGNED);
+	val += (nbits > 8 ? 2017 : 137);
+	b = format_number(val, &out, nbits);
+	setbitval(buf, bitoff, nbits, b);
+
+	return true;
+}
+
+/* Decrease the value by some small prime number. */
+static bool
+fuzz_sub(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	uint64_t	val;
+	__be64		out;
+	char		*b;
+
+	if (nbits > 64)
+		return false;
+
+	val = getbitval(buf, bitoff, nbits, BVUNSIGNED);
+	val -= (nbits > 8 ? 2017 : 137);
+	b = format_number(val, &out, nbits);
+	setbitval(buf, bitoff, nbits, b);
+
+	return true;
+}
+
+/* Randomize the field. */
+static bool
+fuzz_random(
+	void		*buf,
+	int		bitoff,
+	int		nbits)
+{
+	int		i, bytes;
+	char		*b, *rbuf;
+
+	bytes = byteize_up(nbits);
+	rbuf = b = malloc(bytes);
+	if (!b) {
+		perror("fuzz_random");
+		return false;
+	}
+
+	for (i = 0; i < bytes; i++)
+		*b++ = (char)lrand48();
+
+	setbitval(buf, bitoff, nbits, rbuf);
+	free(rbuf);
+
+	return true;
+}
+
+struct fuzzcmd {
+	const char	*verb;
+	bool		(*fn)(void *buf, int bitoff, int nbits);
+};
+
+/* Keep these verbs in sync with enum fuzzcmds. */
+static struct fuzzcmd fuzzverbs[] = {
+	{"zeroes",		fuzz_zeroes},
+	{"ones",		fuzz_ones},
+	{"firstbit",		fuzz_firstbit},
+	{"middlebit",		fuzz_middlebit},
+	{"lastbit",		fuzz_lastbit},
+	{"add",			fuzz_add},
+	{"sub",			fuzz_sub},
+	{"random",		fuzz_random},
+	{NULL,			NULL},
+};
+
+/* ARGSUSED */
+void
+fuzz_struct(
+	const field_t	*fields,
+	int		argc,
+	char		**argv)
+{
+	const ftattr_t	*fa;
+	flist_t		*fl;
+	flist_t		*sfl;
+	int		bit_length;
+	struct fuzzcmd	*fc;
+	bool		success;
+	int		parentoffset;
+
+	if (argc != 2) {
+		dbprintf(_("Usage: fuzz fieldname verb\n"));
+		dbprintf("Verbs: %s", fuzzverbs->verb);
+		for (fc = fuzzverbs + 1; fc->verb != NULL; fc++)
+			dbprintf(", %s", fc->verb);
+		dbprintf(".\n");
+		return;
+	}
+
+	fl = flist_scan(argv[0]);
+	if (!fl) {
+		dbprintf(_("unable to parse '%s'.\n"), argv[0]);
+		return;
+	}
+
+	/* Find our fuzz verb */
+	for (fc = fuzzverbs; fc->verb != NULL; fc++)
+		if (!strcmp(fc->verb, argv[1]))
+			break;
+	if (fc->fn == NULL) {
+		dbprintf(_("Unknown fuzz command '%s'.\n"), argv[1]);
+		return;
+	}
+
+	/* if we're a root field type, go down 1 layer to get field list */
+	if (fields->name[0] == '\0') {
+		fa = &ftattrtab[fields->ftyp];
+		ASSERT(fa->ftyp == fields->ftyp);
+		fields = fa->subfld;
+	}
+
+	/* run down the field list and set offsets into the data */
+	if (!flist_parse(fields, fl, iocur_top->data, 0)) {
+		flist_free(fl);
+		dbprintf(_("parsing error\n"));
+		return;
+	}
+
+	sfl = fl;
+	parentoffset = 0;
+	while (sfl->child) {
+		parentoffset = sfl->offset;
+		sfl = sfl->child;
+	}
+
+	/*
+	 * For structures, fsize * fcount tells us the size of the region we are
+	 * modifying, which is usually a single structure member and is pointed
+	 * to by the last child in the list.
+	 *
+	 * However, if the base structure is an array and we have a direct index
+	 * into the array (e.g. write bno[5]) then we are returned a single
+	 * flist object with the offset pointing directly at the location we
+	 * need to modify. The length of the object we are modifying is then
+	 * determined by the size of the individual array entry (fsize) and the
+	 * indexes defined in the object, not the overall size of the array
+	 * (which is what fcount returns).
+	 */
+	bit_length = fsize(sfl->fld, iocur_top->data, parentoffset, 0);
+	if (sfl->fld->flags & FLD_ARRAY)
+		bit_length *= sfl->high - sfl->low + 1;
+	else
+		bit_length *= fcount(sfl->fld, iocur_top->data, parentoffset);
+
+	/* Fuzz the value */
+	success = fc->fn(iocur_top->data, sfl->offset, bit_length);
+	if (!success) {
+		dbprintf(_("unable to fuzz field '%s'\n"), argv[0]);
+		flist_free(fl);
+		return;
+	}
+
+	/* Write the fuzzed value back */
+	write_cur();
+
+	flist_print(fl);
+	print_flist(fl);
+	flist_free(fl);
+}
diff --git a/db/fuzz.h b/db/fuzz.h
new file mode 100644
index 0000000..c203eb5
--- /dev/null
+++ b/db/fuzz.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2017 Oracle.  All Rights Reserved.
+ *
+ * Author: Darrick J. Wong <darrick.wong@oracle.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+extern void	fuzz_init(void);
+extern void	fuzz_struct(const field_t *fields, int argc, char **argv);
diff --git a/db/type.c b/db/type.c
index bf31e04..740adc0 100644
--- a/db/type.c
+++ b/db/type.c
@@ -39,6 +39,7 @@
 #include "dir2.h"
 #include "text.h"
 #include "symlink.h"
+#include "fuzz.h"
 
 static const typ_t	*findtyp(char *name);
 static int		type_f(int argc, char **argv);
@@ -254,10 +255,17 @@ handle_struct(
 	int           argc,
 	char          **argv)
 {
-	if (action == DB_WRITE)
+	switch (action) {
+	case DB_FUZZ:
+		fuzz_struct(fields, argc, argv);
+		break;
+	case DB_WRITE:
 		write_struct(fields, argc, argv);
-	else
+		break;
+	case DB_READ:
 		print_struct(fields, argc, argv);
+		break;
+	}
 }
 
 void
@@ -267,10 +275,17 @@ handle_string(
 	int           argc,
 	char          **argv)
 {
-	if (action == DB_WRITE)
+	switch (action) {
+	case DB_WRITE:
 		write_string(fields, argc, argv);
-	else
+		break;
+	case DB_READ:
 		print_string(fields, argc, argv);
+		break;
+	case DB_FUZZ:
+		dbprintf(_("string fuzzing not supported.\n"));
+		break;
+	}
 }
 
 void
@@ -280,10 +295,17 @@ handle_block(
 	int           argc,
 	char          **argv)
 {
-	if (action == DB_WRITE)
+	switch (action) {
+	case DB_WRITE:
 		write_block(fields, argc, argv);
-	else
+		break;
+	case DB_READ:
 		print_block(fields, argc, argv);
+		break;
+	case DB_FUZZ:
+		dbprintf(_("use 'blocktrash' or 'write' to fuzz a block.\n"));
+		break;
+	}
 }
 
 void
@@ -293,6 +315,14 @@ handle_text(
 	int           argc,
 	char          **argv)
 {
-	if (action != DB_WRITE)
+	switch (action) {
+	case DB_FUZZ:
+		/* fall through */
+	case DB_WRITE:
+		dbprintf(_("text writing/fuzzing not supported.\n"));
+		break;
+	case DB_READ:
 		print_text(fields, argc, argv);
+		break;
+	}
 }
diff --git a/db/type.h b/db/type.h
index 85d89c7..3971975 100644
--- a/db/type.h
+++ b/db/type.h
@@ -30,6 +30,7 @@ typedef enum typnm
 	TYP_TEXT, TYP_FINOBT, TYP_NONE
 } typnm_t;
 
+#define DB_FUZZ  2
 #define DB_WRITE 1
 #define DB_READ  0
 
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index b3129f7..49e665a 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -613,6 +613,55 @@ in units of 512-byte blocks, no matter what the filesystem's block size is.
 .BI "The optional " start " and " end " arguments can be used to constrain
 the output to a particular range of disk blocks.
 .TP
+.BI "fuzz [\-c] [\-d] " "field action"
+Write garbage into a specific structure field on disk.
+Expert mode must be enabled to use this command.
+The operation happens immediately; there is no buffering.
+.IP
+The fuzz command can take the following
+.IR action "s"
+against a field:
+.RS 1.0i
+.TP 0.4i
+.B zeroes
+Clears all bits in the field.
+.TP 0.4i
+.B ones
+Sets all bits in the field.
+.TP 0.4i
+.B firstbit
+Flips the first bit in the field.
+For a scalar value, this is the highest bit.
+.TP 0.4i
+.B middlebit
+Flips the middle bit in the field.
+.TP 0.4i
+.B lastbit
+Flips the last bit in the field.
+For a scalar value, this is the lowest bit.
+.TP 0.4i
+.B add
+Adds a small value to a scalar field.
+.TP 0.4i
+.B sub
+Subtracts a small value from a scalar field.
+.TP 0.4i
+.B random
+Randomizes the contents of the field.
+.RE
+.IP
+The following switches affect the write behavior:
+.RS 1.0i
+.TP 0.4i
+.B \-c
+Skip write verifiers and CRC recalculation; allows invalid data to be written
+to disk.
+.TP 0.4i
+.B \-d
+Skip write verifiers but perform CRC recalculation; allows invalid data to be
+written to disk to test detection of invalid data.
+.RE
+.TP
 .BI hash " string
 Prints the hash value of
 .I string


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 1/7] xfs: remove double-underscore integer types
  2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
@ 2017-07-31 21:23   ` Eric Sandeen
  2017-07-31 21:25     ` Darrick J. Wong
  2017-08-02  9:13   ` Carlos Maiolino
  1 sibling, 1 reply; 38+ messages in thread
From: Eric Sandeen @ 2017-07-31 21:23 UTC (permalink / raw)
  To: Darrick J. Wong, sandeen; +Cc: linux-xfs

On 7/31/17 4:06 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> This is a purely mechanical patch that removes the private
> __{u,}int{8,16,32,64}_t typedefs in favor of using the system
> {u,}int{8,16,32,64}_t typedefs.  This is the sed script used to perform
> the transformation and fix the resulting whitespace and indentation
> errors:
> 
> s/typedef\t__uint8_t/typedef __uint8_t\t/g
> s/typedef\t__uint/typedef __uint/g
> s/typedef\t__int\([0-9]*\)_t/typedef int\1_t\t/g
> s/__uint8_t\t/__uint8_t\t\t/g
> s/__uint/uint/g
> s/__int\([0-9]*\)_t\t/__int\1_t\t\t/g
> s/__int/int/g
> /^typedef.*int[0-9]*_t;$/d
> 

Thanks - I did this too and fixed up some incidentals, interdiff follows.

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

and I'll add the delta below on the way in if you don't mind.

(just issues on the changed lines that would have been caught if 
done manually, I think - mostly whitespace nitpicks)

Thanks,
-Eric



diff -u b/db/inode.c b/db/inode.c
--- b/db/inode.c
+++ b/db/inode.c
@@ -146,22 +146,22 @@
 	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_RTINHERIT_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "projinherit", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_PROJINHERIT_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_PROJINHERIT_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "nosymlinks", FLDT_UINT1,
 	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NOSYMLINKS_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "extsz", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSIZE_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSIZE_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "extszinherit", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSZINHERIT_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSZINHERIT_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "nodefrag", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NODEFRAG_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NODEFRAG_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "filestream", FLDT_UINT1,
-	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1),C1,
+	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1), C1,
 	  0, TYP_NONE },
 	{ "gen", FLDT_UINT32D, OI(COFF(gen)), C1, 0, TYP_NONE },
 	{ NULL }
diff -u b/db/metadump.c b/db/metadump.c
--- b/db/metadump.c
+++ b/db/metadump.c
@@ -2270,7 +2270,7 @@
 	return success;
 }
 
-static uint32_t	inodes_copied = 0;
+static uint32_t	inodes_copied;
 
 static int
 copy_inode_chunk(
diff -u b/logprint/log_misc.c b/logprint/log_misc.c
--- b/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -171,7 +171,7 @@
 
     *ptr += len;
 
-    magic=*(uint32_t*)cptr; /* XXX be32_to_cpu soon */
+    magic = *(uint32_t *)cptr; /* XXX be32_to_cpu soon */
 
     if (len >= 4) {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
diff -u b/repair/globals.h b/repair/globals.h
--- b/repair/globals.h
+++ b/repair/globals.h
@@ -177,8 +177,8 @@
 };
 EXTERN struct aglock	*ag_locks;
 
-EXTERN int 		report_interval;
-EXTERN uint64_t 	*prog_rpt_done;
+EXTERN int		report_interval;
+EXTERN uint64_t		*prog_rpt_done;
 
 EXTERN int		ag_stride;
 EXTERN int		thread_count;
diff -u b/repair/phase5.c b/repair/phase5.c
--- b/repair/phase5.c
+++ b/repair/phase5.c
@@ -2471,7 +2471,7 @@
 	int			error;
 
 	do_log(_("Phase 5 - rebuild AG headers and trees...\n"));
-	set_progress_msg(PROG_FMT_REBUILD_AG, (uint64_t )glob_agcount);
+	set_progress_msg(PROG_FMT_REBUILD_AG, (uint64_t)glob_agcount);
 
 #ifdef XR_BLD_FREE_TRACE
 	fprintf(stderr, "inobt level 1, maxrec = %d, minrec = %d\n",
diff -u b/repair/progress.c b/repair/progress.c
--- b/repair/progress.c
+++ b/repair/progress.c
@@ -114,7 +114,7 @@
 	 */
 
 	if ((prog_rpt_done = (uint64_t *)
-		malloc(sizeof(uint64_t)*glob_agcount)) == NULL ) {
+		malloc(sizeof(uint64_t)*glob_agcount)) == NULL) {
 		do_error(_("cannot malloc pointer to done vector\n"));
 	}
 	bzero(prog_rpt_done, sizeof(uint64_t)*glob_agcount);
@@ -286,7 +286,7 @@
 }
 
 int
-set_progress_msg (int report, uint64_t total)
+set_progress_msg(int report, uint64_t total)
 {
 
 	if (!ag_stride)



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 1/7] xfs: remove double-underscore integer types
  2017-07-31 21:23   ` Eric Sandeen
@ 2017-07-31 21:25     ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-07-31 21:25 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: sandeen, linux-xfs

On Mon, Jul 31, 2017 at 04:23:19PM -0500, Eric Sandeen wrote:
> On 7/31/17 4:06 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > This is a purely mechanical patch that removes the private
> > __{u,}int{8,16,32,64}_t typedefs in favor of using the system
> > {u,}int{8,16,32,64}_t typedefs.  This is the sed script used to perform
> > the transformation and fix the resulting whitespace and indentation
> > errors:
> > 
> > s/typedef\t__uint8_t/typedef __uint8_t\t/g
> > s/typedef\t__uint/typedef __uint/g
> > s/typedef\t__int\([0-9]*\)_t/typedef int\1_t\t/g
> > s/__uint8_t\t/__uint8_t\t\t/g
> > s/__uint/uint/g
> > s/__int\([0-9]*\)_t\t/__int\1_t\t\t/g
> > s/__int/int/g
> > /^typedef.*int[0-9]*_t;$/d
> > 
> 
> Thanks - I did this too and fixed up some incidentals, interdiff follows.
> 
> Reviewed-by: Eric Sandeen <sandeen@redhat.com>
> 
> and I'll add the delta below on the way in if you don't mind.
> 
> (just issues on the changed lines that would have been caught if 
> done manually, I think - mostly whitespace nitpicks)

Looks fine to me,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D
> 
> Thanks,
> -Eric
> 
> 
> 
> diff -u b/db/inode.c b/db/inode.c
> --- b/db/inode.c
> +++ b/db/inode.c
> @@ -146,22 +146,22 @@
>  	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_RTINHERIT_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "projinherit", FLDT_UINT1,
> -	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_PROJINHERIT_BIT-1),C1,
> +	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_PROJINHERIT_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "nosymlinks", FLDT_UINT1,
>  	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NOSYMLINKS_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "extsz", FLDT_UINT1,
> -	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSIZE_BIT-1),C1,
> +	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSIZE_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "extszinherit", FLDT_UINT1,
> -	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSZINHERIT_BIT-1),C1,
> +	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_EXTSZINHERIT_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "nodefrag", FLDT_UINT1,
> -	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NODEFRAG_BIT-1),C1,
> +	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_NODEFRAG_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "filestream", FLDT_UINT1,
> -	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1),C1,
> +	  OI(COFF(flags) + bitsz(uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1), C1,
>  	  0, TYP_NONE },
>  	{ "gen", FLDT_UINT32D, OI(COFF(gen)), C1, 0, TYP_NONE },
>  	{ NULL }
> diff -u b/db/metadump.c b/db/metadump.c
> --- b/db/metadump.c
> +++ b/db/metadump.c
> @@ -2270,7 +2270,7 @@
>  	return success;
>  }
>  
> -static uint32_t	inodes_copied = 0;
> +static uint32_t	inodes_copied;
>  
>  static int
>  copy_inode_chunk(
> diff -u b/logprint/log_misc.c b/logprint/log_misc.c
> --- b/logprint/log_misc.c
> +++ b/logprint/log_misc.c
> @@ -171,7 +171,7 @@
>  
>      *ptr += len;
>  
> -    magic=*(uint32_t*)cptr; /* XXX be32_to_cpu soon */
> +    magic = *(uint32_t *)cptr; /* XXX be32_to_cpu soon */
>  
>      if (len >= 4) {
>  #if __BYTE_ORDER == __LITTLE_ENDIAN
> diff -u b/repair/globals.h b/repair/globals.h
> --- b/repair/globals.h
> +++ b/repair/globals.h
> @@ -177,8 +177,8 @@
>  };
>  EXTERN struct aglock	*ag_locks;
>  
> -EXTERN int 		report_interval;
> -EXTERN uint64_t 	*prog_rpt_done;
> +EXTERN int		report_interval;
> +EXTERN uint64_t		*prog_rpt_done;
>  
>  EXTERN int		ag_stride;
>  EXTERN int		thread_count;
> diff -u b/repair/phase5.c b/repair/phase5.c
> --- b/repair/phase5.c
> +++ b/repair/phase5.c
> @@ -2471,7 +2471,7 @@
>  	int			error;
>  
>  	do_log(_("Phase 5 - rebuild AG headers and trees...\n"));
> -	set_progress_msg(PROG_FMT_REBUILD_AG, (uint64_t )glob_agcount);
> +	set_progress_msg(PROG_FMT_REBUILD_AG, (uint64_t)glob_agcount);
>  
>  #ifdef XR_BLD_FREE_TRACE
>  	fprintf(stderr, "inobt level 1, maxrec = %d, minrec = %d\n",
> diff -u b/repair/progress.c b/repair/progress.c
> --- b/repair/progress.c
> +++ b/repair/progress.c
> @@ -114,7 +114,7 @@
>  	 */
>  
>  	if ((prog_rpt_done = (uint64_t *)
> -		malloc(sizeof(uint64_t)*glob_agcount)) == NULL ) {
> +		malloc(sizeof(uint64_t)*glob_agcount)) == NULL) {
>  		do_error(_("cannot malloc pointer to done vector\n"));
>  	}
>  	bzero(prog_rpt_done, sizeof(uint64_t)*glob_agcount);
> @@ -286,7 +286,7 @@
>  }
>  
>  int
> -set_progress_msg (int report, uint64_t total)
> +set_progress_msg(int report, uint64_t total)
>  {
>  
>  	if (!ag_stride)
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN
  2017-07-31 21:07 ` [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN Darrick J. Wong
@ 2017-07-31 21:42   ` Eric Sandeen
  2017-08-02  9:14   ` Carlos Maiolino
  1 sibling, 0 replies; 38+ messages in thread
From: Eric Sandeen @ 2017-07-31 21:42 UTC (permalink / raw)
  To: Darrick J. Wong, sandeen; +Cc: linux-xfs

On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> XFS has a maximum symlink target length of 1024 bytes; this is a
> holdover from the Irix days.  Unfortunately, the constant establishing
> this was 'MAXPATHLEN', and is /not/ the same as the Linux MAXPATHLEN,
> which is 4096.
> 
> The kernel enforces its 1024 byte MAXPATHLEN on symlink targets, but
> xfsprogs picks up the (Linux) system 4096 byte MAXPATHLEN, which means
> that xfs_repair doesn't complain about oversized symlinks.
> 
> Since this is an on-disk format constraint, put the define in the XFS
> namespace.  As a side effect of the rename, xfs_repair wil detect
> oversized symlinks and clean them off the system.

null_check() is only used for symlinks today, but it's not described
as such, so I was on the fence about shortening the ASSERT in there.

but meh, not worth haggling over.

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

> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  repair/dinode.c     |    6 +++---
>  repair/xfs_repair.c |    2 +-
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/repair/dinode.c b/repair/dinode.c
> index da87217..f005335 100644
> --- a/repair/dinode.c
> +++ b/repair/dinode.c
> @@ -1259,7 +1259,7 @@ null_check(char *name, int length)
>  {
>  	int i;
>  
> -	ASSERT(length < MAXPATHLEN);
> +	ASSERT(length < XFS_SYMLINK_MAXLEN);
>  
>  	for (i = 0; i < length; i++, name++)  {
>  		if (*name == '\0')
> @@ -1371,7 +1371,7 @@ process_symlink(
>  	blkmap_t 	*blkmap)
>  {
>  	char			*symlink;
> -	char			data[MAXPATHLEN];
> +	char			data[XFS_SYMLINK_MAXLEN];
>  
>  	/*
>  	 * check size against kernel symlink limits.  we know
> @@ -1379,7 +1379,7 @@ process_symlink(
>  	 * the inode is structurally ok so we don't have to check
>  	 * for that
>  	 */
> -	if (be64_to_cpu(dino->di_size) >= MAXPATHLEN)  {
> +	if (be64_to_cpu(dino->di_size) >= XFS_SYMLINK_MAXLEN)  {
>  	       do_warn(_("symlink in inode %" PRIu64 " too long (%llu chars)\n"),
>  		       lino, (unsigned long long) be64_to_cpu(dino->di_size));
>  		return(1);
> diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
> index ab60c0f..b2dd91b 100644
> --- a/repair/xfs_repair.c
> +++ b/repair/xfs_repair.c
> @@ -761,7 +761,7 @@ main(int argc, char **argv)
>  	glob_agcount = mp->m_sb.sb_agcount;
>  
>  	chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK;
> -	max_symlink_blocks = libxfs_symlink_blocks(mp, MAXPATHLEN);
> +	max_symlink_blocks = libxfs_symlink_blocks(mp, XFS_SYMLINK_MAXLEN);
>  	inodes_per_cluster = MAX(mp->m_sb.sb_inopblock,
>  			mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog);
>  
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 3/7] xfs_db: fix metadump redirection (again)
  2017-07-31 21:07 ` [PATCH 3/7] xfs_db: fix metadump redirection (again) Darrick J. Wong
@ 2017-07-31 21:57   ` Eric Sandeen
  2017-08-01 16:23   ` [PATCH v2 " Darrick J. Wong
  1 sibling, 0 replies; 38+ messages in thread
From: Eric Sandeen @ 2017-07-31 21:57 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> In patch 4944defad4 ("xfs_db: redirect printfs when metadumping to
> stdout"), we solved the problem of xfs_db printfs ending up in the
> metadump stream by reassigning stdout for the duration of a stdout
> metadump.  Unfortunately, musl doesn't allow stdout to be reassigned (in
> their view "extern FILE *stdout" means "extern FILE * const stdout"), so
> we abandon the old approach in favor of playing games with dup() to
> switch the raw file descriptors.
> 
> While we're at it, fix a regression where an unconverted outf test
> allows progress info to end up in the metadump stream.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Yuck!  I mean ... thanks!  ;)

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

> ---
>  db/metadump.c |   47 ++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 36 insertions(+), 11 deletions(-)
> 
> 
> diff --git a/db/metadump.c b/db/metadump.c
> index be2e712..227796b 100644
> --- a/db/metadump.c
> +++ b/db/metadump.c
> @@ -78,6 +78,7 @@ static int		obfuscate = 1;
>  static int		zero_stale_data = 1;
>  static int		show_warnings = 0;
>  static int		progress_since_warning = 0;
> +static bool		stdout_metadump;
>  
>  void
>  metadump_init(void)
> @@ -137,7 +138,7 @@ print_progress(const char *fmt, ...)
>  	va_end(ap);
>  	buf[sizeof(buf)-1] = '\0';
>  
> -	f = (outf == stdout) ? stderr : stdout;
> +	f = stdout_metadump ? stderr : stdout;
>  	fprintf(f, "\r%-59s", buf);
>  	fflush(f);
>  	progress_since_warning = 1;
> @@ -2750,7 +2751,8 @@ metadump_f(
>  	xfs_agnumber_t	agno;
>  	int		c;
>  	int		start_iocur_sp;
> -	bool		stdout_metadump = false;
> +	int		outfd = -1;
> +	int		ret;
>  	char		*p;
>  
>  	exitcode = 1;
> @@ -2870,16 +2872,35 @@ metadump_f(
>  		 * metadump operation so that dbprintf and other messages
>  		 * are sent to the console instead of polluting the
>  		 * metadump stream.
> +		 *
> +		 * We get to do this the hard way because musl doesn't
> +		 * allow reassignment of stdout.
>  		 */
> -		outf = stdout;
> -		stdout = stderr;
> +		fflush(stdout);
> +		outfd = dup(STDOUT_FILENO);
> +		if (outfd < 0) {
> +			perror("opening dump stream");
> +			goto out;
> +		}
> +		ret = dup2(STDERR_FILENO, STDOUT_FILENO);
> +		if (ret < 0) {
> +			perror("redirecting stdout");
> +			close(outfd);
> +			goto out;
> +		}
> +		outf = fdopen(outfd, "a");
> +		if (outf == NULL) {
> +			fprintf(stderr, "cannot create dump stream\n");
> +			dup2(outfd, 1);
> +			close(outfd);
> +			goto out;
> +		}
>  		stdout_metadump = true;
>  	} else {
>  		outf = fopen(argv[optind], "wb");
>  		if (outf == NULL) {
>  			print_warning("cannot create dump file");
> -			free(metablock);
> -			return 0;
> +			goto out;
>  		}
>  	}
>  
> @@ -2907,15 +2928,19 @@ metadump_f(
>  	if (progress_since_warning)
>  		fputc('\n', stdout_metadump ? stderr : stdout);
>  
> -	if (stdout_metadump)
> -		stdout = outf;
> -	else
> -		fclose(outf);
> +	if (stdout_metadump) {
> +		fflush(outf);
> +		fflush(stdout);
> +		ret = dup2(outfd, STDOUT_FILENO);
> +		if (ret < 0)
> +			perror("un-redirecting stdout");
> +	}
> +	fclose(outf);
>  
>  	/* cleanup iocur stack */
>  	while (iocur_sp > start_iocur_sp)
>  		pop_cur();
> -
> +out:
>  	free(metablock);
>  
>  	return 0;
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 4/7] xfs_db: dump dir/attr btrees
  2017-07-31 21:07 ` [PATCH 4/7] xfs_db: dump dir/attr btrees Darrick J. Wong
@ 2017-07-31 22:05   ` Eric Sandeen
  2017-08-01 14:59     ` Darrick J. Wong
  2017-08-01 15:40   ` [PATCH v2 " Darrick J. Wong
  1 sibling, 1 reply; 38+ messages in thread
From: Eric Sandeen @ 2017-07-31 22:05 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Dump the directory or extended attribute btree contents.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  db/btdump.c       |  251 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  man/man8/xfs_db.8 |    1 
>  2 files changed, 252 insertions(+)
> 
> 
> diff --git a/db/btdump.c b/db/btdump.c
> index 3b76e17..e351202 100644
> --- a/db/btdump.c
> +++ b/db/btdump.c
> @@ -227,6 +227,252 @@ dump_inode(
>  	return ret;
>  }
>  
> +static bool
> +dir_has_rightsib(
> +	void				*block,
> +	int				level)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	if (level > 0) {
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.forw != 0;
> +	}
> +	M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +	return lhdr.forw != 0;
> +}
> +
> +static int
> +dir_level(
> +	void				*block)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_DIR2_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR2_LEAFN_MAGIC):
> +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static int
> +dir3_level(
> +	void				*block)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
> +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static bool
> +attr_has_rightsib(
> +	void				*block,
> +	int				level)
> +{
> +        struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	if (level > 0) {
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.forw != 0;
> +	}
> +	xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +	return lhdr.hdr.info.forw != 0;
> +}
> +
> +static int
> +attr_level(
> +	void				*block)
> +{
> +        struct xfs_attr_leafblock	lhdr;

funky whitespace

> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
> +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static int
> +attr3_level(
> +	void				*block)
> +{
> +        struct xfs_attr_leafblock	lhdr;

... again

> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
> +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +struct dabprinter {
> +	const char		*print_node_entries;
> +	const char		*print_leaf_entries;
> +	const char		*go_node_forward;
> +	const char		*go_leaf_forward;
> +	const char		*go_down;
> +	bool			(*has_rightsib)(void *, int);
> +	int			(*level)(void *);
> +};
> +
> +static struct dabprinter attr_print = {
> +	.print_node_entries	= "btree",
> +	.print_leaf_entries	= "entries nvlist",
> +	.go_node_forward	= "hdr.info.forw",
> +	.go_leaf_forward	= "hdr.info.forw",
> +	.go_down		= "btree[0].before",
> +	.has_rightsib		= attr_has_rightsib,
> +	.level			= attr_level,
> +};
> +
> +static struct dabprinter attr3_print = {
> +	.print_node_entries	= "btree",
> +	.print_leaf_entries	= "entries nvlist",
> +	.go_node_forward	= "hdr.info.hdr.forw",
> +	.go_leaf_forward	= "hdr.info.hdr.forw",
> +	.go_down		= "btree[0].before",
> +	.has_rightsib		= attr_has_rightsib,
> +	.level			= attr3_level,
> +};
> +
> +static struct dabprinter dir_print = {
> +	.print_node_entries	= "nbtree",
> +	.print_leaf_entries	= "lents",
> +	.go_node_forward	= "nhdr.info.hdr.forw",
> +	.go_leaf_forward	= "lhdr.info.hdr.forw",
> +	.go_down		= "nbtree[0].before",
> +	.has_rightsib		= dir_has_rightsib,
> +	.level			= dir_level,
> +};
> +
> +static struct dabprinter dir3_print = {
> +	.print_node_entries	= "nbtree",
> +	.print_leaf_entries	= "lents",
> +	.go_node_forward	= "nhdr.info.forw",
> +	.go_leaf_forward	= "lhdr.info.forw",
> +	.go_down		= "nbtree[0].before",
> +	.has_rightsib		= dir_has_rightsib,
> +	.level			= dir3_level,
> +};
> +
> +static int
> +dump_dablevel(
> +	int			level,
> +	struct dabprinter	*dbp)
> +{
> +	xfs_daddr_t		orig_daddr = iocur_top->bb;
> +	xfs_daddr_t		last_daddr;
> +	unsigned int		nr;
> +	int			ret;
> +
> +	ret = eval("push");

stupid question, is this different from simply push_cur()? 

> +	if (ret)
> +		return ret;
> +
> +	nr = 1;
> +	do {
> +		last_daddr = iocur_top->bb;
> +		dbprintf(_("%s level %u block %u daddr %llu\n"),
> +			 iocur_top->typ->name, level, nr, last_daddr);
> +		ret = eval("print %s", level > 0 ? dbp->print_node_entries :
> +						   dbp->print_leaf_entries);
> +		if (ret)
> +			goto err;
> +		if (dbp->has_rightsib(iocur_top->data, level)) {
> +			ret = eval("addr %s", level > 0 ? dbp->go_node_forward :
> +							  dbp->go_leaf_forward);
> +			if (ret)
> +				goto err;
> +		}
> +		nr++;
> +	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
> +
> +	ret = eval("pop");
> +	return ret;
> +err:
> +	eval("pop");
> +	return ret;
> +}
> +
> +static int
> +dump_dabtree(
> +	bool				dump_node_blocks,
> +	struct dabprinter		*dbp)
> +{
> +	xfs_daddr_t			orig_daddr = iocur_top->bb;
> +	xfs_daddr_t			last_daddr;
> +	int				level;
> +	int				ret;
> +
> +	ret = eval("push");
> +	if (ret)
> +		return ret;
> +
> +	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
> +	level = dbp->level(iocur_top->data);
> +	if (level < 0) {
> +		printf(_("Current location is not part of a dir/attr btree.\n"));
> +		goto err;
> +	}
> +
> +	do {
> +		last_daddr = iocur_top->bb;
> +		if (level > 0) {
> +			if (dump_node_blocks) {
> +				ret = dump_dablevel(level, dbp);
> +				if (ret)
> +					goto err;
> +			}
> +			ret = eval("addr %s", dbp->go_down);
> +		} else {
> +			ret = dump_dablevel(level, dbp);
> +		}
> +		if (ret)
> +			goto err;
> +		level--;
> +	} while (level >= 0 &&
> +		 iocur_top->bb != orig_daddr &&
> +		 iocur_top->bb != last_daddr);
> +
> +	ret = eval("pop");
> +	return ret;
> +err:
> +	eval("pop");
> +	return ret;
> +}
> +
>  static int
>  btdump_f(
>  	int		argc,
> @@ -234,6 +480,7 @@ btdump_f(
>  {
>  	bool		aflag = false;
>  	bool		iflag = false;
> +	bool		crc = xfs_sb_version_hascrc(&mp->m_sb);
>  	int		c;
>  
>  	if (cur_typ == NULL) {
> @@ -276,6 +523,10 @@ btdump_f(
>  		return dump_btree_long(iflag);
>  	case TYP_INODE:
>  		return dump_inode(iflag, aflag);
> +	case TYP_ATTR:
> +		return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
> +	case TYP_DIR2:
> +		return dump_dabtree(iflag, crc ? &dir3_print : &dir_print);
>  	default:
>  		dbprintf(_("type \"%s\" is not a btree type or inode\n"),
>  				cur_typ->name);
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index 6a97504..b3129f7 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -335,6 +335,7 @@ area of the inode, if neither option is given then both areas are shown.
>  .B btdump [-a] [-i]
>  If the cursor points to a btree node, dump the btree from that block downward.
>  If instead the cursor points to an inode, dump the data fork block mapping btree if there is one.
> +If the cursor points to a directory or extended attribute btree node, dump that.
>  By default, only records stored in the btree are dumped.

adding this to the command long help would be nice too

xfs_db> help btdump
btdump [-a] [-i] -- dump btree

 If the cursor points to a btree block, 'btdump' dumps the btree
 downward from that block.  If the cursor points to an inode,
 the data fork btree root is selected by default.

 Options:
   -a -- Display an inode's extended attribute fork btree.
   -i -- Print internal btree nodes.



>  .RS 1.0i
>  .TP 0.4i
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 4/7] xfs_db: dump dir/attr btrees
  2017-07-31 22:05   ` Eric Sandeen
@ 2017-08-01 14:59     ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-01 14:59 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: linux-xfs

On Mon, Jul 31, 2017 at 05:05:36PM -0500, Eric Sandeen wrote:
> On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Dump the directory or extended attribute btree contents.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  db/btdump.c       |  251 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  man/man8/xfs_db.8 |    1 
> >  2 files changed, 252 insertions(+)
> > 
> > 
> > diff --git a/db/btdump.c b/db/btdump.c
> > index 3b76e17..e351202 100644
> > --- a/db/btdump.c
> > +++ b/db/btdump.c
> > @@ -227,6 +227,252 @@ dump_inode(
> >  	return ret;
> >  }
> >  
> > +static bool
> > +dir_has_rightsib(
> > +	void				*block,
> > +	int				level)
> > +{
> > +	struct xfs_dir3_icleaf_hdr	lhdr;
> > +	struct xfs_da3_icnode_hdr	nhdr;
> > +
> > +	if (level > 0) {
> > +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> > +		return nhdr.forw != 0;
> > +	}
> > +	M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> > +	return lhdr.forw != 0;
> > +}
> > +
> > +static int
> > +dir_level(
> > +	void				*block)
> > +{
> > +	struct xfs_dir3_icleaf_hdr	lhdr;
> > +	struct xfs_da3_icnode_hdr	nhdr;
> > +
> > +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> > +	case cpu_to_be16(XFS_DIR2_LEAF1_MAGIC):
> > +	case cpu_to_be16(XFS_DIR2_LEAFN_MAGIC):
> > +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> > +		return 0;
> > +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> > +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> > +		return nhdr.level;
> > +	default:
> > +		return -1;
> > +	}
> > +}
> > +
> > +static int
> > +dir3_level(
> > +	void				*block)
> > +{
> > +	struct xfs_dir3_icleaf_hdr	lhdr;
> > +	struct xfs_da3_icnode_hdr	nhdr;
> > +
> > +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> > +	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
> > +	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
> > +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> > +		return 0;
> > +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> > +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> > +		return nhdr.level;
> > +	default:
> > +		return -1;
> > +	}
> > +}
> > +
> > +static bool
> > +attr_has_rightsib(
> > +	void				*block,
> > +	int				level)
> > +{
> > +        struct xfs_attr_leafblock	lhdr;
> > +	struct xfs_da3_icnode_hdr	nhdr;
> > +
> > +	if (level > 0) {
> > +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> > +		return nhdr.forw != 0;
> > +	}
> > +	xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> > +	return lhdr.hdr.info.forw != 0;
> > +}
> > +
> > +static int
> > +attr_level(
> > +	void				*block)
> > +{
> > +        struct xfs_attr_leafblock	lhdr;
> 
> funky whitespace
> 
> > +	struct xfs_da3_icnode_hdr	nhdr;
> > +
> > +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> > +	case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
> > +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> > +		return 0;
> > +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> > +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> > +		return nhdr.level;
> > +	default:
> > +		return -1;
> > +	}
> > +}
> > +
> > +static int
> > +attr3_level(
> > +	void				*block)
> > +{
> > +        struct xfs_attr_leafblock	lhdr;
> 
> ... again

Fixed both.

> > +	struct xfs_da3_icnode_hdr	nhdr;
> > +
> > +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> > +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
> > +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> > +		return 0;
> > +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> > +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> > +		return nhdr.level;
> > +	default:
> > +		return -1;
> > +	}
> > +}
> > +
> > +struct dabprinter {
> > +	const char		*print_node_entries;
> > +	const char		*print_leaf_entries;
> > +	const char		*go_node_forward;
> > +	const char		*go_leaf_forward;
> > +	const char		*go_down;
> > +	bool			(*has_rightsib)(void *, int);
> > +	int			(*level)(void *);
> > +};
> > +
> > +static struct dabprinter attr_print = {
> > +	.print_node_entries	= "btree",
> > +	.print_leaf_entries	= "entries nvlist",
> > +	.go_node_forward	= "hdr.info.forw",
> > +	.go_leaf_forward	= "hdr.info.forw",
> > +	.go_down		= "btree[0].before",
> > +	.has_rightsib		= attr_has_rightsib,
> > +	.level			= attr_level,
> > +};
> > +
> > +static struct dabprinter attr3_print = {
> > +	.print_node_entries	= "btree",
> > +	.print_leaf_entries	= "entries nvlist",
> > +	.go_node_forward	= "hdr.info.hdr.forw",
> > +	.go_leaf_forward	= "hdr.info.hdr.forw",
> > +	.go_down		= "btree[0].before",
> > +	.has_rightsib		= attr_has_rightsib,
> > +	.level			= attr3_level,
> > +};
> > +
> > +static struct dabprinter dir_print = {
> > +	.print_node_entries	= "nbtree",
> > +	.print_leaf_entries	= "lents",
> > +	.go_node_forward	= "nhdr.info.hdr.forw",
> > +	.go_leaf_forward	= "lhdr.info.hdr.forw",
> > +	.go_down		= "nbtree[0].before",
> > +	.has_rightsib		= dir_has_rightsib,
> > +	.level			= dir_level,
> > +};
> > +
> > +static struct dabprinter dir3_print = {
> > +	.print_node_entries	= "nbtree",
> > +	.print_leaf_entries	= "lents",
> > +	.go_node_forward	= "nhdr.info.forw",
> > +	.go_leaf_forward	= "lhdr.info.forw",
> > +	.go_down		= "nbtree[0].before",
> > +	.has_rightsib		= dir_has_rightsib,
> > +	.level			= dir3_level,
> > +};
> > +
> > +static int
> > +dump_dablevel(
> > +	int			level,
> > +	struct dabprinter	*dbp)
> > +{
> > +	xfs_daddr_t		orig_daddr = iocur_top->bb;
> > +	xfs_daddr_t		last_daddr;
> > +	unsigned int		nr;
> > +	int			ret;
> > +
> > +	ret = eval("push");
> 
> stupid question, is this different from simply push_cur()? 

Yes, we need set_cur() to finish initializing iocur_top.

> > +	if (ret)
> > +		return ret;
> > +
> > +	nr = 1;
> > +	do {
> > +		last_daddr = iocur_top->bb;
> > +		dbprintf(_("%s level %u block %u daddr %llu\n"),
> > +			 iocur_top->typ->name, level, nr, last_daddr);
> > +		ret = eval("print %s", level > 0 ? dbp->print_node_entries :
> > +						   dbp->print_leaf_entries);
> > +		if (ret)
> > +			goto err;
> > +		if (dbp->has_rightsib(iocur_top->data, level)) {
> > +			ret = eval("addr %s", level > 0 ? dbp->go_node_forward :
> > +							  dbp->go_leaf_forward);
> > +			if (ret)
> > +				goto err;
> > +		}
> > +		nr++;
> > +	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
> > +
> > +	ret = eval("pop");
> > +	return ret;
> > +err:
> > +	eval("pop");
> > +	return ret;
> > +}
> > +
> > +static int
> > +dump_dabtree(
> > +	bool				dump_node_blocks,
> > +	struct dabprinter		*dbp)
> > +{
> > +	xfs_daddr_t			orig_daddr = iocur_top->bb;
> > +	xfs_daddr_t			last_daddr;
> > +	int				level;
> > +	int				ret;
> > +
> > +	ret = eval("push");
> > +	if (ret)
> > +		return ret;
> > +
> > +	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
> > +	level = dbp->level(iocur_top->data);
> > +	if (level < 0) {
> > +		printf(_("Current location is not part of a dir/attr btree.\n"));
> > +		goto err;
> > +	}
> > +
> > +	do {
> > +		last_daddr = iocur_top->bb;
> > +		if (level > 0) {
> > +			if (dump_node_blocks) {
> > +				ret = dump_dablevel(level, dbp);
> > +				if (ret)
> > +					goto err;
> > +			}
> > +			ret = eval("addr %s", dbp->go_down);
> > +		} else {
> > +			ret = dump_dablevel(level, dbp);
> > +		}
> > +		if (ret)
> > +			goto err;
> > +		level--;
> > +	} while (level >= 0 &&
> > +		 iocur_top->bb != orig_daddr &&
> > +		 iocur_top->bb != last_daddr);
> > +
> > +	ret = eval("pop");
> > +	return ret;
> > +err:
> > +	eval("pop");
> > +	return ret;
> > +}
> > +
> >  static int
> >  btdump_f(
> >  	int		argc,
> > @@ -234,6 +480,7 @@ btdump_f(
> >  {
> >  	bool		aflag = false;
> >  	bool		iflag = false;
> > +	bool		crc = xfs_sb_version_hascrc(&mp->m_sb);
> >  	int		c;
> >  
> >  	if (cur_typ == NULL) {
> > @@ -276,6 +523,10 @@ btdump_f(
> >  		return dump_btree_long(iflag);
> >  	case TYP_INODE:
> >  		return dump_inode(iflag, aflag);
> > +	case TYP_ATTR:
> > +		return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
> > +	case TYP_DIR2:
> > +		return dump_dabtree(iflag, crc ? &dir3_print : &dir_print);
> >  	default:
> >  		dbprintf(_("type \"%s\" is not a btree type or inode\n"),
> >  				cur_typ->name);
> > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> > index 6a97504..b3129f7 100644
> > --- a/man/man8/xfs_db.8
> > +++ b/man/man8/xfs_db.8
> > @@ -335,6 +335,7 @@ area of the inode, if neither option is given then both areas are shown.
> >  .B btdump [-a] [-i]
> >  If the cursor points to a btree node, dump the btree from that block downward.
> >  If instead the cursor points to an inode, dump the data fork block mapping btree if there is one.
> > +If the cursor points to a directory or extended attribute btree node, dump that.
> >  By default, only records stored in the btree are dumped.
> 
> adding this to the command long help would be nice too
> 
> xfs_db> help btdump
> btdump [-a] [-i] -- dump btree
> 
>  If the cursor points to a btree block, 'btdump' dumps the btree
>  downward from that block.  If the cursor points to an inode,
>  the data fork btree root is selected by default.
> 
>  Options:
>    -a -- Display an inode's extended attribute fork btree.
>    -i -- Print internal btree nodes.

Will do.

--D

> 
> 
> 
> >  .RS 1.0i
> >  .TP 0.4i
> > 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v2 4/7] xfs_db: dump dir/attr btrees
  2017-07-31 21:07 ` [PATCH 4/7] xfs_db: dump dir/attr btrees Darrick J. Wong
  2017-07-31 22:05   ` Eric Sandeen
@ 2017-08-01 15:40   ` Darrick J. Wong
  2017-08-01 16:21     ` Eric Sandeen
                       ` (2 more replies)
  1 sibling, 3 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-01 15:40 UTC (permalink / raw)
  To: sandeen; +Cc: linux-xfs

Dump the directory or extended attribute btree contents.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/btdump.c       |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 man/man8/xfs_db.8 |    1 
 2 files changed, 255 insertions(+), 1 deletion(-)

diff --git a/db/btdump.c b/db/btdump.c
index 3b76e17..f525a4a 100644
--- a/db/btdump.c
+++ b/db/btdump.c
@@ -32,7 +32,9 @@ btdump_help(void)
 "\n"
 " If the cursor points to a btree block, 'btdump' dumps the btree\n"
 " downward from that block.  If the cursor points to an inode,\n"
-" the data fork btree root is selected by default.\n"
+" the data fork btree root is selected by default.  If the cursor\n"
+" points to a directory or extended attribute btree node, the tree\n"
+" will be printed downward from that block.\n"
 "\n"
 " Options:\n"
 "   -a -- Display an inode's extended attribute fork btree.\n"
@@ -227,6 +229,252 @@ dump_inode(
 	return ret;
 }
 
+static bool
+dir_has_rightsib(
+	void				*block,
+	int				level)
+{
+	struct xfs_dir3_icleaf_hdr	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	if (level > 0) {
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.forw != 0;
+	}
+	M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
+	return lhdr.forw != 0;
+}
+
+static int
+dir_level(
+	void				*block)
+{
+	struct xfs_dir3_icleaf_hdr	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_DIR2_LEAF1_MAGIC):
+	case cpu_to_be16(XFS_DIR2_LEAFN_MAGIC):
+		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+static int
+dir3_level(
+	void				*block)
+{
+	struct xfs_dir3_icleaf_hdr	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
+	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
+		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+static bool
+attr_has_rightsib(
+	void				*block,
+	int				level)
+{
+        struct xfs_attr_leafblock	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	if (level > 0) {
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.forw != 0;
+	}
+	xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
+	return lhdr.hdr.info.forw != 0;
+}
+
+static int
+attr_level(
+	void				*block)
+{
+	struct xfs_attr_leafblock	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
+		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+static int
+attr3_level(
+	void				*block)
+{
+	struct xfs_attr_leafblock	lhdr;
+	struct xfs_da3_icnode_hdr	nhdr;
+
+	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
+	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
+		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
+		return 0;
+	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
+		return nhdr.level;
+	default:
+		return -1;
+	}
+}
+
+struct dabprinter_ops {
+	const char		*print_node_entries;
+	const char		*print_leaf_entries;
+	const char		*go_node_forward;
+	const char		*go_leaf_forward;
+	const char		*go_down;
+	bool			(*has_rightsib)(void *, int);
+	int			(*level)(void *);
+};
+
+static struct dabprinter_ops attr_print = {
+	.print_node_entries	= "btree",
+	.print_leaf_entries	= "entries nvlist",
+	.go_node_forward	= "hdr.info.forw",
+	.go_leaf_forward	= "hdr.info.forw",
+	.go_down		= "btree[0].before",
+	.has_rightsib		= attr_has_rightsib,
+	.level			= attr_level,
+};
+
+static struct dabprinter_ops attr3_print = {
+	.print_node_entries	= "btree",
+	.print_leaf_entries	= "entries nvlist",
+	.go_node_forward	= "hdr.info.hdr.forw",
+	.go_leaf_forward	= "hdr.info.hdr.forw",
+	.go_down		= "btree[0].before",
+	.has_rightsib		= attr_has_rightsib,
+	.level			= attr3_level,
+};
+
+static struct dabprinter_ops dir_print = {
+	.print_node_entries	= "nbtree",
+	.print_leaf_entries	= "lents",
+	.go_node_forward	= "nhdr.info.hdr.forw",
+	.go_leaf_forward	= "lhdr.info.hdr.forw",
+	.go_down		= "nbtree[0].before",
+	.has_rightsib		= dir_has_rightsib,
+	.level			= dir_level,
+};
+
+static struct dabprinter_ops dir3_print = {
+	.print_node_entries	= "nbtree",
+	.print_leaf_entries	= "lents",
+	.go_node_forward	= "nhdr.info.forw",
+	.go_leaf_forward	= "lhdr.info.forw",
+	.go_down		= "nbtree[0].before",
+	.has_rightsib		= dir_has_rightsib,
+	.level			= dir3_level,
+};
+
+static int
+dump_dablevel(
+	int			level,
+	struct dabprinter_ops	*dbp)
+{
+	xfs_daddr_t		orig_daddr = iocur_top->bb;
+	xfs_daddr_t		last_daddr;
+	unsigned int		nr;
+	int			ret;
+
+	ret = eval("push");
+	if (ret)
+		return ret;
+
+	nr = 1;
+	do {
+		last_daddr = iocur_top->bb;
+		dbprintf(_("%s level %u block %u daddr %llu\n"),
+			 iocur_top->typ->name, level, nr, last_daddr);
+		ret = eval("print %s", level > 0 ? dbp->print_node_entries :
+						   dbp->print_leaf_entries);
+		if (ret)
+			goto err;
+		if (dbp->has_rightsib(iocur_top->data, level)) {
+			ret = eval("addr %s", level > 0 ? dbp->go_node_forward :
+							  dbp->go_leaf_forward);
+			if (ret)
+				goto err;
+		}
+		nr++;
+	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
+
+	ret = eval("pop");
+	return ret;
+err:
+	eval("pop");
+	return ret;
+}
+
+static int
+dump_dabtree(
+	bool				dump_node_blocks,
+	struct dabprinter_ops		*dbp)
+{
+	xfs_daddr_t			orig_daddr = iocur_top->bb;
+	xfs_daddr_t			last_daddr;
+	int				level;
+	int				ret;
+
+	ret = eval("push");
+	if (ret)
+		return ret;
+
+	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
+	level = dbp->level(iocur_top->data);
+	if (level < 0) {
+		printf(_("Current location is not part of a dir/attr btree.\n"));
+		goto err;
+	}
+
+	do {
+		last_daddr = iocur_top->bb;
+		if (level > 0) {
+			if (dump_node_blocks) {
+				ret = dump_dablevel(level, dbp);
+				if (ret)
+					goto err;
+			}
+			ret = eval("addr %s", dbp->go_down);
+		} else {
+			ret = dump_dablevel(level, dbp);
+		}
+		if (ret)
+			goto err;
+		level--;
+	} while (level >= 0 &&
+		 iocur_top->bb != orig_daddr &&
+		 iocur_top->bb != last_daddr);
+
+	ret = eval("pop");
+	return ret;
+err:
+	eval("pop");
+	return ret;
+}
+
 static int
 btdump_f(
 	int		argc,
@@ -234,6 +482,7 @@ btdump_f(
 {
 	bool		aflag = false;
 	bool		iflag = false;
+	bool		crc = xfs_sb_version_hascrc(&mp->m_sb);
 	int		c;
 
 	if (cur_typ == NULL) {
@@ -276,6 +525,10 @@ btdump_f(
 		return dump_btree_long(iflag);
 	case TYP_INODE:
 		return dump_inode(iflag, aflag);
+	case TYP_ATTR:
+		return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
+	case TYP_DIR2:
+		return dump_dabtree(iflag, crc ? &dir3_print : &dir_print);
 	default:
 		dbprintf(_("type \"%s\" is not a btree type or inode\n"),
 				cur_typ->name);
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index 6a97504..b3129f7 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -335,6 +335,7 @@ area of the inode, if neither option is given then both areas are shown.
 .B btdump [-a] [-i]
 If the cursor points to a btree node, dump the btree from that block downward.
 If instead the cursor points to an inode, dump the data fork block mapping btree if there is one.
+If the cursor points to a directory or extended attribute btree node, dump that.
 By default, only records stored in the btree are dumped.
 .RS 1.0i
 .TP 0.4i

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH v2 4/7] xfs_db: dump dir/attr btrees
  2017-08-01 15:40   ` [PATCH v2 " Darrick J. Wong
@ 2017-08-01 16:21     ` Eric Sandeen
  2017-08-02  9:22     ` Carlos Maiolino
  2017-08-02  9:24     ` Carlos Maiolino
  2 siblings, 0 replies; 38+ messages in thread
From: Eric Sandeen @ 2017-08-01 16:21 UTC (permalink / raw)
  To: Darrick J. Wong, sandeen; +Cc: linux-xfs

On 8/1/17 10:40 AM, Darrick J. Wong wrote:
> Dump the directory or extended attribute btree contents.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

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

> ---
>  db/btdump.c       |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  man/man8/xfs_db.8 |    1 
>  2 files changed, 255 insertions(+), 1 deletion(-)
> 
> diff --git a/db/btdump.c b/db/btdump.c
> index 3b76e17..f525a4a 100644
> --- a/db/btdump.c
> +++ b/db/btdump.c
> @@ -32,7 +32,9 @@ btdump_help(void)
>  "\n"
>  " If the cursor points to a btree block, 'btdump' dumps the btree\n"
>  " downward from that block.  If the cursor points to an inode,\n"
> -" the data fork btree root is selected by default.\n"
> +" the data fork btree root is selected by default.  If the cursor\n"
> +" points to a directory or extended attribute btree node, the tree\n"
> +" will be printed downward from that block.\n"
>  "\n"
>  " Options:\n"
>  "   -a -- Display an inode's extended attribute fork btree.\n"
> @@ -227,6 +229,252 @@ dump_inode(
>  	return ret;
>  }
>  
> +static bool
> +dir_has_rightsib(
> +	void				*block,
> +	int				level)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	if (level > 0) {
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.forw != 0;
> +	}
> +	M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +	return lhdr.forw != 0;
> +}
> +
> +static int
> +dir_level(
> +	void				*block)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_DIR2_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR2_LEAFN_MAGIC):
> +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static int
> +dir3_level(
> +	void				*block)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
> +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static bool
> +attr_has_rightsib(
> +	void				*block,
> +	int				level)
> +{
> +        struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	if (level > 0) {
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.forw != 0;
> +	}
> +	xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +	return lhdr.hdr.info.forw != 0;
> +}
> +
> +static int
> +attr_level(
> +	void				*block)
> +{
> +	struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
> +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static int
> +attr3_level(
> +	void				*block)
> +{
> +	struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
> +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +struct dabprinter_ops {
> +	const char		*print_node_entries;
> +	const char		*print_leaf_entries;
> +	const char		*go_node_forward;
> +	const char		*go_leaf_forward;
> +	const char		*go_down;
> +	bool			(*has_rightsib)(void *, int);
> +	int			(*level)(void *);
> +};
> +
> +static struct dabprinter_ops attr_print = {
> +	.print_node_entries	= "btree",
> +	.print_leaf_entries	= "entries nvlist",
> +	.go_node_forward	= "hdr.info.forw",
> +	.go_leaf_forward	= "hdr.info.forw",
> +	.go_down		= "btree[0].before",
> +	.has_rightsib		= attr_has_rightsib,
> +	.level			= attr_level,
> +};
> +
> +static struct dabprinter_ops attr3_print = {
> +	.print_node_entries	= "btree",
> +	.print_leaf_entries	= "entries nvlist",
> +	.go_node_forward	= "hdr.info.hdr.forw",
> +	.go_leaf_forward	= "hdr.info.hdr.forw",
> +	.go_down		= "btree[0].before",
> +	.has_rightsib		= attr_has_rightsib,
> +	.level			= attr3_level,
> +};
> +
> +static struct dabprinter_ops dir_print = {
> +	.print_node_entries	= "nbtree",
> +	.print_leaf_entries	= "lents",
> +	.go_node_forward	= "nhdr.info.hdr.forw",
> +	.go_leaf_forward	= "lhdr.info.hdr.forw",
> +	.go_down		= "nbtree[0].before",
> +	.has_rightsib		= dir_has_rightsib,
> +	.level			= dir_level,
> +};
> +
> +static struct dabprinter_ops dir3_print = {
> +	.print_node_entries	= "nbtree",
> +	.print_leaf_entries	= "lents",
> +	.go_node_forward	= "nhdr.info.forw",
> +	.go_leaf_forward	= "lhdr.info.forw",
> +	.go_down		= "nbtree[0].before",
> +	.has_rightsib		= dir_has_rightsib,
> +	.level			= dir3_level,
> +};
> +
> +static int
> +dump_dablevel(
> +	int			level,
> +	struct dabprinter_ops	*dbp)
> +{
> +	xfs_daddr_t		orig_daddr = iocur_top->bb;
> +	xfs_daddr_t		last_daddr;
> +	unsigned int		nr;
> +	int			ret;
> +
> +	ret = eval("push");
> +	if (ret)
> +		return ret;
> +
> +	nr = 1;
> +	do {
> +		last_daddr = iocur_top->bb;
> +		dbprintf(_("%s level %u block %u daddr %llu\n"),
> +			 iocur_top->typ->name, level, nr, last_daddr);
> +		ret = eval("print %s", level > 0 ? dbp->print_node_entries :
> +						   dbp->print_leaf_entries);
> +		if (ret)
> +			goto err;
> +		if (dbp->has_rightsib(iocur_top->data, level)) {
> +			ret = eval("addr %s", level > 0 ? dbp->go_node_forward :
> +							  dbp->go_leaf_forward);
> +			if (ret)
> +				goto err;
> +		}
> +		nr++;
> +	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
> +
> +	ret = eval("pop");
> +	return ret;
> +err:
> +	eval("pop");
> +	return ret;
> +}
> +
> +static int
> +dump_dabtree(
> +	bool				dump_node_blocks,
> +	struct dabprinter_ops		*dbp)
> +{
> +	xfs_daddr_t			orig_daddr = iocur_top->bb;
> +	xfs_daddr_t			last_daddr;
> +	int				level;
> +	int				ret;
> +
> +	ret = eval("push");
> +	if (ret)
> +		return ret;
> +
> +	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
> +	level = dbp->level(iocur_top->data);
> +	if (level < 0) {
> +		printf(_("Current location is not part of a dir/attr btree.\n"));
> +		goto err;
> +	}
> +
> +	do {
> +		last_daddr = iocur_top->bb;
> +		if (level > 0) {
> +			if (dump_node_blocks) {
> +				ret = dump_dablevel(level, dbp);
> +				if (ret)
> +					goto err;
> +			}
> +			ret = eval("addr %s", dbp->go_down);
> +		} else {
> +			ret = dump_dablevel(level, dbp);
> +		}
> +		if (ret)
> +			goto err;
> +		level--;
> +	} while (level >= 0 &&
> +		 iocur_top->bb != orig_daddr &&
> +		 iocur_top->bb != last_daddr);
> +
> +	ret = eval("pop");
> +	return ret;
> +err:
> +	eval("pop");
> +	return ret;
> +}
> +
>  static int
>  btdump_f(
>  	int		argc,
> @@ -234,6 +482,7 @@ btdump_f(
>  {
>  	bool		aflag = false;
>  	bool		iflag = false;
> +	bool		crc = xfs_sb_version_hascrc(&mp->m_sb);
>  	int		c;
>  
>  	if (cur_typ == NULL) {
> @@ -276,6 +525,10 @@ btdump_f(
>  		return dump_btree_long(iflag);
>  	case TYP_INODE:
>  		return dump_inode(iflag, aflag);
> +	case TYP_ATTR:
> +		return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
> +	case TYP_DIR2:
> +		return dump_dabtree(iflag, crc ? &dir3_print : &dir_print);
>  	default:
>  		dbprintf(_("type \"%s\" is not a btree type or inode\n"),
>  				cur_typ->name);
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index 6a97504..b3129f7 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -335,6 +335,7 @@ area of the inode, if neither option is given then both areas are shown.
>  .B btdump [-a] [-i]
>  If the cursor points to a btree node, dump the btree from that block downward.
>  If instead the cursor points to an inode, dump the data fork block mapping btree if there is one.
> +If the cursor points to a directory or extended attribute btree node, dump that.
>  By default, only records stored in the btree are dumped.
>  .RS 1.0i
>  .TP 0.4i
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v2 3/7] xfs_db: fix metadump redirection (again)
  2017-07-31 21:07 ` [PATCH 3/7] xfs_db: fix metadump redirection (again) Darrick J. Wong
  2017-07-31 21:57   ` Eric Sandeen
@ 2017-08-01 16:23   ` Darrick J. Wong
  2017-08-02  9:17     ` Carlos Maiolino
  1 sibling, 1 reply; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-01 16:23 UTC (permalink / raw)
  To: sandeen; +Cc: linux-xfs

In patch 4944defad4 ("xfs_db: redirect printfs when metadumping to
stdout"), we solved the problem of xfs_db printfs ending up in the
metadump stream by reassigning stdout for the duration of a stdout
metadump.  Unfortunately, musl doesn't allow stdout to be reassigned (in
their view "extern FILE *stdout" means "extern FILE * const stdout"), so
we abandon the old approach in favor of playing games with dup() to
switch the raw file descriptors.

While we're at it, fix a regression where an unconverted outf test
allows progress info to end up in the metadump stream.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
v2: fix STDOUT_FILENO usage
---
 db/metadump.c |   47 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/db/metadump.c b/db/metadump.c
index be2e712..6a23d58 100644
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -78,6 +78,7 @@ static int		obfuscate = 1;
 static int		zero_stale_data = 1;
 static int		show_warnings = 0;
 static int		progress_since_warning = 0;
+static bool		stdout_metadump;
 
 void
 metadump_init(void)
@@ -137,7 +138,7 @@ print_progress(const char *fmt, ...)
 	va_end(ap);
 	buf[sizeof(buf)-1] = '\0';
 
-	f = (outf == stdout) ? stderr : stdout;
+	f = stdout_metadump ? stderr : stdout;
 	fprintf(f, "\r%-59s", buf);
 	fflush(f);
 	progress_since_warning = 1;
@@ -2750,7 +2751,8 @@ metadump_f(
 	xfs_agnumber_t	agno;
 	int		c;
 	int		start_iocur_sp;
-	bool		stdout_metadump = false;
+	int		outfd = -1;
+	int		ret;
 	char		*p;
 
 	exitcode = 1;
@@ -2870,16 +2872,35 @@ metadump_f(
 		 * metadump operation so that dbprintf and other messages
 		 * are sent to the console instead of polluting the
 		 * metadump stream.
+		 *
+		 * We get to do this the hard way because musl doesn't
+		 * allow reassignment of stdout.
 		 */
-		outf = stdout;
-		stdout = stderr;
+		fflush(stdout);
+		outfd = dup(STDOUT_FILENO);
+		if (outfd < 0) {
+			perror("opening dump stream");
+			goto out;
+		}
+		ret = dup2(STDERR_FILENO, STDOUT_FILENO);
+		if (ret < 0) {
+			perror("redirecting stdout");
+			close(outfd);
+			goto out;
+		}
+		outf = fdopen(outfd, "a");
+		if (outf == NULL) {
+			fprintf(stderr, "cannot create dump stream\n");
+			dup2(outfd, STDOUT_FILENO);
+			close(outfd);
+			goto out;
+		}
 		stdout_metadump = true;
 	} else {
 		outf = fopen(argv[optind], "wb");
 		if (outf == NULL) {
 			print_warning("cannot create dump file");
-			free(metablock);
-			return 0;
+			goto out;
 		}
 	}
 
@@ -2907,15 +2928,19 @@ metadump_f(
 	if (progress_since_warning)
 		fputc('\n', stdout_metadump ? stderr : stdout);
 
-	if (stdout_metadump)
-		stdout = outf;
-	else
-		fclose(outf);
+	if (stdout_metadump) {
+		fflush(outf);
+		fflush(stdout);
+		ret = dup2(outfd, STDOUT_FILENO);
+		if (ret < 0)
+			perror("un-redirecting stdout");
+	}
+	fclose(outf);
 
 	/* cleanup iocur stack */
 	while (iocur_sp > start_iocur_sp)
 		pop_cur();
-
+out:
 	free(metablock);
 
 	return 0;

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 5/7] xfs_db: print attribute remote value blocks
  2017-07-31 21:07 ` [PATCH 5/7] xfs_db: print attribute remote value blocks Darrick J. Wong
@ 2017-08-01 17:15   ` Eric Sandeen
  2017-08-01 20:29     ` Darrick J. Wong
  2017-08-01 21:04   ` [PATCH v2 " Darrick J. Wong
  1 sibling, 1 reply; 38+ messages in thread
From: Eric Sandeen @ 2017-08-01 17:15 UTC (permalink / raw)
  To: Darrick J. Wong, sandeen; +Cc: linux-xfs

On 7/31/17 4:07 PM, Darrick J. Wong wrote:

> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Teach xfs_db how to print the contents of xattr remote value blocks.

The xfs_db manpage explains what the various attr fields are (hdr, entries,
and nvlist) - should the new fields be added to the manpage?

> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  db/attr.c  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  db/attr.h  |    1 +
>  db/field.c |    3 +++
>  db/field.h |    1 +
>  4 files changed, 64 insertions(+)
> 
> 
> diff --git a/db/attr.c b/db/attr.c
> index 23ffcd5..98fb069 100644
> --- a/db/attr.c
> +++ b/db/attr.c
> @@ -41,6 +41,9 @@ static int	attr_leaf_nvlist_offset(void *obj, int startoff, int idx);
>  static int	attr_node_btree_count(void *obj, int startoff);
>  static int	attr_node_hdr_count(void *obj, int startoff);
>  
> +static int	attr_remote_count(void *obj, int startoff);
> +static int	attr3_remote_count(void *obj, int startoff);
> +
>  const field_t	attr_hfld[] = {
>  	{ "", FLDT_ATTR, OI(0), C1, 0, TYP_NONE },
>  	{ NULL }
> @@ -53,6 +56,7 @@ const field_t	attr_flds[] = {
>  	  FLD_COUNT, TYP_NONE },
>  	{ "hdr", FLDT_ATTR_NODE_HDR, OI(NOFF(hdr)), attr_node_hdr_count,
>  	  FLD_COUNT, TYP_NONE },
> +	{ "data", FLDT_CHARNS, OI(0), attr_remote_count, FLD_COUNT, TYP_NONE },

I never know how we choose names in xfs_db.  Should this be "value?" Or do you
prefer "data" because it may not be the start of, or the full, value?

>  	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)),
>  	  attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
>  	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count,
> @@ -197,6 +201,33 @@ attr3_leaf_hdr_count(
>  	return be16_to_cpu(leaf->hdr.info.hdr.magic) == XFS_ATTR3_LEAF_MAGIC;
>  }
>  
> +static int
> +attr_remote_count(
> +	void		*obj,
> +	int		startoff)
> +{
> +	if (attr_leaf_hdr_count(obj, startoff) == 0 &&
> +	    attr_node_hdr_count(obj, startoff) == 0)
> +		return mp->m_sb.sb_blocksize;
> +	return 0;
> +}
> +
> +static int
> +attr3_remote_count(
> +	void		*obj,
> +	int		startoff)
> +{
> +	struct xfs_attr3_rmt_hdr	*hdr = obj;
> +
> +	ASSERT(startoff == 0);
> +
> +	if (hdr->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC))
> +		return 0;
> +	if (be32_to_cpu(hdr->rm_bytes) + sizeof(*hdr) > mp->m_sb.sb_blocksize)
> +		return mp->m_sb.sb_blocksize - sizeof(*hdr);

XFS_ATTR3_RMT_BUF_SPACE() ?  (h/t bfoster!)

maybe even:

if (be32_to_cpu(hdr->rm_bytes) > XFS_ATTR3_RMT_BUF_SPACE
	return XFS_ATTR3_RMT_BUF_SPACE


> +	return be32_to_cpu(hdr->rm_bytes);
> +}
> +
>  typedef int (*attr_leaf_entry_walk_f)(struct xfs_attr_leafblock *,
>  				      struct xfs_attr_leaf_entry *, int);
>  static int
> @@ -477,6 +508,17 @@ attr3_node_hdr_count(
>  	return be16_to_cpu(node->hdr.info.hdr.magic) == XFS_DA3_NODE_MAGIC;
>  }
>  
> +static int
> +attr3_remote_hdr_count(
> +	void			*obj,
> +	int			startoff)
> +{
> +	struct xfs_attr3_rmt_hdr	*node = obj;
> +
> +	ASSERT(startoff == 0);
> +	return be32_to_cpu(node->rm_magic) == XFS_ATTR3_RMT_MAGIC;
> +}
> +
>  int
>  attr_size(
>  	void	*obj,
> @@ -501,6 +543,8 @@ const field_t	attr3_flds[] = {
>  	  FLD_COUNT, TYP_NONE },
>  	{ "hdr", FLDT_ATTR3_NODE_HDR, OI(N3OFF(hdr)), attr3_node_hdr_count,
>  	  FLD_COUNT, TYP_NONE },
> +	{ "hdr", FLDT_ATTR3_REMOTE_HDR, OI(0), attr3_remote_hdr_count,
> +	  FLD_COUNT, TYP_NONE },

I'm probably just confused - I get it that attr_flds has no remote header
type (there is none w/o crcs) but why is there no "data" field
added here as well?

>  	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(L3OFF(entries)),
>  	  attr3_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
>  	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(N3OFF(__btree)),
> @@ -543,6 +587,21 @@ const field_t	attr3_node_hdr_flds[] = {
>  	{ NULL }
>  };
>  
> +#define	RM3OFF(f)	bitize(offsetof(struct xfs_attr3_rmt_hdr, rm_ ## f))
> +const struct field	attr3_remote_crc_flds[] = {
> +	{ "magic", FLDT_UINT32X, OI(RM3OFF(magic)), C1, 0, TYP_NONE },
> +	{ "offset", FLDT_UINT32D, OI(RM3OFF(offset)), C1, 0, TYP_NONE },
> +	{ "bytes", FLDT_UINT32D, OI(RM3OFF(bytes)), C1, 0, TYP_NONE },
> +	{ "crc", FLDT_CRC, OI(RM3OFF(crc)), C1, 0, TYP_NONE },
> +	{ "uuid", FLDT_UUID, OI(RM3OFF(uuid)), C1, 0, TYP_NONE },
> +	{ "owner", FLDT_INO, OI(RM3OFF(owner)), C1, 0, TYP_NONE },
> +	{ "bno", FLDT_DFSBNO, OI(RM3OFF(blkno)), C1, 0, TYP_BMAPBTD },
> +	{ "lsn", FLDT_UINT64X, OI(RM3OFF(lsn)), C1, 0, TYP_NONE },
> +	{ "data", FLDT_CHARNS, OI(bitize(sizeof(struct xfs_attr3_rmt_hdr))),
> +		attr3_remote_count, FLD_COUNT, TYP_NONE },
> +	{ NULL }

I'm having trouble grokking how the /data/ lands under what seems to be
described as the header.

"attr3_remote_hdr" -> attr3_remote_crc_flds -> header /+ data/

I guess I need to just test drive the patch a bit and see if it makes more
sense.

Thanks,
-eric

> +};
> +
>  /*
>   * Special read verifier for attribute buffers. Detect the magic number
>   * appropriately and set the correct verifier and call it.
> diff --git a/db/attr.h b/db/attr.h
> index 21848c1..565d6d8 100644
> --- a/db/attr.h
> +++ b/db/attr.h
> @@ -32,6 +32,7 @@ extern const field_t	attr3_leaf_hdr_flds[];
>  extern const field_t	attr3_node_hdr_flds[];
>  extern const field_t	attr3_blkinfo_flds[];
>  extern const field_t	attr3_node_hdr_flds[];
> +extern const field_t	attr3_remote_crc_flds[];
>  
>  extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
>  extern int	attr_size(void *obj, int startoff, int idx);
> diff --git a/db/field.c b/db/field.c
> index f1e5f35..ae4c805 100644
> --- a/db/field.c
> +++ b/db/field.c
> @@ -99,6 +99,9 @@ const ftattr_t	ftattrtab[] = {
>  	{ FLDT_ATTR3_NODE_HDR, "attr3_node_hdr", NULL,
>  	  (char *)attr3_node_hdr_flds, SI(bitsz(struct xfs_da3_node_hdr)),
>  	  0, NULL, attr3_node_hdr_flds },
> +	{ FLDT_ATTR3_REMOTE_HDR, "attr3_remote_hdr", NULL,
> +	  (char *)attr3_remote_crc_flds, attr_size, FTARG_SIZE, NULL,
> +	  attr3_remote_crc_flds },
>  
>  	{ FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size,
>  	  FTARG_SIZE, NULL, bmapbta_flds },
> diff --git a/db/field.h b/db/field.h
> index d1a7095..a8df29b 100644
> --- a/db/field.h
> +++ b/db/field.h
> @@ -47,6 +47,7 @@ typedef enum fldt	{
>  	FLDT_ATTR3_BLKINFO,
>  	FLDT_ATTR3_LEAF_HDR,
>  	FLDT_ATTR3_NODE_HDR,
> +	FLDT_ATTR3_REMOTE_HDR,
>  
>  	FLDT_BMAPBTA,
>  	FLDT_BMAPBTA_CRC,
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 5/7] xfs_db: print attribute remote value blocks
  2017-08-01 17:15   ` Eric Sandeen
@ 2017-08-01 20:29     ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-01 20:29 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: sandeen, linux-xfs

On Tue, Aug 01, 2017 at 12:15:48PM -0500, Eric Sandeen wrote:
> On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> 
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Teach xfs_db how to print the contents of xattr remote value blocks.
> 
> The xfs_db manpage explains what the various attr fields are (hdr, entries,
> and nvlist) - should the new fields be added to the manpage?

Yeah.

> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  db/attr.c  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  db/attr.h  |    1 +
> >  db/field.c |    3 +++
> >  db/field.h |    1 +
> >  4 files changed, 64 insertions(+)
> > 
> > 
> > diff --git a/db/attr.c b/db/attr.c
> > index 23ffcd5..98fb069 100644
> > --- a/db/attr.c
> > +++ b/db/attr.c
> > @@ -41,6 +41,9 @@ static int	attr_leaf_nvlist_offset(void *obj, int startoff, int idx);
> >  static int	attr_node_btree_count(void *obj, int startoff);
> >  static int	attr_node_hdr_count(void *obj, int startoff);
> >  
> > +static int	attr_remote_count(void *obj, int startoff);
> > +static int	attr3_remote_count(void *obj, int startoff);
> > +
> >  const field_t	attr_hfld[] = {
> >  	{ "", FLDT_ATTR, OI(0), C1, 0, TYP_NONE },
> >  	{ NULL }
> > @@ -53,6 +56,7 @@ const field_t	attr_flds[] = {
> >  	  FLD_COUNT, TYP_NONE },
> >  	{ "hdr", FLDT_ATTR_NODE_HDR, OI(NOFF(hdr)), attr_node_hdr_count,
> >  	  FLD_COUNT, TYP_NONE },
> > +	{ "data", FLDT_CHARNS, OI(0), attr_remote_count, FLD_COUNT, TYP_NONE },
> 
> I never know how we choose names in xfs_db.  Should this be "value?" Or do you
> prefer "data" because it may not be the start of, or the full, value?

Correct -- the full attr value is the concatenation of the data fields
in each block.

I would add that the disk format reference also refers to the space
after the header as the 'data' area, but that's a little disingenuous
because I wrote that part of the documentation. :P

> >  	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)),
> >  	  attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
> >  	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count,
> > @@ -197,6 +201,33 @@ attr3_leaf_hdr_count(
> >  	return be16_to_cpu(leaf->hdr.info.hdr.magic) == XFS_ATTR3_LEAF_MAGIC;
> >  }
> >  
> > +static int
> > +attr_remote_count(
> > +	void		*obj,
> > +	int		startoff)
> > +{
> > +	if (attr_leaf_hdr_count(obj, startoff) == 0 &&
> > +	    attr_node_hdr_count(obj, startoff) == 0)
> > +		return mp->m_sb.sb_blocksize;
> > +	return 0;
> > +}
> > +
> > +static int
> > +attr3_remote_count(
> > +	void		*obj,
> > +	int		startoff)
> > +{
> > +	struct xfs_attr3_rmt_hdr	*hdr = obj;
> > +
> > +	ASSERT(startoff == 0);
> > +
> > +	if (hdr->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC))
> > +		return 0;
> > +	if (be32_to_cpu(hdr->rm_bytes) + sizeof(*hdr) > mp->m_sb.sb_blocksize)
> > +		return mp->m_sb.sb_blocksize - sizeof(*hdr);
> 
> XFS_ATTR3_RMT_BUF_SPACE() ?  (h/t bfoster!)
> 
> maybe even:
> 
> if (be32_to_cpu(hdr->rm_bytes) > XFS_ATTR3_RMT_BUF_SPACE
> 	return XFS_ATTR3_RMT_BUF_SPACE
> 
> 
> > +	return be32_to_cpu(hdr->rm_bytes);

Yes.

> > +}
> > +
> >  typedef int (*attr_leaf_entry_walk_f)(struct xfs_attr_leafblock *,
> >  				      struct xfs_attr_leaf_entry *, int);
> >  static int
> > @@ -477,6 +508,17 @@ attr3_node_hdr_count(
> >  	return be16_to_cpu(node->hdr.info.hdr.magic) == XFS_DA3_NODE_MAGIC;
> >  }
> >  
> > +static int
> > +attr3_remote_hdr_count(
> > +	void			*obj,
> > +	int			startoff)
> > +{
> > +	struct xfs_attr3_rmt_hdr	*node = obj;
> > +
> > +	ASSERT(startoff == 0);
> > +	return be32_to_cpu(node->rm_magic) == XFS_ATTR3_RMT_MAGIC;
> > +}
> > +
> >  int
> >  attr_size(
> >  	void	*obj,
> > @@ -501,6 +543,8 @@ const field_t	attr3_flds[] = {
> >  	  FLD_COUNT, TYP_NONE },
> >  	{ "hdr", FLDT_ATTR3_NODE_HDR, OI(N3OFF(hdr)), attr3_node_hdr_count,
> >  	  FLD_COUNT, TYP_NONE },
> > +	{ "hdr", FLDT_ATTR3_REMOTE_HDR, OI(0), attr3_remote_hdr_count,
> > +	  FLD_COUNT, TYP_NONE },
> 
> I'm probably just confused - I get it that attr_flds has no remote header
> type (there is none w/o crcs) but why is there no "data" field
> added here as well?
> 
> >  	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(L3OFF(entries)),
> >  	  attr3_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
> >  	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(N3OFF(__btree)),
> > @@ -543,6 +587,21 @@ const field_t	attr3_node_hdr_flds[] = {
> >  	{ NULL }
> >  };
> >  
> > +#define	RM3OFF(f)	bitize(offsetof(struct xfs_attr3_rmt_hdr, rm_ ## f))
> > +const struct field	attr3_remote_crc_flds[] = {
> > +	{ "magic", FLDT_UINT32X, OI(RM3OFF(magic)), C1, 0, TYP_NONE },
> > +	{ "offset", FLDT_UINT32D, OI(RM3OFF(offset)), C1, 0, TYP_NONE },
> > +	{ "bytes", FLDT_UINT32D, OI(RM3OFF(bytes)), C1, 0, TYP_NONE },
> > +	{ "crc", FLDT_CRC, OI(RM3OFF(crc)), C1, 0, TYP_NONE },
> > +	{ "uuid", FLDT_UUID, OI(RM3OFF(uuid)), C1, 0, TYP_NONE },
> > +	{ "owner", FLDT_INO, OI(RM3OFF(owner)), C1, 0, TYP_NONE },
> > +	{ "bno", FLDT_DFSBNO, OI(RM3OFF(blkno)), C1, 0, TYP_BMAPBTD },
> > +	{ "lsn", FLDT_UINT64X, OI(RM3OFF(lsn)), C1, 0, TYP_NONE },
> > +	{ "data", FLDT_CHARNS, OI(bitize(sizeof(struct xfs_attr3_rmt_hdr))),
> > +		attr3_remote_count, FLD_COUNT, TYP_NONE },
> > +	{ NULL }
> 
> I'm having trouble grokking how the /data/ lands under what seems to be
> described as the header.
> 
> "attr3_remote_hdr" -> attr3_remote_crc_flds -> header /+ data/

Yes, you're right, the "data" item should be in attr3_flds, not
attr3_remote_crc_flds.

--D

> I guess I need to just test drive the patch a bit and see if it makes more
> sense.
> 
> Thanks,
> -eric
> 
> > +};
> > +
> >  /*
> >   * Special read verifier for attribute buffers. Detect the magic number
> >   * appropriately and set the correct verifier and call it.
> > diff --git a/db/attr.h b/db/attr.h
> > index 21848c1..565d6d8 100644
> > --- a/db/attr.h
> > +++ b/db/attr.h
> > @@ -32,6 +32,7 @@ extern const field_t	attr3_leaf_hdr_flds[];
> >  extern const field_t	attr3_node_hdr_flds[];
> >  extern const field_t	attr3_blkinfo_flds[];
> >  extern const field_t	attr3_node_hdr_flds[];
> > +extern const field_t	attr3_remote_crc_flds[];
> >  
> >  extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
> >  extern int	attr_size(void *obj, int startoff, int idx);
> > diff --git a/db/field.c b/db/field.c
> > index f1e5f35..ae4c805 100644
> > --- a/db/field.c
> > +++ b/db/field.c
> > @@ -99,6 +99,9 @@ const ftattr_t	ftattrtab[] = {
> >  	{ FLDT_ATTR3_NODE_HDR, "attr3_node_hdr", NULL,
> >  	  (char *)attr3_node_hdr_flds, SI(bitsz(struct xfs_da3_node_hdr)),
> >  	  0, NULL, attr3_node_hdr_flds },
> > +	{ FLDT_ATTR3_REMOTE_HDR, "attr3_remote_hdr", NULL,
> > +	  (char *)attr3_remote_crc_flds, attr_size, FTARG_SIZE, NULL,
> > +	  attr3_remote_crc_flds },
> >  
> >  	{ FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size,
> >  	  FTARG_SIZE, NULL, bmapbta_flds },
> > diff --git a/db/field.h b/db/field.h
> > index d1a7095..a8df29b 100644
> > --- a/db/field.h
> > +++ b/db/field.h
> > @@ -47,6 +47,7 @@ typedef enum fldt	{
> >  	FLDT_ATTR3_BLKINFO,
> >  	FLDT_ATTR3_LEAF_HDR,
> >  	FLDT_ATTR3_NODE_HDR,
> > +	FLDT_ATTR3_REMOTE_HDR,
> >  
> >  	FLDT_BMAPBTA,
> >  	FLDT_BMAPBTA_CRC,
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v2 5/7] xfs_db: print attribute remote value blocks
  2017-07-31 21:07 ` [PATCH 5/7] xfs_db: print attribute remote value blocks Darrick J. Wong
  2017-08-01 17:15   ` Eric Sandeen
@ 2017-08-01 21:04   ` Darrick J. Wong
  2017-08-02  9:36     ` Carlos Maiolino
  1 sibling, 1 reply; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-01 21:04 UTC (permalink / raw)
  To: sandeen; +Cc: linux-xfs

Teach xfs_db how to print the contents of xattr remote value blocks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
v2: update manpage, fix some field placement and function naming problems
---
 db/attr.c         |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 db/attr.h         |    1 +
 db/field.c        |    3 +++
 db/field.h        |    1 +
 man/man8/xfs_db.8 |   38 ++++++++++++++++++++++++++++++--
 5 files changed, 104 insertions(+), 2 deletions(-)

diff --git a/db/attr.c b/db/attr.c
index 23ffcd5..0284fd4 100644
--- a/db/attr.c
+++ b/db/attr.c
@@ -41,6 +41,10 @@ static int	attr_leaf_nvlist_offset(void *obj, int startoff, int idx);
 static int	attr_node_btree_count(void *obj, int startoff);
 static int	attr_node_hdr_count(void *obj, int startoff);
 
+static int	attr_remote_data_count(void *obj, int startoff);
+static int	attr3_remote_hdr_count(void *obj, int startoff);
+static int	attr3_remote_data_count(void *obj, int startoff);
+
 const field_t	attr_hfld[] = {
 	{ "", FLDT_ATTR, OI(0), C1, 0, TYP_NONE },
 	{ NULL }
@@ -53,6 +57,8 @@ const field_t	attr_flds[] = {
 	  FLD_COUNT, TYP_NONE },
 	{ "hdr", FLDT_ATTR_NODE_HDR, OI(NOFF(hdr)), attr_node_hdr_count,
 	  FLD_COUNT, TYP_NONE },
+	{ "data", FLDT_CHARNS, OI(0), attr_remote_data_count, FLD_COUNT,
+	  TYP_NONE },
 	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)),
 	  attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
 	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count,
@@ -197,6 +203,35 @@ attr3_leaf_hdr_count(
 	return be16_to_cpu(leaf->hdr.info.hdr.magic) == XFS_ATTR3_LEAF_MAGIC;
 }
 
+static int
+attr_remote_data_count(
+	void				*obj,
+	int				startoff)
+{
+	if (attr_leaf_hdr_count(obj, startoff) == 0 &&
+	    attr_node_hdr_count(obj, startoff) == 0)
+		return mp->m_sb.sb_blocksize;
+	return 0;
+}
+
+static int
+attr3_remote_data_count(
+	void				*obj,
+	int				startoff)
+{
+	struct xfs_attr3_rmt_hdr	*hdr = obj;
+	size_t				buf_space;
+
+	ASSERT(startoff == 0);
+
+	if (hdr->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC))
+		return 0;
+	buf_space = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize);
+	if (be32_to_cpu(hdr->rm_bytes) > buf_space)
+		return buf_space;
+	return be32_to_cpu(hdr->rm_bytes);
+}
+
 typedef int (*attr_leaf_entry_walk_f)(struct xfs_attr_leafblock *,
 				      struct xfs_attr_leaf_entry *, int);
 static int
@@ -477,6 +512,17 @@ attr3_node_hdr_count(
 	return be16_to_cpu(node->hdr.info.hdr.magic) == XFS_DA3_NODE_MAGIC;
 }
 
+static int
+attr3_remote_hdr_count(
+	void			*obj,
+	int			startoff)
+{
+	struct xfs_attr3_rmt_hdr	*node = obj;
+
+	ASSERT(startoff == 0);
+	return be32_to_cpu(node->rm_magic) == XFS_ATTR3_RMT_MAGIC;
+}
+
 int
 attr_size(
 	void	*obj,
@@ -501,6 +547,10 @@ const field_t	attr3_flds[] = {
 	  FLD_COUNT, TYP_NONE },
 	{ "hdr", FLDT_ATTR3_NODE_HDR, OI(N3OFF(hdr)), attr3_node_hdr_count,
 	  FLD_COUNT, TYP_NONE },
+	{ "hdr", FLDT_ATTR3_REMOTE_HDR, OI(0), attr3_remote_hdr_count,
+	  FLD_COUNT, TYP_NONE },
+	{ "data", FLDT_CHARNS, OI(bitize(sizeof(struct xfs_attr3_rmt_hdr))),
+	  attr3_remote_data_count, FLD_COUNT, TYP_NONE },
 	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(L3OFF(entries)),
 	  attr3_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
 	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(N3OFF(__btree)),
@@ -543,6 +593,19 @@ const field_t	attr3_node_hdr_flds[] = {
 	{ NULL }
 };
 
+#define	RM3OFF(f)	bitize(offsetof(struct xfs_attr3_rmt_hdr, rm_ ## f))
+const struct field	attr3_remote_crc_flds[] = {
+	{ "magic", FLDT_UINT32X, OI(RM3OFF(magic)), C1, 0, TYP_NONE },
+	{ "offset", FLDT_UINT32D, OI(RM3OFF(offset)), C1, 0, TYP_NONE },
+	{ "bytes", FLDT_UINT32D, OI(RM3OFF(bytes)), C1, 0, TYP_NONE },
+	{ "crc", FLDT_CRC, OI(RM3OFF(crc)), C1, 0, TYP_NONE },
+	{ "uuid", FLDT_UUID, OI(RM3OFF(uuid)), C1, 0, TYP_NONE },
+	{ "owner", FLDT_INO, OI(RM3OFF(owner)), C1, 0, TYP_NONE },
+	{ "bno", FLDT_DFSBNO, OI(RM3OFF(blkno)), C1, 0, TYP_BMAPBTD },
+	{ "lsn", FLDT_UINT64X, OI(RM3OFF(lsn)), C1, 0, TYP_NONE },
+	{ NULL }
+};
+
 /*
  * Special read verifier for attribute buffers. Detect the magic number
  * appropriately and set the correct verifier and call it.
diff --git a/db/attr.h b/db/attr.h
index 21848c1..565d6d8 100644
--- a/db/attr.h
+++ b/db/attr.h
@@ -32,6 +32,7 @@ extern const field_t	attr3_leaf_hdr_flds[];
 extern const field_t	attr3_node_hdr_flds[];
 extern const field_t	attr3_blkinfo_flds[];
 extern const field_t	attr3_node_hdr_flds[];
+extern const field_t	attr3_remote_crc_flds[];
 
 extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
 extern int	attr_size(void *obj, int startoff, int idx);
diff --git a/db/field.c b/db/field.c
index f1e5f35..ae4c805 100644
--- a/db/field.c
+++ b/db/field.c
@@ -99,6 +99,9 @@ const ftattr_t	ftattrtab[] = {
 	{ FLDT_ATTR3_NODE_HDR, "attr3_node_hdr", NULL,
 	  (char *)attr3_node_hdr_flds, SI(bitsz(struct xfs_da3_node_hdr)),
 	  0, NULL, attr3_node_hdr_flds },
+	{ FLDT_ATTR3_REMOTE_HDR, "attr3_remote_hdr", NULL,
+	  (char *)attr3_remote_crc_flds, attr_size, FTARG_SIZE, NULL,
+	  attr3_remote_crc_flds },
 
 	{ FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size,
 	  FTARG_SIZE, NULL, bmapbta_flds },
diff --git a/db/field.h b/db/field.h
index d1a7095..a8df29b 100644
--- a/db/field.h
+++ b/db/field.h
@@ -47,6 +47,7 @@ typedef enum fldt	{
 	FLDT_ATTR3_BLKINFO,
 	FLDT_ATTR3_LEAF_HDR,
 	FLDT_ATTR3_NODE_HDR,
+	FLDT_ATTR3_REMOTE_HDR,
 
 	FLDT_BMAPBTA,
 	FLDT_BMAPBTA_CRC,
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index b3129f7..043985e 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -940,8 +940,7 @@ version 1 and version 2 directories, see type
 .B dir
 for a description. Leaf blocks can refer to "local" or "remote" attribute
 values. Local values are stored directly in the leaf block.
-Remote values are stored in an independent block in the attribute fork
-(with no structure). Leaf blocks contain the following fields:
+Leaf blocks contain the following fields:
 .RS 1.4i
 .PD 0
 .TP 1.2i
@@ -989,6 +988,41 @@ Fields present for local values:
 (fork block number of containing the value).
 .PD
 .RE
+.IP
+Remote values are stored in an independent block in the attribute fork.
+Prior to v5, value blocks had no structure, but in v5 they acquired a header
+structure with the following fields:
+.RS 1.4i
+.PD 0
+.TP 1.2i
+.B magic
+attr3 remote block magic number, 0x5841524d ('XARM').
+.TP
+.B offset
+Byte offset of this data block within the overall attribute value.
+.TP
+.B bytes
+Number of bytes stored in this block.
+.TP
+.B crc
+Checksum of the attribute block contents.
+.TP
+.B uuid
+Filesystem UUID.
+.TP
+.B owner
+Inode that owns this attribute value.
+.TP
+.B bno
+Block offset of this block within the inode's attribute fork.
+.TP
+.B lsn
+Log serial number of the last time this block was logged.
+.TP
+.B data
+The attribute value data.
+.PD
+.RE
 .TP
 .B bmapbt
 Files with many extents in their data or attribute fork will have the

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 1/7] xfs: remove double-underscore integer types
  2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
  2017-07-31 21:23   ` Eric Sandeen
@ 2017-08-02  9:13   ` Carlos Maiolino
  2017-08-02 16:01     ` Darrick J. Wong
  1 sibling, 1 reply; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:13 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

Hi,

On Mon, Jul 31, 2017 at 02:06:54PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> This is a purely mechanical patch that removes the private
> __{u,}int{8,16,32,64}_t typedefs in favor of using the system
> {u,}int{8,16,32,64}_t typedefs.  This is the sed script used to perform
> the transformation and fix the resulting whitespace and indentation
> errors:
> 
> s/typedef\t__uint8_t/typedef __uint8_t\t/g
> s/typedef\t__uint/typedef __uint/g
> s/typedef\t__int\([0-9]*\)_t/typedef int\1_t\t/g
> s/__uint8_t\t/__uint8_t\t\t/g
> s/__uint/uint/g
> s/__int\([0-9]*\)_t\t/__int\1_t\t\t/g
> s/__int/int/g
> /^typedef.*int[0-9]*_t;$/d
> 

Loos fine, with a few space X tabs cosmetic changes maybe worth to change?


Anyway, just a suggestion, changing it or not:

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  
> diff --git a/db/bit.h b/db/bit.h
> index 80ba24c..9fd71f4 100644
> --- a/db/bit.h
> +++ b/db/bit.h
> @@ -25,5 +25,5 @@
>  #define	BVUNSIGNED	0
>  #define	BVSIGNED	1
>  
> -extern __int64_t	getbitval(void *obj, int bitoff, int nbits, int flags);
> +extern int64_t		getbitval(void *obj, int bitoff, int nbits, int flags);
>  extern void             setbitval(void *obuf, int bitoff, int nbits, void *ibuf);

		^ Maybe worth to fix this space x tabs while in this code?

> diff --git a/db/io.h b/db/io.h
> index 9973004..df0fdd7 100644
> --- a/db/io.h
> +++ b/db/io.h
> @@ -25,7 +25,7 @@ typedef struct bbmap {
>  } bbmap_t;
>  
>  typedef struct iocur {
> -	__int64_t		bb;	/* BB number in filesystem of buf */
> +	int64_t			bb;	/* BB number in filesystem of buf */
>  	int			blen;	/* length of "buf", bb's */
>  	int			boff;	/* data - buf */
>  	void			*buf;	/* base address of buffer */
> @@ -33,7 +33,7 @@ typedef struct iocur {
>  	xfs_ino_t		dirino;	/* current directory inode number */
>  	xfs_ino_t		ino;	/* current inode number */
>  	int			len;	/* length of "data", bytes */
> -	__uint16_t		mode;	/* current inode's mode */
> +	uint16_t		mode;	/* current inode's mode */
>  	xfs_off_t		off;	/* fs offset of "data" in bytes */
>  	const struct typ	*typ;	/* type of "data" */
>  	bbmap_t			*bbmap;	/* map daddr if fragmented */
> @@ -57,7 +57,7 @@ extern void	off_cur(int off, int len);
>  extern void	pop_cur(void);
>  extern void	print_iocur(char *tag, iocur_t *ioc);
>  extern void	push_cur(void);
> -extern int	read_buf(__int64_t daddr, int count, void *bufp);
> +extern int	read_buf(int64_t daddr, int count, void *bufp);
>  extern void     write_cur(void);

		^^

>  
> diff --git a/db/sb.c b/db/sb.c
> index 8e7722c..f19248d 100644
> --- a/db/sb.c
> +++ b/db/sb.c
> @@ -606,7 +606,7 @@ version_help(void)
>  }
>  
>  static int
> -do_version(xfs_agnumber_t agno, __uint16_t version, __uint32_t features)
> +do_version(xfs_agnumber_t agno, uint16_t version, uint32_t features)
>  {
>  	xfs_sb_t	tsb;
>  
> @@ -710,8 +710,8 @@ version_f(
>  	int		argc,
>  	char		**argv)
>  {
> -	__uint16_t	version = 0;
> -	__uint32_t	features = 0;
> +	uint16_t	version = 0;
> +	uint32_t	features = 0;
>  	xfs_agnumber_t	ag;
>  
>  	if (argc == 2) {	/* WRITE VERSION */
> diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
> index 517b75f..d4846a3 100644
> --- a/fsr/xfs_fsr.c
> +++ b/fsr/xfs_fsr.c
> @@ -54,7 +54,7 @@ struct getbmap  *outmap = NULL;
>  int             outmap_size = 0;

	^^^

>  int		RealUid;
>  int		tmp_agi;
> -static __int64_t	minimumfree = 2048;
> +static int64_t		minimumfree = 2048;
>  
>  #define MNTTYPE_XFS             "xfs"
>  
			^^^

> diff --git a/include/xfs_arch.h b/include/xfs_arch.h
> index 12cd43e..186cadb 100644
> --- a/include/xfs_arch.h
> +++ b/include/xfs_arch.h
> @@ -244,39 +244,39 @@ static inline void be64_add_cpu(__be64 *a, __s64 b)
>  	*a = cpu_to_be64(be64_to_cpu(*a) + b);
>  }
>  
> -static inline __uint16_t get_unaligned_be16(void *p)
> +static inline uint16_t get_unaligned_be16(void *p)
>  {
> -	__uint8_t *__p = p;
> +	uint8_t *__p = p;
>  	return __p[0] << 8 | __p[1];
>  }
>  
> -static inline __uint32_t get_unaligned_be32(void *p)
> +static inline uint32_t get_unaligned_be32(void *p)
>  {
> -	__uint8_t *__p = p;
> +	uint8_t *__p = p;
>          return __p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3];

 ^^^

>  /*
> diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
> index 6c8a192..43b4f1d 100644
> --- a/libxfs/rdwr.c
> +++ b/libxfs/rdwr.c
> @@ -118,9 +118,9 @@ static void unmount_record(void *p)
>  	xlog_op_header_t	*op = (xlog_op_header_t *)p;
>  	/* the data section must be 32 bit size aligned */
>  	struct {
> -	    __uint16_t magic;
> -	    __uint16_t pad1;
> -	    __uint32_t pad2; /* may as well make it 64 bits */
> +	    uint16_t magic;
> +	    uint16_t pad1;
> +	    uint32_t pad2; /* may as well make it 64 bits */
>  	} magic = { XLOG_UNMOUNT_TYPE, 0, 0 };

	^^^
> diff --git a/logprint/log_misc.c b/logprint/log_misc.c
> index 0dfcfd1..fe27f15 100644
> --- a/logprint/log_misc.c
> +++ b/logprint/log_misc.c
> @@ -166,12 +166,12 @@ xlog_print_trans_header(char **ptr, int len)
>  {
>      xfs_trans_header_t  *h;
>      char		*cptr = *ptr;
> -    __uint32_t          magic;
> +    uint32_t          magic;
>      char                *magic_c = (char *)&magic;
>  

	^^^^


>      *ptr += len;
>  
> -    magic=*(__uint32_t*)cptr; /* XXX be32_to_cpu soon */
> +    magic=*(uint32_t*)cptr; /* XXX be32_to_cpu soon */
>  
>      if (len >= 4) {
>  #if __BYTE_ORDER == __LITTLE_ENDIAN
> @@ -201,7 +201,7 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int num_ops)
>      int			 num, skip;
>      int			 super_block = 0;
>      int			 bucket, col, buckets;
> -    __int64_t		 blkno;
> +    int64_t			 blkno;
>      xfs_buf_log_format_t lbuf;
>      int			 size, blen, map_size, struct_size;
>      __be64		 x, y;

	^^^

> --- a/repair/attr_repair.h
> +++ b/repair/attr_repair.h
> @@ -32,10 +32,10 @@
>  #define ACL_WRITE	02
>  #define ACL_EXECUTE	01
>  
>   */
>  #define XFS_MAC_MAX_SETS	250
>  typedef struct xfs_mac_label {
> -	__uint8_t       ml_msen_type;	/* MSEN label type */
> -	__uint8_t       ml_mint_type;	/* MINT label type */
> -	__uint8_t       ml_level;	/* Hierarchical level */
> -	__uint8_t       ml_grade;	/* Hierarchical grade */
> -	__uint16_t      ml_catcount;	/* Category count */
> -	__uint16_t      ml_divcount;	/* Division count */
> +	uint8_t       ml_msen_type;	/* MSEN label type */
> +	uint8_t       ml_mint_type;	/* MINT label type */
> +	uint8_t       ml_level;	/* Hierarchical level */
> +	uint8_t       ml_grade;	/* Hierarchical grade */
> +	uint16_t      ml_catcount;	/* Category count */
> +	uint16_t      ml_divcount;	/* Division count */
>  					/* Category set, then Division set */
> -	__uint16_t      ml_list[XFS_MAC_MAX_SETS];
> +	uint16_t      ml_list[XFS_MAC_MAX_SETS];

		^^^
>  } xfs_mac_label_t;

> diff --git a/repair/avl64.c b/repair/avl64.c
> index 51cd624..8f4a121 100644
> --- a/repair/avl64.c
> +++ b/repair/avl64.c
> @@ -70,8 +70,8 @@ avl64_checktree(
>  	avl64node_t *root)
>  {
>  	avl64node_t *nlast, *nnext, *np;
> -	__uint64_t offset = 0;
> -	__uint64_t end;
> +	uint64_t offset = 0;
> +	uint64_t end;
>  
>  	nlast = nnext = root;
>  
>  avl64node_t *
>  avl64_insert_find_growth(
>  		avl64tree_desc_t *tree,
> -		__uint64_t start,	/* range start at start, */
> -		__uint64_t end,	/* exclusive */
> +		uint64_t start,	/* range start at start, */
> +		uint64_t end,	/* exclusive */
>  		int   *growthp)	/* OUT */
		   ^^^
>  {
>  	avl64node_t *np = tree->avl_root;
> @@ -1378,8 +1378,8 @@ avl64_findadjacent(
>  void
>  avl64_findranges(
>  	avl64tree_desc_t *tree,
> -	__uint64_t start,
> -	__uint64_t end,
> +	uint64_t start,
> +	uint64_t end,
>  	avl64node_t	        **startp,

			^^^

>  	avl64node_t		**endp)
>  {
> diff --git a/repair/avl64.h b/repair/avl64.h
> index fd19321..cd079a0 100644
> --- a/repair/avl64.h
> +++ b/repair/avl64.h
> @@ -32,8 +32,8 @@ typedef struct	avl64node {
>   * avl-tree operations
>   */
>  
>  avl64node_t *
>  avl64_findanyrange(
>  	avl64tree_desc_t *tree,
> -	__uint64_t	start,
> -	__uint64_t	end,
> +	uint64_t	start,
> +	uint64_t	end,
>  	int     checklen);

	^^^
>  
>  
>  avl64node_t *
>  avl64_findadjacent(
>  	avl64tree_desc_t *tree,
> -	__uint64_t	value,
> +	uint64_t	value,
>  	int		dir);
>  
>  void
>  avl64_findranges(
>  	avl64tree_desc_t *tree,
> -	__uint64_t	start,
> -	__uint64_t	end,
> +	uint64_t	start,
> +	uint64_t	end,
>  	avl64node_t	        **startp,

			^^^

>  	avl64node_t		**endp);
>  

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN
  2017-07-31 21:07 ` [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN Darrick J. Wong
  2017-07-31 21:42   ` Eric Sandeen
@ 2017-08-02  9:14   ` Carlos Maiolino
  1 sibling, 0 replies; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:14 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: sandeen, linux-xfs

On Mon, Jul 31, 2017 at 02:07:01PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> XFS has a maximum symlink target length of 1024 bytes; this is a
> holdover from the Irix days.  Unfortunately, the constant establishing
> this was 'MAXPATHLEN', and is /not/ the same as the Linux MAXPATHLEN,
> which is 4096.
> 
> The kernel enforces its 1024 byte MAXPATHLEN on symlink targets, but
> xfsprogs picks up the (Linux) system 4096 byte MAXPATHLEN, which means
> that xfs_repair doesn't complain about oversized symlinks.
> 
> Since this is an on-disk format constraint, put the define in the XFS
> namespace.  As a side effect of the rename, xfs_repair wil detect
> oversized symlinks and clean them off the system.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  repair/dinode.c     |    6 +++---
>  repair/xfs_repair.c |    2 +-
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/repair/dinode.c b/repair/dinode.c
> index da87217..f005335 100644
> --- a/repair/dinode.c
> +++ b/repair/dinode.c
> @@ -1259,7 +1259,7 @@ null_check(char *name, int length)
>  {
>  	int i;
>  
> -	ASSERT(length < MAXPATHLEN);
> +	ASSERT(length < XFS_SYMLINK_MAXLEN);
>  
>  	for (i = 0; i < length; i++, name++)  {
>  		if (*name == '\0')
> @@ -1371,7 +1371,7 @@ process_symlink(
>  	blkmap_t 	*blkmap)
>  {
>  	char			*symlink;
> -	char			data[MAXPATHLEN];
> +	char			data[XFS_SYMLINK_MAXLEN];
>  
>  	/*
>  	 * check size against kernel symlink limits.  we know
> @@ -1379,7 +1379,7 @@ process_symlink(
>  	 * the inode is structurally ok so we don't have to check
>  	 * for that
>  	 */
> -	if (be64_to_cpu(dino->di_size) >= MAXPATHLEN)  {
> +	if (be64_to_cpu(dino->di_size) >= XFS_SYMLINK_MAXLEN)  {
>  	       do_warn(_("symlink in inode %" PRIu64 " too long (%llu chars)\n"),
>  		       lino, (unsigned long long) be64_to_cpu(dino->di_size));
>  		return(1);
> diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
> index ab60c0f..b2dd91b 100644
> --- a/repair/xfs_repair.c
> +++ b/repair/xfs_repair.c
> @@ -761,7 +761,7 @@ main(int argc, char **argv)
>  	glob_agcount = mp->m_sb.sb_agcount;
>  
>  	chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK;
> -	max_symlink_blocks = libxfs_symlink_blocks(mp, MAXPATHLEN);
> +	max_symlink_blocks = libxfs_symlink_blocks(mp, XFS_SYMLINK_MAXLEN);
>  	inodes_per_cluster = MAX(mp->m_sb.sb_inopblock,
>  			mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog);
>  
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v2 3/7] xfs_db: fix metadump redirection (again)
  2017-08-01 16:23   ` [PATCH v2 " Darrick J. Wong
@ 2017-08-02  9:17     ` Carlos Maiolino
  0 siblings, 0 replies; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:17 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: sandeen, linux-xfs

On Tue, Aug 01, 2017 at 09:23:33AM -0700, Darrick J. Wong wrote:
> In patch 4944defad4 ("xfs_db: redirect printfs when metadumping to
> stdout"), we solved the problem of xfs_db printfs ending up in the
> metadump stream by reassigning stdout for the duration of a stdout
> metadump.  Unfortunately, musl doesn't allow stdout to be reassigned (in
> their view "extern FILE *stdout" means "extern FILE * const stdout"), so
> we abandon the old approach in favor of playing games with dup() to
> switch the raw file descriptors.
> 
> While we're at it, fix a regression where an unconverted outf test
> allows progress info to end up in the metadump stream.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> v2: fix STDOUT_FILENO usage

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  db/metadump.c |   47 ++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 36 insertions(+), 11 deletions(-)
> 
> diff --git a/db/metadump.c b/db/metadump.c
> index be2e712..6a23d58 100644
> --- a/db/metadump.c
> +++ b/db/metadump.c
> @@ -78,6 +78,7 @@ static int		obfuscate = 1;
>  static int		zero_stale_data = 1;
>  static int		show_warnings = 0;
>  static int		progress_since_warning = 0;
> +static bool		stdout_metadump;
>  
>  void
>  metadump_init(void)
> @@ -137,7 +138,7 @@ print_progress(const char *fmt, ...)
>  	va_end(ap);
>  	buf[sizeof(buf)-1] = '\0';
>  
> -	f = (outf == stdout) ? stderr : stdout;
> +	f = stdout_metadump ? stderr : stdout;
>  	fprintf(f, "\r%-59s", buf);
>  	fflush(f);
>  	progress_since_warning = 1;
> @@ -2750,7 +2751,8 @@ metadump_f(
>  	xfs_agnumber_t	agno;
>  	int		c;
>  	int		start_iocur_sp;
> -	bool		stdout_metadump = false;
> +	int		outfd = -1;
> +	int		ret;
>  	char		*p;
>  
>  	exitcode = 1;
> @@ -2870,16 +2872,35 @@ metadump_f(
>  		 * metadump operation so that dbprintf and other messages
>  		 * are sent to the console instead of polluting the
>  		 * metadump stream.
> +		 *
> +		 * We get to do this the hard way because musl doesn't
> +		 * allow reassignment of stdout.
>  		 */
> -		outf = stdout;
> -		stdout = stderr;
> +		fflush(stdout);
> +		outfd = dup(STDOUT_FILENO);
> +		if (outfd < 0) {
> +			perror("opening dump stream");
> +			goto out;
> +		}
> +		ret = dup2(STDERR_FILENO, STDOUT_FILENO);
> +		if (ret < 0) {
> +			perror("redirecting stdout");
> +			close(outfd);
> +			goto out;
> +		}
> +		outf = fdopen(outfd, "a");
> +		if (outf == NULL) {
> +			fprintf(stderr, "cannot create dump stream\n");
> +			dup2(outfd, STDOUT_FILENO);
> +			close(outfd);
> +			goto out;
> +		}
>  		stdout_metadump = true;
>  	} else {
>  		outf = fopen(argv[optind], "wb");
>  		if (outf == NULL) {
>  			print_warning("cannot create dump file");
> -			free(metablock);
> -			return 0;
> +			goto out;
>  		}
>  	}
>  
> @@ -2907,15 +2928,19 @@ metadump_f(
>  	if (progress_since_warning)
>  		fputc('\n', stdout_metadump ? stderr : stdout);
>  
> -	if (stdout_metadump)
> -		stdout = outf;
> -	else
> -		fclose(outf);
> +	if (stdout_metadump) {
> +		fflush(outf);
> +		fflush(stdout);
> +		ret = dup2(outfd, STDOUT_FILENO);
> +		if (ret < 0)
> +			perror("un-redirecting stdout");
> +	}
> +	fclose(outf);
>  
>  	/* cleanup iocur stack */
>  	while (iocur_sp > start_iocur_sp)
>  		pop_cur();
> -
> +out:
>  	free(metablock);
>  
>  	return 0;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v2 4/7] xfs_db: dump dir/attr btrees
  2017-08-01 15:40   ` [PATCH v2 " Darrick J. Wong
  2017-08-01 16:21     ` Eric Sandeen
@ 2017-08-02  9:22     ` Carlos Maiolino
  2017-08-02  9:24     ` Carlos Maiolino
  2 siblings, 0 replies; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:22 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On Tue, Aug 01, 2017 at 08:40:53AM -0700, Darrick J. Wong wrote:
> Dump the directory or extended attribute btree contents.
> 

Sweet, thanks

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  db/btdump.c       |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  man/man8/xfs_db.8 |    1 
>  2 files changed, 255 insertions(+), 1 deletion(-)
> 
> diff --git a/db/btdump.c b/db/btdump.c
> index 3b76e17..f525a4a 100644
> --- a/db/btdump.c
> +++ b/db/btdump.c
> @@ -32,7 +32,9 @@ btdump_help(void)
>  "\n"
>  " If the cursor points to a btree block, 'btdump' dumps the btree\n"
>  " downward from that block.  If the cursor points to an inode,\n"
> -" the data fork btree root is selected by default.\n"
> +" the data fork btree root is selected by default.  If the cursor\n"
> +" points to a directory or extended attribute btree node, the tree\n"
> +" will be printed downward from that block.\n"
>  "\n"
>  " Options:\n"
>  "   -a -- Display an inode's extended attribute fork btree.\n"
> @@ -227,6 +229,252 @@ dump_inode(
>  	return ret;
>  }
>  
> +static bool
> +dir_has_rightsib(
> +	void				*block,
> +	int				level)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	if (level > 0) {
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.forw != 0;
> +	}
> +	M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +	return lhdr.forw != 0;
> +}
> +
> +static int
> +dir_level(
> +	void				*block)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_DIR2_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR2_LEAFN_MAGIC):
> +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static int
> +dir3_level(
> +	void				*block)
> +{
> +	struct xfs_dir3_icleaf_hdr	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
> +		M_DIROPS(mp)->leaf_hdr_from_disk(&lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static bool
> +attr_has_rightsib(
> +	void				*block,
> +	int				level)
> +{
> +        struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	if (level > 0) {
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.forw != 0;
> +	}
> +	xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +	return lhdr.hdr.info.forw != 0;
> +}
> +
> +static int
> +attr_level(
> +	void				*block)
> +{
> +	struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
> +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +static int
> +attr3_level(
> +	void				*block)
> +{
> +	struct xfs_attr_leafblock	lhdr;
> +	struct xfs_da3_icnode_hdr	nhdr;
> +
> +	switch (((struct xfs_da_intnode *)block)->hdr.info.magic) {
> +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
> +		xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, &lhdr, block);
> +		return 0;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		M_DIROPS(mp)->node_hdr_from_disk(&nhdr, block);
> +		return nhdr.level;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +struct dabprinter_ops {
> +	const char		*print_node_entries;
> +	const char		*print_leaf_entries;
> +	const char		*go_node_forward;
> +	const char		*go_leaf_forward;
> +	const char		*go_down;
> +	bool			(*has_rightsib)(void *, int);
> +	int			(*level)(void *);
> +};
> +
> +static struct dabprinter_ops attr_print = {
> +	.print_node_entries	= "btree",
> +	.print_leaf_entries	= "entries nvlist",
> +	.go_node_forward	= "hdr.info.forw",
> +	.go_leaf_forward	= "hdr.info.forw",
> +	.go_down		= "btree[0].before",
> +	.has_rightsib		= attr_has_rightsib,
> +	.level			= attr_level,
> +};
> +
> +static struct dabprinter_ops attr3_print = {
> +	.print_node_entries	= "btree",
> +	.print_leaf_entries	= "entries nvlist",
> +	.go_node_forward	= "hdr.info.hdr.forw",
> +	.go_leaf_forward	= "hdr.info.hdr.forw",
> +	.go_down		= "btree[0].before",
> +	.has_rightsib		= attr_has_rightsib,
> +	.level			= attr3_level,
> +};
> +
> +static struct dabprinter_ops dir_print = {
> +	.print_node_entries	= "nbtree",
> +	.print_leaf_entries	= "lents",
> +	.go_node_forward	= "nhdr.info.hdr.forw",
> +	.go_leaf_forward	= "lhdr.info.hdr.forw",
> +	.go_down		= "nbtree[0].before",
> +	.has_rightsib		= dir_has_rightsib,
> +	.level			= dir_level,
> +};
> +
> +static struct dabprinter_ops dir3_print = {
> +	.print_node_entries	= "nbtree",
> +	.print_leaf_entries	= "lents",
> +	.go_node_forward	= "nhdr.info.forw",
> +	.go_leaf_forward	= "lhdr.info.forw",
> +	.go_down		= "nbtree[0].before",
> +	.has_rightsib		= dir_has_rightsib,
> +	.level			= dir3_level,
> +};
> +
> +static int
> +dump_dablevel(
> +	int			level,
> +	struct dabprinter_ops	*dbp)
> +{
> +	xfs_daddr_t		orig_daddr = iocur_top->bb;
> +	xfs_daddr_t		last_daddr;
> +	unsigned int		nr;
> +	int			ret;
> +
> +	ret = eval("push");
> +	if (ret)
> +		return ret;
> +
> +	nr = 1;
> +	do {
> +		last_daddr = iocur_top->bb;
> +		dbprintf(_("%s level %u block %u daddr %llu\n"),
> +			 iocur_top->typ->name, level, nr, last_daddr);
> +		ret = eval("print %s", level > 0 ? dbp->print_node_entries :
> +						   dbp->print_leaf_entries);
> +		if (ret)
> +			goto err;
> +		if (dbp->has_rightsib(iocur_top->data, level)) {
> +			ret = eval("addr %s", level > 0 ? dbp->go_node_forward :
> +							  dbp->go_leaf_forward);
> +			if (ret)
> +				goto err;
> +		}
> +		nr++;
> +	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
> +
> +	ret = eval("pop");
> +	return ret;
> +err:
> +	eval("pop");
> +	return ret;
> +}
> +
> +static int
> +dump_dabtree(
> +	bool				dump_node_blocks,
> +	struct dabprinter_ops		*dbp)
> +{
> +	xfs_daddr_t			orig_daddr = iocur_top->bb;
> +	xfs_daddr_t			last_daddr;
> +	int				level;
> +	int				ret;
> +
> +	ret = eval("push");
> +	if (ret)
> +		return ret;
> +
> +	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
> +	level = dbp->level(iocur_top->data);
> +	if (level < 0) {
> +		printf(_("Current location is not part of a dir/attr btree.\n"));
> +		goto err;
> +	}
> +
> +	do {
> +		last_daddr = iocur_top->bb;
> +		if (level > 0) {
> +			if (dump_node_blocks) {
> +				ret = dump_dablevel(level, dbp);
> +				if (ret)
> +					goto err;
> +			}
> +			ret = eval("addr %s", dbp->go_down);
> +		} else {
> +			ret = dump_dablevel(level, dbp);
> +		}
> +		if (ret)
> +			goto err;
> +		level--;
> +	} while (level >= 0 &&
> +		 iocur_top->bb != orig_daddr &&
> +		 iocur_top->bb != last_daddr);
> +
> +	ret = eval("pop");
> +	return ret;
> +err:
> +	eval("pop");
> +	return ret;
> +}
> +
>  static int
>  btdump_f(
>  	int		argc,
> @@ -234,6 +482,7 @@ btdump_f(
>  {
>  	bool		aflag = false;
>  	bool		iflag = false;
> +	bool		crc = xfs_sb_version_hascrc(&mp->m_sb);
>  	int		c;
>  
>  	if (cur_typ == NULL) {
> @@ -276,6 +525,10 @@ btdump_f(
>  		return dump_btree_long(iflag);
>  	case TYP_INODE:
>  		return dump_inode(iflag, aflag);
> +	case TYP_ATTR:
> +		return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
> +	case TYP_DIR2:
> +		return dump_dabtree(iflag, crc ? &dir3_print : &dir_print);
>  	default:
>  		dbprintf(_("type \"%s\" is not a btree type or inode\n"),
>  				cur_typ->name);
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index 6a97504..b3129f7 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -335,6 +335,7 @@ area of the inode, if neither option is given then both areas are shown.
>  .B btdump [-a] [-i]
>  If the cursor points to a btree node, dump the btree from that block downward.
>  If instead the cursor points to an inode, dump the data fork block mapping btree if there is one.
> +If the cursor points to a directory or extended attribute btree node, dump that.
>  By default, only records stored in the btree are dumped.
>  .RS 1.0i
>  .TP 0.4i
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v2 4/7] xfs_db: dump dir/attr btrees
  2017-08-01 15:40   ` [PATCH v2 " Darrick J. Wong
  2017-08-01 16:21     ` Eric Sandeen
  2017-08-02  9:22     ` Carlos Maiolino
@ 2017-08-02  9:24     ` Carlos Maiolino
  2017-08-02 16:03       ` Darrick J. Wong
  2 siblings, 1 reply; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:24 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: sandeen, linux-xfs

On Tue, Aug 01, 2017 at 08:40:53AM -0700, Darrick J. Wong wrote:
> Dump the directory or extended attribute btree contents.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Btw, this is missing a changelog comparing with the V1, but I believe it doesn't
go to the patch description anyway.


-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v2 5/7] xfs_db: print attribute remote value blocks
  2017-08-01 21:04   ` [PATCH v2 " Darrick J. Wong
@ 2017-08-02  9:36     ` Carlos Maiolino
  0 siblings, 0 replies; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:36 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: sandeen, linux-xfs

On Tue, Aug 01, 2017 at 02:04:49PM -0700, Darrick J. Wong wrote:
> Teach xfs_db how to print the contents of xattr remote value blocks.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> v2: update manpage, fix some field placement and function naming problems
> ---

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>


>  db/attr.c         |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  db/attr.h         |    1 +
>  db/field.c        |    3 +++
>  db/field.h        |    1 +
>  man/man8/xfs_db.8 |   38 ++++++++++++++++++++++++++++++--
>  5 files changed, 104 insertions(+), 2 deletions(-)
> 
> diff --git a/db/attr.c b/db/attr.c
> index 23ffcd5..0284fd4 100644
> --- a/db/attr.c
> +++ b/db/attr.c
> @@ -41,6 +41,10 @@ static int	attr_leaf_nvlist_offset(void *obj, int startoff, int idx);
>  static int	attr_node_btree_count(void *obj, int startoff);
>  static int	attr_node_hdr_count(void *obj, int startoff);
>  
> +static int	attr_remote_data_count(void *obj, int startoff);
> +static int	attr3_remote_hdr_count(void *obj, int startoff);
> +static int	attr3_remote_data_count(void *obj, int startoff);
> +
>  const field_t	attr_hfld[] = {
>  	{ "", FLDT_ATTR, OI(0), C1, 0, TYP_NONE },
>  	{ NULL }
> @@ -53,6 +57,8 @@ const field_t	attr_flds[] = {
>  	  FLD_COUNT, TYP_NONE },
>  	{ "hdr", FLDT_ATTR_NODE_HDR, OI(NOFF(hdr)), attr_node_hdr_count,
>  	  FLD_COUNT, TYP_NONE },
> +	{ "data", FLDT_CHARNS, OI(0), attr_remote_data_count, FLD_COUNT,
> +	  TYP_NONE },
>  	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)),
>  	  attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
>  	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count,
> @@ -197,6 +203,35 @@ attr3_leaf_hdr_count(
>  	return be16_to_cpu(leaf->hdr.info.hdr.magic) == XFS_ATTR3_LEAF_MAGIC;
>  }
>  
> +static int
> +attr_remote_data_count(
> +	void				*obj,
> +	int				startoff)
> +{
> +	if (attr_leaf_hdr_count(obj, startoff) == 0 &&
> +	    attr_node_hdr_count(obj, startoff) == 0)
> +		return mp->m_sb.sb_blocksize;
> +	return 0;
> +}
> +
> +static int
> +attr3_remote_data_count(
> +	void				*obj,
> +	int				startoff)
> +{
> +	struct xfs_attr3_rmt_hdr	*hdr = obj;
> +	size_t				buf_space;
> +
> +	ASSERT(startoff == 0);
> +
> +	if (hdr->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC))
> +		return 0;
> +	buf_space = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize);
> +	if (be32_to_cpu(hdr->rm_bytes) > buf_space)
> +		return buf_space;
> +	return be32_to_cpu(hdr->rm_bytes);
> +}
> +
>  typedef int (*attr_leaf_entry_walk_f)(struct xfs_attr_leafblock *,
>  				      struct xfs_attr_leaf_entry *, int);
>  static int
> @@ -477,6 +512,17 @@ attr3_node_hdr_count(
>  	return be16_to_cpu(node->hdr.info.hdr.magic) == XFS_DA3_NODE_MAGIC;
>  }
>  
> +static int
> +attr3_remote_hdr_count(
> +	void			*obj,
> +	int			startoff)
> +{
> +	struct xfs_attr3_rmt_hdr	*node = obj;
> +
> +	ASSERT(startoff == 0);
> +	return be32_to_cpu(node->rm_magic) == XFS_ATTR3_RMT_MAGIC;
> +}
> +
>  int
>  attr_size(
>  	void	*obj,
> @@ -501,6 +547,10 @@ const field_t	attr3_flds[] = {
>  	  FLD_COUNT, TYP_NONE },
>  	{ "hdr", FLDT_ATTR3_NODE_HDR, OI(N3OFF(hdr)), attr3_node_hdr_count,
>  	  FLD_COUNT, TYP_NONE },
> +	{ "hdr", FLDT_ATTR3_REMOTE_HDR, OI(0), attr3_remote_hdr_count,
> +	  FLD_COUNT, TYP_NONE },
> +	{ "data", FLDT_CHARNS, OI(bitize(sizeof(struct xfs_attr3_rmt_hdr))),
> +	  attr3_remote_data_count, FLD_COUNT, TYP_NONE },
>  	{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(L3OFF(entries)),
>  	  attr3_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
>  	{ "btree", FLDT_ATTR_NODE_ENTRY, OI(N3OFF(__btree)),
> @@ -543,6 +593,19 @@ const field_t	attr3_node_hdr_flds[] = {
>  	{ NULL }
>  };
>  
> +#define	RM3OFF(f)	bitize(offsetof(struct xfs_attr3_rmt_hdr, rm_ ## f))
> +const struct field	attr3_remote_crc_flds[] = {
> +	{ "magic", FLDT_UINT32X, OI(RM3OFF(magic)), C1, 0, TYP_NONE },
> +	{ "offset", FLDT_UINT32D, OI(RM3OFF(offset)), C1, 0, TYP_NONE },
> +	{ "bytes", FLDT_UINT32D, OI(RM3OFF(bytes)), C1, 0, TYP_NONE },
> +	{ "crc", FLDT_CRC, OI(RM3OFF(crc)), C1, 0, TYP_NONE },
> +	{ "uuid", FLDT_UUID, OI(RM3OFF(uuid)), C1, 0, TYP_NONE },
> +	{ "owner", FLDT_INO, OI(RM3OFF(owner)), C1, 0, TYP_NONE },
> +	{ "bno", FLDT_DFSBNO, OI(RM3OFF(blkno)), C1, 0, TYP_BMAPBTD },
> +	{ "lsn", FLDT_UINT64X, OI(RM3OFF(lsn)), C1, 0, TYP_NONE },
> +	{ NULL }
> +};
> +
>  /*
>   * Special read verifier for attribute buffers. Detect the magic number
>   * appropriately and set the correct verifier and call it.
> diff --git a/db/attr.h b/db/attr.h
> index 21848c1..565d6d8 100644
> --- a/db/attr.h
> +++ b/db/attr.h
> @@ -32,6 +32,7 @@ extern const field_t	attr3_leaf_hdr_flds[];
>  extern const field_t	attr3_node_hdr_flds[];
>  extern const field_t	attr3_blkinfo_flds[];
>  extern const field_t	attr3_node_hdr_flds[];
> +extern const field_t	attr3_remote_crc_flds[];
>  
>  extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
>  extern int	attr_size(void *obj, int startoff, int idx);
> diff --git a/db/field.c b/db/field.c
> index f1e5f35..ae4c805 100644
> --- a/db/field.c
> +++ b/db/field.c
> @@ -99,6 +99,9 @@ const ftattr_t	ftattrtab[] = {
>  	{ FLDT_ATTR3_NODE_HDR, "attr3_node_hdr", NULL,
>  	  (char *)attr3_node_hdr_flds, SI(bitsz(struct xfs_da3_node_hdr)),
>  	  0, NULL, attr3_node_hdr_flds },
> +	{ FLDT_ATTR3_REMOTE_HDR, "attr3_remote_hdr", NULL,
> +	  (char *)attr3_remote_crc_flds, attr_size, FTARG_SIZE, NULL,
> +	  attr3_remote_crc_flds },
>  
>  	{ FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size,
>  	  FTARG_SIZE, NULL, bmapbta_flds },
> diff --git a/db/field.h b/db/field.h
> index d1a7095..a8df29b 100644
> --- a/db/field.h
> +++ b/db/field.h
> @@ -47,6 +47,7 @@ typedef enum fldt	{
>  	FLDT_ATTR3_BLKINFO,
>  	FLDT_ATTR3_LEAF_HDR,
>  	FLDT_ATTR3_NODE_HDR,
> +	FLDT_ATTR3_REMOTE_HDR,
>  
>  	FLDT_BMAPBTA,
>  	FLDT_BMAPBTA_CRC,
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index b3129f7..043985e 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -940,8 +940,7 @@ version 1 and version 2 directories, see type
>  .B dir
>  for a description. Leaf blocks can refer to "local" or "remote" attribute
>  values. Local values are stored directly in the leaf block.
> -Remote values are stored in an independent block in the attribute fork
> -(with no structure). Leaf blocks contain the following fields:
> +Leaf blocks contain the following fields:
>  .RS 1.4i
>  .PD 0
>  .TP 1.2i
> @@ -989,6 +988,41 @@ Fields present for local values:
>  (fork block number of containing the value).
>  .PD
>  .RE
> +.IP
> +Remote values are stored in an independent block in the attribute fork.
> +Prior to v5, value blocks had no structure, but in v5 they acquired a header
> +structure with the following fields:
> +.RS 1.4i
> +.PD 0
> +.TP 1.2i
> +.B magic
> +attr3 remote block magic number, 0x5841524d ('XARM').
> +.TP
> +.B offset
> +Byte offset of this data block within the overall attribute value.
> +.TP
> +.B bytes
> +Number of bytes stored in this block.
> +.TP
> +.B crc
> +Checksum of the attribute block contents.
> +.TP
> +.B uuid
> +Filesystem UUID.
> +.TP
> +.B owner
> +Inode that owns this attribute value.
> +.TP
> +.B bno
> +Block offset of this block within the inode's attribute fork.
> +.TP
> +.B lsn
> +Log serial number of the last time this block was logged.
> +.TP
> +.B data
> +The attribute value data.
> +.PD
> +.RE
>  .TP
>  .B bmapbt
>  Files with many extents in their data or attribute fork will have the
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs
  2017-07-31 21:07 ` [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs Darrick J. Wong
@ 2017-08-02  9:40   ` Carlos Maiolino
  2017-08-03 16:02   ` Eric Sandeen
  1 sibling, 0 replies; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02  9:40 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: sandeen, linux-xfs

On Mon, Jul 31, 2017 at 02:07:25PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Extend typ_t to (optionally) store a pointer to a function to calculate
> the CRC of the block, provide functions to do this for the dir3 and
> attr3 types, and then wire up the write command so that we can modify
> directory and extended attribute block fields.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  db/attr.c  |   32 ++++++++++++++++++++++++++++++++
>  db/attr.h  |    1 +
>  db/dir2.c  |   37 +++++++++++++++++++++++++++++++++++++
>  db/dir2.h  |    1 +
>  db/type.c  |    8 ++++----
>  db/type.h  |    2 ++
>  db/write.c |    3 +++
>  7 files changed, 80 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/db/attr.c b/db/attr.c
> index 98fb069..2fa6690 100644
> --- a/db/attr.c
> +++ b/db/attr.c
> @@ -602,6 +602,38 @@ const struct field	attr3_remote_crc_flds[] = {
>  	{ NULL }
>  };
>  
> +/* Set the CRC. */
> +void
> +xfs_attr3_set_crc(
> +	struct xfs_buf		*bp)
> +{
> +	__be32			magic32;
> +	__be16			magic16;
> +
> +	magic32 = *(__be32 *)bp->b_addr;
> +	magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
> +
> +	switch (magic16) {
> +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF);
> +		return;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
> +		return;
> +	default:
> +		break;
> +	}
> +
> +	switch (magic32) {
> +	case cpu_to_be32(XFS_ATTR3_RMT_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_ATTR3_RMT_CRC_OFF);
> +		return;
> +	default:
> +		dbprintf(_("Unknown attribute buffer type!\n"));
> +		break;
> +	}
> +}
> +
>  /*
>   * Special read verifier for attribute buffers. Detect the magic number
>   * appropriately and set the correct verifier and call it.
> diff --git a/db/attr.h b/db/attr.h
> index 565d6d8..ba23480 100644
> --- a/db/attr.h
> +++ b/db/attr.h
> @@ -36,5 +36,6 @@ extern const field_t	attr3_remote_crc_flds[];
>  
>  extern int	attr_leaf_name_size(void *obj, int startoff, int idx);
>  extern int	attr_size(void *obj, int startoff, int idx);
> +extern void	xfs_attr3_set_crc(struct xfs_buf *bp);
>  
>  extern const struct xfs_buf_ops xfs_attr3_db_buf_ops;
> diff --git a/db/dir2.c b/db/dir2.c
> index 533f705..3e21a7b 100644
> --- a/db/dir2.c
> +++ b/db/dir2.c
> @@ -981,6 +981,43 @@ const field_t	da3_node_hdr_flds[] = {
>  	{ NULL }
>  };
>  
> +/* Set the CRC. */
> +void
> +xfs_dir3_set_crc(
> +	struct xfs_buf		*bp)
> +{
> +	__be32			magic32;
> +	__be16			magic16;
> +
> +	magic32 = *(__be32 *)bp->b_addr;
> +	magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
> +
> +	switch (magic32) {
> +	case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
> +	case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF);
> +		return;
> +	case cpu_to_be32(XFS_DIR3_FREE_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_DIR3_FREE_CRC_OFF);
> +		return;
> +	default:
> +		break;
> +	}
> +
> +	switch (magic16) {
> +	case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
> +	case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_DIR3_LEAF_CRC_OFF);
> +		return;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
> +		return;
> +	default:
> +		dbprintf(_("Unknown directory buffer type! %x %x\n"), magic32, magic16);
> +		break;
> +	}
> +}
> +
>  /*
>   * Special read verifier for directory buffers. Detect the magic number
>   * appropriately and set the correct verifier and call it.
> diff --git a/db/dir2.h b/db/dir2.h
> index 0c2a62e..1b87cd2 100644
> --- a/db/dir2.h
> +++ b/db/dir2.h
> @@ -60,5 +60,6 @@ static inline uint8_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep)
>  
>  extern int	dir2_data_union_size(void *obj, int startoff, int idx);
>  extern int	dir2_size(void *obj, int startoff, int idx);
> +extern void	xfs_dir3_set_crc(struct xfs_buf *bp);
>  
>  extern const struct xfs_buf_ops xfs_dir3_db_buf_ops;
> diff --git a/db/type.c b/db/type.c
> index 10fa54e..bf31e04 100644
> --- a/db/type.c
> +++ b/db/type.c
> @@ -87,7 +87,7 @@ static const typ_t	__typtab_crc[] = {
>  	{ TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agi_buf_ops,
>  		XFS_AGI_CRC_OFF },
>  	{ TYP_ATTR, "attr3", handle_struct, attr3_hfld,
> -		&xfs_attr3_db_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_attr3_db_buf_ops, TYP_F_CRC_FUNC, xfs_attr3_set_crc },
>  	{ TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld,
>  		&xfs_bmbt_buf_ops, XFS_BTREE_LBLOCK_CRC_OFF },
>  	{ TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld,
> @@ -102,7 +102,7 @@ static const typ_t	__typtab_crc[] = {
>  		&xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
>  	{ TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
> -		&xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
>  	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
>  		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
>  	{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
> @@ -131,7 +131,7 @@ static const typ_t	__typtab_spcrc[] = {
>  	{ TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agi_buf_ops ,
>  		XFS_AGI_CRC_OFF },
>  	{ TYP_ATTR, "attr3", handle_struct, attr3_hfld,
> -		&xfs_attr3_db_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_attr3_db_buf_ops, TYP_F_CRC_FUNC, xfs_attr3_set_crc },
>  	{ TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld,
>  		&xfs_bmbt_buf_ops, XFS_BTREE_LBLOCK_CRC_OFF },
>  	{ TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld,
> @@ -146,7 +146,7 @@ static const typ_t	__typtab_spcrc[] = {
>  		&xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
>  	{ TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
> -		&xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
>  	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
>  		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
>  	{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,
> diff --git a/db/type.h b/db/type.h
> index 87ff107..85d89c7 100644
> --- a/db/type.h
> +++ b/db/type.h
> @@ -45,6 +45,8 @@ typedef struct typ
>  	const struct xfs_buf_ops *bops;
>  	unsigned long		crc_off;
>  #define TYP_F_NO_CRC_OFF	(-1UL)
> +#define TYP_F_CRC_FUNC		(-2UL)
> +	void			(*set_crc)(struct xfs_buf *);
>  } typ_t;
>  extern const typ_t	*typtab, *cur_typ;
>  
> diff --git a/db/write.c b/db/write.c
> index d24ea05..266bde4 100644
> --- a/db/write.c
> +++ b/db/write.c
> @@ -173,6 +173,9 @@ write_f(
>  	} else if (iocur_top->dquot_buf) {
>  		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
>  		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
> +	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
> +		local_ops.verify_write = iocur_top->typ->set_crc;
> +		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
>  	} else { /* invalid data */
>  		local_ops.verify_write = xfs_verify_recalc_crc;
>  		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 7/7] xfs_db: introduce fuzz command
  2017-07-31 21:07 ` [PATCH 7/7] xfs_db: introduce fuzz command Darrick J. Wong
@ 2017-08-02 11:06   ` Carlos Maiolino
  2017-08-03 16:47   ` [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Eric Sandeen
  1 sibling, 0 replies; 38+ messages in thread
From: Carlos Maiolino @ 2017-08-02 11:06 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: sandeen, linux-xfs

On Mon, Jul 31, 2017 at 02:07:32PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Introduce a new 'fuzz' command to write creative values into
> disk structure fields.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  db/Makefile       |    3 
>  db/bit.c          |   17 +-
>  db/bit.h          |    5 -
>  db/command.c      |    2 
>  db/fuzz.c         |  467 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  db/fuzz.h         |   21 ++
>  db/type.c         |   44 ++++-
>  db/type.h         |    1 
>  man/man8/xfs_db.8 |   49 ++++++
>  9 files changed, 589 insertions(+), 20 deletions(-)
>  create mode 100644 db/fuzz.c
>  create mode 100644 db/fuzz.h
> 

Code looks good and tested here.

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>


> 
> diff --git a/db/Makefile b/db/Makefile
> index 6618bff..8111bf1 100644
> --- a/db/Makefile
> +++ b/db/Makefile
> @@ -12,7 +12,8 @@ HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \
>  	dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \
>  	flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \
>  	io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \
> -	 sig.h strvec.h text.h type.h write.h attrset.h symlink.h fsmap.h
> +	sig.h strvec.h text.h type.h write.h attrset.h symlink.h fsmap.h \
> +	fuzz.h
>  CFILES = $(HFILES:.h=.c) btdump.c
>  LSRCFILES = xfs_admin.sh xfs_ncheck.sh xfs_metadump.sh
>  
> diff --git a/db/bit.c b/db/bit.c
> index f5ebf68..a20b6ba 100644
> --- a/db/bit.c
> +++ b/db/bit.c
> @@ -19,13 +19,8 @@
>  #include "libxfs.h"
>  #include "bit.h"
>  
> -#undef setbit	/* defined in param.h on Linux */
> -
> -static int	getbit(char *ptr, int bit);
> -static void	setbit(char *ptr, int bit, int val);
> -
> -static int
> -getbit(
> +int
> +getbit_l(
>  	char	*ptr,
>  	int	bit)
>  {
> @@ -39,8 +34,8 @@ getbit(
>  	return (*ptr & mask) >> shift;
>  }
>  
> -static void
> -setbit(
> +void
> +setbit_l(
>  	char *ptr,
>  	int  bit,
>  	int  val)
> @@ -106,7 +101,7 @@ getbitval(
>  
>  
>  	for (i = 0, rval = 0LL; i < nbits; i++) {
> -		if (getbit(p, bit + i)) {
> +		if (getbit_l(p, bit + i)) {
>  			/* If the last bit is on and we care about sign
>  			 * bits and we don't have a full 64 bit
>  			 * container, turn all bits on between the
> @@ -162,7 +157,7 @@ setbitval(
>  
>  	if (bitoff % NBBY || nbits % NBBY) {
>  		for (bit = 0; bit < nbits; bit++)
> -			setbit(out, bit + bitoff, getbit(in, bit));
> +			setbit_l(out, bit + bitoff, getbit_l(in, bit));
>  	} else
>  		memcpy(out + byteize(bitoff), in, byteize(nbits));
>  }
> diff --git a/db/bit.h b/db/bit.h
> index 9fd71f4..78fcd05 100644
> --- a/db/bit.h
> +++ b/db/bit.h
> @@ -21,9 +21,12 @@
>  #define	bitszof(x,y)	bitize(szof(x,y))
>  #define	byteize(s)	((s) / NBBY)
>  #define	bitoffs(s)	((s) % NBBY)
> +#define	byteize_up(s)	(((s) + NBBY - 1) / NBBY)
>  
>  #define	BVUNSIGNED	0
>  #define	BVSIGNED	1
>  
>  extern int64_t		getbitval(void *obj, int bitoff, int nbits, int flags);
> -extern void             setbitval(void *obuf, int bitoff, int nbits, void *ibuf);
> +extern void		setbitval(void *obuf, int bitoff, int nbits, void *ibuf);
> +extern int		getbit_l(char *ptr, int bit);
> +extern void		setbit_l(char *ptr, int bit, int val);
> diff --git a/db/command.c b/db/command.c
> index c90c85c..5ff3c4f 100644
> --- a/db/command.c
> +++ b/db/command.c
> @@ -51,6 +51,7 @@
>  #include "dquot.h"
>  #include "fsmap.h"
>  #include "crc.h"
> +#include "fuzz.h"
>  
>  cmdinfo_t	*cmdtab;
>  int		ncmds;
> @@ -147,4 +148,5 @@ init_commands(void)
>  	type_init();
>  	write_init();
>  	dquot_init();
> +	fuzz_init();
>  }
> diff --git a/db/fuzz.c b/db/fuzz.c
> new file mode 100644
> index 0000000..b4c62ca
> --- /dev/null
> +++ b/db/fuzz.c
> @@ -0,0 +1,467 @@
> +/*
> + * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
> + * All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it would be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write the Free Software Foundation,
> + * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> + */
> +
> +#include "libxfs.h"
> +#include <ctype.h>
> +#include <time.h>
> +#include "bit.h"
> +#include "block.h"
> +#include "command.h"
> +#include "type.h"
> +#include "faddr.h"
> +#include "fprint.h"
> +#include "field.h"
> +#include "flist.h"
> +#include "io.h"
> +#include "init.h"
> +#include "output.h"
> +#include "print.h"
> +#include "write.h"
> +#include "malloc.h"
> +
> +static int	fuzz_f(int argc, char **argv);
> +static void     fuzz_help(void);
> +
> +static const cmdinfo_t	fuzz_cmd =
> +	{ "fuzz", NULL, fuzz_f, 0, -1, 0, N_("[-c] [-d] field fuzzcmd..."),
> +	  N_("fuzz values on disk"), fuzz_help };
> +
> +void
> +fuzz_init(void)
> +{
> +	if (!expert_mode)
> +		return;
> +
> +	add_command(&fuzz_cmd);
> +	srand48(clock());
> +}
> +
> +static void
> +fuzz_help(void)
> +{
> +	dbprintf(_(
> +"\n"
> +" The 'fuzz' command fuzzes fields in any on-disk data structure.  For\n"
> +" block fuzzing, see the 'blocktrash' or 'write' commands."
> +"\n"
> +" Examples:\n"
> +"  Struct mode: 'fuzz core.uid zeroes'    - set an inode uid field to 0.\n"
> +"               'fuzz crc ones'           - set a crc filed to all ones.\n"
> +"               'fuzz bno[11] firstbit'   - set the high bit of a block array.\n"
> +"               'fuzz keys[5].startblock add'    - increase a btree key value.\n"
> +"               'fuzz uuid random'        - randomize the superblock uuid.\n"
> +"\n"
> +" In data mode type 'fuzz' by itself for a list of specific commands.\n\n"
> +" Specifying the -c option will allow writes of invalid (corrupt) data with\n"
> +" an invalid CRC. Specifying the -d option will allow writes of invalid data,\n"
> +" but still recalculate the CRC so we are forced to check and detect the\n"
> +" invalid data appropriately.\n\n"
> +));
> +
> +}
> +
> +static int
> +fuzz_f(
> +	int		argc,
> +	char		**argv)
> +{
> +	pfunc_t	pf;
> +	extern char *progname;
> +	int c;
> +	bool corrupt = false;	/* Allow write of bad data w/ invalid CRC */
> +	bool invalid_data = false; /* Allow write of bad data w/ valid CRC */
> +	struct xfs_buf_ops local_ops;
> +	const struct xfs_buf_ops *stashed_ops = NULL;
> +
> +	if (x.isreadonly & LIBXFS_ISREADONLY) {
> +		dbprintf(_("%s started in read only mode, fuzzing disabled\n"),
> +			progname);
> +		return 0;
> +	}
> +
> +	if (cur_typ == NULL) {
> +		dbprintf(_("no current type\n"));
> +		return 0;
> +	}
> +
> +	pf = cur_typ->pfunc;
> +	if (pf == NULL) {
> +		dbprintf(_("no handler function for type %s, fuzz unsupported.\n"),
> +			 cur_typ->name);
> +		return 0;
> +	}
> +
> +	while ((c = getopt(argc, argv, "cd")) != EOF) {
> +		switch (c) {
> +		case 'c':
> +			corrupt = true;
> +			break;
> +		case 'd':
> +			invalid_data = true;
> +			break;
> +		default:
> +			dbprintf(_("bad option for fuzz command\n"));
> +			return 0;
> +		}
> +	}
> +
> +	if (corrupt && invalid_data) {
> +		dbprintf(_("Cannot specify both -c and -d options\n"));
> +		return 0;
> +	}
> +
> +	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
> +			!iocur_top->ino_buf && !iocur_top->dquot_buf) {
> +		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
> +		return 0;
> +	}
> +
> +	argc -= optind;
> +	argv += optind;
> +
> +	/*
> +	 * If the buffer has no verifier or we are using standard verifier
> +	 * paths, then just fuzz it and return
> +	 */
> +	if (!iocur_top->bp->b_ops ||
> +	    !(corrupt || invalid_data)) {
> +		(*pf)(DB_FUZZ, cur_typ->fields, argc, argv);
> +		return 0;
> +	}
> +
> +
> +	/* Temporarily remove write verifier to write bad data */
> +	stashed_ops = iocur_top->bp->b_ops;
> +	local_ops.verify_read = stashed_ops->verify_read;
> +	iocur_top->bp->b_ops = &local_ops;
> +
> +	if (corrupt) {
> +		local_ops.verify_write = xfs_dummy_verify;
> +		dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n"));
> +	} else if (iocur_top->ino_buf) {
> +		local_ops.verify_write = xfs_verify_recalc_inode_crc;
> +		dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n"));
> +	} else if (iocur_top->dquot_buf) {
> +		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
> +		dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n"));
> +	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
> +		local_ops.verify_write = iocur_top->typ->set_crc;
> +		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
> +	} else { /* invalid data */
> +		local_ops.verify_write = xfs_verify_recalc_crc;
> +		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
> +	}
> +
> +	(*pf)(DB_FUZZ, cur_typ->fields, argc, argv);
> +
> +	iocur_top->bp->b_ops = stashed_ops;
> +
> +	return 0;
> +}
> +
> +/* Write zeroes to the field */
> +static bool
> +fuzz_zeroes(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	char		*out = buf;
> +	int		bit;
> +
> +	if (bitoff % NBBY || nbits % NBBY) {
> +		for (bit = 0; bit < nbits; bit++)
> +			setbit_l(out, bit + bitoff, 0);
> +	} else
> +		memset(out + byteize(bitoff), 0, byteize(nbits));
> +	return true;
> +}
> +
> +/* Write ones to the field */
> +static bool
> +fuzz_ones(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	char		*out = buf;
> +	int		bit;
> +
> +	if (bitoff % NBBY || nbits % NBBY) {
> +		for (bit = 0; bit < nbits; bit++)
> +			setbit_l(out, bit + bitoff, 1);
> +	} else
> +		memset(out + byteize(bitoff), 0xFF, byteize(nbits));
> +	return true;
> +}
> +
> +/* Flip the high bit in the (presumably big-endian) field */
> +static bool
> +fuzz_firstbit(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	setbit_l((char *)buf, bitoff, !getbit_l((char *)buf, bitoff));
> +	return true;
> +}
> +
> +/* Flip the low bit in the (presumably big-endian) field */
> +static bool
> +fuzz_lastbit(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	setbit_l((char *)buf, bitoff + nbits - 1,
> +			!getbit_l((char *)buf, bitoff));
> +	return true;
> +}
> +
> +/* Flip the middle bit in the (presumably big-endian) field */
> +static bool
> +fuzz_middlebit(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	setbit_l((char *)buf, bitoff + nbits / 2,
> +			!getbit_l((char *)buf, bitoff));
> +	return true;
> +}
> +
> +/* Format and shift a number into a buffer for setbitval. */
> +static char *
> +format_number(
> +	uint64_t	val,
> +	__be64		*out,
> +	int		bit_length)
> +{
> +	int		offset;
> +	char		*rbuf = (char *)out;
> +
> +	/*
> +	 * If the length of the field is not a multiple of a byte, push
> +	 * the bits up in the field, so the most signicant field bit is
> +	 * the most significant bit in the byte:
> +	 *
> +	 * before:
> +	 * val  |----|----|----|----|----|--MM|mmmm|llll|
> +	 * after
> +	 * val  |----|----|----|----|----|MMmm|mmll|ll00|
> +	 */
> +	offset = bit_length % NBBY;
> +	if (offset)
> +		val <<= (NBBY - offset);
> +
> +	/*
> +	 * convert to big endian and copy into the array
> +	 * rbuf |----|----|----|----|----|MMmm|mmll|ll00|
> +	 */
> +	*out = cpu_to_be64(val);
> +
> +	/*
> +	 * Align the array to point to the field in the array.
> +	 *  rbuf  = |MMmm|mmll|ll00|
> +	 */
> +	offset = sizeof(__be64) - 1 - ((bit_length - 1) / sizeof(__be64));
> +	return rbuf + offset;
> +}
> +
> +/* Increase the value by some small prime number. */
> +static bool
> +fuzz_add(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	uint64_t	val;
> +	__be64		out;
> +	char		*b;
> +
> +	if (nbits > 64)
> +		return false;
> +
> +	val = getbitval(buf, bitoff, nbits, BVUNSIGNED);
> +	val += (nbits > 8 ? 2017 : 137);
> +	b = format_number(val, &out, nbits);
> +	setbitval(buf, bitoff, nbits, b);
> +
> +	return true;
> +}
> +
> +/* Decrease the value by some small prime number. */
> +static bool
> +fuzz_sub(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	uint64_t	val;
> +	__be64		out;
> +	char		*b;
> +
> +	if (nbits > 64)
> +		return false;
> +
> +	val = getbitval(buf, bitoff, nbits, BVUNSIGNED);
> +	val -= (nbits > 8 ? 2017 : 137);
> +	b = format_number(val, &out, nbits);
> +	setbitval(buf, bitoff, nbits, b);
> +
> +	return true;
> +}
> +
> +/* Randomize the field. */
> +static bool
> +fuzz_random(
> +	void		*buf,
> +	int		bitoff,
> +	int		nbits)
> +{
> +	int		i, bytes;
> +	char		*b, *rbuf;
> +
> +	bytes = byteize_up(nbits);
> +	rbuf = b = malloc(bytes);
> +	if (!b) {
> +		perror("fuzz_random");
> +		return false;
> +	}
> +
> +	for (i = 0; i < bytes; i++)
> +		*b++ = (char)lrand48();
> +
> +	setbitval(buf, bitoff, nbits, rbuf);
> +	free(rbuf);
> +
> +	return true;
> +}
> +
> +struct fuzzcmd {
> +	const char	*verb;
> +	bool		(*fn)(void *buf, int bitoff, int nbits);
> +};
> +
> +/* Keep these verbs in sync with enum fuzzcmds. */
> +static struct fuzzcmd fuzzverbs[] = {
> +	{"zeroes",		fuzz_zeroes},
> +	{"ones",		fuzz_ones},
> +	{"firstbit",		fuzz_firstbit},
> +	{"middlebit",		fuzz_middlebit},
> +	{"lastbit",		fuzz_lastbit},
> +	{"add",			fuzz_add},
> +	{"sub",			fuzz_sub},
> +	{"random",		fuzz_random},
> +	{NULL,			NULL},
> +};
> +
> +/* ARGSUSED */
> +void
> +fuzz_struct(
> +	const field_t	*fields,
> +	int		argc,
> +	char		**argv)
> +{
> +	const ftattr_t	*fa;
> +	flist_t		*fl;
> +	flist_t		*sfl;
> +	int		bit_length;
> +	struct fuzzcmd	*fc;
> +	bool		success;
> +	int		parentoffset;
> +
> +	if (argc != 2) {
> +		dbprintf(_("Usage: fuzz fieldname verb\n"));
> +		dbprintf("Verbs: %s", fuzzverbs->verb);
> +		for (fc = fuzzverbs + 1; fc->verb != NULL; fc++)
> +			dbprintf(", %s", fc->verb);
> +		dbprintf(".\n");
> +		return;
> +	}
> +
> +	fl = flist_scan(argv[0]);
> +	if (!fl) {
> +		dbprintf(_("unable to parse '%s'.\n"), argv[0]);
> +		return;
> +	}
> +
> +	/* Find our fuzz verb */
> +	for (fc = fuzzverbs; fc->verb != NULL; fc++)
> +		if (!strcmp(fc->verb, argv[1]))
> +			break;
> +	if (fc->fn == NULL) {
> +		dbprintf(_("Unknown fuzz command '%s'.\n"), argv[1]);
> +		return;
> +	}
> +
> +	/* if we're a root field type, go down 1 layer to get field list */
> +	if (fields->name[0] == '\0') {
> +		fa = &ftattrtab[fields->ftyp];
> +		ASSERT(fa->ftyp == fields->ftyp);
> +		fields = fa->subfld;
> +	}
> +
> +	/* run down the field list and set offsets into the data */
> +	if (!flist_parse(fields, fl, iocur_top->data, 0)) {
> +		flist_free(fl);
> +		dbprintf(_("parsing error\n"));
> +		return;
> +	}
> +
> +	sfl = fl;
> +	parentoffset = 0;
> +	while (sfl->child) {
> +		parentoffset = sfl->offset;
> +		sfl = sfl->child;
> +	}
> +
> +	/*
> +	 * For structures, fsize * fcount tells us the size of the region we are
> +	 * modifying, which is usually a single structure member and is pointed
> +	 * to by the last child in the list.
> +	 *
> +	 * However, if the base structure is an array and we have a direct index
> +	 * into the array (e.g. write bno[5]) then we are returned a single
> +	 * flist object with the offset pointing directly at the location we
> +	 * need to modify. The length of the object we are modifying is then
> +	 * determined by the size of the individual array entry (fsize) and the
> +	 * indexes defined in the object, not the overall size of the array
> +	 * (which is what fcount returns).
> +	 */
> +	bit_length = fsize(sfl->fld, iocur_top->data, parentoffset, 0);
> +	if (sfl->fld->flags & FLD_ARRAY)
> +		bit_length *= sfl->high - sfl->low + 1;
> +	else
> +		bit_length *= fcount(sfl->fld, iocur_top->data, parentoffset);
> +
> +	/* Fuzz the value */
> +	success = fc->fn(iocur_top->data, sfl->offset, bit_length);
> +	if (!success) {
> +		dbprintf(_("unable to fuzz field '%s'\n"), argv[0]);
> +		flist_free(fl);
> +		return;
> +	}
> +
> +	/* Write the fuzzed value back */
> +	write_cur();
> +
> +	flist_print(fl);
> +	print_flist(fl);
> +	flist_free(fl);
> +}
> diff --git a/db/fuzz.h b/db/fuzz.h
> new file mode 100644
> index 0000000..c203eb5
> --- /dev/null
> +++ b/db/fuzz.h
> @@ -0,0 +1,21 @@
> +/*
> + * Copyright (C) 2017 Oracle.  All Rights Reserved.
> + *
> + * Author: Darrick J. Wong <darrick.wong@oracle.com>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it would be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write the Free Software Foundation,
> + * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
> + */
> +extern void	fuzz_init(void);
> +extern void	fuzz_struct(const field_t *fields, int argc, char **argv);
> diff --git a/db/type.c b/db/type.c
> index bf31e04..740adc0 100644
> --- a/db/type.c
> +++ b/db/type.c
> @@ -39,6 +39,7 @@
>  #include "dir2.h"
>  #include "text.h"
>  #include "symlink.h"
> +#include "fuzz.h"
>  
>  static const typ_t	*findtyp(char *name);
>  static int		type_f(int argc, char **argv);
> @@ -254,10 +255,17 @@ handle_struct(
>  	int           argc,
>  	char          **argv)
>  {
> -	if (action == DB_WRITE)
> +	switch (action) {
> +	case DB_FUZZ:
> +		fuzz_struct(fields, argc, argv);
> +		break;
> +	case DB_WRITE:
>  		write_struct(fields, argc, argv);
> -	else
> +		break;
> +	case DB_READ:
>  		print_struct(fields, argc, argv);
> +		break;
> +	}
>  }
>  
>  void
> @@ -267,10 +275,17 @@ handle_string(
>  	int           argc,
>  	char          **argv)
>  {
> -	if (action == DB_WRITE)
> +	switch (action) {
> +	case DB_WRITE:
>  		write_string(fields, argc, argv);
> -	else
> +		break;
> +	case DB_READ:
>  		print_string(fields, argc, argv);
> +		break;
> +	case DB_FUZZ:
> +		dbprintf(_("string fuzzing not supported.\n"));
> +		break;
> +	}
>  }
>  
>  void
> @@ -280,10 +295,17 @@ handle_block(
>  	int           argc,
>  	char          **argv)
>  {
> -	if (action == DB_WRITE)
> +	switch (action) {
> +	case DB_WRITE:
>  		write_block(fields, argc, argv);
> -	else
> +		break;
> +	case DB_READ:
>  		print_block(fields, argc, argv);
> +		break;
> +	case DB_FUZZ:
> +		dbprintf(_("use 'blocktrash' or 'write' to fuzz a block.\n"));
> +		break;
> +	}
>  }
>  
>  void
> @@ -293,6 +315,14 @@ handle_text(
>  	int           argc,
>  	char          **argv)
>  {
> -	if (action != DB_WRITE)
> +	switch (action) {
> +	case DB_FUZZ:
> +		/* fall through */
> +	case DB_WRITE:
> +		dbprintf(_("text writing/fuzzing not supported.\n"));
> +		break;
> +	case DB_READ:
>  		print_text(fields, argc, argv);
> +		break;
> +	}
>  }
> diff --git a/db/type.h b/db/type.h
> index 85d89c7..3971975 100644
> --- a/db/type.h
> +++ b/db/type.h
> @@ -30,6 +30,7 @@ typedef enum typnm
>  	TYP_TEXT, TYP_FINOBT, TYP_NONE
>  } typnm_t;
>  
> +#define DB_FUZZ  2
>  #define DB_WRITE 1
>  #define DB_READ  0
>  
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index b3129f7..49e665a 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -613,6 +613,55 @@ in units of 512-byte blocks, no matter what the filesystem's block size is.
>  .BI "The optional " start " and " end " arguments can be used to constrain
>  the output to a particular range of disk blocks.
>  .TP
> +.BI "fuzz [\-c] [\-d] " "field action"
> +Write garbage into a specific structure field on disk.
> +Expert mode must be enabled to use this command.
> +The operation happens immediately; there is no buffering.
> +.IP
> +The fuzz command can take the following
> +.IR action "s"
> +against a field:
> +.RS 1.0i
> +.TP 0.4i
> +.B zeroes
> +Clears all bits in the field.
> +.TP 0.4i
> +.B ones
> +Sets all bits in the field.
> +.TP 0.4i
> +.B firstbit
> +Flips the first bit in the field.
> +For a scalar value, this is the highest bit.
> +.TP 0.4i
> +.B middlebit
> +Flips the middle bit in the field.
> +.TP 0.4i
> +.B lastbit
> +Flips the last bit in the field.
> +For a scalar value, this is the lowest bit.
> +.TP 0.4i
> +.B add
> +Adds a small value to a scalar field.
> +.TP 0.4i
> +.B sub
> +Subtracts a small value from a scalar field.
> +.TP 0.4i
> +.B random
> +Randomizes the contents of the field.
> +.RE
> +.IP
> +The following switches affect the write behavior:
> +.RS 1.0i
> +.TP 0.4i
> +.B \-c
> +Skip write verifiers and CRC recalculation; allows invalid data to be written
> +to disk.
> +.TP 0.4i
> +.B \-d
> +Skip write verifiers but perform CRC recalculation; allows invalid data to be
> +written to disk to test detection of invalid data.
> +.RE
> +.TP
>  .BI hash " string
>  Prints the hash value of
>  .I string
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Carlos

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 1/7] xfs: remove double-underscore integer types
  2017-08-02  9:13   ` Carlos Maiolino
@ 2017-08-02 16:01     ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-02 16:01 UTC (permalink / raw)
  To: linux-xfs

On Wed, Aug 02, 2017 at 11:13:05AM +0200, Carlos Maiolino wrote:
> Hi,
> 
> On Mon, Jul 31, 2017 at 02:06:54PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > This is a purely mechanical patch that removes the private
> > __{u,}int{8,16,32,64}_t typedefs in favor of using the system
> > {u,}int{8,16,32,64}_t typedefs.  This is the sed script used to perform
> > the transformation and fix the resulting whitespace and indentation
> > errors:
> > 
> > s/typedef\t__uint8_t/typedef __uint8_t\t/g
> > s/typedef\t__uint/typedef __uint/g
> > s/typedef\t__int\([0-9]*\)_t/typedef int\1_t\t/g
> > s/__uint8_t\t/__uint8_t\t\t/g
> > s/__uint/uint/g
> > s/__int\([0-9]*\)_t\t/__int\1_t\t\t/g
> > s/__int/int/g
> > /^typedef.*int[0-9]*_t;$/d
> > 
> 
> Loos fine, with a few space X tabs cosmetic changes maybe worth to change?

> 
> 
> Anyway, just a suggestion, changing it or not:
> 
> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
> 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  
> > diff --git a/db/bit.h b/db/bit.h
> > index 80ba24c..9fd71f4 100644
> > --- a/db/bit.h
> > +++ b/db/bit.h
> > @@ -25,5 +25,5 @@
> >  #define	BVUNSIGNED	0
> >  #define	BVSIGNED	1
> >  
> > -extern __int64_t	getbitval(void *obj, int bitoff, int nbits, int flags);
> > +extern int64_t		getbitval(void *obj, int bitoff, int nbits, int flags);
> >  extern void             setbitval(void *obuf, int bitoff, int nbits, void *ibuf);
> 
> 		^ Maybe worth to fix this space x tabs while in this code?

Different cleanup patch, please.  The double-underscore cleanup patch
should /only/ touch double underscore types, and nothing else.  I think
Eric fixed a few cases of extra whitespace that drifts this patch away
from the giant sed blob, but whatever already too hot here to bikeshed
further over whitespace. :)

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> > diff --git a/db/io.h b/db/io.h
> > index 9973004..df0fdd7 100644
> > --- a/db/io.h
> > +++ b/db/io.h
> > @@ -25,7 +25,7 @@ typedef struct bbmap {
> >  } bbmap_t;
> >  
> >  typedef struct iocur {
> > -	__int64_t		bb;	/* BB number in filesystem of buf */
> > +	int64_t			bb;	/* BB number in filesystem of buf */
> >  	int			blen;	/* length of "buf", bb's */
> >  	int			boff;	/* data - buf */
> >  	void			*buf;	/* base address of buffer */
> > @@ -33,7 +33,7 @@ typedef struct iocur {
> >  	xfs_ino_t		dirino;	/* current directory inode number */
> >  	xfs_ino_t		ino;	/* current inode number */
> >  	int			len;	/* length of "data", bytes */
> > -	__uint16_t		mode;	/* current inode's mode */
> > +	uint16_t		mode;	/* current inode's mode */
> >  	xfs_off_t		off;	/* fs offset of "data" in bytes */
> >  	const struct typ	*typ;	/* type of "data" */
> >  	bbmap_t			*bbmap;	/* map daddr if fragmented */
> > @@ -57,7 +57,7 @@ extern void	off_cur(int off, int len);
> >  extern void	pop_cur(void);
> >  extern void	print_iocur(char *tag, iocur_t *ioc);
> >  extern void	push_cur(void);
> > -extern int	read_buf(__int64_t daddr, int count, void *bufp);
> > +extern int	read_buf(int64_t daddr, int count, void *bufp);
> >  extern void     write_cur(void);
> 
> 		^^
> 
> >  
> > diff --git a/db/sb.c b/db/sb.c
> > index 8e7722c..f19248d 100644
> > --- a/db/sb.c
> > +++ b/db/sb.c
> > @@ -606,7 +606,7 @@ version_help(void)
> >  }
> >  
> >  static int
> > -do_version(xfs_agnumber_t agno, __uint16_t version, __uint32_t features)
> > +do_version(xfs_agnumber_t agno, uint16_t version, uint32_t features)
> >  {
> >  	xfs_sb_t	tsb;
> >  
> > @@ -710,8 +710,8 @@ version_f(
> >  	int		argc,
> >  	char		**argv)
> >  {
> > -	__uint16_t	version = 0;
> > -	__uint32_t	features = 0;
> > +	uint16_t	version = 0;
> > +	uint32_t	features = 0;
> >  	xfs_agnumber_t	ag;
> >  
> >  	if (argc == 2) {	/* WRITE VERSION */
> > diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
> > index 517b75f..d4846a3 100644
> > --- a/fsr/xfs_fsr.c
> > +++ b/fsr/xfs_fsr.c
> > @@ -54,7 +54,7 @@ struct getbmap  *outmap = NULL;
> >  int             outmap_size = 0;
> 
> 	^^^
> 
> >  int		RealUid;
> >  int		tmp_agi;
> > -static __int64_t	minimumfree = 2048;
> > +static int64_t		minimumfree = 2048;
> >  
> >  #define MNTTYPE_XFS             "xfs"
> >  
> 			^^^
> 
> > diff --git a/include/xfs_arch.h b/include/xfs_arch.h
> > index 12cd43e..186cadb 100644
> > --- a/include/xfs_arch.h
> > +++ b/include/xfs_arch.h
> > @@ -244,39 +244,39 @@ static inline void be64_add_cpu(__be64 *a, __s64 b)
> >  	*a = cpu_to_be64(be64_to_cpu(*a) + b);
> >  }
> >  
> > -static inline __uint16_t get_unaligned_be16(void *p)
> > +static inline uint16_t get_unaligned_be16(void *p)
> >  {
> > -	__uint8_t *__p = p;
> > +	uint8_t *__p = p;
> >  	return __p[0] << 8 | __p[1];
> >  }
> >  
> > -static inline __uint32_t get_unaligned_be32(void *p)
> > +static inline uint32_t get_unaligned_be32(void *p)
> >  {
> > -	__uint8_t *__p = p;
> > +	uint8_t *__p = p;
> >          return __p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3];
> 
>  ^^^
> 
> >  /*
> > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
> > index 6c8a192..43b4f1d 100644
> > --- a/libxfs/rdwr.c
> > +++ b/libxfs/rdwr.c
> > @@ -118,9 +118,9 @@ static void unmount_record(void *p)
> >  	xlog_op_header_t	*op = (xlog_op_header_t *)p;
> >  	/* the data section must be 32 bit size aligned */
> >  	struct {
> > -	    __uint16_t magic;
> > -	    __uint16_t pad1;
> > -	    __uint32_t pad2; /* may as well make it 64 bits */
> > +	    uint16_t magic;
> > +	    uint16_t pad1;
> > +	    uint32_t pad2; /* may as well make it 64 bits */
> >  	} magic = { XLOG_UNMOUNT_TYPE, 0, 0 };
> 
> 	^^^
> > diff --git a/logprint/log_misc.c b/logprint/log_misc.c
> > index 0dfcfd1..fe27f15 100644
> > --- a/logprint/log_misc.c
> > +++ b/logprint/log_misc.c
> > @@ -166,12 +166,12 @@ xlog_print_trans_header(char **ptr, int len)
> >  {
> >      xfs_trans_header_t  *h;
> >      char		*cptr = *ptr;
> > -    __uint32_t          magic;
> > +    uint32_t          magic;
> >      char                *magic_c = (char *)&magic;
> >  
> 
> 	^^^^
> 
> 
> >      *ptr += len;
> >  
> > -    magic=*(__uint32_t*)cptr; /* XXX be32_to_cpu soon */
> > +    magic=*(uint32_t*)cptr; /* XXX be32_to_cpu soon */
> >  
> >      if (len >= 4) {
> >  #if __BYTE_ORDER == __LITTLE_ENDIAN
> > @@ -201,7 +201,7 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int num_ops)
> >      int			 num, skip;
> >      int			 super_block = 0;
> >      int			 bucket, col, buckets;
> > -    __int64_t		 blkno;
> > +    int64_t			 blkno;
> >      xfs_buf_log_format_t lbuf;
> >      int			 size, blen, map_size, struct_size;
> >      __be64		 x, y;
> 
> 	^^^
> 
> > --- a/repair/attr_repair.h
> > +++ b/repair/attr_repair.h
> > @@ -32,10 +32,10 @@
> >  #define ACL_WRITE	02
> >  #define ACL_EXECUTE	01
> >  
> >   */
> >  #define XFS_MAC_MAX_SETS	250
> >  typedef struct xfs_mac_label {
> > -	__uint8_t       ml_msen_type;	/* MSEN label type */
> > -	__uint8_t       ml_mint_type;	/* MINT label type */
> > -	__uint8_t       ml_level;	/* Hierarchical level */
> > -	__uint8_t       ml_grade;	/* Hierarchical grade */
> > -	__uint16_t      ml_catcount;	/* Category count */
> > -	__uint16_t      ml_divcount;	/* Division count */
> > +	uint8_t       ml_msen_type;	/* MSEN label type */
> > +	uint8_t       ml_mint_type;	/* MINT label type */
> > +	uint8_t       ml_level;	/* Hierarchical level */
> > +	uint8_t       ml_grade;	/* Hierarchical grade */
> > +	uint16_t      ml_catcount;	/* Category count */
> > +	uint16_t      ml_divcount;	/* Division count */
> >  					/* Category set, then Division set */
> > -	__uint16_t      ml_list[XFS_MAC_MAX_SETS];
> > +	uint16_t      ml_list[XFS_MAC_MAX_SETS];
> 
> 		^^^
> >  } xfs_mac_label_t;
> 
> > diff --git a/repair/avl64.c b/repair/avl64.c
> > index 51cd624..8f4a121 100644
> > --- a/repair/avl64.c
> > +++ b/repair/avl64.c
> > @@ -70,8 +70,8 @@ avl64_checktree(
> >  	avl64node_t *root)
> >  {
> >  	avl64node_t *nlast, *nnext, *np;
> > -	__uint64_t offset = 0;
> > -	__uint64_t end;
> > +	uint64_t offset = 0;
> > +	uint64_t end;
> >  
> >  	nlast = nnext = root;
> >  
> >  avl64node_t *
> >  avl64_insert_find_growth(
> >  		avl64tree_desc_t *tree,
> > -		__uint64_t start,	/* range start at start, */
> > -		__uint64_t end,	/* exclusive */
> > +		uint64_t start,	/* range start at start, */
> > +		uint64_t end,	/* exclusive */
> >  		int   *growthp)	/* OUT */
> 		   ^^^
> >  {
> >  	avl64node_t *np = tree->avl_root;
> > @@ -1378,8 +1378,8 @@ avl64_findadjacent(
> >  void
> >  avl64_findranges(
> >  	avl64tree_desc_t *tree,
> > -	__uint64_t start,
> > -	__uint64_t end,
> > +	uint64_t start,
> > +	uint64_t end,
> >  	avl64node_t	        **startp,
> 
> 			^^^
> 
> >  	avl64node_t		**endp)
> >  {
> > diff --git a/repair/avl64.h b/repair/avl64.h
> > index fd19321..cd079a0 100644
> > --- a/repair/avl64.h
> > +++ b/repair/avl64.h
> > @@ -32,8 +32,8 @@ typedef struct	avl64node {
> >   * avl-tree operations
> >   */
> >  
> >  avl64node_t *
> >  avl64_findanyrange(
> >  	avl64tree_desc_t *tree,
> > -	__uint64_t	start,
> > -	__uint64_t	end,
> > +	uint64_t	start,
> > +	uint64_t	end,
> >  	int     checklen);
> 
> 	^^^
> >  
> >  
> >  avl64node_t *
> >  avl64_findadjacent(
> >  	avl64tree_desc_t *tree,
> > -	__uint64_t	value,
> > +	uint64_t	value,
> >  	int		dir);
> >  
> >  void
> >  avl64_findranges(
> >  	avl64tree_desc_t *tree,
> > -	__uint64_t	start,
> > -	__uint64_t	end,
> > +	uint64_t	start,
> > +	uint64_t	end,
> >  	avl64node_t	        **startp,
> 
> 			^^^
> 
> >  	avl64node_t		**endp);
> >  
> 
> -- 
> Carlos
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v2 4/7] xfs_db: dump dir/attr btrees
  2017-08-02  9:24     ` Carlos Maiolino
@ 2017-08-02 16:03       ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-02 16:03 UTC (permalink / raw)
  To: sandeen, linux-xfs

On Wed, Aug 02, 2017 at 11:24:16AM +0200, Carlos Maiolino wrote:
> On Tue, Aug 01, 2017 at 08:40:53AM -0700, Darrick J. Wong wrote:
> > Dump the directory or extended attribute btree contents.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Btw, this is missing a changelog comparing with the V1, but I believe it doesn't
> go to the patch description anyway.

---
v2: fix whitespace problems, rename ops struct to have _ops in name, amend
help screen to say that we can dump dir/attr btrees now.
---

--D

> 
> 
> -- 
> Carlos
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs
  2017-07-31 21:07 ` [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs Darrick J. Wong
  2017-08-02  9:40   ` Carlos Maiolino
@ 2017-08-03 16:02   ` Eric Sandeen
  2017-08-03 16:40     ` Darrick J. Wong
  1 sibling, 1 reply; 38+ messages in thread
From: Eric Sandeen @ 2017-08-03 16:02 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Extend typ_t to (optionally) store a pointer to a function to calculate
> the CRC of the block, provide functions to do this for the dir3 and
> attr3 types, and then wire up the write command so that we can modify
> directory and extended attribute block fields.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  db/attr.c  |   32 ++++++++++++++++++++++++++++++++
>  db/attr.h  |    1 +
>  db/dir2.c  |   37 +++++++++++++++++++++++++++++++++++++
>  db/dir2.h  |    1 +
>  db/type.c  |    8 ++++----
>  db/type.h  |    2 ++
>  db/write.c |    3 +++
>  7 files changed, 80 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/db/attr.c b/db/attr.c
> index 98fb069..2fa6690 100644
> --- a/db/attr.c
> +++ b/db/attr.c
> @@ -602,6 +602,38 @@ const struct field	attr3_remote_crc_flds[] = {
>  	{ NULL }
>  };
>  
> +/* Set the CRC. */
> +void
> +xfs_attr3_set_crc(
> +	struct xfs_buf		*bp)
> +{
> +	__be32			magic32;
> +	__be16			magic16;
> +
> +	magic32 = *(__be32 *)bp->b_addr;
> +	magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
> +
> +	switch (magic16) {
> +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):

Isn't it more typical to endian-swap magic16 and not have the
swap in each case statement?  *shrug*

> +		xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF);
> +		return;
> +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> +		xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
> +		return;
> +	default:
> +		break;
> +	}

...

>  
> diff --git a/db/write.c b/db/write.c
> index d24ea05..266bde4 100644
> --- a/db/write.c
> +++ b/db/write.c
> @@ -173,6 +173,9 @@ write_f(
>  	} else if (iocur_top->dquot_buf) {
>  		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
>  		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
> +	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
> +		local_ops.verify_write = iocur_top->typ->set_crc;
> +		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
>  	} else { /* invalid data */
>  		local_ops.verify_write = xfs_verify_recalc_crc;
>  		dbprintf(_("Allowing write of corrupted data with good CRC\n"));

looking at this else if else if else if gunk makes me think that this has
grown a bit out of control.

We have other special types that require unique crc setting functions - dquots
and inodes.  In those cases, we have TYP_F_NO_CRC_OFF but a special indicator
that they are of this type (ino_buf, dquot_buf), with a hard-coded recalculation
routine (xfs_verify_recalc_dquot_crc, xfs_verify_recalc_inode_crc).  Now for /other/
types you've extended typ_t and put the function in there as an op, which makes
sense.

It seems to me that it would be logical to move the existing crc recalculation
routines for dquots & inodes into this new op as well, and locate & name everything
consistently, no?

Thanks,
-Eric



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs
  2017-08-03 16:02   ` Eric Sandeen
@ 2017-08-03 16:40     ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-03 16:40 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: linux-xfs

On Thu, Aug 03, 2017 at 11:02:15AM -0500, Eric Sandeen wrote:
> On 7/31/17 4:07 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Extend typ_t to (optionally) store a pointer to a function to calculate
> > the CRC of the block, provide functions to do this for the dir3 and
> > attr3 types, and then wire up the write command so that we can modify
> > directory and extended attribute block fields.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  db/attr.c  |   32 ++++++++++++++++++++++++++++++++
> >  db/attr.h  |    1 +
> >  db/dir2.c  |   37 +++++++++++++++++++++++++++++++++++++
> >  db/dir2.h  |    1 +
> >  db/type.c  |    8 ++++----
> >  db/type.h  |    2 ++
> >  db/write.c |    3 +++
> >  7 files changed, 80 insertions(+), 4 deletions(-)
> > 
> > 
> > diff --git a/db/attr.c b/db/attr.c
> > index 98fb069..2fa6690 100644
> > --- a/db/attr.c
> > +++ b/db/attr.c
> > @@ -602,6 +602,38 @@ const struct field	attr3_remote_crc_flds[] = {
> >  	{ NULL }
> >  };
> >  
> > +/* Set the CRC. */
> > +void
> > +xfs_attr3_set_crc(
> > +	struct xfs_buf		*bp)
> > +{
> > +	__be32			magic32;
> > +	__be16			magic16;
> > +
> > +	magic32 = *(__be32 *)bp->b_addr;
> > +	magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
> > +
> > +	switch (magic16) {
> > +	case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
> 
> Isn't it more typical to endian-swap magic16 and not have the
> swap in each case statement?  *shrug*

cpu_to_be*() will do constant folding so we don't have to do any byte
swapping at run time.

(I doubt it matters much here, but a fair amount of xfs code follows
that paradigm...)

> > +		xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF);
> > +		return;
> > +	case cpu_to_be16(XFS_DA3_NODE_MAGIC):
> > +		xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
> > +		return;
> > +	default:
> > +		break;
> > +	}
> 
> ...
> 
> >  
> > diff --git a/db/write.c b/db/write.c
> > index d24ea05..266bde4 100644
> > --- a/db/write.c
> > +++ b/db/write.c
> > @@ -173,6 +173,9 @@ write_f(
> >  	} else if (iocur_top->dquot_buf) {
> >  		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
> >  		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
> > +	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
> > +		local_ops.verify_write = iocur_top->typ->set_crc;
> > +		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
> >  	} else { /* invalid data */
> >  		local_ops.verify_write = xfs_verify_recalc_crc;
> >  		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
> 
> looking at this else if else if else if gunk makes me think that this has
> grown a bit out of control.
> 
> We have other special types that require unique crc setting functions - dquots
> and inodes.  In those cases, we have TYP_F_NO_CRC_OFF but a special indicator
> that they are of this type (ino_buf, dquot_buf), with a hard-coded recalculation
> routine (xfs_verify_recalc_dquot_crc, xfs_verify_recalc_inode_crc).  Now for /other/
> types you've extended typ_t and put the function in there as an op, which makes
> sense.
> 
> It seems to me that it would be logical to move the existing crc recalculation
> routines for dquots & inodes into this new op as well, and locate & name everything
> consistently, no?

Yep.  New patch!

--D

> 
> Thanks,
> -Eric
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots
  2017-07-31 21:07 ` [PATCH 7/7] xfs_db: introduce fuzz command Darrick J. Wong
  2017-08-02 11:06   ` Carlos Maiolino
@ 2017-08-03 16:47   ` Eric Sandeen
  2017-08-03 16:58     ` Darrick J. Wong
  2017-08-03 17:15     ` [PATCH 8/7 V2] " Eric Sandeen
  1 sibling, 2 replies; 38+ messages in thread
From: Eric Sandeen @ 2017-08-03 16:47 UTC (permalink / raw)
  To: Darrick J. Wong, sandeen; +Cc: linux-xfs

Now that typ_t has a ->set_crc method, use it for inodes & dquots
as well, rather than recognizing them as special types and calling
their crc functions directly by name.

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

diff --git a/db/dquot.c b/db/dquot.c
index 061eca5..4e35df4 100644
--- a/db/dquot.c
+++ b/db/dquot.c
@@ -171,6 +171,17 @@ dquot_f(
 }
 
 void
+xfs_dquot_set_crc(
+	struct xfs_buf *bp)
+{
+	ASSERT((iocur_top->dquot_buf));
+	ASSERT(iocur_top->bp == bp);
+
+	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
+			 XFS_DQUOT_CRC_OFF);
+}
+
+void
 dquot_init(void)
 {
 	add_command(&dquot_cmd);
diff --git a/db/dquot.h b/db/dquot.h
index 83a5118..12a7244 100644
--- a/db/dquot.h
+++ b/db/dquot.h
@@ -20,4 +20,5 @@ extern const struct field	disk_dquot_flds[];
 extern const struct field	dqblk_flds[];
 extern const struct field	dqblk_hfld[];
 
+extern void	xfs_dquot_set_crc(struct xfs_buf *);
 extern void	dquot_init(void);
diff --git a/db/fuzz.c b/db/fuzz.c
index e1c2045..a9b1577 100644
--- a/db/fuzz.c
+++ b/db/fuzz.c
@@ -125,8 +125,7 @@ fuzz_f(
 		return 0;
 	}
 
-	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
-			!iocur_top->ino_buf && !iocur_top->dquot_buf) {
+	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) {
 		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
 		return 0;
 	}
@@ -153,12 +152,6 @@ fuzz_f(
 	if (corrupt) {
 		local_ops.verify_write = xfs_dummy_verify;
 		dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n"));
-	} else if (iocur_top->ino_buf) {
-		local_ops.verify_write = xfs_verify_recalc_inode_crc;
-		dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n"));
-	} else if (iocur_top->dquot_buf) {
-		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
-		dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n"));
 	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
 		local_ops.verify_write = iocur_top->typ->set_crc;
 		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
diff --git a/db/inode.c b/db/inode.c
index 6cc47d6..6f971c6 100644
--- a/db/inode.c
+++ b/db/inode.c
@@ -711,3 +711,14 @@ _("Metadata CRC error detected for ino %lld\n"),
 	/* track updated info in ring */
 	ring_add();
 }
+
+void
+xfs_inode_set_crc(
+	struct xfs_buf *bp)
+{
+	ASSERT(iocur_top->ino_buf);
+	ASSERT(iocur_top->bp == bp);
+
+	libxfs_dinode_calc_crc(mp, iocur_top->data);
+	iocur_top->ino_crc_ok = 1;
+}
diff --git a/db/inode.h b/db/inode.h
index 1624f1d..d79b0a4 100644
--- a/db/inode.h
+++ b/db/inode.h
@@ -33,4 +33,5 @@ extern void	inode_init(void);
 extern typnm_t	inode_next_type(void);
 extern int	inode_size(void *obj, int startoff, int idx);
 extern int	inode_u_size(void *obj, int startoff, int idx);
+extern void	xfs_inode_set_crc(struct xfs_buf *);
 extern void	set_cur_inode(xfs_ino_t ino);
diff --git a/db/io.c b/db/io.c
index fd9b9f4..9787dea 100644
--- a/db/io.c
+++ b/db/io.c
@@ -466,28 +466,6 @@ xfs_dummy_verify(
 }
 
 void
-xfs_verify_recalc_inode_crc(
-	struct xfs_buf *bp)
-{
-	ASSERT(iocur_top->ino_buf);
-	ASSERT(iocur_top->bp == bp);
-
-	libxfs_dinode_calc_crc(mp, iocur_top->data);
-	iocur_top->ino_crc_ok = 1;
-}
-
-void
-xfs_verify_recalc_dquot_crc(
-	struct xfs_buf *bp)
-{
-	ASSERT((iocur_top->dquot_buf));
-	ASSERT(iocur_top->bp == bp);
-
-	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
-			 XFS_DQUOT_CRC_OFF);
-}
-
-void
 xfs_verify_recalc_crc(
 	struct xfs_buf *bp)
 {
diff --git a/db/io.h b/db/io.h
index df0fdd7..374dd84 100644
--- a/db/io.h
+++ b/db/io.h
@@ -64,8 +64,6 @@ extern void	set_cur(const struct typ *type, xfs_daddr_t blknum,
 extern void     ring_add(void);
 extern void	set_iocur_type(const struct typ *type);
 extern void	xfs_dummy_verify(struct xfs_buf *bp);
-extern void	xfs_verify_recalc_inode_crc(struct xfs_buf *bp);
-extern void	xfs_verify_recalc_dquot_crc(struct xfs_buf *bp);
 extern void	xfs_verify_recalc_crc(struct xfs_buf *bp);
 
 /*
diff --git a/db/type.c b/db/type.c
index 740adc0..00f580a 100644
--- a/db/type.c
+++ b/db/type.c
@@ -105,12 +105,12 @@ static const typ_t	__typtab_crc[] = {
 	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
 		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
 	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
-		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
 	{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
 		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
 	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
-		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
 	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
@@ -149,12 +149,12 @@ static const typ_t	__typtab_spcrc[] = {
 	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
 		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
 	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
-		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
 	{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,
 		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
 	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
-		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
 	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
diff --git a/db/write.c b/db/write.c
index 266bde4..8f8a6f7 100644
--- a/db/write.c
+++ b/db/write.c
@@ -167,12 +167,6 @@ write_f(
 	if (corrupt) {
 		local_ops.verify_write = xfs_dummy_verify;
 		dbprintf(_("Allowing write of corrupted data and bad CRC\n"));
-	} else if (iocur_top->ino_buf) {
-		local_ops.verify_write = xfs_verify_recalc_inode_crc;
-		dbprintf(_("Allowing write of corrupted inode with good CRC\n"));
-	} else if (iocur_top->dquot_buf) {
-		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
-		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
 	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
 		local_ops.verify_write = iocur_top->typ->set_crc;
 		dbprintf(_("Allowing write of corrupted data with good CRC\n"));



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots
  2017-08-03 16:47   ` [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Eric Sandeen
@ 2017-08-03 16:58     ` Darrick J. Wong
  2017-08-03 17:15     ` [PATCH 8/7 V2] " Eric Sandeen
  1 sibling, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-03 16:58 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: sandeen, linux-xfs

On Thu, Aug 03, 2017 at 11:47:24AM -0500, Eric Sandeen wrote:
> Now that typ_t has a ->set_crc method, use it for inodes & dquots
> as well, rather than recognizing them as special types and calling
> their crc functions directly by name.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>

Looks fine,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

> ---
> 
> diff --git a/db/dquot.c b/db/dquot.c
> index 061eca5..4e35df4 100644
> --- a/db/dquot.c
> +++ b/db/dquot.c
> @@ -171,6 +171,17 @@ dquot_f(
>  }
>  
>  void
> +xfs_dquot_set_crc(
> +	struct xfs_buf *bp)
> +{
> +	ASSERT((iocur_top->dquot_buf));
> +	ASSERT(iocur_top->bp == bp);
> +
> +	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
> +			 XFS_DQUOT_CRC_OFF);
> +}
> +
> +void
>  dquot_init(void)
>  {
>  	add_command(&dquot_cmd);
> diff --git a/db/dquot.h b/db/dquot.h
> index 83a5118..12a7244 100644
> --- a/db/dquot.h
> +++ b/db/dquot.h
> @@ -20,4 +20,5 @@ extern const struct field	disk_dquot_flds[];
>  extern const struct field	dqblk_flds[];
>  extern const struct field	dqblk_hfld[];
>  
> +extern void	xfs_dquot_set_crc(struct xfs_buf *);
>  extern void	dquot_init(void);
> diff --git a/db/fuzz.c b/db/fuzz.c
> index e1c2045..a9b1577 100644
> --- a/db/fuzz.c
> +++ b/db/fuzz.c
> @@ -125,8 +125,7 @@ fuzz_f(
>  		return 0;
>  	}
>  
> -	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
> -			!iocur_top->ino_buf && !iocur_top->dquot_buf) {
> +	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) {
>  		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
>  		return 0;
>  	}
> @@ -153,12 +152,6 @@ fuzz_f(
>  	if (corrupt) {
>  		local_ops.verify_write = xfs_dummy_verify;
>  		dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n"));
> -	} else if (iocur_top->ino_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_inode_crc;
> -		dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n"));
> -	} else if (iocur_top->dquot_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
> -		dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n"));
>  	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
>  		local_ops.verify_write = iocur_top->typ->set_crc;
>  		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
> diff --git a/db/inode.c b/db/inode.c
> index 6cc47d6..6f971c6 100644
> --- a/db/inode.c
> +++ b/db/inode.c
> @@ -711,3 +711,14 @@ _("Metadata CRC error detected for ino %lld\n"),
>  	/* track updated info in ring */
>  	ring_add();
>  }
> +
> +void
> +xfs_inode_set_crc(
> +	struct xfs_buf *bp)
> +{
> +	ASSERT(iocur_top->ino_buf);
> +	ASSERT(iocur_top->bp == bp);
> +
> +	libxfs_dinode_calc_crc(mp, iocur_top->data);
> +	iocur_top->ino_crc_ok = 1;
> +}
> diff --git a/db/inode.h b/db/inode.h
> index 1624f1d..d79b0a4 100644
> --- a/db/inode.h
> +++ b/db/inode.h
> @@ -33,4 +33,5 @@ extern void	inode_init(void);
>  extern typnm_t	inode_next_type(void);
>  extern int	inode_size(void *obj, int startoff, int idx);
>  extern int	inode_u_size(void *obj, int startoff, int idx);
> +extern void	xfs_inode_set_crc(struct xfs_buf *);
>  extern void	set_cur_inode(xfs_ino_t ino);
> diff --git a/db/io.c b/db/io.c
> index fd9b9f4..9787dea 100644
> --- a/db/io.c
> +++ b/db/io.c
> @@ -466,28 +466,6 @@ xfs_dummy_verify(
>  }
>  
>  void
> -xfs_verify_recalc_inode_crc(
> -	struct xfs_buf *bp)
> -{
> -	ASSERT(iocur_top->ino_buf);
> -	ASSERT(iocur_top->bp == bp);
> -
> -	libxfs_dinode_calc_crc(mp, iocur_top->data);
> -	iocur_top->ino_crc_ok = 1;
> -}
> -
> -void
> -xfs_verify_recalc_dquot_crc(
> -	struct xfs_buf *bp)
> -{
> -	ASSERT((iocur_top->dquot_buf));
> -	ASSERT(iocur_top->bp == bp);
> -
> -	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
> -			 XFS_DQUOT_CRC_OFF);
> -}
> -
> -void
>  xfs_verify_recalc_crc(
>  	struct xfs_buf *bp)
>  {
> diff --git a/db/io.h b/db/io.h
> index df0fdd7..374dd84 100644
> --- a/db/io.h
> +++ b/db/io.h
> @@ -64,8 +64,6 @@ extern void	set_cur(const struct typ *type, xfs_daddr_t blknum,
>  extern void     ring_add(void);
>  extern void	set_iocur_type(const struct typ *type);
>  extern void	xfs_dummy_verify(struct xfs_buf *bp);
> -extern void	xfs_verify_recalc_inode_crc(struct xfs_buf *bp);
> -extern void	xfs_verify_recalc_dquot_crc(struct xfs_buf *bp);
>  extern void	xfs_verify_recalc_crc(struct xfs_buf *bp);
>  
>  /*
> diff --git a/db/type.c b/db/type.c
> index 740adc0..00f580a 100644
> --- a/db/type.c
> +++ b/db/type.c
> @@ -105,12 +105,12 @@ static const typ_t	__typtab_crc[] = {
>  	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
>  		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
>  	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
> -		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
>  	{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
>  		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
>  	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
> -		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
>  	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
> @@ -149,12 +149,12 @@ static const typ_t	__typtab_spcrc[] = {
>  	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
>  		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
>  	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
> -		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
>  	{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,
>  		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
>  	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
> -		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
>  	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
> diff --git a/db/write.c b/db/write.c
> index 266bde4..8f8a6f7 100644
> --- a/db/write.c
> +++ b/db/write.c
> @@ -167,12 +167,6 @@ write_f(
>  	if (corrupt) {
>  		local_ops.verify_write = xfs_dummy_verify;
>  		dbprintf(_("Allowing write of corrupted data and bad CRC\n"));
> -	} else if (iocur_top->ino_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_inode_crc;
> -		dbprintf(_("Allowing write of corrupted inode with good CRC\n"));
> -	} else if (iocur_top->dquot_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
> -		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
>  	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
>  		local_ops.verify_write = iocur_top->typ->set_crc;
>  		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor
  2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
                   ` (6 preceding siblings ...)
  2017-07-31 21:07 ` [PATCH 7/7] xfs_db: introduce fuzz command Darrick J. Wong
@ 2017-08-03 17:04 ` Darrick J. Wong
  2017-08-03 17:18   ` Eric Sandeen
  7 siblings, 1 reply; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-03 17:04 UTC (permalink / raw)
  To: sandeen; +Cc: linux-xfs

We can call the cursor push and pop functions directly from btdump,
so skip all the eval overhead.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 db/btdump.c |   50 +++++++++++++++-----------------------------------
 db/io.c     |   22 ++++++++++++++--------
 db/io.h     |    1 +
 3 files changed, 30 insertions(+), 43 deletions(-)

diff --git a/db/btdump.c b/db/btdump.c
index f525a4a..59c5712 100644
--- a/db/btdump.c
+++ b/db/btdump.c
@@ -82,11 +82,9 @@ dump_btlevel(
 	xfs_daddr_t		orig_daddr = iocur_top->bb;
 	xfs_daddr_t		last_daddr;
 	unsigned int		nr;
-	int			ret;
+	int			ret = 0;
 
-	ret = eval("push");
-	if (ret)
-		return ret;
+	push_cur_and_set_type();
 
 	nr = 1;
 	do {
@@ -111,10 +109,8 @@ dump_btlevel(
 		nr++;
 	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
 
-	ret = eval("pop");
-	return ret;
 err:
-	eval("pop");
+	pop_cur();
 	return ret;
 }
 
@@ -126,11 +122,9 @@ dump_btree(
 	xfs_daddr_t	orig_daddr = iocur_top->bb;
 	xfs_daddr_t	last_daddr;
 	int		level;
-	int		ret;
+	int		ret = 0;
 
-	ret = eval("push");
-	if (ret)
-		return ret;
+	push_cur_and_set_type();
 
 	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
 	level = xfs_btree_get_level(iocur_top->data);
@@ -153,10 +147,8 @@ dump_btree(
 		 iocur_top->bb != orig_daddr &&
 		 iocur_top->bb != last_daddr);
 
-	ret = eval("pop");
-	return ret;
 err:
-	eval("pop");
+	pop_cur();
 	return ret;
 }
 
@@ -177,7 +169,7 @@ dump_inode(
 {
 	char			*prefix;
 	struct xfs_dinode	*dip;
-	int			ret;
+	int			ret = 0;
 
 	if (attrfork)
 		prefix = "a.bmbt";
@@ -201,9 +193,7 @@ dump_inode(
 		}
 	}
 
-	ret = eval("push");
-	if (ret)
-		return ret;
+	push_cur_and_set_type();
 
 	if (dump_node_blocks) {
 		ret = eval("print %s.keys", prefix);
@@ -222,10 +212,8 @@ dump_inode(
 	if (ret)
 		goto err;
 
-	ret = eval("pop");
-	return ret;
 err:
-	eval("pop");
+	pop_cur();
 	return ret;
 }
 
@@ -397,11 +385,9 @@ dump_dablevel(
 	xfs_daddr_t		orig_daddr = iocur_top->bb;
 	xfs_daddr_t		last_daddr;
 	unsigned int		nr;
-	int			ret;
+	int			ret = 0;
 
-	ret = eval("push");
-	if (ret)
-		return ret;
+	push_cur_and_set_type();
 
 	nr = 1;
 	do {
@@ -421,10 +407,8 @@ dump_dablevel(
 		nr++;
 	} while (iocur_top->bb != orig_daddr && iocur_top->bb != last_daddr);
 
-	ret = eval("pop");
-	return ret;
 err:
-	eval("pop");
+	pop_cur();
 	return ret;
 }
 
@@ -436,11 +420,9 @@ dump_dabtree(
 	xfs_daddr_t			orig_daddr = iocur_top->bb;
 	xfs_daddr_t			last_daddr;
 	int				level;
-	int				ret;
+	int				ret = 0;
 
-	ret = eval("push");
-	if (ret)
-		return ret;
+	push_cur_and_set_type();
 
 	cur_agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb));
 	level = dbp->level(iocur_top->data);
@@ -468,10 +450,8 @@ dump_dabtree(
 		 iocur_top->bb != orig_daddr &&
 		 iocur_top->bb != last_daddr);
 
-	ret = eval("pop");
-	return ret;
 err:
-	eval("pop");
+	pop_cur();
 	return ret;
 }
 
diff --git a/db/io.c b/db/io.c
index fd9b9f4..0974fee 100644
--- a/db/io.c
+++ b/db/io.c
@@ -220,6 +220,19 @@ push_cur(void)
 	cur_typ = NULL;
 }
 
+void
+push_cur_and_set_type(void)
+{
+	/* save current state */
+	push_cur();
+	if (iocur_top[-1].typ && iocur_top[-1].typ->typnm == TYP_INODE)
+		set_cur_inode(iocur_top[-1].ino);
+	else
+		set_cur(iocur_top[-1].typ, iocur_top[-1].bb,
+			iocur_top[-1].blen, DB_RING_IGN,
+			iocur_top[-1].bbmap);
+}
+
 static int
 push_f(
 	int		argc,
@@ -240,14 +253,7 @@ push_f(
 		}
 	}
 
-	/* save current state */
-	push_cur();
-	if (iocur_top[-1].typ && iocur_top[-1].typ->typnm == TYP_INODE)
-		set_cur_inode(iocur_top[-1].ino);
-	else
-		set_cur(iocur_top[-1].typ, iocur_top[-1].bb,
-			iocur_top[-1].blen, DB_RING_IGN,
-			iocur_top[-1].bbmap);
+	push_cur_and_set_type();
 
 	/* run requested command */
 	if (argc>1)
diff --git a/db/io.h b/db/io.h
index df0fdd7..d238685 100644
--- a/db/io.h
+++ b/db/io.h
@@ -57,6 +57,7 @@ extern void	off_cur(int off, int len);
 extern void	pop_cur(void);
 extern void	print_iocur(char *tag, iocur_t *ioc);
 extern void	push_cur(void);
+extern void	push_cur_and_set_type(void);
 extern int	read_buf(int64_t daddr, int count, void *bufp);
 extern void     write_cur(void);
 extern void	set_cur(const struct typ *type, xfs_daddr_t blknum,

^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 8/7 V2] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots
  2017-08-03 16:47   ` [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Eric Sandeen
  2017-08-03 16:58     ` Darrick J. Wong
@ 2017-08-03 17:15     ` Eric Sandeen
  2017-08-03 18:05       ` Darrick J. Wong
  1 sibling, 1 reply; 38+ messages in thread
From: Eric Sandeen @ 2017-08-03 17:15 UTC (permalink / raw)
  To: Eric Sandeen, Darrick J. Wong; +Cc: linux-xfs

Now that typ_t has a ->set_crc method, use it for inodes & dquots
as well, rather than recognizing them as special types and calling
their crc functions directly by name.

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

V2: Remove one more buf type special case in write_f(), and call crc
writer helpers rather than open coded versions in write_cur()

diff --git a/db/dquot.c b/db/dquot.c
index 061eca5..4e35df4 100644
--- a/db/dquot.c
+++ b/db/dquot.c
@@ -171,6 +171,17 @@ dquot_f(
 }
 
 void
+xfs_dquot_set_crc(
+	struct xfs_buf *bp)
+{
+	ASSERT((iocur_top->dquot_buf));
+	ASSERT(iocur_top->bp == bp);
+
+	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
+			 XFS_DQUOT_CRC_OFF);
+}
+
+void
 dquot_init(void)
 {
 	add_command(&dquot_cmd);
diff --git a/db/dquot.h b/db/dquot.h
index 83a5118..12a7244 100644
--- a/db/dquot.h
+++ b/db/dquot.h
@@ -20,4 +20,5 @@ extern const struct field	disk_dquot_flds[];
 extern const struct field	dqblk_flds[];
 extern const struct field	dqblk_hfld[];
 
+extern void	xfs_dquot_set_crc(struct xfs_buf *);
 extern void	dquot_init(void);
diff --git a/db/fuzz.c b/db/fuzz.c
index e1c2045..a9b1577 100644
--- a/db/fuzz.c
+++ b/db/fuzz.c
@@ -125,8 +125,7 @@ fuzz_f(
 		return 0;
 	}
 
-	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
-			!iocur_top->ino_buf && !iocur_top->dquot_buf) {
+	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) {
 		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
 		return 0;
 	}
@@ -153,12 +152,6 @@ fuzz_f(
 	if (corrupt) {
 		local_ops.verify_write = xfs_dummy_verify;
 		dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n"));
-	} else if (iocur_top->ino_buf) {
-		local_ops.verify_write = xfs_verify_recalc_inode_crc;
-		dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n"));
-	} else if (iocur_top->dquot_buf) {
-		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
-		dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n"));
 	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
 		local_ops.verify_write = iocur_top->typ->set_crc;
 		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
diff --git a/db/inode.c b/db/inode.c
index 6cc47d6..6f971c6 100644
--- a/db/inode.c
+++ b/db/inode.c
@@ -711,3 +711,14 @@ _("Metadata CRC error detected for ino %lld\n"),
 	/* track updated info in ring */
 	ring_add();
 }
+
+void
+xfs_inode_set_crc(
+	struct xfs_buf *bp)
+{
+	ASSERT(iocur_top->ino_buf);
+	ASSERT(iocur_top->bp == bp);
+
+	libxfs_dinode_calc_crc(mp, iocur_top->data);
+	iocur_top->ino_crc_ok = 1;
+}
diff --git a/db/inode.h b/db/inode.h
index 1624f1d..d79b0a4 100644
--- a/db/inode.h
+++ b/db/inode.h
@@ -33,4 +33,5 @@ extern void	inode_init(void);
 extern typnm_t	inode_next_type(void);
 extern int	inode_size(void *obj, int startoff, int idx);
 extern int	inode_u_size(void *obj, int startoff, int idx);
+extern void	xfs_inode_set_crc(struct xfs_buf *);
 extern void	set_cur_inode(xfs_ino_t ino);
diff --git a/db/io.c b/db/io.c
index fd9b9f4..2716255 100644
--- a/db/io.c
+++ b/db/io.c
@@ -22,6 +22,7 @@
 #include "faddr.h"
 #include "fprint.h"
 #include "field.h"
+#include "dquot.h"
 #include "inode.h"
 #include "io.h"
 #include "output.h"
@@ -466,28 +467,6 @@ xfs_dummy_verify(
 }
 
 void
-xfs_verify_recalc_inode_crc(
-	struct xfs_buf *bp)
-{
-	ASSERT(iocur_top->ino_buf);
-	ASSERT(iocur_top->bp == bp);
-
-	libxfs_dinode_calc_crc(mp, iocur_top->data);
-	iocur_top->ino_crc_ok = 1;
-}
-
-void
-xfs_verify_recalc_dquot_crc(
-	struct xfs_buf *bp)
-{
-	ASSERT((iocur_top->dquot_buf));
-	ASSERT(iocur_top->bp == bp);
-
-	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
-			 XFS_DQUOT_CRC_OFF);
-}
-
-void
 xfs_verify_recalc_crc(
 	struct xfs_buf *bp)
 {
@@ -510,14 +489,10 @@ write_cur(void)
 		skip_crc = true;
 
 	if (!skip_crc) {
-		if (iocur_top->ino_buf) {
-			libxfs_dinode_calc_crc(mp, iocur_top->data);
-			iocur_top->ino_crc_ok = 1;
-		} else if (iocur_top->dquot_buf) {
-			xfs_update_cksum(iocur_top->data,
-					 sizeof(struct xfs_dqblk),
-					 XFS_DQUOT_CRC_OFF);
-		}
+		if (iocur_top->ino_buf)
+			xfs_inode_set_crc(iocur_top->bp);
+		else if (iocur_top->dquot_buf)
+			xfs_dquot_set_crc(iocur_top->bp);
 	}
 	if (iocur_top->bbmap)
 		write_cur_bbs();
diff --git a/db/io.h b/db/io.h
index df0fdd7..374dd84 100644
--- a/db/io.h
+++ b/db/io.h
@@ -64,8 +64,6 @@ extern void	set_cur(const struct typ *type, xfs_daddr_t blknum,
 extern void     ring_add(void);
 extern void	set_iocur_type(const struct typ *type);
 extern void	xfs_dummy_verify(struct xfs_buf *bp);
-extern void	xfs_verify_recalc_inode_crc(struct xfs_buf *bp);
-extern void	xfs_verify_recalc_dquot_crc(struct xfs_buf *bp);
 extern void	xfs_verify_recalc_crc(struct xfs_buf *bp);
 
 /*
diff --git a/db/type.c b/db/type.c
index 740adc0..0c1ed37 100644
--- a/db/type.c
+++ b/db/type.c
@@ -105,12 +105,12 @@ static const typ_t	__typtab_crc[] = {
 	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
 		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
 	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
-		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
 	{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
 		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
 	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
-		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
 	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
@@ -149,12 +149,12 @@ static const typ_t	__typtab_spcrc[] = {
 	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
 		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
 	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
-		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
 	{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,
 		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
 	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
-		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
+		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
 	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
 	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
diff --git a/db/write.c b/db/write.c
index 266bde4..9fc6d8e 100644
--- a/db/write.c
+++ b/db/write.c
@@ -138,9 +138,7 @@ write_f(
 	}
 
 	if (invalid_data &&
-	    iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
-	    !iocur_top->ino_buf &&
-	    !iocur_top->dquot_buf) {
+	    iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) {
 		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
 		return 0;
 	}
@@ -167,12 +165,6 @@ write_f(
 	if (corrupt) {
 		local_ops.verify_write = xfs_dummy_verify;
 		dbprintf(_("Allowing write of corrupted data and bad CRC\n"));
-	} else if (iocur_top->ino_buf) {
-		local_ops.verify_write = xfs_verify_recalc_inode_crc;
-		dbprintf(_("Allowing write of corrupted inode with good CRC\n"));
-	} else if (iocur_top->dquot_buf) {
-		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
-		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
 	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
 		local_ops.verify_write = iocur_top->typ->set_crc;
 		dbprintf(_("Allowing write of corrupted data with good CRC\n"));


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor
  2017-08-03 17:04 ` [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor Darrick J. Wong
@ 2017-08-03 17:18   ` Eric Sandeen
  0 siblings, 0 replies; 38+ messages in thread
From: Eric Sandeen @ 2017-08-03 17:18 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On 8/3/17 12:04 PM, Darrick J. Wong wrote:
> We can call the cursor push and pop functions directly from btdump,
> so skip all the eval overhead.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Thanks.

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


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 8/7 V2] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots
  2017-08-03 17:15     ` [PATCH 8/7 V2] " Eric Sandeen
@ 2017-08-03 18:05       ` Darrick J. Wong
  0 siblings, 0 replies; 38+ messages in thread
From: Darrick J. Wong @ 2017-08-03 18:05 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs

On Thu, Aug 03, 2017 at 12:15:26PM -0500, Eric Sandeen wrote:
> Now that typ_t has a ->set_crc method, use it for inodes & dquots
> as well, rather than recognizing them as special types and calling
> their crc functions directly by name.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

> ---
> 
> V2: Remove one more buf type special case in write_f(), and call crc
> writer helpers rather than open coded versions in write_cur()
> 
> diff --git a/db/dquot.c b/db/dquot.c
> index 061eca5..4e35df4 100644
> --- a/db/dquot.c
> +++ b/db/dquot.c
> @@ -171,6 +171,17 @@ dquot_f(
>  }
>  
>  void
> +xfs_dquot_set_crc(
> +	struct xfs_buf *bp)
> +{
> +	ASSERT((iocur_top->dquot_buf));
> +	ASSERT(iocur_top->bp == bp);
> +
> +	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
> +			 XFS_DQUOT_CRC_OFF);
> +}
> +
> +void
>  dquot_init(void)
>  {
>  	add_command(&dquot_cmd);
> diff --git a/db/dquot.h b/db/dquot.h
> index 83a5118..12a7244 100644
> --- a/db/dquot.h
> +++ b/db/dquot.h
> @@ -20,4 +20,5 @@ extern const struct field	disk_dquot_flds[];
>  extern const struct field	dqblk_flds[];
>  extern const struct field	dqblk_hfld[];
>  
> +extern void	xfs_dquot_set_crc(struct xfs_buf *);
>  extern void	dquot_init(void);
> diff --git a/db/fuzz.c b/db/fuzz.c
> index e1c2045..a9b1577 100644
> --- a/db/fuzz.c
> +++ b/db/fuzz.c
> @@ -125,8 +125,7 @@ fuzz_f(
>  		return 0;
>  	}
>  
> -	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
> -			!iocur_top->ino_buf && !iocur_top->dquot_buf) {
> +	if (invalid_data && iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) {
>  		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
>  		return 0;
>  	}
> @@ -153,12 +152,6 @@ fuzz_f(
>  	if (corrupt) {
>  		local_ops.verify_write = xfs_dummy_verify;
>  		dbprintf(_("Allowing fuzz of corrupted data and bad CRC\n"));
> -	} else if (iocur_top->ino_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_inode_crc;
> -		dbprintf(_("Allowing fuzz of corrupted inode with good CRC\n"));
> -	} else if (iocur_top->dquot_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
> -		dbprintf(_("Allowing fuzz of corrupted dquot with good CRC\n"));
>  	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
>  		local_ops.verify_write = iocur_top->typ->set_crc;
>  		dbprintf(_("Allowing fuzz of corrupted data with good CRC\n"));
> diff --git a/db/inode.c b/db/inode.c
> index 6cc47d6..6f971c6 100644
> --- a/db/inode.c
> +++ b/db/inode.c
> @@ -711,3 +711,14 @@ _("Metadata CRC error detected for ino %lld\n"),
>  	/* track updated info in ring */
>  	ring_add();
>  }
> +
> +void
> +xfs_inode_set_crc(
> +	struct xfs_buf *bp)
> +{
> +	ASSERT(iocur_top->ino_buf);
> +	ASSERT(iocur_top->bp == bp);
> +
> +	libxfs_dinode_calc_crc(mp, iocur_top->data);
> +	iocur_top->ino_crc_ok = 1;
> +}
> diff --git a/db/inode.h b/db/inode.h
> index 1624f1d..d79b0a4 100644
> --- a/db/inode.h
> +++ b/db/inode.h
> @@ -33,4 +33,5 @@ extern void	inode_init(void);
>  extern typnm_t	inode_next_type(void);
>  extern int	inode_size(void *obj, int startoff, int idx);
>  extern int	inode_u_size(void *obj, int startoff, int idx);
> +extern void	xfs_inode_set_crc(struct xfs_buf *);
>  extern void	set_cur_inode(xfs_ino_t ino);
> diff --git a/db/io.c b/db/io.c
> index fd9b9f4..2716255 100644
> --- a/db/io.c
> +++ b/db/io.c
> @@ -22,6 +22,7 @@
>  #include "faddr.h"
>  #include "fprint.h"
>  #include "field.h"
> +#include "dquot.h"
>  #include "inode.h"
>  #include "io.h"
>  #include "output.h"
> @@ -466,28 +467,6 @@ xfs_dummy_verify(
>  }
>  
>  void
> -xfs_verify_recalc_inode_crc(
> -	struct xfs_buf *bp)
> -{
> -	ASSERT(iocur_top->ino_buf);
> -	ASSERT(iocur_top->bp == bp);
> -
> -	libxfs_dinode_calc_crc(mp, iocur_top->data);
> -	iocur_top->ino_crc_ok = 1;
> -}
> -
> -void
> -xfs_verify_recalc_dquot_crc(
> -	struct xfs_buf *bp)
> -{
> -	ASSERT((iocur_top->dquot_buf));
> -	ASSERT(iocur_top->bp == bp);
> -
> -	xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
> -			 XFS_DQUOT_CRC_OFF);
> -}
> -
> -void
>  xfs_verify_recalc_crc(
>  	struct xfs_buf *bp)
>  {
> @@ -510,14 +489,10 @@ write_cur(void)
>  		skip_crc = true;
>  
>  	if (!skip_crc) {
> -		if (iocur_top->ino_buf) {
> -			libxfs_dinode_calc_crc(mp, iocur_top->data);
> -			iocur_top->ino_crc_ok = 1;
> -		} else if (iocur_top->dquot_buf) {
> -			xfs_update_cksum(iocur_top->data,
> -					 sizeof(struct xfs_dqblk),
> -					 XFS_DQUOT_CRC_OFF);
> -		}
> +		if (iocur_top->ino_buf)
> +			xfs_inode_set_crc(iocur_top->bp);
> +		else if (iocur_top->dquot_buf)
> +			xfs_dquot_set_crc(iocur_top->bp);
>  	}
>  	if (iocur_top->bbmap)
>  		write_cur_bbs();
> diff --git a/db/io.h b/db/io.h
> index df0fdd7..374dd84 100644
> --- a/db/io.h
> +++ b/db/io.h
> @@ -64,8 +64,6 @@ extern void	set_cur(const struct typ *type, xfs_daddr_t blknum,
>  extern void     ring_add(void);
>  extern void	set_iocur_type(const struct typ *type);
>  extern void	xfs_dummy_verify(struct xfs_buf *bp);
> -extern void	xfs_verify_recalc_inode_crc(struct xfs_buf *bp);
> -extern void	xfs_verify_recalc_dquot_crc(struct xfs_buf *bp);
>  extern void	xfs_verify_recalc_crc(struct xfs_buf *bp);
>  
>  /*
> diff --git a/db/type.c b/db/type.c
> index 740adc0..0c1ed37 100644
> --- a/db/type.c
> +++ b/db/type.c
> @@ -105,12 +105,12 @@ static const typ_t	__typtab_crc[] = {
>  	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
>  		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
>  	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
> -		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
>  	{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
>  		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
>  	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
> -		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
>  	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
> @@ -149,12 +149,12 @@ static const typ_t	__typtab_spcrc[] = {
>  	{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
>  		&xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
>  	{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
> -		&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_dquot_buf_ops, TYP_F_CRC_FUNC, xfs_dquot_set_crc },
>  	{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,
>  		&xfs_inobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
>  	{ TYP_INODATA, "inodata", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_INODE, "inode", handle_struct, inode_crc_hfld,
> -		&xfs_inode_buf_ops, TYP_F_NO_CRC_OFF },
> +		&xfs_inode_buf_ops, TYP_F_CRC_FUNC, xfs_inode_set_crc },
>  	{ TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
>  	{ TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
> diff --git a/db/write.c b/db/write.c
> index 266bde4..9fc6d8e 100644
> --- a/db/write.c
> +++ b/db/write.c
> @@ -138,9 +138,7 @@ write_f(
>  	}
>  
>  	if (invalid_data &&
> -	    iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF &&
> -	    !iocur_top->ino_buf &&
> -	    !iocur_top->dquot_buf) {
> +	    iocur_top->typ->crc_off == TYP_F_NO_CRC_OFF) {
>  		dbprintf(_("Cannot recalculate CRCs on this type of object\n"));
>  		return 0;
>  	}
> @@ -167,12 +165,6 @@ write_f(
>  	if (corrupt) {
>  		local_ops.verify_write = xfs_dummy_verify;
>  		dbprintf(_("Allowing write of corrupted data and bad CRC\n"));
> -	} else if (iocur_top->ino_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_inode_crc;
> -		dbprintf(_("Allowing write of corrupted inode with good CRC\n"));
> -	} else if (iocur_top->dquot_buf) {
> -		local_ops.verify_write = xfs_verify_recalc_dquot_crc;
> -		dbprintf(_("Allowing write of corrupted dquot with good CRC\n"));
>  	} else if (iocur_top->typ->crc_off == TYP_F_CRC_FUNC) {
>  		local_ops.verify_write = iocur_top->typ->set_crc;
>  		dbprintf(_("Allowing write of corrupted data with good CRC\n"));
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2017-08-03 18:05 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
2017-07-31 21:23   ` Eric Sandeen
2017-07-31 21:25     ` Darrick J. Wong
2017-08-02  9:13   ` Carlos Maiolino
2017-08-02 16:01     ` Darrick J. Wong
2017-07-31 21:07 ` [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN Darrick J. Wong
2017-07-31 21:42   ` Eric Sandeen
2017-08-02  9:14   ` Carlos Maiolino
2017-07-31 21:07 ` [PATCH 3/7] xfs_db: fix metadump redirection (again) Darrick J. Wong
2017-07-31 21:57   ` Eric Sandeen
2017-08-01 16:23   ` [PATCH v2 " Darrick J. Wong
2017-08-02  9:17     ` Carlos Maiolino
2017-07-31 21:07 ` [PATCH 4/7] xfs_db: dump dir/attr btrees Darrick J. Wong
2017-07-31 22:05   ` Eric Sandeen
2017-08-01 14:59     ` Darrick J. Wong
2017-08-01 15:40   ` [PATCH v2 " Darrick J. Wong
2017-08-01 16:21     ` Eric Sandeen
2017-08-02  9:22     ` Carlos Maiolino
2017-08-02  9:24     ` Carlos Maiolino
2017-08-02 16:03       ` Darrick J. Wong
2017-07-31 21:07 ` [PATCH 5/7] xfs_db: print attribute remote value blocks Darrick J. Wong
2017-08-01 17:15   ` Eric Sandeen
2017-08-01 20:29     ` Darrick J. Wong
2017-08-01 21:04   ` [PATCH v2 " Darrick J. Wong
2017-08-02  9:36     ` Carlos Maiolino
2017-07-31 21:07 ` [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs Darrick J. Wong
2017-08-02  9:40   ` Carlos Maiolino
2017-08-03 16:02   ` Eric Sandeen
2017-08-03 16:40     ` Darrick J. Wong
2017-07-31 21:07 ` [PATCH 7/7] xfs_db: introduce fuzz command Darrick J. Wong
2017-08-02 11:06   ` Carlos Maiolino
2017-08-03 16:47   ` [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Eric Sandeen
2017-08-03 16:58     ` Darrick J. Wong
2017-08-03 17:15     ` [PATCH 8/7 V2] " Eric Sandeen
2017-08-03 18:05       ` Darrick J. Wong
2017-08-03 17:04 ` [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor Darrick J. Wong
2017-08-03 17:18   ` Eric Sandeen

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.