ext4: Use ext4 file system driver for ext2/ext3 file system mounts
authorTheodore Ts'o <tytso@mit.edu>
Mon, 7 Dec 2009 19:08:51 +0000 (14:08 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 7 Dec 2009 19:08:51 +0000 (14:08 -0500)
Add a new config option, CONFIG_EXT4_USE_FOR_EXT23 which if enabled,
will cause ext4 to be used for either ext2 or ext3 file system mounts
when ext2 or ext3 is not enabled in the configuration.

This allows minimalist kernel fanatics to drop to file system drivers
from their compiled kernel with out losing functionality.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/Kconfig
fs/ext4/super.c

index 9f2d45d75b1a70084e5f153c94d49a2b5f863321..a6b4e93833d6ccbe4ef5444f727680b3f1f5efe1 100644 (file)
@@ -26,6 +26,16 @@ config EXT4_FS
 
          If unsure, say N.
 
+config EXT4_USE_FOR_EXT23
+       bool "Use ext4 for ext2/ext3 file systems"
+       depends on !EXT3_FS || !EXT2_FS
+       default y
+       help
+         Allow the ext4 file system driver code to be used for ext2 or
+         ext3 file system mounts.  This allows users to reduce their
+         compiled kernel size by using one file system driver for
+         ext2, ext3, and ext4 file systems.
+
 config EXT4_FS_XATTR
        bool "Ext4 extended attributes"
        depends on EXT4_FS
index 5a2db612950b0c440b56edc529c68a116768bf9a..30476daf966e8f2c98937c9dede3e8a2fa3dea0c 100644 (file)
@@ -3960,6 +3960,58 @@ static int ext4_get_sb(struct file_system_type *fs_type, int flags,
        return get_sb_bdev(fs_type, flags, dev_name, data, ext4_fill_super,mnt);
 }
 
+#if !defined(CONTIG_EXT2_FS) && defined(CONFIG_EXT4_USE_FOR_EXT23)
+static struct file_system_type ext2_fs_type = {
+       .owner          = THIS_MODULE,
+       .name           = "ext2",
+       .get_sb         = ext4_get_sb,
+       .kill_sb        = kill_block_super,
+       .fs_flags       = FS_REQUIRES_DEV,
+};
+
+static inline void register_as_ext2(void)
+{
+       int err = register_filesystem(&ext2_fs_type);
+       if (err)
+               printk(KERN_WARNING
+                      "EXT4-fs: Unable to register as ext2 (%d)\n", err);
+}
+
+static inline void unregister_as_ext2(void)
+{
+       unregister_filesystem(&ext2_fs_type);
+}
+#else
+static inline void register_as_ext2(void) { }
+static inline void unregister_as_ext2(void) { }
+#endif
+
+#if !defined(CONTIG_EXT3_FS) && defined(CONFIG_EXT4_USE_FOR_EXT23)
+static struct file_system_type ext3_fs_type = {
+       .owner          = THIS_MODULE,
+       .name           = "ext3",
+       .get_sb         = ext4_get_sb,
+       .kill_sb        = kill_block_super,
+       .fs_flags       = FS_REQUIRES_DEV,
+};
+
+static inline void register_as_ext3(void)
+{
+       int err = register_filesystem(&ext3_fs_type);
+       if (err)
+               printk(KERN_WARNING
+                      "EXT4-fs: Unable to register as ext3 (%d)\n", err);
+}
+
+static inline void unregister_as_ext3(void)
+{
+       unregister_filesystem(&ext3_fs_type);
+}
+#else
+static inline void register_as_ext3(void) { }
+static inline void unregister_as_ext3(void) { }
+#endif
+
 static struct file_system_type ext4_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "ext4",
@@ -3989,11 +4041,15 @@ static int __init init_ext4_fs(void)
        err = init_inodecache();
        if (err)
                goto out1;
+       register_as_ext2();
+       register_as_ext3();
        err = register_filesystem(&ext4_fs_type);
        if (err)
                goto out;
        return 0;
 out:
+       unregister_as_ext2();
+       unregister_as_ext3();
        destroy_inodecache();
 out1:
        exit_ext4_xattr();
@@ -4009,6 +4065,8 @@ out4:
 
 static void __exit exit_ext4_fs(void)
 {
+       unregister_as_ext2();
+       unregister_as_ext3();
        unregister_filesystem(&ext4_fs_type);
        destroy_inodecache();
        exit_ext4_xattr();