Applying with these fixes on my side:
- "Once the device is removed" became "Once the table is destroyed, on
  device removal or table reload".

On Tue, 10 Nov 2026 20:00:32 +0100, Denis V. Lunev wrote:
> that fails with ENOSPC around the presuspend leaves the timer pending
> and the work queued after the suspend. Once the device is removed, the
> timer expires on the struct ploop that ploop_dtr() freed, and
> do_ploop_event_work() reads ploop->ti from it.

A table reload frees the old struct ploop the same way: do_resume()
suspends, swaps and then destroys the old table, so the race is there
too.

>       if (ploop->kt_worker) {
> +             timer_shutdown_sync(&ploop->enospc_timer);
> +             cancel_work_sync(&ploop->event_work);
>               ploop->force_md_writeback = 1;

The code is right. Sashiko's two remarks on it do not block it:

- Pios stranded on enospc_pios: cannot happen. A parked pio is a
  request in flight, and dm calls ploop_dtr() only after all requests
  are done: __dm_destroy() waits for md->holders, a reload waits in
  dm_suspend(). Until then the timer is alive and, with patch 2,
  resubmits the pio.
- event_work queued after the cancel: the only window left is in the
  ENOSPC endio itself, between llist_add() and schedule_work(). Its own
  mod_timer() and schedule_work() hit the freed struct there, so a
  second cancel would not help. It is older than this patch; see the
  separate-patch block in the cover letter reply.

-- 
Konstantin Khorenko,
Virtuozzo Linux Kernel Team

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to