From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wu Fengguang Subject: Re: [Bugme-new] [Bug 12843] New: add mount option 'mode' to ramfs same as tmpfs Date: Wed, 11 Mar 2009 15:56:05 +0800 Message-ID: <20090311075605.GA11344@localhost> References: <20090309145219.1bd7072c.akpm@linux-foundation.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="G4iJoqBmSsgzjUCe" Cc: linux-fsdevel@vger.kernel.org, bugme-daemon@bugzilla.kernel.org, matimatik@gmail.com To: Andrew Morton Return-path: Received: from mga03.intel.com ([143.182.124.21]:48749 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751021AbZCKH5I (ORCPT ); Wed, 11 Mar 2009 03:57:08 -0400 Content-Disposition: inline In-Reply-To: <20090309145219.1bd7072c.akpm@linux-foundation.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: --G4iJoqBmSsgzjUCe Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 --G4iJoqBmSsgzjUCe Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="ramfs-mount-option-mode.patch" ramfs: add support for "mode=" mount option Signed-off-by: Wu Fengguang --- 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 #include #include +#include #include #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", --G4iJoqBmSsgzjUCe--