[05/10] ext2fs: annotate superblock/inode offsets

Message ID 1525235166-6448-6-git-send-email-adilger@dilger.ca
State Accepted, archived
Headers show
Series
  • test cleanups and minor improvements
Related show

Commit Message

Andreas Dilger May 2, 2018, 4:26 a.m.
Add byte offsets for the fields in ext2_super_block and ext2_inode
for convenience when debugging on-disk structures.

Signed-off-by: Andreas Dilger <adilger@dilger.ca>
---
 lib/ext2fs/ext2_fs.h | 115 +++++++++++++++++++++++++--------------------------
 1 file changed, 57 insertions(+), 58 deletions(-)

Comments

Theodore Y. Ts'o June 22, 2018, 4:58 p.m. | #1
On Tue, May 01, 2018 at 10:26:01PM -0600, Andreas Dilger wrote:
> Add byte offsets for the fields in ext2_super_block and ext2_inode
> for convenience when debugging on-disk structures.
> 
> Signed-off-by: Andreas Dilger <adilger@dilger.ca>

Thanks, applied.  By the way, the way I'pve normally get the byte
offsets for the superblock is to use ./lib/ext2fs/tst_super_size.

At the moment tst_super_size prints the offsets in decimal, and your
patch adds offsets in hex.  Right now, debugfs's hexdump and idump
commands prints its offsets in octal, because of the precedence of od.

What do people think?  Should we standardize on some base in how we
display and print offsets and hexdumps?

					- Ted
Andreas Dilger June 22, 2018, 9:10 p.m. | #2
> On Jun 22, 2018, at 10:58 AM, Theodore Y. Ts'o <tytso@mit.edu> wrote:
> 
> On Tue, May 01, 2018 at 10:26:01PM -0600, Andreas Dilger wrote:
>> Add byte offsets for the fields in ext2_super_block and ext2_inode
>> for convenience when debugging on-disk structures.
>> 
>> Signed-off-by: Andreas Dilger <adilger@dilger.ca>
> 
> Thanks, applied.  By the way, the way I'pve normally get the byte
> offsets for the superblock is to use ./lib/ext2fs/tst_super_size.
> 
> At the moment tst_super_size prints the offsets in decimal, and your
> patch adds offsets in hex.  Right now, debugfs's hexdump and idump
> commands prints its offsets in octal, because of the precedence of od.
> 
> What do people think?  Should we standardize on some base in how we
> display and print offsets and hexdumps?

I used hex offsets mainly because they are more compact, and make it
more clear when a 64-bit field is properly aligned on a 64-bit boundary.

Cheers, Andreas

Patch

diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 7d62694..55fa78e 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -378,17 +378,17 @@  struct ext4_new_group_input {
  * Structure of an inode on the disk
  */
 struct ext2_inode {
-	__u16	i_mode;		/* File mode */
+/*00*/	__u16	i_mode;		/* File mode */
 	__u16	i_uid;		/* Low 16 bits of Owner Uid */
 	__u32	i_size;		/* Size in bytes */
 	__u32	i_atime;	/* Access time */
 	__u32	i_ctime;	/* Inode change time */
-	__u32	i_mtime;	/* Modification time */
+/*10*/	__u32	i_mtime;	/* Modification time */
 	__u32	i_dtime;	/* Deletion Time */
 	__u16	i_gid;		/* Low 16 bits of Group Id */
 	__u16	i_links_count;	/* Links count */
 	__u32	i_blocks;	/* Blocks count */
-	__u32	i_flags;	/* File flags */
+/*20*/	__u32	i_flags;	/* File flags */
 	union {
 		struct {
 			__u32	l_i_version; /* was l_i_reserved1 */
@@ -397,11 +397,11 @@  struct ext2_inode {
 			__u32  h_i_translator;
 		} hurd1;
 	} osd1;				/* OS dependent 1 */
-	__u32	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
-	__u32	i_generation;	/* File version (for NFS) */
+/*28*/	__u32	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+/*64*/	__u32	i_generation;	/* File version (for NFS) */
 	__u32	i_file_acl;	/* File ACL */
 	__u32	i_size_high;
-	__u32	i_faddr;	/* Fragment address */
+/*70*/	__u32	i_faddr;	/* Fragment address */
 	union {
 		struct {
 			__u16	l_i_blocks_hi;
@@ -426,17 +426,17 @@  struct ext2_inode {
  * Permanent part of an large inode on the disk
  */
 struct ext2_inode_large {
-	__u16	i_mode;		/* File mode */
+/*00*/	__u16	i_mode;		/* File mode */
 	__u16	i_uid;		/* Low 16 bits of Owner Uid */
 	__u32	i_size;		/* Size in bytes */
 	__u32	i_atime;	/* Access time */
 	__u32	i_ctime;	/* Inode Change time */
-	__u32	i_mtime;	/* Modification time */
+/*10*/	__u32	i_mtime;	/* Modification time */
 	__u32	i_dtime;	/* Deletion Time */
 	__u16	i_gid;		/* Low 16 bits of Group Id */
 	__u16	i_links_count;	/* Links count */
 	__u32	i_blocks;	/* Blocks count */
-	__u32	i_flags;	/* File flags */
+/*20*/	__u32	i_flags;	/* File flags */
 	union {
 		struct {
 			__u32	l_i_version; /* was l_i_reserved1 */
@@ -445,11 +445,11 @@  struct ext2_inode_large {
 			__u32  h_i_translator;
 		} hurd1;
 	} osd1;				/* OS dependent 1 */
-	__u32	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
-	__u32	i_generation;	/* File version (for NFS) */
+/*28*/	__u32	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+/*64*/	__u32	i_generation;	/* File version (for NFS) */
 	__u32	i_file_acl;	/* File ACL */
 	__u32	i_size_high;
-	__u32	i_faddr;	/* Fragment address */
+/*70*/	__u32	i_faddr;	/* Fragment address */
 	union {
 		struct {
 			__u16	l_i_blocks_hi;
@@ -468,15 +468,15 @@  struct ext2_inode_large {
 			__u32	h_i_author;
 		} hurd2;
 	} osd2;				/* OS dependent 2 */
-	__u16	i_extra_isize;
+/*80*/	__u16	i_extra_isize;
 	__u16	i_checksum_hi;	/* crc32c(uuid+inum+inode) */
 	__u32	i_ctime_extra;	/* extra Change time (nsec << 2 | epoch) */
 	__u32	i_mtime_extra;	/* extra Modification time (nsec << 2 | epoch) */
 	__u32	i_atime_extra;	/* extra Access time (nsec << 2 | epoch) */
-	__u32	i_crtime;	/* File creation time */
+/*90*/	__u32	i_crtime;	/* File creation time */
 	__u32	i_crtime_extra;	/* extra File creation time (nsec << 2 | epoch)*/
 	__u32	i_version_hi;	/* high 32 bits for 64-bit version */
-	__u32   i_projid;       /* Project ID */
+/*9c*/	__u32   i_projid;       /* Project ID */
 };
 
 #define EXT4_INODE_CSUM_HI_EXTRA_END	\
@@ -626,30 +626,30 @@  struct ext4_encryption_key {
  * Structure of the super block
  */
 struct ext2_super_block {
-	__u32	s_inodes_count;		/* Inodes count */
+/*000*/	__u32	s_inodes_count;		/* Inodes count */
 	__u32	s_blocks_count;		/* Blocks count */
 	__u32	s_r_blocks_count;	/* Reserved blocks count */
 	__u32	s_free_blocks_count;	/* Free blocks count */
-	__u32	s_free_inodes_count;	/* Free inodes count */
+/*010*/	__u32	s_free_inodes_count;	/* Free inodes count */
 	__u32	s_first_data_block;	/* First Data Block */
 	__u32	s_log_block_size;	/* Block size */
 	__u32	s_log_cluster_size;	/* Allocation cluster size */
-	__u32	s_blocks_per_group;	/* # Blocks per group */
+/*020*/	__u32	s_blocks_per_group;	/* # Blocks per group */
 	__u32	s_clusters_per_group;	/* # Fragments per group */
 	__u32	s_inodes_per_group;	/* # Inodes per group */
 	__u32	s_mtime;		/* Mount time */
-	__u32	s_wtime;		/* Write time */
+/*030*/	__u32	s_wtime;		/* Write time */
 	__u16	s_mnt_count;		/* Mount count */
 	__s16	s_max_mnt_count;	/* Maximal mount count */
 	__u16	s_magic;		/* Magic signature */
 	__u16	s_state;		/* File system state */
 	__u16	s_errors;		/* Behaviour when detecting errors */
 	__u16	s_minor_rev_level;	/* minor revision level */
-	__u32	s_lastcheck;		/* time of last check */
+/*040*/	__u32	s_lastcheck;		/* time of last check */
 	__u32	s_checkinterval;	/* max. time between checks */
 	__u32	s_creator_os;		/* OS */
 	__u32	s_rev_level;		/* Revision level */
-	__u16	s_def_resuid;		/* Default uid for reserved blocks */
+/*050*/	__u16	s_def_resuid;		/* Default uid for reserved blocks */
 	__u16	s_def_resgid;		/* Default gid for reserved blocks */
 	/*
 	 * These fields are for EXT2_DYNAMIC_REV superblocks only.
@@ -668,12 +668,12 @@  struct ext2_super_block {
 	__u16   s_inode_size;		/* size of inode structure */
 	__u16	s_block_group_nr;	/* block group # of this superblock */
 	__u32	s_feature_compat;	/* compatible feature set */
-	__u32	s_feature_incompat;	/* incompatible feature set */
+/*060*/	__u32	s_feature_incompat;	/* incompatible feature set */
 	__u32	s_feature_ro_compat;	/* readonly-compatible feature set */
-	__u8	s_uuid[16];		/* 128-bit uuid for volume */
-	char	s_volume_name[EXT2_LABEL_LEN];	/* volume name */
-	char	s_last_mounted[64];	/* directory where last mounted */
-	__u32	s_algorithm_usage_bitmap; /* For compression */
+/*068*/	__u8	s_uuid[16];		/* 128-bit uuid for volume */
+/*078*/	char	s_volume_name[EXT2_LABEL_LEN];	/* volume name */
+/*088*/	char	s_last_mounted[64];	/* directory where last mounted */
+/*0c8*/	__u32	s_algorithm_usage_bitmap; /* For compression */
 	/*
 	 * Performance hints.  Directory preallocation should only
 	 * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
@@ -684,63 +684,62 @@  struct ext2_super_block {
 	/*
 	 * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
 	 */
-	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
-	__u32	s_journal_inum;		/* inode number of journal file */
+/*0d0*/	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
+/*0e0*/	__u32	s_journal_inum;		/* inode number of journal file */
 	__u32	s_journal_dev;		/* device number of journal file */
 	__u32	s_last_orphan;		/* start of list of inodes to delete */
-	__u32	s_hash_seed[4];		/* HTREE hash seed */
-	__u8	s_def_hash_version;	/* Default hash version to use */
-	__u8	s_jnl_backup_type; 	/* Default type of journal backup */
+/*0ec*/	__u32	s_hash_seed[4];		/* HTREE hash seed */
+/*0fc*/	__u8	s_def_hash_version;	/* Default hash version to use */
+	__u8	s_jnl_backup_type;	/* Default type of journal backup */
 	__u16	s_desc_size;		/* Group desc. size: INCOMPAT_64BIT */
-	__u32	s_default_mount_opts;
+/*100*/	__u32	s_default_mount_opts;	/* default EXT2_MOUNT_* flags used */
 	__u32	s_first_meta_bg;	/* First metablock group */
 	__u32	s_mkfs_time;		/* When the filesystem was created */
-	__u32	s_jnl_blocks[17]; 	/* Backup of the journal inode */
-	__u32	s_blocks_count_hi;	/* Blocks count high 32bits */
+/*10c*/	__u32	s_jnl_blocks[17];	/* Backup of the journal inode */
+/*150*/	__u32	s_blocks_count_hi;	/* Blocks count high 32bits */
 	__u32	s_r_blocks_count_hi;	/* Reserved blocks count high 32 bits*/
-	__u32	s_free_blocks_hi; 	/* Free blocks count */
+	__u32	s_free_blocks_hi;	/* Free blocks count */
 	__u16	s_min_extra_isize;	/* All inodes have at least # bytes */
-	__u16	s_want_extra_isize; 	/* New inodes should reserve # bytes */
-	__u32	s_flags;		/* Miscellaneous flags */
-	__u16   s_raid_stride;		/* RAID stride */
-	__u16   s_mmp_update_interval;  /* # seconds to wait in MMP checking */
-	__u64   s_mmp_block;            /* Block for multi-mount protection */
-	__u32   s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/
+	__u16	s_want_extra_isize;	/* New inodes should reserve # bytes */
+/*160*/	__u32	s_flags;		/* Miscellaneous flags */
+	__u16	s_raid_stride;		/* RAID stride in blocks */
+	__u16	s_mmp_update_interval;  /* # seconds to wait in MMP checking */
+	__u64	s_mmp_block;		/* Block for multi-mount protection */
+/*170*/	__u32	s_raid_stripe_width;	/* blocks on all data disks (N*stride)*/
 	__u8	s_log_groups_per_flex;	/* FLEX_BG group size */
-	__u8    s_checksum_type;	/* metadata checksum algorithm */
+	__u8	s_checksum_type;	/* metadata checksum algorithm */
 	__u8	s_encryption_level;	/* versioning level for encryption */
 	__u8	s_reserved_pad;		/* Padding to next 32bits */
 	__u64	s_kbytes_written;	/* nr of lifetime kilobytes written */
-	__u32	s_snapshot_inum;	/* Inode number of active snapshot */
+/*180*/	__u32	s_snapshot_inum;	/* Inode number of active snapshot */
 	__u32	s_snapshot_id;		/* sequential ID of active snapshot */
-	__u64	s_snapshot_r_blocks_count; /* reserved blocks for active
-					      snapshot's future use */
-	__u32	s_snapshot_list;	/* inode number of the head of the on-disk snapshot list */
+	__u64	s_snapshot_r_blocks_count; /* active snapshot reserved blocks */
+/*190*/	__u32	s_snapshot_list;	/* inode number of disk snapshot list */
 #define EXT4_S_ERR_START ext4_offsetof(struct ext2_super_block, s_error_count)
 	__u32	s_error_count;		/* number of fs errors */
 	__u32	s_first_error_time;	/* first time an error happened */
 	__u32	s_first_error_ino;	/* inode involved in first error */
-	__u64	s_first_error_block;	/* block involved of first error */
+/*1a0*/	__u64	s_first_error_block;	/* block involved in first error */
 	__u8	s_first_error_func[32];	/* function where the error happened */
-	__u32	s_first_error_line;	/* line number where error happened */
+/*1c8*/	__u32	s_first_error_line;	/* line number where error happened */
 	__u32	s_last_error_time;	/* most recent time of an error */
-	__u32	s_last_error_ino;	/* inode involved in last error */
+/*1d0*/	__u32	s_last_error_ino;	/* inode involved in last error */
 	__u32	s_last_error_line;	/* line number where error happened */
 	__u64	s_last_error_block;	/* block involved of last error */
-	__u8	s_last_error_func[32];	/* function where the error happened */
+/*1e0*/	__u8	s_last_error_func[32];	/* function where the error happened */
 #define EXT4_S_ERR_END ext4_offsetof(struct ext2_super_block, s_mount_opts)
-	__u8	s_mount_opts[64];
-	__u32	s_usr_quota_inum;	/* inode number of user quota file */
+/*200*/	__u8	s_mount_opts[64];
+/*240*/	__u32	s_usr_quota_inum;	/* inode number of user quota file */
 	__u32	s_grp_quota_inum;	/* inode number of group quota file */
 	__u32	s_overhead_blocks;	/* overhead blocks/clusters in fs */
-	__u32	s_backup_bgs[2];	/* If sparse_super2 enabled */
-	__u8	s_encrypt_algos[4];	/* Encryption algorithms in use  */
-	__u8	s_encrypt_pw_salt[16];	/* Salt used for string2key algorithm */
-	__le32	s_lpf_ino;		/* Location of the lost+found inode */
+/*24c*/	__u32	s_backup_bgs[2];	/* If sparse_super2 enabled */
+/*254*/	__u8	s_encrypt_algos[4];	/* Encryption algorithms in use  */
+/*258*/	__u8	s_encrypt_pw_salt[16];	/* Salt used for string2key algorithm */
+/*268*/	__le32	s_lpf_ino;		/* Location of the lost+found inode */
 	__le32  s_prj_quota_inum;	/* inode for tracking project quota */
-	__le32	s_checksum_seed;	/* crc32c(orig_uuid) if csum_seed set */
+/*270*/	__le32	s_checksum_seed;	/* crc32c(orig_uuid) if csum_seed set */
 	__le32	s_reserved[98];		/* Padding to the end of the block */
-	__u32	s_checksum;		/* crc32c(superblock) */
+/*3fc*/	__u32	s_checksum;		/* crc32c(superblock) */
 };
 
 #define EXT4_S_ERR_LEN (EXT4_S_ERR_END - EXT4_S_ERR_START)