block: Fix image re-open in bdrv_commit
Arguably we should re-open the backing file with the backing file format and not with the format of the snapshot image. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
b6a4805b55
commit
ee1811965f
11
block.c
11
block.c
@ -745,6 +745,7 @@ int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
|
||||
int bdrv_commit(BlockDriverState *bs)
|
||||
{
|
||||
BlockDriver *drv = bs->drv;
|
||||
BlockDriver *backing_drv;
|
||||
int64_t sector, total_sectors;
|
||||
int n, ro, open_flags;
|
||||
int ret = 0, rw_ret = 0;
|
||||
@ -763,6 +764,7 @@ int bdrv_commit(BlockDriverState *bs)
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
backing_drv = bs->backing_hd->drv;
|
||||
ro = bs->backing_hd->read_only;
|
||||
strncpy(filename, bs->backing_hd->filename, sizeof(filename));
|
||||
open_flags = bs->backing_hd->open_flags;
|
||||
@ -772,12 +774,14 @@ int bdrv_commit(BlockDriverState *bs)
|
||||
bdrv_delete(bs->backing_hd);
|
||||
bs->backing_hd = NULL;
|
||||
bs_rw = bdrv_new("");
|
||||
rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR, drv);
|
||||
rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR,
|
||||
backing_drv);
|
||||
if (rw_ret < 0) {
|
||||
bdrv_delete(bs_rw);
|
||||
/* try to re-open read-only */
|
||||
bs_ro = bdrv_new("");
|
||||
ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR, drv);
|
||||
ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
|
||||
backing_drv);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(bs_ro);
|
||||
/* drive not functional anymore */
|
||||
@ -828,7 +832,8 @@ ro_cleanup:
|
||||
bdrv_delete(bs->backing_hd);
|
||||
bs->backing_hd = NULL;
|
||||
bs_ro = bdrv_new("");
|
||||
ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR, drv);
|
||||
ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
|
||||
backing_drv);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(bs_ro);
|
||||
/* drive not functional anymore */
|
||||
|
Loading…
Reference in New Issue
Block a user