More random progress on mke2fs.  Nothing to see yet.
diff --git a/toys/e2fs.h b/toys/e2fs.h
new file mode 100644
index 0000000..fa3dd0d
--- /dev/null
+++ b/toys/e2fs.h
@@ -0,0 +1,133 @@
+/* vi: set ts=4:
+ *
+ * mke2fs.h - Headers for ext2
+ *
+ * Copyright 2006 Rob Landley <rob@landley.net>
+ */
+
+// Stuff defined in linux/ext2_fs.h
+
+#define EXT2_SUPER_MAGIC  0xEF53
+
+struct ext2_inode {
+	uint16_t mode;        // File mode
+	uint16_t uid;         // Low 16 bits of Owner Uid
+	uint32_t size;        // Size in bytes
+	uint32_t atime;       // Access time
+	uint32_t ctime;       // Creation time
+	uint32_t mtime;       // Modification time
+	uint32_t dtime;       // Deletion Time
+	uint16_t gid;         // Low 16 bits of Group Id
+	uint16_t links_count; // Links count
+	uint32_t blocks;      // Blocks count
+	uint32_t flags;       // File flags
+	uint32_t reserved1;
+	uint32_t block[15];   // Pointers to blocks
+	uint32_t generation;  // File version (for NFS)
+	uint32_t file_acl;    // File ACL
+	uint32_t dir_acl;     // Directory ACL
+	uint32_t faddr;       // Fragment address
+	uint8_t  frag;        // Fragment number
+	uint8_t  fsize;       // Fragment size
+	uint16_t pad1;
+	uint16_t uid_high;    // High bits of uid
+	uint16_t gid_high;    // High bits of gid
+	uint32_t reserved2;
+};
+
+struct ext2_super_block {
+	uint32_t inodes_count;      // Inodes count
+	uint32_t blocks_count;      // Blocks count
+	uint32_t r_blocks_count;    // Reserved blocks count
+	uint32_t free_blocks_count; // Free blocks count
+	uint32_t free_inodes_count; // Free inodes count
+	uint32_t first_data_block;  // First Data Block
+	uint32_t log_block_size;    // Block size
+	uint32_t log_frag_size;     // Fragment size
+	uint32_t blocks_per_group;  // # Blocks per group
+	uint32_t frags_per_group;   // # Fragments per group
+	uint32_t inodes_per_group;  // # Inodes per group
+	uint32_t mtime;             // Mount time
+	uint32_t wtime;             // Write time
+	uint16_t mnt_count;         // Mount count
+	uint16_t max_mnt_count;     // Maximal mount count
+	uint16_t magic;             // Magic signature
+	uint16_t state;             // File system state
+	uint16_t errors;            // Behaviour when detecting errors
+	uint16_t minor_rev_level;   // minor revision level
+	uint32_t lastcheck;         // time of last check
+	uint32_t checkinterval;     // max. time between checks
+	uint32_t creator_os;        // OS
+	uint32_t rev_level;         // Revision level
+	uint16_t def_resuid;        // Default uid for reserved blocks
+	uint16_t def_resgid;        // Default gid for reserved blocks
+	uint32_t first_ino;         // First non-reserved inode
+	uint16_t inode_size;        // size of inode structure
+	uint16_t block_group_nr;    // block group # of this superblock
+	uint32_t feature_compat;    // compatible feature set
+	uint32_t feature_incompat;  // incompatible feature set
+	uint32_t feature_ro_compat; // readonly-compatible feature set
+	char     uuid[16];          // 128-bit uuid for volume
+	char     volume_name[16];   // volume name
+	char     last_mounted[64];  // directory where last mounted
+	uint32_t alg_usage_bitmap;  // For compression
+	// For EXT2_COMPAT_PREALLOC
+	uint8_t  prealloc_blocks;   // Nr of blocks to try to preallocate
+	uint8_t  prealloc_dir_blocks; //Nr to preallocate for dirs
+	uint16_t padding1;
+	// For EXT3_FEATURE_COMPAT_HAS_JOURNAL
+	uint8_t  journal_uuid[16];   // uuid of journal superblock
+	uint32_t journal_inum;       // inode number of journal file
+	uint32_t journal_dev;        // device number of journal file
+	uint32_t last_orphan;        // start of list of inodes to delete
+	uint32_t hash_seed[4];       // HTREE hash seed
+	uint8_t  def_hash_version;   // Default hash version to use
+	uint8_t  padding2[3];
+	uint32_t default_mount_opts;
+ 	uint32_t first_meta_bg;      // First metablock block group
+	uint32_t mkfs_time;          // Creation timestamp
+	uint32_t jnl_blocks[17];     // Backup of journal inode
+	uint32_t reserved[172];      // Padding to the end of the block
+};
+
+#define EXT2_FEATURE_COMPAT_DIR_PREALLOC	0x0001
+#define EXT2_FEATURE_COMPAT_IMAGIC_INODES	0x0002
+#define EXT3_FEATURE_COMPAT_HAS_JOURNAL		0x0004
+#define EXT2_FEATURE_COMPAT_EXT_ATTR		0x0008
+#define EXT2_FEATURE_COMPAT_RESIZE_INO		0x0010
+#define EXT2_FEATURE_COMPAT_DIR_INDEX		0x0020
+
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE	0x0002
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR	0x0004
+
+#define EXT2_FEATURE_INCOMPAT_COMPRESSION	0x0001
+#define EXT2_FEATURE_INCOMPAT_FILETYPE		0x0002
+#define EXT3_FEATURE_INCOMPAT_RECOVER		0x0004
+#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV	0x0008
+#define EXT2_FEATURE_INCOMPAT_META_BG		0x0010
+
+#define EXT2_NAME_LEN 255
+
+struct ext2_dentry {
+	uint32_t inode;         // Inode number
+    uint16_t rec_len;       // Directory entry length
+    uint8_t  name_len;      // Name length
+    uint8_t  file_type;
+	char     name[255];     // File name
+};
+
+// Ext2 directory file types.  Only the low 3 bits are used.  The
+// other bits are reserved for now.
+
+enum {
+	EXT2_FT_UNKNOWN,
+	EXT2_FT_REG_FILE,
+	EXT2_FT_DIR,
+	EXT2_FT_CHRDEV,
+	EXT2_FT_BLKDEV,
+	EXT2_FT_FIFO,
+	EXT2_FT_SOCK,
+	EXT2_FT_SYMLINK,
+	EXT2_FT_MAX
+};