Rely on the fd exit path machinery. Signed-off-by: Christian Brauner (Amutable) --- kernel/liveupdate/luo_core.c | 48 ++++++++++++----------------------------- kernel/liveupdate/luo_session.c | 24 ++++++--------------- 2 files changed, 21 insertions(+), 51 deletions(-) diff --git a/kernel/liveupdate/luo_core.c b/kernel/liveupdate/luo_core.c index 1b2bda22902d..3899bbf30b53 100644 --- a/kernel/liveupdate/luo_core.c +++ b/kernel/liveupdate/luo_core.c @@ -270,61 +270,41 @@ struct luo_device_state { static int luo_ioctl_create_session(struct luo_ucmd *ucmd) { struct liveupdate_ioctl_create_session *argp = ucmd->cmd; + const struct fd_slot *fd; struct file *file; int err; - argp->fd = get_unused_fd_flags(O_CLOEXEC); - if (argp->fd < 0) - return argp->fd; + fd = fd_prepare(O_CLOEXEC); + if (IS_ERR(fd)) + return PTR_ERR(fd); err = luo_session_create(argp->name, &file); if (err) - goto err_put_fd; - - err = luo_ucmd_respond(ucmd, sizeof(*argp)); - if (err) - goto err_put_file; - - fd_install(argp->fd, file); - - return 0; + return err; -err_put_file: - fput(file); -err_put_fd: - put_unused_fd(argp->fd); + argp->fd = fd_stage(fd, file); - return err; + return luo_ucmd_respond(ucmd, sizeof(*argp)); } static int luo_ioctl_retrieve_session(struct luo_ucmd *ucmd) { struct liveupdate_ioctl_retrieve_session *argp = ucmd->cmd; + const struct fd_slot *fd; struct file *file; int err; - argp->fd = get_unused_fd_flags(O_CLOEXEC); - if (argp->fd < 0) - return argp->fd; + fd = fd_prepare(O_CLOEXEC); + if (IS_ERR(fd)) + return PTR_ERR(fd); err = luo_session_retrieve(argp->name, &file); if (err < 0) - goto err_put_fd; - - err = luo_ucmd_respond(ucmd, sizeof(*argp)); - if (err) - goto err_put_file; - - fd_install(argp->fd, file); - - return 0; + return err; -err_put_file: - fput(file); -err_put_fd: - put_unused_fd(argp->fd); + argp->fd = fd_stage(fd, file); - return err; + return luo_ucmd_respond(ucmd, sizeof(*argp)); } static int luo_open(struct inode *inodep, struct file *filep) diff --git a/kernel/liveupdate/luo_session.c b/kernel/liveupdate/luo_session.c index f48e9a4185f9..7de35bad1ede 100644 --- a/kernel/liveupdate/luo_session.c +++ b/kernel/liveupdate/luo_session.c @@ -282,33 +282,23 @@ static int luo_session_retrieve_fd(struct luo_session *session, struct luo_ucmd *ucmd) { struct liveupdate_session_retrieve_fd *argp = ucmd->cmd; + const struct fd_slot *fd; struct file *file; int err; - argp->fd = get_unused_fd_flags(O_CLOEXEC); - if (argp->fd < 0) - return argp->fd; + fd = fd_prepare(O_CLOEXEC); + if (IS_ERR(fd)) + return PTR_ERR(fd); mutex_lock(&session->mutex); err = luo_retrieve_file(&session->file_set, argp->token, &file); mutex_unlock(&session->mutex); if (err < 0) - goto err_put_fd; - - err = luo_ucmd_respond(ucmd, sizeof(*argp)); - if (err) - goto err_put_file; - - fd_install(argp->fd, file); - - return 0; + return err; -err_put_file: - fput(file); -err_put_fd: - put_unused_fd(argp->fd); + argp->fd = fd_stage(fd, file); - return err; + return luo_ucmd_respond(ucmd, sizeof(*argp)); } static int luo_session_finish(struct luo_session *session, -- 2.53.0