[quoting your reply out of order, because I think it makes sense that way] On Thu, Jun 01, 2023 at 09:02:25PM -0400, Linus Torvalds wrote: > So honestly, that whole test for > > + if (op_is_write(bio_op(bio)) && bio_sectors(bio) && > + bdev_read_only(bdev)) { > > may look "obviously correct", but it's also equally valid to view it > as "obviously garbage", simply because the test is being done at the > wrong point. > > The same way you can write to a file that was opened for writing, but > has then become read-only afterwards, writing to a device with a bdev > that was writable when you *started* writing is not at all necessarily > wrong. files, or more specifically file descriptors really are the wrong analogy here. A file descriptor allows you to keep writing to a file that you were allowed to write to at open time. And that's fine (at least most of the time, people keep wanting a revoke and keep implementing broken special cases of it, but I disgress). The struct block_device is not such a handle, it's the underlying object. And the equivalent here is that we allow writes to inodes that don't even implement a write method, or have the immutable bit set. > The logic wrt "bdev_read_only()" is not necessarily a "right now it's > read-only", but more of a thing that should be checked purely when the > device is opened. Which is pretty much exactly what we do. Except the whole make a thing readonly just for fun is the corner case. DM does it, and we have a sysfs file to allow it. But the usual case is that a block device has been read-only all the time, or has been force to be read-only by the actual storage device, which doesn't know anything about the file descriptor model, and will not be happy. So maybe a lazy read-only after the last writer goes away would be nice (not that we actully track writers right now, but that whole area is comletely fucked up and I'm looking into fixing it at the moment). And for extra fun blkdev_get_by_dev doesn't check for read-only because we've historically allowed to open writable file descriptors on read-only block devices for ioctls (in addition to the magic (flags & O_ACCMODE) == 3 mode just ioctl).