diff options
Diffstat (limited to 'target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch')
-rw-r--r-- | target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch b/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch new file mode 100644 index 0000000..423eab5 --- /dev/null +++ b/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch @@ -0,0 +1,88 @@ +Index: linux-2.6.21gum/fs/ramfs/inode.c +=================================================================== +--- linux-2.6.21gum.orig/fs/ramfs/inode.c ++++ linux-2.6.21gum/fs/ramfs/inode.c +@@ -33,6 +33,7 @@ + #include <linux/smp_lock.h> + #include <linux/backing-dev.h> + #include <linux/ramfs.h> ++#include <linux/ctype.h> + + #include <asm/uaccess.h> + #include "internal.h" +@@ -160,10 +161,66 @@ static const struct super_operations ram + .drop_inode = generic_delete_inode, + }; + ++static int ramfs_parse_options(char *options, int *mode) ++{ ++ char *this_char, *value, *rest; ++ ++ while (options != NULL) { ++ this_char = options; ++ for (;;) { ++ /* ++ * NUL-terminate this option: unfortunately, ++ * mount options form a comma-separated list, ++ * but mpol's nodelist may also contain commas. ++ */ ++ options = strchr(options, ','); ++ if (options == NULL) ++ break; ++ options++; ++ if (!isdigit(*options)) { ++ options[-1] = '\0'; ++ break; ++ } ++ } ++ if (!*this_char) ++ continue; ++ if ((value = strchr(this_char,'=')) != NULL) { ++ *value++ = 0; ++ } else { ++ printk(KERN_ERR ++ "ramfs: No value for mount option '%s'\n", ++ this_char); ++ return 1; ++ } ++ ++ if (!strcmp(this_char,"mode")) { ++ if (!mode) ++ continue; ++ *mode = simple_strtoul(value,&rest,8); ++ if (*rest) ++ goto bad_val; ++ } else { ++ printk(KERN_ERR "ramfs: Bad mount option %s\n", ++ this_char); ++ return 1; ++ } ++ } ++ return 0; ++ ++bad_val: ++ printk(KERN_ERR "ramfs: Bad value '%s' for mount option '%s'\n", ++ value, this_char); ++ return 1; ++} ++ + static int ramfs_fill_super(struct super_block * sb, void * data, int silent) + { + struct inode * inode; + struct dentry * root; ++ int mode = 0755; ++ ++ if (ramfs_parse_options(data, &mode)) ++ return -EINVAL; + + sb->s_maxbytes = MAX_LFS_FILESIZE; + sb->s_blocksize = PAGE_CACHE_SIZE; +@@ -171,7 +228,7 @@ static int ramfs_fill_super(struct super + sb->s_magic = RAMFS_MAGIC; + sb->s_op = &ramfs_ops; + sb->s_time_gran = 1; +- inode = ramfs_get_inode(sb, S_IFDIR | 0755, 0); ++ inode = ramfs_get_inode(sb, S_IFDIR | mode, 0); + if (!inode) + return -ENOMEM; + |