diff options
Diffstat (limited to 'fs/nfs/super.c')
| -rw-r--r-- | fs/nfs/super.c | 92 | 
1 files changed, 43 insertions, 49 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 134777406ee..3dfa4f112c0 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -41,7 +41,6 @@  #include <linux/lockd/bind.h>  #include <linux/seq_file.h>  #include <linux/mount.h> -#include <linux/mnt_namespace.h>  #include <linux/namei.h>  #include <linux/nfs_idmap.h>  #include <linux/vfs.h> @@ -263,10 +262,10 @@ static match_table_t nfs_local_lock_tokens = {  static void nfs_umount_begin(struct super_block *);  static int  nfs_statfs(struct dentry *, struct kstatfs *); -static int  nfs_show_options(struct seq_file *, struct vfsmount *); -static int  nfs_show_devname(struct seq_file *, struct vfsmount *); -static int  nfs_show_path(struct seq_file *, struct vfsmount *); -static int  nfs_show_stats(struct seq_file *, struct vfsmount *); +static int  nfs_show_options(struct seq_file *, struct dentry *); +static int  nfs_show_devname(struct seq_file *, struct dentry *); +static int  nfs_show_path(struct seq_file *, struct dentry *); +static int  nfs_show_stats(struct seq_file *, struct dentry *);  static struct dentry *nfs_fs_mount(struct file_system_type *,  		int, const char *, void *);  static struct dentry *nfs_xdev_mount(struct file_system_type *fs_type, @@ -721,9 +720,9 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss,  /*   * Describe the mount options on this VFS mountpoint   */ -static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt) +static int nfs_show_options(struct seq_file *m, struct dentry *root)  { -	struct nfs_server *nfss = NFS_SB(mnt->mnt_sb); +	struct nfs_server *nfss = NFS_SB(root->d_sb);  	nfs_show_mount_options(m, nfss, 0); @@ -761,14 +760,14 @@ static void show_pnfs(struct seq_file *m, struct nfs_server *server) {}  #endif  #endif -static int nfs_show_devname(struct seq_file *m, struct vfsmount *mnt) +static int nfs_show_devname(struct seq_file *m, struct dentry *root)  {  	char *page = (char *) __get_free_page(GFP_KERNEL);  	char *devname, *dummy;  	int err = 0;  	if (!page)  		return -ENOMEM; -	devname = nfs_path(&dummy, mnt->mnt_root, page, PAGE_SIZE); +	devname = nfs_path(&dummy, root, page, PAGE_SIZE);  	if (IS_ERR(devname))  		err = PTR_ERR(devname);  	else @@ -777,7 +776,7 @@ static int nfs_show_devname(struct seq_file *m, struct vfsmount *mnt)  	return err;  } -static int nfs_show_path(struct seq_file *m, struct vfsmount *mnt) +static int nfs_show_path(struct seq_file *m, struct dentry *dentry)  {  	seq_puts(m, "/");  	return 0; @@ -786,10 +785,10 @@ static int nfs_show_path(struct seq_file *m, struct vfsmount *mnt)  /*   * Present statistical information for this VFS mountpoint   */ -static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) +static int nfs_show_stats(struct seq_file *m, struct dentry *root)  {  	int i, cpu; -	struct nfs_server *nfss = NFS_SB(mnt->mnt_sb); +	struct nfs_server *nfss = NFS_SB(root->d_sb);  	struct rpc_auth *auth = nfss->client->cl_auth;  	struct nfs_iostats totals = { }; @@ -799,10 +798,10 @@ static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt)  	 * Display all mount option settings  	 */  	seq_printf(m, "\n\topts:\t"); -	seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw"); -	seq_puts(m, mnt->mnt_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : ""); -	seq_puts(m, mnt->mnt_sb->s_flags & MS_NOATIME ? ",noatime" : ""); -	seq_puts(m, mnt->mnt_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : ""); +	seq_puts(m, root->d_sb->s_flags & MS_RDONLY ? "ro" : "rw"); +	seq_puts(m, root->d_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : ""); +	seq_puts(m, root->d_sb->s_flags & MS_NOATIME ? ",noatime" : ""); +	seq_puts(m, root->d_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : "");  	nfs_show_mount_options(m, nfss, 1);  	seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ); @@ -909,10 +908,24 @@ static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(unsigned int ve  		data->auth_flavor_len	= 1;  		data->version		= version;  		data->minorversion	= 0; +		security_init_mnt_opts(&data->lsm_opts);  	}  	return data;  } +static void nfs_free_parsed_mount_data(struct nfs_parsed_mount_data *data) +{ +	if (data) { +		kfree(data->client_address); +		kfree(data->mount_server.hostname); +		kfree(data->nfs_server.export_path); +		kfree(data->nfs_server.hostname); +		kfree(data->fscache_uniq); +		security_free_mnt_opts(&data->lsm_opts); +		kfree(data); +	} +} +  /*   * Sanity-check a server address provided by the mount command.   * @@ -2220,9 +2233,7 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,  	data = nfs_alloc_parsed_mount_data(NFS_DEFAULT_VERSION);  	mntfh = nfs_alloc_fhandle();  	if (data == NULL || mntfh == NULL) -		goto out_free_fh; - -	security_init_mnt_opts(&data->lsm_opts); +		goto out;  	/* Validate the mount data */  	error = nfs_validate_mount_data(raw_data, data, mntfh, dev_name); @@ -2234,8 +2245,6 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,  #ifdef CONFIG_NFS_V4  	if (data->version == 4) {  		mntroot = nfs4_try_mount(flags, dev_name, data); -		kfree(data->client_address); -		kfree(data->nfs_server.export_path);  		goto out;  	}  #endif	/* CONFIG_NFS_V4 */ @@ -2290,13 +2299,8 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,  	s->s_flags |= MS_ACTIVE;  out: -	kfree(data->nfs_server.hostname); -	kfree(data->mount_server.hostname); -	kfree(data->fscache_uniq); -	security_free_mnt_opts(&data->lsm_opts); -out_free_fh: +	nfs_free_parsed_mount_data(data);  	nfs_free_fhandle(mntfh); -	kfree(data);  	return mntroot;  out_err_nosb: @@ -2623,9 +2627,7 @@ nfs4_remote_mount(struct file_system_type *fs_type, int flags,  	mntfh = nfs_alloc_fhandle();  	if (data == NULL || mntfh == NULL) -		goto out_free_fh; - -	security_init_mnt_opts(&data->lsm_opts); +		goto out;  	/* Get a volume representation */  	server = nfs4_create_server(data, mntfh); @@ -2677,13 +2679,10 @@ nfs4_remote_mount(struct file_system_type *fs_type, int flags,  	s->s_flags |= MS_ACTIVE; -	security_free_mnt_opts(&data->lsm_opts);  	nfs_free_fhandle(mntfh);  	return mntroot;  out: -	security_free_mnt_opts(&data->lsm_opts); -out_free_fh:  	nfs_free_fhandle(mntfh);  	return ERR_PTR(error); @@ -2788,11 +2787,15 @@ static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt,  		const char *export_path)  {  	struct dentry *dentry; -	int ret = nfs_referral_loop_protect(); +	int err; + +	if (IS_ERR(root_mnt)) +		return ERR_CAST(root_mnt); -	if (ret) { +	err = nfs_referral_loop_protect(); +	if (err) {  		mntput(root_mnt); -		return ERR_PTR(ret); +		return ERR_PTR(err);  	}  	dentry = mount_subtree(root_mnt, export_path); @@ -2816,9 +2819,7 @@ static struct dentry *nfs4_try_mount(int flags, const char *dev_name,  			data->nfs_server.hostname);  	data->nfs_server.export_path = export_path; -	res = ERR_CAST(root_mnt); -	if (!IS_ERR(root_mnt)) -		res = nfs_follow_remote_path(root_mnt, export_path); +	res = nfs_follow_remote_path(root_mnt, export_path);  	dfprintk(MOUNT, "<-- nfs4_try_mount() = %ld%s\n",  			IS_ERR(res) ? PTR_ERR(res) : 0, @@ -2838,7 +2839,7 @@ static struct dentry *nfs4_mount(struct file_system_type *fs_type,  	data = nfs_alloc_parsed_mount_data(4);  	if (data == NULL) -		goto out_free_data; +		goto out;  	/* Validate the mount data */  	error = nfs4_validate_mount_data(raw_data, data, dev_name); @@ -2852,12 +2853,7 @@ static struct dentry *nfs4_mount(struct file_system_type *fs_type,  		error = PTR_ERR(res);  out: -	kfree(data->client_address); -	kfree(data->nfs_server.export_path); -	kfree(data->nfs_server.hostname); -	kfree(data->fscache_uniq); -out_free_data: -	kfree(data); +	nfs_free_parsed_mount_data(data);  	dprintk("<-- nfs4_mount() = %d%s\n", error,  			error != 0 ? " [error]" : "");  	return res; @@ -3079,9 +3075,7 @@ static struct dentry *nfs4_referral_mount(struct file_system_type *fs_type,  			flags, data, data->hostname);  	data->mnt_path = export_path; -	res = ERR_CAST(root_mnt); -	if (!IS_ERR(root_mnt)) -		res = nfs_follow_remote_path(root_mnt, export_path); +	res = nfs_follow_remote_path(root_mnt, export_path);  	dprintk("<-- nfs4_referral_mount() = %ld%s\n",  			IS_ERR(res) ? PTR_ERR(res) : 0,  			IS_ERR(res) ? " [error]" : "");  | 
