diff options
Diffstat (limited to 'drivers/base/devtmpfs.c')
| -rw-r--r-- | drivers/base/devtmpfs.c | 17 | 
1 files changed, 15 insertions, 2 deletions
| diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 8be352ab4ddb..f41063ac1aee 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -29,6 +29,12 @@  #include <uapi/linux/mount.h>  #include "base.h" +#ifdef CONFIG_DEVTMPFS_SAFE +#define DEVTMPFS_MFLAGS       (MS_SILENT | MS_NOEXEC | MS_NOSUID) +#else +#define DEVTMPFS_MFLAGS       (MS_SILENT) +#endif +  static struct task_struct *thread;  static int __initdata mount_dev = IS_ENABLED(CONFIG_DEVTMPFS_MOUNT); @@ -59,8 +65,15 @@ static struct dentry *public_dev_mount(struct file_system_type *fs_type, int fla  		      const char *dev_name, void *data)  {  	struct super_block *s = mnt->mnt_sb; +	int err; +  	atomic_inc(&s->s_active);  	down_write(&s->s_umount); +	err = reconfigure_single(s, flags, data); +	if (err < 0) { +		deactivate_locked_super(s); +		return ERR_PTR(err); +	}  	return dget(s->s_root);  } @@ -363,7 +376,7 @@ int __init devtmpfs_mount(void)  	if (!thread)  		return 0; -	err = init_mount("devtmpfs", "dev", "devtmpfs", MS_SILENT, NULL); +	err = init_mount("devtmpfs", "dev", "devtmpfs", DEVTMPFS_MFLAGS, NULL);  	if (err)  		printk(KERN_INFO "devtmpfs: error mounting %i\n", err);  	else @@ -412,7 +425,7 @@ static noinline int __init devtmpfs_setup(void *p)  	err = ksys_unshare(CLONE_NEWNS);  	if (err)  		goto out; -	err = init_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL); +	err = init_mount("devtmpfs", "/", "devtmpfs", DEVTMPFS_MFLAGS, NULL);  	if (err)  		goto out;  	init_chdir("/.."); /* will traverse into overmounted root */ |