[libvirt] [PATCH v5] qemu: Remove the managed state file only if restoring succeeded
Osier Yang
jyang at redhat.com
Thu Apr 7 09:00:00 UTC 2011
于 2011年04月07日 15:21, Daniel Veillard 写道:
> On Thu, Apr 07, 2011 at 10:31:52AM +0800, Osier Yang wrote:
>> 1) Both "qemuDomainStartWithFlags" and "qemuAutostartDomain" try to
>> restore the domain from managedsave'ed image if it exists (by
>> invoking "qemuDomainObjRestore"), but it unlinks the image even
>> if restoring fails, which causes data loss. (This problem exists
>> for "virsh managedsave dom; virsh start dom").
>>
>> The fix for is to unlink the managed state file only if restoring
>> succeeded.
>>
>> 2) For "virsh save dom; virsh restore dom;", it can cause data
>> corruption if one reuse the saved state file for restoring. Add
>> doc to tell user about it.
>>
>> 3) In "qemuDomainObjStart", if "managed_save" is NULL, we shouldn't
>> fallback to start the domain, skipping it to cleanup as a incidental
>> fix. Discovered by Eric.
>>
>> ---
>> src/qemu/qemu_driver.c | 12 +++++++-----
>> tools/virsh.pod | 6 +++++-
>> 2 files changed, 12 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 48fe266..a84780b 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -3423,18 +3423,20 @@ static int qemudDomainObjStart(virConnectPtr conn,
>>
>> /*
>> * If there is a managed saved state restore it instead of starting
>> - * from scratch. In any case the old state is removed.
>> + * from scratch. The old state is removed once the restoring succeeded.
>> */
>> managed_save = qemuDomainManagedSavePath(driver, vm);
>> +
>> + if (!managed_save)
>> + goto cleanup;
>> +
>> if ((managed_save)&& (virFileExists(managed_save))) {
>> ret = qemuDomainObjRestore(conn, driver, vm, managed_save);
>>
>> - if (unlink(managed_save)< 0) {
>> + if ((ret == 0)&& (unlink(managed_save)< 0))
>> VIR_WARN("Failed to remove the managed state %s", managed_save);
>> - }
>>
>> - if (ret == 0)
>> - goto cleanup;
>> + goto cleanup;
>> }
>>
>> ret = qemuProcessStart(conn, driver, vm, NULL, start_paused, -1, NULL,
>> diff --git a/tools/virsh.pod b/tools/virsh.pod
>> index f4bd294..6319373 100644
>> --- a/tools/virsh.pod
>> +++ b/tools/virsh.pod
>> @@ -546,7 +546,11 @@ I<on_reboot> parameter in the domain's XML definition.
>>
>> =item B<restore> I<state-file>
>>
>> -Restores a domain from an B<virsh save> state file. See I<save> for more info.
>> +Restores a domain from an B<virsh save> state file. See I<save> for more info.
>> +
>> +B<Note>: To avoid corrupting file system contents within the domain, you
>> +should not reuse the saved state file to B<restore> unless you are convinced
>> +with reverting the domain to the previous state.
>>
>> =item B<save> I<domain-id> I<state-file>
>
> ACK, thanks !
>
> Daniel
>
Thanks, applied.
Osier
More information about the libvir-list
mailing list