Current nilfs_check_ondisk_sizes() checks sizes of important structs
at run time. The checking should be done at build time. This patch
adds a new macro, BUILD_BUG_ON(), for this purpose. It is similar to
static_assert() of C++11. If an argument is true, the macro causes a
bulid error.
Below is an example of BUILD_BUG_ON(). When the checked conditions are
true like below:
/* intentional change for testing BUILD_BUG_ON() */
static __attribute__((used)) void nilfs_check_ondisk_sizes(void)
{
BUILD_BUG_ON(sizeof(struct nilfs_inode) > NILFS_MIN_BLOCKSIZE);
...
build process of mkfs.o causes errors like this:
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include -Wall -g -O2 -MT
mkfs.o -MD -MP -MF .deps/mkfs.Tpo -c -o mkfs.o mkfs.c
mkfs.c: In function 'nilfs_check_ondisk_sizes':
mkfs.c:429:2: error: negative width in bit-field '<anonymous>'
mkfs.c:430:2: error: negative width in bit-field '<anonymous>'
mkfs.c:431:2: error: negative width in bit-field '<anonymous>'
mkfs.c:432:2: error: negative width in bit-field '<anonymous>'
mkfs.c:433:2: error: negative width in bit-field '<anonymous>'
mkfs.c:434:2: error: negative width in bit-field '<anonymous>'
mkfs.c:435:2: error: negative width in bit-field '<anonymous>'
Signed-off-by: Hitoshi Mitake <[email protected]>
---
sbin/mkfs/mkfs.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/sbin/mkfs/mkfs.c b/sbin/mkfs/mkfs.c
index 4e153ce..8eb00bf 100644
--- a/sbin/mkfs/mkfs.c
+++ b/sbin/mkfs/mkfs.c
@@ -85,6 +85,9 @@
typedef __u64 blocknr_t;
#define BUG_ON(x) assert(!(x))
+/* Force a compilation error if the condition is true */
+#define BUILD_BUG_ON(condition) ((void)sizeof(struct { int: -!!(condition); }))
+
#define ROUNDUP_DIV(n, m) (((n) - 1) / (m) + 1)
#define max_t(type, x, y) \
({ type __x = (x); type __y = (y); __x > __y ? __x : __y; })
@@ -417,16 +420,15 @@ static unsigned count_dat_blocks(unsigned nr_dat_entries)
return nblocks;
}
-static void nilfs_check_ondisk_sizes(void)
+static __attribute__((used)) void nilfs_check_ondisk_sizes(void)
{
- if (sizeof(struct nilfs_inode) > NILFS_MIN_BLOCKSIZE ||
- sizeof(struct nilfs_sufile_header) > NILFS_MIN_BLOCKSIZE ||
- sizeof(struct nilfs_segment_usage) > NILFS_MIN_BLOCKSIZE ||
- sizeof(struct nilfs_cpfile_header) > NILFS_MIN_BLOCKSIZE ||
- sizeof(struct nilfs_checkpoint) > NILFS_MIN_BLOCKSIZE ||
- sizeof(struct nilfs_dat_entry) > NILFS_MIN_BLOCKSIZE ||
- sizeof(struct nilfs_super_root) > NILFS_MIN_BLOCKSIZE)
- perr("Internal error: too large on-disk structure");
+ BUILD_BUG_ON(sizeof(struct nilfs_inode) > NILFS_MIN_BLOCKSIZE);
+ BUILD_BUG_ON(sizeof(struct nilfs_sufile_header) > NILFS_MIN_BLOCKSIZE);
+ BUILD_BUG_ON(sizeof(struct nilfs_segment_usage) > NILFS_MIN_BLOCKSIZE);
+ BUILD_BUG_ON(sizeof(struct nilfs_cpfile_header) > NILFS_MIN_BLOCKSIZE);
+ BUILD_BUG_ON(sizeof(struct nilfs_checkpoint) > NILFS_MIN_BLOCKSIZE);
+ BUILD_BUG_ON(sizeof(struct nilfs_dat_entry) > NILFS_MIN_BLOCKSIZE);
+ BUILD_BUG_ON(sizeof(struct nilfs_super_root) > NILFS_MIN_BLOCKSIZE);
}
static unsigned long
@@ -523,8 +525,6 @@ static void init_disk_layout(struct nilfs_disk_info *di,
int fd,
"or shorten segments with -B option.", dev_size,
(unsigned long long)segment_size * min_nsegments);
di->nseginfo = 0;
-
- nilfs_check_ondisk_sizes();
}
static struct nilfs_segment_info *new_segment(struct nilfs_disk_info *di)
--
1.8.1.2
--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html