Skip to content

Commit

Permalink
Merge branch 'vfs-fixes' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/mszeredi/vfs

Pull vfs fixes from Miklos Szeredi.

This mainly fixes some confusion about whether the open 'mode' variable
passed around should contain the full file type (S_IFREG etc)
information or just the permission mode.  In particular, the lack of
proper file type information had confused fuse.

* 'vfs-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs:
  vfs: fix propagation of atomic_open create error on negative dentry
  fuse: check create mode in atomic open
  vfs: pass right create mode to may_o_create()
  vfs: atomic_open(): fix create mode usage
  vfs: canonicalize create mode in build_open_flags()
  • Loading branch information
Linus Torvalds committed Aug 18, 2012
2 parents 1ce41cd + 62b2ce9 commit 20fb193
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 5 deletions.
3 changes: 3 additions & 0 deletions fs/fuse/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,9 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
struct fuse_entry_out outentry;
struct fuse_file *ff;

/* Userspace expects S_IFREG in create mode */
BUG_ON((mode & S_IFMT) != S_IFREG);

forget = fuse_alloc_forget();
err = -ENOMEM;
if (!forget)
Expand Down
8 changes: 6 additions & 2 deletions fs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -2414,7 +2414,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
goto out;
}

mode = op->mode & S_IALLUGO;
mode = op->mode;
if ((open_flag & O_CREAT) && !IS_POSIXACL(dir))
mode &= ~current_umask();

Expand Down Expand Up @@ -2452,7 +2452,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
}

if (open_flag & O_CREAT) {
error = may_o_create(&nd->path, dentry, op->mode);
error = may_o_create(&nd->path, dentry, mode);
if (error) {
create_error = error;
if (open_flag & O_EXCL)
Expand Down Expand Up @@ -2489,6 +2489,10 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
dput(dentry);
dentry = file->f_path.dentry;
}
if (create_error && dentry->d_inode == NULL) {
error = create_error;
goto out;
}
goto looked_up;
}

Expand Down
7 changes: 4 additions & 3 deletions fs/open.c
Original file line number Diff line number Diff line change
Expand Up @@ -852,9 +852,10 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
int lookup_flags = 0;
int acc_mode;

if (!(flags & O_CREAT))
mode = 0;
op->mode = mode;
if (flags & O_CREAT)
op->mode = (mode & S_IALLUGO) | S_IFREG;
else
op->mode = 0;

/* Must never be set by userspace */
flags &= ~FMODE_NONOTIFY;
Expand Down

0 comments on commit 20fb193

Please sign in to comment.