* [Qemu-devel] [PATCH 0/2] small fix of block job @ 2016-06-22 9:16 Changlong Xie 2016-06-22 9:16 ` [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob Changlong Xie 2016-06-22 9:16 ` [Qemu-devel] [PATCH 2/2] mirror: fix misleading comments Changlong Xie 0 siblings, 2 replies; 10+ messages in thread From: Changlong Xie @ 2016-06-22 9:16 UTC (permalink / raw) To: qemu devel, Jeff Cody Cc: Stefan Hajnoczi, Fam Zheng, Max Reitz, Kevin Wolf, Wen Congyang, Changlong Xie Changlong Xie (2): blockjob: assert(cb) in the entry functions of blockjob mirror: fix misleading comments block/commit.c | 1 + block/mirror.c | 4 +++- block/stream.c | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) -- 1.9.3 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-22 9:16 [Qemu-devel] [PATCH 0/2] small fix of block job Changlong Xie @ 2016-06-22 9:16 ` Changlong Xie 2016-06-22 9:50 ` Paolo Bonzini 2016-06-22 9:16 ` [Qemu-devel] [PATCH 2/2] mirror: fix misleading comments Changlong Xie 1 sibling, 1 reply; 10+ messages in thread From: Changlong Xie @ 2016-06-22 9:16 UTC (permalink / raw) To: qemu devel, Jeff Cody Cc: Stefan Hajnoczi, Fam Zheng, Max Reitz, Kevin Wolf, Wen Congyang, Changlong Xie Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> --- block/commit.c | 1 + block/mirror.c | 2 ++ block/stream.c | 1 + 3 files changed, 4 insertions(+) diff --git a/block/commit.c b/block/commit.c index 444333b..13b55c1 100644 --- a/block/commit.c +++ b/block/commit.c @@ -223,6 +223,7 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base, BlockDriverState *overlay_bs; Error *local_err = NULL; + assert(cb); assert(top != bs); if (top == base) { error_setg(errp, "Invalid files for merge: top and base are the same"); diff --git a/block/mirror.c b/block/mirror.c index a04ed9c..fa2bdab 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -912,6 +912,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target, bool is_none_mode; BlockDriverState *base; + assert(cb); if (mode == MIRROR_SYNC_MODE_INCREMENTAL) { error_setg(errp, "Sync mode 'incremental' not supported"); return; @@ -935,6 +936,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base, int ret; Error *local_err = NULL; + assert(cb); orig_base_flags = bdrv_get_flags(base); if (bdrv_reopen(base, bs->open_flags, errp)) { diff --git a/block/stream.c b/block/stream.c index c0efbda..fc34c63 100644 --- a/block/stream.c +++ b/block/stream.c @@ -226,6 +226,7 @@ void stream_start(BlockDriverState *bs, BlockDriverState *base, { StreamBlockJob *s; + assert(cb); s = block_job_create(&stream_job_driver, bs, speed, cb, opaque, errp); if (!s) { return; -- 1.9.3 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-22 9:16 ` [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob Changlong Xie @ 2016-06-22 9:50 ` Paolo Bonzini 2016-06-22 10:12 ` Changlong Xie 0 siblings, 1 reply; 10+ messages in thread From: Paolo Bonzini @ 2016-06-22 9:50 UTC (permalink / raw) To: Changlong Xie, qemu devel, Jeff Cody Cc: Kevin Wolf, Fam Zheng, Max Reitz, Stefan Hajnoczi On 22/06/2016 11:16, Changlong Xie wrote: > Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> > --- > block/commit.c | 1 + > block/mirror.c | 2 ++ > block/stream.c | 1 + > 3 files changed, 4 insertions(+) Why is this useful? Paolo > diff --git a/block/commit.c b/block/commit.c > index 444333b..13b55c1 100644 > --- a/block/commit.c > +++ b/block/commit.c > @@ -223,6 +223,7 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base, > BlockDriverState *overlay_bs; > Error *local_err = NULL; > > + assert(cb); > assert(top != bs); > if (top == base) { > error_setg(errp, "Invalid files for merge: top and base are the same"); > diff --git a/block/mirror.c b/block/mirror.c > index a04ed9c..fa2bdab 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -912,6 +912,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target, > bool is_none_mode; > BlockDriverState *base; > > + assert(cb); > if (mode == MIRROR_SYNC_MODE_INCREMENTAL) { > error_setg(errp, "Sync mode 'incremental' not supported"); > return; > @@ -935,6 +936,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base, > int ret; > Error *local_err = NULL; > > + assert(cb); > orig_base_flags = bdrv_get_flags(base); > > if (bdrv_reopen(base, bs->open_flags, errp)) { > diff --git a/block/stream.c b/block/stream.c > index c0efbda..fc34c63 100644 > --- a/block/stream.c > +++ b/block/stream.c > @@ -226,6 +226,7 @@ void stream_start(BlockDriverState *bs, BlockDriverState *base, > { > StreamBlockJob *s; > > + assert(cb); > s = block_job_create(&stream_job_driver, bs, speed, cb, opaque, errp); > if (!s) { > return; > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-22 9:50 ` Paolo Bonzini @ 2016-06-22 10:12 ` Changlong Xie 2016-06-22 10:19 ` Paolo Bonzini 0 siblings, 1 reply; 10+ messages in thread From: Changlong Xie @ 2016-06-22 10:12 UTC (permalink / raw) To: Paolo Bonzini, qemu devel, Jeff Cody Cc: Kevin Wolf, Fam Zheng, Max Reitz, Stefan Hajnoczi On 06/22/2016 05:50 PM, Paolo Bonzini wrote: > > > On 22/06/2016 11:16, Changlong Xie wrote: >> Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> >> --- >> block/commit.c | 1 + >> block/mirror.c | 2 ++ >> block/stream.c | 1 + >> 3 files changed, 4 insertions(+) > > Why is this useful? > commit/mirror/stream/backup use block_job_create(..., cb,..) to create relevant blockjob. When they finished, these jobs will invoke block_job_completed, then invoke job->cb() unconditionally. So i think we need this to avoid segment fault. Actually backup has implemented this. Thanks -Xie > Paolo > >> diff --git a/block/commit.c b/block/commit.c >> index 444333b..13b55c1 100644 >> --- a/block/commit.c >> +++ b/block/commit.c >> @@ -223,6 +223,7 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base, >> BlockDriverState *overlay_bs; >> Error *local_err = NULL; >> >> + assert(cb); >> assert(top != bs); >> if (top == base) { >> error_setg(errp, "Invalid files for merge: top and base are the same"); >> diff --git a/block/mirror.c b/block/mirror.c >> index a04ed9c..fa2bdab 100644 >> --- a/block/mirror.c >> +++ b/block/mirror.c >> @@ -912,6 +912,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target, >> bool is_none_mode; >> BlockDriverState *base; >> >> + assert(cb); >> if (mode == MIRROR_SYNC_MODE_INCREMENTAL) { >> error_setg(errp, "Sync mode 'incremental' not supported"); >> return; >> @@ -935,6 +936,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base, >> int ret; >> Error *local_err = NULL; >> >> + assert(cb); >> orig_base_flags = bdrv_get_flags(base); >> >> if (bdrv_reopen(base, bs->open_flags, errp)) { >> diff --git a/block/stream.c b/block/stream.c >> index c0efbda..fc34c63 100644 >> --- a/block/stream.c >> +++ b/block/stream.c >> @@ -226,6 +226,7 @@ void stream_start(BlockDriverState *bs, BlockDriverState *base, >> { >> StreamBlockJob *s; >> >> + assert(cb); >> s = block_job_create(&stream_job_driver, bs, speed, cb, opaque, errp); >> if (!s) { >> return; >> > > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-22 10:12 ` Changlong Xie @ 2016-06-22 10:19 ` Paolo Bonzini 2016-06-22 17:31 ` Eric Blake 0 siblings, 1 reply; 10+ messages in thread From: Paolo Bonzini @ 2016-06-22 10:19 UTC (permalink / raw) To: Changlong Xie, qemu devel, Jeff Cody Cc: Kevin Wolf, Fam Zheng, Max Reitz, Stefan Hajnoczi On 22/06/2016 12:12, Changlong Xie wrote: > > commit/mirror/stream/backup use block_job_create(..., cb,..) to create > relevant blockjob. When they finished, these jobs will invoke > block_job_completed, then invoke job->cb() unconditionally. So i think > we need this to avoid segment fault. Actually backup has implemented this. So this suggests that the right place to put the assertion would be block_job_create. But it's even better to add a #define QEMU_NONNULL __attribute__((__nonnull__)) to include/qemu/compiler.h and declare the arguments as non-null. Paolo ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-22 10:19 ` Paolo Bonzini @ 2016-06-22 17:31 ` Eric Blake 2016-06-23 1:04 ` Changlong Xie 0 siblings, 1 reply; 10+ messages in thread From: Eric Blake @ 2016-06-22 17:31 UTC (permalink / raw) To: Paolo Bonzini, Changlong Xie, qemu devel, Jeff Cody Cc: Kevin Wolf, Fam Zheng, Stefan Hajnoczi, Max Reitz [-- Attachment #1: Type: text/plain, Size: 936 bytes --] On 06/22/2016 04:19 AM, Paolo Bonzini wrote: > > > On 22/06/2016 12:12, Changlong Xie wrote: >> >> commit/mirror/stream/backup use block_job_create(..., cb,..) to create >> relevant blockjob. When they finished, these jobs will invoke >> block_job_completed, then invoke job->cb() unconditionally. So i think >> we need this to avoid segment fault. Actually backup has implemented this. > > So this suggests that the right place to put the assertion would be > block_job_create. But it's even better to add a > > #define QEMU_NONNULL __attribute__((__nonnull__)) > > to include/qemu/compiler.h and declare the arguments as non-null. Or alternatively fix things to only invoke job->cb() if it is non-NULL, so that callers don't have to pass in a no-op callback just to appease a non-NULL attribute. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 604 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-22 17:31 ` Eric Blake @ 2016-06-23 1:04 ` Changlong Xie 2016-06-23 6:21 ` Kevin Wolf 0 siblings, 1 reply; 10+ messages in thread From: Changlong Xie @ 2016-06-23 1:04 UTC (permalink / raw) To: Eric Blake, Paolo Bonzini, qemu devel, Jeff Cody Cc: Kevin Wolf, Fam Zheng, Stefan Hajnoczi, Max Reitz On 06/23/2016 01:31 AM, Eric Blake wrote: > On 06/22/2016 04:19 AM, Paolo Bonzini wrote: >> >> >> On 22/06/2016 12:12, Changlong Xie wrote: >>> >>> commit/mirror/stream/backup use block_job_create(..., cb,..) to create >>> relevant blockjob. When they finished, these jobs will invoke >>> block_job_completed, then invoke job->cb() unconditionally. So i think >>> we need this to avoid segment fault. Actually backup has implemented this. >> >> So this suggests that the right place to put the assertion would be >> block_job_create. But it's even better to add a >> >> #define QEMU_NONNULL __attribute__((__nonnull__)) >> >> to include/qemu/compiler.h and declare the arguments as non-null. > > Or alternatively fix things to only invoke job->cb() if it is non-NULL, > so that callers don't have to pass in a no-op callback just to appease a > non-NULL attribute. > Is there any reason, that we should invoke job->cb() unconditionally without nonnull check? There is no relevant clue in the historical commit messages. If yes, i prefer paolo's suggestion; otherwise eric's solution is better. Thanks -Xie ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-23 1:04 ` Changlong Xie @ 2016-06-23 6:21 ` Kevin Wolf 2016-06-23 6:57 ` Changlong Xie 0 siblings, 1 reply; 10+ messages in thread From: Kevin Wolf @ 2016-06-23 6:21 UTC (permalink / raw) To: Changlong Xie Cc: Eric Blake, Paolo Bonzini, qemu devel, Jeff Cody, Fam Zheng, Stefan Hajnoczi, Max Reitz Am 23.06.2016 um 03:04 hat Changlong Xie geschrieben: > On 06/23/2016 01:31 AM, Eric Blake wrote: > >On 06/22/2016 04:19 AM, Paolo Bonzini wrote: > >> > >> > >>On 22/06/2016 12:12, Changlong Xie wrote: > >>> > >>>commit/mirror/stream/backup use block_job_create(..., cb,..) to create > >>>relevant blockjob. When they finished, these jobs will invoke > >>>block_job_completed, then invoke job->cb() unconditionally. So i think > >>>we need this to avoid segment fault. Actually backup has implemented this. > >> > >>So this suggests that the right place to put the assertion would be > >>block_job_create. But it's even better to add a > >> > >>#define QEMU_NONNULL __attribute__((__nonnull__)) > >> > >>to include/qemu/compiler.h and declare the arguments as non-null. > > > >Or alternatively fix things to only invoke job->cb() if it is non-NULL, > >so that callers don't have to pass in a no-op callback just to appease a > >non-NULL attribute. > > Is there any reason, that we should invoke job->cb() unconditionally > without nonnull check? There is no relevant clue in the historical > commit messages. If yes, i prefer paolo's suggestion; otherwise > eric's solution is better. I don't think no-op callbacks actually exist for jobs. Kevin ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob 2016-06-23 6:21 ` Kevin Wolf @ 2016-06-23 6:57 ` Changlong Xie 0 siblings, 0 replies; 10+ messages in thread From: Changlong Xie @ 2016-06-23 6:57 UTC (permalink / raw) To: Kevin Wolf Cc: Eric Blake, Paolo Bonzini, qemu devel, Jeff Cody, Fam Zheng, Stefan Hajnoczi, Max Reitz On 06/23/2016 02:21 PM, Kevin Wolf wrote: > Am 23.06.2016 um 03:04 hat Changlong Xie geschrieben: >> On 06/23/2016 01:31 AM, Eric Blake wrote: >>> On 06/22/2016 04:19 AM, Paolo Bonzini wrote: >>>> >>>> >>>> On 22/06/2016 12:12, Changlong Xie wrote: >>>>> >>>>> commit/mirror/stream/backup use block_job_create(..., cb,..) to create >>>>> relevant blockjob. When they finished, these jobs will invoke >>>>> block_job_completed, then invoke job->cb() unconditionally. So i think >>>>> we need this to avoid segment fault. Actually backup has implemented this. >>>> >>>> So this suggests that the right place to put the assertion would be >>>> block_job_create. But it's even better to add a >>>> >>>> #define QEMU_NONNULL __attribute__((__nonnull__)) >>>> >>>> to include/qemu/compiler.h and declare the arguments as non-null. >>> >>> Or alternatively fix things to only invoke job->cb() if it is non-NULL, >>> so that callers don't have to pass in a no-op callback just to appease a >>> non-NULL attribute. >> >> Is there any reason, that we should invoke job->cb() unconditionally >> without nonnull check? There is no relevant clue in the historical >> commit messages. If yes, i prefer paolo's suggestion; otherwise >> eric's solution is better. > > I don't think no-op callbacks actually exist for jobs. > So, i'll put assert(cb) in block_job_create as Paolo suggested. Thanks -Xie > Kevin > > > . > ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 2/2] mirror: fix misleading comments 2016-06-22 9:16 [Qemu-devel] [PATCH 0/2] small fix of block job Changlong Xie 2016-06-22 9:16 ` [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob Changlong Xie @ 2016-06-22 9:16 ` Changlong Xie 1 sibling, 0 replies; 10+ messages in thread From: Changlong Xie @ 2016-06-22 9:16 UTC (permalink / raw) To: qemu devel, Jeff Cody Cc: Stefan Hajnoczi, Fam Zheng, Max Reitz, Kevin Wolf, Wen Congyang, Changlong Xie s/target bs/to_replace/, also we check to_replace bs is not blocked in qmp_drive_mirror() not here Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> --- block/mirror.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/mirror.c b/block/mirror.c index fa2bdab..335ddd2 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -769,7 +769,7 @@ static void mirror_complete(BlockJob *job, Error **errp) } } - /* check the target bs is not blocked and block all operations on it */ + /* block all operations on to_replace bs */ if (s->replaces) { AioContext *replace_aio_context; -- 1.9.3 ^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2016-06-23 6:53 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-06-22 9:16 [Qemu-devel] [PATCH 0/2] small fix of block job Changlong Xie 2016-06-22 9:16 ` [Qemu-devel] [PATCH 1/2] blockjob: assert(cb) in the entry functions of blockjob Changlong Xie 2016-06-22 9:50 ` Paolo Bonzini 2016-06-22 10:12 ` Changlong Xie 2016-06-22 10:19 ` Paolo Bonzini 2016-06-22 17:31 ` Eric Blake 2016-06-23 1:04 ` Changlong Xie 2016-06-23 6:21 ` Kevin Wolf 2016-06-23 6:57 ` Changlong Xie 2016-06-22 9:16 ` [Qemu-devel] [PATCH 2/2] mirror: fix misleading comments Changlong Xie
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).