busybox : fix patch files.
authorChang.H.S <jhs@dev3>
Wed, 5 Dec 2012 07:00:02 +0000 (16:00 +0900)
committerChang.H.S <jhs@dev3>
Wed, 5 Dec 2012 07:00:02 +0000 (16:00 +0900)
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0001-ifupdown-support-post-up-pre-down-hooks.patch
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0001-work-around-linux-ext2_fs.h-breakage.patch [new file with mode: 0644]
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0002-Create-and-use-our-own-copy-of-linux-ext2_fs.h.patch [new file with mode: 0644]
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0002-ifupdown-code-shrink.patch
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0003-Drop-include-bb_linux_ext2_fs.h-use-existing-e2fspro.patch [new file with mode: 0644]
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0003-ifupdown-remove-interface-from-state_list-if-iface_u.patch
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0004-ifupdown-support-metric-for-static-default-gw.patch
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0005-ifupdown-improve-compatibility-with-Debian.patch
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0006-get_linux_version_code-don-t-fail-on-3.0-foo.patch
meta-openvuplus/recipes-core/busybox/busybox-1.19.4/mount_single_uuid.patch [new file with mode: 0644]
meta-openvuplus/recipes-core/busybox/busybox_1.19.4.bbappend

index 150cd1d..f62fe05 100644 (file)
@@ -1,7 +1,7 @@
 From b58a1a06ca695aed6a4f6e5039e2de0e5a3df111 Mon Sep 17 00:00:00 2001
 From: Peter Korsgaard <jacmet@sunsite.dk>
 Date: Wed, 19 Oct 2011 02:35:54 +0200
-Subject: [PATCH 1/9] ifupdown: support post-up / pre-down hooks
+Subject: [PATCH 1/6] ifupdown: support post-up / pre-down hooks
 
 function                                             old     new   delta
 set_environ                                          330     371     +41
diff --git a/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0001-work-around-linux-ext2_fs.h-breakage.patch b/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0001-work-around-linux-ext2_fs.h-breakage.patch
new file mode 100644 (file)
index 0000000..fa2e237
--- /dev/null
@@ -0,0 +1,50 @@
+From caf5768154301697430f0a3718838967d0f55f95 Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux@googlemail.com>
+Date: Thu, 12 Apr 2012 14:01:10 +0200
+Subject: [PATCH 01/33] work around linux/ext2_fs.h breakage
+
+See https://bugzilla.kernel.org/show_bug.cgi?id=42986
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ e2fsprogs/tune2fs.c    |    6 ++++++
+ util-linux/mkfs_ext2.c |    6 ++++++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c
+index 020bdaa..8da7432 100644
+--- a/e2fsprogs/tune2fs.c
++++ b/e2fsprogs/tune2fs.c
+@@ -8,6 +8,12 @@
+  */
+ #include "libbb.h"
+ #include <linux/fs.h>
++/*
++ * Work around linux/ext2_fs.h breakage.
++ * See https://bugzilla.kernel.org/show_bug.cgi?id=42986.
++ */
++typedef mode_t bb__umode_t;
++#define umode_t bb__umode_t
+ #include <linux/ext2_fs.h>
+ // storage helpers
+diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c
+index 6cbbe0e..759bb0a 100644
+--- a/util-linux/mkfs_ext2.c
++++ b/util-linux/mkfs_ext2.c
+@@ -48,6 +48,12 @@
+ #include "libbb.h"
+ #include <linux/fs.h>
++/*
++ * Work around linux/ext2_fs.h breakage.
++ * See https://bugzilla.kernel.org/show_bug.cgi?id=42986.
++ */
++typedef mode_t bb__umode_t;
++#define umode_t bb__umode_t
+ #include <linux/ext2_fs.h>
+ #define ENABLE_FEATURE_MKFS_EXT2_RESERVED_GDT 0
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0002-Create-and-use-our-own-copy-of-linux-ext2_fs.h.patch b/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0002-Create-and-use-our-own-copy-of-linux-ext2_fs.h.patch
new file mode 100644 (file)
index 0000000..f9de87f
--- /dev/null
@@ -0,0 +1,607 @@
+From 0b2b0f31a38d77ebfb2a6416011562687ef58191 Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux@googlemail.com>
+Date: Fri, 13 Apr 2012 16:39:18 +0200
+Subject: [PATCH 01/32] Create and use our own copy of linux/ext2_fs.h
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ e2fsprogs/tune2fs.c        |    8 +-
+ include/bb_linux_ext2_fs.h |  547 ++++++++++++++++++++++++++++++++++++++++++++
+ util-linux/mkfs_ext2.c     |    8 +-
+ 3 files changed, 549 insertions(+), 14 deletions(-)
+ create mode 100644 include/bb_linux_ext2_fs.h
+
+diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c
+index 8da7432..841d58a 100644
+--- a/e2fsprogs/tune2fs.c
++++ b/e2fsprogs/tune2fs.c
+@@ -8,13 +8,7 @@
+  */
+ #include "libbb.h"
+ #include <linux/fs.h>
+-/*
+- * Work around linux/ext2_fs.h breakage.
+- * See https://bugzilla.kernel.org/show_bug.cgi?id=42986.
+- */
+-typedef mode_t bb__umode_t;
+-#define umode_t bb__umode_t
+-#include <linux/ext2_fs.h>
++#include "bb_linux_ext2_fs.h"
+ // storage helpers
+ char BUG_wrong_field_size(void);
+diff --git a/include/bb_linux_ext2_fs.h b/include/bb_linux_ext2_fs.h
+new file mode 100644
+index 0000000..fdc470b
+--- /dev/null
++++ b/include/bb_linux_ext2_fs.h
+@@ -0,0 +1,547 @@
++/*
++ * Work around linux/ext2_fs.h breakage.
++ * linux/ext2_fs.h might be removed from future kernel header distribution.
++ * See https://bugzilla.kernel.org/show_bug.cgi?id=42986
++ *
++ * Licensed under GPLv2, see file LICENSE in this source tree.
++ */
++#ifndef BB_LINUX_EXT2_FS_H
++#define BB_LINUX_EXT2_FS_H
++
++/*
++ * From linux/magic.h
++ */
++
++#define EXT2_SUPER_MAGIC        0xEF53
++#define EXT3_SUPER_MAGIC        0xEF53
++#define EXT4_SUPER_MAGIC        0xEF53
++
++/*
++ * From linux/ext2_fs.h, with minor changes.
++ */
++
++/*
++ * Copyright (C) 1992, 1993, 1994, 1995
++ * Remy Card (card@masi.ibp.fr)
++ * Laboratoire MASI - Institut Blaise Pascal
++ * Universite Pierre et Marie Curie (Paris VI)
++ *
++ *  from
++ *
++ *  linux/include/linux/minix_fs.h
++ *
++ *  Copyright (C) 1991, 1992  Linus Torvalds
++ */
++
++/*
++ * The second extended filesystem constants/structures
++ */
++
++/*
++ * Define EXT2_RESERVATION to reserve data blocks for expanding files
++ */
++#define EXT2_DEFAULT_RESERVE_BLOCKS     8
++/*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
++#define EXT2_MAX_RESERVE_BLOCKS         1027
++#define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0
++
++/*
++ * Special inode numbers
++ */
++#define       EXT2_BAD_INO             1      /* Bad blocks inode */
++#define EXT2_ROOT_INO          2      /* Root inode */
++#define EXT2_BOOT_LOADER_INO   5      /* Boot loader inode */
++#define EXT2_UNDEL_DIR_INO     6      /* Undelete directory inode */
++
++/* First non-reserved inode for old ext2 filesystems */
++#define EXT2_GOOD_OLD_FIRST_INO       11
++
++/* Assume that user mode programs are passing in an ext2fs superblock, not
++ * a kernel struct super_block.  This will allow us to call the feature-test
++ * macros from user land. */
++#define EXT2_SB(sb)   (sb)
++
++/*
++ * Maximal count of links to a file
++ */
++#define EXT2_LINK_MAX         32000
++
++/*
++ * Macro-instructions used to manage several block sizes
++ */
++#define EXT2_MIN_BLOCK_SIZE           1024
++#define       EXT2_MAX_BLOCK_SIZE             4096
++#define EXT2_MIN_BLOCK_LOG_SIZE                 10
++# define EXT2_BLOCK_SIZE(s)           (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
++#define       EXT2_ADDR_PER_BLOCK(s)          (EXT2_BLOCK_SIZE(s) / sizeof (uint32_t))
++# define EXT2_BLOCK_SIZE_BITS(s)      ((s)->s_log_block_size + 10)
++#define EXT2_INODE_SIZE(s)    (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
++                               EXT2_GOOD_OLD_INODE_SIZE : \
++                               (s)->s_inode_size)
++#define EXT2_FIRST_INO(s)     (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
++                               EXT2_GOOD_OLD_FIRST_INO : \
++                               (s)->s_first_ino)
++
++/*
++ * Macro-instructions used to manage fragments
++ */
++#define EXT2_MIN_FRAG_SIZE            1024
++#define       EXT2_MAX_FRAG_SIZE              4096
++#define EXT2_MIN_FRAG_LOG_SIZE                  10
++# define EXT2_FRAG_SIZE(s)            (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
++# define EXT2_FRAGS_PER_BLOCK(s)      (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
++
++/*
++ * Structure of a blocks group descriptor
++ */
++struct ext2_group_desc
++{
++      uint32_t        bg_block_bitmap;                /* Blocks bitmap block */
++      uint32_t        bg_inode_bitmap;                /* Inodes bitmap block */
++      uint32_t        bg_inode_table;         /* Inodes table block */
++      uint16_t        bg_free_blocks_count;   /* Free blocks count */
++      uint16_t        bg_free_inodes_count;   /* Free inodes count */
++      uint16_t        bg_used_dirs_count;     /* Directories count */
++      uint16_t        bg_pad;
++      uint32_t        bg_reserved[3];
++};
++
++/*
++ * Macro-instructions used to manage group descriptors
++ */
++# define EXT2_BLOCKS_PER_GROUP(s)     ((s)->s_blocks_per_group)
++# define EXT2_DESC_PER_BLOCK(s)               (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
++# define EXT2_INODES_PER_GROUP(s)     ((s)->s_inodes_per_group)
++
++/*
++ * Constants relative to the data blocks
++ */
++#define       EXT2_NDIR_BLOCKS                12
++#define       EXT2_IND_BLOCK                  EXT2_NDIR_BLOCKS
++#define       EXT2_DIND_BLOCK                 (EXT2_IND_BLOCK + 1)
++#define       EXT2_TIND_BLOCK                 (EXT2_DIND_BLOCK + 1)
++#define       EXT2_N_BLOCKS                   (EXT2_TIND_BLOCK + 1)
++
++/*
++ * Inode flags (GETFLAGS/SETFLAGS)
++ */
++#define       EXT2_SECRM_FL                   FS_SECRM_FL     /* Secure deletion */
++#define       EXT2_UNRM_FL                    FS_UNRM_FL      /* Undelete */
++#define       EXT2_COMPR_FL                   FS_COMPR_FL     /* Compress file */
++#define EXT2_SYNC_FL                  FS_SYNC_FL      /* Synchronous updates */
++#define EXT2_IMMUTABLE_FL             FS_IMMUTABLE_FL /* Immutable file */
++#define EXT2_APPEND_FL                        FS_APPEND_FL    /* writes to file may only append */
++#define EXT2_NODUMP_FL                        FS_NODUMP_FL    /* do not dump file */
++#define EXT2_NOATIME_FL                       FS_NOATIME_FL   /* do not update atime */
++/* Reserved for compression usage... */
++#define EXT2_DIRTY_FL                 FS_DIRTY_FL
++#define EXT2_COMPRBLK_FL              FS_COMPRBLK_FL  /* One or more compressed clusters */
++#define EXT2_NOCOMP_FL                        FS_NOCOMP_FL    /* Don't compress */
++#define EXT2_ECOMPR_FL                        FS_ECOMPR_FL    /* Compression error */
++/* End compression flags --- maybe not all used */
++#define EXT2_BTREE_FL                 FS_BTREE_FL     /* btree format dir */
++#define EXT2_INDEX_FL                 FS_INDEX_FL     /* hash-indexed directory */
++#define EXT2_IMAGIC_FL                        FS_IMAGIC_FL    /* AFS directory */
++#define EXT2_JOURNAL_DATA_FL          FS_JOURNAL_DATA_FL /* Reserved for ext3 */
++#define EXT2_NOTAIL_FL                        FS_NOTAIL_FL    /* file tail should not be merged */
++#define EXT2_DIRSYNC_FL                       FS_DIRSYNC_FL   /* dirsync behaviour (directories only) */
++#define EXT2_TOPDIR_FL                        FS_TOPDIR_FL    /* Top of directory hierarchies*/
++#define EXT2_RESERVED_FL              FS_RESERVED_FL  /* reserved for ext2 lib */
++
++#define EXT2_FL_USER_VISIBLE          FS_FL_USER_VISIBLE      /* User visible flags */
++#define EXT2_FL_USER_MODIFIABLE               FS_FL_USER_MODIFIABLE   /* User modifiable flags */
++
++/* Flags that should be inherited by new inodes from their parent. */
++#define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\
++                         EXT2_SYNC_FL | EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |\
++                         EXT2_NODUMP_FL | EXT2_NOATIME_FL | EXT2_COMPRBLK_FL|\
++                         EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\
++                         EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL)
++
++/* Flags that are appropriate for regular files (all but dir-specific ones). */
++#define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL))
++
++/* Flags that are appropriate for non-directories/regular files. */
++#define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL)
++
++/* Mask out flags that are inappropriate for the given type of inode. */
++static inline uint32_t ext2_mask_flags(mode_t mode, uint32_t flags)
++{
++      if (S_ISDIR(mode))
++              return flags;
++      else if (S_ISREG(mode))
++              return flags & EXT2_REG_FLMASK;
++      else
++              return flags & EXT2_OTHER_FLMASK;
++}
++
++/*
++ * ioctl commands
++ */
++#define       EXT2_IOC_GETFLAGS               FS_IOC_GETFLAGS
++#define       EXT2_IOC_SETFLAGS               FS_IOC_SETFLAGS
++#define       EXT2_IOC_GETVERSION             FS_IOC_GETVERSION
++#define       EXT2_IOC_SETVERSION             FS_IOC_SETVERSION
++#define       EXT2_IOC_GETRSVSZ               _IOR('f', 5, long)
++#define       EXT2_IOC_SETRSVSZ               _IOW('f', 6, long)
++
++/*
++ * ioctl commands in 32 bit emulation
++ */
++#define EXT2_IOC32_GETFLAGS           FS_IOC32_GETFLAGS
++#define EXT2_IOC32_SETFLAGS           FS_IOC32_SETFLAGS
++#define EXT2_IOC32_GETVERSION         FS_IOC32_GETVERSION
++#define EXT2_IOC32_SETVERSION         FS_IOC32_SETVERSION
++
++/*
++ * Structure of an inode on the disk
++ */
++struct ext2_inode {
++      uint16_t        i_mode;         /* File mode */
++      uint16_t        i_uid;          /* Low 16 bits of Owner Uid */
++      uint32_t        i_size;         /* Size in bytes */
++      uint32_t        i_atime;        /* Access time */
++      uint32_t        i_ctime;        /* Creation time */
++      uint32_t        i_mtime;        /* Modification time */
++      uint32_t        i_dtime;        /* Deletion Time */
++      uint16_t        i_gid;          /* Low 16 bits of Group Id */
++      uint16_t        i_links_count;  /* Links count */
++      uint32_t        i_blocks;       /* Blocks count */
++      uint32_t        i_flags;        /* File flags */
++      union {
++              struct {
++                      uint32_t  l_i_reserved1;
++              } linux1;
++              struct {
++                      uint32_t  h_i_translator;
++              } hurd1;
++              struct {
++                      uint32_t  m_i_reserved1;
++              } masix1;
++      } osd1;                         /* OS dependent 1 */
++      uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
++      uint32_t        i_generation;   /* File version (for NFS) */
++      uint32_t        i_file_acl;     /* File ACL */
++      uint32_t        i_dir_acl;      /* Directory ACL */
++      uint32_t        i_faddr;        /* Fragment address */
++      union {
++              struct {
++                      uint8_t l_i_frag;       /* Fragment number */
++                      uint8_t l_i_fsize;      /* Fragment size */
++                      uint16_t        i_pad1;
++                      uint16_t        l_i_uid_high;   /* these 2 fields    */
++                      uint16_t        l_i_gid_high;   /* were reserved2[0] */
++                      uint32_t        l_i_reserved2;
++              } linux2;
++              struct {
++                      uint8_t h_i_frag;       /* Fragment number */
++                      uint8_t h_i_fsize;      /* Fragment size */
++                      uint16_t        h_i_mode_high;
++                      uint16_t        h_i_uid_high;
++                      uint16_t        h_i_gid_high;
++                      uint32_t        h_i_author;
++              } hurd2;
++              struct {
++                      uint8_t m_i_frag;       /* Fragment number */
++                      uint8_t m_i_fsize;      /* Fragment size */
++                      uint16_t        m_pad1;
++                      uint32_t        m_i_reserved2[2];
++              } masix2;
++      } osd2;                         /* OS dependent 2 */
++};
++
++#define i_size_high   i_dir_acl
++
++#if defined(__KERNEL__) || defined(__linux__)
++#define i_reserved1   osd1.linux1.l_i_reserved1
++#define i_frag                osd2.linux2.l_i_frag
++#define i_fsize               osd2.linux2.l_i_fsize
++#define i_uid_low     i_uid
++#define i_gid_low     i_gid
++#define i_uid_high    osd2.linux2.l_i_uid_high
++#define i_gid_high    osd2.linux2.l_i_gid_high
++#define i_reserved2   osd2.linux2.l_i_reserved2
++#endif
++
++#ifdef        __hurd__
++#define i_translator  osd1.hurd1.h_i_translator
++#define i_frag                osd2.hurd2.h_i_frag
++#define i_fsize               osd2.hurd2.h_i_fsize
++#define i_uid_high    osd2.hurd2.h_i_uid_high
++#define i_gid_high    osd2.hurd2.h_i_gid_high
++#define i_author      osd2.hurd2.h_i_author
++#endif
++
++#ifdef        __masix__
++#define i_reserved1   osd1.masix1.m_i_reserved1
++#define i_frag                osd2.masix2.m_i_frag
++#define i_fsize               osd2.masix2.m_i_fsize
++#define i_reserved2   osd2.masix2.m_i_reserved2
++#endif
++
++/*
++ * File system states
++ */
++#define       EXT2_VALID_FS                   0x0001  /* Unmounted cleanly */
++#define       EXT2_ERROR_FS                   0x0002  /* Errors detected */
++
++/*
++ * Mount flags
++ */
++#define EXT2_MOUNT_CHECK              0x000001  /* Do mount-time checks */
++#define EXT2_MOUNT_OLDALLOC           0x000002  /* Don't use the new Orlov allocator */
++#define EXT2_MOUNT_GRPID              0x000004  /* Create files with directory's group */
++#define EXT2_MOUNT_DEBUG              0x000008  /* Some debugging messages */
++#define EXT2_MOUNT_ERRORS_CONT                0x000010  /* Continue on errors */
++#define EXT2_MOUNT_ERRORS_RO          0x000020  /* Remount fs ro on errors */
++#define EXT2_MOUNT_ERRORS_PANIC               0x000040  /* Panic on errors */
++#define EXT2_MOUNT_MINIX_DF           0x000080  /* Mimics the Minix statfs */
++#define EXT2_MOUNT_NOBH                       0x000100  /* No buffer_heads */
++#define EXT2_MOUNT_NO_UID32           0x000200  /* Disable 32-bit UIDs */
++#define EXT2_MOUNT_XATTR_USER         0x004000  /* Extended user attributes */
++#define EXT2_MOUNT_POSIX_ACL          0x008000  /* POSIX Access Control Lists */
++#define EXT2_MOUNT_XIP                        0x010000  /* Execute in place */
++#define EXT2_MOUNT_USRQUOTA           0x020000  /* user quota */
++#define EXT2_MOUNT_GRPQUOTA           0x040000  /* group quota */
++#define EXT2_MOUNT_RESERVATION                0x080000  /* Preallocation */
++
++
++#define clear_opt(o, opt)             o &= ~EXT2_MOUNT_##opt
++#define set_opt(o, opt)                       o |= EXT2_MOUNT_##opt
++#define test_opt(sb, opt)             (EXT2_SB(sb)->s_mount_opt & \
++                                       EXT2_MOUNT_##opt)
++/*
++ * Maximal mount counts between two filesystem checks
++ */
++#define EXT2_DFL_MAX_MNT_COUNT                20      /* Allow 20 mounts */
++#define EXT2_DFL_CHECKINTERVAL                0       /* Don't use interval check */
++
++/*
++ * Behaviour when detecting errors
++ */
++#define EXT2_ERRORS_CONTINUE          1       /* Continue execution */
++#define EXT2_ERRORS_RO                        2       /* Remount fs read-only */
++#define EXT2_ERRORS_PANIC             3       /* Panic */
++#define EXT2_ERRORS_DEFAULT           EXT2_ERRORS_CONTINUE
++
++/*
++ * Structure of the super block
++ */
++struct ext2_super_block {
++      uint32_t        s_inodes_count;         /* Inodes count */
++      uint32_t        s_blocks_count;         /* Blocks count */
++      uint32_t        s_r_blocks_count;       /* Reserved blocks count */
++      uint32_t        s_free_blocks_count;    /* Free blocks count */
++      uint32_t        s_free_inodes_count;    /* Free inodes count */
++      uint32_t        s_first_data_block;     /* First Data Block */
++      uint32_t        s_log_block_size;       /* Block size */
++      uint32_t        s_log_frag_size;        /* Fragment size */
++      uint32_t        s_blocks_per_group;     /* # Blocks per group */
++      uint32_t        s_frags_per_group;      /* # Fragments per group */
++      uint32_t        s_inodes_per_group;     /* # Inodes per group */
++      uint32_t        s_mtime;                /* Mount time */
++      uint32_t        s_wtime;                /* Write time */
++      uint16_t        s_mnt_count;            /* Mount count */
++      uint16_t        s_max_mnt_count;        /* Maximal mount count */
++      uint16_t        s_magic;                /* Magic signature */
++      uint16_t        s_state;                /* File system state */
++      uint16_t        s_errors;               /* Behaviour when detecting errors */
++      uint16_t        s_minor_rev_level;      /* minor revision level */
++      uint32_t        s_lastcheck;            /* time of last check */
++      uint32_t        s_checkinterval;        /* max. time between checks */
++      uint32_t        s_creator_os;           /* OS */
++      uint32_t        s_rev_level;            /* Revision level */
++      uint16_t        s_def_resuid;           /* Default uid for reserved blocks */
++      uint16_t        s_def_resgid;           /* Default gid for reserved blocks */
++      /*
++       * These fields are for EXT2_DYNAMIC_REV superblocks only.
++       *
++       * Note: the difference between the compatible feature set and
++       * the incompatible feature set is that if there is a bit set
++       * in the incompatible feature set that the kernel doesn't
++       * know about, it should refuse to mount the filesystem.
++       *
++       * e2fsck's requirements are more strict; if it doesn't know
++       * about a feature in either the compatible or incompatible
++       * feature set, it must abort and not try to meddle with
++       * things it doesn't understand...
++       */
++      uint32_t        s_first_ino;            /* First non-reserved inode */
++      uint16_t   s_inode_size;                /* size of inode structure */
++      uint16_t        s_block_group_nr;       /* block group # of this superblock */
++      uint32_t        s_feature_compat;       /* compatible feature set */
++      uint32_t        s_feature_incompat;     /* incompatible feature set */
++      uint32_t        s_feature_ro_compat;    /* readonly-compatible feature set */
++      uint8_t s_uuid[16];             /* 128-bit uuid for volume */
++      char    s_volume_name[16];      /* volume name */
++      char    s_last_mounted[64];     /* directory where last mounted */
++      uint32_t        s_algorithm_usage_bitmap; /* For compression */
++      /*
++       * Performance hints.  Directory preallocation should only
++       * happen if the EXT2_COMPAT_PREALLOC flag is on.
++       */
++      uint8_t s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
++      uint8_t s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
++      uint16_t        s_padding1;
++      /*
++       * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
++       */
++      uint8_t s_journal_uuid[16];     /* uuid of journal superblock */
++      uint32_t        s_journal_inum;         /* inode number of journal file */
++      uint32_t        s_journal_dev;          /* device number of journal file */
++      uint32_t        s_last_orphan;          /* start of list of inodes to delete */
++      uint32_t        s_hash_seed[4];         /* HTREE hash seed */
++      uint8_t s_def_hash_version;     /* Default hash version to use */
++      uint8_t s_reserved_char_pad;
++      uint16_t        s_reserved_word_pad;
++      uint32_t        s_default_mount_opts;
++      uint32_t        s_first_meta_bg;        /* First metablock block group */
++      uint32_t        s_reserved[190];        /* Padding to the end of the block */
++};
++
++/*
++ * Codes for operating systems
++ */
++#define EXT2_OS_LINUX         0
++#define EXT2_OS_HURD          1
++#define EXT2_OS_MASIX         2
++#define EXT2_OS_FREEBSD               3
++#define EXT2_OS_LITES         4
++
++/*
++ * Revision levels
++ */
++#define EXT2_GOOD_OLD_REV     0       /* The good old (original) format */
++#define EXT2_DYNAMIC_REV      1       /* V2 format w/ dynamic inode sizes */
++
++#define EXT2_CURRENT_REV      EXT2_GOOD_OLD_REV
++#define EXT2_MAX_SUPP_REV     EXT2_DYNAMIC_REV
++
++#define EXT2_GOOD_OLD_INODE_SIZE 128
++
++/*
++ * Feature set definitions
++ */
++
++#define EXT2_HAS_COMPAT_FEATURE(sb,mask)                      \
++      ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
++#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                   \
++      ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
++#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                    \
++      ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
++#define EXT2_SET_COMPAT_FEATURE(sb,mask)                      \
++      EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
++#define EXT2_SET_RO_COMPAT_FEATURE(sb,mask)                   \
++      EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
++#define EXT2_SET_INCOMPAT_FEATURE(sb,mask)                    \
++      EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
++#define EXT2_CLEAR_COMPAT_FEATURE(sb,mask)                    \
++      EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
++#define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask)                 \
++      EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
++#define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask)                  \
++      EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
++
++#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_COMPAT_ANY                       0xffffffff
++
++#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_RO_COMPAT_ANY            0xffffffff
++
++#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_FEATURE_INCOMPAT_ANY             0xffffffff
++
++#define EXT2_FEATURE_COMPAT_SUPP      EXT2_FEATURE_COMPAT_EXT_ATTR
++#define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE| \
++                                       EXT2_FEATURE_INCOMPAT_META_BG)
++#define EXT2_FEATURE_RO_COMPAT_SUPP   (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
++                                       EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
++                                       EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
++#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED    ~EXT2_FEATURE_RO_COMPAT_SUPP
++#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED     ~EXT2_FEATURE_INCOMPAT_SUPP
++
++/*
++ * Default values for user and/or group using reserved blocks
++ */
++#define       EXT2_DEF_RESUID         0
++#define       EXT2_DEF_RESGID         0
++
++/*
++ * Default mount options
++ */
++#define EXT2_DEFM_DEBUG               0x0001
++#define EXT2_DEFM_BSDGROUPS   0x0002
++#define EXT2_DEFM_XATTR_USER  0x0004
++#define EXT2_DEFM_ACL         0x0008
++#define EXT2_DEFM_UID16               0x0010
++    /* Not used by ext2, but reserved for use by ext3 */
++#define EXT3_DEFM_JMODE               0x0060 
++#define EXT3_DEFM_JMODE_DATA  0x0020
++#define EXT3_DEFM_JMODE_ORDERED       0x0040
++#define EXT3_DEFM_JMODE_WBACK 0x0060
++
++/*
++ * Structure of a directory entry
++ */
++#define EXT2_NAME_LEN 255
++
++struct ext2_dir_entry {
++      uint32_t        inode;                  /* Inode number */
++      uint16_t        rec_len;                /* Directory entry length */
++      uint16_t        name_len;               /* Name length */
++      char    name[EXT2_NAME_LEN];    /* File name */
++};
++
++/*
++ * The new version of the directory entry.  Since EXT2 structures are
++ * stored in intel byte order, and the name_len field could never be
++ * bigger than 255 chars, it's safe to reclaim the extra byte for the
++ * file_type field.
++ */
++struct ext2_dir_entry_2 {
++      uint32_t        inode;                  /* Inode number */
++      uint16_t        rec_len;                /* Directory entry length */
++      uint8_t name_len;               /* Name length */
++      uint8_t file_type;
++      char    name[EXT2_NAME_LEN];    /* File name */
++};
++
++/*
++ * Ext2 directory file types.  Only the low 3 bits are used.  The
++ * other bits are reserved for now.
++ */
++enum {
++      EXT2_FT_UNKNOWN         = 0,
++      EXT2_FT_REG_FILE        = 1,
++      EXT2_FT_DIR             = 2,
++      EXT2_FT_CHRDEV          = 3,
++      EXT2_FT_BLKDEV          = 4,
++      EXT2_FT_FIFO            = 5,
++      EXT2_FT_SOCK            = 6,
++      EXT2_FT_SYMLINK         = 7,
++      EXT2_FT_MAX
++};
++
++/*
++ * EXT2_DIR_PAD defines the directory entries boundaries
++ *
++ * NOTE: It must be a multiple of 4
++ */
++#define EXT2_DIR_PAD                  4
++#define EXT2_DIR_ROUND                        (EXT2_DIR_PAD - 1)
++#define EXT2_DIR_REC_LEN(name_len)    (((name_len) + 8 + EXT2_DIR_ROUND) & \
++                                       ~EXT2_DIR_ROUND)
++#define EXT2_MAX_REC_LEN              ((1<<16)-1)
++
++#endif
+diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c
+index 759bb0a..2d9d720 100644
+--- a/util-linux/mkfs_ext2.c
++++ b/util-linux/mkfs_ext2.c
+@@ -48,13 +48,7 @@
+ #include "libbb.h"
+ #include <linux/fs.h>
+-/*
+- * Work around linux/ext2_fs.h breakage.
+- * See https://bugzilla.kernel.org/show_bug.cgi?id=42986.
+- */
+-typedef mode_t bb__umode_t;
+-#define umode_t bb__umode_t
+-#include <linux/ext2_fs.h>
++#include "bb_linux_ext2_fs.h"
+ #define ENABLE_FEATURE_MKFS_EXT2_RESERVED_GDT 0
+ #define ENABLE_FEATURE_MKFS_EXT2_DIR_INDEX    1
+-- 
+1.7.9.5
+
index 75015e3..d0ca655 100644 (file)
@@ -1,7 +1,7 @@
 From e5221a142e8ee4509734c17584f898a1f4ac86cc Mon Sep 17 00:00:00 2001
 From: Denys Vlasenko <vda.linux@googlemail.com>
 Date: Wed, 19 Oct 2011 02:37:08 +0200
-Subject: [PATCH 2/9] ifupdown: code shrink
+Subject: [PATCH 2/6] ifupdown: code shrink
 
 function                                             old     new   delta
 keywords_up_down                                       -      43     +43
diff --git a/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0003-Drop-include-bb_linux_ext2_fs.h-use-existing-e2fspro.patch b/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/0003-Drop-include-bb_linux_ext2_fs.h-use-existing-e2fspro.patch
new file mode 100644 (file)
index 0000000..2a3b21b
--- /dev/null
@@ -0,0 +1,1877 @@
+From 176bc344751dfc41e87976182381ae0560c94f22 Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux@googlemail.com>
+Date: Tue, 17 Apr 2012 15:06:55 +0200
+Subject: [PATCH 04/32] Drop include/bb_linux_ext2_fs.h, use existing
+ e2fsprogs/e2fs_defs.h
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ e2fsprogs/e2fs_defs.h                       |  561 ---------------------------
+ e2fsprogs/e2fs_lib.h                        |    2 +-
+ e2fsprogs/old_e2fsprogs/e2fsck.c            |    6 +-
+ e2fsprogs/old_e2fsprogs/e2p/feature.c       |    2 +-
+ e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h    |    2 +-
+ e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h     |    2 +-
+ e2fsprogs/old_e2fsprogs/ext2fs/initialize.c |    2 +-
+ e2fsprogs/old_e2fsprogs/mke2fs.c            |    8 +-
+ e2fsprogs/tune2fs.c                         |    2 +-
+ include/bb_e2fs_defs.h                      |  561 +++++++++++++++++++++++++++
+ include/bb_linux_ext2_fs.h                  |  547 --------------------------
+ util-linux/mkfs_ext2.c                      |    2 +-
+ 12 files changed, 575 insertions(+), 1122 deletions(-)
+ delete mode 100644 e2fsprogs/e2fs_defs.h
+ create mode 100644 include/bb_e2fs_defs.h
+ delete mode 100644 include/bb_linux_ext2_fs.h
+
+diff --git a/e2fsprogs/e2fs_defs.h b/e2fsprogs/e2fs_defs.h
+deleted file mode 100644
+index 379640e..0000000
+--- a/e2fsprogs/e2fs_defs.h
++++ /dev/null
+@@ -1,561 +0,0 @@
+-/* vi: set sw=4 ts=4: */
+-/*
+- *  linux/include/linux/ext2_fs.h
+- *
+- * Copyright (C) 1992, 1993, 1994, 1995
+- * Remy Card (card@masi.ibp.fr)
+- * Laboratoire MASI - Institut Blaise Pascal
+- * Universite Pierre et Marie Curie (Paris VI)
+- *
+- * Copyright (C) 1991, 1992  Linus Torvalds
+- */
+-
+-#ifndef LINUX_EXT2_FS_H
+-#define LINUX_EXT2_FS_H 1
+-
+-/*
+- * Special inode numbers
+- */
+-#define EXT2_BAD_INO           1      /* Bad blocks inode */
+-#define EXT2_ROOT_INO          2      /* Root inode */
+-#define EXT2_ACL_IDX_INO       3      /* ACL inode */
+-#define EXT2_ACL_DATA_INO      4      /* ACL inode */
+-#define EXT2_BOOT_LOADER_INO   5      /* Boot loader inode */
+-#define EXT2_UNDEL_DIR_INO     6      /* Undelete directory inode */
+-#define EXT2_RESIZE_INO                7      /* Reserved group descriptors inode */
+-#define EXT2_JOURNAL_INO       8      /* Journal inode */
+-
+-/* First non-reserved inode for old ext2 filesystems */
+-#define EXT2_GOOD_OLD_FIRST_INO       11
+-
+-/*
+- * The second extended file system magic number
+- */
+-#define EXT2_SUPER_MAGIC      0xEF53
+-
+-/* Assume that user mode programs are passing in an ext2fs superblock, not
+- * a kernel struct super_block.  This will allow us to call the feature-test
+- * macros from user land. */
+-#define EXT2_SB(sb)   (sb)
+-
+-/*
+- * Maximal count of links to a file
+- */
+-#define EXT2_LINK_MAX         32000
+-
+-/*
+- * Macro-instructions used to manage several block sizes
+- */
+-#define EXT2_MIN_BLOCK_LOG_SIZE               10      /* 1024 */
+-#define EXT2_MAX_BLOCK_LOG_SIZE               16      /* 65536 */
+-#define EXT2_MIN_BLOCK_SIZE   (1 << EXT2_MIN_BLOCK_LOG_SIZE)
+-#define EXT2_MAX_BLOCK_SIZE   (1 << EXT2_MAX_BLOCK_LOG_SIZE)
+-#define EXT2_BLOCK_SIZE(s)    (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
+-#define EXT2_BLOCK_SIZE_BITS(s)       ((s)->s_log_block_size + 10)
+-#define EXT2_INODE_SIZE(s)    (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
+-                               EXT2_GOOD_OLD_INODE_SIZE : (s)->s_inode_size)
+-#define EXT2_FIRST_INO(s)     (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
+-                               EXT2_GOOD_OLD_FIRST_INO : (s)->s_first_ino)
+-#define EXT2_ADDR_PER_BLOCK(s)        (EXT2_BLOCK_SIZE(s) / sizeof(uint32_t))
+-
+-/*
+- * Macro-instructions used to manage fragments
+- */
+-#define EXT2_MIN_FRAG_SIZE            EXT2_MIN_BLOCK_SIZE
+-#define EXT2_MAX_FRAG_SIZE            EXT2_MAX_BLOCK_SIZE
+-#define EXT2_MIN_FRAG_LOG_SIZE                EXT2_MIN_BLOCK_LOG_SIZE
+-#define EXT2_FRAG_SIZE(s)             (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
+-#define EXT2_FRAGS_PER_BLOCK(s)               (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
+-
+-/*
+- * ACL structures
+- */
+-struct ext2_acl_header {      /* Header of Access Control Lists */
+-      uint32_t        aclh_size;
+-      uint32_t        aclh_file_count;
+-      uint32_t        aclh_acle_count;
+-      uint32_t        aclh_first_acle;
+-};
+-
+-struct ext2_acl_entry {       /* Access Control List Entry */
+-      uint32_t        acle_size;
+-      uint16_t        acle_perms;     /* Access permissions */
+-      uint16_t        acle_type;      /* Type of entry */
+-      uint16_t        acle_tag;       /* User or group identity */
+-      uint16_t        acle_pad1;
+-      uint32_t        acle_next;      /* Pointer on next entry for the */
+-                                      /* same inode or on next free entry */
+-};
+-
+-/*
+- * Structure of a blocks group descriptor
+- */
+-struct ext2_group_desc {
+-      uint32_t        bg_block_bitmap;        /* Blocks bitmap block */
+-      uint32_t        bg_inode_bitmap;        /* Inodes bitmap block */
+-      uint32_t        bg_inode_table;         /* Inodes table block */
+-      uint16_t        bg_free_blocks_count;   /* Free blocks count */
+-      uint16_t        bg_free_inodes_count;   /* Free inodes count */
+-      uint16_t        bg_used_dirs_count;     /* Directories count */
+-      uint16_t        bg_pad;
+-      uint32_t        bg_reserved[3];
+-};
+-
+-/*
+- * Data structures used by the directory indexing feature
+- *
+- * Note: all of the multibyte integer fields are little endian.
+- */
+-
+-/*
+- * Note: dx_root_info is laid out so that if it should somehow get
+- * overlaid by a dirent the two low bits of the hash version will be
+- * zero.  Therefore, the hash version mod 4 should never be 0.
+- * Sincerely, the paranoia department.
+- */
+-struct ext2_dx_root_info {
+-      uint32_t        reserved_zero;
+-      uint8_t         hash_version; /* 0 now, 1 at release */
+-      uint8_t         info_length; /* 8 */
+-      uint8_t         indirect_levels;
+-      uint8_t         unused_flags;
+-};
+-
+-#define EXT2_HASH_LEGACY      0
+-#define EXT2_HASH_HALF_MD4    1
+-#define EXT2_HASH_TEA         2
+-
+-#define EXT2_HASH_FLAG_INCOMPAT       0x1
+-
+-struct ext2_dx_entry {
+-      uint32_t hash;
+-      uint32_t block;
+-};
+-
+-struct ext2_dx_countlimit {
+-      uint16_t limit;
+-      uint16_t count;
+-};
+-
+-
+-/*
+- * Macro-instructions used to manage group descriptors
+- */
+-#define EXT2_BLOCKS_PER_GROUP(s)      (EXT2_SB(s)->s_blocks_per_group)
+-#define EXT2_INODES_PER_GROUP(s)      (EXT2_SB(s)->s_inodes_per_group)
+-#define EXT2_INODES_PER_BLOCK(s)      (EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
+-/* limits imposed by 16-bit value gd_free_{blocks,inode}_count */
+-#define EXT2_MAX_BLOCKS_PER_GROUP(s)  ((1 << 16) - 8)
+-#define EXT2_MAX_INODES_PER_GROUP(s)  ((1 << 16) - EXT2_INODES_PER_BLOCK(s))
+-#define EXT2_DESC_PER_BLOCK(s)                (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
+-
+-/*
+- * Constants relative to the data blocks
+- */
+-#define EXT2_NDIR_BLOCKS              12
+-#define EXT2_IND_BLOCK                        EXT2_NDIR_BLOCKS
+-#define EXT2_DIND_BLOCK                       (EXT2_IND_BLOCK + 1)
+-#define EXT2_TIND_BLOCK                       (EXT2_DIND_BLOCK + 1)
+-#define EXT2_N_BLOCKS                 (EXT2_TIND_BLOCK + 1)
+-
+-/*
+- * Inode flags
+- */
+-#define EXT2_SECRM_FL                 0x00000001 /* Secure deletion */
+-#define EXT2_UNRM_FL                  0x00000002 /* Undelete */
+-#define EXT2_COMPR_FL                 0x00000004 /* Compress file */
+-#define EXT2_SYNC_FL                  0x00000008 /* Synchronous updates */
+-#define EXT2_IMMUTABLE_FL             0x00000010 /* Immutable file */
+-#define EXT2_APPEND_FL                        0x00000020 /* writes to file may only append */
+-#define EXT2_NODUMP_FL                        0x00000040 /* do not dump file */
+-#define EXT2_NOATIME_FL                       0x00000080 /* do not update atime */
+-/* Reserved for compression usage... */
+-#define EXT2_DIRTY_FL                 0x00000100
+-#define EXT2_COMPRBLK_FL              0x00000200 /* One or more compressed clusters */
+-#define EXT2_NOCOMPR_FL                       0x00000400 /* Access raw compressed data */
+-#define EXT2_ECOMPR_FL                        0x00000800 /* Compression error */
+-/* End compression flags --- maybe not all used */
+-#define EXT2_BTREE_FL                 0x00001000 /* btree format dir */
+-#define EXT2_INDEX_FL                 0x00001000 /* hash-indexed directory */
+-#define EXT2_IMAGIC_FL                        0x00002000
+-#define EXT3_JOURNAL_DATA_FL          0x00004000 /* file data should be journaled */
+-#define EXT2_NOTAIL_FL                        0x00008000 /* file tail should not be merged */
+-#define EXT2_DIRSYNC_FL                       0x00010000 /* Synchronous directory modifications */
+-#define EXT2_TOPDIR_FL                        0x00020000 /* Top of directory hierarchies*/
+-#define EXT3_EXTENTS_FL                       0x00080000 /* Inode uses extents */
+-#define EXT2_RESERVED_FL              0x80000000 /* reserved for ext2 lib */
+-
+-#define EXT2_FL_USER_VISIBLE          0x0003DFFF /* User visible flags */
+-#define EXT2_FL_USER_MODIFIABLE               0x000080FF /* User modifiable flags */
+-
+-/*
+- * ioctl commands
+- */
+-#define EXT2_IOC_GETFLAGS             _IOR('f', 1, long)
+-#define EXT2_IOC_SETFLAGS             _IOW('f', 2, long)
+-#define EXT2_IOC_GETVERSION           _IOR('v', 1, long)
+-#define EXT2_IOC_SETVERSION           _IOW('v', 2, long)
+-
+-/*
+- * Structure of an inode on the disk
+- */
+-struct ext2_inode {
+-      uint16_t        i_mode;         /* File mode */
+-      uint16_t        i_uid;          /* Low 16 bits of Owner Uid */
+-      uint32_t        i_size;         /* Size in bytes */
+-      uint32_t        i_atime;        /* Access time */
+-      uint32_t        i_ctime;        /* Creation time */
+-      uint32_t        i_mtime;        /* Modification time */
+-      uint32_t        i_dtime;        /* Deletion Time */
+-      uint16_t        i_gid;          /* Low 16 bits of Group Id */
+-      uint16_t        i_links_count;  /* Links count */
+-      uint32_t        i_blocks;       /* Blocks count */
+-      uint32_t        i_flags;        /* File flags */
+-      union {
+-              struct {
+-                      uint32_t  l_i_reserved1;
+-              } linux1;
+-              struct {
+-                      uint32_t  h_i_translator;
+-              } hurd1;
+-              struct {
+-                      uint32_t  m_i_reserved1;
+-              } masix1;
+-      } osd1;                         /* OS dependent 1 */
+-      uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+-      uint32_t        i_generation;   /* File version (for NFS) */
+-      uint32_t        i_file_acl;     /* File ACL */
+-      uint32_t        i_dir_acl;      /* Directory ACL */
+-      uint32_t        i_faddr;        /* Fragment address */
+-      union {
+-              struct {
+-                      uint8_t         l_i_frag;       /* Fragment number */
+-                      uint8_t         l_i_fsize;      /* Fragment size */
+-                      uint16_t        i_pad1;
+-                      uint16_t        l_i_uid_high;   /* these 2 fields    */
+-                      uint16_t        l_i_gid_high;   /* were reserved2[0] */
+-                      uint32_t        l_i_reserved2;
+-              } linux2;
+-              struct {
+-                      uint8_t         h_i_frag;       /* Fragment number */
+-                      uint8_t         h_i_fsize;      /* Fragment size */
+-                      uint16_t        h_i_mode_high;
+-                      uint16_t        h_i_uid_high;
+-                      uint16_t        h_i_gid_high;
+-                      uint32_t        h_i_author;
+-              } hurd2;
+-              struct {
+-                      uint8_t         m_i_frag;       /* Fragment number */
+-                      uint8_t         m_i_fsize;      /* Fragment size */
+-                      uint16_t        m_pad1;
+-                      uint32_t        m_i_reserved2[2];
+-              } masix2;
+-      } osd2;                         /* OS dependent 2 */
+-};
+-
+-/*
+- * Permanent part of an large inode on the disk
+- */
+-struct ext2_inode_large {
+-      uint16_t        i_mode;         /* File mode */
+-      uint16_t        i_uid;          /* Low 16 bits of Owner Uid */
+-      uint32_t        i_size;         /* Size in bytes */
+-      uint32_t        i_atime;        /* Access time */
+-      uint32_t        i_ctime;        /* Creation time */
+-      uint32_t        i_mtime;        /* Modification time */
+-      uint32_t        i_dtime;        /* Deletion Time */
+-      uint16_t        i_gid;          /* Low 16 bits of Group Id */
+-      uint16_t        i_links_count;  /* Links count */
+-      uint32_t        i_blocks;       /* Blocks count */
+-      uint32_t        i_flags;        /* File flags */
+-      union {
+-              struct {
+-                      uint32_t  l_i_reserved1;
+-              } linux1;
+-              struct {
+-                      uint32_t  h_i_translator;
+-              } hurd1;
+-              struct {
+-                      uint32_t  m_i_reserved1;
+-              } masix1;
+-      } osd1;                         /* OS dependent 1 */
+-      uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+-      uint32_t        i_generation;   /* File version (for NFS) */
+-      uint32_t        i_file_acl;     /* File ACL */
+-      uint32_t        i_dir_acl;      /* Directory ACL */
+-      uint32_t        i_faddr;        /* Fragment address */
+-      union {
+-              struct {
+-                      uint8_t         l_i_frag;       /* Fragment number */
+-                      uint8_t         l_i_fsize;      /* Fragment size */
+-                      uint16_t        i_pad1;
+-                      uint16_t        l_i_uid_high;   /* these 2 fields    */
+-                      uint16_t        l_i_gid_high;   /* were reserved2[0] */
+-                      uint32_t        l_i_reserved2;
+-              } linux2;
+-              struct {
+-                      uint8_t         h_i_frag;       /* Fragment number */
+-                      uint8_t         h_i_fsize;      /* Fragment size */
+-                      uint16_t        h_i_mode_high;
+-                      uint16_t        h_i_uid_high;
+-                      uint16_t        h_i_gid_high;
+-                      uint32_t        h_i_author;
+-              } hurd2;
+-              struct {
+-                      uint8_t         m_i_frag;       /* Fragment number */
+-                      uint8_t         m_i_fsize;      /* Fragment size */
+-                      uint16_t        m_pad1;
+-                      uint32_t        m_i_reserved2[2];
+-              } masix2;
+-      } osd2;                         /* OS dependent 2 */
+-      uint16_t        i_extra_isize;
+-      uint16_t        i_pad1;
+-};
+-
+-#define i_size_high   i_dir_acl
+-
+-/*
+- * File system states
+- */
+-#define EXT2_VALID_FS                 0x0001  /* Unmounted cleanly */
+-#define EXT2_ERROR_FS                 0x0002  /* Errors detected */
+-
+-/*
+- * Mount flags
+- */
+-#define EXT2_MOUNT_CHECK              0x0001  /* Do mount-time checks */
+-#define EXT2_MOUNT_GRPID              0x0004  /* Create files with directory's group */
+-#define EXT2_MOUNT_DEBUG              0x0008  /* Some debugging messages */
+-#define EXT2_MOUNT_ERRORS_CONT                0x0010  /* Continue on errors */
+-#define EXT2_MOUNT_ERRORS_RO          0x0020  /* Remount fs ro on errors */
+-#define EXT2_MOUNT_ERRORS_PANIC               0x0040  /* Panic on errors */
+-#define EXT2_MOUNT_MINIX_DF           0x0080  /* Mimics the Minix statfs */
+-#define EXT2_MOUNT_NO_UID32           0x0200  /* Disable 32-bit UIDs */
+-
+-#define clear_opt(o, opt)             o &= ~EXT2_MOUNT_##opt
+-#define set_opt(o, opt)                       o |= EXT2_MOUNT_##opt
+-#define test_opt(sb, opt)             (EXT2_SB(sb)->s_mount_opt & \
+-                                       EXT2_MOUNT_##opt)
+-/*
+- * Maximal mount counts between two filesystem checks
+- */
+-#define EXT2_DFL_MAX_MNT_COUNT                20      /* Allow 20 mounts */
+-#define EXT2_DFL_CHECKINTERVAL                0       /* Don't use interval check */
+-
+-/*
+- * Behaviour when detecting errors
+- */
+-#define EXT2_ERRORS_CONTINUE          1       /* Continue execution */
+-#define EXT2_ERRORS_RO                        2       /* Remount fs read-only */
+-#define EXT2_ERRORS_PANIC             3       /* Panic */
+-#define EXT2_ERRORS_DEFAULT           EXT2_ERRORS_CONTINUE
+-
+-/*
+- * Structure of the super block
+- */
+-struct ext2_super_block {
+-      uint32_t        s_inodes_count;         /* Inodes count */
+-      uint32_t        s_blocks_count;         /* Blocks count */
+-      uint32_t        s_r_blocks_count;       /* Reserved blocks count */
+-      uint32_t        s_free_blocks_count;    /* Free blocks count */
+-      uint32_t        s_free_inodes_count;    /* Free inodes count */
+-      uint32_t        s_first_data_block;     /* First Data Block */
+-      uint32_t        s_log_block_size;       /* Block size */
+-      int32_t         s_log_frag_size;        /* Fragment size */
+-      uint32_t        s_blocks_per_group;     /* # Blocks per group */
+-      uint32_t        s_frags_per_group;      /* # Fragments per group */
+-      uint32_t        s_inodes_per_group;     /* # Inodes per group */
+-      uint32_t        s_mtime;                /* Mount time */
+-      uint32_t        s_wtime;                /* Write time */
+-      uint16_t        s_mnt_count;            /* Mount count */
+-      int16_t         s_max_mnt_count;        /* Maximal mount count */
+-      uint16_t        s_magic;                /* Magic signature */
+-      uint16_t        s_state;                /* File system state */
+-      uint16_t        s_errors;               /* Behaviour when detecting errors */
+-      uint16_t        s_minor_rev_level;      /* minor revision level */
+-      uint32_t        s_lastcheck;            /* time of last check */
+-      uint32_t        s_checkinterval;        /* max. time between checks */
+-      uint32_t        s_creator_os;           /* OS */
+-      uint32_t        s_rev_level;            /* Revision level */
+-      uint16_t        s_def_resuid;           /* Default uid for reserved blocks */
+-      uint16_t        s_def_resgid;           /* Default gid for reserved blocks */
+-      /*
+-       * These fields are for EXT2_DYNAMIC_REV superblocks only.
+-       *
+-       * Note: the difference between the compatible feature set and
+-       * the incompatible feature set is that if there is a bit set
+-       * in the incompatible feature set that the kernel doesn't
+-       * know about, it should refuse to mount the filesystem.
+-       *
+-       * e2fsck's requirements are more strict; if it doesn't know
+-       * about a feature in either the compatible or incompatible
+-       * feature set, it must abort and not try to meddle with
+-       * things it doesn't understand...
+-       */
+-      uint32_t        s_first_ino;            /* First non-reserved inode */
+-      uint16_t        s_inode_size;           /* size of inode structure */
+-      uint16_t        s_block_group_nr;       /* block group # of this superblock */
+-      uint32_t        s_feature_compat;       /* compatible feature set */
+-      uint32_t        s_feature_incompat;     /* incompatible feature set */
+-      uint32_t        s_feature_ro_compat;    /* readonly-compatible feature set */
+-      uint8_t         s_uuid[16];             /* 128-bit uuid for volume */
+-      char            s_volume_name[16];      /* volume name */
+-      char            s_last_mounted[64];     /* directory where last mounted */
+-      uint32_t        s_algorithm_usage_bitmap; /* For compression */
+-      /*
+-       * Performance hints.  Directory preallocation should only
+-       * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
+-       */
+-      uint8_t s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
+-      uint8_t s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
+-      uint16_t        s_reserved_gdt_blocks;  /* Per group table for online growth */
+-      /*
+-       * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
+-       */
+-      uint8_t         s_journal_uuid[16];     /* uuid of journal superblock */
+-      uint32_t        s_journal_inum;         /* inode number of journal file */
+-      uint32_t        s_journal_dev;          /* device number of journal file */
+-      uint32_t        s_last_orphan;          /* start of list of inodes to delete */
+-      uint32_t        s_hash_seed[4];         /* HTREE hash seed */
+-      uint8_t         s_def_hash_version;     /* Default hash version to use */
+-      uint8_t         s_jnl_backup_type;      /* Default type of journal backup */
+-      uint16_t        s_reserved_word_pad;
+-      uint32_t        s_default_mount_opts;
+-      uint32_t        s_first_meta_bg;        /* First metablock group */
+-      uint32_t        s_mkfs_time;            /* When the filesystem was created */
+-      uint32_t        s_jnl_blocks[17];       /* Backup of the journal inode */
+-      uint32_t        s_reserved[172];        /* Padding to the end of the block */
+-};
+-
+-/*
+- * Codes for operating systems
+- */
+-#define EXT2_OS_LINUX         0
+-#define EXT2_OS_HURD          1
+-#define EXT2_OS_MASIX         2
+-#define EXT2_OS_FREEBSD               3
+-#define EXT2_OS_LITES         4
+-
+-/*
+- * Revision levels
+- */
+-#define EXT2_GOOD_OLD_REV     0       /* The good old (original) format */
+-#define EXT2_DYNAMIC_REV      1       /* V2 format w/ dynamic inode sizes */
+-
+-#define EXT2_CURRENT_REV      EXT2_GOOD_OLD_REV
+-#define EXT2_MAX_SUPP_REV     EXT2_DYNAMIC_REV
+-
+-#define EXT2_GOOD_OLD_INODE_SIZE 128
+-
+-/*
+- * Journal inode backup types
+- */
+-#define EXT3_JNL_BACKUP_BLOCKS        1
+-
+-/*
+- * Feature set definitions
+- */
+-
+-#define EXT2_HAS_COMPAT_FEATURE(sb,mask)                      \
+-      ( EXT2_SB(sb)->s_feature_compat & (mask) )
+-#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                   \
+-      ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
+-#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                    \
+-      ( EXT2_SB(sb)->s_feature_incompat & (mask) )
+-
+-#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_INODE      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 not used */
+-
+-#define EXT2_FEATURE_INCOMPAT_COMPRESSION     0x0001
+-#define EXT2_FEATURE_INCOMPAT_FILETYPE                0x0002
+-#define EXT3_FEATURE_INCOMPAT_RECOVER         0x0004 /* Needs recovery */
+-#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV     0x0008 /* Journal device */
+-#define EXT2_FEATURE_INCOMPAT_META_BG         0x0010
+-#define EXT3_FEATURE_INCOMPAT_EXTENTS         0x0040
+-
+-
+-#define EXT2_FEATURE_COMPAT_SUPP      0
+-#define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE)
+-#define EXT2_FEATURE_RO_COMPAT_SUPP   (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+-                                       EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+-                                       EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+-
+-/*
+- * Default values for user and/or group using reserved blocks
+- */
+-#define EXT2_DEF_RESUID               0
+-#define EXT2_DEF_RESGID               0
+-
+-/*
+- * Default mount options
+- */
+-#define EXT2_DEFM_DEBUG               0x0001
+-#define EXT2_DEFM_BSDGROUPS   0x0002
+-#define EXT2_DEFM_XATTR_USER  0x0004
+-#define EXT2_DEFM_ACL         0x0008
+-#define EXT2_DEFM_UID16               0x0010
+-#define EXT3_DEFM_JMODE               0x0060
+-#define EXT3_DEFM_JMODE_DATA  0x0020
+-#define EXT3_DEFM_JMODE_ORDERED       0x0040
+-#define EXT3_DEFM_JMODE_WBACK 0x0060
+-
+-/*
+- * Structure of a directory entry
+- */
+-#define EXT2_NAME_LEN 255
+-
+-struct ext2_dir_entry {
+-      uint32_t        inode;                  /* Inode number */
+-      uint16_t        rec_len;                /* Directory entry length */
+-      uint16_t        name_len;               /* Name length */
+-      char            name[EXT2_NAME_LEN];    /* File name */
+-};
+-
+-/*
+- * The new version of the directory entry.  Since EXT2 structures are
+- * stored in intel byte order, and the name_len field could never be
+- * bigger than 255 chars, it's safe to reclaim the extra byte for the
+- * file_type field.
+- */
+-struct ext2_dir_entry_2 {
+-      uint32_t        inode;                  /* Inode number */
+-      uint16_t        rec_len;                /* Directory entry length */
+-      uint8_t         name_len;               /* Name length */
+-      uint8_t         file_type;
+-      char            name[EXT2_NAME_LEN];    /* File name */
+-};
+-
+-/*
+- * Ext2 directory file types.  Only the low 3 bits are used.  The
+- * other bits are reserved for now.
+- */
+-#define EXT2_FT_UNKNOWN               0
+-#define EXT2_FT_REG_FILE      1
+-#define EXT2_FT_DIR           2
+-#define EXT2_FT_CHRDEV                3
+-#define EXT2_FT_BLKDEV                4
+-#define EXT2_FT_FIFO          5
+-#define EXT2_FT_SOCK          6
+-#define EXT2_FT_SYMLINK               7
+-
+-#define EXT2_FT_MAX           8
+-
+-/*
+- * EXT2_DIR_PAD defines the directory entries boundaries
+- *
+- * NOTE: It must be a multiple of 4
+- */
+-#define EXT2_DIR_PAD                  4
+-#define EXT2_DIR_ROUND                        (EXT2_DIR_PAD - 1)
+-#define EXT2_DIR_REC_LEN(name_len)    (((name_len) + 8 + EXT2_DIR_ROUND) & \
+-                                       ~EXT2_DIR_ROUND)
+-
+-#endif
+diff --git a/e2fsprogs/e2fs_lib.h b/e2fsprogs/e2fs_lib.h
+index 3905ee7..f2ae56f 100644
+--- a/e2fsprogs/e2fs_lib.h
++++ b/e2fsprogs/e2fs_lib.h
+@@ -7,7 +7,7 @@
+  */
+ /* Constants and structures */
+-#include "e2fs_defs.h"
++#include "bb_e2fs_defs.h"
+ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
+diff --git a/e2fsprogs/old_e2fsprogs/e2fsck.c b/e2fsprogs/old_e2fsprogs/e2fsck.c
+index 8fffa7f..373e8ce 100644
+--- a/e2fsprogs/old_e2fsprogs/e2fsck.c
++++ b/e2fsprogs/old_e2fsprogs/e2fsck.c
+@@ -11577,7 +11577,7 @@ static void check_resize_inode(e2fsck_t ctx)
+        * s_reserved_gdt_blocks must be zero.
+        */
+       if (!(fs->super->s_feature_compat &
+-            EXT2_FEATURE_COMPAT_RESIZE_INODE)) {
++            EXT2_FEATURE_COMPAT_RESIZE_INO)) {
+               if (fs->super->s_reserved_gdt_blocks) {
+                       pctx.num = fs->super->s_reserved_gdt_blocks;
+                       if (fix_problem(ctx, PR_0_NONZERO_RESERVED_GDT_BLOCKS,
+@@ -11593,7 +11593,7 @@ static void check_resize_inode(e2fsck_t ctx)
+       retval = ext2fs_read_inode(fs, EXT2_RESIZE_INO, &inode);
+       if (retval) {
+               if (fs->super->s_feature_compat &
+-                  EXT2_FEATURE_COMPAT_RESIZE_INODE)
++                  EXT2_FEATURE_COMPAT_RESIZE_INO)
+                       ctx->flags |= E2F_FLAG_RESIZE_INODE;
+               return;
+       }
+@@ -11603,7 +11603,7 @@ static void check_resize_inode(e2fsck_t ctx)
+        * the resize inode is cleared; then we're done.
+        */
+       if (!(fs->super->s_feature_compat &
+-            EXT2_FEATURE_COMPAT_RESIZE_INODE)) {
++            EXT2_FEATURE_COMPAT_RESIZE_INO)) {
+               for (i=0; i < EXT2_N_BLOCKS; i++) {
+                       if (inode.i_block[i])
+                               break;
+diff --git a/e2fsprogs/old_e2fsprogs/e2p/feature.c b/e2fsprogs/old_e2fsprogs/e2p/feature.c
+index b45754f..2102ed8 100644
+--- a/e2fsprogs/old_e2fsprogs/e2p/feature.c
++++ b/e2fsprogs/old_e2fsprogs/e2p/feature.c
+@@ -34,7 +34,7 @@ static const struct feature feature_list[] = {
+                       "ext_attr" },
+       {       E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_DIR_INDEX,
+                       "dir_index" },
+-      {       E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_RESIZE_INODE,
++      {       E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_RESIZE_INO,
+                       "resize_inode" },
+       {       E2P_FEATURE_RO_INCOMPAT, EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER,
+                       "sparse_super" },
+diff --git a/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h b/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h
+index 6f4f708..80ea2cb 100644
+--- a/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h
++++ b/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h
+@@ -475,7 +475,7 @@ struct ext2_super_block {
+ #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_INODE      0x0010
++#define EXT2_FEATURE_COMPAT_RESIZE_INO                0x0010
+ #define EXT2_FEATURE_COMPAT_DIR_INDEX         0x0020
+ #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER   0x0001
+diff --git a/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h b/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h
+index 9f77201..39fb116 100644
+--- a/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h
++++ b/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h
+@@ -383,7 +383,7 @@ typedef struct ext2_icount *ext2_icount_t;
+ #define EXT2_LIB_FEATURE_COMPAT_SUPP  (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
+                                        EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
+                                        EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
+-                                       EXT2_FEATURE_COMPAT_RESIZE_INODE|\
++                                       EXT2_FEATURE_COMPAT_RESIZE_INO|\
+                                        EXT2_FEATURE_COMPAT_DIR_INDEX|\
+                                        EXT2_FEATURE_COMPAT_EXT_ATTR)
+diff --git a/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c b/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c
+index ef1d343..da2d151 100644
+--- a/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c
++++ b/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c
+@@ -284,7 +284,7 @@ retry:
+       /*
+        * check the number of reserved group descriptor table blocks
+        */
+-      if (super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE)
++      if (super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INO)
+               rsv_gdt = calc_reserved_gdt_blocks(fs);
+       else
+               rsv_gdt = 0;
+diff --git a/e2fsprogs/old_e2fsprogs/mke2fs.c b/e2fsprogs/old_e2fsprogs/mke2fs.c
+index 7555650..35d717a 100644
+--- a/e2fsprogs/old_e2fsprogs/mke2fs.c
++++ b/e2fsprogs/old_e2fsprogs/mke2fs.c
+@@ -757,7 +757,7 @@ static void parse_extended_opts(struct ext2_super_block *sb_param,
+                       if (rsv_gdb > 0) {
+                               sb_param->s_feature_compat |=
+-                                      EXT2_FEATURE_COMPAT_RESIZE_INODE;
++                                      EXT2_FEATURE_COMPAT_RESIZE_INO;
+                               sb_param->s_reserved_gdt_blocks = rsv_gdb;
+                       }
+@@ -778,7 +778,7 @@ static void parse_extended_opts(struct ext2_super_block *sb_param,
+ static __u32 ok_features[3] = {
+       EXT3_FEATURE_COMPAT_HAS_JOURNAL |
+-              EXT2_FEATURE_COMPAT_RESIZE_INODE |
++              EXT2_FEATURE_COMPAT_RESIZE_INO |
+               EXT2_FEATURE_COMPAT_DIR_INDEX,  /* Compat */
+       EXT2_FEATURE_INCOMPAT_FILETYPE|         /* Incompat */
+               EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|
+@@ -1123,7 +1123,7 @@ static int PRS(int argc, char **argv)
+       /* Since sparse_super is the default, we would only have a problem
+        * here if it was explicitly disabled.
+        */
+-      if ((param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE) &&
++      if ((param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INO) &&
+           !(param.s_feature_ro_compat&EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) {
+               bb_error_msg_and_die("reserved online resize blocks not supported "
+                         "on non-sparse filesystem");
+@@ -1312,7 +1312,7 @@ int mke2fs_main (int argc, char **argv)
+               reserve_inodes(fs);
+               create_bad_block_inode(fs, bb_list);
+               if (fs->super->s_feature_compat &
+-                  EXT2_FEATURE_COMPAT_RESIZE_INODE) {
++                  EXT2_FEATURE_COMPAT_RESIZE_INO) {
+                       retval = ext2fs_create_resize_inode(fs);
+                       mke2fs_error_msg_and_die(retval, "reserve blocks for online resize");
+               }
+diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c
+index 841d58a..46a745e 100644
+--- a/e2fsprogs/tune2fs.c
++++ b/e2fsprogs/tune2fs.c
+@@ -8,7 +8,7 @@
+  */
+ #include "libbb.h"
+ #include <linux/fs.h>
+-#include "bb_linux_ext2_fs.h"
++#include "bb_e2fs_defs.h"
+ // storage helpers
+ char BUG_wrong_field_size(void);
+diff --git a/include/bb_e2fs_defs.h b/include/bb_e2fs_defs.h
+new file mode 100644
+index 0000000..7974497
+--- /dev/null
++++ b/include/bb_e2fs_defs.h
+@@ -0,0 +1,561 @@
++/* vi: set sw=4 ts=4: */
++/*
++ *  linux/include/linux/ext2_fs.h
++ *
++ * Copyright (C) 1992, 1993, 1994, 1995
++ * Remy Card (card@masi.ibp.fr)
++ * Laboratoire MASI - Institut Blaise Pascal
++ * Universite Pierre et Marie Curie (Paris VI)
++ *
++ * Copyright (C) 1991, 1992  Linus Torvalds
++ */
++
++#ifndef LINUX_EXT2_FS_H
++#define LINUX_EXT2_FS_H 1
++
++/*
++ * Special inode numbers
++ */
++#define EXT2_BAD_INO           1      /* Bad blocks inode */
++#define EXT2_ROOT_INO          2      /* Root inode */
++#define EXT2_ACL_IDX_INO       3      /* ACL inode */
++#define EXT2_ACL_DATA_INO      4      /* ACL inode */
++#define EXT2_BOOT_LOADER_INO   5      /* Boot loader inode */
++#define EXT2_UNDEL_DIR_INO     6      /* Undelete directory inode */
++#define EXT2_RESIZE_INO                7      /* Reserved group descriptors inode */
++#define EXT2_JOURNAL_INO       8      /* Journal inode */
++
++/* First non-reserved inode for old ext2 filesystems */
++#define EXT2_GOOD_OLD_FIRST_INO       11
++
++/*
++ * The second extended file system magic number
++ */
++#define EXT2_SUPER_MAGIC      0xEF53
++
++/* Assume that user mode programs are passing in an ext2fs superblock, not
++ * a kernel struct super_block.  This will allow us to call the feature-test
++ * macros from user land. */
++#define EXT2_SB(sb)   (sb)
++
++/*
++ * Maximal count of links to a file
++ */
++#define EXT2_LINK_MAX         32000
++
++/*
++ * Macro-instructions used to manage several block sizes
++ */
++#define EXT2_MIN_BLOCK_LOG_SIZE               10      /* 1024 */
++#define EXT2_MAX_BLOCK_LOG_SIZE               16      /* 65536 */
++#define EXT2_MIN_BLOCK_SIZE   (1 << EXT2_MIN_BLOCK_LOG_SIZE)
++#define EXT2_MAX_BLOCK_SIZE   (1 << EXT2_MAX_BLOCK_LOG_SIZE)
++#define EXT2_BLOCK_SIZE(s)    (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
++#define EXT2_BLOCK_SIZE_BITS(s)       ((s)->s_log_block_size + 10)
++#define EXT2_INODE_SIZE(s)    (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
++                               EXT2_GOOD_OLD_INODE_SIZE : (s)->s_inode_size)
++#define EXT2_FIRST_INO(s)     (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
++                               EXT2_GOOD_OLD_FIRST_INO : (s)->s_first_ino)
++#define EXT2_ADDR_PER_BLOCK(s)        (EXT2_BLOCK_SIZE(s) / sizeof(uint32_t))
++
++/*
++ * Macro-instructions used to manage fragments
++ */
++#define EXT2_MIN_FRAG_SIZE            EXT2_MIN_BLOCK_SIZE
++#define EXT2_MAX_FRAG_SIZE            EXT2_MAX_BLOCK_SIZE
++#define EXT2_MIN_FRAG_LOG_SIZE                EXT2_MIN_BLOCK_LOG_SIZE
++#define EXT2_FRAG_SIZE(s)             (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
++#define EXT2_FRAGS_PER_BLOCK(s)               (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
++
++/*
++ * ACL structures
++ */
++struct ext2_acl_header {      /* Header of Access Control Lists */
++      uint32_t        aclh_size;
++      uint32_t        aclh_file_count;
++      uint32_t        aclh_acle_count;
++      uint32_t        aclh_first_acle;
++};
++
++struct ext2_acl_entry {       /* Access Control List Entry */
++      uint32_t        acle_size;
++      uint16_t        acle_perms;     /* Access permissions */
++      uint16_t        acle_type;      /* Type of entry */
++      uint16_t        acle_tag;       /* User or group identity */
++      uint16_t        acle_pad1;
++      uint32_t        acle_next;      /* Pointer on next entry for the */
++                                      /* same inode or on next free entry */
++};
++
++/*
++ * Structure of a blocks group descriptor
++ */
++struct ext2_group_desc {
++      uint32_t        bg_block_bitmap;        /* Blocks bitmap block */
++      uint32_t        bg_inode_bitmap;        /* Inodes bitmap block */
++      uint32_t        bg_inode_table;         /* Inodes table block */
++      uint16_t        bg_free_blocks_count;   /* Free blocks count */
++      uint16_t        bg_free_inodes_count;   /* Free inodes count */
++      uint16_t        bg_used_dirs_count;     /* Directories count */
++      uint16_t        bg_pad;
++      uint32_t        bg_reserved[3];
++};
++
++/*
++ * Data structures used by the directory indexing feature
++ *
++ * Note: all of the multibyte integer fields are little endian.
++ */
++
++/*
++ * Note: dx_root_info is laid out so that if it should somehow get
++ * overlaid by a dirent the two low bits of the hash version will be
++ * zero.  Therefore, the hash version mod 4 should never be 0.
++ * Sincerely, the paranoia department.
++ */
++struct ext2_dx_root_info {
++      uint32_t        reserved_zero;
++      uint8_t         hash_version; /* 0 now, 1 at release */
++      uint8_t         info_length; /* 8 */
++      uint8_t         indirect_levels;
++      uint8_t         unused_flags;
++};
++
++#define EXT2_HASH_LEGACY      0
++#define EXT2_HASH_HALF_MD4    1
++#define EXT2_HASH_TEA         2
++
++#define EXT2_HASH_FLAG_INCOMPAT       0x1
++
++struct ext2_dx_entry {
++      uint32_t hash;
++      uint32_t block;
++};
++
++struct ext2_dx_countlimit {
++      uint16_t limit;
++      uint16_t count;
++};
++
++
++/*
++ * Macro-instructions used to manage group descriptors
++ */
++#define EXT2_BLOCKS_PER_GROUP(s)      (EXT2_SB(s)->s_blocks_per_group)
++#define EXT2_INODES_PER_GROUP(s)      (EXT2_SB(s)->s_inodes_per_group)
++#define EXT2_INODES_PER_BLOCK(s)      (EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
++/* limits imposed by 16-bit value gd_free_{blocks,inode}_count */
++#define EXT2_MAX_BLOCKS_PER_GROUP(s)  ((1 << 16) - 8)
++#define EXT2_MAX_INODES_PER_GROUP(s)  ((1 << 16) - EXT2_INODES_PER_BLOCK(s))
++#define EXT2_DESC_PER_BLOCK(s)                (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
++
++/*
++ * Constants relative to the data blocks
++ */
++#define EXT2_NDIR_BLOCKS              12
++#define EXT2_IND_BLOCK                        EXT2_NDIR_BLOCKS
++#define EXT2_DIND_BLOCK                       (EXT2_IND_BLOCK + 1)
++#define EXT2_TIND_BLOCK                       (EXT2_DIND_BLOCK + 1)
++#define EXT2_N_BLOCKS                 (EXT2_TIND_BLOCK + 1)
++
++/*
++ * Inode flags
++ */
++#define EXT2_SECRM_FL                 0x00000001 /* Secure deletion */
++#define EXT2_UNRM_FL                  0x00000002 /* Undelete */
++#define EXT2_COMPR_FL                 0x00000004 /* Compress file */
++#define EXT2_SYNC_FL                  0x00000008 /* Synchronous updates */
++#define EXT2_IMMUTABLE_FL             0x00000010 /* Immutable file */
++#define EXT2_APPEND_FL                        0x00000020 /* writes to file may only append */
++#define EXT2_NODUMP_FL                        0x00000040 /* do not dump file */
++#define EXT2_NOATIME_FL                       0x00000080 /* do not update atime */
++/* Reserved for compression usage... */
++#define EXT2_DIRTY_FL                 0x00000100
++#define EXT2_COMPRBLK_FL              0x00000200 /* One or more compressed clusters */
++#define EXT2_NOCOMPR_FL                       0x00000400 /* Access raw compressed data */
++#define EXT2_ECOMPR_FL                        0x00000800 /* Compression error */
++/* End compression flags --- maybe not all used */
++#define EXT2_BTREE_FL                 0x00001000 /* btree format dir */
++#define EXT2_INDEX_FL                 0x00001000 /* hash-indexed directory */
++#define EXT2_IMAGIC_FL                        0x00002000
++#define EXT3_JOURNAL_DATA_FL          0x00004000 /* file data should be journaled */
++#define EXT2_NOTAIL_FL                        0x00008000 /* file tail should not be merged */
++#define EXT2_DIRSYNC_FL                       0x00010000 /* Synchronous directory modifications */
++#define EXT2_TOPDIR_FL                        0x00020000 /* Top of directory hierarchies*/
++#define EXT3_EXTENTS_FL                       0x00080000 /* Inode uses extents */
++#define EXT2_RESERVED_FL              0x80000000 /* reserved for ext2 lib */
++
++#define EXT2_FL_USER_VISIBLE          0x0003DFFF /* User visible flags */
++#define EXT2_FL_USER_MODIFIABLE               0x000080FF /* User modifiable flags */
++
++/*
++ * ioctl commands
++ */
++#define EXT2_IOC_GETFLAGS             _IOR('f', 1, long)
++#define EXT2_IOC_SETFLAGS             _IOW('f', 2, long)
++#define EXT2_IOC_GETVERSION           _IOR('v', 1, long)
++#define EXT2_IOC_SETVERSION           _IOW('v', 2, long)
++
++/*
++ * Structure of an inode on the disk
++ */
++struct ext2_inode {
++      uint16_t        i_mode;         /* File mode */
++      uint16_t        i_uid;          /* Low 16 bits of Owner Uid */
++      uint32_t        i_size;         /* Size in bytes */
++      uint32_t        i_atime;        /* Access time */
++      uint32_t        i_ctime;        /* Creation time */
++      uint32_t        i_mtime;        /* Modification time */
++      uint32_t        i_dtime;        /* Deletion Time */
++      uint16_t        i_gid;          /* Low 16 bits of Group Id */
++      uint16_t        i_links_count;  /* Links count */
++      uint32_t        i_blocks;       /* Blocks count */
++      uint32_t        i_flags;        /* File flags */
++      union {
++              struct {
++                      uint32_t  l_i_reserved1;
++              } linux1;
++              struct {
++                      uint32_t  h_i_translator;
++              } hurd1;
++              struct {
++                      uint32_t  m_i_reserved1;
++              } masix1;
++      } osd1;                         /* OS dependent 1 */
++      uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
++      uint32_t        i_generation;   /* File version (for NFS) */
++      uint32_t        i_file_acl;     /* File ACL */
++      uint32_t        i_dir_acl;      /* Directory ACL */
++      uint32_t        i_faddr;        /* Fragment address */
++      union {
++              struct {
++                      uint8_t         l_i_frag;       /* Fragment number */
++                      uint8_t         l_i_fsize;      /* Fragment size */
++                      uint16_t        i_pad1;
++                      uint16_t        l_i_uid_high;   /* these 2 fields    */
++                      uint16_t        l_i_gid_high;   /* were reserved2[0] */
++                      uint32_t        l_i_reserved2;
++              } linux2;
++              struct {
++                      uint8_t         h_i_frag;       /* Fragment number */
++                      uint8_t         h_i_fsize;      /* Fragment size */
++                      uint16_t        h_i_mode_high;
++                      uint16_t        h_i_uid_high;
++                      uint16_t        h_i_gid_high;
++                      uint32_t        h_i_author;
++              } hurd2;
++              struct {
++                      uint8_t         m_i_frag;       /* Fragment number */
++                      uint8_t         m_i_fsize;      /* Fragment size */
++                      uint16_t        m_pad1;
++                      uint32_t        m_i_reserved2[2];
++              } masix2;
++      } osd2;                         /* OS dependent 2 */
++};
++
++/*
++ * Permanent part of an large inode on the disk
++ */
++struct ext2_inode_large {
++      uint16_t        i_mode;         /* File mode */
++      uint16_t        i_uid;          /* Low 16 bits of Owner Uid */
++      uint32_t        i_size;         /* Size in bytes */
++      uint32_t        i_atime;        /* Access time */
++      uint32_t        i_ctime;        /* Creation time */
++      uint32_t        i_mtime;        /* Modification time */
++      uint32_t        i_dtime;        /* Deletion Time */
++      uint16_t        i_gid;          /* Low 16 bits of Group Id */
++      uint16_t        i_links_count;  /* Links count */
++      uint32_t        i_blocks;       /* Blocks count */
++      uint32_t        i_flags;        /* File flags */
++      union {
++              struct {
++                      uint32_t  l_i_reserved1;
++              } linux1;
++              struct {
++                      uint32_t  h_i_translator;
++              } hurd1;
++              struct {
++                      uint32_t  m_i_reserved1;
++              } masix1;
++      } osd1;                         /* OS dependent 1 */
++      uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
++      uint32_t        i_generation;   /* File version (for NFS) */
++      uint32_t        i_file_acl;     /* File ACL */
++      uint32_t        i_dir_acl;      /* Directory ACL */
++      uint32_t        i_faddr;        /* Fragment address */
++      union {
++              struct {
++                      uint8_t         l_i_frag;       /* Fragment number */
++                      uint8_t         l_i_fsize;      /* Fragment size */
++                      uint16_t        i_pad1;
++                      uint16_t        l_i_uid_high;   /* these 2 fields    */
++                      uint16_t        l_i_gid_high;   /* were reserved2[0] */
++                      uint32_t        l_i_reserved2;
++              } linux2;
++              struct {
++                      uint8_t         h_i_frag;       /* Fragment number */
++                      uint8_t         h_i_fsize;      /* Fragment size */
++                      uint16_t        h_i_mode_high;
++                      uint16_t        h_i_uid_high;
++                      uint16_t        h_i_gid_high;
++                      uint32_t        h_i_author;
++              } hurd2;
++              struct {
++                      uint8_t         m_i_frag;       /* Fragment number */
++                      uint8_t         m_i_fsize;      /* Fragment size */
++                      uint16_t        m_pad1;
++                      uint32_t        m_i_reserved2[2];
++              } masix2;
++      } osd2;                         /* OS dependent 2 */
++      uint16_t        i_extra_isize;
++      uint16_t        i_pad1;
++};
++
++#define i_size_high   i_dir_acl
++
++/*
++ * File system states
++ */
++#define EXT2_VALID_FS                 0x0001  /* Unmounted cleanly */
++#define EXT2_ERROR_FS                 0x0002  /* Errors detected */
++
++/*
++ * Mount flags
++ */
++#define EXT2_MOUNT_CHECK              0x0001  /* Do mount-time checks */
++#define EXT2_MOUNT_GRPID              0x0004  /* Create files with directory's group */
++#define EXT2_MOUNT_DEBUG              0x0008  /* Some debugging messages */
++#define EXT2_MOUNT_ERRORS_CONT                0x0010  /* Continue on errors */
++#define EXT2_MOUNT_ERRORS_RO          0x0020  /* Remount fs ro on errors */
++#define EXT2_MOUNT_ERRORS_PANIC               0x0040  /* Panic on errors */
++#define EXT2_MOUNT_MINIX_DF           0x0080  /* Mimics the Minix statfs */
++#define EXT2_MOUNT_NO_UID32           0x0200  /* Disable 32-bit UIDs */
++
++#define clear_opt(o, opt)             o &= ~EXT2_MOUNT_##opt
++#define set_opt(o, opt)                       o |= EXT2_MOUNT_##opt
++#define test_opt(sb, opt)             (EXT2_SB(sb)->s_mount_opt & \
++                                       EXT2_MOUNT_##opt)
++/*
++ * Maximal mount counts between two filesystem checks
++ */
++#define EXT2_DFL_MAX_MNT_COUNT                20      /* Allow 20 mounts */
++#define EXT2_DFL_CHECKINTERVAL                0       /* Don't use interval check */
++
++/*
++ * Behaviour when detecting errors
++ */
++#define EXT2_ERRORS_CONTINUE          1       /* Continue execution */
++#define EXT2_ERRORS_RO                        2       /* Remount fs read-only */
++#define EXT2_ERRORS_PANIC             3       /* Panic */
++#define EXT2_ERRORS_DEFAULT           EXT2_ERRORS_CONTINUE
++
++/*
++ * Structure of the super block
++ */
++struct ext2_super_block {
++      uint32_t        s_inodes_count;         /* Inodes count */
++      uint32_t        s_blocks_count;         /* Blocks count */
++      uint32_t        s_r_blocks_count;       /* Reserved blocks count */
++      uint32_t        s_free_blocks_count;    /* Free blocks count */
++      uint32_t        s_free_inodes_count;    /* Free inodes count */
++      uint32_t        s_first_data_block;     /* First Data Block */
++      uint32_t        s_log_block_size;       /* Block size */
++      int32_t         s_log_frag_size;        /* Fragment size */
++      uint32_t        s_blocks_per_group;     /* # Blocks per group */
++      uint32_t        s_frags_per_group;      /* # Fragments per group */
++      uint32_t        s_inodes_per_group;     /* # Inodes per group */
++      uint32_t        s_mtime;                /* Mount time */
++      uint32_t        s_wtime;                /* Write time */
++      uint16_t        s_mnt_count;            /* Mount count */
++      int16_t         s_max_mnt_count;        /* Maximal mount count */
++      uint16_t        s_magic;                /* Magic signature */
++      uint16_t        s_state;                /* File system state */
++      uint16_t        s_errors;               /* Behaviour when detecting errors */
++      uint16_t        s_minor_rev_level;      /* minor revision level */
++      uint32_t        s_lastcheck;            /* time of last check */
++      uint32_t        s_checkinterval;        /* max. time between checks */
++      uint32_t        s_creator_os;           /* OS */
++      uint32_t        s_rev_level;            /* Revision level */
++      uint16_t        s_def_resuid;           /* Default uid for reserved blocks */
++      uint16_t        s_def_resgid;           /* Default gid for reserved blocks */
++      /*
++       * These fields are for EXT2_DYNAMIC_REV superblocks only.
++       *
++       * Note: the difference between the compatible feature set and
++       * the incompatible feature set is that if there is a bit set
++       * in the incompatible feature set that the kernel doesn't
++       * know about, it should refuse to mount the filesystem.
++       *
++       * e2fsck's requirements are more strict; if it doesn't know
++       * about a feature in either the compatible or incompatible
++       * feature set, it must abort and not try to meddle with
++       * things it doesn't understand...
++       */
++      uint32_t        s_first_ino;            /* First non-reserved inode */
++      uint16_t        s_inode_size;           /* size of inode structure */
++      uint16_t        s_block_group_nr;       /* block group # of this superblock */
++      uint32_t        s_feature_compat;       /* compatible feature set */
++      uint32_t        s_feature_incompat;     /* incompatible feature set */
++      uint32_t        s_feature_ro_compat;    /* readonly-compatible feature set */
++      uint8_t         s_uuid[16];             /* 128-bit uuid for volume */
++      char            s_volume_name[16];      /* volume name */
++      char            s_last_mounted[64];     /* directory where last mounted */
++      uint32_t        s_algorithm_usage_bitmap; /* For compression */
++      /*
++       * Performance hints.  Directory preallocation should only
++       * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
++       */
++      uint8_t s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
++      uint8_t s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
++      uint16_t        s_reserved_gdt_blocks;  /* Per group table for online growth */
++      /*
++       * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
++       */
++      uint8_t         s_journal_uuid[16];     /* uuid of journal superblock */
++      uint32_t        s_journal_inum;         /* inode number of journal file */
++      uint32_t        s_journal_dev;          /* device number of journal file */
++      uint32_t        s_last_orphan;          /* start of list of inodes to delete */
++      uint32_t        s_hash_seed[4];         /* HTREE hash seed */
++      uint8_t         s_def_hash_version;     /* Default hash version to use */
++      uint8_t         s_jnl_backup_type;      /* Default type of journal backup */
++      uint16_t        s_reserved_word_pad;
++      uint32_t        s_default_mount_opts;
++      uint32_t        s_first_meta_bg;        /* First metablock group */
++      uint32_t        s_mkfs_time;            /* When the filesystem was created */
++      uint32_t        s_jnl_blocks[17];       /* Backup of the journal inode */
++      uint32_t        s_reserved[172];        /* Padding to the end of the block */
++};
++
++/*
++ * Codes for operating systems
++ */
++#define EXT2_OS_LINUX         0
++#define EXT2_OS_HURD          1
++#define EXT2_OS_MASIX         2
++#define EXT2_OS_FREEBSD               3
++#define EXT2_OS_LITES         4
++
++/*
++ * Revision levels
++ */
++#define EXT2_GOOD_OLD_REV     0       /* The good old (original) format */
++#define EXT2_DYNAMIC_REV      1       /* V2 format w/ dynamic inode sizes */
++
++#define EXT2_CURRENT_REV      EXT2_GOOD_OLD_REV
++#define EXT2_MAX_SUPP_REV     EXT2_DYNAMIC_REV
++
++#define EXT2_GOOD_OLD_INODE_SIZE 128
++
++/*
++ * Journal inode backup types
++ */
++#define EXT3_JNL_BACKUP_BLOCKS        1
++
++/*
++ * Feature set definitions
++ */
++
++#define EXT2_HAS_COMPAT_FEATURE(sb,mask)                      \
++      ( EXT2_SB(sb)->s_feature_compat & (mask) )
++#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                   \
++      ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
++#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                    \
++      ( EXT2_SB(sb)->s_feature_incompat & (mask) )
++
++#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 not used */
++
++#define EXT2_FEATURE_INCOMPAT_COMPRESSION     0x0001
++#define EXT2_FEATURE_INCOMPAT_FILETYPE                0x0002
++#define EXT3_FEATURE_INCOMPAT_RECOVER         0x0004 /* Needs recovery */
++#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV     0x0008 /* Journal device */
++#define EXT2_FEATURE_INCOMPAT_META_BG         0x0010
++#define EXT3_FEATURE_INCOMPAT_EXTENTS         0x0040
++
++
++#define EXT2_FEATURE_COMPAT_SUPP      0
++#define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE)
++#define EXT2_FEATURE_RO_COMPAT_SUPP   (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
++                                       EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
++                                       EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
++
++/*
++ * Default values for user and/or group using reserved blocks
++ */
++#define EXT2_DEF_RESUID               0
++#define EXT2_DEF_RESGID               0
++
++/*
++ * Default mount options
++ */
++#define EXT2_DEFM_DEBUG               0x0001
++#define EXT2_DEFM_BSDGROUPS   0x0002
++#define EXT2_DEFM_XATTR_USER  0x0004
++#define EXT2_DEFM_ACL         0x0008
++#define EXT2_DEFM_UID16               0x0010
++#define EXT3_DEFM_JMODE               0x0060
++#define EXT3_DEFM_JMODE_DATA  0x0020
++#define EXT3_DEFM_JMODE_ORDERED       0x0040
++#define EXT3_DEFM_JMODE_WBACK 0x0060
++
++/*
++ * Structure of a directory entry
++ */
++#define EXT2_NAME_LEN 255
++
++struct ext2_dir_entry {
++      uint32_t        inode;                  /* Inode number */
++      uint16_t        rec_len;                /* Directory entry length */
++      uint16_t        name_len;               /* Name length */
++      char            name[EXT2_NAME_LEN];    /* File name */
++};
++
++/*
++ * The new version of the directory entry.  Since EXT2 structures are
++ * stored in intel byte order, and the name_len field could never be
++ * bigger than 255 chars, it's safe to reclaim the extra byte for the
++ * file_type field.
++ */
++struct ext2_dir_entry_2 {
++      uint32_t        inode;                  /* Inode number */
++      uint16_t        rec_len;                /* Directory entry length */
++      uint8_t         name_len;               /* Name length */
++      uint8_t         file_type;
++      char            name[EXT2_NAME_LEN];    /* File name */
++};
++
++/*
++ * Ext2 directory file types.  Only the low 3 bits are used.  The
++ * other bits are reserved for now.
++ */
++#define EXT2_FT_UNKNOWN               0
++#define EXT2_FT_REG_FILE      1
++#define EXT2_FT_DIR           2
++#define EXT2_FT_CHRDEV                3
++#define EXT2_FT_BLKDEV                4
++#define EXT2_FT_FIFO          5
++#define EXT2_FT_SOCK          6
++#define EXT2_FT_SYMLINK               7
++
++#define EXT2_FT_MAX           8
++
++/*
++ * EXT2_DIR_PAD defines the directory entries boundaries
++ *
++ * NOTE: It must be a multiple of 4
++ */
++#define EXT2_DIR_PAD                  4
++#define EXT2_DIR_ROUND                        (EXT2_DIR_PAD - 1)
++#define EXT2_DIR_REC_LEN(name_len)    (((name_len) + 8 + EXT2_DIR_ROUND) & \
++                                       ~EXT2_DIR_ROUND)
++
++#endif
+diff --git a/include/bb_linux_ext2_fs.h b/include/bb_linux_ext2_fs.h
+deleted file mode 100644
+index fdc470b..0000000
+--- a/include/bb_linux_ext2_fs.h
++++ /dev/null
+@@ -1,547 +0,0 @@
+-/*
+- * Work around linux/ext2_fs.h breakage.
+- * linux/ext2_fs.h might be removed from future kernel header distribution.
+- * See https://bugzilla.kernel.org/show_bug.cgi?id=42986
+- *
+- * Licensed under GPLv2, see file LICENSE in this source tree.
+- */
+-#ifndef BB_LINUX_EXT2_FS_H
+-#define BB_LINUX_EXT2_FS_H
+-
+-/*
+- * From linux/magic.h
+- */
+-
+-#define EXT2_SUPER_MAGIC        0xEF53
+-#define EXT3_SUPER_MAGIC        0xEF53
+-#define EXT4_SUPER_MAGIC        0xEF53
+-
+-/*
+- * From linux/ext2_fs.h, with minor changes.
+- */
+-
+-/*
+- * Copyright (C) 1992, 1993, 1994, 1995
+- * Remy Card (card@masi.ibp.fr)
+- * Laboratoire MASI - Institut Blaise Pascal
+- * Universite Pierre et Marie Curie (Paris VI)
+- *
+- *  from
+- *
+- *  linux/include/linux/minix_fs.h
+- *
+- *  Copyright (C) 1991, 1992  Linus Torvalds
+- */
+-
+-/*
+- * The second extended filesystem constants/structures
+- */
+-
+-/*
+- * Define EXT2_RESERVATION to reserve data blocks for expanding files
+- */
+-#define EXT2_DEFAULT_RESERVE_BLOCKS     8
+-/*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
+-#define EXT2_MAX_RESERVE_BLOCKS         1027
+-#define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0
+-
+-/*
+- * Special inode numbers
+- */
+-#define       EXT2_BAD_INO             1      /* Bad blocks inode */
+-#define EXT2_ROOT_INO          2      /* Root inode */
+-#define EXT2_BOOT_LOADER_INO   5      /* Boot loader inode */
+-#define EXT2_UNDEL_DIR_INO     6      /* Undelete directory inode */
+-
+-/* First non-reserved inode for old ext2 filesystems */
+-#define EXT2_GOOD_OLD_FIRST_INO       11
+-
+-/* Assume that user mode programs are passing in an ext2fs superblock, not
+- * a kernel struct super_block.  This will allow us to call the feature-test
+- * macros from user land. */
+-#define EXT2_SB(sb)   (sb)
+-
+-/*
+- * Maximal count of links to a file
+- */
+-#define EXT2_LINK_MAX         32000
+-
+-/*
+- * Macro-instructions used to manage several block sizes
+- */
+-#define EXT2_MIN_BLOCK_SIZE           1024
+-#define       EXT2_MAX_BLOCK_SIZE             4096
+-#define EXT2_MIN_BLOCK_LOG_SIZE                 10
+-# define EXT2_BLOCK_SIZE(s)           (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
+-#define       EXT2_ADDR_PER_BLOCK(s)          (EXT2_BLOCK_SIZE(s) / sizeof (uint32_t))
+-# define EXT2_BLOCK_SIZE_BITS(s)      ((s)->s_log_block_size + 10)
+-#define EXT2_INODE_SIZE(s)    (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
+-                               EXT2_GOOD_OLD_INODE_SIZE : \
+-                               (s)->s_inode_size)
+-#define EXT2_FIRST_INO(s)     (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
+-                               EXT2_GOOD_OLD_FIRST_INO : \
+-                               (s)->s_first_ino)
+-
+-/*
+- * Macro-instructions used to manage fragments
+- */
+-#define EXT2_MIN_FRAG_SIZE            1024
+-#define       EXT2_MAX_FRAG_SIZE              4096
+-#define EXT2_MIN_FRAG_LOG_SIZE                  10
+-# define EXT2_FRAG_SIZE(s)            (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
+-# define EXT2_FRAGS_PER_BLOCK(s)      (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
+-
+-/*
+- * Structure of a blocks group descriptor
+- */
+-struct ext2_group_desc
+-{
+-      uint32_t        bg_block_bitmap;                /* Blocks bitmap block */
+-      uint32_t        bg_inode_bitmap;                /* Inodes bitmap block */
+-      uint32_t        bg_inode_table;         /* Inodes table block */
+-      uint16_t        bg_free_blocks_count;   /* Free blocks count */
+-      uint16_t        bg_free_inodes_count;   /* Free inodes count */
+-      uint16_t        bg_used_dirs_count;     /* Directories count */
+-      uint16_t        bg_pad;
+-      uint32_t        bg_reserved[3];
+-};
+-
+-/*
+- * Macro-instructions used to manage group descriptors
+- */
+-# define EXT2_BLOCKS_PER_GROUP(s)     ((s)->s_blocks_per_group)
+-# define EXT2_DESC_PER_BLOCK(s)               (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
+-# define EXT2_INODES_PER_GROUP(s)     ((s)->s_inodes_per_group)
+-
+-/*
+- * Constants relative to the data blocks
+- */
+-#define       EXT2_NDIR_BLOCKS                12
+-#define       EXT2_IND_BLOCK                  EXT2_NDIR_BLOCKS
+-#define       EXT2_DIND_BLOCK                 (EXT2_IND_BLOCK + 1)
+-#define       EXT2_TIND_BLOCK                 (EXT2_DIND_BLOCK + 1)
+-#define       EXT2_N_BLOCKS                   (EXT2_TIND_BLOCK + 1)
+-
+-/*
+- * Inode flags (GETFLAGS/SETFLAGS)
+- */
+-#define       EXT2_SECRM_FL                   FS_SECRM_FL     /* Secure deletion */
+-#define       EXT2_UNRM_FL                    FS_UNRM_FL      /* Undelete */
+-#define       EXT2_COMPR_FL                   FS_COMPR_FL     /* Compress file */
+-#define EXT2_SYNC_FL                  FS_SYNC_FL      /* Synchronous updates */
+-#define EXT2_IMMUTABLE_FL             FS_IMMUTABLE_FL /* Immutable file */
+-#define EXT2_APPEND_FL                        FS_APPEND_FL    /* writes to file may only append */
+-#define EXT2_NODUMP_FL                        FS_NODUMP_FL    /* do not dump file */
+-#define EXT2_NOATIME_FL                       FS_NOATIME_FL   /* do not update atime */
+-/* Reserved for compression usage... */
+-#define EXT2_DIRTY_FL                 FS_DIRTY_FL
+-#define EXT2_COMPRBLK_FL              FS_COMPRBLK_FL  /* One or more compressed clusters */
+-#define EXT2_NOCOMP_FL                        FS_NOCOMP_FL    /* Don't compress */
+-#define EXT2_ECOMPR_FL                        FS_ECOMPR_FL    /* Compression error */
+-/* End compression flags --- maybe not all used */
+-#define EXT2_BTREE_FL                 FS_BTREE_FL     /* btree format dir */
+-#define EXT2_INDEX_FL                 FS_INDEX_FL     /* hash-indexed directory */
+-#define EXT2_IMAGIC_FL                        FS_IMAGIC_FL    /* AFS directory */
+-#define EXT2_JOURNAL_DATA_FL          FS_JOURNAL_DATA_FL /* Reserved for ext3 */
+-#define EXT2_NOTAIL_FL                        FS_NOTAIL_FL    /* file tail should not be merged */
+-#define EXT2_DIRSYNC_FL                       FS_DIRSYNC_FL   /* dirsync behaviour (directories only) */
+-#define EXT2_TOPDIR_FL                        FS_TOPDIR_FL    /* Top of directory hierarchies*/
+-#define EXT2_RESERVED_FL              FS_RESERVED_FL  /* reserved for ext2 lib */
+-
+-#define EXT2_FL_USER_VISIBLE          FS_FL_USER_VISIBLE      /* User visible flags */
+-#define EXT2_FL_USER_MODIFIABLE               FS_FL_USER_MODIFIABLE   /* User modifiable flags */
+-
+-/* Flags that should be inherited by new inodes from their parent. */
+-#define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\
+-                         EXT2_SYNC_FL | EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |\
+-                         EXT2_NODUMP_FL | EXT2_NOATIME_FL | EXT2_COMPRBLK_FL|\
+-                         EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\
+-                         EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL)
+-
+-/* Flags that are appropriate for regular files (all but dir-specific ones). */
+-#define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL))
+-
+-/* Flags that are appropriate for non-directories/regular files. */
+-#define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL)
+-
+-/* Mask out flags that are inappropriate for the given type of inode. */
+-static inline uint32_t ext2_mask_flags(mode_t mode, uint32_t flags)
+-{
+-      if (S_ISDIR(mode))
+-              return flags;
+-      else if (S_ISREG(mode))
+-              return flags & EXT2_REG_FLMASK;
+-      else
+-              return flags & EXT2_OTHER_FLMASK;
+-}
+-
+-/*
+- * ioctl commands
+- */
+-#define       EXT2_IOC_GETFLAGS               FS_IOC_GETFLAGS
+-#define       EXT2_IOC_SETFLAGS               FS_IOC_SETFLAGS
+-#define       EXT2_IOC_GETVERSION             FS_IOC_GETVERSION
+-#define       EXT2_IOC_SETVERSION             FS_IOC_SETVERSION
+-#define       EXT2_IOC_GETRSVSZ               _IOR('f', 5, long)
+-#define       EXT2_IOC_SETRSVSZ               _IOW('f', 6, long)
+-
+-/*
+- * ioctl commands in 32 bit emulation
+- */
+-#define EXT2_IOC32_GETFLAGS           FS_IOC32_GETFLAGS
+-#define EXT2_IOC32_SETFLAGS           FS_IOC32_SETFLAGS
+-#define EXT2_IOC32_GETVERSION         FS_IOC32_GETVERSION
+-#define EXT2_IOC32_SETVERSION         FS_IOC32_SETVERSION
+-
+-/*
+- * Structure of an inode on the disk
+- */
+-struct ext2_inode {
+-      uint16_t        i_mode;         /* File mode */
+-      uint16_t        i_uid;          /* Low 16 bits of Owner Uid */
+-      uint32_t        i_size;         /* Size in bytes */
+-      uint32_t        i_atime;        /* Access time */
+-      uint32_t        i_ctime;        /* Creation time */
+-      uint32_t        i_mtime;        /* Modification time */
+-      uint32_t        i_dtime;        /* Deletion Time */
+-      uint16_t        i_gid;          /* Low 16 bits of Group Id */
+-      uint16_t        i_links_count;  /* Links count */
+-      uint32_t        i_blocks;       /* Blocks count */
+-      uint32_t        i_flags;        /* File flags */
+-      union {
+-              struct {
+-                      uint32_t  l_i_reserved1;
+-              } linux1;
+-              struct {
+-                      uint32_t  h_i_translator;
+-              } hurd1;
+-              struct {
+-                      uint32_t  m_i_reserved1;
+-              } masix1;
+-      } osd1;                         /* OS dependent 1 */
+-      uint32_t        i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+-      uint32_t        i_generation;   /* File version (for NFS) */
+-      uint32_t        i_file_acl;     /* File ACL */
+-      uint32_t        i_dir_acl;      /* Directory ACL */
+-      uint32_t        i_faddr;        /* Fragment address */
+-      union {
+-              struct {
+-                      uint8_t l_i_frag;       /* Fragment number */
+-                      uint8_t l_i_fsize;      /* Fragment size */
+-                      uint16_t        i_pad1;
+-                      uint16_t        l_i_uid_high;   /* these 2 fields    */
+-                      uint16_t        l_i_gid_high;   /* were reserved2[0] */
+-                      uint32_t        l_i_reserved2;
+-              } linux2;
+-              struct {
+-                      uint8_t h_i_frag;       /* Fragment number */
+-                      uint8_t h_i_fsize;      /* Fragment size */
+-                      uint16_t        h_i_mode_high;
+-                      uint16_t        h_i_uid_high;
+-                      uint16_t        h_i_gid_high;
+-                      uint32_t        h_i_author;
+-              } hurd2;
+-              struct {
+-                      uint8_t m_i_frag;       /* Fragment number */
+-                      uint8_t m_i_fsize;      /* Fragment size */
+-                      uint16_t        m_pad1;
+-                      uint32_t        m_i_reserved2[2];
+-              } masix2;
+-      } osd2;                         /* OS dependent 2 */
+-};
+-
+-#define i_size_high   i_dir_acl
+-
+-#if defined(__KERNEL__) || defined(__linux__)
+-#define i_reserved1   osd1.linux1.l_i_reserved1
+-#define i_frag                osd2.linux2.l_i_frag
+-#define i_fsize               osd2.linux2.l_i_fsize
+-#define i_uid_low     i_uid
+-#define i_gid_low     i_gid
+-#define i_uid_high    osd2.linux2.l_i_uid_high
+-#define i_gid_high    osd2.linux2.l_i_gid_high
+-#define i_reserved2   osd2.linux2.l_i_reserved2
+-#endif
+-
+-#ifdef        __hurd__
+-#define i_translator  osd1.hurd1.h_i_translator
+-#define i_frag                osd2.hurd2.h_i_frag
+-#define i_fsize               osd2.hurd2.h_i_fsize
+-#define i_uid_high    osd2.hurd2.h_i_uid_high
+-#define i_gid_high    osd2.hurd2.h_i_gid_high
+-#define i_author      osd2.hurd2.h_i_author
+-#endif
+-
+-#ifdef        __masix__
+-#define i_reserved1   osd1.masix1.m_i_reserved1
+-#define i_frag                osd2.masix2.m_i_frag
+-#define i_fsize               osd2.masix2.m_i_fsize
+-#define i_reserved2   osd2.masix2.m_i_reserved2
+-#endif
+-
+-/*
+- * File system states
+- */
+-#define       EXT2_VALID_FS                   0x0001  /* Unmounted cleanly */
+-#define       EXT2_ERROR_FS                   0x0002  /* Errors detected */
+-
+-/*
+- * Mount flags
+- */
+-#define EXT2_MOUNT_CHECK              0x000001  /* Do mount-time checks */
+-#define EXT2_MOUNT_OLDALLOC           0x000002  /* Don't use the new Orlov allocator */
+-#define EXT2_MOUNT_GRPID              0x000004  /* Create files with directory's group */
+-#define EXT2_MOUNT_DEBUG              0x000008  /* Some debugging messages */
+-#define EXT2_MOUNT_ERRORS_CONT                0x000010  /* Continue on errors */
+-#define EXT2_MOUNT_ERRORS_RO          0x000020  /* Remount fs ro on errors */
+-#define EXT2_MOUNT_ERRORS_PANIC               0x000040  /* Panic on errors */
+-#define EXT2_MOUNT_MINIX_DF           0x000080  /* Mimics the Minix statfs */
+-#define EXT2_MOUNT_NOBH                       0x000100  /* No buffer_heads */
+-#define EXT2_MOUNT_NO_UID32           0x000200  /* Disable 32-bit UIDs */
+-#define EXT2_MOUNT_XATTR_USER         0x004000  /* Extended user attributes */
+-#define EXT2_MOUNT_POSIX_ACL          0x008000  /* POSIX Access Control Lists */
+-#define EXT2_MOUNT_XIP                        0x010000  /* Execute in place */
+-#define EXT2_MOUNT_USRQUOTA           0x020000  /* user quota */
+-#define EXT2_MOUNT_GRPQUOTA           0x040000  /* group quota */
+-#define EXT2_MOUNT_RESERVATION                0x080000  /* Preallocation */
+-
+-
+-#define clear_opt(o, opt)             o &= ~EXT2_MOUNT_##opt
+-#define set_opt(o, opt)                       o |= EXT2_MOUNT_##opt
+-#define test_opt(sb, opt)             (EXT2_SB(sb)->s_mount_opt & \
+-                                       EXT2_MOUNT_##opt)
+-/*
+- * Maximal mount counts between two filesystem checks
+- */
+-#define EXT2_DFL_MAX_MNT_COUNT                20      /* Allow 20 mounts */
+-#define EXT2_DFL_CHECKINTERVAL                0       /* Don't use interval check */
+-
+-/*
+- * Behaviour when detecting errors
+- */
+-#define EXT2_ERRORS_CONTINUE          1       /* Continue execution */
+-#define EXT2_ERRORS_RO                        2       /* Remount fs read-only */
+-#define EXT2_ERRORS_PANIC             3       /* Panic */
+-#define EXT2_ERRORS_DEFAULT           EXT2_ERRORS_CONTINUE
+-
+-/*
+- * Structure of the super block
+- */
+-struct ext2_super_block {
+-      uint32_t        s_inodes_count;         /* Inodes count */
+-      uint32_t        s_blocks_count;         /* Blocks count */
+-      uint32_t        s_r_blocks_count;       /* Reserved blocks count */
+-      uint32_t        s_free_blocks_count;    /* Free blocks count */
+-      uint32_t        s_free_inodes_count;    /* Free inodes count */
+-      uint32_t        s_first_data_block;     /* First Data Block */
+-      uint32_t        s_log_block_size;       /* Block size */
+-      uint32_t        s_log_frag_size;        /* Fragment size */
+-      uint32_t        s_blocks_per_group;     /* # Blocks per group */
+-      uint32_t        s_frags_per_group;      /* # Fragments per group */
+-      uint32_t        s_inodes_per_group;     /* # Inodes per group */
+-      uint32_t        s_mtime;                /* Mount time */
+-      uint32_t        s_wtime;                /* Write time */
+-      uint16_t        s_mnt_count;            /* Mount count */
+-      uint16_t        s_max_mnt_count;        /* Maximal mount count */
+-      uint16_t        s_magic;                /* Magic signature */
+-      uint16_t        s_state;                /* File system state */
+-      uint16_t        s_errors;               /* Behaviour when detecting errors */
+-      uint16_t        s_minor_rev_level;      /* minor revision level */
+-      uint32_t        s_lastcheck;            /* time of last check */
+-      uint32_t        s_checkinterval;        /* max. time between checks */
+-      uint32_t        s_creator_os;           /* OS */
+-      uint32_t        s_rev_level;            /* Revision level */
+-      uint16_t        s_def_resuid;           /* Default uid for reserved blocks */
+-      uint16_t        s_def_resgid;           /* Default gid for reserved blocks */
+-      /*
+-       * These fields are for EXT2_DYNAMIC_REV superblocks only.
+-       *
+-       * Note: the difference between the compatible feature set and
+-       * the incompatible feature set is that if there is a bit set
+-       * in the incompatible feature set that the kernel doesn't
+-       * know about, it should refuse to mount the filesystem.
+-       *
+-       * e2fsck's requirements are more strict; if it doesn't know
+-       * about a feature in either the compatible or incompatible
+-       * feature set, it must abort and not try to meddle with
+-       * things it doesn't understand...
+-       */
+-      uint32_t        s_first_ino;            /* First non-reserved inode */
+-      uint16_t   s_inode_size;                /* size of inode structure */
+-      uint16_t        s_block_group_nr;       /* block group # of this superblock */
+-      uint32_t        s_feature_compat;       /* compatible feature set */
+-      uint32_t        s_feature_incompat;     /* incompatible feature set */
+-      uint32_t        s_feature_ro_compat;    /* readonly-compatible feature set */
+-      uint8_t s_uuid[16];             /* 128-bit uuid for volume */
+-      char    s_volume_name[16];      /* volume name */
+-      char    s_last_mounted[64];     /* directory where last mounted */
+-      uint32_t        s_algorithm_usage_bitmap; /* For compression */
+-      /*
+-       * Performance hints.  Directory preallocation should only
+-       * happen if the EXT2_COMPAT_PREALLOC flag is on.
+-       */
+-      uint8_t s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
+-      uint8_t s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
+-      uint16_t        s_padding1;
+-      /*
+-       * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
+-       */
+-      uint8_t s_journal_uuid[16];     /* uuid of journal superblock */
+-      uint32_t        s_journal_inum;         /* inode number of journal file */
+-      uint32_t        s_journal_dev;          /* device number of journal file */
+-      uint32_t        s_last_orphan;          /* start of list of inodes to delete */
+-      uint32_t        s_hash_seed[4];         /* HTREE hash seed */
+-      uint8_t s_def_hash_version;     /* Default hash version to use */
+-      uint8_t s_reserved_char_pad;
+-      uint16_t        s_reserved_word_pad;
+-      uint32_t        s_default_mount_opts;
+-      uint32_t        s_first_meta_bg;        /* First metablock block group */
+-      uint32_t        s_reserved[190];        /* Padding to the end of the block */
+-};
+-
+-/*
+- * Codes for operating systems
+- */
+-#define EXT2_OS_LINUX         0
+-#define EXT2_OS_HURD          1
+-#define EXT2_OS_MASIX         2
+-#define EXT2_OS_FREEBSD               3
+-#define EXT2_OS_LITES         4
+-
+-/*
+- * Revision levels
+- */
+-#define EXT2_GOOD_OLD_REV     0       /* The good old (original) format */
+-#define EXT2_DYNAMIC_REV      1       /* V2 format w/ dynamic inode sizes */
+-
+-#define EXT2_CURRENT_REV      EXT2_GOOD_OLD_REV
+-#define EXT2_MAX_SUPP_REV     EXT2_DYNAMIC_REV
+-
+-#define EXT2_GOOD_OLD_INODE_SIZE 128
+-
+-/*
+- * Feature set definitions
+- */
+-
+-#define EXT2_HAS_COMPAT_FEATURE(sb,mask)                      \
+-      ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
+-#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                   \
+-      ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
+-#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                    \
+-      ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
+-#define EXT2_SET_COMPAT_FEATURE(sb,mask)                      \
+-      EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
+-#define EXT2_SET_RO_COMPAT_FEATURE(sb,mask)                   \
+-      EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
+-#define EXT2_SET_INCOMPAT_FEATURE(sb,mask)                    \
+-      EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
+-#define EXT2_CLEAR_COMPAT_FEATURE(sb,mask)                    \
+-      EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
+-#define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask)                 \
+-      EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
+-#define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask)                  \
+-      EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
+-
+-#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_COMPAT_ANY                       0xffffffff
+-
+-#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_RO_COMPAT_ANY            0xffffffff
+-
+-#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_FEATURE_INCOMPAT_ANY             0xffffffff
+-
+-#define EXT2_FEATURE_COMPAT_SUPP      EXT2_FEATURE_COMPAT_EXT_ATTR
+-#define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE| \
+-                                       EXT2_FEATURE_INCOMPAT_META_BG)
+-#define EXT2_FEATURE_RO_COMPAT_SUPP   (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+-                                       EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+-                                       EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+-#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED    ~EXT2_FEATURE_RO_COMPAT_SUPP
+-#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED     ~EXT2_FEATURE_INCOMPAT_SUPP
+-
+-/*
+- * Default values for user and/or group using reserved blocks
+- */
+-#define       EXT2_DEF_RESUID         0
+-#define       EXT2_DEF_RESGID         0
+-
+-/*
+- * Default mount options
+- */
+-#define EXT2_DEFM_DEBUG               0x0001
+-#define EXT2_DEFM_BSDGROUPS   0x0002
+-#define EXT2_DEFM_XATTR_USER  0x0004
+-#define EXT2_DEFM_ACL         0x0008
+-#define EXT2_DEFM_UID16               0x0010
+-    /* Not used by ext2, but reserved for use by ext3 */
+-#define EXT3_DEFM_JMODE               0x0060 
+-#define EXT3_DEFM_JMODE_DATA  0x0020
+-#define EXT3_DEFM_JMODE_ORDERED       0x0040
+-#define EXT3_DEFM_JMODE_WBACK 0x0060
+-
+-/*
+- * Structure of a directory entry
+- */
+-#define EXT2_NAME_LEN 255
+-
+-struct ext2_dir_entry {
+-      uint32_t        inode;                  /* Inode number */
+-      uint16_t        rec_len;                /* Directory entry length */
+-      uint16_t        name_len;               /* Name length */
+-      char    name[EXT2_NAME_LEN];    /* File name */
+-};
+-
+-/*
+- * The new version of the directory entry.  Since EXT2 structures are
+- * stored in intel byte order, and the name_len field could never be
+- * bigger than 255 chars, it's safe to reclaim the extra byte for the
+- * file_type field.
+- */
+-struct ext2_dir_entry_2 {
+-      uint32_t        inode;                  /* Inode number */
+-      uint16_t        rec_len;                /* Directory entry length */
+-      uint8_t name_len;               /* Name length */
+-      uint8_t file_type;
+-      char    name[EXT2_NAME_LEN];    /* File name */
+-};
+-
+-/*
+- * Ext2 directory file types.  Only the low 3 bits are used.  The
+- * other bits are reserved for now.
+- */
+-enum {
+-      EXT2_FT_UNKNOWN         = 0,
+-      EXT2_FT_REG_FILE        = 1,
+-      EXT2_FT_DIR             = 2,
+-      EXT2_FT_CHRDEV          = 3,
+-      EXT2_FT_BLKDEV          = 4,
+-      EXT2_FT_FIFO            = 5,
+-      EXT2_FT_SOCK            = 6,
+-      EXT2_FT_SYMLINK         = 7,
+-      EXT2_FT_MAX
+-};
+-
+-/*
+- * EXT2_DIR_PAD defines the directory entries boundaries
+- *
+- * NOTE: It must be a multiple of 4
+- */
+-#define EXT2_DIR_PAD                  4
+-#define EXT2_DIR_ROUND                        (EXT2_DIR_PAD - 1)
+-#define EXT2_DIR_REC_LEN(name_len)    (((name_len) + 8 + EXT2_DIR_ROUND) & \
+-                                       ~EXT2_DIR_ROUND)
+-#define EXT2_MAX_REC_LEN              ((1<<16)-1)
+-
+-#endif
+diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c
+index 2d9d720..69b25c9 100644
+--- a/util-linux/mkfs_ext2.c
++++ b/util-linux/mkfs_ext2.c
+@@ -48,7 +48,7 @@
+ #include "libbb.h"
+ #include <linux/fs.h>
+-#include "bb_linux_ext2_fs.h"
++#include "bb_e2fs_defs.h"
+ #define ENABLE_FEATURE_MKFS_EXT2_RESERVED_GDT 0
+ #define ENABLE_FEATURE_MKFS_EXT2_DIR_INDEX    1
+-- 
+1.7.9.5
+
index 787fcb4..e53d78a 100644 (file)
@@ -1,7 +1,7 @@
 From a7b406ba64b7a4d9c9610726cb72568fc9848f5d Mon Sep 17 00:00:00 2001
 From: Lauri Hintsala <lauri.hintsala@bluegiga.com>
 Date: Wed, 14 Dec 2011 16:49:58 +0200
-Subject: [PATCH 3/9] ifupdown: remove interface from state_list if iface_up
+Subject: [PATCH 3/6] ifupdown: remove interface from state_list if iface_up
  fails
 
 Fix the issue where interface is set to the configured state even if
index 2b244af..3e77a1c 100644 (file)
@@ -1,7 +1,7 @@
 From fecb0cbff5ca703f8fc00a8e0e93f1f2e3ae942b Mon Sep 17 00:00:00 2001
 From: Natanael Copa <natanael.copa@gmail.com>
 Date: Fri, 17 Feb 2012 19:36:26 +0000
-Subject: [PATCH 4/9] ifupdown: support metric for static default gw
+Subject: [PATCH 4/6] ifupdown: support metric for static default gw
 
 This is useful when you have multiple ISPs with failover. It allows
 setting the priority of the static gateway and makes it possible
index 698e0e6..84e1947 100644 (file)
@@ -1,7 +1,7 @@
 From 7ec30bf273cbdf5f0ae335684939a883182e493e Mon Sep 17 00:00:00 2001
 From: Andreas Oberritter <obi@opendreambox.org>
 Date: Mon, 23 Apr 2012 22:08:39 +0200
-Subject: [PATCH 5/9] ifupdown: improve compatibility with Debian
+Subject: [PATCH 5/6] ifupdown: improve compatibility with Debian
 
 Set environment variable 'PHASE'.
 Treat post-up and pre-down as aliases for up and down.
index 6c4699a..41c31b8 100644 (file)
@@ -1,7 +1,7 @@
 From c011ab2fb52c2ee03aa9544b0d242683ee4362e1 Mon Sep 17 00:00:00 2001
 From: Andreas Oberritter <obi@opendreambox.org>
 Date: Fri, 27 Apr 2012 01:40:25 +0200
-Subject: [PATCH 6/9] get_linux_version_code: don't fail on 3.0-foo
+Subject: [PATCH 6/6] get_linux_version_code: don't fail on 3.0-foo
 
 Fixes segmentation fault in mount (nfs):
 
diff --git a/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/mount_single_uuid.patch b/meta-openvuplus/recipes-core/busybox/busybox-1.19.4/mount_single_uuid.patch
new file mode 100644 (file)
index 0000000..9577c07
--- /dev/null
@@ -0,0 +1,13 @@
+Index: busybox-1.18.5/util-linux/mount.c
+===================================================================
+--- busybox-1.18.5.orig/util-linux/mount.c
++++ busybox-1.18.5/util-linux/mount.c
+@@ -1934,6 +1934,8 @@ int mount_main(int argc UNUSED_PARAM, ch
+               // "proc") or a full path from root
+               if (argv[0]) {
++                      // Check for UUID= or LABEL= entries too
++                      resolve_mount_spec(&mtcur->mnt_fsname);
+                       // Is this what we're looking for?
+                       if (strcmp(argv[0], mtcur->mnt_fsname) != 0
+                        && strcmp(storage_path, mtcur->mnt_fsname) != 0
index 94155cb..9537987 100644 (file)
@@ -1,4 +1,4 @@
-PR .= "-vuplus1"
+PR .= "-vuplus2"
 
 SRC_URI += "file://busybox-telnetd.xinetd.in \
             file://busybox-telnetd@.service \
@@ -9,9 +9,11 @@ SRC_URI += "file://busybox-telnetd.xinetd.in \
             file://0004-ifupdown-support-metric-for-static-default-gw.patch \
             file://0005-ifupdown-improve-compatibility-with-Debian.patch \
             file://0006-get_linux_version_code-don-t-fail-on-3.0-foo.patch \
-            file://0007-ifplugd-move-read_pid-to-libbb-pidfile.c-and-rename-.patch \
-            file://0008-ifupdown-dhcp_down-wait-until-udhcpc-has-been-killed.patch \
-            file://0009-udhcpc-calculate-broadcast-address-if-not-given-by-s.patch"
+            file://0001-work-around-linux-ext2_fs.h-breakage.patch \
+            file://0002-Create-and-use-our-own-copy-of-linux-ext2_fs.h.patch \
+            file://0003-Drop-include-bb_linux_ext2_fs.h-use-existing-e2fspro.patch \
+            file://mount_single_uuid.patch \
+"
 
 inherit systemd xinetd