* Re: [Bugme-new] [Bug 12843] New: add mount option 'mode' to ramfs same as tmpfs
2009-03-09 21:52 ` [Bugme-new] [Bug 12843] New: add mount option 'mode' to ramfs same as tmpfs Andrew Morton
@ 2009-03-11 7:56 ` Wu Fengguang
0 siblings, 0 replies; 2+ messages in thread
From: Wu Fengguang @ 2009-03-11 7:56 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-fsdevel, bugme-daemon, matimatik
[-- Attachment #1: Type: text/plain, Size: 1477 bytes --]
On Mon, Mar 09, 2009 at 02:52:19PM -0700, Andrew Morton wrote:
>
> (switched to email. Please respond via emailed reply-to-all, not via the
> bugzilla web interface).
>
> On Sun, 8 Mar 2009 14:16:13 -0700 (PDT)
> bugme-daemon@bugzilla.kernel.org wrote:
>
> > http://bugzilla.kernel.org/show_bug.cgi?id=12843
> >
> > Summary: add mount option 'mode' to ramfs same as tmpfs
> > Product: File System
> > Version: 2.5
> > KernelVersion: any
> > Platform: All
> > OS/Version: Linux
> > Tree: Mainline
> > Status: NEW
> > Severity: enhancement
> > Priority: P1
> > Component: Other
> > AssignedTo: fs_other@kernel-bugs.osdl.org
> > ReportedBy: matimatik@gmail.com
> >
> >
> > Latest working kernel version:
> > Earliest failing kernel version:
> > Distribution:
> > Hardware Environment:
> > Software Environment:
> > Problem Description:
> >
> > I use ramfs instead of tmpfs for /tmp because I don't use swap on my laptop.
> > Some apps need 1777 mode for /tmp directory, but ramfs does not support 'mode='
> > mount option. I'll be happy if I shall not invent workarounds for this small,
> > but offensive truble. I think this feature (mode=) will not increase code too
> > much and is not too hard to implement, but will be very usefull.
> >
>
> A feature request!
Hi Avan Anishchuk,
The attached patch works for me :-)
Thanks,
Fengguang
[-- Attachment #2: ramfs-mount-option-mode.patch --]
[-- Type: text/x-diff, Size: 3275 bytes --]
ramfs: add support for "mode=" mount option
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
fs/ramfs/inode.c | 94 +++++++++++++++++++++++++++++++++++++++++----
1 file changed, 86 insertions(+), 8 deletions(-)
--- mm.orig/fs/ramfs/inode.c
+++ mm/fs/ramfs/inode.c
@@ -33,12 +33,15 @@
#include <linux/backing-dev.h>
#include <linux/ramfs.h>
#include <linux/sched.h>
+#include <linux/parser.h>
#include <asm/uaccess.h>
#include "internal.h"
/* some random number */
#define RAMFS_MAGIC 0x858458f6
+#define RAMFS_DEFAULT_MODE 0755
+
static const struct super_operations ramfs_ops;
static const struct inode_operations ramfs_dir_inode_operations;
@@ -158,12 +161,75 @@ static const struct inode_operations ram
static const struct super_operations ramfs_ops = {
.statfs = simple_statfs,
.drop_inode = generic_delete_inode,
+ .show_options = generic_show_options,
+};
+
+struct ramfs_mount_opts {
+ umode_t mode;
+};
+
+enum {
+ Opt_mode,
+ Opt_err
+};
+
+static const match_table_t tokens = {
+ {Opt_mode, "mode=%o"},
+ {Opt_err, NULL}
};
+struct ramfs_fs_info {
+ struct ramfs_mount_opts mount_opts;
+};
+
+static int ramfs_parse_options(char *data, struct ramfs_mount_opts *opts)
+{
+ substring_t args[MAX_OPT_ARGS];
+ int option;
+ int token;
+ char *p;
+
+ opts->mode = RAMFS_DEFAULT_MODE;
+
+ while ((p = strsep(&data, ",")) != NULL) {
+ if (!*p)
+ continue;
+
+ token = match_token(p, tokens, args);
+ switch (token) {
+ case Opt_mode:
+ if (match_octal(&args[0], &option))
+ return -EINVAL;
+ opts->mode = option & S_IALLUGO;
+ break;
+ default:
+ printk(KERN_ERR "ramfs: bad mount option: %s\n", p);
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
{
- struct inode * inode;
- struct dentry * root;
+ struct ramfs_fs_info *fsi;
+ struct inode *inode = NULL;
+ struct dentry *root;
+ int err;
+
+ save_mount_options(sb, data);
+
+ fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);
+ if (!fsi) {
+ err = -ENOMEM;
+ goto fail;
+ }
+ sb->s_fs_info = fsi;
+
+ err = ramfs_parse_options(data, &fsi->mount_opts);
+ if (err)
+ goto fail;
sb->s_maxbytes = MAX_LFS_FILESIZE;
sb->s_blocksize = PAGE_CACHE_SIZE;
@@ -171,17 +237,23 @@ 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);
- if (!inode)
- return -ENOMEM;
+ inode = ramfs_get_inode(sb, S_IFDIR | fsi->mount_opts.mode, 0);
+ if (!inode) {
+ err = -ENOMEM;
+ goto fail;
+ }
root = d_alloc_root(inode);
if (!root) {
- iput(inode);
- return -ENOMEM;
+ err = -ENOMEM;
+ goto fail;
}
sb->s_root = root;
return 0;
+fail:
+ kfree(fsi);
+ iput(inode);
+ return err;
}
int ramfs_get_sb(struct file_system_type *fs_type,
@@ -197,10 +269,16 @@ static int rootfs_get_sb(struct file_sys
mnt);
}
+static void ramfs_kill_sb(struct super_block *sb)
+{
+ kfree(sb->s_fs_info);
+ kill_litter_super(sb);
+}
+
static struct file_system_type ramfs_fs_type = {
.name = "ramfs",
.get_sb = ramfs_get_sb,
- .kill_sb = kill_litter_super,
+ .kill_sb = ramfs_kill_sb,
};
static struct file_system_type rootfs_fs_type = {
.name = "rootfs",
^ permalink raw reply [flat|nested] 2+ messages in thread