| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- Index: linux-2.6.21.7/fs/ramfs/inode.c
- ===================================================================
- --- linux-2.6.21.7.orig/fs/ramfs/inode.c
- +++ linux-2.6.21.7/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;
-
|