Revision 7d4b4ba5
b/block.c | ||
---|---|---|
44 | 44 |
#include <windows.h> |
45 | 45 |
#endif |
46 | 46 |
|
47 |
static void bdrv_dev_change_media_cb(BlockDriverState *bs); |
|
47 |
static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load);
|
|
48 | 48 |
static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs, |
49 | 49 |
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, |
50 | 50 |
BlockDriverCompletionFunc *cb, void *opaque); |
... | ... | |
688 | 688 |
} |
689 | 689 |
|
690 | 690 |
if (!bdrv_key_required(bs)) { |
691 |
bdrv_dev_change_media_cb(bs); |
|
691 |
bdrv_dev_change_media_cb(bs, true);
|
|
692 | 692 |
} |
693 | 693 |
|
694 | 694 |
return 0; |
... | ... | |
724 | 724 |
bdrv_close(bs->file); |
725 | 725 |
} |
726 | 726 |
|
727 |
bdrv_dev_change_media_cb(bs); |
|
727 |
bdrv_dev_change_media_cb(bs, false);
|
|
728 | 728 |
} |
729 | 729 |
} |
730 | 730 |
|
... | ... | |
807 | 807 |
} |
808 | 808 |
} |
809 | 809 |
|
810 |
static void bdrv_dev_change_media_cb(BlockDriverState *bs) |
|
810 |
static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load)
|
|
811 | 811 |
{ |
812 | 812 |
if (bs->dev_ops && bs->dev_ops->change_media_cb) { |
813 |
bs->dev_ops->change_media_cb(bs->dev_opaque); |
|
813 |
bs->dev_ops->change_media_cb(bs->dev_opaque, load);
|
|
814 | 814 |
} |
815 | 815 |
} |
816 | 816 |
|
... | ... | |
1674 | 1674 |
} else if (!bs->valid_key) { |
1675 | 1675 |
bs->valid_key = 1; |
1676 | 1676 |
/* call the change callback now, we skipped it on open */ |
1677 |
bdrv_dev_change_media_cb(bs); |
|
1677 |
bdrv_dev_change_media_cb(bs, true);
|
|
1678 | 1678 |
} |
1679 | 1679 |
return ret; |
1680 | 1680 |
} |
b/block.h | ||
---|---|---|
32 | 32 |
typedef struct BlockDevOps { |
33 | 33 |
/* |
34 | 34 |
* Runs when virtual media changed (monitor commands eject, change) |
35 |
* Argument load is true on load and false on eject. |
|
35 | 36 |
* Beware: doesn't run when a host device's physical media |
36 | 37 |
* changes. Sure would be useful if it did. |
37 | 38 |
* Device models with removable media must implement this callback. |
38 | 39 |
*/ |
39 |
void (*change_media_cb)(void *opaque); |
|
40 |
void (*change_media_cb)(void *opaque, bool load);
|
|
40 | 41 |
/* |
41 | 42 |
* Is the virtual tray open? |
42 | 43 |
* Device models implement this only when the device has a tray. |
b/hw/fdc.c | ||
---|---|---|
1777 | 1777 |
fdctrl_stop_transfer(fdctrl, 0x00, 0x00, 0x00); |
1778 | 1778 |
} |
1779 | 1779 |
|
1780 |
static void fdctrl_change_cb(void *opaque) |
|
1780 |
static void fdctrl_change_cb(void *opaque, bool load)
|
|
1781 | 1781 |
{ |
1782 | 1782 |
FDrive *drive = opaque; |
1783 | 1783 |
|
b/hw/ide/core.c | ||
---|---|---|
784 | 784 |
} |
785 | 785 |
|
786 | 786 |
/* called when the inserted state of the media has changed */ |
787 |
static void ide_cd_change_cb(void *opaque) |
|
787 |
static void ide_cd_change_cb(void *opaque, bool load)
|
|
788 | 788 |
{ |
789 | 789 |
IDEState *s = opaque; |
790 | 790 |
uint64_t nb_sectors; |
b/hw/scsi-disk.c | ||
---|---|---|
1173 | 1173 |
blockdev_mark_auto_del(s->qdev.conf.bs); |
1174 | 1174 |
} |
1175 | 1175 |
|
1176 |
static void scsi_cd_change_media_cb(void *opaque) |
|
1176 |
static void scsi_cd_change_media_cb(void *opaque, bool load)
|
|
1177 | 1177 |
{ |
1178 | 1178 |
} |
1179 | 1179 |
|
b/hw/sd.c | ||
---|---|---|
419 | 419 |
sd->pwd_len = 0; |
420 | 420 |
} |
421 | 421 |
|
422 |
static void sd_cardchange(void *opaque) |
|
422 |
static void sd_cardchange(void *opaque, bool load)
|
|
423 | 423 |
{ |
424 | 424 |
SDState *sd = opaque; |
425 | 425 |
|
Also available in: Unified diff