Linux block layer
 help / color / mirror / Atom feed
* [PATCH v3 00/12] ublk: don't dispatch to canceled io commands
@ 2026-10-11  6:35 Ming Lei
  2026-10-11  6:35 ` [PATCH v3 01/12] ublk: keep a canceled FETCH round canceling until the server is gone Ming Lei
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: Ming Lei @ 2026-10-11  6:35 UTC (permalink / raw)
  To: linux-block
  Cc: Ming Lei, Jens Axboe, Caleb Sander Mateos, Josef Bacik,
	Li RongQing

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


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-10-11  6:36 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-11  6:35 [PATCH v3 00/12] ublk: don't dispatch to canceled io commands Ming Lei
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox