From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lu7zV-0008IH-GA for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:29:37 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lu7zR-0008Fg-JA for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:29:37 -0400 Received: from [199.232.76.173] (port=54429 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lu7zR-0008FQ-9F for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:29:33 -0400 Received: from mail14.svc.cra.dublin.eircom.net ([159.134.118.30]:37190) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1Lu7zQ-00062U-KC for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:29:32 -0400 From: Mark McLoughlin Date: Wed, 15 Apr 2009 17:29:27 +0100 Message-Id: <1239812969-8320-8-git-send-email-markmc@redhat.com> In-Reply-To: <1239812969-8320-7-git-send-email-markmc@redhat.com> References: <1239812969-8320-1-git-send-email-markmc@redhat.com> <1239812969-8320-2-git-send-email-markmc@redhat.com> <1239812969-8320-3-git-send-email-markmc@redhat.com> <1239812969-8320-4-git-send-email-markmc@redhat.com> <1239812969-8320-5-git-send-email-markmc@redhat.com> <1239812969-8320-6-git-send-email-markmc@redhat.com> <1239812969-8320-7-git-send-email-markmc@redhat.com> Subject: [Qemu-devel] [PATCH 7/9] Add unregister_savevm() Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Jan Kiszka , qemu-devel@nongnu.org, Mark McLoughlin Currently there's no way to unregister a savevm callback, so e.g. if a NIC is hot-unplugged and a savevm is issued, we'll segfault. Signed-off-by: Mark McLoughlin --- hw/hw.h | 2 ++ savevm.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) diff --git a/hw/hw.h b/hw/hw.h index e9628d4..d0cf598 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -239,6 +239,8 @@ int register_savevm_live(const char *idstr, LoadStateHandler *load_state, void *opaque); +void unregister_savevm(const char *idstr, void *opaque); + typedef void QEMUResetHandler(void *opaque); void qemu_register_reset(QEMUResetHandler *func, void *opaque); diff --git a/savevm.c b/savevm.c index 70500dd..c15db9a 100644 --- a/savevm.c +++ b/savevm.c @@ -647,6 +647,22 @@ int register_savevm(const char *idstr, NULL, save_state, load_state, opaque); } +void unregister_savevm(const char *idstr, void *opaque) +{ + SaveStateEntry **pse; + + pse = &first_se; + while (*pse != NULL) { + if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) { + SaveStateEntry *next = (*pse)->next; + qemu_free(*pse); + *pse = next; + continue; + } + pse = &(*pse)->next; + } +} + #define QEMU_VM_FILE_MAGIC 0x5145564d #define QEMU_VM_FILE_VERSION_COMPAT 0x00000002 #define QEMU_VM_FILE_VERSION 0x00000003 -- 1.6.0.6