mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
block: correctly set the keep_read_only flag
I believe the bs->keep_read_only flag is supposed to reflect the initial open state of the device. If the device is initially opened R/O, then commit operations, or reopen operations changing to R/W, are prohibited. Currently, the keep_read_only flag is only accurate for the active layer, and its backing file. Subsequent images end up always having the keep_read_only flag set. For instance, what happens now: [ base ] kro = 1, ro = 1 | v [ snap-1 ] kro = 1, ro = 1 | v [ snap-2 ] kro = 0, ro = 1 | v [ active ] kro = 0, ro = 0 What we want: [ base ] kro = 0, ro = 1 | v [ snap-1 ] kro = 0, ro = 1 | v [ snap-2 ] kro = 0, ro = 1 | v [ active ] kro = 0, ro = 0 Signed-off-by: Jeff Cody <jcody@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
80dd1aae36
commit
be028adced
2 changed files with 8 additions and 7 deletions
14
block.c
14
block.c
|
@ -668,7 +668,7 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename,
|
|||
open_flags |= BDRV_O_RDWR;
|
||||
}
|
||||
|
||||
bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
|
||||
bs->read_only = !(open_flags & BDRV_O_RDWR);
|
||||
|
||||
/* Open the image, either directly or using a protocol */
|
||||
if (drv->bdrv_file_open) {
|
||||
|
@ -808,6 +808,12 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
|
|||
goto unlink_and_fail;
|
||||
}
|
||||
|
||||
if (flags & BDRV_O_RDWR) {
|
||||
flags |= BDRV_O_ALLOW_RDWR;
|
||||
}
|
||||
|
||||
bs->keep_read_only = !(flags & BDRV_O_ALLOW_RDWR);
|
||||
|
||||
/* Open the image */
|
||||
ret = bdrv_open_common(bs, filename, flags, drv);
|
||||
if (ret < 0) {
|
||||
|
@ -837,12 +843,6 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
|
|||
bdrv_close(bs);
|
||||
return ret;
|
||||
}
|
||||
if (bs->is_temporary) {
|
||||
bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
|
||||
} else {
|
||||
/* base image inherits from "parent" */
|
||||
bs->backing_hd->keep_read_only = bs->keep_read_only;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bdrv_key_required(bs)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue