Il 14/04/2012 00:01, Eric Blake ha scritto: >> +static void change_blockdev_image(BlockDriverState *bs, const char >> *new_image_file, >> + const char *format, Error **errp) >> +{ >> + BlockDriver *old_drv, *proto_drv; >> + BlockDriver *drv = NULL; >> + int ret = 0; >> + int flags; >> + char old_filename[1024]; > > Hard-coded limit. Is this going to bite us later, or are we stuck with > this limit in other places for other reasons? Why a magic number > instead of a macro name or enum value?
In BlockDriverState: char filename[1024]; >> + >> + if (bdrv_in_use(bs)) { >> + error_set(errp, QERR_DEVICE_IN_USE, bs->device_name); >> + return; >> + } >> + >> + pstrcpy(old_filename, sizeof(old_filename), bs->filename); >> + >> + old_drv = bs->drv; >> + flags = bs->open_flags; > > Should we be asserting that flags does not contain BDRV_O_NO_BACKING, so > that we know that we are reopening the entire chain? No, I think it's okay (if for any reason the source had BDRV_O_NO_BACKING) to use it also for the new image. >> + /* >> + * If reopening the image file we just created fails, fall back >> + * and try to re-open the original image. If that fails too, we >> + * are in serious trouble. >> + */ >> + if (ret != 0) { >> + ret = bdrv_open(bs, old_filename, flags, old_drv); >> + if (ret != 0) { >> + error_set(errp, QERR_OPEN_FILE_FAILED, old_filename); >> + } else { >> + error_set(errp, QERR_OPEN_FILE_FAILED, new_image_file); >> + } >> + } > > In that worst-case scenario of failing to reopen the old file, should we > be halting the domain and/or propagating an event up to the user, > similar to how we behave on ENOSPC errors? Probably yes, but it's made more complex because the rerror/werror arguments are only known by the emulated device, not by the disk. I (and Federico before me) just copied the existing non-handling in live snapshots. >> +++ b/hmp-commands.hx >> @@ -922,6 +922,22 @@ using the specified target. >> ETEXI >> >> { >> + .name = "drive_reopen", >> + .args_type = "device:B,new-image-file:s,format:s?", >> + .params = "device new-image-file [format]", >> + .help = "Assigns a new image file to a device.\n\t\t\t" >> + "The image will be opened using the format\n\t\t\t" >> + "specified or 'qcow2' by default.\n\t\t\t", > > Really? I though if you didn't provide format, you get probing, not > forced qcow2. Right. >> +++ b/qapi-schema.json >> @@ -1217,6 +1217,28 @@ >> '*mode': 'NewImageMode'} } >> >> ## >> +# @drive-reopen >> +# >> +# Assigns a new image file to a device. >> +# >> +# @device: the name of the device for which we are changing the image file. >> +# >> +# @new-image-file: the target of the new image. If the file doesn't exists >> the >> +# command will fail. > > s/exists/exist/ Thanks. >> +# >> +# @format: #optional the format of the new image, default is 'qcow2'. > > again, default is to probe, not hard-code qcow2. Yes. Paolo