87 lines
2.0 KiB
Diff
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;
|
|
|