On 2015-01-22 at 20:53, Julio Faracco wrote:
This commit fixes the bug #1396497. You can create multiple snapshots with
the same name using 'qemu-img'. When you want to delete someone passing the
name, it will remove the first occurence of the snapshot with that name.
This commit fixes it.
I'm not so sure about these patches. Because there is an ID, I'd
actually expect qemu to be able to create multiple snapshots with the
same name (as long as the ID is unique for each snapshot).
I think the real problem is that find_snapshot_by_id_and_name() should
not be successful if there are multiple snapshots which match the given
ID/name combination (which should not happen if an ID has been given),
which would prevent qcow2_snapshot_delete() from simply deleting the
first matching snapshot.
Max
Before:
$ qemu-img snapshot -c foo debian.qcow2
$ qemu-img snapshot -c foo debian.qcow2
$ qemu-img snapshot -c foo debian.qcow2
$ qemu-img snapshot -l debian.qcow2
ID TAG VM SIZE DATE VM CLOCK
1 foo 220M 2015-01-21 16:22:41 00:02:50.862
2 foo 130M 2015-01-22 11:14:55 00:00:40.132
3 foo 65M 2015-01-22 11:16:32 00:01:13.414
Now:
$ qemu-img snapshot -c foo debian.qcow2
$ qemu-img snapshot -c foo debian.qcow2
qemu-img: Could not create snapshot 'foo': -17 (File exists)
$ qemu-img snapshot -l debian.qcow2
ID TAG VM SIZE DATE VM CLOCK
1 foo 220M 2015-01-21 16:22:41 00:02:50.862
Signed-off-by: Julio Faracco <jcfara...@gmail.com>
---
block/qcow2-snapshot.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index c7d4cfe..873ac49 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -356,8 +356,9 @@ int qcow2_snapshot_create(BlockDriverState *bs,
QEMUSnapshotInfo *sn_info)
find_new_snapshot_id(bs, sn_info->id_str, sizeof(sn_info->id_str));
}
- /* Check that the ID is unique */
- if (find_snapshot_by_id_or_name(bs, sn_info->id_str) >= 0) {
+ /* Check that the ID and Name is unique */
+ if (find_snapshot_by_id_or_name(bs, sn_info->id_str) >= 0 ||
+ find_snapshot_by_id_or_name(bs, sn_info->name) >= 0 ) {
return -EEXIST;
}