diff options
| author | David Howells <dhowells@redhat.com> | 2017-07-05 16:25:16 +0100 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-07-11 06:06:17 -0400 | 
| commit | 26a7655e6a55768a082336dac8a4563344e890a2 (patch) | |
| tree | 08b8eb83ef0910dc8d0e515cd167018a67969a0a /fs/affs | |
| parent | 3ab7947ac3b5cd625c186bb608678bffd881e472 (diff) | |
| download | linux-26a7655e6a55768a082336dac8a4563344e890a2.tar.bz2 | |
affs: Implement show_options
Implement the show_options superblock op for affs as part of a bid to get
rid of s_options and generic_show_options() to make it easier to implement
a context-based mount where the mount options can be passed individually
over a file descriptor.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/affs')
| -rw-r--r-- | fs/affs/super.c | 42 | 
1 files changed, 37 insertions, 5 deletions
| diff --git a/fs/affs/super.c b/fs/affs/super.c index c2c27a8f128e..7bf47a41cb4f 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -20,9 +20,11 @@  #include <linux/slab.h>  #include <linux/writeback.h>  #include <linux/blkdev.h> +#include <linux/seq_file.h>  #include "affs.h"  static int affs_statfs(struct dentry *dentry, struct kstatfs *buf); +static int affs_show_options(struct seq_file *m, struct dentry *root);  static int affs_remount (struct super_block *sb, int *flags, char *data);  static void @@ -159,7 +161,7 @@ static const struct super_operations affs_sops = {  	.sync_fs	= affs_sync_fs,  	.statfs		= affs_statfs,  	.remount_fs	= affs_remount, -	.show_options	= generic_show_options, +	.show_options	= affs_show_options,  };  enum { @@ -293,6 +295,40 @@ parse_options(char *options, kuid_t *uid, kgid_t *gid, int *mode, int *reserved,  	return 1;  } +static int affs_show_options(struct seq_file *m, struct dentry *root) +{ +	struct super_block *sb = root->d_sb; +	struct affs_sb_info *sbi = AFFS_SB(sb); + +	if (sb->s_blocksize) +		seq_printf(m, ",bs=%lu", sb->s_blocksize); +	if (affs_test_opt(sbi->s_flags, SF_SETMODE)) +		seq_printf(m, ",mode=%o", sbi->s_mode); +	if (affs_test_opt(sbi->s_flags, SF_MUFS)) +		seq_puts(m, ",mufs"); +	if (affs_test_opt(sbi->s_flags, SF_NO_TRUNCATE)) +		seq_puts(m, ",nofilenametruncate"); +	if (affs_test_opt(sbi->s_flags, SF_PREFIX)) +		seq_printf(m, ",prefix=%s", sbi->s_prefix); +	if (affs_test_opt(sbi->s_flags, SF_IMMUTABLE)) +		seq_puts(m, ",protect"); +	if (sbi->s_reserved != 2) +		seq_printf(m, ",reserved=%u", sbi->s_reserved); +	if (sbi->s_root_block != (sbi->s_reserved + sbi->s_partition_size - 1) / 2) +		seq_printf(m, ",root=%u", sbi->s_root_block); +	if (affs_test_opt(sbi->s_flags, SF_SETGID)) +		seq_printf(m, ",setgid=%u", +			   from_kgid_munged(&init_user_ns, sbi->s_gid)); +	if (affs_test_opt(sbi->s_flags, SF_SETUID)) +		seq_printf(m, ",setuid=%u", +			   from_kuid_munged(&init_user_ns, sbi->s_uid)); +	if (affs_test_opt(sbi->s_flags, SF_VERBOSE)) +		seq_puts(m, ",verbose"); +	if (sbi->s_volume[0]) +		seq_printf(m, ",volume=%s", sbi->s_volume); +	return 0; +} +  /* This function definitely needs to be split up. Some fine day I'll   * hopefully have the guts to do so. Until then: sorry for the mess.   */ @@ -316,8 +352,6 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)  	u8			 sig[4];  	int			 ret; -	save_mount_options(sb, data); -  	pr_debug("read_super(%s)\n", data ? (const char *)data : "no options");  	sb->s_magic             = AFFS_SUPER_MAGIC; @@ -548,8 +582,6 @@ affs_remount(struct super_block *sb, int *flags, char *data)  	}  	flush_delayed_work(&sbi->sb_work); -	if (new_opts) -		replace_mount_options(sb, new_opts);  	sbi->s_flags = mount_flags;  	sbi->s_mode  = mode; |