anonfd: Allow making anon files read-only
[deliverable/linux.git] / fs / anon_inodes.c
index 2c994591f4d7a4fe89021c00110df70b5df8a433..598237e972212b4908dd61db2824107c92c0f2f2 100644 (file)
@@ -89,11 +89,19 @@ struct file *anon_inode_getfile(const char *name,
        struct qstr this;
        struct path path;
        struct file *file;
+       fmode_t mode;
        int error;
 
        if (IS_ERR(anon_inode_inode))
                return ERR_PTR(-ENODEV);
 
+       switch (flags & O_ACCMODE) {
+       case O_RDONLY: mode = FMODE_READ;               break;
+       case O_WRONLY: mode = FMODE_WRITE;              break;
+       case O_RDWR:   mode = FMODE_READ | FMODE_WRITE; break;
+       default:       return ERR_PTR(-EINVAL);
+       }
+
        if (fops->owner && !try_module_get(fops->owner))
                return ERR_PTR(-ENOENT);
 
@@ -121,13 +129,13 @@ struct file *anon_inode_getfile(const char *name,
        d_instantiate(path.dentry, anon_inode_inode);
 
        error = -ENFILE;
-       file = alloc_file(&path, FMODE_READ | FMODE_WRITE, fops);
+       file = alloc_file(&path, mode, fops);
        if (!file)
                goto err_dput;
        file->f_mapping = anon_inode_inode->i_mapping;
 
        file->f_pos = 0;
-       file->f_flags = O_RDWR | (flags & O_NONBLOCK);
+       file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
        file->f_version = 0;
        file->private_data = priv;
 
This page took 0.024933 seconds and 5 git commands to generate.