|
@@ -75,11 +75,27 @@ static void ext4_write_super(struct super_block *sb);
|
|
static int ext4_freeze(struct super_block *sb);
|
|
static int ext4_freeze(struct super_block *sb);
|
|
static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
|
|
static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
|
|
const char *dev_name, void *data);
|
|
const char *dev_name, void *data);
|
|
|
|
+static inline int ext2_feature_set_ok(struct super_block *sb);
|
|
|
|
+static inline int ext3_feature_set_ok(struct super_block *sb);
|
|
static int ext4_feature_set_ok(struct super_block *sb, int readonly);
|
|
static int ext4_feature_set_ok(struct super_block *sb, int readonly);
|
|
static void ext4_destroy_lazyinit_thread(void);
|
|
static void ext4_destroy_lazyinit_thread(void);
|
|
static void ext4_unregister_li_request(struct super_block *sb);
|
|
static void ext4_unregister_li_request(struct super_block *sb);
|
|
static void ext4_clear_request_list(void);
|
|
static void ext4_clear_request_list(void);
|
|
|
|
|
|
|
|
+#if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
|
|
+static struct file_system_type ext2_fs_type = {
|
|
|
|
+ .owner = THIS_MODULE,
|
|
|
|
+ .name = "ext2",
|
|
|
|
+ .mount = ext4_mount,
|
|
|
|
+ .kill_sb = kill_block_super,
|
|
|
|
+ .fs_flags = FS_REQUIRES_DEV,
|
|
|
|
+};
|
|
|
|
+#define IS_EXT2_SB(sb) ((sb)->s_bdev->bd_holder == &ext2_fs_type)
|
|
|
|
+#else
|
|
|
|
+#define IS_EXT2_SB(sb) (0)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+
|
|
#if !defined(CONFIG_EXT3_FS) && !defined(CONFIG_EXT3_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
#if !defined(CONFIG_EXT3_FS) && !defined(CONFIG_EXT3_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
static struct file_system_type ext3_fs_type = {
|
|
static struct file_system_type ext3_fs_type = {
|
|
.owner = THIS_MODULE,
|
|
.owner = THIS_MODULE,
|
|
@@ -3187,6 +3203,28 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|
"feature flags set on rev 0 fs, "
|
|
"feature flags set on rev 0 fs, "
|
|
"running e2fsck is recommended");
|
|
"running e2fsck is recommended");
|
|
|
|
|
|
|
|
+ if (IS_EXT2_SB(sb)) {
|
|
|
|
+ if (ext2_feature_set_ok(sb))
|
|
|
|
+ ext4_msg(sb, KERN_INFO, "mounting ext2 file system "
|
|
|
|
+ "using the ext4 subsystem");
|
|
|
|
+ else {
|
|
|
|
+ ext4_msg(sb, KERN_ERR, "couldn't mount as ext2 due "
|
|
|
|
+ "to feature incompatibilities");
|
|
|
|
+ goto failed_mount;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (IS_EXT3_SB(sb)) {
|
|
|
|
+ if (ext3_feature_set_ok(sb))
|
|
|
|
+ ext4_msg(sb, KERN_INFO, "mounting ext3 file system "
|
|
|
|
+ "using the ext4 subsystem");
|
|
|
|
+ else {
|
|
|
|
+ ext4_msg(sb, KERN_ERR, "couldn't mount as ext3 due "
|
|
|
|
+ "to feature incompatibilities");
|
|
|
|
+ goto failed_mount;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Check feature flags regardless of the revision level, since we
|
|
* Check feature flags regardless of the revision level, since we
|
|
* previously didn't change the revision level when setting the flags,
|
|
* previously didn't change the revision level when setting the flags,
|
|
@@ -4772,14 +4810,6 @@ static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
|
|
}
|
|
}
|
|
|
|
|
|
#if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
#if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
-static struct file_system_type ext2_fs_type = {
|
|
|
|
- .owner = THIS_MODULE,
|
|
|
|
- .name = "ext2",
|
|
|
|
- .mount = ext4_mount,
|
|
|
|
- .kill_sb = kill_block_super,
|
|
|
|
- .fs_flags = FS_REQUIRES_DEV,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
static inline void register_as_ext2(void)
|
|
static inline void register_as_ext2(void)
|
|
{
|
|
{
|
|
int err = register_filesystem(&ext2_fs_type);
|
|
int err = register_filesystem(&ext2_fs_type);
|
|
@@ -4792,10 +4822,22 @@ static inline void unregister_as_ext2(void)
|
|
{
|
|
{
|
|
unregister_filesystem(&ext2_fs_type);
|
|
unregister_filesystem(&ext2_fs_type);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static inline int ext2_feature_set_ok(struct super_block *sb)
|
|
|
|
+{
|
|
|
|
+ if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP))
|
|
|
|
+ return 0;
|
|
|
|
+ if (sb->s_flags & MS_RDONLY)
|
|
|
|
+ return 1;
|
|
|
|
+ if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))
|
|
|
|
+ return 0;
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
MODULE_ALIAS("ext2");
|
|
MODULE_ALIAS("ext2");
|
|
#else
|
|
#else
|
|
static inline void register_as_ext2(void) { }
|
|
static inline void register_as_ext2(void) { }
|
|
static inline void unregister_as_ext2(void) { }
|
|
static inline void unregister_as_ext2(void) { }
|
|
|
|
+static inline int ext2_feature_set_ok(struct super_block *sb) { return 0; }
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#if !defined(CONFIG_EXT3_FS) && !defined(CONFIG_EXT3_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
#if !defined(CONFIG_EXT3_FS) && !defined(CONFIG_EXT3_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT23)
|
|
@@ -4811,10 +4853,24 @@ static inline void unregister_as_ext3(void)
|
|
{
|
|
{
|
|
unregister_filesystem(&ext3_fs_type);
|
|
unregister_filesystem(&ext3_fs_type);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static inline int ext3_feature_set_ok(struct super_block *sb)
|
|
|
|
+{
|
|
|
|
+ if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT3_FEATURE_INCOMPAT_SUPP))
|
|
|
|
+ return 0;
|
|
|
|
+ if (!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL))
|
|
|
|
+ return 0;
|
|
|
|
+ if (sb->s_flags & MS_RDONLY)
|
|
|
|
+ return 1;
|
|
|
|
+ if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP))
|
|
|
|
+ return 0;
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
MODULE_ALIAS("ext3");
|
|
MODULE_ALIAS("ext3");
|
|
#else
|
|
#else
|
|
static inline void register_as_ext3(void) { }
|
|
static inline void register_as_ext3(void) { }
|
|
static inline void unregister_as_ext3(void) { }
|
|
static inline void unregister_as_ext3(void) { }
|
|
|
|
+static inline int ext3_feature_set_ok(struct super_block *sb) { return 0; }
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static struct file_system_type ext4_fs_type = {
|
|
static struct file_system_type ext4_fs_type = {
|
|
@@ -4898,8 +4954,8 @@ static int __init ext4_init_fs(void)
|
|
err = init_inodecache();
|
|
err = init_inodecache();
|
|
if (err)
|
|
if (err)
|
|
goto out1;
|
|
goto out1;
|
|
- register_as_ext2();
|
|
|
|
register_as_ext3();
|
|
register_as_ext3();
|
|
|
|
+ register_as_ext2();
|
|
err = register_filesystem(&ext4_fs_type);
|
|
err = register_filesystem(&ext4_fs_type);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|