Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
89e75b01
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
89e75b01
编写于
2月 25, 2011
作者:
J
Jiri Denemark
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
qemu: Refactor qemuDomainSnapshotCreateXML
上级
81711cee
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
71 addition
and
44 deletion
+71
-44
src/qemu/qemu_driver.c
src/qemu/qemu_driver.c
+71
-44
未找到文件。
src/qemu/qemu_driver.c
浏览文件 @
89e75b01
...
...
@@ -5988,6 +5988,75 @@ static int qemuDomainSnapshotIsAllowed(virDomainObjPtr vm)
return
1
;
}
/* The domain is expected to be locked and inactive. */
static
int
qemuDomainSnapshotCreateInactive
(
virDomainObjPtr
vm
,
virDomainSnapshotObjPtr
snap
)
{
const
char
*
qemuimgarg
[]
=
{
NULL
,
"snapshot"
,
"-c"
,
NULL
,
NULL
,
NULL
};
int
ret
=
-
1
;
int
i
;
qemuimgarg
[
0
]
=
qemuFindQemuImgBinary
();
if
(
qemuimgarg
[
0
]
==
NULL
)
{
/* qemuFindQemuImgBinary set the error */
goto
cleanup
;
}
qemuimgarg
[
3
]
=
snap
->
def
->
name
;
for
(
i
=
0
;
i
<
vm
->
def
->
ndisks
;
i
++
)
{
/* FIXME: we also need to handle LVM here */
/* FIXME: if we fail halfway through this loop, we are in an
* inconsistent state. I'm not quite sure what to do about that
*/
if
(
vm
->
def
->
disks
[
i
]
->
device
==
VIR_DOMAIN_DISK_DEVICE_DISK
)
{
if
(
!
vm
->
def
->
disks
[
i
]
->
driverType
||
STRNEQ
(
vm
->
def
->
disks
[
i
]
->
driverType
,
"qcow2"
))
{
qemuReportError
(
VIR_ERR_OPERATION_INVALID
,
_
(
"Disk device '%s' does not support"
" snapshotting"
),
vm
->
def
->
disks
[
i
]
->
info
.
alias
);
goto
cleanup
;
}
qemuimgarg
[
4
]
=
vm
->
def
->
disks
[
i
]
->
src
;
if
(
virRun
(
qemuimgarg
,
NULL
)
<
0
)
goto
cleanup
;
}
}
ret
=
0
;
cleanup:
VIR_FREE
(
qemuimgarg
[
0
]);
return
ret
;
}
/* The domain is expected to be locked and active. */
static
int
qemuDomainSnapshotCreateActive
(
struct
qemud_driver
*
driver
,
virDomainObjPtr
*
vmptr
,
virDomainSnapshotObjPtr
snap
)
{
virDomainObjPtr
vm
=
*
vmptr
;
qemuDomainObjPrivatePtr
priv
=
vm
->
privateData
;
int
ret
;
if
(
qemuDomainObjBeginJobWithDriver
(
driver
,
vm
)
<
0
)
return
-
1
;
qemuDomainObjEnterMonitorWithDriver
(
driver
,
vm
);
ret
=
qemuMonitorCreateSnapshot
(
priv
->
mon
,
snap
->
def
->
name
);
qemuDomainObjExitMonitorWithDriver
(
driver
,
vm
);
if
(
qemuDomainObjEndJob
(
vm
)
==
0
)
*
vmptr
=
NULL
;
return
ret
;
}
static
virDomainSnapshotPtr
qemuDomainSnapshotCreateXML
(
virDomainPtr
domain
,
const
char
*
xmlDesc
,
unsigned
int
flags
)
...
...
@@ -5998,8 +6067,6 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
virDomainSnapshotPtr
snapshot
=
NULL
;
char
uuidstr
[
VIR_UUID_STRING_BUFLEN
];
virDomainSnapshotDefPtr
def
;
const
char
*
qemuimgarg
[]
=
{
NULL
,
"snapshot"
,
"-c"
,
NULL
,
NULL
,
NULL
};
int
i
;
virCheckFlags
(
0
,
NULL
);
...
...
@@ -6030,50 +6097,11 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
/* actually do the snapshot */
if
(
!
virDomainObjIsActive
(
vm
))
{
qemuimgarg
[
0
]
=
qemuFindQemuImgBinary
();
if
(
qemuimgarg
[
0
]
==
NULL
)
/* qemuFindQemuImgBinary set the error */
if
(
qemuDomainSnapshotCreateInactive
(
vm
,
snap
)
<
0
)
goto
cleanup
;
qemuimgarg
[
3
]
=
snap
->
def
->
name
;
for
(
i
=
0
;
i
<
vm
->
def
->
ndisks
;
i
++
)
{
/* FIXME: we also need to handle LVM here */
/* FIXME: if we fail halfway through this loop, we are in an
* inconsistent state. I'm not quite sure what to do about that
*/
if
(
vm
->
def
->
disks
[
i
]
->
device
==
VIR_DOMAIN_DISK_DEVICE_DISK
)
{
if
(
!
vm
->
def
->
disks
[
i
]
->
driverType
||
STRNEQ
(
vm
->
def
->
disks
[
i
]
->
driverType
,
"qcow2"
))
{
qemuReportError
(
VIR_ERR_OPERATION_INVALID
,
_
(
"Disk device '%s' does not support snapshotting"
),
vm
->
def
->
disks
[
i
]
->
info
.
alias
);
goto
cleanup
;
}
qemuimgarg
[
4
]
=
vm
->
def
->
disks
[
i
]
->
src
;
if
(
virRun
(
qemuimgarg
,
NULL
)
<
0
)
{
goto
cleanup
;
}
}
}
}
else
{
qemuDomainObjPrivatePtr
priv
;
int
ret
;
if
(
qemuDomainObjBeginJobWithDriver
(
driver
,
vm
)
<
0
)
goto
cleanup
;
priv
=
vm
->
privateData
;
qemuDomainObjEnterMonitorWithDriver
(
driver
,
vm
);
ret
=
qemuMonitorCreateSnapshot
(
priv
->
mon
,
def
->
name
);
qemuDomainObjExitMonitorWithDriver
(
driver
,
vm
);
if
(
qemuDomainObjEndJob
(
vm
)
==
0
)
{
vm
=
NULL
;
goto
cleanup
;
}
if
(
ret
<
0
)
if
(
qemuDomainSnapshotCreateActive
(
driver
,
&
vm
,
snap
)
<
0
)
goto
cleanup
;
}
...
...
@@ -6103,7 +6131,6 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
snapshot
=
virGetDomainSnapshot
(
domain
,
snap
->
def
->
name
);
cleanup:
VIR_FREE
(
qemuimgarg
[
0
]);
if
(
vm
)
virDomainObjUnlock
(
vm
);
qemuDriverUnlock
(
driver
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录