mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
hw: Convert from BlockDriverState to BlockBackend, mostly
Device models should access their block backends only through the block-backend.h API. Convert them, and drop direct includes of inappropriate headers. Just four uses of BlockDriverState are left: * The Xen paravirtual block device backend (xen_disk.c) opens images itself when set up via xenbus, bypassing blockdev.c. I figure it should go through qmp_blockdev_add() instead. * Device model "usb-storage" prompts for keys. No other device model does, and this one probably shouldn't do it, either. * ide_issue_trim_cb() uses bdrv_aio_discard() instead of blk_aio_discard() because it fishes its backend out of a BlockAIOCB, which has only the BlockDriverState. * PC87312State has an unused BlockDriverState[] member. The next two commits take care of the latter two. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
2a30307f70
commit
4be746345f
110 changed files with 1127 additions and 798 deletions
182
hw/ide/core.c
182
hw/ide/core.c
|
@ -31,7 +31,7 @@
|
|||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/dma.h"
|
||||
#include "hw/block/block.h"
|
||||
#include "sysemu/blockdev.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
|
||||
#include <hw/ide/internal.h>
|
||||
|
||||
|
@ -158,10 +158,11 @@ static void ide_identify(IDEState *s)
|
|||
put_le16(p + 84, (1 << 14) | 0);
|
||||
}
|
||||
/* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
|
||||
if (bdrv_enable_write_cache(s->bs))
|
||||
put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
|
||||
else
|
||||
put_le16(p + 85, (1 << 14) | 1);
|
||||
if (blk_enable_write_cache(s->blk)) {
|
||||
put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
|
||||
} else {
|
||||
put_le16(p + 85, (1 << 14) | 1);
|
||||
}
|
||||
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
|
||||
put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
|
||||
/* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
|
||||
|
@ -350,7 +351,7 @@ static void ide_set_signature(IDEState *s)
|
|||
if (s->drive_kind == IDE_CD) {
|
||||
s->lcyl = 0x14;
|
||||
s->hcyl = 0xeb;
|
||||
} else if (s->bs) {
|
||||
} else if (s->blk) {
|
||||
s->lcyl = 0;
|
||||
s->hcyl = 0;
|
||||
} else {
|
||||
|
@ -379,7 +380,7 @@ static void trim_aio_cancel(BlockAIOCB *acb)
|
|||
iocb->ret = -ECANCELED;
|
||||
|
||||
if (iocb->aiocb) {
|
||||
bdrv_aio_cancel_async(iocb->aiocb);
|
||||
blk_aio_cancel_async(iocb->aiocb);
|
||||
iocb->aiocb = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -438,13 +439,13 @@ static void ide_issue_trim_cb(void *opaque, int ret)
|
|||
}
|
||||
}
|
||||
|
||||
BlockAIOCB *ide_issue_trim(BlockDriverState *bs,
|
||||
BlockAIOCB *ide_issue_trim(BlockBackend *blk,
|
||||
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
||||
BlockCompletionFunc *cb, void *opaque)
|
||||
{
|
||||
TrimAIOCB *iocb;
|
||||
|
||||
iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque);
|
||||
iocb = blk_aio_get(&trim_aiocb_info, blk, cb, opaque);
|
||||
iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
|
||||
iocb->ret = 0;
|
||||
iocb->qiov = qiov;
|
||||
|
@ -551,7 +552,7 @@ static bool ide_sect_range_ok(IDEState *s,
|
|||
{
|
||||
uint64_t total_sectors;
|
||||
|
||||
bdrv_get_geometry(s->bs, &total_sectors);
|
||||
blk_get_geometry(s->blk, &total_sectors);
|
||||
if (sector > total_sectors || nb_sectors > total_sectors - sector) {
|
||||
return false;
|
||||
}
|
||||
|
@ -569,7 +570,7 @@ static void ide_sector_read_cb(void *opaque, int ret)
|
|||
if (ret == -ECANCELED) {
|
||||
return;
|
||||
}
|
||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
||||
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||
if (ret != 0) {
|
||||
if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
|
||||
IDE_RETRY_READ)) {
|
||||
|
@ -625,10 +626,10 @@ void ide_sector_read(IDEState *s)
|
|||
s->iov.iov_len = n * BDRV_SECTOR_SIZE;
|
||||
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
||||
|
||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
|
||||
ide_sector_read_cb, s);
|
||||
s->pio_aiocb = blk_aio_readv(s->blk, sector_num, &s->qiov, n,
|
||||
ide_sector_read_cb, s);
|
||||
}
|
||||
|
||||
static void dma_buf_commit(IDEState *s)
|
||||
|
@ -655,7 +656,7 @@ void ide_dma_error(IDEState *s)
|
|||
static int ide_handle_rw_error(IDEState *s, int error, int op)
|
||||
{
|
||||
bool is_read = (op & IDE_RETRY_READ) != 0;
|
||||
BlockErrorAction action = bdrv_get_error_action(s->bs, is_read, error);
|
||||
BlockErrorAction action = blk_get_error_action(s->blk, is_read, error);
|
||||
|
||||
if (action == BLOCK_ERROR_ACTION_STOP) {
|
||||
s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
|
||||
|
@ -668,7 +669,7 @@ static int ide_handle_rw_error(IDEState *s, int error, int op)
|
|||
ide_rw_error(s);
|
||||
}
|
||||
}
|
||||
bdrv_error_action(s->bs, action, is_read, error);
|
||||
blk_error_action(s->blk, action, is_read, error);
|
||||
return action != BLOCK_ERROR_ACTION_IGNORE;
|
||||
}
|
||||
|
||||
|
@ -744,24 +745,24 @@ void ide_dma_cb(void *opaque, int ret)
|
|||
|
||||
switch (s->dma_cmd) {
|
||||
case IDE_DMA_READ:
|
||||
s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
|
||||
ide_dma_cb, s);
|
||||
s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, sector_num,
|
||||
ide_dma_cb, s);
|
||||
break;
|
||||
case IDE_DMA_WRITE:
|
||||
s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
|
||||
ide_dma_cb, s);
|
||||
s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, sector_num,
|
||||
ide_dma_cb, s);
|
||||
break;
|
||||
case IDE_DMA_TRIM:
|
||||
s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
|
||||
ide_issue_trim, ide_dma_cb, s,
|
||||
DMA_DIRECTION_TO_DEVICE);
|
||||
s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, sector_num,
|
||||
ide_issue_trim, ide_dma_cb, s,
|
||||
DMA_DIRECTION_TO_DEVICE);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
||||
eot:
|
||||
if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
|
||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
||||
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||
}
|
||||
ide_set_inactive(s, stay_active);
|
||||
}
|
||||
|
@ -775,11 +776,11 @@ static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
|
|||
|
||||
switch (dma_cmd) {
|
||||
case IDE_DMA_READ:
|
||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
break;
|
||||
case IDE_DMA_WRITE:
|
||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
||||
break;
|
||||
default:
|
||||
|
@ -810,7 +811,7 @@ static void ide_sector_write_cb(void *opaque, int ret)
|
|||
if (ret == -ECANCELED) {
|
||||
return;
|
||||
}
|
||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
||||
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||
|
||||
s->pio_aiocb = NULL;
|
||||
s->status &= ~BUSY_STAT;
|
||||
|
@ -877,10 +878,10 @@ void ide_sector_write(IDEState *s)
|
|||
s->iov.iov_len = n * BDRV_SECTOR_SIZE;
|
||||
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
||||
|
||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
|
||||
ide_sector_write_cb, s);
|
||||
s->pio_aiocb = blk_aio_writev(s->blk, sector_num, &s->qiov, n,
|
||||
ide_sector_write_cb, s);
|
||||
}
|
||||
|
||||
static void ide_flush_cb(void *opaque, int ret)
|
||||
|
@ -899,8 +900,8 @@ static void ide_flush_cb(void *opaque, int ret)
|
|||
}
|
||||
}
|
||||
|
||||
if (s->bs) {
|
||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
||||
if (s->blk) {
|
||||
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||
}
|
||||
s->status = READY_STAT | SEEK_STAT;
|
||||
ide_cmd_done(s);
|
||||
|
@ -909,14 +910,14 @@ static void ide_flush_cb(void *opaque, int ret)
|
|||
|
||||
void ide_flush_cache(IDEState *s)
|
||||
{
|
||||
if (s->bs == NULL) {
|
||||
if (s->blk == NULL) {
|
||||
ide_flush_cb(s, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
s->status |= BUSY_STAT;
|
||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, 0, BLOCK_ACCT_FLUSH);
|
||||
s->pio_aiocb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct, 0, BLOCK_ACCT_FLUSH);
|
||||
s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s);
|
||||
}
|
||||
|
||||
static void ide_cfata_metadata_inquiry(IDEState *s)
|
||||
|
@ -979,7 +980,7 @@ static void ide_cd_change_cb(void *opaque, bool load)
|
|||
uint64_t nb_sectors;
|
||||
|
||||
s->tray_open = !load;
|
||||
bdrv_get_geometry(s->bs, &nb_sectors);
|
||||
blk_get_geometry(s->blk, &nb_sectors);
|
||||
s->nb_sectors = nb_sectors;
|
||||
|
||||
/*
|
||||
|
@ -1113,7 +1114,7 @@ static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
|
|||
{
|
||||
switch (s->feature) {
|
||||
case DSM_TRIM:
|
||||
if (s->bs) {
|
||||
if (s->blk) {
|
||||
ide_sector_start_dma(s, IDE_DMA_TRIM);
|
||||
return false;
|
||||
}
|
||||
|
@ -1126,7 +1127,7 @@ static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
|
|||
|
||||
static bool cmd_identify(IDEState *s, uint8_t cmd)
|
||||
{
|
||||
if (s->bs && s->drive_kind != IDE_CD) {
|
||||
if (s->blk && s->drive_kind != IDE_CD) {
|
||||
if (s->drive_kind != IDE_CFATA) {
|
||||
ide_identify(s);
|
||||
} else {
|
||||
|
@ -1176,7 +1177,7 @@ static bool cmd_read_multiple(IDEState *s, uint8_t cmd)
|
|||
{
|
||||
bool lba48 = (cmd == WIN_MULTREAD_EXT);
|
||||
|
||||
if (!s->bs || !s->mult_sectors) {
|
||||
if (!s->blk || !s->mult_sectors) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1192,7 +1193,7 @@ static bool cmd_write_multiple(IDEState *s, uint8_t cmd)
|
|||
bool lba48 = (cmd == WIN_MULTWRITE_EXT);
|
||||
int n;
|
||||
|
||||
if (!s->bs || !s->mult_sectors) {
|
||||
if (!s->blk || !s->mult_sectors) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1220,7 +1221,7 @@ static bool cmd_read_pio(IDEState *s, uint8_t cmd)
|
|||
return true;
|
||||
}
|
||||
|
||||
if (!s->bs) {
|
||||
if (!s->blk) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1236,7 +1237,7 @@ static bool cmd_write_pio(IDEState *s, uint8_t cmd)
|
|||
{
|
||||
bool lba48 = (cmd == WIN_WRITE_EXT);
|
||||
|
||||
if (!s->bs) {
|
||||
if (!s->blk) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1256,7 +1257,7 @@ static bool cmd_read_dma(IDEState *s, uint8_t cmd)
|
|||
{
|
||||
bool lba48 = (cmd == WIN_READDMA_EXT);
|
||||
|
||||
if (!s->bs) {
|
||||
if (!s->blk) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1271,7 +1272,7 @@ static bool cmd_write_dma(IDEState *s, uint8_t cmd)
|
|||
{
|
||||
bool lba48 = (cmd == WIN_WRITEDMA_EXT);
|
||||
|
||||
if (!s->bs) {
|
||||
if (!s->blk) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1322,7 +1323,7 @@ static bool cmd_set_features(IDEState *s, uint8_t cmd)
|
|||
{
|
||||
uint16_t *identify_data;
|
||||
|
||||
if (!s->bs) {
|
||||
if (!s->blk) {
|
||||
ide_abort_command(s);
|
||||
return true;
|
||||
}
|
||||
|
@ -1330,12 +1331,12 @@ static bool cmd_set_features(IDEState *s, uint8_t cmd)
|
|||
/* XXX: valid for CDROM ? */
|
||||
switch (s->feature) {
|
||||
case 0x02: /* write cache enable */
|
||||
bdrv_set_enable_write_cache(s->bs, true);
|
||||
blk_set_enable_write_cache(s->blk, true);
|
||||
identify_data = (uint16_t *)s->identify_data;
|
||||
put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
|
||||
return true;
|
||||
case 0x82: /* write cache disable */
|
||||
bdrv_set_enable_write_cache(s->bs, false);
|
||||
blk_set_enable_write_cache(s->blk, false);
|
||||
identify_data = (uint16_t *)s->identify_data;
|
||||
put_le16(identify_data + 85, (1 << 14) | 1);
|
||||
ide_flush_cache(s);
|
||||
|
@ -1802,8 +1803,9 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
|
|||
#endif
|
||||
s = idebus_active_if(bus);
|
||||
/* ignore commands to non existent slave */
|
||||
if (s != bus->ifs && !s->bs)
|
||||
if (s != bus->ifs && !s->blk) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
|
||||
if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
|
||||
|
@ -1848,59 +1850,66 @@ uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
|
|||
ret = 0xff;
|
||||
break;
|
||||
case 1:
|
||||
if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
|
||||
(s != bus->ifs && !s->bs))
|
||||
if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
|
||||
(s != bus->ifs && !s->blk)) {
|
||||
ret = 0;
|
||||
else if (!hob)
|
||||
} else if (!hob) {
|
||||
ret = s->error;
|
||||
else
|
||||
} else {
|
||||
ret = s->hob_feature;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
||||
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||
ret = 0;
|
||||
else if (!hob)
|
||||
} else if (!hob) {
|
||||
ret = s->nsector & 0xff;
|
||||
else
|
||||
} else {
|
||||
ret = s->hob_nsector;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
||||
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||
ret = 0;
|
||||
else if (!hob)
|
||||
} else if (!hob) {
|
||||
ret = s->sector;
|
||||
else
|
||||
} else {
|
||||
ret = s->hob_sector;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
||||
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||
ret = 0;
|
||||
else if (!hob)
|
||||
} else if (!hob) {
|
||||
ret = s->lcyl;
|
||||
else
|
||||
} else {
|
||||
ret = s->hob_lcyl;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
||||
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||
ret = 0;
|
||||
else if (!hob)
|
||||
} else if (!hob) {
|
||||
ret = s->hcyl;
|
||||
else
|
||||
} else {
|
||||
ret = s->hob_hcyl;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
||||
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||
ret = 0;
|
||||
else
|
||||
} else {
|
||||
ret = s->select;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case 7:
|
||||
if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
|
||||
(s != bus->ifs && !s->bs))
|
||||
if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
|
||||
(s != bus->ifs && !s->blk)) {
|
||||
ret = 0;
|
||||
else
|
||||
} else {
|
||||
ret = s->status;
|
||||
}
|
||||
qemu_irq_lower(bus->irq);
|
||||
break;
|
||||
}
|
||||
|
@ -1916,11 +1925,12 @@ uint32_t ide_status_read(void *opaque, uint32_t addr)
|
|||
IDEState *s = idebus_active_if(bus);
|
||||
int ret;
|
||||
|
||||
if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
|
||||
(s != bus->ifs && !s->bs))
|
||||
if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
|
||||
(s != bus->ifs && !s->blk)) {
|
||||
ret = 0;
|
||||
else
|
||||
} else {
|
||||
ret = s->status;
|
||||
}
|
||||
#ifdef DEBUG_IDE
|
||||
printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
|
||||
#endif
|
||||
|
@ -2081,7 +2091,7 @@ static void ide_reset(IDEState *s)
|
|||
#endif
|
||||
|
||||
if (s->pio_aiocb) {
|
||||
bdrv_aio_cancel(s->pio_aiocb);
|
||||
blk_aio_cancel(s->pio_aiocb);
|
||||
s->pio_aiocb = NULL;
|
||||
}
|
||||
|
||||
|
@ -2145,7 +2155,7 @@ void ide_bus_reset(IDEBus *bus)
|
|||
#ifdef DEBUG_AIO
|
||||
printf("aio_cancel\n");
|
||||
#endif
|
||||
bdrv_aio_cancel(bus->dma->aiocb);
|
||||
blk_aio_cancel(bus->dma->aiocb);
|
||||
bus->dma->aiocb = NULL;
|
||||
}
|
||||
|
||||
|
@ -2174,7 +2184,7 @@ static void ide_resize_cb(void *opaque)
|
|||
return;
|
||||
}
|
||||
|
||||
bdrv_get_geometry(s->bs, &nb_sectors);
|
||||
blk_get_geometry(s->blk, &nb_sectors);
|
||||
s->nb_sectors = nb_sectors;
|
||||
|
||||
/* Update the identify data buffer. */
|
||||
|
@ -2198,7 +2208,7 @@ static const BlockDevOps ide_hd_block_ops = {
|
|||
.resize_cb = ide_resize_cb,
|
||||
};
|
||||
|
||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
||||
int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind,
|
||||
const char *version, const char *serial, const char *model,
|
||||
uint64_t wwn,
|
||||
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
||||
|
@ -2206,10 +2216,10 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||
{
|
||||
uint64_t nb_sectors;
|
||||
|
||||
s->bs = bs;
|
||||
s->blk = blk;
|
||||
s->drive_kind = kind;
|
||||
|
||||
bdrv_get_geometry(bs, &nb_sectors);
|
||||
blk_get_geometry(blk, &nb_sectors);
|
||||
s->cylinders = cylinders;
|
||||
s->heads = heads;
|
||||
s->sectors = secs;
|
||||
|
@ -2223,18 +2233,18 @@ 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_dev_ops(bs, &ide_cd_block_ops, s);
|
||||
bdrv_set_guest_block_size(bs, 2048);
|
||||
blk_set_dev_ops(blk, &ide_cd_block_ops, s);
|
||||
blk_set_guest_block_size(blk, 2048);
|
||||
} else {
|
||||
if (!bdrv_is_inserted(s->bs)) {
|
||||
if (!blk_is_inserted(s->blk)) {
|
||||
error_report("Device needs media, but drive is empty");
|
||||
return -1;
|
||||
}
|
||||
if (bdrv_is_read_only(bs)) {
|
||||
if (blk_is_read_only(blk)) {
|
||||
error_report("Can't use a read-only drive");
|
||||
return -1;
|
||||
}
|
||||
bdrv_set_dev_ops(bs, &ide_hd_block_ops, s);
|
||||
blk_set_dev_ops(blk, &ide_hd_block_ops, s);
|
||||
}
|
||||
if (serial) {
|
||||
pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
|
||||
|
@ -2265,7 +2275,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||
}
|
||||
|
||||
ide_reset(s);
|
||||
bdrv_iostatus_enable(bs);
|
||||
blk_iostatus_enable(blk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2282,7 +2292,7 @@ static void ide_init1(IDEBus *bus, int unit)
|
|||
s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
|
||||
memset(s->io_buffer, 0, s->io_buffer_total_len);
|
||||
|
||||
s->smart_selftest_data = qemu_blockalign(s->bs, 512);
|
||||
s->smart_selftest_data = blk_blockalign(s->blk, 512);
|
||||
memset(s->smart_selftest_data, 0, 512);
|
||||
|
||||
s->sector_write_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
|
||||
|
@ -2377,7 +2387,7 @@ static int ide_drive_post_load(void *opaque, int version_id)
|
|||
IDEState *s = opaque;
|
||||
|
||||
if (s->identify_set) {
|
||||
bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
|
||||
blk_set_enable_write_cache(s->blk, !!(s->identify_data[85] & (1 << 5)));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue