Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs fixes from Al Viro:
 "A couple of fixes for old crap in ->atomic_open() instances"

* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  cifs_atomic_open(): fix double-put on late allocation failure
  gfs2_atomic_open(): fix O_EXCL|O_CREAT handling on cold dcache
This commit is contained in:
Linus Torvalds 2020-03-12 15:51:26 -07:00
commit 807f030b44
4 changed files with 9 additions and 5 deletions

View File

@ -850,3 +850,11 @@ business doing so.
d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are
very suspect (and won't work in modules). Such uses are very likely to very suspect (and won't work in modules). Such uses are very likely to
be misspelled d_alloc_anon(). be misspelled d_alloc_anon().
---
**mandatory**
[should've been added in 2016] stale comment in finish_open() nonwithstanding,
failure exits in ->atomic_open() instances should *NOT* fput() the file,
no matter what. Everything is handled by the caller.

View File

@ -555,7 +555,6 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry,
if (server->ops->close) if (server->ops->close)
server->ops->close(xid, tcon, &fid); server->ops->close(xid, tcon, &fid);
cifs_del_pending_open(&open); cifs_del_pending_open(&open);
fput(file);
rc = -ENOMEM; rc = -ENOMEM;
} }

View File

@ -1248,7 +1248,7 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry,
if (!(file->f_mode & FMODE_OPENED)) if (!(file->f_mode & FMODE_OPENED))
return finish_no_open(file, d); return finish_no_open(file, d);
dput(d); dput(d);
return 0; return excl && (flags & O_CREAT) ? -EEXIST : 0;
} }
BUG_ON(d != NULL); BUG_ON(d != NULL);

View File

@ -860,9 +860,6 @@ cleanup_file:
* the return value of d_splice_alias(), then the caller needs to perform dput() * the return value of d_splice_alias(), then the caller needs to perform dput()
* on it after finish_open(). * on it after finish_open().
* *
* On successful return @file is a fully instantiated open file. After this, if
* an error occurs in ->atomic_open(), it needs to clean up with fput().
*
* Returns zero on success or -errno if the open failed. * Returns zero on success or -errno if the open failed.
*/ */
int finish_open(struct file *file, struct dentry *dentry, int finish_open(struct file *file, struct dentry *dentry,