public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] xfs: miscellaneous bugfixes
@ 2016-01-23  0:34 Darrick J. Wong
  2016-01-23  0:34 ` [PATCH 1/3] xfs: use named array initializers for log item dumping Darrick J. Wong
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Darrick J. Wong @ 2016-01-23  0:34 UTC (permalink / raw)
  To: david, darrick.wong; +Cc: xfs

Hi all,

I'm pushing a pile of miscellaneous bugfixes for the kernel, xfsprogs,
xfstests, and xfsdocs.  None of these are rmap or reflink patches.
They've been compile-tested and run through xfstests on x86.

The biggest changes in these patches add structure size checking to
XFS and reorganize libxfs a bit so that xfs/122 (the userspace part
of structure size checking) will now pass with modern xfsprogs.

--D

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* [PATCH 1/3] xfs: use named array initializers for log item dumping
  2016-01-23  0:34 [PATCH 0/3] xfs: miscellaneous bugfixes Darrick J. Wong
@ 2016-01-23  0:34 ` Darrick J. Wong
  2016-01-27 13:31   ` Brian Foster
  2016-01-23  0:34 ` [PATCH 2/3] xfs: move struct xfs_attr_shortform to xfs_da_format.h Darrick J. Wong
  2016-01-23  0:34 ` [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time Darrick J. Wong
  2 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2016-01-23  0:34 UTC (permalink / raw)
  To: david, darrick.wong; +Cc: xfs

Use named array initializers for the string arrays used to dump log
items, rather than depending on the order being maintained correctly.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/xfs_log.c |  132 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 68 insertions(+), 64 deletions(-)


diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 2aa187e..4758f06 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1989,77 +1989,81 @@ xlog_print_tic_res(
 	uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t);
 
 	/* match with XLOG_REG_TYPE_* in xfs_log.h */
-	static char *res_type_str[XLOG_REG_TYPE_MAX] = {
-	    "bformat",
-	    "bchunk",
-	    "efi_format",
-	    "efd_format",
-	    "iformat",
-	    "icore",
-	    "iext",
-	    "ibroot",
-	    "ilocal",
-	    "iattr_ext",
-	    "iattr_broot",
-	    "iattr_local",
-	    "qformat",
-	    "dquot",
-	    "quotaoff",
-	    "LR header",
-	    "unmount",
-	    "commit",
-	    "trans header"
+#define REG_TYPE_STR(type, str)	[XLOG_REG_TYPE_##type] = str
+	static char *res_type_str[XLOG_REG_TYPE_MAX + 1] = {
+	    REG_TYPE_STR(BFORMAT, "bformat"),
+	    REG_TYPE_STR(BCHUNK, "bchunk"),
+	    REG_TYPE_STR(EFI_FORMAT, "efi_format"),
+	    REG_TYPE_STR(EFD_FORMAT, "efd_format"),
+	    REG_TYPE_STR(IFORMAT, "iformat"),
+	    REG_TYPE_STR(ICORE, "icore"),
+	    REG_TYPE_STR(IEXT, "iext"),
+	    REG_TYPE_STR(IBROOT, "ibroot"),
+	    REG_TYPE_STR(ILOCAL, "ilocal"),
+	    REG_TYPE_STR(IATTR_EXT, "iattr_ext"),
+	    REG_TYPE_STR(IATTR_BROOT, "iattr_broot"),
+	    REG_TYPE_STR(IATTR_LOCAL, "iattr_local"),
+	    REG_TYPE_STR(QFORMAT, "qformat"),
+	    REG_TYPE_STR(DQUOT, "dquot"),
+	    REG_TYPE_STR(QUOTAOFF, "quotaoff"),
+	    REG_TYPE_STR(LRHEADER, "LR header"),
+	    REG_TYPE_STR(UNMOUNT, "unmount"),
+	    REG_TYPE_STR(COMMIT, "commit"),
+	    REG_TYPE_STR(TRANSHDR, "trans header"),
+	    REG_TYPE_STR(ICREATE, "inode create")
 	};
+#undef REG_TYPE_STR
+#define TRANS_TYPE_STR(type)	[XFS_TRANS_##type] = #type
 	static char *trans_type_str[XFS_TRANS_TYPE_MAX] = {
-	    "SETATTR_NOT_SIZE",
-	    "SETATTR_SIZE",
-	    "INACTIVE",
-	    "CREATE",
-	    "CREATE_TRUNC",
-	    "TRUNCATE_FILE",
-	    "REMOVE",
-	    "LINK",
-	    "RENAME",
-	    "MKDIR",
-	    "RMDIR",
-	    "SYMLINK",
-	    "SET_DMATTRS",
-	    "GROWFS",
-	    "STRAT_WRITE",
-	    "DIOSTRAT",
-	    "WRITE_SYNC",
-	    "WRITEID",
-	    "ADDAFORK",
-	    "ATTRINVAL",
-	    "ATRUNCATE",
-	    "ATTR_SET",
-	    "ATTR_RM",
-	    "ATTR_FLAG",
-	    "CLEAR_AGI_BUCKET",
-	    "QM_SBCHANGE",
-	    "DUMMY1",
-	    "DUMMY2",
-	    "QM_QUOTAOFF",
-	    "QM_DQALLOC",
-	    "QM_SETQLIM",
-	    "QM_DQCLUSTER",
-	    "QM_QINOCREATE",
-	    "QM_QUOTAOFF_END",
-	    "FSYNC_TS",
-	    "GROWFSRT_ALLOC",
-	    "GROWFSRT_ZERO",
-	    "GROWFSRT_FREE",
-	    "SWAPEXT",
-	    "CHECKPOINT",
-	    "ICREATE",
-	    "CREATE_TMPFILE"
+	    TRANS_TYPE_STR(SETATTR_NOT_SIZE),
+	    TRANS_TYPE_STR(SETATTR_SIZE),
+	    TRANS_TYPE_STR(INACTIVE),
+	    TRANS_TYPE_STR(CREATE),
+	    TRANS_TYPE_STR(CREATE_TRUNC),
+	    TRANS_TYPE_STR(TRUNCATE_FILE),
+	    TRANS_TYPE_STR(REMOVE),
+	    TRANS_TYPE_STR(LINK),
+	    TRANS_TYPE_STR(RENAME),
+	    TRANS_TYPE_STR(MKDIR),
+	    TRANS_TYPE_STR(RMDIR),
+	    TRANS_TYPE_STR(SYMLINK),
+	    TRANS_TYPE_STR(SET_DMATTRS),
+	    TRANS_TYPE_STR(GROWFS),
+	    TRANS_TYPE_STR(STRAT_WRITE),
+	    TRANS_TYPE_STR(DIOSTRAT),
+	    TRANS_TYPE_STR(WRITEID),
+	    TRANS_TYPE_STR(ADDAFORK),
+	    TRANS_TYPE_STR(ATTRINVAL),
+	    TRANS_TYPE_STR(ATRUNCATE),
+	    TRANS_TYPE_STR(ATTR_SET),
+	    TRANS_TYPE_STR(ATTR_RM),
+	    TRANS_TYPE_STR(ATTR_FLAG),
+	    TRANS_TYPE_STR(CLEAR_AGI_BUCKET),
+	    TRANS_TYPE_STR(SB_CHANGE),
+	    TRANS_TYPE_STR(DUMMY1),
+	    TRANS_TYPE_STR(DUMMY2),
+	    TRANS_TYPE_STR(QM_QUOTAOFF),
+	    TRANS_TYPE_STR(QM_DQALLOC),
+	    TRANS_TYPE_STR(QM_SETQLIM),
+	    TRANS_TYPE_STR(QM_DQCLUSTER),
+	    TRANS_TYPE_STR(QM_QINOCREATE),
+	    TRANS_TYPE_STR(QM_QUOTAOFF_END),
+	    TRANS_TYPE_STR(FSYNC_TS),
+	    TRANS_TYPE_STR(GROWFSRT_ALLOC),
+	    TRANS_TYPE_STR(GROWFSRT_ZERO),
+	    TRANS_TYPE_STR(GROWFSRT_FREE),
+	    TRANS_TYPE_STR(SWAPEXT),
+	    TRANS_TYPE_STR(CHECKPOINT),
+	    TRANS_TYPE_STR(ICREATE),
+	    TRANS_TYPE_STR(CREATE_TMPFILE)
 	};
+#undef TRANS_TYPE_STR
 
 	xfs_warn(mp, "xlog_write: reservation summary:");
 	xfs_warn(mp, "  trans type  = %s (%u)",
 		 ((ticket->t_trans_type <= 0 ||
 		   ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ?
-		  "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]),
+		  "bad-trans-type" : trans_type_str[ticket->t_trans_type]),
 		 ticket->t_trans_type);
 	xfs_warn(mp, "  unit res    = %d bytes",
 		 ticket->t_unit_res);
@@ -2078,7 +2082,7 @@ xlog_print_tic_res(
 		uint r_type = ticket->t_res_arr[i].r_type;
 		xfs_warn(mp, "region[%u]: %s - %u bytes", i,
 			    ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
-			    "bad-rtype" : res_type_str[r_type-1]),
+			    "bad-rtype" : res_type_str[r_type]),
 			    ticket->t_res_arr[i].r_len);
 	}
 

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* [PATCH 2/3] xfs: move struct xfs_attr_shortform to xfs_da_format.h
  2016-01-23  0:34 [PATCH 0/3] xfs: miscellaneous bugfixes Darrick J. Wong
  2016-01-23  0:34 ` [PATCH 1/3] xfs: use named array initializers for log item dumping Darrick J. Wong
@ 2016-01-23  0:34 ` Darrick J. Wong
  2016-01-27 13:31   ` Brian Foster
  2016-01-23  0:34 ` [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time Darrick J. Wong
  2 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2016-01-23  0:34 UTC (permalink / raw)
  To: david, darrick.wong; +Cc: xfs

Move the shortform attr structure definition to the same place as the
other attribute structure definitions for consistency and also so that
xfs/122 verifies the structure size.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/libxfs/xfs_attr_sf.h    |   16 ----------------
 fs/xfs/libxfs/xfs_da_format.h  |   16 ++++++++++++++++
 fs/xfs/libxfs/xfs_inode_fork.c |    1 +
 3 files changed, 17 insertions(+), 16 deletions(-)


diff --git a/fs/xfs/libxfs/xfs_attr_sf.h b/fs/xfs/libxfs/xfs_attr_sf.h
index 919756e..90928bb 100644
--- a/fs/xfs/libxfs/xfs_attr_sf.h
+++ b/fs/xfs/libxfs/xfs_attr_sf.h
@@ -24,22 +24,6 @@
  * Small attribute lists are packed as tightly as possible so as
  * to fit into the literal area of the inode.
  */
-
-/*
- * Entries are packed toward the top as tight as possible.
- */
-typedef struct xfs_attr_shortform {
-	struct xfs_attr_sf_hdr {	/* constant-structure header block */
-		__be16	totsize;	/* total bytes in shortform list */
-		__u8	count;	/* count of active entries */
-	} hdr;
-	struct xfs_attr_sf_entry {
-		__uint8_t namelen;	/* actual length of name (no NULL) */
-		__uint8_t valuelen;	/* actual length of value (no NULL) */
-		__uint8_t flags;	/* flags bits (see xfs_attr_leaf.h) */
-		__uint8_t nameval[1];	/* name & value bytes concatenated */
-	} list[1];			/* variable sized array */
-} xfs_attr_shortform_t;
 typedef struct xfs_attr_sf_hdr xfs_attr_sf_hdr_t;
 typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t;
 
diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h
index b14bbd6..8d4d8bc 100644
--- a/fs/xfs/libxfs/xfs_da_format.h
+++ b/fs/xfs/libxfs/xfs_da_format.h
@@ -641,6 +641,22 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp)
  */
 #define XFS_ATTR_LEAF_MAPSIZE	3	/* how many freespace slots */
 
+/*
+ * Entries are packed toward the top as tight as possible.
+ */
+typedef struct xfs_attr_shortform {
+	struct xfs_attr_sf_hdr {	/* constant-structure header block */
+		__be16	totsize;	/* total bytes in shortform list */
+		__u8	count;	/* count of active entries */
+	} hdr;
+	struct xfs_attr_sf_entry {
+		__uint8_t namelen;	/* actual length of name (no NULL) */
+		__uint8_t valuelen;	/* actual length of value (no NULL) */
+		__uint8_t flags;	/* flags bits (see xfs_attr_leaf.h) */
+		__uint8_t nameval[1];	/* name & value bytes concatenated */
+	} list[1];			/* variable sized array */
+} xfs_attr_shortform_t;
+
 typedef struct xfs_attr_leaf_map {	/* RLE map of free bytes */
 	__be16	base;			  /* base of free region */
 	__be16	size;			  /* length of free region */
diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c
index 0defbd0..ef22a78 100644
--- a/fs/xfs/libxfs/xfs_inode_fork.c
+++ b/fs/xfs/libxfs/xfs_inode_fork.c
@@ -31,6 +31,7 @@
 #include "xfs_error.h"
 #include "xfs_trace.h"
 #include "xfs_attr_sf.h"
+#include "xfs_da_format.h"
 
 kmem_zone_t *xfs_ifork_zone;
 

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time
  2016-01-23  0:34 [PATCH 0/3] xfs: miscellaneous bugfixes Darrick J. Wong
  2016-01-23  0:34 ` [PATCH 1/3] xfs: use named array initializers for log item dumping Darrick J. Wong
  2016-01-23  0:34 ` [PATCH 2/3] xfs: move struct xfs_attr_shortform to xfs_da_format.h Darrick J. Wong
@ 2016-01-23  0:34 ` Darrick J. Wong
  2016-01-27 13:31   ` Brian Foster
  2 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2016-01-23  0:34 UTC (permalink / raw)
  To: david, darrick.wong; +Cc: xfs

Check the sizes of XFS on-disk structures when compiling the kernel.
Use this to catch inadvertent changes in structure size due to padding
and alignment issues, etc.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/xfs_ondisk.h |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++
 fs/xfs/xfs_super.c  |    3 +
 2 files changed, 111 insertions(+)
 create mode 100644 fs/xfs/xfs_ondisk.h


diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
new file mode 100644
index 0000000..56fab46
--- /dev/null
+++ b/fs/xfs/xfs_ondisk.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2016 Oracle.
+ * 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
+ */
+#ifndef __XFS_ONDISK_H
+#define __XFS_ONDISK_H
+
+#define XFS_CHECK_STRUCT_SIZE(structname, size) \
+	BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(struct " \
+		#structname ") is wrong, expected " #size)
+
+static inline void __init
+xfs_check_ondisk_structs(void)
+{
+	/* ag/file structures */
+	XFS_CHECK_STRUCT_SIZE(struct xfs_acl,			4);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry,		12);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_agf,			224);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_agfl,			36);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_agi,			336);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key,		8);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec,		16);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block,		4);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block,		72);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dinode,		176);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot,		104);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk,			136);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dsb,			264);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr,		56);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key,		4);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec,		16);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp,		8);
+	XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t,			8);
+	XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t,			4);
+	XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t,			8);
+	XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t,			4);
+
+	/* dir/attr trees */
+	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr,	80);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock,	88);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr,		56);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo,		56);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode,		64);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr,		64);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr,		48);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr,		64);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free,		64);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr,		64);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf,		64);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr,		64);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t,		8);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t,		32);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t,		4);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t,	4);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t,	12);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t,		40);
+	XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t,		8);
+	XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t,			12);
+	XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t,			16);
+	XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t,		8);
+	XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t,		16);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t,		4);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t,		16);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t,		6);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t,		16);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t,			16);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t,			4);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t,			8);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t,			8);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t,		8);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t,		16);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t,			16);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t,		4);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t,		3);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t,		10);
+	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t,		2);
+
+	/* log structures */
+	XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat,		24);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32,	28);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64,	32);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32,	28);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64,	32);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32,		12);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64,		16);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_icdinode,		176);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log,		28);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp,		8);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32,	52);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64,	56);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat,	20);
+	XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header,		16);
+}
+
+#endif /* __XFS_ONDISK_H */
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index 36bd882..f63d212 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -45,6 +45,7 @@
 #include "xfs_filestream.h"
 #include "xfs_quota.h"
 #include "xfs_sysfs.h"
+#include "xfs_ondisk.h"
 
 #include <linux/namei.h>
 #include <linux/init.h>
@@ -1817,6 +1818,8 @@ init_xfs_fs(void)
 {
 	int			error;
 
+	xfs_check_ondisk_structs();
+
 	printk(KERN_INFO XFS_VERSION_STRING " with "
 			 XFS_BUILD_OPTIONS " enabled\n");
 

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* Re: [PATCH 1/3] xfs: use named array initializers for log item dumping
  2016-01-23  0:34 ` [PATCH 1/3] xfs: use named array initializers for log item dumping Darrick J. Wong
@ 2016-01-27 13:31   ` Brian Foster
  0 siblings, 0 replies; 9+ messages in thread
From: Brian Foster @ 2016-01-27 13:31 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: xfs

On Fri, Jan 22, 2016 at 04:34:31PM -0800, Darrick J. Wong wrote:
> Use named array initializers for the string arrays used to dump log
> items, rather than depending on the order being maintained correctly.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  fs/xfs/xfs_log.c |  132 ++++++++++++++++++++++++++++--------------------------
>  1 file changed, 68 insertions(+), 64 deletions(-)
> 
> 
> diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
> index 2aa187e..4758f06 100644
> --- a/fs/xfs/xfs_log.c
> +++ b/fs/xfs/xfs_log.c
> @@ -1989,77 +1989,81 @@ xlog_print_tic_res(
>  	uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t);
>  
>  	/* match with XLOG_REG_TYPE_* in xfs_log.h */
> -	static char *res_type_str[XLOG_REG_TYPE_MAX] = {
> -	    "bformat",
> -	    "bchunk",
> -	    "efi_format",
> -	    "efd_format",
> -	    "iformat",
> -	    "icore",
> -	    "iext",
> -	    "ibroot",
> -	    "ilocal",
> -	    "iattr_ext",
> -	    "iattr_broot",
> -	    "iattr_local",
> -	    "qformat",
> -	    "dquot",
> -	    "quotaoff",
> -	    "LR header",
> -	    "unmount",
> -	    "commit",
> -	    "trans header"
> +#define REG_TYPE_STR(type, str)	[XLOG_REG_TYPE_##type] = str
> +	static char *res_type_str[XLOG_REG_TYPE_MAX + 1] = {

Maybe we should just fix XLOG_REG_TYPE_MAX to hold the array size (as
XFS_TRANS_TYPE_MAX does)..?

> +	    REG_TYPE_STR(BFORMAT, "bformat"),
> +	    REG_TYPE_STR(BCHUNK, "bchunk"),
> +	    REG_TYPE_STR(EFI_FORMAT, "efi_format"),
> +	    REG_TYPE_STR(EFD_FORMAT, "efd_format"),
> +	    REG_TYPE_STR(IFORMAT, "iformat"),
> +	    REG_TYPE_STR(ICORE, "icore"),
> +	    REG_TYPE_STR(IEXT, "iext"),
> +	    REG_TYPE_STR(IBROOT, "ibroot"),
> +	    REG_TYPE_STR(ILOCAL, "ilocal"),
> +	    REG_TYPE_STR(IATTR_EXT, "iattr_ext"),
> +	    REG_TYPE_STR(IATTR_BROOT, "iattr_broot"),
> +	    REG_TYPE_STR(IATTR_LOCAL, "iattr_local"),
> +	    REG_TYPE_STR(QFORMAT, "qformat"),
> +	    REG_TYPE_STR(DQUOT, "dquot"),
> +	    REG_TYPE_STR(QUOTAOFF, "quotaoff"),
> +	    REG_TYPE_STR(LRHEADER, "LR header"),
> +	    REG_TYPE_STR(UNMOUNT, "unmount"),
> +	    REG_TYPE_STR(COMMIT, "commit"),
> +	    REG_TYPE_STR(TRANSHDR, "trans header"),
> +	    REG_TYPE_STR(ICREATE, "inode create")
>  	};
> +#undef REG_TYPE_STR
> +#define TRANS_TYPE_STR(type)	[XFS_TRANS_##type] = #type
>  	static char *trans_type_str[XFS_TRANS_TYPE_MAX] = {
...
>  	};
> +#undef TRANS_TYPE_STR
>  
>  	xfs_warn(mp, "xlog_write: reservation summary:");
>  	xfs_warn(mp, "  trans type  = %s (%u)",
>  		 ((ticket->t_trans_type <= 0 ||
>  		   ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ?
> -		  "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]),
> +		  "bad-trans-type" : trans_type_str[ticket->t_trans_type]),

Why not incorporate the -1 offset in the new macros and leave these as
is? That avoids a dummy entry at index 0 in each array as well.

Brian

>  		 ticket->t_trans_type);
>  	xfs_warn(mp, "  unit res    = %d bytes",
>  		 ticket->t_unit_res);
> @@ -2078,7 +2082,7 @@ xlog_print_tic_res(
>  		uint r_type = ticket->t_res_arr[i].r_type;
>  		xfs_warn(mp, "region[%u]: %s - %u bytes", i,
>  			    ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
> -			    "bad-rtype" : res_type_str[r_type-1]),
> +			    "bad-rtype" : res_type_str[r_type]),
>  			    ticket->t_res_arr[i].r_len);
>  	}
>  
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* Re: [PATCH 2/3] xfs: move struct xfs_attr_shortform to xfs_da_format.h
  2016-01-23  0:34 ` [PATCH 2/3] xfs: move struct xfs_attr_shortform to xfs_da_format.h Darrick J. Wong
@ 2016-01-27 13:31   ` Brian Foster
  0 siblings, 0 replies; 9+ messages in thread
From: Brian Foster @ 2016-01-27 13:31 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: xfs

On Fri, Jan 22, 2016 at 04:34:38PM -0800, Darrick J. Wong wrote:
> Move the shortform attr structure definition to the same place as the
> other attribute structure definitions for consistency and also so that
> xfs/122 verifies the structure size.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---

Seems fine:

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  fs/xfs/libxfs/xfs_attr_sf.h    |   16 ----------------
>  fs/xfs/libxfs/xfs_da_format.h  |   16 ++++++++++++++++
>  fs/xfs/libxfs/xfs_inode_fork.c |    1 +
>  3 files changed, 17 insertions(+), 16 deletions(-)
> 
> 
> diff --git a/fs/xfs/libxfs/xfs_attr_sf.h b/fs/xfs/libxfs/xfs_attr_sf.h
> index 919756e..90928bb 100644
> --- a/fs/xfs/libxfs/xfs_attr_sf.h
> +++ b/fs/xfs/libxfs/xfs_attr_sf.h
> @@ -24,22 +24,6 @@
>   * Small attribute lists are packed as tightly as possible so as
>   * to fit into the literal area of the inode.
>   */
> -
> -/*
> - * Entries are packed toward the top as tight as possible.
> - */
> -typedef struct xfs_attr_shortform {
> -	struct xfs_attr_sf_hdr {	/* constant-structure header block */
> -		__be16	totsize;	/* total bytes in shortform list */
> -		__u8	count;	/* count of active entries */
> -	} hdr;
> -	struct xfs_attr_sf_entry {
> -		__uint8_t namelen;	/* actual length of name (no NULL) */
> -		__uint8_t valuelen;	/* actual length of value (no NULL) */
> -		__uint8_t flags;	/* flags bits (see xfs_attr_leaf.h) */
> -		__uint8_t nameval[1];	/* name & value bytes concatenated */
> -	} list[1];			/* variable sized array */
> -} xfs_attr_shortform_t;
>  typedef struct xfs_attr_sf_hdr xfs_attr_sf_hdr_t;
>  typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t;
>  
> diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h
> index b14bbd6..8d4d8bc 100644
> --- a/fs/xfs/libxfs/xfs_da_format.h
> +++ b/fs/xfs/libxfs/xfs_da_format.h
> @@ -641,6 +641,22 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp)
>   */
>  #define XFS_ATTR_LEAF_MAPSIZE	3	/* how many freespace slots */
>  
> +/*
> + * Entries are packed toward the top as tight as possible.
> + */
> +typedef struct xfs_attr_shortform {
> +	struct xfs_attr_sf_hdr {	/* constant-structure header block */
> +		__be16	totsize;	/* total bytes in shortform list */
> +		__u8	count;	/* count of active entries */
> +	} hdr;
> +	struct xfs_attr_sf_entry {
> +		__uint8_t namelen;	/* actual length of name (no NULL) */
> +		__uint8_t valuelen;	/* actual length of value (no NULL) */
> +		__uint8_t flags;	/* flags bits (see xfs_attr_leaf.h) */
> +		__uint8_t nameval[1];	/* name & value bytes concatenated */
> +	} list[1];			/* variable sized array */
> +} xfs_attr_shortform_t;
> +
>  typedef struct xfs_attr_leaf_map {	/* RLE map of free bytes */
>  	__be16	base;			  /* base of free region */
>  	__be16	size;			  /* length of free region */
> diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c
> index 0defbd0..ef22a78 100644
> --- a/fs/xfs/libxfs/xfs_inode_fork.c
> +++ b/fs/xfs/libxfs/xfs_inode_fork.c
> @@ -31,6 +31,7 @@
>  #include "xfs_error.h"
>  #include "xfs_trace.h"
>  #include "xfs_attr_sf.h"
> +#include "xfs_da_format.h"
>  
>  kmem_zone_t *xfs_ifork_zone;
>  
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* Re: [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time
  2016-01-23  0:34 ` [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time Darrick J. Wong
@ 2016-01-27 13:31   ` Brian Foster
  2016-02-02 23:27     ` Darrick J. Wong
  0 siblings, 1 reply; 9+ messages in thread
From: Brian Foster @ 2016-01-27 13:31 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: xfs

On Fri, Jan 22, 2016 at 04:34:44PM -0800, Darrick J. Wong wrote:
> Check the sizes of XFS on-disk structures when compiling the kernel.
> Use this to catch inadvertent changes in structure size due to padding
> and alignment issues, etc.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  fs/xfs/xfs_ondisk.h |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/xfs/xfs_super.c  |    3 +
>  2 files changed, 111 insertions(+)
>  create mode 100644 fs/xfs/xfs_ondisk.h
> 
> 
> diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
> new file mode 100644
> index 0000000..56fab46
> --- /dev/null
> +++ b/fs/xfs/xfs_ondisk.h
> @@ -0,0 +1,108 @@
> +/*
> + * Copyright (c) 2016 Oracle.
> + * 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
> + */
> +#ifndef __XFS_ONDISK_H
> +#define __XFS_ONDISK_H
> +
> +#define XFS_CHECK_STRUCT_SIZE(structname, size) \
> +	BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(struct " \

We're printing "struct" in the core message as well as part of the
structname (where appropriate). E.g., "sizeof(struct struct xfs_acl) is
wrong, ..."

It would also be nice to include the current structure size in the
message if it happens to be unexpected. Otherwise, seems fine to me.

Brian

> +		#structname ") is wrong, expected " #size)
> +

> +static inline void __init
> +xfs_check_ondisk_structs(void)
> +{
> +	/* ag/file structures */
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_acl,			4);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry,		12);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_agf,			224);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_agfl,			36);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_agi,			336);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key,		8);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec,		16);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block,		4);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block,		72);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dinode,		176);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot,		104);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk,			136);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dsb,			264);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr,		56);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key,		4);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec,		16);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp,		8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t,			8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t,			4);
> +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t,			8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t,			4);
> +
> +	/* dir/attr trees */
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr,	80);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock,	88);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr,		56);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo,		56);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode,		64);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr,		64);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr,		48);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr,		64);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free,		64);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr,		64);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf,		64);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr,		64);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t,		8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t,		32);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t,		4);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t,	4);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t,	12);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t,		40);
> +	XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t,		8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t,			12);
> +	XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t,			16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t,		8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t,		16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t,		4);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t,		16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t,		6);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t,		16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t,			16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t,			4);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t,			8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t,			8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t,		8);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t,		16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t,			16);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t,		4);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t,		3);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t,		10);
> +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t,		2);
> +
> +	/* log structures */
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat,		24);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32,	28);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64,	32);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32,	28);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64,	32);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32,		12);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64,		16);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_icdinode,		176);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log,		28);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp,		8);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32,	52);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64,	56);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat,	20);
> +	XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header,		16);
> +}
> +
> +#endif /* __XFS_ONDISK_H */
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 36bd882..f63d212 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -45,6 +45,7 @@
>  #include "xfs_filestream.h"
>  #include "xfs_quota.h"
>  #include "xfs_sysfs.h"
> +#include "xfs_ondisk.h"
>  
>  #include <linux/namei.h>
>  #include <linux/init.h>
> @@ -1817,6 +1818,8 @@ init_xfs_fs(void)
>  {
>  	int			error;
>  
> +	xfs_check_ondisk_structs();
> +
>  	printk(KERN_INFO XFS_VERSION_STRING " with "
>  			 XFS_BUILD_OPTIONS " enabled\n");
>  
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* Re: [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time
  2016-01-27 13:31   ` Brian Foster
@ 2016-02-02 23:27     ` Darrick J. Wong
  2016-02-03 12:37       ` Brian Foster
  0 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2016-02-02 23:27 UTC (permalink / raw)
  To: Brian Foster; +Cc: xfs

On Wed, Jan 27, 2016 at 08:31:17AM -0500, Brian Foster wrote:
> On Fri, Jan 22, 2016 at 04:34:44PM -0800, Darrick J. Wong wrote:
> > Check the sizes of XFS on-disk structures when compiling the kernel.
> > Use this to catch inadvertent changes in structure size due to padding
> > and alignment issues, etc.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  fs/xfs/xfs_ondisk.h |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  fs/xfs/xfs_super.c  |    3 +
> >  2 files changed, 111 insertions(+)
> >  create mode 100644 fs/xfs/xfs_ondisk.h
> > 
> > 
> > diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
> > new file mode 100644
> > index 0000000..56fab46
> > --- /dev/null
> > +++ b/fs/xfs/xfs_ondisk.h
> > @@ -0,0 +1,108 @@
> > +/*
> > + * Copyright (c) 2016 Oracle.
> > + * 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
> > + */
> > +#ifndef __XFS_ONDISK_H
> > +#define __XFS_ONDISK_H
> > +
> > +#define XFS_CHECK_STRUCT_SIZE(structname, size) \
> > +	BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(struct " \
> 
> We're printing "struct" in the core message as well as part of the
> structname (where appropriate). E.g., "sizeof(struct struct xfs_acl) is
> wrong, ..."

Heh, fixed.

> It would also be nice to include the current structure size in the
> message if it happens to be unexpected. Otherwise, seems fine to me.

I don't think it's possible to pass the size to __attribute__((error(msg...)))?

gcc only seems only to accept string arguments to the error() attribute.

--D

> 
> Brian
> 
> > +		#structname ") is wrong, expected " #size)
> > +
> 
> > +static inline void __init
> > +xfs_check_ondisk_structs(void)
> > +{
> > +	/* ag/file structures */
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_acl,			4);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry,		12);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_agf,			224);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_agfl,			36);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_agi,			336);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key,		8);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec,		16);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block,		4);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block,		72);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dinode,		176);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot,		104);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk,			136);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dsb,			264);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr,		56);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key,		4);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec,		16);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp,		8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t,			8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t,			4);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t,			8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t,			4);
> > +
> > +	/* dir/attr trees */
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr,	80);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock,	88);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr,		56);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo,		56);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode,		64);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr,		64);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr,		48);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr,		64);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free,		64);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr,		64);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf,		64);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr,		64);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t,		8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t,		32);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t,		4);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t,	4);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t,	12);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t,		40);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t,		8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t,			12);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t,			16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t,		8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t,		16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t,		4);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t,		16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t,		6);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t,		16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t,			16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t,			4);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t,			8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t,			8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t,		8);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t,		16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t,			16);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t,		4);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t,		3);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t,		10);
> > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t,		2);
> > +
> > +	/* log structures */
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat,		24);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32,	28);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64,	32);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32,	28);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64,	32);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32,		12);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64,		16);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_icdinode,		176);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log,		28);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp,		8);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32,	52);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64,	56);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat,	20);
> > +	XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header,		16);
> > +}
> > +
> > +#endif /* __XFS_ONDISK_H */
> > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> > index 36bd882..f63d212 100644
> > --- a/fs/xfs/xfs_super.c
> > +++ b/fs/xfs/xfs_super.c
> > @@ -45,6 +45,7 @@
> >  #include "xfs_filestream.h"
> >  #include "xfs_quota.h"
> >  #include "xfs_sysfs.h"
> > +#include "xfs_ondisk.h"
> >  
> >  #include <linux/namei.h>
> >  #include <linux/init.h>
> > @@ -1817,6 +1818,8 @@ init_xfs_fs(void)
> >  {
> >  	int			error;
> >  
> > +	xfs_check_ondisk_structs();
> > +
> >  	printk(KERN_INFO XFS_VERSION_STRING " with "
> >  			 XFS_BUILD_OPTIONS " enabled\n");
> >  
> > 
> > _______________________________________________
> > xfs mailing list
> > xfs@oss.sgi.com
> > http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* Re: [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time
  2016-02-02 23:27     ` Darrick J. Wong
@ 2016-02-03 12:37       ` Brian Foster
  0 siblings, 0 replies; 9+ messages in thread
From: Brian Foster @ 2016-02-03 12:37 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: xfs

On Tue, Feb 02, 2016 at 03:27:35PM -0800, Darrick J. Wong wrote:
> On Wed, Jan 27, 2016 at 08:31:17AM -0500, Brian Foster wrote:
> > On Fri, Jan 22, 2016 at 04:34:44PM -0800, Darrick J. Wong wrote:
> > > Check the sizes of XFS on-disk structures when compiling the kernel.
> > > Use this to catch inadvertent changes in structure size due to padding
> > > and alignment issues, etc.
> > > 
> > > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > > ---
> > >  fs/xfs/xfs_ondisk.h |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > >  fs/xfs/xfs_super.c  |    3 +
> > >  2 files changed, 111 insertions(+)
> > >  create mode 100644 fs/xfs/xfs_ondisk.h
> > > 
> > > 
> > > diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
> > > new file mode 100644
> > > index 0000000..56fab46
> > > --- /dev/null
> > > +++ b/fs/xfs/xfs_ondisk.h
> > > @@ -0,0 +1,108 @@
> > > +/*
> > > + * Copyright (c) 2016 Oracle.
> > > + * 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
> > > + */
> > > +#ifndef __XFS_ONDISK_H
> > > +#define __XFS_ONDISK_H
> > > +
> > > +#define XFS_CHECK_STRUCT_SIZE(structname, size) \
> > > +	BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(struct " \
> > 
> > We're printing "struct" in the core message as well as part of the
> > structname (where appropriate). E.g., "sizeof(struct struct xfs_acl) is
> > wrong, ..."
> 
> Heh, fixed.
> 
> > It would also be nice to include the current structure size in the
> > message if it happens to be unexpected. Otherwise, seems fine to me.
> 
> I don't think it's possible to pass the size to __attribute__((error(msg...)))?
> 
> gcc only seems only to accept string arguments to the error() attribute.
> 

Ah, I guess we'd have to preconstruct the string or something like that.
Definitely not worth it, thanks!

Brian

> --D
> 
> > 
> > Brian
> > 
> > > +		#structname ") is wrong, expected " #size)
> > > +
> > 
> > > +static inline void __init
> > > +xfs_check_ondisk_structs(void)
> > > +{
> > > +	/* ag/file structures */
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_acl,			4);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry,		12);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_agf,			224);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_agfl,			36);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_agi,			336);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block,		4);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block,		72);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dinode,		176);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot,		104);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk,			136);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dsb,			264);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr,		56);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key,		4);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t,			8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t,			4);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t,			8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t,			4);
> > > +
> > > +	/* dir/attr trees */
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr,	80);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock,	88);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr,		56);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo,		56);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr,		48);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr,		64);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t,		32);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t,		4);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t,	4);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t,	12);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t,		40);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t,			12);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t,			16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t,		4);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t,		6);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t,			16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t,			4);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t,			8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t,			8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t,			16);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t,		4);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t,		3);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t,		10);
> > > +	XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t,		2);
> > > +
> > > +	/* log structures */
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat,		24);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32,	28);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64,	32);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32,	28);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64,	32);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32,		12);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64,		16);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_icdinode,		176);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log,		28);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp,		8);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32,	52);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64,	56);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat,	20);
> > > +	XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header,		16);
> > > +}
> > > +
> > > +#endif /* __XFS_ONDISK_H */
> > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> > > index 36bd882..f63d212 100644
> > > --- a/fs/xfs/xfs_super.c
> > > +++ b/fs/xfs/xfs_super.c
> > > @@ -45,6 +45,7 @@
> > >  #include "xfs_filestream.h"
> > >  #include "xfs_quota.h"
> > >  #include "xfs_sysfs.h"
> > > +#include "xfs_ondisk.h"
> > >  
> > >  #include <linux/namei.h>
> > >  #include <linux/init.h>
> > > @@ -1817,6 +1818,8 @@ init_xfs_fs(void)
> > >  {
> > >  	int			error;
> > >  
> > > +	xfs_check_ondisk_structs();
> > > +
> > >  	printk(KERN_INFO XFS_VERSION_STRING " with "
> > >  			 XFS_BUILD_OPTIONS " enabled\n");
> > >  
> > > 
> > > _______________________________________________
> > > xfs mailing list
> > > xfs@oss.sgi.com
> > > http://oss.sgi.com/mailman/listinfo/xfs
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

end of thread, other threads:[~2016-02-03 12:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-23  0:34 [PATCH 0/3] xfs: miscellaneous bugfixes Darrick J. Wong
2016-01-23  0:34 ` [PATCH 1/3] xfs: use named array initializers for log item dumping Darrick J. Wong
2016-01-27 13:31   ` Brian Foster
2016-01-23  0:34 ` [PATCH 2/3] xfs: move struct xfs_attr_shortform to xfs_da_format.h Darrick J. Wong
2016-01-27 13:31   ` Brian Foster
2016-01-23  0:34 ` [PATCH 3/3] xfs: check sizes of XFS on-disk structures at compile time Darrick J. Wong
2016-01-27 13:31   ` Brian Foster
2016-02-02 23:27     ` Darrick J. Wong
2016-02-03 12:37       ` Brian Foster

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox