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