On Sun, Jun 20, 2021 at 10:54:20PM +0900, Tetsuo Handa wrote: > On 2021/06/20 11:44, Hillf Danton wrote: > > Good craft in regard to triggering the ABBA deadlock, but curious why not > > move unregister_blkdev out of and before loop_ctl_mutex, given it will also > > serialise with the prober. > > > > Well, something like this untested diff? > > Call unregister_blkdev() as soon as __exit function starts, for calling > probe function after cleanup started will be unexpected for __exit function. > > Keep probe function no-op until __init function ends, for probe function > might be called as soon as __register_blkdev() succeeded but calling probe > function before setup completes will be unexpected for __init function. > > drivers/block/ataflop.c | 6 +++++- > drivers/block/brd.c | 8 ++++++-- > drivers/block/floppy.c | 4 ++++ > drivers/block/loop.c | 4 ++-- > drivers/ide/ide-probe.c | 8 +++++++- > drivers/md/md.c | 5 +++++ > drivers/scsi/sd.c | 10 +--------- > 7 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c > index d601e49f80e0..3681e8c493b1 100644 > --- a/drivers/block/ataflop.c > +++ b/drivers/block/ataflop.c > @@ -1995,6 +1995,7 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type) > } > > static DEFINE_MUTEX(ataflop_probe_lock); > +static bool module_initialize_completed; This is almost always wrong. > > static void ataflop_probe(dev_t dev) > { > @@ -2006,6 +2007,8 @@ static void ataflop_probe(dev_t dev) > > if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS) > return; > + if (!module_initialize_completed) > + return; This is not correct, when you register a callback structure, it can be instantly called. Do not expect it to be delayed until later. thanks, greg k-h