qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Fam Zheng <famz@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Anthony Liguori <anthony@codemonkey.ws>
Subject: [Qemu-devel] [PULL 17/42] block: use BDS ref for block jobs
Date: Fri,  6 Sep 2013 17:38:48 +0200	[thread overview]
Message-ID: <1378481953-23099-18-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1378481953-23099-1-git-send-email-stefanha@redhat.com>

From: Fam Zheng <famz@redhat.com>

Block jobs used drive_get_ref(drive_get_by_blockdev(bs)) to avoid BDS
being deleted. Now we have BDS reference count, and block jobs don't
care about dinfo, so replace them to get cleaner code. It is also the
safe way when BDS has no drive info.

Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 blockdev.c | 49 +++++++++++++++----------------------------------
 blockjob.c |  1 +
 2 files changed, 16 insertions(+), 34 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index 9616cc4..07dac05 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -234,32 +234,32 @@ void drive_get_ref(DriveInfo *dinfo)
 
 typedef struct {
     QEMUBH *bh;
-    DriveInfo *dinfo;
-} DrivePutRefBH;
+    BlockDriverState *bs;
+} BDRVPutRefBH;
 
-static void drive_put_ref_bh(void *opaque)
+static void bdrv_put_ref_bh(void *opaque)
 {
-    DrivePutRefBH *s = opaque;
+    BDRVPutRefBH *s = opaque;
 
-    drive_put_ref(s->dinfo);
+    bdrv_unref(s->bs);
     qemu_bh_delete(s->bh);
     g_free(s);
 }
 
 /*
- * Release a drive reference in a BH
+ * Release a BDS reference in a BH
  *
- * It is not possible to use drive_put_ref() from a callback function when the
- * callers still need the drive.  In such cases we schedule a BH to release the
- * reference.
+ * It is not safe to use bdrv_unref() from a callback function when the callers
+ * still need the BlockDriverState.  In such cases we schedule a BH to release
+ * the reference.
  */
-static void drive_put_ref_bh_schedule(DriveInfo *dinfo)
+static void bdrv_put_ref_bh_schedule(BlockDriverState *bs)
 {
-    DrivePutRefBH *s;
+    BDRVPutRefBH *s;
 
-    s = g_new(DrivePutRefBH, 1);
-    s->bh = qemu_bh_new(drive_put_ref_bh, s);
-    s->dinfo = dinfo;
+    s = g_new(BDRVPutRefBH, 1);
+    s->bh = qemu_bh_new(bdrv_put_ref_bh, s);
+    s->bs = bs;
     qemu_bh_schedule(s->bh);
 }
 
@@ -1436,7 +1436,7 @@ static void block_job_cb(void *opaque, int ret)
     }
     qobject_decref(obj);
 
-    drive_put_ref_bh_schedule(drive_get_by_blockdev(bs));
+    bdrv_put_ref_bh_schedule(bs);
 }
 
 void qmp_block_stream(const char *device, bool has_base,
@@ -1473,11 +1473,6 @@ void qmp_block_stream(const char *device, bool has_base,
         return;
     }
 
-    /* Grab a reference so hotplug does not delete the BlockDriverState from
-     * underneath us.
-     */
-    drive_get_ref(drive_get_by_blockdev(bs));
-
     trace_qmp_block_stream(bs, bs->job);
 }
 
@@ -1534,10 +1529,6 @@ void qmp_block_commit(const char *device,
         error_propagate(errp, local_err);
         return;
     }
-    /* Grab a reference so hotplug does not delete the BlockDriverState from
-     * underneath us.
-     */
-    drive_get_ref(drive_get_by_blockdev(bs));
 }
 
 void qmp_drive_backup(const char *device, const char *target,
@@ -1650,11 +1641,6 @@ void qmp_drive_backup(const char *device, const char *target,
         error_propagate(errp, local_err);
         return;
     }
-
-    /* Grab a reference so hotplug does not delete the BlockDriverState from
-     * underneath us.
-     */
-    drive_get_ref(drive_get_by_blockdev(bs));
 }
 
 #define DEFAULT_MIRROR_BUF_SIZE   (10 << 20)
@@ -1791,11 +1777,6 @@ void qmp_drive_mirror(const char *device, const char *target,
         error_propagate(errp, local_err);
         return;
     }
-
-    /* Grab a reference so hotplug does not delete the BlockDriverState from
-     * underneath us.
-     */
-    drive_get_ref(drive_get_by_blockdev(bs));
 }
 
 static BlockJob *find_block_job(const char *device)
diff --git a/blockjob.c b/blockjob.c
index 7edc945..e7d49b7 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -45,6 +45,7 @@ void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
         error_set(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs));
         return NULL;
     }
+    bdrv_ref(bs);
     bdrv_set_in_use(bs, 1);
 
     job = g_malloc0(job_type->instance_size);
-- 
1.8.3.1

  parent reply	other threads:[~2013-09-06 15:40 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-06 15:38 [Qemu-devel] [PULL 00/42] Block patches Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 01/42] throttle: Add a new throttling API implementing continuous leaky bucket Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 02/42] throttle: Add units tests Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 03/42] block: Enable the new throttling code in the block layer Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 04/42] block: Add support for throttling burst max in QMP and the command line Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 05/42] block: Add iops_size to do the iops accounting for a given io size Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 06/42] qemu-iotests: Adjust test result 039 Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 07/42] add qemu-img convert -n option (skip target volume creation) Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 08/42] w32: Fix access to host devices (regression) Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 09/42] aio / timers: fix build of test/test-aio.c on non-linux platforms Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 10/42] vvfat: use bdrv_new() to allocate BlockDriverState Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 11/42] iscsi: use bdrv_new() instead of stack structure Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 12/42] block: implement reference count for BlockDriverState Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 13/42] block: make bdrv_delete() static Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 14/42] migration: omit drive ref as we have bdrv_ref now Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 15/42] xen_disk: simplify blk_disconnect with refcnt Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 16/42] nbd: use BlockDriverState refcnt Stefan Hajnoczi
2013-09-06 15:38 ` Stefan Hajnoczi [this message]
2013-09-06 15:38 ` [Qemu-devel] [PULL 18/42] qmp: Documentation for BLOCK_IMAGE_CORRUPTED Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 19/42] cow: make reads go at a decent speed Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 20/42] cow: make writes go at a less indecent speed Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 21/42] cow: do not call bdrv_co_is_allocated Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 22/42] block: keep bs->total_sectors up to date even for growable block devices Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 23/42] block: make bdrv_co_is_allocated static Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 24/42] block: do not use ->total_sectors in bdrv_co_is_allocated Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 25/42] block: remove bdrv_is_allocated_above/bdrv_co_is_allocated_above distinction Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 26/42] block: expect errors from bdrv_co_is_allocated Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 27/42] qemu-img: always probe the input image for allocated sectors Stefan Hajnoczi
2013-09-06 15:38 ` [Qemu-devel] [PULL 28/42] block: make bdrv_has_zero_init return false for copy-on-write-images Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 29/42] block: introduce bdrv_get_block_status API Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 30/42] block: define get_block_status return value Stefan Hajnoczi
2013-09-13  8:04   ` Peter Lieven
2013-09-13  8:26     ` Paolo Bonzini
2013-09-13  8:51       ` Peter Lieven
2013-09-06 15:39 ` [Qemu-devel] [PULL 31/42] block: return get_block_status data and flags for formats Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 32/42] block: use bdrv_has_zero_init to return BDRV_BLOCK_ZERO Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 33/42] block: return BDRV_BLOCK_ZERO past end of backing file Stefan Hajnoczi
2013-09-13  7:33   ` Peter Lieven
2013-09-13  8:25     ` Paolo Bonzini
2013-09-13 15:20       ` Kevin Wolf
2013-09-16  5:45         ` Peter Lieven
2013-09-06 15:39 ` [Qemu-devel] [PULL 34/42] qemu-img: add a "map" subcommand Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 35/42] docs, qapi: document qemu-img map Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 36/42] raw-posix: return get_block_status data and flags Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 37/42] raw-posix: report unwritten extents as zero Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 38/42] block: add default get_block_status implementation for protocols Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file Stefan Hajnoczi
2013-09-13  8:00   ` Peter Lieven
2013-09-13  9:08     ` Peter Lieven
2013-09-13  9:10       ` Paolo Bonzini
2013-09-13  9:14         ` Peter Lieven
2013-09-13  9:17           ` Paolo Bonzini
2013-09-13  9:29             ` Peter Lieven
2013-09-06 15:39 ` [Qemu-devel] [PULL 40/42] dataplane: Fix startup race Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 41/42] qemu-iotests: Whitespace cleanup Stefan Hajnoczi
2013-09-06 15:39 ` [Qemu-devel] [PULL 42/42] qemu-iotests: Fixed test case 026 Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1378481953-23099-18-git-send-email-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=famz@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).