| /* |
| * This testing program makes sure superblock size is 1024 bytes long |
| * |
| * Copyright (C) 2007 by Theodore Ts'o. |
| * |
| * %Begin-Header% |
| * This file may be redistributed under the terms of the GNU Library |
| * General Public License, version 2. |
| * %End-Header% |
| */ |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| |
| #include "ext2_fs.h" |
| |
| #define sb_struct ext2_super_block |
| #define sb_struct_name "ext2_super_block" |
| |
| struct sb_struct sb; |
| |
| int verbose = 0; |
| |
| #define offsetof(type, member) __builtin_offsetof (type, member) |
| #define check_field(x) cur_offset = do_field(#x, sizeof(sb.x), \ |
| offsetof(struct sb_struct, x), \ |
| cur_offset) |
| |
| static int do_field(const char *field, size_t size, int offset, int cur_offset) |
| { |
| if (offset != cur_offset) { |
| printf("Warning! Unexpected offset at %s\n", field); |
| exit(1); |
| } |
| printf("%8d %-30s %3u\n", offset, field, (unsigned) size); |
| return offset + size; |
| } |
| |
| void check_superblock_fields() |
| { |
| #if (__GNUC__ >= 4) |
| int cur_offset = 0; |
| |
| printf("%8s %-30s %3s\n", "offset", "field", "size"); |
| check_field(s_inodes_count); |
| check_field(s_blocks_count); |
| check_field(s_r_blocks_count); |
| check_field(s_free_blocks_count); |
| check_field(s_free_inodes_count); |
| check_field(s_first_data_block); |
| check_field(s_log_block_size); |
| check_field(s_log_frag_size); |
| check_field(s_blocks_per_group); |
| check_field(s_frags_per_group); |
| check_field(s_inodes_per_group); |
| check_field(s_mtime); |
| check_field(s_wtime); |
| check_field(s_mnt_count); |
| check_field(s_max_mnt_count); |
| check_field(s_magic); |
| check_field(s_state); |
| check_field(s_errors); |
| check_field(s_minor_rev_level); |
| check_field(s_lastcheck); |
| check_field(s_checkinterval); |
| check_field(s_creator_os); |
| check_field(s_rev_level); |
| check_field(s_def_resuid); |
| check_field(s_def_resgid); |
| check_field(s_first_ino); |
| check_field(s_inode_size); |
| check_field(s_block_group_nr); |
| check_field(s_feature_compat); |
| check_field(s_feature_incompat); |
| check_field(s_feature_ro_compat); |
| check_field(s_uuid); |
| check_field(s_volume_name); |
| check_field(s_last_mounted); |
| check_field(s_algorithm_usage_bitmap); |
| check_field(s_prealloc_blocks); |
| check_field(s_prealloc_dir_blocks); |
| check_field(s_reserved_gdt_blocks); |
| check_field(s_journal_uuid); |
| check_field(s_journal_inum); |
| check_field(s_journal_dev); |
| check_field(s_last_orphan); |
| check_field(s_hash_seed); |
| check_field(s_def_hash_version); |
| check_field(s_jnl_backup_type); |
| check_field(s_desc_size); |
| check_field(s_default_mount_opts); |
| check_field(s_first_meta_bg); |
| check_field(s_mkfs_time); |
| check_field(s_jnl_blocks); |
| check_field(s_blocks_count_hi); |
| check_field(s_r_blocks_count_hi); |
| check_field(s_free_blocks_hi); |
| check_field(s_min_extra_isize); |
| check_field(s_want_extra_isize); |
| check_field(s_flags); |
| check_field(s_raid_stride); |
| check_field(s_mmp_interval); |
| check_field(s_mmp_block); |
| check_field(s_raid_stripe_width); |
| check_field(s_log_groups_per_flex); |
| check_field(s_reserved_char_pad); |
| check_field(s_reserved_pad); |
| check_field(s_kbytes_written); |
| check_field(s_snapshot_inum); |
| check_field(s_snapshot_id); |
| check_field(s_snapshot_r_blocks_count); |
| check_field(s_snapshot_list); |
| check_field(s_error_count); |
| check_field(s_first_error_time); |
| check_field(s_first_error_ino); |
| check_field(s_first_error_block); |
| check_field(s_first_error_func); |
| check_field(s_first_error_line); |
| check_field(s_last_error_time); |
| check_field(s_last_error_ino); |
| check_field(s_last_error_line); |
| check_field(s_last_error_block); |
| check_field(s_last_error_func); |
| check_field(s_mount_opts); |
| check_field(s_reserved); |
| printf("Ending offset is %d\n\n", cur_offset); |
| #endif |
| } |
| |
| |
| int main(int argc, char **argv) |
| { |
| int s = sizeof(struct sb_struct); |
| |
| check_superblock_fields(); |
| printf("Size of struct %s is %d\n", sb_struct_name, s); |
| if (s != 1024) { |
| exit(1); |
| } |
| exit(0); |
| } |