openwrt/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch

87 lines
2.0 KiB
Diff

--- a/fs/ramfs/inode.c
+++ b/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;