Signed-off-by: Christian Brauner --- drivers/dma-buf/sw_sync.c | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c index 3c20f1d31cf5..7ff0d0e7dbc7 100644 --- a/drivers/dma-buf/sw_sync.c +++ b/drivers/dma-buf/sw_sync.c @@ -343,47 +343,35 @@ static int sw_sync_debugfs_release(struct inode *inode, struct file *file) static long sw_sync_ioctl_create_fence(struct sync_timeline *obj, unsigned long arg) { - int fd = get_unused_fd_flags(O_CLOEXEC); - int err; struct sync_pt *pt; struct sync_file *sync_file; struct sw_sync_create_fence_data data; + int err; - if (fd < 0) - return fd; - - if (copy_from_user(&data, (void __user *)arg, sizeof(data))) { - err = -EFAULT; - goto err; - } + if (copy_from_user(&data, (void __user *)arg, sizeof(data))) + return -EFAULT; pt = sync_pt_create(obj, data.value); - if (!pt) { - err = -ENOMEM; - goto err; - } + if (!pt) + return -ENOMEM; sync_file = sync_file_create(&pt->base); dma_fence_put(&pt->base); - if (!sync_file) { - err = -ENOMEM; - goto err; - } + if (!sync_file) + return -ENOMEM; - data.fence = fd; - if (copy_to_user((void __user *)arg, &data, sizeof(data))) { + FD_PREPARE(fdf, O_CLOEXEC, sync_file->file); + err = ACQUIRE_ERR(fd_prepare, &fdf); + if (err) { fput(sync_file->file); - err = -EFAULT; - goto err; + return err; } - fd_install(fd, sync_file->file); - - return 0; + data.fence = fd_prepare_fd(fdf); + if (copy_to_user((void __user *)arg, &data, sizeof(data))) + return -EFAULT; -err: - put_unused_fd(fd); - return err; + return fd_publish(fdf); } static long sw_sync_ioctl_inc(struct sync_timeline *obj, unsigned long arg) -- 2.47.3