From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, quintela@redhat.com,
stefano.stabellini@eu.citrix.com, lcapitulino@redhat.com,
hare@suse.de, amit.shah@redhat.com, hch@lst.de
Subject: [Qemu-devel] [PATCH v2 02/45] block: Generalize change_cb() to BlockDevOps
Date: Wed, 3 Aug 2011 15:07:41 +0200 [thread overview]
Message-ID: <1312376904-16115-3-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1312376904-16115-1-git-send-email-armbru@redhat.com>
So we can more easily add device model callbacks.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
block.c | 43 +++++++++++++++++++++----------------------
block.h | 9 ++++++---
block_int.h | 5 ++---
hw/ide/core.c | 6 +++++-
hw/sd.c | 6 +++++-
hw/virtio-blk.c | 6 +++++-
6 files changed, 44 insertions(+), 31 deletions(-)
diff --git a/block.c b/block.c
index 10a39f1..3aa1eb5 100644
--- a/block.c
+++ b/block.c
@@ -44,6 +44,7 @@
#include <windows.h>
#endif
+static void bdrv_dev_change_cb(BlockDriverState *bs, int reason);
static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque);
@@ -661,10 +662,8 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
}
if (!bdrv_key_required(bs)) {
- /* call the change callback */
bs->media_changed = 1;
- if (bs->change_cb)
- bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
+ bdrv_dev_change_cb(bs, CHANGE_MEDIA);
}
return 0;
@@ -700,10 +699,8 @@ void bdrv_close(BlockDriverState *bs)
bdrv_close(bs->file);
}
- /* call the change callback */
bs->media_changed = 1;
- if (bs->change_cb)
- bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
+ bdrv_dev_change_cb(bs, CHANGE_MEDIA);
}
}
@@ -765,8 +762,8 @@ void bdrv_detach_dev(BlockDriverState *bs, void *dev)
{
assert(bs->dev == dev);
bs->dev = NULL;
- bs->change_cb = NULL;
- bs->change_opaque = NULL;
+ bs->dev_ops = NULL;
+ bs->dev_opaque = NULL;
}
/* TODO change to return DeviceState * when all users are qdevified */
@@ -775,6 +772,20 @@ void *bdrv_get_attached_dev(BlockDriverState *bs)
return bs->dev;
}
+void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
+ void *opaque)
+{
+ bs->dev_ops = ops;
+ bs->dev_opaque = opaque;
+}
+
+static void bdrv_dev_change_cb(BlockDriverState *bs, int reason)
+{
+ if (bs->dev_ops && bs->dev_ops->change_cb) {
+ bs->dev_ops->change_cb(bs->dev_opaque, reason);
+ }
+}
+
/*
* Run consistency checks on an image
*
@@ -1232,9 +1243,7 @@ int bdrv_truncate(BlockDriverState *bs, int64_t offset)
ret = drv->bdrv_truncate(bs, offset);
if (ret == 0) {
ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
- if (bs->change_cb) {
- bs->change_cb(bs->change_opaque, CHANGE_SIZE);
- }
+ bdrv_dev_change_cb(bs, CHANGE_SIZE);
}
return ret;
}
@@ -1572,15 +1581,6 @@ int bdrv_enable_write_cache(BlockDriverState *bs)
return bs->enable_write_cache;
}
-/* XXX: no longer used */
-void bdrv_set_change_cb(BlockDriverState *bs,
- void (*change_cb)(void *opaque, int reason),
- void *opaque)
-{
- bs->change_cb = change_cb;
- bs->change_opaque = opaque;
-}
-
int bdrv_is_encrypted(BlockDriverState *bs)
{
if (bs->backing_hd && bs->backing_hd->encrypted)
@@ -1619,8 +1619,7 @@ int bdrv_set_key(BlockDriverState *bs, const char *key)
bs->valid_key = 1;
/* call the change callback now, we skipped it on open */
bs->media_changed = 1;
- if (bs->change_cb)
- bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
+ bdrv_dev_change_cb(bs, CHANGE_MEDIA);
}
return ret;
}
diff --git a/block.h b/block.h
index a82b0cd..6c55d4c 100644
--- a/block.h
+++ b/block.h
@@ -28,6 +28,10 @@ typedef struct QEMUSnapshotInfo {
uint64_t vm_clock_nsec; /* VM clock relative to boot */
} QEMUSnapshotInfo;
+typedef struct BlockDevOps {
+ void (*change_cb)(void *opaque, int reason);
+} BlockDevOps;
+
#define BDRV_O_RDWR 0x0002
#define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */
#define BDRV_O_NOCACHE 0x0020 /* do not use the host page cache */
@@ -77,6 +81,8 @@ int bdrv_attach_dev(BlockDriverState *bs, void *dev);
void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev);
void bdrv_detach_dev(BlockDriverState *bs, void *dev);
void *bdrv_get_attached_dev(BlockDriverState *bs);
+void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
+ void *opaque);
int bdrv_read(BlockDriverState *bs, int64_t sector_num,
uint8_t *buf, int nb_sectors);
int bdrv_write(BlockDriverState *bs, int64_t sector_num,
@@ -192,9 +198,6 @@ int bdrv_media_changed(BlockDriverState *bs);
int bdrv_is_locked(BlockDriverState *bs);
void bdrv_set_locked(BlockDriverState *bs, int locked);
int bdrv_eject(BlockDriverState *bs, int eject_flag);
-void bdrv_set_change_cb(BlockDriverState *bs,
- void (*change_cb)(void *opaque, int reason),
- void *opaque);
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
BlockDriverState *bdrv_find(const char *name);
BlockDriverState *bdrv_next(BlockDriverState *bs);
diff --git a/block_int.h b/block_int.h
index cf7b7e7..48d6026 100644
--- a/block_int.h
+++ b/block_int.h
@@ -160,15 +160,14 @@ struct BlockDriverState {
int encrypted; /* if true, the media is encrypted */
int valid_key; /* if true, a valid encryption key has been set */
int sg; /* if true, the device is a /dev/sg* */
- /* event callback when inserting/removing */
- void (*change_cb)(void *opaque, int reason);
- void *change_opaque;
BlockDriver *drv; /* NULL means no media */
void *opaque;
void *dev; /* attached device model, if any */
/* TODO change to DeviceState when all users are qdevified */
+ const BlockDevOps *dev_ops;
+ void *dev_opaque;
char filename[1024];
char backing_file[1024]; /* if non zero, the image is a diff of
diff --git a/hw/ide/core.c b/hw/ide/core.c
index bcef8bc..773b7cf 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1717,6 +1717,10 @@ void ide_bus_reset(IDEBus *bus)
bus->dma->ops->reset(bus->dma);
}
+static const BlockDevOps ide_cd_block_ops = {
+ .change_cb = cdrom_change_cb,
+};
+
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
const char *version, const char *serial)
{
@@ -1751,7 +1755,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
s->smart_errors = 0;
s->smart_selftest_count = 0;
if (kind == IDE_CD) {
- bdrv_set_change_cb(bs, cdrom_change_cb, s);
+ bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
bs->buffer_alignment = 2048;
} else {
if (!bdrv_is_inserted(s->bs)) {
diff --git a/hw/sd.c b/hw/sd.c
index 8d42ee2..d47b7a4 100644
--- a/hw/sd.c
+++ b/hw/sd.c
@@ -435,6 +435,10 @@ static void sd_cardchange(void *opaque, int reason)
}
}
+static const BlockDevOps sd_block_ops = {
+ .change_cb = sd_cardchange,
+};
+
/* We do not model the chip select pin, so allow the board to select
whether card should be in SSI or MMC/SD mode. It is also up to the
board to ensure that ssi transfers only occur when the chip select
@@ -450,7 +454,7 @@ SDState *sd_init(BlockDriverState *bs, int is_spi)
sd_reset(sd, bs);
if (sd->bdrv) {
bdrv_attach_dev_nofail(sd->bdrv, sd);
- bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
+ bdrv_set_dev_ops(sd->bdrv, &sd_block_ops, sd);
}
return sd;
}
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 6471ac8..9e5ef88 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -536,6 +536,10 @@ static void virtio_blk_change_cb(void *opaque, int reason)
}
}
+static const BlockDevOps virtio_block_ops = {
+ .change_cb = virtio_blk_change_cb,
+};
+
VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf,
char **serial)
{
@@ -582,7 +586,7 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf,
register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
virtio_blk_save, virtio_blk_load, s);
bdrv_set_removable(s->bs, 0);
- bdrv_set_change_cb(s->bs, virtio_blk_change_cb, s);
+ bdrv_set_dev_ops(s->bs, &virtio_block_ops, s);
s->bs->buffer_alignment = conf->logical_block_size;
add_boot_device_path(conf->bootindex, dev, "/disk@0,0");
--
1.7.6
next prev parent reply other threads:[~2011-08-03 13:08 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-03 13:07 [Qemu-devel] [PATCH v2 00/45] Block layer cleanup & fixes Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 01/45] block: Attach non-qdev devices as well Markus Armbruster
2011-08-03 13:07 ` Markus Armbruster [this message]
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 03/45] block: Split change_cb() into change_media_cb(), resize_cb() Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 04/45] ide: Update command code definitions as per ACS-2 Table B.2 Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 05/45] ide: Clean up case label indentation in ide_exec_cmd() Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 06/45] ide: Fix ATA command READ to set ATAPI signature for CD-ROM Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 07/45] ide: Use a table to declare which drive kinds accept each command Markus Armbruster
2011-08-03 16:53 ` Blue Swirl
2011-08-03 17:15 ` Markus Armbruster
2011-09-02 10:08 ` Kevin Wolf
2011-09-02 14:43 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 08/45] ide: Reject ATA commands specific to drive kinds Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 09/45] ide/atapi: Clean up misleading name in cmd_start_stop_unit() Markus Armbruster
2011-09-02 10:20 ` Kevin Wolf
2011-09-02 14:47 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 10/45] ide/atapi: Track tray open/close state Markus Armbruster
2011-09-02 10:23 ` Kevin Wolf
2011-09-02 14:51 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 11/45] scsi-disk: Factor out scsi_disk_emulate_start_stop() Markus Armbruster
2011-08-04 6:12 ` Hannes Reinecke
2011-09-02 10:26 ` Kevin Wolf
2011-09-02 14:55 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 12/45] scsi-disk: Track tray open/close state Markus Armbruster
2011-08-04 6:13 ` Hannes Reinecke
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 13/45] block: Revert entanglement of bdrv_is_inserted() with tray status Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 14/45] block: Drop tray status tracking, no longer used Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 15/45] ide/atapi: Track tray locked state Markus Armbruster
2011-09-02 11:02 ` Kevin Wolf
2011-09-02 14:56 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 16/45] scsi-disk: " Markus Armbruster
2011-08-04 6:14 ` Hannes Reinecke
2011-08-04 6:39 ` Markus Armbruster
2011-08-04 6:46 ` Hannes Reinecke
2011-08-04 7:25 ` Markus Armbruster
2011-08-04 7:30 ` Hannes Reinecke
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 17/45] block: Leave enforcing tray lock to device models Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 18/45] block: Drop medium lock tracking, ask device models instead Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 19/45] block: Rename bdrv_set_locked() to bdrv_lock_medium() Markus Armbruster
2011-09-02 11:30 ` Kevin Wolf
2011-09-02 14:58 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 20/45] ide: Provide IDEDeviceInfo method exit() Markus Armbruster
2011-08-04 17:48 ` Luiz Capitulino
2011-08-05 7:13 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 21/45] ide/atapi: Don't fail eject when tray is already open Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 22/45] ide/atapi: Avoid physical/virtual tray state mismatch Markus Armbruster
2011-09-02 12:07 ` Kevin Wolf
2011-09-02 15:19 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 23/45] scsi-disk: Fix START_STOP to fail when it can't eject Markus Armbruster
2011-08-04 6:20 ` Hannes Reinecke
2011-08-04 6:48 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 24/45] scsi-disk: Avoid physical/virtual tray state mismatch Markus Armbruster
2011-08-04 6:21 ` Hannes Reinecke
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 25/45] ide: Give vmstate structs internal linkage where possible Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 26/45] ide/atapi: Preserve tray state on migration Markus Armbruster
2011-09-02 12:20 ` Kevin Wolf
2011-09-02 12:35 ` Paolo Bonzini
2011-09-02 15:22 ` Markus Armbruster
2011-09-02 15:25 ` Paolo Bonzini
2011-09-02 15:20 ` Markus Armbruster
2011-09-02 15:59 ` Kevin Wolf
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 27/45] scsi-disk: " Markus Armbruster
2011-08-04 6:23 ` Hannes Reinecke
2011-08-04 6:45 ` Paolo Bonzini
2011-08-04 9:57 ` Kevin Wolf
2011-09-02 12:25 ` Kevin Wolf
2011-09-02 15:35 ` Markus Armbruster
2011-09-02 16:18 ` Kevin Wolf
2011-09-02 16:45 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 28/45] block/raw: Fix to forward method bdrv_media_changed() Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 29/45] block: Leave tracking media change to device models Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 30/45] fdc: Make media change detection more robust Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 31/45] block: Clean up bdrv_flush_all() Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 32/45] savevm: Include writable devices with removable media Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 33/45] xen: Clean up pci_piix3_xen_ide_unplug()'s test for "not a CD" Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 34/45] spitz tosa: Simplify "drive is suitable for microdrive" test Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 35/45] block: Clean up remaining users of "removable" Markus Armbruster
2011-08-04 17:58 ` Luiz Capitulino
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 36/45] block: Drop BlockDriverState member removable Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 37/45] block: Show whether the guest ejected the medium in info block Markus Armbruster
2011-08-04 18:05 ` Luiz Capitulino
2011-09-02 13:04 ` Kevin Wolf
2011-09-02 15:29 ` Markus Armbruster
2011-09-02 16:22 ` Kevin Wolf
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 38/45] block: Move BlockConf & friends from block_int.h to block.h Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 39/45] hw: Trim superfluous #include "block_int.h" Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 40/45] block: Declare qemu_blockalign() in block.h, not block_int.h Markus Armbruster
2011-08-04 18:10 ` Luiz Capitulino
2011-08-04 18:22 ` Markus Armbruster
2011-08-04 18:28 ` Luiz Capitulino
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 41/45] block: New bdrv_set_buffer_alignment() Markus Armbruster
2011-09-02 13:13 ` Kevin Wolf
2011-09-02 15:30 ` Markus Armbruster
2011-09-02 16:25 ` Kevin Wolf
2011-09-02 16:53 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 42/45] block: Reset buffer alignment on detach Markus Armbruster
2011-09-02 13:20 ` Kevin Wolf
2011-09-02 15:32 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 43/45] nbd: Clean up use of block_int.h Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 44/45] block: New change_media_cb() parameter load Markus Armbruster
2011-09-02 13:26 ` Kevin Wolf
2011-09-02 15:33 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 45/45] ide/atapi scsi-disk: Make monitor eject -f, then change work Markus Armbruster
2011-08-04 15:54 ` [Qemu-devel] [PATCH v2 00/45] Block layer cleanup & fixes Avi Kivity
2011-09-02 13:37 ` Kevin Wolf
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=1312376904-16115-3-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=amit.shah@redhat.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefano.stabellini@eu.citrix.com \
/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).