Looking at the version of this that landed in git I don't think the read-only handling is entirely clean after this.
- we now normally set the read_only flag from bdrv_open2 when we do not have the O_RDWR flag set - but the block drivers also mess with it: o raw-posix superflously sets it when BDRV_O_RDWR is not in the open flags o bochs, cloop, dmg and parallels set it unconditionally given that they do not support writing at all. But they do not bother to reject opens without BDRV_O_RDWR o vvfat as usual is a complete mess setting and clearing it in various places - in addition to that bdrv_open2 also sets it after calling itself for the backing hd which seems superflous - there also is a now unused bdrv_set_read_only helper to set it from outside block.c