From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39654) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WTCTM-0006LG-Do for qemu-devel@nongnu.org; Thu, 27 Mar 2014 11:44:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WTCTE-0008Bx-0E for qemu-devel@nongnu.org; Thu, 27 Mar 2014 11:44:04 -0400 Received: from mail-bk0-x233.google.com ([2a00:1450:4008:c01::233]:48425) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WTCTD-0008Bn-Oy for qemu-devel@nongnu.org; Thu, 27 Mar 2014 11:43:55 -0400 Received: by mail-bk0-f51.google.com with SMTP id 6so815002bkj.10 for ; Thu, 27 Mar 2014 08:43:54 -0700 (PDT) Date: Thu, 27 Mar 2014 16:43:52 +0100 From: Stefan Hajnoczi Message-ID: <20140327154352.GB2441@stefanha-thinkpad.redhat.com> References: <1395911388-31027-1-git-send-email-famz@redhat.com> <1395911388-31027-3-git-send-email-famz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395911388-31027-3-git-send-email-famz@redhat.com> Subject: Re: [Qemu-devel] [PATCH v4 2/9] qmp: Add dirty-bitmap-add and dirty-bitmap-remove List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng Cc: Kevin Wolf , Paolo Bonzini , qemu-devel@nongnu.org, Stefan Hajnoczi , Benoit Canet On Thu, Mar 27, 2014 at 05:09:41PM +0800, Fam Zheng wrote: > @@ -1713,6 +1713,66 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, > } > } > > +void qmp_dirty_bitmap_add(const char *device, const char *name, > + bool has_granularity, int64_t granularity, > + Error **errp) > +{ > + BlockDriverState *bs; > + BdrvDirtyBitmap *bitmap; > + > + bs = bdrv_find(device); > + if (!bs) { > + error_set(errp, QERR_DEVICE_NOT_FOUND, device); > + return; > + } > + > + if (!name || name[0] == '\0') { > + error_setg(errp, "Bitmap name cannot be empty"); > + return; > + } > + if (has_granularity) { > + if (granularity & (granularity - 1)) { > + error_setg(errp, "Granularity must be power of 2"); > + return; > + } granularity must be non-zero, otherwise bdrv_create_dirty_bitmap() hits an assertion failure. It should probably also be at least 512. > + } else { > + granularity = 65536; > + } > + > + bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp); > + if (!bitmap) { > + return; > + } Useless error return. > +} > + > +void qmp_dirty_bitmap_remove(const char *device, const char *name, > + Error **errp) > +{ > + BlockDriverState *bs; > + BdrvDirtyBitmap *bitmap; > + > + bs = bdrv_find(device); > + if (!bs) { > + error_set(errp, QERR_DEVICE_NOT_FOUND, device); > + return; > + } > + > + if (!name || name[0] == '\0') { > + error_setg(errp, "Bitmap name cannot be empty"); > + return; > + } > + bitmap = bdrv_find_dirty_bitmap(bs, name); > + if (!bitmap) { > + error_setg(errp, "Dirty bitmap not found: %s", name); > + return; > + } > + > + /* Make it invisible to user in case the following > + * bdrv_release_dirty_bitmap doens't free it because of refcnt */ "doesn't"