1a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o/*
2a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o * This testing program makes sure superblock size is 1024 bytes long
3a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o *
4a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o * Copyright (C) 2007 by Theodore Ts'o.
5efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
6a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o * %Begin-Header%
7543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
9a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o * %End-Header%
10a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o */
11a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o
12d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h"
13a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o#include <stdio.h>
14a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o#include <unistd.h>
15a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o#include <stdlib.h>
16a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o
17a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o#include "ext2_fs.h"
18a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o
19c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o#define sb_struct ext2_super_block
20c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o#define sb_struct_name "ext2_super_block"
21c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o
22c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'ostruct sb_struct sb;
23c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o
24ab3f5c5aad6310be1d1891c05f1bc8cf7ccf0cefTheodore Ts'o#ifndef offsetof
25c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o#define offsetof(type, member)  __builtin_offsetof (type, member)
26ab3f5c5aad6310be1d1891c05f1bc8cf7ccf0cefTheodore Ts'o#endif
27ab3f5c5aad6310be1d1891c05f1bc8cf7ccf0cefTheodore Ts'o
28963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger#define check_field(x, s) cur_offset = do_field(#x, s, sizeof(sb.x),	       \
29963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger						offsetof(struct sb_struct, x), \
30963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger						cur_offset)
31c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o
32963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilgerstatic int do_field(const char *field, unsigned size, unsigned cur_size,
33963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger		    unsigned offset, unsigned cur_offset)
34c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o{
35963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	if (size != cur_size) {
36963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger		printf("error: %s size %u should be %u\n",
37963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger		       field, cur_size, size);
38963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger		exit(1);
39963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	}
40c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o	if (offset != cur_offset) {
41963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger		printf("error: %s offset %u should be %u\n",
42963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger		       field, cur_offset, offset);
43c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o		exit(1);
44c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o	}
45963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	printf("%8d %-30s %3u\n", offset, field, size);
46c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o	return offset + size;
47c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o}
48c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o
49963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilgerint main(int argc, char **argv)
50c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o{
51c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o#if (__GNUC__ >= 4)
52c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o	int cur_offset = 0;
53c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o
54c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o	printf("%8s %-30s %3s\n", "offset", "field", "size");
55963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_inodes_count, 4);
56963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_blocks_count, 4);
57963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_r_blocks_count, 4);
58963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_free_blocks_count, 4);
59963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_free_inodes_count, 4);
60963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_data_block, 4);
61963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_log_block_size, 4);
62963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_log_cluster_size, 4);
63963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_blocks_per_group, 4);
64963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_clusters_per_group, 4);
65963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_inodes_per_group, 4);
66963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_mtime, 4);
67963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_wtime, 4);
68963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_mnt_count, 2);
69963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_max_mnt_count, 2);
70963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_magic, 2);
71963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_state, 2);
72963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_errors, 2);
73963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_minor_rev_level, 2);
74963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_lastcheck, 4);
75963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_checkinterval, 4);
76963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_creator_os, 4);
77963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_rev_level, 4);
78963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_def_resuid, 2);
79963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_def_resgid, 2);
80963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_ino, 4);
81963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_inode_size, 2);
82963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_block_group_nr, 2);
83963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_feature_compat, 4);
84963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_feature_incompat, 4);
85963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_feature_ro_compat, 4);
86963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_uuid, 16);
87963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_volume_name, 16);
88963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_mounted, 64);
89963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_algorithm_usage_bitmap, 4);
90963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_prealloc_blocks, 1);
91963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_prealloc_dir_blocks, 1);
92963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_reserved_gdt_blocks, 2);
93963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_journal_uuid, 16);
94963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_journal_inum, 4);
95963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_journal_dev, 4);
96963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_orphan, 4);
97963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_hash_seed, 4 * 4);
98963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_def_hash_version, 1);
99963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_jnl_backup_type, 1);
100963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_desc_size, 2);
101963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_default_mount_opts, 4);
102963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_meta_bg, 4);
103963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_mkfs_time, 4);
104963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_jnl_blocks, 17 * 4);
105963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_blocks_count_hi, 4);
106963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_r_blocks_count_hi, 4);
107963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_free_blocks_hi, 4);
108963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_min_extra_isize, 2);
109963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_want_extra_isize, 2);
110963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_flags, 4);
111963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_raid_stride, 2);
112963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_mmp_update_interval, 2);
113963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_mmp_block, 8);
114963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_raid_stripe_width, 4);
115963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_log_groups_per_flex, 1);
1165d914d721ab89a4f795f403119a216ae27ad8bfdDarrick J. Wong	check_field(s_checksum_type, 1);
117fc898cb99ba4e8a0b42fbe6fcc3d277c15b56fbdTheodore Ts'o	check_field(s_encryption_level, 1);
118fc898cb99ba4e8a0b42fbe6fcc3d277c15b56fbdTheodore Ts'o	check_field(s_reserved_pad, 1);
119963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_kbytes_written, 8);
120963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_snapshot_inum, 4);
121963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_snapshot_id, 4);
122963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_snapshot_r_blocks_count, 8);
123963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_snapshot_list, 4);
124963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_error_count, 4);
125963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_error_time, 4);
126963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_error_ino, 4);
127963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_error_block, 8);
128963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_error_func, 32);
129963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_first_error_line, 4);
130963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_error_time, 4);
131963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_error_ino, 4);
132963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_error_line, 4);
133963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_error_block, 8);
134963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_last_error_func, 32);
135963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_mount_opts, 64);
136963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_usr_quota_inum, 4);
137963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_grp_quota_inum, 4);
138963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_overhead_blocks, 4);
13965c6c3e06f72e76ddb69222b3be1713d870eb782Theodore Ts'o	check_field(s_backup_bgs, 8);
14022f22ab1d2bc5aea568c57233d70677893a271b2Theodore Ts'o	check_field(s_encrypt_algos, 4);
14141f2210131cfbaa4059cebae3a9b0f104fe89f70Theodore Ts'o	check_field(s_encrypt_pw_salt, 16);
142fc898cb99ba4e8a0b42fbe6fcc3d277c15b56fbdTheodore Ts'o	check_field(s_lpf_ino, 4);
143080e09b46ff1f6b00b26231868002e781e98adf2Li Xi	check_field(s_prj_quota_inum, 4);
1442ed0adbce68c0bbe7e1fc2cf23f009327f10441bDarrick J. Wong	check_field(s_checksum_seed, 4);
1452ed0adbce68c0bbe7e1fc2cf23f009327f10441bDarrick J. Wong	check_field(s_reserved, 98 * 4);
146963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	check_field(s_checksum, 4);
147963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	do_field("Superblock end", 0, 0, cur_offset, 1024);
148c5726f1ad7efedcdb24b3b362c84f0d0b402b337Theodore Ts'o#endif
149963d0f1a9458396c18d0aa030601f29cc1e25f30Andreas Dilger	return 0;
150a2b2ff61c88ac7583f288a1723d8195a0b7f2f83Theodore Ts'o}
151