From: Ming Lei <tom.leiming@gmail.com>
To: linux-block@vger.kernel.org
Cc: Ming Lei <tom.leiming@gmail.com>, Jens Axboe <axboe@kernel.dk>,
Caleb Sander Mateos <csander@purestorage.com>,
Josef Bacik <josef@toxicpanda.com>,
Li RongQing <lirongqing@baidu.com>
Subject: [PATCH v3 00/12] ublk: don't dispatch to canceled io commands
Date: Sun, 11 Oct 2026 01:35:43 -0500 [thread overview]
Message-ID: <20261011063555.1142277-1-tom.leiming@gmail.com> (raw)
Hi,
Josef reported three ways in which ublk dispatches a request to a
canceled io command, which oopses on the NULL io->cmd in
ublk_queue_cmd() [1]:
1) STOP_DEV, then START_DEV
2) partial FETCH: a task fetches some tags and exits, then another task
fetches the rest
3) user recovery: one queue's task exits before all queues are ready
This series fixes them in a simpler way, without extra locking in the
I/O path:
- patch 1: a FETCH round which saw a cancel stays canceling until the
server is gone (2, 3)
- patch 2-3: an io command is marked cancelable before it is published
- patch 4-5: the release resets the FETCH round, also without a disk
and under ub->mutex
- patch 6: don't warn when the cancel callback finds io->cmd taken by a
cancel from the control path
- patch 7: STOP_DEV holds a reference on /dev/ublkcN while it cancels,
so no START_DEV, FETCH or new server can slip in (1)
- patch 8 (Josef): START_DEV and END_USER_RECOVERY refuse to go live
after an io command was canceled (2, 3)
- patch 9-11: selftests
- patch 12 (Li RongQing): ublk_report_zones() passes a per-chunk index
to disk_report_zone(); use the index in the whole report
Tested with all ublk selftests under lockdep on for-7.4/block; v1 was
also tested under KASAN.
V3:
- rebase on for-7.4/block
- add Li RongQing's "ublk: use global index for reported zones"
(patch 12)
V2:
- add Josef's "ublk: refuse to go live after an io command was
canceled", so routes 2 and 3 get -EBUSY instead of a live device
failing every request
- split the cancel callback's WARN change out of the STOP_DEV patch
(patch 6)
- document in ublk.rst what a server sees after STOP_DEV (Josef)
- kublk: stop a batch thread when PREP_IO_CMDS is aborted, instead of
asserting and leaving `kublk add` waiting forever (Josef)
- selftest: partial_fetch and recovery expect -EBUSY; add a batch
STOP_DEV race mode with kublk
- commit log fixes (patch 4, patch 7)
- add Josef's Tested-by
The release work deciding "no disk" before ub->mutex (Josef's point 4)
needs a START_DEV for a server which has already exited: no new server
can open /dev/ublkcN until that work is done, and patch 8 refuses such a
START_DEV with -EBUSY, so it gets no extra patch.
V2: https://lore.kernel.org/linux-block/20261008113907.4000838-1-tom.leiming@gmail.com/
V1: https://lore.kernel.org/linux-block/20261001125422.1364260-1-tom.leiming@gmail.com/
[1] https://lore.kernel.org/linux-block/20260928-b4-ublk-cancel-stop-v1-0-4a4360232a46@toxicpanda.com/
Thanks,
Ming
Josef Bacik (1):
ublk: refuse to go live after an io command was canceled
Li RongQing (1):
ublk: use global index for reported zones
Ming Lei (10):
ublk: keep a canceled FETCH round canceling until the server is gone
ublk: mark the io command cancelable before publishing it
ublk: mark the batch fetch command cancelable before linking it
ublk: reset the FETCH round in release also without a disk
ublk: reset the FETCH round under ub->mutex
ublk: allow a NULL io->cmd in the cancel callback
ublk: let STOP_DEV cancel the server's commands before its release
selftests: ublk: move the control command helpers into ctrl.c
selftests: ublk: stop a batch thread when PREP_IO_CMDS fails
selftests: ublk: add test for going live over canceled io commands
Documentation/block/ublk.rst | 17 +-
drivers/block/ublk_drv.c | 246 ++++-
tools/testing/selftests/ublk/.gitignore | 1 +
tools/testing/selftests/ublk/Makefile | 6 +-
tools/testing/selftests/ublk/batch.c | 13 +-
tools/testing/selftests/ublk/ctrl.c | 268 +++++
tools/testing/selftests/ublk/kublk.c | 271 -----
tools/testing/selftests/ublk/kublk.h | 32 +
.../testing/selftests/ublk/test_generic_18.sh | 69 ++
.../selftests/ublk/ublk_cancel_ready.c | 957 ++++++++++++++++++
10 files changed, 1551 insertions(+), 329 deletions(-)
create mode 100644 tools/testing/selftests/ublk/ctrl.c
create mode 100755 tools/testing/selftests/ublk/test_generic_18.sh
create mode 100644 tools/testing/selftests/ublk/ublk_cancel_ready.c
base-commit: 69ae59173a5668d015ab2733c8628ed542f00ccc
--
2.55.0
next reply other threads:[~2026-10-11 6:36 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-11 6:35 Ming Lei [this message]
2026-10-11 6:35 ` [PATCH v3 01/12] ublk: keep a canceled FETCH round canceling until the server is gone Ming Lei
2026-10-11 6:35 ` [PATCH v3 02/12] ublk: mark the io command cancelable before publishing it Ming Lei
2026-10-11 6:35 ` [PATCH v3 03/12] ublk: mark the batch fetch command cancelable before linking it Ming Lei
2026-10-11 6:35 ` [PATCH v3 04/12] ublk: reset the FETCH round in release also without a disk Ming Lei
2026-10-11 6:35 ` [PATCH v3 05/12] ublk: reset the FETCH round under ub->mutex Ming Lei
2026-10-11 6:35 ` [PATCH v3 06/12] ublk: allow a NULL io->cmd in the cancel callback Ming Lei
2026-10-11 6:35 ` [PATCH v3 07/12] ublk: let STOP_DEV cancel the server's commands before its release Ming Lei
2026-10-11 6:35 ` [PATCH v3 08/12] ublk: refuse to go live after an io command was canceled Ming Lei
2026-10-11 6:35 ` [PATCH v3 09/12] selftests: ublk: move the control command helpers into ctrl.c Ming Lei
2026-10-11 6:35 ` [PATCH v3 10/12] selftests: ublk: stop a batch thread when PREP_IO_CMDS fails Ming Lei
2026-10-11 6:35 ` [PATCH v3 11/12] selftests: ublk: add test for going live over canceled io commands Ming Lei
2026-10-11 6:35 ` [PATCH v3 12/12] ublk: use global index for reported zones Ming Lei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261011063555.1142277-1-tom.leiming@gmail.com \
--to=tom.leiming@gmail.com \
--cc=axboe@kernel.dk \
--cc=csander@purestorage.com \
--cc=josef@toxicpanda.com \
--cc=linux-block@vger.kernel.org \
--cc=lirongqing@baidu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox