aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-07-22 15:04:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-07-22 15:04:51 -0400
commit165ea0d1c2286f550efbf14dc3528267af088f08 (patch)
tree913ef8a34b31056ad13f04ec1dbb38a092974d88
parentf88a333b44318643282b8acc92af90deda441f5e (diff)
parent9ba546c01976a426292af99e682a557075d6c010 (diff)
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs fixes from Al Viro: "Fix several places that screw up cleanups after failures halfway through opening a file (one open-coding filp_clone_open() and getting it wrong, two misusing alloc_file()). That part is -stable fodder from the 'work.open' branch. And Christoph's regression fix for uapi breakage in aio series; include/uapi/linux/aio_abi.h shouldn't be pulling in the kernel definition of sigset_t, the reason for doing so in the first place had been bogus - there's no need to expose struct __aio_sigset in aio_abi.h at all" * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: aio: don't expose __aio_sigset in uapi ocxlflash_getfile(): fix double-iput() on alloc_file() failures cxl_getfile(): fix double-iput() on alloc_file() failures drm_mode_create_lease_ioctl(): fix open-coded filp_clone_open()
-rw-r--r--drivers/gpu/drm/drm_lease.c16
-rw-r--r--drivers/misc/cxl/api.c8
-rw-r--r--drivers/scsi/cxlflash/ocxl_hw.c5
-rw-r--r--fs/aio.c5
-rw-r--r--fs/internal.h1
-rw-r--r--include/linux/fs.h1
-rw-r--r--include/linux/syscalls.h1
-rw-r--r--include/uapi/linux/aio_abi.h6
8 files changed, 14 insertions, 29 deletions
diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c
index 50c73c0a20b9..d638c0fb3418 100644
--- a/drivers/gpu/drm/drm_lease.c
+++ b/drivers/gpu/drm/drm_lease.c
@@ -553,24 +553,13 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev,
553 553
554 /* Clone the lessor file to create a new file for us */ 554 /* Clone the lessor file to create a new file for us */
555 DRM_DEBUG_LEASE("Allocating lease file\n"); 555 DRM_DEBUG_LEASE("Allocating lease file\n");
556 path_get(&lessor_file->f_path); 556 lessee_file = filp_clone_open(lessor_file);
557 lessee_file = alloc_file(&lessor_file->f_path,
558 lessor_file->f_mode,
559 fops_get(lessor_file->f_inode->i_fop));
560
561 if (IS_ERR(lessee_file)) { 557 if (IS_ERR(lessee_file)) {
562 ret = PTR_ERR(lessee_file); 558 ret = PTR_ERR(lessee_file);
563 goto out_lessee; 559 goto out_lessee;
564 } 560 }
565 561
566 /* Initialize the new file for DRM */
567 DRM_DEBUG_LEASE("Initializing the file with %p\n", lessee_file->f_op->open);
568 ret = lessee_file->f_op->open(lessee_file->f_inode, lessee_file);
569 if (ret)
570 goto out_lessee_file;
571
572 lessee_priv = lessee_file->private_data; 562 lessee_priv = lessee_file->private_data;
573
574 /* Change the file to a master one */ 563 /* Change the file to a master one */
575 drm_master_put(&lessee_priv->master); 564 drm_master_put(&lessee_priv->master);
576 lessee_priv->master = lessee; 565 lessee_priv->master = lessee;
@@ -588,9 +577,6 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev,
588 DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl succeeded\n"); 577 DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl succeeded\n");
589 return 0; 578 return 0;
590 579
591out_lessee_file:
592 fput(lessee_file);
593
594out_lessee: 580out_lessee:
595 drm_master_put(&lessee); 581 drm_master_put(&lessee);
596 582
diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c
index 753b1a698fc4..6b16946f9b05 100644
--- a/drivers/misc/cxl/api.c
+++ b/drivers/misc/cxl/api.c
@@ -103,15 +103,15 @@ static struct file *cxl_getfile(const char *name,
103 d_instantiate(path.dentry, inode); 103 d_instantiate(path.dentry, inode);
104 104
105 file = alloc_file(&path, OPEN_FMODE(flags), fops); 105 file = alloc_file(&path, OPEN_FMODE(flags), fops);
106 if (IS_ERR(file)) 106 if (IS_ERR(file)) {
107 goto err_dput; 107 path_put(&path);
108 goto err_fs;
109 }
108 file->f_flags = flags & (O_ACCMODE | O_NONBLOCK); 110 file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
109 file->private_data = priv; 111 file->private_data = priv;
110 112
111 return file; 113 return file;
112 114
113err_dput:
114 path_put(&path);
115err_inode: 115err_inode:
116 iput(inode); 116 iput(inode);
117err_fs: 117err_fs:
diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c
index 0a95b5f25380..497a68389461 100644
--- a/drivers/scsi/cxlflash/ocxl_hw.c
+++ b/drivers/scsi/cxlflash/ocxl_hw.c
@@ -134,15 +134,14 @@ static struct file *ocxlflash_getfile(struct device *dev, const char *name,
134 rc = PTR_ERR(file); 134 rc = PTR_ERR(file);
135 dev_err(dev, "%s: alloc_file failed rc=%d\n", 135 dev_err(dev, "%s: alloc_file failed rc=%d\n",
136 __func__, rc); 136 __func__, rc);
137 goto err5; 137 path_put(&path);
138 goto err3;
138 } 139 }
139 140
140 file->f_flags = flags & (O_ACCMODE | O_NONBLOCK); 141 file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
141 file->private_data = priv; 142 file->private_data = priv;
142out: 143out:
143 return file; 144 return file;
144err5:
145 path_put(&path);
146err4: 145err4:
147 iput(inode); 146 iput(inode);
148err3: 147err3:
diff --git a/fs/aio.c b/fs/aio.c
index 210df9da1283..27454594e37a 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1896,6 +1896,11 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,
1896 return ret; 1896 return ret;
1897} 1897}
1898 1898
1899struct __aio_sigset {
1900 const sigset_t __user *sigmask;
1901 size_t sigsetsize;
1902};
1903
1899SYSCALL_DEFINE6(io_pgetevents, 1904SYSCALL_DEFINE6(io_pgetevents,
1900 aio_context_t, ctx_id, 1905 aio_context_t, ctx_id,
1901 long, min_nr, 1906 long, min_nr,
diff --git a/fs/internal.h b/fs/internal.h
index 980d005b21b4..5645b4ebf494 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -127,7 +127,6 @@ int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
127 127
128extern int open_check_o_direct(struct file *f); 128extern int open_check_o_direct(struct file *f);
129extern int vfs_open(const struct path *, struct file *, const struct cred *); 129extern int vfs_open(const struct path *, struct file *, const struct cred *);
130extern struct file *filp_clone_open(struct file *);
131 130
132/* 131/*
133 * inode.c 132 * inode.c
diff --git a/include/linux/fs.h b/include/linux/fs.h
index d78d146a98da..805bf22898cf 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2420,6 +2420,7 @@ extern struct file *filp_open(const char *, int, umode_t);
2420extern struct file *file_open_root(struct dentry *, struct vfsmount *, 2420extern struct file *file_open_root(struct dentry *, struct vfsmount *,
2421 const char *, int, umode_t); 2421 const char *, int, umode_t);
2422extern struct file * dentry_open(const struct path *, int, const struct cred *); 2422extern struct file * dentry_open(const struct path *, int, const struct cred *);
2423extern struct file *filp_clone_open(struct file *);
2423extern int filp_close(struct file *, fl_owner_t id); 2424extern int filp_close(struct file *, fl_owner_t id);
2424 2425
2425extern struct filename *getname_flags(const char __user *, int, int *); 2426extern struct filename *getname_flags(const char __user *, int, int *);
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index a368a68cb667..5c1a0933768e 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -11,6 +11,7 @@
11#ifndef _LINUX_SYSCALLS_H 11#ifndef _LINUX_SYSCALLS_H
12#define _LINUX_SYSCALLS_H 12#define _LINUX_SYSCALLS_H
13 13
14struct __aio_sigset;
14struct epoll_event; 15struct epoll_event;
15struct iattr; 16struct iattr;
16struct inode; 17struct inode;
diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h
index 3c5038b587ba..d4593a6062ef 100644
--- a/include/uapi/linux/aio_abi.h
+++ b/include/uapi/linux/aio_abi.h
@@ -29,7 +29,6 @@
29 29
30#include <linux/types.h> 30#include <linux/types.h>
31#include <linux/fs.h> 31#include <linux/fs.h>
32#include <linux/signal.h>
33#include <asm/byteorder.h> 32#include <asm/byteorder.h>
34 33
35typedef __kernel_ulong_t aio_context_t; 34typedef __kernel_ulong_t aio_context_t;
@@ -110,10 +109,5 @@ struct iocb {
110#undef IFBIG 109#undef IFBIG
111#undef IFLITTLE 110#undef IFLITTLE
112 111
113struct __aio_sigset {
114 const sigset_t __user *sigmask;
115 size_t sigsetsize;
116};
117
118#endif /* __LINUX__AIO_ABI_H */ 112#endif /* __LINUX__AIO_ABI_H */
119 113