From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57206) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YbWgA-0003lP-JV for qemu-devel@nongnu.org; Fri, 27 Mar 2015 12:00:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YbWg5-0006Xt-0F for qemu-devel@nongnu.org; Fri, 27 Mar 2015 12:00:14 -0400 Received: from smtp2.provo.novell.com ([137.65.250.81]:50708) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YbWg4-0006Vs-Pc for qemu-devel@nongnu.org; Fri, 27 Mar 2015 12:00:08 -0400 Message-ID: <55157E65.6080907@suse.com> Date: Fri, 27 Mar 2015 23:59:33 +0800 From: Lin Ma MIME-Version: 1.0 References: <1427434572-17552-1-git-send-email-lma@suse.com> <1427434572-17552-2-git-send-email-lma@suse.com> <20150327153535.2fdef197@nial.brq.redhat.com> In-Reply-To: <20150327153535.2fdef197@nial.brq.redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v4 1/2] qom: Add can_be_deleted callback to UserCreatableClass Reply-To: lma@suse.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Igor Mammedov Cc: pbonzini@redhat.com, peter.crosthwaite@xilinx.com, afaerber@suse.de, qemu-devel@nongnu.org 在 2015年03月27日 22:35, Igor Mammedov 写道: > On Fri, 27 Mar 2015 13:36:11 +0800 > Lin Ma wrote: > >> If backends implement the can_be_deleted and it returns false, >> Then the qmp_object_del won't delete the given backends. >> >> Signed-off-by: Lin Ma >> --- >> include/qom/object_interfaces.h | 14 ++++++++++++++ >> qmp.c | 5 +++++ >> qom/object_interfaces.c | 15 +++++++++++++++ >> 3 files changed, 34 insertions(+) >> >> diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h >> index b792283..012b653 100644 >> --- a/include/qom/object_interfaces.h >> +++ b/include/qom/object_interfaces.h >> @@ -25,6 +25,8 @@ typedef struct UserCreatable { >> * UserCreatableClass: >> * @parent_class: the base class >> * @complete: callback to be called after @obj's properties are set. >> + * @can_be_deleted: callback to be called before an object is removed >> + * to check if @obj can be removed safely. >> * >> * Interface is designed to work with -object/object-add/object_add >> * commands. >> @@ -47,6 +49,7 @@ typedef struct UserCreatableClass { >> >> /* */ >> void (*complete)(UserCreatable *uc, Error **errp); >> + bool (*can_be_deleted)(UserCreatable *uc, Error **errp); >> } UserCreatableClass; >> >> /** >> @@ -59,4 +62,15 @@ typedef struct UserCreatableClass { >> * nothing. >> */ >> void user_creatable_complete(Object *obj, Error **errp); >> + >> +/** >> + * user_creatable_can_be_deleted: >> + * @obj: the object whose can_be_deleted() method is called if defined >> + * @errp: if an error occurs, a pointer to an area to store the error >> + * >> + * Wrapper to call can_be_deleted() method if one of types it's inherited >> + * from implements USER_CREATABLE interface, otherwise the call does >> + * nothing. >> + */ >> +bool user_creatable_can_be_deleted(Object *obj, Error **errp); >> #endif >> diff --git a/qmp.c b/qmp.c >> index c479e77..dc61da1 100644 >> --- a/qmp.c >> +++ b/qmp.c >> @@ -711,6 +711,11 @@ void qmp_object_del(const char *id, Error **errp) >> error_setg(errp, "object id not found"); >> return; >> } >> + >> + if (!user_creatable_can_be_deleted(obj, errp)) { >> + error_setg(errp, "%s is in used, can not be deleted", id); > ^^^ is in use || is used Thanks for catching this. I'll modify it to 'in use' >> + return; >> + } >> object_unparent(obj); >> } >> >> diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c >> index 6360818..25ae6ca 100644 >> --- a/qom/object_interfaces.c >> +++ b/qom/object_interfaces.c >> @@ -18,6 +18,21 @@ void user_creatable_complete(Object *obj, Error **errp) >> } >> } >> >> +bool user_creatable_can_be_deleted(Object *obj, Error **errp) >> +{ >> + >> + UserCreatableClass *ucc; >> + UserCreatable *uc = >> + (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE); > direc cast is wron, pls use type specific caster with QOM objects > in this case you can even drop dynamic cast since /objects holds > only TYPE_USER_CREATABLE objects and just do > UserCreatable *uc = USER_CREATABLE(obj) will do. > you don't check for null pointer anyway May I have your suggestion about checking the null pointer? says: if (!uc) { return false; // is this make sense? } > >> + >> + ucc = USER_CREATABLE_GET_CLASS(uc); >> + if (ucc->can_be_deleted) { >> + return ucc->can_be_deleted(uc, errp); >> + } else { >> + return true; >> + } >> +} >> + >> static void register_types(void) >> { >> static const TypeInfo uc_interface_info = { >