io_uring-5.7-2020-05-15
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAl6/cDAQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgpo1DEADMUm23Ha/X5YSXujM55hzV6MKQQ+BjNwl1 WIU0qdDkzmoiqSpcengjHPo/2CZvjlavXGaLDWKqfz1pojld9iBhCVgFaOm03Aiq yKbG5gu5UcKNGtlE7cObhkaX8WFDtyZBuoyx+MB6F2eOdO2sbuOEV4o4bRB0w6Gt hn91zHtQRS5WPBxxLGbj8xDOWrrhbiHhfM2QkUX9kd10D9UcOdHsdPt2hPs2L6OF sKkjwcVEd8oR4A5l1pKEwrbm1+7Gn1H0fR8HuBtaZ3ZU65ugaPB6cj6Brn8GDBuT JZ4ThKPqb/6jYVpxWVKCMYGLydSDZYxsQWJP7FgICqeqQgb6q+wHYScgJTPx8v4/ rJgfgWSPbxVf/kKhjFj2JYo8QDcR5R7IUlO4TxcRaIockPdRdc4kTc7EFtzodUoN /5wWAuVuIRBicu+KBshrB3RNTT7NCcYfSom+eqMPIvWTvw1vIpK/5ULV6WZjqFbV bPt3mUjEYV3AfQ9l39pkoclQ3YWWq718l1iuyHdD+1u/41D85UTfGHa/m9NibO5g TP6Jj3FWLeD0UCpUiTEuUfYfdXxnP7R5SNnF+F15fucuHtRILh7rhTCqGbG4crLw 0a1fOx0wmf1JUxQmQtJLQTQ4LdUfwqBbSekKrviClc8HizvFroQyxaFMIjgRXn8X F37nPAzswA== =kqDx -----END PGP SIGNATURE----- Merge tag 'io_uring-5.7-2020-05-15' of git://git.kernel.dk/linux-block Pull io_uring fixes from Jens Axboe: "Two small fixes that should go into this release: - Check and handle zero length splice (Pavel) - Fix a regression in this merge window for fixed files used with polled block IO" * tag 'io_uring-5.7-2020-05-15' of git://git.kernel.dk/linux-block: io_uring: polled fixed file must go through free iteration io_uring: fix zero len do_splice()
This commit is contained in:
Коммит
18e70f3a76
|
@ -1394,10 +1394,6 @@ static void io_free_req_many(struct io_ring_ctx *ctx, struct req_batch *rb)
|
|||
for (i = 0; i < rb->to_free; i++) {
|
||||
struct io_kiocb *req = rb->reqs[i];
|
||||
|
||||
if (req->flags & REQ_F_FIXED_FILE) {
|
||||
req->file = NULL;
|
||||
percpu_ref_put(req->fixed_file_refs);
|
||||
}
|
||||
if (req->flags & REQ_F_INFLIGHT)
|
||||
inflight++;
|
||||
__io_req_aux_free(req);
|
||||
|
@ -1670,7 +1666,7 @@ static inline bool io_req_multi_free(struct req_batch *rb, struct io_kiocb *req)
|
|||
if ((req->flags & REQ_F_LINK_HEAD) || io_is_fallback_req(req))
|
||||
return false;
|
||||
|
||||
if (!(req->flags & REQ_F_FIXED_FILE) || req->io)
|
||||
if (req->file || req->io)
|
||||
rb->need_iter++;
|
||||
|
||||
rb->reqs[rb->to_free++] = req;
|
||||
|
@ -2767,16 +2763,19 @@ static int io_splice(struct io_kiocb *req, bool force_nonblock)
|
|||
struct file *out = sp->file_out;
|
||||
unsigned int flags = sp->flags & ~SPLICE_F_FD_IN_FIXED;
|
||||
loff_t *poff_in, *poff_out;
|
||||
long ret;
|
||||
long ret = 0;
|
||||
|
||||
if (force_nonblock)
|
||||
return -EAGAIN;
|
||||
|
||||
poff_in = (sp->off_in == -1) ? NULL : &sp->off_in;
|
||||
poff_out = (sp->off_out == -1) ? NULL : &sp->off_out;
|
||||
ret = do_splice(in, poff_in, out, poff_out, sp->len, flags);
|
||||
if (force_nonblock && ret == -EAGAIN)
|
||||
return -EAGAIN;
|
||||
|
||||
if (sp->len) {
|
||||
ret = do_splice(in, poff_in, out, poff_out, sp->len, flags);
|
||||
if (force_nonblock && ret == -EAGAIN)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
io_put_file(req, in, (sp->flags & SPLICE_F_FD_IN_FIXED));
|
||||
req->flags &= ~REQ_F_NEED_CLEANUP;
|
||||
|
|
Загрузка…
Ссылка в новой задаче