[libvirt] Block pull API QEMU progress update

I am sending this email as an update on the new image streaming for QEMU (aka block pull in libvirt). Adam's libvirt virDomainBlockPull patches were recently merged to allow populating a disk image while the domain is running. The QEMU side implementation is not merged into qemu.git yet because similarity with the live block copy feature has sparked discussion on how to unify the two. The QEMU APIs for image streaming and live block copy may or may not be changed. I think they should stay as they are because they provide good interfaces for those two features. However, it is possible that unifying the implementations of the two features internally necessitates changes to the QEMU APIs. If changes are made, the question becomes whether they require changing the libvirt block pull (and proposed live block copy) API. Right now there is no proposal to change the QEMU APIs for the two features but I think it is useful for libvirt to be aware of the status on these features. Perhaps a precautionary measure like not committing to the APIs until the QEMU patches are merged is worthwhile, just for safety. Marcelo, Kevin, and I are working on unifying the QEMU side implementations of live block copy and image streaming. Hopefully the specifics will be agreed soon and we can then enable these features in QEMU and libvirt. Stefan

On Wed, Jun 22, 2011 at 03:20:09PM +0100, Stefan Hajnoczi wrote:
I am sending this email as an update on the new image streaming for QEMU (aka block pull in libvirt).
Adam's libvirt virDomainBlockPull patches were recently merged to allow populating a disk image while the domain is running. The QEMU side implementation is not merged into qemu.git yet because similarity with the live block copy feature has sparked discussion on how to unify the two.
The QEMU APIs for image streaming and live block copy may or may not be changed. I think they should stay as they are because they provide good interfaces for those two features. However, it is possible that unifying the implementations of the two features internally necessitates changes to the QEMU APIs.
If changes are made, the question becomes whether they require changing the libvirt block pull (and proposed live block copy) API.
Right now there is no proposal to change the QEMU APIs for the two features but I think it is useful for libvirt to be aware of the status on these features. Perhaps a precautionary measure like not committing to the APIs until the QEMU patches are merged is worthwhile, just for safety.
Marcelo, Kevin, and I are working on unifying the QEMU side implementations of live block copy and image streaming. Hopefully the specifics will be agreed soon and we can then enable these features in QEMU and libvirt.
With non-trivial risk of the QEMU interface being changed, then I think it could be wise to temporarily revert the block pull API + RPC additions in libvirt, for the 0.9.3 release, and re-add them for 0.9.4 when the QEMU debate has settled. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 06/22/2011 10:31 AM, Daniel P. Berrange wrote:
Marcelo, Kevin, and I are working on unifying the QEMU side implementations of live block copy and image streaming. Hopefully the specifics will be agreed soon and we can then enable these features in QEMU and libvirt.
With non-trivial risk of the QEMU interface being changed, then I think it could be wise to temporarily revert the block pull API + RPC additions in libvirt, for the 0.9.3 release, and re-add them for 0.9.4 when the QEMU debate has settled.
I concur; would you like me to handle pushing the reverts? -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

This reverts commit 12cd77a0c58a80179182f7d09e8e73f9f66b4677. Conflicts: python/libvirt-override-virConnect.py python/libvirt-override.c src/remote/remote_protocol.x --- We've added some new APIs in the meantime, so there are some minor conflicts in reverting the BlockPull stuff. But consensus seemed to be that since qemu might change the block pull monitor command before it goes upstream, that we are safer deferring this patch series until after 0.9.3. daemon/remote.c | 32 -------------------- include/libvirt/libvirt.h.in | 27 ----------------- python/libvirt-override-virConnect.py | 9 ------ python/libvirt-override.c | 51 --------------------------------- src/conf/domain_event.c | 51 --------------------------------- src/conf/domain_event.h | 7 +---- src/libvirt_private.syms | 2 - src/qemu/qemu_monitor.c | 12 -------- src/qemu/qemu_monitor.h | 8 ----- src/qemu/qemu_monitor_json.c | 30 ------------------- src/qemu/qemu_process.c | 30 ------------------- src/remote/remote_driver.c | 30 ------------------- src/remote/remote_protocol.x | 9 +----- src/remote_protocol-structs | 5 --- 14 files changed, 2 insertions(+), 301 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 37fbed0..5e58427 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -396,37 +396,6 @@ static int remoteRelayDomainEventGraphics(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int remoteRelayDomainEventBlockPull(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - const char *path, - int status, - void *opaque) -{ - struct qemud_client *client = opaque; - remote_domain_event_block_pull_msg data; - - if (!client) - return -1; - - VIR_DEBUG("Relaying domain block pull event %s %d %s %i", dom->name, dom->id, path, status); - - virMutexLock(&client->lock); - - /* build return data */ - memset(&data, 0, sizeof data); - make_nonnull_domain(&data.dom, dom); - data.path = (char*)path; - data.status = status; - - remoteDispatchDomainEventSend(client, - REMOTE_PROC_DOMAIN_EVENT_BLOCK_PULL, - (xdrproc_t)xdr_remote_domain_event_block_pull_msg, &data); - - virMutexUnlock(&client->lock); - - return 0; -} - static int remoteRelayDomainEventControlError(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -465,7 +434,6 @@ static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventGraphics), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventIOErrorReason), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventControlError), - VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventBlockPull), }; verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST); diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 3f634e6..85f2460 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2728,32 +2728,6 @@ typedef void (*virConnectDomainEventGraphicsCallback)(virConnectPtr conn, void *opaque); /** - * virConnectDomainEventBlockPullStatus: - * - * The final status of a virDomainBlockPullAll() operation - */ -typedef enum { - VIR_DOMAIN_BLOCK_PULL_COMPLETED = 0, - VIR_DOMAIN_BLOCK_PULL_FAILED = 1, -} virConnectDomainEventBlockPullStatus; - -/** - * virConnectDomainEventBlockPullCallback: - * @conn: connection object - * @dom: domain on which the event occurred - * @path: fully-qualified filename of the affected disk - * @status: final status of the operation (virConnectDomainEventBlockPullStatus) - * - * The callback signature to use when registering for an event of type - * VIR_DOMAIN_EVENT_ID_BLOCK_PULL with virConnectDomainEventRegisterAny() - */ -typedef void (*virConnectDomainEventBlockPullCallback)(virConnectPtr conn, - virDomainPtr dom, - const char *path, - int status, - void *opaque); - -/** * VIR_DOMAIN_EVENT_CALLBACK: * * Used to cast the event specific callback into the generic one @@ -2771,7 +2745,6 @@ typedef enum { VIR_DOMAIN_EVENT_ID_GRAPHICS = 5, /* virConnectDomainEventGraphicsCallback */ VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON = 6, /* virConnectDomainEventIOErrorReasonCallback */ VIR_DOMAIN_EVENT_ID_CONTROL_ERROR = 7, /* virConnectDomainEventGenericCallback */ - VIR_DOMAIN_EVENT_ID_BLOCK_PULL = 8, /* virConnectDomainEventBlockPullCallback */ /* * NB: this enum value will increase over time as new events are diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py index 5be9659..eeeedf9 100644 --- a/python/libvirt-override-virConnect.py +++ b/python/libvirt-override-virConnect.py @@ -113,15 +113,6 @@ authScheme, subject, opaque) return 0 - def _dispatchDomainEventBlockPullCallback(self, dom, path, status, cbData): - """Dispatches events to python user domain blockPull event callbacks - """ - cb = cbData["cb"] - opaque = cbData["opaque"] - - cb(self, virDomain(self, _obj=dom), path, status, opaque) - return 0 - def domainEventDeregisterAny(self, callbackID): """Removes a Domain Event Callback. De-registering for a domain callback will disable delivery of this event type """ diff --git a/python/libvirt-override.c b/python/libvirt-override.c index e7426a5..837c9a6 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -3597,54 +3597,6 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE return ret; } -static int -libvirt_virConnectDomainEventBlockPullCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - const char *path, - int status, - void *opaque) -{ - PyObject *pyobj_cbData = (PyObject*)opaque; - PyObject *pyobj_dom; - PyObject *pyobj_ret; - PyObject *pyobj_conn; - PyObject *dictKey; - int ret = -1; - - LIBVIRT_ENSURE_THREAD_STATE; - - /* Create a python instance of this virDomainPtr */ - virDomainRef(dom); - pyobj_dom = libvirt_virDomainPtrWrap(dom); - Py_INCREF(pyobj_cbData); - - dictKey = libvirt_constcharPtrWrap("conn"); - pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey); - Py_DECREF(dictKey); - - /* Call the Callback Dispatcher */ - pyobj_ret = PyObject_CallMethod(pyobj_conn, - (char*)"_dispatchDomainEventBlockPullCallback", - (char*)"OsiO", - pyobj_dom, path, status, pyobj_cbData); - - Py_DECREF(pyobj_cbData); - Py_DECREF(pyobj_dom); - - if(!pyobj_ret) { -#if DEBUG_ERROR - printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret); -#endif - PyErr_Print(); - } else { - Py_DECREF(pyobj_ret); - ret = 0; - } - - LIBVIRT_RELEASE_THREAD_STATE; - return ret; -} - static PyObject * libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) @@ -3699,9 +3651,6 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, case VIR_DOMAIN_EVENT_ID_CONTROL_ERROR: cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGenericCallback); break; - case VIR_DOMAIN_EVENT_ID_BLOCK_PULL: - cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventBlockPullCallback); - break; } if (!cb) { diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 785e9e4..c435484 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -83,10 +83,6 @@ struct _virDomainEvent { char *authScheme; virDomainEventGraphicsSubjectPtr subject; } graphics; - struct { - char *path; - int status; - } blockPull; } data; }; @@ -503,11 +499,6 @@ void virDomainEventFree(virDomainEventPtr event) } VIR_FREE(event->data.graphics.subject); } - break; - - case VIR_DOMAIN_EVENT_ID_BLOCK_PULL: - VIR_FREE(event->data.blockPull.path); - break; } VIR_FREE(event->dom.name); @@ -883,41 +874,6 @@ virDomainEventPtr virDomainEventGraphicsNewFromObj(virDomainObjPtr obj, return ev; } -static virDomainEventPtr -virDomainEventBlockPullNew(int id, const char *name, unsigned char *uuid, - const char *path, int status) -{ - virDomainEventPtr ev = - virDomainEventNewInternal(VIR_DOMAIN_EVENT_ID_BLOCK_PULL, - id, name, uuid); - - if (ev) { - if (!(ev->data.blockPull.path = strdup(path))) { - virReportOOMError(); - virDomainEventFree(ev); - return NULL; - } - ev->data.blockPull.status = status; - } - - return ev; -} - -virDomainEventPtr virDomainEventBlockPullNewFromObj(virDomainObjPtr obj, - const char *path, - int status) -{ - return virDomainEventBlockPullNew(obj->def->id, obj->def->name, - obj->def->uuid, path, status); -} - -virDomainEventPtr virDomainEventBlockPullNewFromDom(virDomainPtr dom, - const char *path, - int status) -{ - return virDomainEventBlockPullNew(dom->id, dom->name, dom->uuid, - path, status); -} virDomainEventPtr virDomainEventControlErrorNewFromDom(virDomainPtr dom) { @@ -1071,13 +1027,6 @@ void virDomainEventDispatchDefaultFunc(virConnectPtr conn, cbopaque); break; - case VIR_DOMAIN_EVENT_ID_BLOCK_PULL: - ((virConnectDomainEventBlockPullCallback)cb)(conn, dom, - event->data.blockPull.path, - event->data.blockPull.status, - cbopaque); - break; - default: VIR_WARN("Unexpected event ID %d", event->eventID); break; diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index ea481b3..f56408f 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -169,12 +169,7 @@ virDomainEventPtr virDomainEventGraphicsNewFromObj(virDomainObjPtr obj, virDomainEventPtr virDomainEventControlErrorNewFromDom(virDomainPtr dom); virDomainEventPtr virDomainEventControlErrorNewFromObj(virDomainObjPtr obj); -virDomainEventPtr virDomainEventBlockPullNewFromObj(virDomainObjPtr obj, - const char *path, - int status); -virDomainEventPtr virDomainEventBlockPullNewFromDom(virDomainPtr dom, - const char *path, - int status); + int virDomainEventQueuePush(virDomainEventQueuePtr evtQueue, virDomainEventPtr event); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d9d3913..b7f8a8c 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -382,8 +382,6 @@ virDomainWatchdogModelTypeToString; # domain_event.h -virDomainEventBlockPullNewFromObj; -virDomainEventBlockPullNewFromDom; virDomainEventCallbackListAdd; virDomainEventCallbackListAddID; virDomainEventCallbackListCount; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 89a3f64..83bd876 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -956,18 +956,6 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, return ret; } -int qemuMonitorEmitBlockPull(qemuMonitorPtr mon, - const char *diskAlias, - int status) -{ - int ret = -1; - VIR_DEBUG("mon=%p", mon); - - QEMU_MONITOR_CALLBACK(mon, ret, domainBlockPull, mon->vm, - diskAlias, status); - return ret; -} - int qemuMonitorSetCapabilities(qemuMonitorPtr mon) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 3bb0269..6fea700 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -117,10 +117,6 @@ struct _qemuMonitorCallbacks { const char *authScheme, const char *x509dname, const char *saslUsername); - int (*domainBlockPull)(qemuMonitorPtr mon, - virDomainObjPtr vm, - const char *diskAlias, - int status); }; @@ -183,10 +179,6 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, const char *authScheme, const char *x509dname, const char *saslUsername); -int qemuMonitorEmitBlockPull(qemuMonitorPtr mon, - const char *diskAlias, - int status); - int qemuMonitorStartCPUs(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 56ec65b..5048d09 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -56,7 +56,6 @@ static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr dat static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data); -static void qemuMonitorJSONHandleBlockPull(qemuMonitorPtr mon, virJSONValuePtr data); struct { const char *type; @@ -72,7 +71,6 @@ struct { { "VNC_CONNECTED", qemuMonitorJSONHandleVNCConnect, }, { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, }, { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, - { "BLOCK_STREAM_COMPLETED", qemuMonitorJSONHandleBlockPull, }, }; @@ -681,34 +679,6 @@ static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValueP qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT); } -static void qemuMonitorJSONHandleBlockPull(qemuMonitorPtr mon, virJSONValuePtr data) -{ - const char *device; - unsigned long long offset, len; - int status = VIR_DOMAIN_BLOCK_PULL_FAILED; - - if ((device = virJSONValueObjectGetString(data, "device")) == NULL) { - VIR_WARN("missing device in disk io error event"); - goto out; - } - - if (virJSONValueObjectGetNumberUlong(data, "offset", &offset) < 0) { - VIR_WARN("missing offset in block pull event"); - goto out; - } - - if (virJSONValueObjectGetNumberUlong(data, "len", &len) < 0) { - VIR_WARN("missing len in block pull event"); - goto out; - } - - if (offset != 0 && offset == len) - status = VIR_DOMAIN_BLOCK_PULL_COMPLETED; - -out: - qemuMonitorEmitBlockPull(mon, device, status); -} - int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index b4c732d..20af0b2 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -566,35 +566,6 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, return 0; } -static int -qemuProcessHandleBlockPull(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - virDomainObjPtr vm, - const char *diskAlias, - int status) -{ - struct qemud_driver *driver = qemu_driver; - virDomainEventPtr event = NULL; - const char *path; - virDomainDiskDefPtr disk; - - virDomainObjLock(vm); - disk = qemuProcessFindDomainDiskByAlias(vm, diskAlias); - - if (disk) { - path = disk->src; - event = virDomainEventBlockPullNewFromObj(vm, path, status); - } - - virDomainObjUnlock(vm); - - if (event) { - qemuDriverLock(driver); - qemuDomainEventQueue(driver, event); - qemuDriverUnlock(driver); - } - - return 0; -} static int qemuProcessHandleGraphics(qemuMonitorPtr mon ATTRIBUTE_UNUSED, @@ -712,7 +683,6 @@ static qemuMonitorCallbacks monitorCallbacks = { .domainWatchdog = qemuProcessHandleWatchdog, .domainIOError = qemuProcessHandleIOError, .domainGraphics = qemuProcessHandleGraphics, - .domainBlockPull = qemuProcessHandleBlockPull, }; static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index d7ce76e..fdbcc36 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -3824,32 +3824,6 @@ remoteDomainReadEventIOErrorReason(virConnectPtr conn, XDR *xdr) return event; } -static virDomainEventPtr -remoteDomainReadEventBlockPull(virConnectPtr conn, XDR *xdr) -{ - remote_domain_event_block_pull_msg msg; - virDomainPtr dom; - virDomainEventPtr event = NULL; - memset (&msg, 0, sizeof msg); - - /* unmarshall parameters, and process it*/ - if (! xdr_remote_domain_event_block_pull_msg(xdr, &msg) ) { - remoteError(VIR_ERR_RPC, "%s", - _("unable to demarshall block_pull event")); - return NULL; - } - - dom = get_nonnull_domain(conn,msg.dom); - if (!dom) - return NULL; - - event = virDomainEventBlockPullNewFromDom(dom, msg.path, msg.status); - xdr_free ((xdrproc_t) &xdr_remote_domain_event_block_pull_msg, (char *) &msg); - - virDomainFree(dom); - return event; -} - static virDomainEventPtr remoteDomainReadEventGraphics(virConnectPtr conn, XDR *xdr) @@ -5574,10 +5548,6 @@ processCallDispatchMessage(virConnectPtr conn, struct private_data *priv, event = remoteDomainReadEventControlError(conn, xdr); break; - case REMOTE_PROC_DOMAIN_EVENT_BLOCK_PULL: - event = remoteDomainReadEventBlockPull(conn, xdr); - break; - default: VIR_DEBUG("Unexpected event proc %d", hdr->proc); break; diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 3f8f006..a3ea287 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -1931,12 +1931,6 @@ struct remote_domain_event_graphics_msg { remote_domain_event_graphics_identity subject<REMOTE_DOMAIN_EVENT_GRAPHICS_IDENTITY_MAX>; }; -struct remote_domain_event_block_pull_msg { - remote_nonnull_domain dom; - remote_nonnull_string path; - int status; -}; - struct remote_domain_managed_save_args { remote_nonnull_domain dom; unsigned int flags; @@ -2424,8 +2418,7 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_BLOCK_PULL_ABORT = 231, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_BLOCK_PULL_INFO = 232, /* autogen autogen */ - REMOTE_PROC_DOMAIN_EVENT_BLOCK_PULL = 233, /* skipgen skipgen */ - REMOTE_PROC_DOMAIN_GET_CONTROL_INFO = 234 /* autogen autogen */ + REMOTE_PROC_DOMAIN_GET_CONTROL_INFO = 233 /* autogen autogen */ /* * Notice how the entries are grouped in sets of 10 ? diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 12dd78d..99792e8 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1421,11 +1421,6 @@ struct remote_domain_event_graphics_msg { remote_domain_event_graphics_identity * subject_val; } subject; }; -struct remote_domain_event_block_pull_msg { - remote_nonnull_domain dom; - remote_nonnull_string path; - int status; -}; struct remote_domain_managed_save_args { remote_nonnull_domain dom; u_int flags; -- 1.7.4.4

This reverts commit d74b86f5d6ecae3d18a391f90a918fcac75914db. Conflicts: python/generator.py --- python/generator.py | 5 ++- python/libvirt-override-api.xml | 14 ---------- python/libvirt-override.c | 53 --------------------------------------- 3 files changed, 3 insertions(+), 69 deletions(-) diff --git a/python/generator.py b/python/generator.py index a3ebcf9..81eaadf 100755 --- a/python/generator.py +++ b/python/generator.py @@ -184,6 +184,8 @@ def enum(type, name, value): functions_failed = [] functions_skipped = [ "virConnectListDomains", + 'virDomainBlockPull', + 'virDomainGetBlockPullInfo', ] skipped_modules = { @@ -200,6 +202,7 @@ skipped_types = { 'virStreamEventCallback': "No function types in python", 'virEventHandleCallback': "No function types in python", 'virEventTimeoutCallback': "No function types in python", + 'virDomainBlockPullInfoPtr': "Not implemented yet", } ####################################################################### @@ -366,8 +369,6 @@ skip_impl = ( 'virDomainSendKey', 'virNodeGetCPUStats', 'virNodeGetMemoryStats', - 'virDomainBlockPull', - 'virDomainGetBlockPullInfo', ) diff --git a/python/libvirt-override-api.xml b/python/libvirt-override-api.xml index b800941..01207d6 100644 --- a/python/libvirt-override-api.xml +++ b/python/libvirt-override-api.xml @@ -320,19 +320,5 @@ <arg name='flags' type='unsigned int' info='flags, curently unused'/> <return type='int' info="0 on success, -1 on error"/> </function> - <function name='virDomainBlockPull' file='python'> - <info>Initiate an incremental BlockPull for the given disk</info> - <arg name='dom' type='virDomainPtr' info='pointer to the domain'/> - <arg name='path' type='const char *' info='Fully-qualified filename of disk'/> - <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/> - <return type='virDomainBlockPullInfo' info='A dictionary containing progress information.' /> - </function> - <function name='virDomainGetBlockPullInfo' file='python'> - <info>Get progress information for a background BlockPull operation</info> - <arg name='dom' type='virDomainPtr' info='pointer to the domain'/> - <arg name='path' type='const char *' info='Fully-qualified filename of disk'/> - <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/> - <return type='virDomainBlockPullInfo' info='A dictionary containing progress information.' /> - </function> </symbols> </api> diff --git a/python/libvirt-override.c b/python/libvirt-override.c index 837c9a6..8be9af7 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -2415,57 +2415,6 @@ libvirt_virDomainGetJobInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { return(py_retval); } -static PyObject * -libvirt_virDomainBlockPullImpl(PyObject *self ATTRIBUTE_UNUSED, - PyObject *args, int infoOnly) { - virDomainPtr domain; - PyObject *pyobj_domain; - const char *path; - unsigned int flags; - virDomainBlockPullInfo info; - int c_ret; - PyObject *ret; - - if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainStreamDiskInfo", - &pyobj_domain, &path, &flags)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - -LIBVIRT_BEGIN_ALLOW_THREADS; - if (infoOnly) - c_ret = virDomainGetBlockPullInfo(domain, path, &info, flags); - else - c_ret = virDomainBlockPull(domain, path, &info, flags); -LIBVIRT_END_ALLOW_THREADS; - - if (c_ret == -1) - return VIR_PY_NONE; - - if ((ret = PyDict_New()) == NULL) - return VIR_PY_NONE; - - PyDict_SetItem(ret, libvirt_constcharPtrWrap("cur"), - libvirt_ulonglongWrap(info.cur)); - PyDict_SetItem(ret, libvirt_constcharPtrWrap("end"), - libvirt_ulonglongWrap(info.end)); - - return ret; -} - -static PyObject * -libvirt_virDomainBlockPull(PyObject *self ATTRIBUTE_UNUSED, - PyObject *args) -{ - return libvirt_virDomainBlockPullImpl(self, args, 0); -} - -static PyObject * -libvirt_virDomainGetBlockPullInfo(PyObject *self ATTRIBUTE_UNUSED, - PyObject *args) -{ - return libvirt_virDomainBlockPullImpl(self, args, 1); -} - /******************************************* * Helper functions to avoid importing modules @@ -3925,8 +3874,6 @@ static PyMethodDef libvirtMethods[] = { {(char *) "virDomainGetJobInfo", libvirt_virDomainGetJobInfo, METH_VARARGS, NULL}, {(char *) "virDomainSnapshotListNames", libvirt_virDomainSnapshotListNames, METH_VARARGS, NULL}, {(char *) "virDomainRevertToSnapshot", libvirt_virDomainRevertToSnapshot, METH_VARARGS, NULL}, - {(char *) "virDomainBlockPull", libvirt_virDomainBlockPull, METH_VARARGS, NULL}, - {(char *) "virDomainGetBlockPullInfo", libvirt_virDomainGetBlockPullInfo, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; -- 1.7.4.4

This reverts commit 3e2493ce28b7e20416e916fdf893a9569c267925. --- tools/virsh.c | 120 ++----------------------------------------------------- tools/virsh.pod | 14 ------ 2 files changed, 4 insertions(+), 130 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index fcd254d..566625b 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -4406,8 +4406,7 @@ out_sig: } static void -print_job_progress(const char *label, unsigned long long remaining, - unsigned long long total) +print_job_progress(unsigned long long remaining, unsigned long long total) { int progress; @@ -4427,7 +4426,7 @@ print_job_progress(const char *label, unsigned long long remaining, } } - fprintf(stderr, "\r%s: [%3d %%]", label, progress); + fprintf(stderr, "\rMigration: [%3d %%]", progress); } static bool @@ -4514,7 +4513,7 @@ repoll: functionReturn = true; if (verbose) { /* print [100 %] */ - print_job_progress("Migration", 0, 1); + print_job_progress(0, 1); } } else functionReturn = false; @@ -4553,8 +4552,7 @@ repoll: pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL); #endif if (ret == 0) - print_job_progress("Migration", jobinfo.dataRemaining, - jobinfo.dataTotal); + print_job_progress(jobinfo.dataRemaining, jobinfo.dataTotal); } } @@ -4657,114 +4655,6 @@ done: return ret; } -typedef enum { - VSH_CMD_BLOCK_PULL_ONE = 0, - VSH_CMD_BLOCK_PULL_ALL = 1, - VSH_CMD_BLOCK_PULL_ABORT = 2, - VSH_CMD_BLOCK_PULL_INFO = 3 -} vshCmdBlockPullMode; - -static int -blockPullImpl(vshControl *ctl, const vshCmd *cmd, - virDomainBlockPullInfoPtr info, int mode) -{ - virDomainPtr dom; - const char *name, *path; - int ret = -1; - - if (!vshConnectionUsability(ctl, ctl->conn)) - return false; - - if (!(dom = vshCommandOptDomain(ctl, cmd, &name))) - return false; - - if (vshCommandOptString(cmd, "path", &path) < 0) - return false; - - if (mode == VSH_CMD_BLOCK_PULL_ONE) - ret = virDomainBlockPull(dom, path, info, 0); - else if (mode == VSH_CMD_BLOCK_PULL_ALL) - ret = virDomainBlockPullAll(dom, path, 0); - else if (mode == VSH_CMD_BLOCK_PULL_ABORT) - ret = virDomainBlockPullAbort(dom, path, 0); - else if (mode == VSH_CMD_BLOCK_PULL_INFO) - ret = virDomainGetBlockPullInfo(dom, path, info, 0); - - virDomainFree(dom); - return ret; -} - -/* - * "blockpull" command - */ -static const vshCmdInfo info_block_pull[] = { - {"help", N_("Populate a disk from its backing image.")}, - {"desc", N_("Populate a disk from its backing image.")}, - {NULL, NULL} -}; - -static const vshCmdOptDef opts_block_pull[] = { - {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, - {"path", VSH_OT_DATA, VSH_OFLAG_REQ, N_("Fully-qualified path of disk")}, - {"all", VSH_OT_BOOL, VSH_OFLAG_NONE, N_("Populate the entire disk")}, - {"abort", VSH_OT_BOOL, VSH_OFLAG_NONE, N_("Stop populating this disk")}, - {NULL, 0, 0, NULL} -}; - -static bool -cmdBlockPull(vshControl *ctl, const vshCmd *cmd) -{ - virDomainBlockPullInfo info; - int mode; - bool all = vshCommandOptBool(cmd, "all"); - bool do_abort = vshCommandOptBool(cmd, "abort"); - - if (all && do_abort) { - vshError(ctl, "%s", _("--all and --abort are mutually exclusive")); - return false; - } - - if (all) - mode = VSH_CMD_BLOCK_PULL_ALL; - else if (do_abort) - mode = VSH_CMD_BLOCK_PULL_ABORT; - else - mode = VSH_CMD_BLOCK_PULL_ONE; - - if (blockPullImpl(ctl, cmd, &info, mode) != 0) - return false; - if (mode == VSH_CMD_BLOCK_PULL_ONE) - print_job_progress("Block pull", info.end - info.cur, info.end); - return true; -} - -/* - * "blockpullinfo" command - */ -static const vshCmdInfo info_block_pull_info[] = { - {"help", N_("Check progress of an active block pull operation.")}, - {"desc", N_("Check progress of an active block pull operation.")}, - {NULL, NULL} -}; - -static const vshCmdOptDef opts_block_pull_info[] = { - {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, - {"path", VSH_OT_DATA, VSH_OFLAG_REQ, N_("Fully-qualified path of disk")}, - {NULL, 0, 0, NULL} -}; - -static bool -cmdBlockPullInfo(vshControl *ctl, const vshCmd *cmd) -{ - virDomainBlockPullInfo info; - - if (blockPullImpl(ctl, cmd, &info, VSH_CMD_BLOCK_PULL_INFO) != 0) - return false; - print_job_progress("Block pull", info.end - info.cur, info.end); - return true; -} - - /* * "net-autostart" command */ @@ -11643,8 +11533,6 @@ static const vshCmdDef domManagementCmds[] = { info_attach_interface, 0}, {"autostart", cmdAutostart, opts_autostart, info_autostart, 0}, {"blkiotune", cmdBlkiotune, opts_blkiotune, info_blkiotune, 0}, - {"blockpull", cmdBlockPull, opts_block_pull, info_block_pull, 0}, - {"blockpullinfo", cmdBlockPullInfo, opts_block_pull_info, info_block_pull_info, 0}, #ifndef WIN32 {"console", cmdConsole, opts_console, info_console, 0}, #endif diff --git a/tools/virsh.pod b/tools/virsh.pod index 023ab42..c0a1ed7 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -371,20 +371,6 @@ Configure a domain to be automatically started at boot. The option I<--disable> disables autostarting. -=item B<blockpull> I<domain-id> I<path> optional { I<--all> | I<--abort> } - -Request that the hypervisor update a thin-provisioned I<disk> (a disk -image belonging to I<domain-id>) by pulling data from the backing -source into the main disk image. This command defaults to pulling one -block at a time. Using I<--all> requests that all data be pulled in -the background, and progress can be tracked with B<blockpullinfo>. -Using <--abort> will stop a long-running <--all>. - -=item B<blockpullinfo> I<domain-id> I<disk> - -Get information about the current status of a B<blockpull> operation -started on B<disk>. - =item B<console> I<domain-id> [I<devname>] Connect the virtual serial console for the guest. The optional -- 1.7.4.4

This reverts commit 784ee08d2220d2a77424d5fc756b6eebe8efd5fa. --- src/qemu/qemu_driver.c | 112 ------------------------------ src/qemu/qemu_monitor.c | 16 ---- src/qemu/qemu_monitor.h | 13 ---- src/qemu/qemu_monitor_json.c | 131 ----------------------------------- src/qemu/qemu_monitor_json.h | 4 - src/qemu/qemu_monitor_text.c | 156 ------------------------------------------ src/qemu/qemu_monitor_text.h | 5 -- 7 files changed, 0 insertions(+), 437 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 01587e8..97cbc73 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8205,114 +8205,6 @@ cleanup: return ret; } -static const char * -qemuDiskPathToAlias(virDomainObjPtr vm, const char *path) { - int i; - char *ret = NULL; - - for (i = 0 ; i < vm->def->ndisks ; i++) { - virDomainDiskDefPtr disk = vm->def->disks[i]; - - if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK && - disk->type != VIR_DOMAIN_DISK_TYPE_FILE) - continue; - - if (disk->src != NULL && STREQ(disk->src, path)) { - if (virAsprintf(&ret, "drive-%s", disk->info.alias) < 0) { - virReportOOMError(); - return NULL; - } - break; - } - } - - if (!ret) { - qemuReportError(VIR_ERR_INVALID_ARG, - "%s", _("No device found for specified path")); - } - return ret; -} - -static int -qemuDomainBlockPullImpl(virDomainPtr dom, const char *path, - virDomainBlockPullInfoPtr info, - int mode) -{ - struct qemud_driver *driver = dom->conn->privateData; - virDomainObjPtr vm = NULL; - qemuDomainObjPrivatePtr priv; - char uuidstr[VIR_UUID_STRING_BUFLEN]; - const char *device = NULL; - int ret = -1; - - qemuDriverLock(driver); - virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); - if (!vm) { - qemuReportError(VIR_ERR_NO_DOMAIN, - _("no domain with matching uuid '%s'"), uuidstr); - goto cleanup; - } - - if (!virDomainObjIsActive(vm)) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not running")); - goto cleanup; - } - - device = qemuDiskPathToAlias(vm, path); - if (!device) { - goto cleanup; - } - - if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0) - goto cleanup; - qemuDomainObjEnterMonitorWithDriver(driver, vm); - priv = vm->privateData; - ret = qemuMonitorBlockPull(priv->mon, device, info, mode); - qemuDomainObjExitMonitorWithDriver(driver, vm); - if (qemuDomainObjEndJob(vm) == 0) { - vm = NULL; - goto cleanup; - } - -cleanup: - VIR_FREE(device); - if (vm) - virDomainObjUnlock(vm); - qemuDriverUnlock(driver); - return ret; -} - -static int -qemuDomainBlockPull(virDomainPtr dom, const char *path, - virDomainBlockPullInfoPtr info, unsigned int flags) -{ - virCheckFlags(0, -1); - return qemuDomainBlockPullImpl(dom, path, info, BLOCK_PULL_MODE_ONE); -} - -static int -qemuDomainBlockPullAll(virDomainPtr dom, const char *path, unsigned int flags) -{ - virCheckFlags(0, -1); - return qemuDomainBlockPullImpl(dom, path, NULL, BLOCK_PULL_MODE_ALL); -} - -static int -qemuDomainBlockPullAbort(virDomainPtr dom, const char *path, unsigned int flags) -{ - virCheckFlags(0, -1); - return qemuDomainBlockPullImpl(dom, path, NULL, BLOCK_PULL_MODE_ABORT); -} - -static int -qemuDomainGetBlockPullInfo(virDomainPtr dom, const char *path, - virDomainBlockPullInfoPtr info, unsigned int flags) -{ - virCheckFlags(0, -1); - return qemuDomainBlockPullImpl(dom, path, info, BLOCK_PULL_MODE_INFO); -} static virDriver qemuDriver = { .no = VIR_DRV_QEMU, @@ -8436,10 +8328,6 @@ static virDriver qemuDriver = { .domainMigratePerform3 = qemuDomainMigratePerform3, /* 0.9.2 */ .domainMigrateFinish3 = qemuDomainMigrateFinish3, /* 0.9.2 */ .domainMigrateConfirm3 = qemuDomainMigrateConfirm3, /* 0.9.2 */ - .domainBlockPull = qemuDomainBlockPull, /* 0.9.3 */ - .domainBlockPullAll = qemuDomainBlockPullAll, /* 0.9.3 */ - .domainBlockPullAbort = qemuDomainBlockPullAbort, /* 0.9.3 */ - .domainGetBlockPullInfo = qemuDomainGetBlockPullInfo, /* 0.9.3 */ }; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 83bd876..d53da39 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2376,19 +2376,3 @@ int qemuMonitorScreendump(qemuMonitorPtr mon, ret = qemuMonitorTextScreendump(mon, file); return ret; } - -int qemuMonitorBlockPull(qemuMonitorPtr mon, - const char *path, - virDomainBlockPullInfoPtr info, - int mode) -{ - int ret; - - VIR_DEBUG("mon=%p, path=%p, info=%p, mode=%i", mon, path, info, mode); - - if (mon->json) - ret = qemuMonitorJSONBlockPull(mon, path, info, mode); - else - ret = qemuMonitorTextBlockPull(mon, path, info, mode); - return ret; -} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 6fea700..910865b 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -441,19 +441,6 @@ int qemuMonitorInjectNMI(qemuMonitorPtr mon); int qemuMonitorScreendump(qemuMonitorPtr mon, const char *file); -typedef enum { - BLOCK_PULL_MODE_ONE = 0, - BLOCK_PULL_MODE_ALL = 1, - BLOCK_PULL_MODE_ABORT = 2, - BLOCK_PULL_MODE_INFO = 3, -} BLOCK_PULL_MODE; - - -int qemuMonitorBlockPull(qemuMonitorPtr mon, - const char *path, - virDomainBlockPullInfoPtr info, - int mode); - /** * When running two dd process and using <> redirection, we need a * shell that will not truncate files. These two strings serve that diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 5048d09..2680b3c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2653,134 +2653,3 @@ int qemuMonitorJSONScreendump(qemuMonitorPtr mon, virJSONValueFree(reply); return ret; } - -static int qemuMonitorJSONGetBlockPullInfoOne(virJSONValuePtr entry, - const char *device, - virDomainBlockPullInfoPtr info) -{ - const char *this_dev; - - if ((this_dev = virJSONValueObjectGetString(entry, "device")) == NULL) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("entry was missing 'device'")); - return -1; - } - if (!STREQ(this_dev, device)) - return -1; - - if (virJSONValueObjectGetNumberUlong(entry, "offset", &info->cur) < 0) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("entry was missing 'offset'")); - return -1; - } - - if (virJSONValueObjectGetNumberUlong(entry, "len", &info->end) < 0) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("entry was missing 'len'")); - return -1; - } - return 0; -} - -/** qemuMonitorJSONGetBlockPullInfo: - * Parse Block Pull information. - * The reply can be a JSON array of objects or just an object. - */ -static int qemuMonitorJSONGetBlockPullInfo(virJSONValuePtr reply, - const char *device, - virDomainBlockPullInfoPtr info) -{ - virJSONValuePtr data; - int nr_results, i = 0; - - if (!info) - return -1; - - if ((data = virJSONValueObjectGet(reply, "return")) == NULL) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("reply was missing block_pull progress information")); - return -1; - } - - if (data->type == VIR_JSON_TYPE_OBJECT) { - if (qemuMonitorJSONGetBlockPullInfoOne(data, device, info) != 0) - goto not_found; - else - return 0; - } else if (data->type != VIR_JSON_TYPE_ARRAY) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("urecognized format of block pull information")); - return -1; - } - - if ((nr_results = virJSONValueArraySize(data)) < 0) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("unable to determine array size")); - return -1; - } - - for (i = 0; i < nr_results; i++) { - virJSONValuePtr entry = virJSONValueArrayGet(data, i); - if (qemuMonitorJSONGetBlockPullInfoOne(entry, device, info) == 0) - return 0; - } - -not_found: - qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("No associated information for the specified disk")); - return -1; -} - - -int qemuMonitorJSONBlockPull(qemuMonitorPtr mon, - const char *device, - virDomainBlockPullInfoPtr info, - int mode) -{ - int ret = -1; - virJSONValuePtr cmd = NULL; - virJSONValuePtr reply = NULL; - int parse_info = 0; - - if (mode == BLOCK_PULL_MODE_ONE) { - cmd = qemuMonitorJSONMakeCommand("block_stream", "s:device", device, NULL); - parse_info = 1; - } else if (mode == BLOCK_PULL_MODE_ALL) { - cmd = qemuMonitorJSONMakeCommand("block_stream", "s:device", device, - "b:all", 1, NULL); - } else if (mode == BLOCK_PULL_MODE_ABORT) { - cmd = qemuMonitorJSONMakeCommand("block_stream", "s:device", device, - "b:stop", 1, NULL); - } else if (mode == BLOCK_PULL_MODE_INFO) { - cmd = qemuMonitorJSONMakeCommand("query-block-stream", NULL); - parse_info = 1; - } - - if (!cmd) - return -1; - - ret = qemuMonitorJSONCommand(mon, cmd, &reply); - - if (ret == 0 && virJSONValueObjectHasKey(reply, "error")) { - if (qemuMonitorJSONHasError(reply, "DeviceNotActive")) - qemuReportError(VIR_ERR_OPERATION_INVALID, - _("No active operation on device: %s"), device); - else if (qemuMonitorJSONHasError(reply, "DeviceInUse")) - qemuReportError(VIR_ERR_OPERATION_FAILED, - _("Device %s in use"), device); - else if (qemuMonitorJSONHasError(reply, "NotSupported")) - qemuReportError(VIR_ERR_OPERATION_INVALID, - _("Operation is not supported for device: %s"), device); - else - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unexpected error")); - ret = -1; - } - - if (ret == 0 && parse_info) - ret = qemuMonitorJSONGetBlockPullInfo(reply, device, info); - - virJSONValueFree(cmd); - virJSONValueFree(reply); - return ret; -} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 393d8fc..ec79b03 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -217,9 +217,5 @@ int qemuMonitorJSONInjectNMI(qemuMonitorPtr mon); int qemuMonitorJSONScreendump(qemuMonitorPtr mon, const char *file); -int qemuMonitorJSONBlockPull(qemuMonitorPtr mon, - const char *device, - virDomainBlockPullInfoPtr info, - int mode); #endif /* QEMU_MONITOR_JSON_H */ diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index a16ea91..d432027 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -2750,159 +2750,3 @@ cleanup: VIR_FREE(cmd); return ret; } - -static int qemuMonitorTextParseBlockPullOne(const char *text, - const char *device, - virDomainBlockPullInfoPtr info, - const char **next) -{ - virDomainBlockPullInfo tmp; - char *p; - int mismatch = 0; - - if (next == NULL) - return -1; - *next = NULL; - - /* - * Each active stream will appear on its own line in the following format: - * Streaming device <device>: Completed <cur> of <end> bytes - */ - if ((text = STRSKIP(text, "Streaming device ")) == NULL) - return -EINVAL; - - if (!STREQLEN(text, device, strlen(device))) - mismatch = 1; - - if ((text = strstr(text, ": Completed ")) == NULL) - return -EINVAL; - text += 11; - - if (virStrToLong_ull (text, &p, 10, &tmp.cur)) - return -EINVAL; - text = p; - - if (!STRPREFIX(text, " of ")) - return -EINVAL; - text += 4; - - if (virStrToLong_ull (text, &p, 10, &tmp.end)) - return -EINVAL; - text = p; - - if (!STRPREFIX(text, " bytes")) - return -EINVAL; - - if (mismatch) { - *next = STRSKIP(text, "\n"); - return -EAGAIN; - } - - if (info) { - info->cur = tmp.cur; - info->end = tmp.end; - } - return 0; -} - -static int qemuMonitorTextParseBlockPull(const char *text, - const char *device, - virDomainBlockPullInfoPtr info) -{ - const char *next = NULL; - int ret = 0; - - /* Check error: Device not found */ - if (strstr(text, "Device '") && strstr(text, "' not found")) { - qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Device not found")); - return -1; - } - - /* Check error: Already streaming this device */ - if (strstr(text, "Device '") && strstr(text, "' is in use")) { - qemuReportError(VIR_ERR_OPERATION_FAILED, _("Device %s in use"), - device); - return -1; - } - - /* Check error: Stop non-existent stream */ - if (strstr(text, "has not been activated")) { - qemuReportError(VIR_ERR_OPERATION_INVALID,\ - _("No active operation on device: %s"), device); - return -1; - } - - /* - * Check: No active streams when calling info block_stream - * This is not an error condition, there are just no results to report. - */ - if (strstr(text, "No active stream")) { - return -1; - } - - /* Check for unsupported operation */ - if (strstr(text, "Operation is not supported")) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - _("Operation is not supported for device: %s"), device); - return -1; - } - - /* No output indicates success for BlockPullAll and BlockPullAbort */ - if (STREQ(text, "")) - return 0; - - /* Now try to parse lines of block_stream output */ - do { - ret = qemuMonitorTextParseBlockPullOne(text, device, info, &next); - text = next; - } while (text && ret == -EAGAIN); - - if (ret != 0) { - qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("No associated information for the specified disk")); - ret = -1; - } - return ret; -} - -int qemuMonitorTextBlockPull(qemuMonitorPtr mon, - const char *device, - virDomainBlockPullInfoPtr info, - int mode) -{ - char *cmd = NULL; - char *reply = NULL; - int ret; - - if (mode == BLOCK_PULL_MODE_ONE) - ret = virAsprintf(&cmd, "block_stream %s", device); - else if (mode == BLOCK_PULL_MODE_ALL) - ret = virAsprintf(&cmd, "block_stream -a %s", device); - else if (mode == BLOCK_PULL_MODE_ABORT) - ret = virAsprintf(&cmd, "block_stream -s %s", device); - else if (mode == BLOCK_PULL_MODE_INFO) - ret = virAsprintf(&cmd, "info block_stream"); - else - return -1; - - if (ret < 0) { - virReportOOMError(); - return -1; - } - - ret = 0; - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("cannot run monitor command")); - ret = -1; - goto cleanup; - } - - if (qemuMonitorTextParseBlockPull(reply, device, info) != 0) - ret = -1; - -cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index 4fa5064..8a69105 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -210,9 +210,4 @@ int qemuMonitorTextInjectNMI(qemuMonitorPtr mon); int qemuMonitorTextScreendump(qemuMonitorPtr mon, const char *file); -int qemuMonitorTextBlockPull(qemuMonitorPtr mon, - const char *device, - virDomainBlockPullInfoPtr info, - int mode); - #endif /* QEMU_MONITOR_TEXT_H */ -- 1.7.4.4

This reverts commit d1693bb160ea78954592c45a40eb856190c619c8. Conflicts: daemon/remote.c src/remote/remote_driver.c src/remote/remote_protocol.x --- daemon/remote.c | 35 ----------------------------------- src/remote/remote_driver.c | 36 ------------------------------------ src/remote/remote_protocol.x | 41 +---------------------------------------- src/remote_protocol-structs | 28 ---------------------------- 4 files changed, 1 insertions(+), 139 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 5e58427..48624d6 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1524,41 +1524,6 @@ no_memory: goto cleanup; } -static int -remoteDispatchDomainBlockPull(struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client ATTRIBUTE_UNUSED, - virConnectPtr conn, - remote_message_header *hdr ATTRIBUTE_UNUSED, - remote_error * rerr, - remote_domain_block_pull_args *args, - remote_domain_block_pull_ret *ret) -{ - virDomainPtr dom = NULL; - virDomainBlockPullInfo tmp; - int rv = -1; - - if (!conn) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); - goto cleanup; - } - - if (!(dom = get_nonnull_domain(conn, args->dom))) - goto cleanup; - - if (virDomainBlockPull(dom, args->path, &tmp, args->flags) < 0) - goto cleanup; - ret->cur = tmp.cur; - ret->end = tmp.end; - rv = 0; - -cleanup: - if (rv < 0) - remoteDispatchError(rerr); - if (dom) - virDomainFree(dom); - return rv; -} - /*-------------------------------------------------------------*/ static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index fdbcc36..a7ac90a 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2638,38 +2638,6 @@ done: return rv; } -static int remoteDomainBlockPull(virDomainPtr domain, - const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags) -{ - int rv = -1; - remote_domain_block_pull_args args; - remote_domain_block_pull_ret ret; - struct private_data *priv = domain->conn->privateData; - - remoteDriverLock(priv); - - make_nonnull_domain(&args.dom, domain); - args.path = (char *)path; - args.flags = flags; - - if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_BLOCK_PULL, - (xdrproc_t)xdr_remote_domain_block_pull_args, (char *)&args, - (xdrproc_t)xdr_remote_domain_block_pull_ret, (char *)&ret) == -1) - goto done; - - if (info) { - info->cur = ret.cur; - info->end = ret.end; - } - rv = 0; - -done: - remoteDriverUnlock(priv); - return rv; -} - /*----------------------------------------------------------------------*/ static virDrvOpenStatus ATTRIBUTE_NONNULL (1) @@ -6503,10 +6471,6 @@ static virDriver remote_driver = { .domainMigrateFinish3 = remoteDomainMigrateFinish3, /* 0.9.2 */ .domainMigrateConfirm3 = remoteDomainMigrateConfirm3, /* 0.9.2 */ .domainSendKey = remoteDomainSendKey, /* 0.9.3 */ - .domainBlockPull = remoteDomainBlockPull, /* 0.9.3 */ - .domainBlockPullAll = remoteDomainBlockPullAll, /* 0.9.3 */ - .domainBlockPullAbort = remoteDomainBlockPullAbort, /* 0.9.3 */ - .domainGetBlockPullInfo = remoteDomainGetBlockPullInfo, /* 0.9.3 */ }; static virNetworkDriver network_driver = { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index a3ea287..35f6ee5 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -977,40 +977,6 @@ struct remote_domain_set_autostart_args { int autostart; }; -struct remote_domain_block_pull_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - unsigned int flags; -}; - -struct remote_domain_block_pull_ret { - unsigned hyper cur; - unsigned hyper end; -}; - -struct remote_domain_block_pull_all_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - unsigned int flags; -}; - -struct remote_domain_block_pull_abort_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - unsigned int flags; -}; - -struct remote_domain_get_block_pull_info_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - unsigned int flags; -}; - -struct remote_domain_get_block_pull_info_ret { /* insert@2 */ - unsigned hyper cur; - unsigned hyper end; -}; - /* Network calls: */ struct remote_num_of_networks_ret { @@ -2413,12 +2379,7 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SEND_KEY = 226, /* autogen autogen */ REMOTE_PROC_NODE_GET_CPU_STATS = 227, /* skipgen skipgen */ REMOTE_PROC_NODE_GET_MEMORY_STATS = 228, /* skipgen skipgen */ - REMOTE_PROC_DOMAIN_BLOCK_PULL = 229, /* skipgen skipgen */ - REMOTE_PROC_DOMAIN_BLOCK_PULL_ALL = 230, /* autogen autogen */ - - REMOTE_PROC_DOMAIN_BLOCK_PULL_ABORT = 231, /* autogen autogen */ - REMOTE_PROC_DOMAIN_GET_BLOCK_PULL_INFO = 232, /* autogen autogen */ - REMOTE_PROC_DOMAIN_GET_CONTROL_INFO = 233 /* autogen autogen */ + REMOTE_PROC_DOMAIN_GET_CONTROL_INFO = 229 /* autogen autogen */ /* * Notice how the entries are grouped in sets of 10 ? diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 99792e8..81bd033 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -654,34 +654,6 @@ struct remote_domain_set_autostart_args { remote_nonnull_domain dom; int autostart; }; -struct remote_domain_block_pull_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - u_int flags; -}; -struct remote_domain_block_pull_ret { - uint64_t cur; - uint64_t end; -}; -struct remote_domain_block_pull_all_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - u_int flags; -}; -struct remote_domain_block_pull_abort_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - u_int flags; -}; -struct remote_domain_get_block_pull_info_args { - remote_nonnull_domain dom; - remote_nonnull_string path; - u_int flags; -}; -struct remote_domain_get_block_pull_info_ret { - uint64_t cur; - uint64_t end; -}; struct remote_num_of_networks_ret { int num; }; -- 1.7.4.4

This reverts commit 6419f596e114ee9f372136cc2b9eb19f1cbb7a77. --- src/libvirt.c | 228 --------------------------------------------------------- 1 files changed, 0 insertions(+), 228 deletions(-) diff --git a/src/libvirt.c b/src/libvirt.c index 69e0ea8..cfe37a6 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -15335,231 +15335,3 @@ error: virDispatchError(conn); return -1; } - -/** - * virDomainBlockPull: - * @dom: pointer to domain object - * @path: Fully-qualified filename of disk - * @info: A pointer to a virDomainBlockPullInfo structure, or NULL - * @flags: currently unused, for future extension - * - * Populate a disk image with data from its backing image. Once all data from - * its backing image has been pulled, the disk no longer depends on a backing - * image. This function works incrementally, performing a small amount of work - * each time it is called. When successful, @info is updated with the current - * progress. - * - * Returns -1 in case of failure, 0 when successful. - */ -int virDomainBlockPull(virDomainPtr dom, - const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags) -{ - virConnectPtr conn; - - VIR_DOMAIN_DEBUG(dom, "path=%p, info=%p, flags=%u", path, info, flags); - - virResetLastError(); - - if (!VIR_IS_CONNECTED_DOMAIN (dom)) { - virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); - virDispatchError(NULL); - return -1; - } - conn = dom->conn; - - if (dom->conn->flags & VIR_CONNECT_RO) { - virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); - goto error; - } - - if (!path) { - virLibDomainError(VIR_ERR_INVALID_ARG, - _("path is NULL")); - goto error; - } - - if (conn->driver->domainBlockPull) { - int ret; - ret = conn->driver->domainBlockPull(dom, path, info, flags); - if (ret < 0) - goto error; - return ret; - } - - virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__); - -error: - virDispatchError(dom->conn); - return -1; -} - -/** - * virDomainBlockPullAll: - * @dom: pointer to domain object - * @path: Fully-qualified filename of disk - * @flags: currently unused, for future extension - * - * Populate a disk image with data from its backing image. Once all data from - * its backing image has been pulled, the disk no longer depends on a backing - * image. This function pulls data for the entire device in the background. - * Progress of the operation can be checked with virDomainGetBlockPullInfo() and - * the operation can be aborted with virDomainBlockPullAbort(). When finished, - * an asynchronous event is raised to indicate the final status. - * - * Returns 0 if the operation has started, -1 on failure. - */ -int virDomainBlockPullAll(virDomainPtr dom, - const char *path, - unsigned int flags) -{ - virConnectPtr conn; - - VIR_DOMAIN_DEBUG(dom, "path=%p, flags=%u", path, flags); - - virResetLastError(); - - if (!VIR_IS_CONNECTED_DOMAIN (dom)) { - virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); - virDispatchError(NULL); - return -1; - } - conn = dom->conn; - - if (dom->conn->flags & VIR_CONNECT_RO) { - virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); - goto error; - } - - if (!path) { - virLibDomainError(VIR_ERR_INVALID_ARG, - _("path is NULL")); - goto error; - } - - if (conn->driver->domainBlockPullAll) { - int ret; - ret = conn->driver->domainBlockPullAll(dom, path, flags); - if (ret < 0) - goto error; - return ret; - } - - virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__); - -error: - virDispatchError(dom->conn); - return -1; -} - -/** - * virDomainBlockPullAbort: - * @dom: pointer to domain object - * @path: fully-qualified filename of disk - * @flags: currently unused, for future extension - * - * Cancel a pull operation previously started by virDomainBlockPullAll(). - * - * Returns -1 in case of failure, 0 when successful. - */ -int virDomainBlockPullAbort(virDomainPtr dom, - const char *path, - unsigned int flags) -{ - virConnectPtr conn; - - VIR_DOMAIN_DEBUG(dom, "path=%p, flags=%u", path, flags); - - virResetLastError(); - - if (!VIR_IS_CONNECTED_DOMAIN (dom)) { - virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); - virDispatchError(NULL); - return -1; - } - conn = dom->conn; - - if (dom->conn->flags & VIR_CONNECT_RO) { - virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); - goto error; - } - - if (!path) { - virLibDomainError(VIR_ERR_INVALID_ARG, - _("path is NULL")); - goto error; - } - - if (conn->driver->domainBlockPullAbort) { - int ret; - ret = conn->driver->domainBlockPullAbort(dom, path, flags); - if (ret < 0) - goto error; - return ret; - } - - virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__); - -error: - virDispatchError(dom->conn); - return -1; -} - -/** - * virDomainGetBlockPullInfo: - * @dom: pointer to domain object - * @path: fully-qualified filename of disk - * @info: pointer to a virDomainBlockPullInfo structure - * @flags: currently unused, for future extension - * - * Request progress information on a block pull operation that has been started - * with virDomainBlockPullAll(). If an operation is active for the given - * parameters, @info will be updated with the current progress. - * - * Returns -1 in case of failure, 0 when successful. - */ -int virDomainGetBlockPullInfo(virDomainPtr dom, - const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags) -{ - virConnectPtr conn; - - VIR_DOMAIN_DEBUG(dom, "path=%p, info=%p, flags=%u", path, info, flags); - - virResetLastError(); - - if (!VIR_IS_CONNECTED_DOMAIN (dom)) { - virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); - virDispatchError(NULL); - return -1; - } - conn = dom->conn; - - if (!path) { - virLibDomainError(VIR_ERR_INVALID_ARG, - _("path is NULL")); - goto error; - } - - if (!info) { - virLibDomainError(VIR_ERR_INVALID_ARG, - _("info is NULL")); - goto error; - } - - if (conn->driver->domainGetBlockPullInfo) { - int ret; - ret = conn->driver->domainGetBlockPullInfo(dom, path, info, flags); - if (ret < 0) - goto error; - return ret; - } - - virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__); - -error: - virDispatchError(dom->conn); - return -1; -} -- 1.7.4.4

This reverts commit 7d56a16d036d9aa7292e10e884c129742036f8a7. Conflicts: python/generator.py src/libvirt_public.syms --- include/libvirt/libvirt.h.in | 39 --------------------------------------- python/generator.py | 3 --- src/driver.h | 22 ---------------------- src/libvirt_public.syms | 4 ---- 4 files changed, 0 insertions(+), 68 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 85f2460..baaa319 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -1373,45 +1373,6 @@ int virDomainUpdateDeviceFlags(virDomainPtr domain, const char *xml, unsigned int flags); /* - * BlockPull API - */ - -/* An iterator for initiating and monitoring block pull operations */ -typedef unsigned long long virDomainBlockPullCursor; - -typedef struct _virDomainBlockPullInfo virDomainBlockPullInfo; -struct _virDomainBlockPullInfo { - /* - * The following fields provide an indication of block pull progress. @cur - * indicates the current position and will be between 0 and @end. @end is - * the final cursor position for this operation and represents completion. - * To approximate progress, divide @cur by @end. - */ - virDomainBlockPullCursor cur; - virDomainBlockPullCursor end; -}; -typedef virDomainBlockPullInfo *virDomainBlockPullInfoPtr; - -int virDomainBlockPull(virDomainPtr dom, - const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags); - -int virDomainBlockPullAll(virDomainPtr dom, - const char *path, - unsigned int flags); - -int virDomainBlockPullAbort(virDomainPtr dom, - const char *path, - unsigned int flags); - -int virDomainGetBlockPullInfo(virDomainPtr dom, - const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags); - - -/* * NUMA support */ diff --git a/python/generator.py b/python/generator.py index 81eaadf..a4d3c3c 100755 --- a/python/generator.py +++ b/python/generator.py @@ -184,8 +184,6 @@ def enum(type, name, value): functions_failed = [] functions_skipped = [ "virConnectListDomains", - 'virDomainBlockPull', - 'virDomainGetBlockPullInfo', ] skipped_modules = { @@ -202,7 +200,6 @@ skipped_types = { 'virStreamEventCallback': "No function types in python", 'virEventHandleCallback': "No function types in python", 'virEventTimeoutCallback': "No function types in python", - 'virDomainBlockPullInfoPtr': "Not implemented yet", } ####################################################################### diff --git a/src/driver.h b/src/driver.h index 62bbc1d..b02989b 100644 --- a/src/driver.h +++ b/src/driver.h @@ -648,24 +648,6 @@ typedef int unsigned long flags, int cancelled); -typedef int - (*virDrvDomainBlockPull)(virDomainPtr dom, const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags); - -typedef int - (*virDrvDomainBlockPullAll)(virDomainPtr dom, const char *path, - unsigned int flags); - -typedef int - (*virDrvDomainBlockPullAbort)(virDomainPtr dom, const char *path, - unsigned int flags); - -typedef int - (*virDrvDomainGetBlockPullInfo)(virDomainPtr dom, const char *path, - virDomainBlockPullInfoPtr info, - unsigned int flags); - /** * _virDriver: * @@ -805,10 +787,6 @@ struct _virDriver { virDrvDomainMigrateFinish3 domainMigrateFinish3; virDrvDomainMigrateConfirm3 domainMigrateConfirm3; virDrvDomainSendKey domainSendKey; - virDrvDomainBlockPull domainBlockPull; - virDrvDomainBlockPullAll domainBlockPullAll; - virDrvDomainBlockPullAbort domainBlockPullAbort; - virDrvDomainGetBlockPullInfo domainGetBlockPullInfo; }; typedef int diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 39d4cae..7687223 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -452,10 +452,6 @@ LIBVIRT_0.9.2 { LIBVIRT_0.9.3 { global: - virDomainBlockPull; - virDomainBlockPullAbort; - virDomainBlockPullAll; - virDomainGetBlockPullInfo; virDomainGetControlInfo; virDomainPinVcpuFlags; virDomainSendKey; -- 1.7.4.4

On Thu, Jun 23, 2011 at 03:43:21PM -0600, Eric Blake wrote:
This reverts commit 12cd77a0c58a80179182f7d09e8e73f9f66b4677.
Conflicts:
python/libvirt-override-virConnect.py python/libvirt-override.c src/remote/remote_protocol.x ---
We've added some new APIs in the meantime, so there are some minor conflicts in reverting the BlockPull stuff. But consensus seemed to be that since qemu might change the block pull monitor command before it goes upstream, that we are safer deferring this patch series until after 0.9.3.
daemon/remote.c | 32 -------------------- include/libvirt/libvirt.h.in | 27 ----------------- python/libvirt-override-virConnect.py | 9 ------ python/libvirt-override.c | 51 --------------------------------- src/conf/domain_event.c | 51 --------------------------------- src/conf/domain_event.h | 7 +---- src/libvirt_private.syms | 2 - src/qemu/qemu_monitor.c | 12 -------- src/qemu/qemu_monitor.h | 8 ----- src/qemu/qemu_monitor_json.c | 30 ------------------- src/qemu/qemu_process.c | 30 ------------------- src/remote/remote_driver.c | 30 ------------------- src/remote/remote_protocol.x | 9 +----- src/remote_protocol-structs | 5 --- 14 files changed, 2 insertions(+), 301 deletions(-)
Sadly, ACK to this patch and the 6 following ones. This is just too risky to have included in our next release. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 06/24/2011 07:05 AM, Daniel P. Berrange wrote:
On Thu, Jun 23, 2011 at 03:43:21PM -0600, Eric Blake wrote:
This reverts commit 12cd77a0c58a80179182f7d09e8e73f9f66b4677.
Conflicts:
python/libvirt-override-virConnect.py python/libvirt-override.c src/remote/remote_protocol.x ---
We've added some new APIs in the meantime, so there are some minor conflicts in reverting the BlockPull stuff. But consensus seemed to be that since qemu might change the block pull monitor command before it goes upstream, that we are safer deferring this patch series until after 0.9.3.
Sadly, ACK to this patch and the 6 following ones. This is just too risky to have included in our next release.
Done. :( But it should be a lot easier to revive these once upstream qemu support is finally in place. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Stefan Hajnoczi