Message ID | 1427475330-4652-2-git-send-email-lma@suse.com |
---|---|
State | New |
Headers | show |
On Sat, 28 Mar 2015 00:55:29 +0800 Lin Ma <lma@suse.com> 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 <lma@suse.com> > --- > include/qom/object_interfaces.h | 14 ++++++++++++++ > qmp.c | 5 +++++ > qom/object_interfaces.c | 14 ++++++++++++++ > 3 files changed, 33 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 { > > /* <public> */ > 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 s/obj/uc/ s/defined/implemented/ > + * @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. drop ", otherwise the call does nothing" > +bool user_creatable_can_be_deleted(Object *obj, Error **errp); [...] > > +bool user_creatable_can_be_deleted(Object *obj, Error **errp) > +{ > + > + UserCreatableClass *ucc; > + UserCreatable *uc = USER_CREATABLE(obj); Function description doesn't match what it does, I mean part "otherwise the call does nothing." How about changing prototype to: bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp) and calling it in qmp.c like: user_creatable_can_be_deleted(USER_CREATABLE(obj), errp);
在 2015年03月28日 01:20, Igor Mammedov 写道: > On Sat, 28 Mar 2015 00:55:29 +0800 > Lin Ma <lma@suse.com> 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 <lma@suse.com> >> --- >> include/qom/object_interfaces.h | 14 ++++++++++++++ >> qmp.c | 5 +++++ >> qom/object_interfaces.c | 14 ++++++++++++++ >> 3 files changed, 33 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 { >> >> /* <public> */ >> 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 > s/obj/uc/ > s/defined/implemented/ > >> + * @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. > drop ", otherwise the call does nothing" > >> +bool user_creatable_can_be_deleted(Object *obj, Error **errp); > [...] >> >> +bool user_creatable_can_be_deleted(Object *obj, Error **errp) >> +{ >> + >> + UserCreatableClass *ucc; >> + UserCreatable *uc = USER_CREATABLE(obj); > Function description doesn't match what it does, I mean part > "otherwise the call does nothing." > > How about changing prototype to: > > bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp) > > and calling it in qmp.c like: > user_creatable_can_be_deleted(USER_CREATABLE(obj), errp); That makes sense. But If so, Does prototype of user_creatable_complete need to be changed as well by a new patch?
On Sat, 28 Mar 2015 01:53:28 +0800 Lin Ma <lma@suse.com> wrote: > > 在 2015年03月28日 01:20, Igor Mammedov 写道: > > On Sat, 28 Mar 2015 00:55:29 +0800 > > Lin Ma <lma@suse.com> 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 <lma@suse.com> > >> --- > >> include/qom/object_interfaces.h | 14 ++++++++++++++ > >> qmp.c | 5 +++++ > >> qom/object_interfaces.c | 14 ++++++++++++++ > >> 3 files changed, 33 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 { > >> > >> /* <public> */ > >> 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 > > s/obj/uc/ > > s/defined/implemented/ > > > >> + * @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. > > drop ", otherwise the call does nothing" > > > >> +bool user_creatable_can_be_deleted(Object *obj, Error **errp); > > [...] > >> > >> +bool user_creatable_can_be_deleted(Object *obj, Error **errp) > >> +{ > >> + > >> + UserCreatableClass *ucc; > >> + UserCreatable *uc = USER_CREATABLE(obj); > > Function description doesn't match what it does, I mean part > > "otherwise the call does nothing." > > > > How about changing prototype to: > > > > bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp) > > > > and calling it in qmp.c like: > > user_creatable_can_be_deleted(USER_CREATABLE(obj), errp); > That makes sense. > > But If so, Does prototype of user_creatable_complete need to be changed > as well by a new patch? Yep, make it a separate patch though.
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 { /* <public> */ 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..48f54c9 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 use, can not be deleted", id); + return; + } object_unparent(obj); } diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 6360818..608b436 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -18,6 +18,20 @@ void user_creatable_complete(Object *obj, Error **errp) } } +bool user_creatable_can_be_deleted(Object *obj, Error **errp) +{ + + UserCreatableClass *ucc; + UserCreatable *uc = USER_CREATABLE(obj); + + 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 = {
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 <lma@suse.com> --- include/qom/object_interfaces.h | 14 ++++++++++++++ qmp.c | 5 +++++ qom/object_interfaces.c | 14 ++++++++++++++ 3 files changed, 33 insertions(+)