Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ab7947a authored by David Howells's avatar David Howells Committed by Al Viro
Browse files

befs: Implement show_options



Implement the show_options superblock op for befs 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: default avatarDavid Howells <dhowells@redhat.com>
cc: Luis de Bethencourt <luisbg@osg.samsung.com>
cc: Salah Triki <salah.triki@gmail.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a66ca414
Loading
Loading
Loading
Loading
+21 −3
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/sched.h>
#include <linux/sched.h>
#include <linux/cred.h>
#include <linux/cred.h>
#include <linux/exportfs.h>
#include <linux/exportfs.h>
#include <linux/seq_file.h>


#include "befs.h"
#include "befs.h"
#include "btree.h"
#include "btree.h"
@@ -53,6 +54,7 @@ static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
static void befs_put_super(struct super_block *);
static void befs_put_super(struct super_block *);
static int befs_remount(struct super_block *, int *, char *);
static int befs_remount(struct super_block *, int *, char *);
static int befs_statfs(struct dentry *, struct kstatfs *);
static int befs_statfs(struct dentry *, struct kstatfs *);
static int befs_show_options(struct seq_file *, struct dentry *);
static int parse_options(char *, struct befs_mount_options *);
static int parse_options(char *, struct befs_mount_options *);
static struct dentry *befs_fh_to_dentry(struct super_block *sb,
static struct dentry *befs_fh_to_dentry(struct super_block *sb,
				struct fid *fid, int fh_len, int fh_type);
				struct fid *fid, int fh_len, int fh_type);
@@ -66,7 +68,7 @@ static const struct super_operations befs_sops = {
	.put_super	= befs_put_super,	/* uninit super */
	.put_super	= befs_put_super,	/* uninit super */
	.statfs		= befs_statfs,	/* statfs */
	.statfs		= befs_statfs,	/* statfs */
	.remount_fs	= befs_remount,
	.remount_fs	= befs_remount,
	.show_options	= generic_show_options,
	.show_options	= befs_show_options,
};
};


/* slab cache for befs_inode_info objects */
/* slab cache for befs_inode_info objects */
@@ -771,6 +773,24 @@ parse_options(char *options, struct befs_mount_options *opts)
	return 1;
	return 1;
}
}


static int befs_show_options(struct seq_file *m, struct dentry *root)
{
	struct befs_sb_info *befs_sb = BEFS_SB(root->d_sb);
	struct befs_mount_options *opts = &befs_sb->mount_opts;

	if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
		seq_printf(m, ",uid=%u",
			   from_kuid_munged(&init_user_ns, opts->uid));
	if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
		seq_printf(m, ",gid=%u",
			   from_kgid_munged(&init_user_ns, opts->gid));
	if (opts->iocharset)
		seq_printf(m, ",charset=%s", opts->iocharset);
	if (opts->debug)
		seq_puts(m, ",debug");
	return 0;
}

/* This function has the responsibiltiy of getting the
/* This function has the responsibiltiy of getting the
 * filesystem ready for unmounting.
 * filesystem ready for unmounting.
 * Basically, we free everything that we allocated in
 * Basically, we free everything that we allocated in
@@ -804,8 +824,6 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
	const off_t x86_sb_off = 512;
	const off_t x86_sb_off = 512;
	int blocksize;
	int blocksize;


	save_mount_options(sb, data);

	sb->s_fs_info = kzalloc(sizeof(*befs_sb), GFP_KERNEL);
	sb->s_fs_info = kzalloc(sizeof(*befs_sb), GFP_KERNEL);
	if (sb->s_fs_info == NULL)
	if (sb->s_fs_info == NULL)
		goto unacquire_none;
		goto unacquire_none;