mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 22:09:30 +02:00
Merge tag 'block-7.3-20260911' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux
Pull block fixes from Jens Axboe: - Fix the start and length check added to iov_iter_extract_bvecs(), which used iter_iov_addr()/iter_iov_len() helpers that aren't safe for the ITER_BVEC/FOLIOQ/etc iterator types passed - sunvdc fixes for an -EIO issue from lack of retries, and unmapping LDC cookies when the descriptor send fails - Clear force_abort in ublk_queue_reset_io_flags() - ublk selftest install fix * tag 'block-7.3-20260911' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux: selftests: ublk: add batch IO cases to recover_03 ublk: clear force_abort in ublk_queue_reset_io_flags() sunvdc: fix -EIO issue due to lack of retries sunvdc: unmap LDC cookies when the descriptor send fails block: Fix start and length check added to iov_iter_extract_bvecs() selftests: ublk: install test_common.sh and trace/ scripts
This commit is contained in:
+25
-1
@@ -525,6 +525,23 @@ static int __send_request(struct request *req)
|
||||
err = __vdc_tx_trigger(port);
|
||||
if (err < 0) {
|
||||
printk(KERN_ERR PFX "vdc_tx_trigger() failure, err=%d\n", err);
|
||||
/*
|
||||
* If the port was reset (-ENOTCONN), the dring and the
|
||||
* LDC channel including all of its mappings are already
|
||||
* torn down and reallocated - there is nothing to undo
|
||||
* and @desc must not be touched.
|
||||
*
|
||||
* For any other failure the descriptor was never handed
|
||||
* to the peer: unmap the cookies and free the descriptor
|
||||
* again, so that a later retry of the request does not
|
||||
* leak LDC map table entries.
|
||||
*/
|
||||
if (err != -ENOTCONN) {
|
||||
ldc_unmap(port->vio.lp, desc->cookies,
|
||||
desc->ncookies);
|
||||
desc->hdr.state = VIO_DESC_FREE;
|
||||
rqe->req = NULL;
|
||||
}
|
||||
} else {
|
||||
port->req_id++;
|
||||
dr->prod = vio_dring_next(dr, dr->prod);
|
||||
@@ -539,6 +556,7 @@ static blk_status_t vdc_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
struct vdc_port *port = hctx->queue->queuedata;
|
||||
struct vio_dring_state *dr;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
dr = &port->vio.drings[VIO_DRIVER_TX_RING];
|
||||
|
||||
@@ -560,7 +578,13 @@ static blk_status_t vdc_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
return BLK_STS_DEV_RESOURCE;
|
||||
}
|
||||
|
||||
if (__send_request(bd->rq) < 0) {
|
||||
ret = __send_request(bd->rq);
|
||||
if (ret == -EAGAIN) {
|
||||
spin_unlock_irqrestore(&port->vio.lock, flags);
|
||||
/* already spun for 10msec, defer 10msec and retry */
|
||||
blk_mq_delay_kick_requeue_list(hctx->queue, 10);
|
||||
return BLK_STS_DEV_RESOURCE;
|
||||
} else if (ret < 0) {
|
||||
spin_unlock_irqrestore(&port->vio.lock, flags);
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
|
||||
@@ -3030,6 +3030,7 @@ static void ublk_queue_reset_io_flags(struct ublk_queue *ubq)
|
||||
ubq->canceling = false;
|
||||
spin_unlock(&ubq->cancel_lock);
|
||||
ubq->fail_io = false;
|
||||
ubq->force_abort = false;
|
||||
}
|
||||
|
||||
/* device can only be started after all IOs are ready */
|
||||
|
||||
+16
-2
@@ -1921,15 +1921,29 @@ ssize_t iov_iter_extract_bvecs(struct iov_iter *iter, struct bio_vec *bv,
|
||||
unsigned short max_vecs, unsigned mem_align_mask,
|
||||
iov_iter_extraction_t extraction_flags)
|
||||
{
|
||||
unsigned long start = (unsigned long)iter_iov_addr(iter);
|
||||
unsigned short entries_left = max_vecs - *nr_vecs;
|
||||
unsigned short nr_pages, i = 0;
|
||||
size_t left, offset, len;
|
||||
struct page **pages;
|
||||
ssize_t size;
|
||||
|
||||
if ((start | iter_iov_len(iter)) & mem_align_mask)
|
||||
/*
|
||||
* DMA engines typically have both memory address and length alignment
|
||||
* requirements, so check these against the alignment mask. For UBUF,
|
||||
* IOVEC and KVEC, only the current segment will be extracted from; for
|
||||
* everything else we might extract from multiple segments, so we need
|
||||
* to check those too.
|
||||
*/
|
||||
if (likely(iter_is_ubuf(iter) ||
|
||||
iter_is_iovec(iter) ||
|
||||
iov_iter_is_kvec(iter))) {
|
||||
unsigned long start = (unsigned long)iter_iov_addr(iter);
|
||||
|
||||
if ((start | iter_iov_len(iter)) & mem_align_mask)
|
||||
return -EINVAL;
|
||||
} else if (iov_iter_alignment(iter) & mem_align_mask) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Move page array up in the allocated memory for the bio vecs as far as
|
||||
|
||||
@@ -73,6 +73,8 @@ TEST_PROGS += test_stress_08.sh
|
||||
TEST_PROGS += test_stress_09.sh
|
||||
|
||||
TEST_FILES := settings
|
||||
TEST_FILES += test_common.sh
|
||||
TEST_FILES += trace
|
||||
|
||||
TEST_GEN_PROGS_EXTENDED = kublk metadata_size
|
||||
STANDALONE_UTILS := metadata_size.c
|
||||
|
||||
@@ -29,6 +29,11 @@ _create_backfile 0 256M
|
||||
_create_backfile 1 128M
|
||||
_create_backfile 2 128M
|
||||
|
||||
ublk_run_quiesce_recover -t null -q 2 -r 1 -b &
|
||||
ublk_run_quiesce_recover -t loop -q 2 -r 1 -b "${UBLK_BACKFILES[0]}" &
|
||||
ublk_run_quiesce_recover -t stripe -q 2 -r 1 -b "${UBLK_BACKFILES[1]}" "${UBLK_BACKFILES[2]}" &
|
||||
wait
|
||||
|
||||
ublk_run_quiesce_recover -t null -q 2 -r 1 &
|
||||
ublk_run_quiesce_recover -t loop -q 2 -r 1 "${UBLK_BACKFILES[0]}" &
|
||||
ublk_run_quiesce_recover -t stripe -q 2 -r 1 "${UBLK_BACKFILES[1]}" "${UBLK_BACKFILES[2]}" &
|
||||
|
||||
Reference in New Issue
Block a user