fix for breakage in #work.fd this window

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYIAB0WIQQqUNBr3gm4hGXdBJlZ7Krx/gZQ6wUCYpz/IQAKCRBZ7Krx/gZQ
 666mAPwKOC/voemjl2m+RpSruxAbdlRvKei3IY8YxLfyv+rmUQD9HKLJJtQX2VRF
 QTFmQ3p7kx30ydwSbyY8Kpw3VMCDxgs=
 =1ZKm
 -----END PGP SIGNATURE-----

Merge tag 'pull-work.fd-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull file descriptor fix from Al Viro:
 "Fix for breakage in #work.fd this window"

* tag 'pull-work.fd-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  fix the breakage in close_fd_get_file() calling conventions change
This commit is contained in:
Linus Torvalds 2022-06-05 17:14:03 -07:00
commit 6684cf4290
3 changed files with 4 additions and 6 deletions

View file

@ -1886,6 +1886,8 @@ static void binder_deferred_fd_close(int fd)
init_task_work(&twcb->twork, binder_do_fd_close); init_task_work(&twcb->twork, binder_do_fd_close);
twcb->file = close_fd_get_file(fd); twcb->file = close_fd_get_file(fd);
if (twcb->file) { if (twcb->file) {
// pin it until binder_do_fd_close(); see comments there
get_file(twcb->file);
filp_close(twcb->file, current->files); filp_close(twcb->file, current->files);
task_work_add(current, &twcb->twork, TWA_RESUME); task_work_add(current, &twcb->twork, TWA_RESUME);
} else { } else {

View file

@ -800,8 +800,7 @@ struct file *__close_fd_get_file(unsigned int fd)
/* /*
* variant of close_fd that gets a ref on the file for later fput. * variant of close_fd that gets a ref on the file for later fput.
* The caller must ensure that filp_close() called on the file, and then * The caller must ensure that filp_close() called on the file.
* an fput().
*/ */
struct file *close_fd_get_file(unsigned int fd) struct file *close_fd_get_file(unsigned int fd)
{ {

View file

@ -6010,7 +6010,7 @@ static int io_close(struct io_kiocb *req, unsigned int issue_flags)
struct files_struct *files = current->files; struct files_struct *files = current->files;
struct io_close *close = &req->close; struct io_close *close = &req->close;
struct fdtable *fdt; struct fdtable *fdt;
struct file *file = NULL; struct file *file;
int ret = -EBADF; int ret = -EBADF;
if (req->close.file_slot) { if (req->close.file_slot) {
@ -6029,7 +6029,6 @@ static int io_close(struct io_kiocb *req, unsigned int issue_flags)
lockdep_is_held(&files->file_lock)); lockdep_is_held(&files->file_lock));
if (!file || file->f_op == &io_uring_fops) { if (!file || file->f_op == &io_uring_fops) {
spin_unlock(&files->file_lock); spin_unlock(&files->file_lock);
file = NULL;
goto err; goto err;
} }
@ -6049,8 +6048,6 @@ static int io_close(struct io_kiocb *req, unsigned int issue_flags)
err: err:
if (ret < 0) if (ret < 0)
req_set_fail(req); req_set_fail(req);
if (file)
fput(file);
__io_req_complete(req, issue_flags, ret, 0); __io_req_complete(req, issue_flags, ret, 0);
return 0; return 0;
} }