On Tue, Oct 10, 2023 at 10:44:09AM +0200, Christian Brauner wrote: > > list removal should happen after generic_shutdown_super(). Sure, you > > want the superblock to serve as bdev holder, which leads to fun > > with -EBUSY if mount comes while umount still hadn't closed the > > device. I suspect that it would make a lot more sense to > > introduce an intermediate state - "held, but will be released > > in a short while". You already have something similar, but > > only for the entire disk ->bd_claiming stuff. > > > > Add a new primitive (will_release_bdev()), so that attempts to > > claim the sucker will wait until it gets released instead of > > failing with -EBUSY. And do *that* before generic_shutdown_super() > > when unmounting something that is block-based. Allows to bring > > the list removal back where it used to be, no UAF at all... > > This is essentially equivalent to what is done right now. Only that this > would then happen in the block layer. I'm not sure it would buy us that > much. In all likelyhood we just get a range of other issues to fix. The difference is, we separate the "close the block device" (which can't be done until we stopped generating any IO on it, obviously) from "tell anyone who wants to claim the sucker that we are going to release it and they just need to wait". That can be done before generic_shutdown_super(), or from it (e.g. from ->put_super()), untangling the ordering mess.