Messages in this thread Patch in this message | | | Date | Tue, 1 Dec 2009 20:30:36 -0500 | Subject | [PATCH] ext2/3 as ext4 | From | Philip Wernersbach <> |
| |
Hello Everyone, Below is a small patch I wrote for kernel version 2.6.31.6. It causes ext2/3 filesystems to be mounted using the ext4 driver, in a way that is transparent to the userspace (and kernelspace for that matter, as long as the code uses the kernel's mounting API) and requires no change to the userspace (/kernelspace). This patch is useful because: 1) It allows minimalist kernel fanatics, like myself, to drop 2 drivers from their builds without any loss in functionality. 2) It allows the ext2/3 filesystems to take advantage of the performance/general improvements in the ext4 driver. 3) In the future, with this patch, the ext2/3 driver code could be dropped from the kernel without any loss in functionality. I have been using this patch for 2 months now with no flaws on my home Linux box, which uses ext3 drives on a daily basis.
Let me know if you use this patch, if enough people use it I will write a proper KCONFIG and submit it for inclusion into the kernel.
So without further ado, here is the patch.
Sincerely, Philip Wernersbach <philip.wernersbach@gmail.com>
--- linux-2.6.31.6.orig/fs/namespace.c 2009-11-28 22:30:07.178682500 -0500 +++ linux-2.6.31.6/fs/namespace.c 2009-11-28 22:32:42.813462139 -0500 @@ -6,6 +6,8 @@ * * Based on code from fs/super.c, copyright Linus Torvalds and others. * Heavily rewritten. + * + * Uses ext2/3 as ext4 patch by Philip Wernersbach (November 2009) */
#include <linux/syscalls.h> @@ -1838,6 +1840,34 @@ return n; }
+/* + * compare_fs_names(char *fs1, char *fs2) - Part of the ext2/3 as ext4 patch + * + * The following is a standard string compare function, made to compare + * filesystem names, it returns 0 if they equal, and 1 if they do not. + * It only handles strings up to 255 characters though, so be cautious. + */ +static int compare_fs_names(char *fs1, char *fs2) +{ + int i; + + if (fs1 == 0L || fs2 == 0L) return 1; + + for (i=0;i<256;i++) + { + if (fs1[i] != fs2[i]) + return 1; + if (fs1[i] == 0 && fs2[i] == 0) + return 0; + if (fs1[i] == 0) + return 1; + if (fs2[i] == 0) + return 1; + } + return 0; +} + + int copy_mount_options(const void __user * data, unsigned long *where) { int i; @@ -1891,6 +1921,22 @@ struct path path; int retval = 0; int mnt_flags = 0; + + /* + * This causes ext2 filesystems to be mounted with the ext4 driver. + * + * Part of the ext2/3 as ext4 patch. + */ + if (compare_fs_names(type_page, "ext2") == 0) + type_page[3] = '4'; + + /* + * This causes ext3 filesystems to be mounted with the ext4 driver. + * + * Part of the ext2/3 as ext4 patch. + */ + if (compare_fs_names(type_page, "ext3") == 0) + type_page[3] = '4';
/* Discard magic */ if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
| |