block: Split change_cb() into change_media_cb(), resize_cb()
Multiplexing callbacks complicates matters needlessly. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									0e49de5232
								
							
						
					
					
						commit
						145feb176f
					
				
							
								
								
									
										23
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								block.c
									
									
									
									
									
								
							@ -44,7 +44,7 @@
 | 
				
			|||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void bdrv_dev_change_cb(BlockDriverState *bs, int reason);
 | 
					static void bdrv_dev_change_media_cb(BlockDriverState *bs);
 | 
				
			||||||
static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
 | 
					static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
 | 
				
			||||||
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
 | 
					        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
 | 
				
			||||||
        BlockDriverCompletionFunc *cb, void *opaque);
 | 
					        BlockDriverCompletionFunc *cb, void *opaque);
 | 
				
			||||||
@ -690,7 +690,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (!bdrv_key_required(bs)) {
 | 
					    if (!bdrv_key_required(bs)) {
 | 
				
			||||||
        bs->media_changed = 1;
 | 
					        bs->media_changed = 1;
 | 
				
			||||||
        bdrv_dev_change_cb(bs, CHANGE_MEDIA);
 | 
					        bdrv_dev_change_media_cb(bs);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
@ -727,7 +727,7 @@ void bdrv_close(BlockDriverState *bs)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bs->media_changed = 1;
 | 
					        bs->media_changed = 1;
 | 
				
			||||||
        bdrv_dev_change_cb(bs, CHANGE_MEDIA);
 | 
					        bdrv_dev_change_media_cb(bs);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -806,10 +806,17 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
 | 
				
			|||||||
    bs->dev_opaque = opaque;
 | 
					    bs->dev_opaque = opaque;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void bdrv_dev_change_cb(BlockDriverState *bs, int reason)
 | 
					static void bdrv_dev_change_media_cb(BlockDriverState *bs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (bs->dev_ops && bs->dev_ops->change_cb) {
 | 
					    if (bs->dev_ops && bs->dev_ops->change_media_cb) {
 | 
				
			||||||
        bs->dev_ops->change_cb(bs->dev_opaque, reason);
 | 
					        bs->dev_ops->change_media_cb(bs->dev_opaque);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void bdrv_dev_resize_cb(BlockDriverState *bs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (bs->dev_ops && bs->dev_ops->resize_cb) {
 | 
				
			||||||
 | 
					        bs->dev_ops->resize_cb(bs->dev_opaque);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1283,7 +1290,7 @@ int bdrv_truncate(BlockDriverState *bs, int64_t offset)
 | 
				
			|||||||
    ret = drv->bdrv_truncate(bs, offset);
 | 
					    ret = drv->bdrv_truncate(bs, offset);
 | 
				
			||||||
    if (ret == 0) {
 | 
					    if (ret == 0) {
 | 
				
			||||||
        ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
 | 
					        ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
 | 
				
			||||||
        bdrv_dev_change_cb(bs, CHANGE_SIZE);
 | 
					        bdrv_dev_resize_cb(bs);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1659,7 +1666,7 @@ int bdrv_set_key(BlockDriverState *bs, const char *key)
 | 
				
			|||||||
        bs->valid_key = 1;
 | 
					        bs->valid_key = 1;
 | 
				
			||||||
        /* call the change callback now, we skipped it on open */
 | 
					        /* call the change callback now, we skipped it on open */
 | 
				
			||||||
        bs->media_changed = 1;
 | 
					        bs->media_changed = 1;
 | 
				
			||||||
        bdrv_dev_change_cb(bs, CHANGE_MEDIA);
 | 
					        bdrv_dev_change_media_cb(bs);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								block.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								block.h
									
									
									
									
									
								
							@ -28,8 +28,18 @@ typedef struct QEMUSnapshotInfo {
 | 
				
			|||||||
    uint64_t vm_clock_nsec; /* VM clock relative to boot */
 | 
					    uint64_t vm_clock_nsec; /* VM clock relative to boot */
 | 
				
			||||||
} QEMUSnapshotInfo;
 | 
					} QEMUSnapshotInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Callbacks for block device models */
 | 
				
			||||||
typedef struct BlockDevOps {
 | 
					typedef struct BlockDevOps {
 | 
				
			||||||
    void (*change_cb)(void *opaque, int reason);
 | 
					    /*
 | 
				
			||||||
 | 
					     * Runs when virtual media changed (monitor commands eject, change)
 | 
				
			||||||
 | 
					     * Beware: doesn't run when a host device's physical media
 | 
				
			||||||
 | 
					     * changes.  Sure would be useful if it did.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void (*change_media_cb)(void *opaque);
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					     * Runs when the size changed (e.g. monitor command block_resize)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void (*resize_cb)(void *opaque);
 | 
				
			||||||
} BlockDevOps;
 | 
					} BlockDevOps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BDRV_O_RDWR        0x0002
 | 
					#define BDRV_O_RDWR        0x0002
 | 
				
			||||||
 | 
				
			|||||||
@ -211,9 +211,6 @@ struct BlockDriverState {
 | 
				
			|||||||
    void *private;
 | 
					    void *private;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CHANGE_MEDIA    0x01
 | 
					 | 
				
			||||||
#define CHANGE_SIZE     0x02
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct BlockDriverAIOCB {
 | 
					struct BlockDriverAIOCB {
 | 
				
			||||||
    AIOPool *pool;
 | 
					    AIOPool *pool;
 | 
				
			||||||
    BlockDriverState *bs;
 | 
					    BlockDriverState *bs;
 | 
				
			||||||
 | 
				
			|||||||
@ -783,15 +783,11 @@ static void ide_cfata_metadata_write(IDEState *s)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* called when the inserted state of the media has changed */
 | 
					/* called when the inserted state of the media has changed */
 | 
				
			||||||
static void cdrom_change_cb(void *opaque, int reason)
 | 
					static void ide_cd_change_cb(void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    IDEState *s = opaque;
 | 
					    IDEState *s = opaque;
 | 
				
			||||||
    uint64_t nb_sectors;
 | 
					    uint64_t nb_sectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(reason & CHANGE_MEDIA)) {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bdrv_get_geometry(s->bs, &nb_sectors);
 | 
					    bdrv_get_geometry(s->bs, &nb_sectors);
 | 
				
			||||||
    s->nb_sectors = nb_sectors;
 | 
					    s->nb_sectors = nb_sectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1743,7 +1739,7 @@ void ide_bus_reset(IDEBus *bus)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const BlockDevOps ide_cd_block_ops = {
 | 
					static const BlockDevOps ide_cd_block_ops = {
 | 
				
			||||||
    .change_cb = cdrom_change_cb,
 | 
					    .change_media_cb = ide_cd_change_cb,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
 | 
					int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								hw/sd.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								hw/sd.c
									
									
									
									
									
								
							@ -420,14 +420,10 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv)
 | 
				
			|||||||
    sd->pwd_len = 0;
 | 
					    sd->pwd_len = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sd_cardchange(void *opaque, int reason)
 | 
					static void sd_cardchange(void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SDState *sd = opaque;
 | 
					    SDState *sd = opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(reason & CHANGE_MEDIA)) {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
 | 
					    qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
 | 
				
			||||||
    if (bdrv_is_inserted(sd->bdrv)) {
 | 
					    if (bdrv_is_inserted(sd->bdrv)) {
 | 
				
			||||||
        sd_reset(sd, sd->bdrv);
 | 
					        sd_reset(sd, sd->bdrv);
 | 
				
			||||||
@ -436,7 +432,7 @@ static void sd_cardchange(void *opaque, int reason)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const BlockDevOps sd_block_ops = {
 | 
					static const BlockDevOps sd_block_ops = {
 | 
				
			||||||
    .change_cb = sd_cardchange,
 | 
					    .change_media_cb = sd_cardchange,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* We do not model the chip select pin, so allow the board to select
 | 
					/* We do not model the chip select pin, so allow the board to select
 | 
				
			||||||
 | 
				
			|||||||
@ -543,17 +543,15 @@ static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id)
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void virtio_blk_change_cb(void *opaque, int reason)
 | 
					static void virtio_blk_resize(void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    VirtIOBlock *s = opaque;
 | 
					    VirtIOBlock *s = opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (reason & CHANGE_SIZE) {
 | 
					    virtio_notify_config(&s->vdev);
 | 
				
			||||||
        virtio_notify_config(&s->vdev);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const BlockDevOps virtio_block_ops = {
 | 
					static const BlockDevOps virtio_block_ops = {
 | 
				
			||||||
    .change_cb = virtio_blk_change_cb,
 | 
					    .resize_cb = virtio_blk_resize,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf,
 | 
					VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user