|
@@ -2881,6 +2881,12 @@ int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
|
|
}
|
|
|
EXPORT_SYMBOL(vfs_create);
|
|
|
|
|
|
+bool may_open_dev(const struct path *path)
|
|
|
+{
|
|
|
+ return !(path->mnt->mnt_flags & MNT_NODEV) &&
|
|
|
+ !(path->mnt->mnt_sb->s_iflags & SB_I_NODEV);
|
|
|
+}
|
|
|
+
|
|
|
static int may_open(struct path *path, int acc_mode, int flag)
|
|
|
{
|
|
|
struct dentry *dentry = path->dentry;
|
|
@@ -2899,7 +2905,7 @@ static int may_open(struct path *path, int acc_mode, int flag)
|
|
|
break;
|
|
|
case S_IFBLK:
|
|
|
case S_IFCHR:
|
|
|
- if (path->mnt->mnt_flags & MNT_NODEV)
|
|
|
+ if (!may_open_dev(path))
|
|
|
return -EACCES;
|
|
|
/*FALLTHRU*/
|
|
|
case S_IFIFO:
|