• A
    block: Forbid trying to change unsupported options during reopen · 57f9db9a
    Alberto Garcia 提交于
    The bdrv_reopen_prepare() function checks all options passed to each
    BlockDriverState (in the reopen_state->options QDict) and makes all
    necessary preparations to apply the option changes requested by the
    user.
    
    Options are removed from the QDict as they are processed, so at the
    end of bdrv_reopen_prepare() only the options that can't be changed
    are left. Then a loop goes over all remaining options and verifies
    that the old and new values are identical, returning an error if
    they're not.
    
    The problem is that at the moment there are options that are removed
    from the QDict although they can't be changed. The consequence of this
    is any modification to any of those options is silently ignored:
    
       (qemu) qemu-io virtio0 "reopen -o discard=on"
    
    This happens when all options from bdrv_runtime_opts are removed
    from the QDict but then only a few of them are processed. Since
    it's especially important that "node-name" and "driver" are not
    changed, the code puts them back into the QDict so they are checked
    at the end of the function. Instead of putting only those two options
    back into the QDict, this patch puts all unprocessed options using
    qemu_opts_to_qdict().
    
    update_flags_from_options() also needs to be modified to prevent
    BDRV_OPT_CACHE_NO_FLUSH, BDRV_OPT_CACHE_DIRECT and BDRV_OPT_READ_ONLY
    from going back to the QDict.
    Signed-off-by: NAlberto Garcia <berto@igalia.com>
    Reviewed-by: NMax Reitz <mreitz@redhat.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    57f9db9a
block.c 159.7 KB