mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
Block layer patches
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJXNIcBAAoJEH8JsnLIjy/WiUQP/Rzfo8pe7TWA2InxdcDOPsx4 2/tHHJdVkffnNX5rdBvc0mOUZNJxej0NtJu2e63BB+ydYju//xw8gruKU7TR+Nd3 nPNSsqk80prK3RNgWu7qymBvIkHDDcDQhlp48HKq+dxrfConXtHmoXapGsqc0S47 xu03oC6WzSIyLf7TLytcjUmEprQSaCGOwsb/XaHAWL750fFAGcdy/K5PWBpUv6DN T0jZ3u4UneE1jeabRmqAwjgDJXC9l6riH9fP/ZtYhgNlNj84zlMXajUHSULhGknP cTGjwwg9tOvhcjTdhdRmWlvG1m0T77ZX3icfZLhcTdb/Uz68NXVqs8P25IGV9McD DPrb3T/M8JUoqLXJxIpxUm2Levof5v0dUF1PHmN5bT7pshcqv/1J7v8Fdtf9l9mp zI0+FK1TZ102C0H2F7AWYZSlo2EfNUSd02QQx6MbfDokDIlIxY+EgP1/Es5XlkqC wc7HrJvq+uix2zXw9bn9Vg9p/nDuxlRx+ppRRarNNRonaqTrx/1qAaas4bsqc9Gz H6gxw7BHybm0TZFdHqAdIonpesecYw6yWUXT/mQehbfphsmQmu/d2HvF2C9uUm4X O0JduBlKOTm2hMcg5qL6Gko8WaQIctdCJH/1Onts92cZnm8Vr/9zcmMgwGoCd7sE +t6Yg0jqpTUJwhZhIuCw =NbjJ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging Block layer patches # gpg: Signature made Thu 12 May 2016 14:37:05 BST using RSA key ID C88F2FD6 # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" * remotes/kevin/tags/for-upstream: (69 commits) qemu-iotests: iotests: fail hard if not run via "check" block: enable testing of LUKS driver with block I/O tests block: add support for encryption secrets in block I/O tests block: add support for --image-opts in block I/O tests qemu-io: Add 'write -z -u' to test MAY_UNMAP flag qemu-io: Add 'write -f' to test FUA flag qemu-io: Allow unaligned access by default qemu-io: Use bool for command line flags qemu-io: Make 'open' subcommand more like command line qemu-io: Add missing option documentation qmp: add monitor command to add/remove a child quorum: implement bdrv_add_child() and bdrv_del_child() Add new block driver interface to add/delete a BDS's child qemu-img: check block status of backing file when converting. iotests: fix the redirection order in 083 block: Inactivate all children block: Drop superfluous invalidating bs->file from drivers block: Invalidate all children nbd: Simplify client FUA handling block: Honor BDRV_REQ_FUA during write_zeroes ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
f68419eee9
78 changed files with 3335 additions and 2071 deletions
|
@ -223,6 +223,13 @@ static int fd_sector(FDrive *drv)
|
|||
NUM_SIDES(drv));
|
||||
}
|
||||
|
||||
/* Returns current position, in bytes, for given drive */
|
||||
static int fd_offset(FDrive *drv)
|
||||
{
|
||||
g_assert(fd_sector(drv) < INT_MAX >> BDRV_SECTOR_BITS);
|
||||
return fd_sector(drv) << BDRV_SECTOR_BITS;
|
||||
}
|
||||
|
||||
/* Seek to a new position:
|
||||
* returns 0 if already on right track
|
||||
* returns 1 if track changed
|
||||
|
@ -1629,8 +1636,8 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
|||
if (fdctrl->data_dir != FD_DIR_WRITE ||
|
||||
len < FD_SECTOR_LEN || rel_pos != 0) {
|
||||
/* READ & SCAN commands and realign to a sector for WRITE */
|
||||
if (blk_read(cur_drv->blk, fd_sector(cur_drv),
|
||||
fdctrl->fifo, 1) < 0) {
|
||||
if (blk_pread(cur_drv->blk, fd_offset(cur_drv),
|
||||
fdctrl->fifo, BDRV_SECTOR_SIZE) < 0) {
|
||||
FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
/* Sure, image size is too small... */
|
||||
|
@ -1657,8 +1664,8 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
|||
|
||||
k->read_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos,
|
||||
fdctrl->data_pos, len);
|
||||
if (blk_write(cur_drv->blk, fd_sector(cur_drv),
|
||||
fdctrl->fifo, 1) < 0) {
|
||||
if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv),
|
||||
fdctrl->fifo, BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||
|
@ -1741,7 +1748,8 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl)
|
|||
fd_sector(cur_drv));
|
||||
return 0;
|
||||
}
|
||||
if (blk_read(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
||||
if (blk_pread(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||
BDRV_SECTOR_SIZE)
|
||||
< 0) {
|
||||
FLOPPY_DPRINTF("error getting sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
|
@ -1820,7 +1828,8 @@ static void fdctrl_format_sector(FDCtrl *fdctrl)
|
|||
}
|
||||
memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
|
||||
if (cur_drv->blk == NULL ||
|
||||
blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {
|
||||
blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
|
||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||
} else {
|
||||
|
@ -2243,8 +2252,8 @@ static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value)
|
|||
if (pos == FD_SECTOR_LEN - 1 ||
|
||||
fdctrl->data_pos == fdctrl->data_len) {
|
||||
cur_drv = get_cur_drv(fdctrl);
|
||||
if (blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
||||
< 0) {
|
||||
if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
break;
|
||||
|
|
|
@ -66,7 +66,7 @@ static int guess_disk_lchs(BlockBackend *blk,
|
|||
* but also in async I/O mode. So the I/O throttling function has to
|
||||
* be disabled temporarily here, not permanently.
|
||||
*/
|
||||
if (blk_read_unthrottled(blk, 0, buf, 1) < 0) {
|
||||
if (blk_pread_unthrottled(blk, 0, buf, BDRV_SECTOR_SIZE) < 0) {
|
||||
return -1;
|
||||
}
|
||||
/* test msdos magic */
|
||||
|
|
|
@ -358,25 +358,21 @@ static void blk_sync_complete(void *opaque, int ret)
|
|||
|
||||
static void flash_sync_page(Flash *s, int page)
|
||||
{
|
||||
int blk_sector, nb_sectors;
|
||||
QEMUIOVector iov;
|
||||
|
||||
if (!s->blk || blk_is_read_only(s->blk)) {
|
||||
return;
|
||||
}
|
||||
|
||||
blk_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
|
||||
nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
|
||||
qemu_iovec_init(&iov, 1);
|
||||
qemu_iovec_add(&iov, s->storage + blk_sector * BDRV_SECTOR_SIZE,
|
||||
nb_sectors * BDRV_SECTOR_SIZE);
|
||||
blk_aio_writev(s->blk, blk_sector, &iov, nb_sectors, blk_sync_complete,
|
||||
NULL);
|
||||
qemu_iovec_add(&iov, s->storage + page * s->pi->page_size,
|
||||
s->pi->page_size);
|
||||
blk_aio_pwritev(s->blk, page * s->pi->page_size, &iov, 0,
|
||||
blk_sync_complete, NULL);
|
||||
}
|
||||
|
||||
static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
|
||||
{
|
||||
int64_t start, end, nb_sectors;
|
||||
QEMUIOVector iov;
|
||||
|
||||
if (!s->blk || blk_is_read_only(s->blk)) {
|
||||
|
@ -384,13 +380,9 @@ static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
|
|||
}
|
||||
|
||||
assert(!(len % BDRV_SECTOR_SIZE));
|
||||
start = off / BDRV_SECTOR_SIZE;
|
||||
end = (off + len) / BDRV_SECTOR_SIZE;
|
||||
nb_sectors = end - start;
|
||||
qemu_iovec_init(&iov, 1);
|
||||
qemu_iovec_add(&iov, s->storage + (start * BDRV_SECTOR_SIZE),
|
||||
nb_sectors * BDRV_SECTOR_SIZE);
|
||||
blk_aio_writev(s->blk, start, &iov, nb_sectors, blk_sync_complete, NULL);
|
||||
qemu_iovec_add(&iov, s->storage + off, len);
|
||||
blk_aio_pwritev(s->blk, off, &iov, 0, blk_sync_complete, NULL);
|
||||
}
|
||||
|
||||
static void flash_erase(Flash *s, int offset, FlashCMD cmd)
|
||||
|
@ -907,8 +899,7 @@ static int m25p80_init(SSISlave *ss)
|
|||
s->storage = blk_blockalign(s->blk, s->size);
|
||||
|
||||
/* FIXME: Move to late init */
|
||||
if (blk_read(s->blk, 0, s->storage,
|
||||
DIV_ROUND_UP(s->size, BDRV_SECTOR_SIZE))) {
|
||||
if (blk_pread(s->blk, 0, s->storage, s->size)) {
|
||||
fprintf(stderr, "Failed to initialize SPI flash!\n");
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -663,7 +663,8 @@ static void glue(nand_blk_write_, PAGE_SIZE)(NANDFlashState *s)
|
|||
sector = SECTOR(s->addr);
|
||||
off = (s->addr & PAGE_MASK) + s->offset;
|
||||
soff = SECTOR_OFFSET(s->addr);
|
||||
if (blk_read(s->blk, sector, iobuf, PAGE_SECTORS) < 0) {
|
||||
if (blk_pread(s->blk, sector << BDRV_SECTOR_BITS, iobuf,
|
||||
PAGE_SECTORS << BDRV_SECTOR_BITS) < 0) {
|
||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, sector);
|
||||
return;
|
||||
}
|
||||
|
@ -675,21 +676,24 @@ static void glue(nand_blk_write_, PAGE_SIZE)(NANDFlashState *s)
|
|||
MIN(OOB_SIZE, off + s->iolen - PAGE_SIZE));
|
||||
}
|
||||
|
||||
if (blk_write(s->blk, sector, iobuf, PAGE_SECTORS) < 0) {
|
||||
if (blk_pwrite(s->blk, sector << BDRV_SECTOR_BITS, iobuf,
|
||||
PAGE_SECTORS << BDRV_SECTOR_BITS, 0) < 0) {
|
||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, sector);
|
||||
}
|
||||
} else {
|
||||
off = PAGE_START(s->addr) + (s->addr & PAGE_MASK) + s->offset;
|
||||
sector = off >> 9;
|
||||
soff = off & 0x1ff;
|
||||
if (blk_read(s->blk, sector, iobuf, PAGE_SECTORS + 2) < 0) {
|
||||
if (blk_pread(s->blk, sector << BDRV_SECTOR_BITS, iobuf,
|
||||
(PAGE_SECTORS + 2) << BDRV_SECTOR_BITS) < 0) {
|
||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, sector);
|
||||
return;
|
||||
}
|
||||
|
||||
mem_and(iobuf + soff, s->io, s->iolen);
|
||||
|
||||
if (blk_write(s->blk, sector, iobuf, PAGE_SECTORS + 2) < 0) {
|
||||
if (blk_pwrite(s->blk, sector << BDRV_SECTOR_BITS, iobuf,
|
||||
(PAGE_SECTORS + 2) << BDRV_SECTOR_BITS, 0) < 0) {
|
||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, sector);
|
||||
}
|
||||
}
|
||||
|
@ -716,17 +720,20 @@ static void glue(nand_blk_erase_, PAGE_SIZE)(NANDFlashState *s)
|
|||
i = SECTOR(addr);
|
||||
page = SECTOR(addr + (1 << (ADDR_SHIFT + s->erase_shift)));
|
||||
for (; i < page; i ++)
|
||||
if (blk_write(s->blk, i, iobuf, 1) < 0) {
|
||||
if (blk_pwrite(s->blk, i << BDRV_SECTOR_BITS, iobuf,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, i);
|
||||
}
|
||||
} else {
|
||||
addr = PAGE_START(addr);
|
||||
page = addr >> 9;
|
||||
if (blk_read(s->blk, page, iobuf, 1) < 0) {
|
||||
if (blk_pread(s->blk, page << BDRV_SECTOR_BITS, iobuf,
|
||||
BDRV_SECTOR_SIZE) < 0) {
|
||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, page);
|
||||
}
|
||||
memset(iobuf + (addr & 0x1ff), 0xff, (~addr & 0x1ff) + 1);
|
||||
if (blk_write(s->blk, page, iobuf, 1) < 0) {
|
||||
if (blk_pwrite(s->blk, page << BDRV_SECTOR_BITS, iobuf,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, page);
|
||||
}
|
||||
|
||||
|
@ -734,18 +741,20 @@ static void glue(nand_blk_erase_, PAGE_SIZE)(NANDFlashState *s)
|
|||
i = (addr & ~0x1ff) + 0x200;
|
||||
for (addr += ((PAGE_SIZE + OOB_SIZE) << s->erase_shift) - 0x200;
|
||||
i < addr; i += 0x200) {
|
||||
if (blk_write(s->blk, i >> 9, iobuf, 1) < 0) {
|
||||
if (blk_pwrite(s->blk, i, iobuf, BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
printf("%s: write error in sector %" PRIu64 "\n",
|
||||
__func__, i >> 9);
|
||||
}
|
||||
}
|
||||
|
||||
page = i >> 9;
|
||||
if (blk_read(s->blk, page, iobuf, 1) < 0) {
|
||||
if (blk_pread(s->blk, page << BDRV_SECTOR_BITS, iobuf,
|
||||
BDRV_SECTOR_SIZE) < 0) {
|
||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, page);
|
||||
}
|
||||
memset(iobuf, 0xff, ((addr - 1) & 0x1ff) + 1);
|
||||
if (blk_write(s->blk, page, iobuf, 1) < 0) {
|
||||
if (blk_pwrite(s->blk, page << BDRV_SECTOR_BITS, iobuf,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, page);
|
||||
}
|
||||
}
|
||||
|
@ -760,7 +769,8 @@ static void glue(nand_blk_load_, PAGE_SIZE)(NANDFlashState *s,
|
|||
|
||||
if (s->blk) {
|
||||
if (s->mem_oob) {
|
||||
if (blk_read(s->blk, SECTOR(addr), s->io, PAGE_SECTORS) < 0) {
|
||||
if (blk_pread(s->blk, SECTOR(addr) << BDRV_SECTOR_BITS, s->io,
|
||||
PAGE_SECTORS << BDRV_SECTOR_BITS) < 0) {
|
||||
printf("%s: read error in sector %" PRIu64 "\n",
|
||||
__func__, SECTOR(addr));
|
||||
}
|
||||
|
@ -769,8 +779,8 @@ static void glue(nand_blk_load_, PAGE_SIZE)(NANDFlashState *s,
|
|||
OOB_SIZE);
|
||||
s->ioaddr = s->io + SECTOR_OFFSET(s->addr) + offset;
|
||||
} else {
|
||||
if (blk_read(s->blk, PAGE_START(addr) >> 9,
|
||||
s->io, (PAGE_SECTORS + 2)) < 0) {
|
||||
if (blk_pread(s->blk, PAGE_START(addr), s->io,
|
||||
(PAGE_SECTORS + 2) << BDRV_SECTOR_BITS) < 0) {
|
||||
printf("%s: read error in sector %" PRIu64 "\n",
|
||||
__func__, PAGE_START(addr) >> 9);
|
||||
}
|
||||
|
|
|
@ -224,7 +224,8 @@ static void onenand_reset(OneNANDState *s, int cold)
|
|||
/* Lock the whole flash */
|
||||
memset(s->blockwp, ONEN_LOCK_LOCKED, s->blocks);
|
||||
|
||||
if (s->blk_cur && blk_read(s->blk_cur, 0, s->boot[0], 8) < 0) {
|
||||
if (s->blk_cur && blk_pread(s->blk_cur, 0, s->boot[0],
|
||||
8 << BDRV_SECTOR_BITS) < 0) {
|
||||
hw_error("%s: Loading the BootRAM failed.\n", __func__);
|
||||
}
|
||||
}
|
||||
|
@ -240,8 +241,11 @@ static void onenand_system_reset(DeviceState *dev)
|
|||
static inline int onenand_load_main(OneNANDState *s, int sec, int secn,
|
||||
void *dest)
|
||||
{
|
||||
assert(UINT32_MAX >> BDRV_SECTOR_BITS > sec);
|
||||
assert(UINT32_MAX >> BDRV_SECTOR_BITS > secn);
|
||||
if (s->blk_cur) {
|
||||
return blk_read(s->blk_cur, sec, dest, secn) < 0;
|
||||
return blk_pread(s->blk_cur, sec << BDRV_SECTOR_BITS, dest,
|
||||
secn << BDRV_SECTOR_BITS) < 0;
|
||||
} else if (sec + secn > s->secs_cur) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -257,19 +261,22 @@ static inline int onenand_prog_main(OneNANDState *s, int sec, int secn,
|
|||
int result = 0;
|
||||
|
||||
if (secn > 0) {
|
||||
uint32_t size = (uint32_t)secn * 512;
|
||||
uint32_t size = secn << BDRV_SECTOR_BITS;
|
||||
uint32_t offset = sec << BDRV_SECTOR_BITS;
|
||||
assert(UINT32_MAX >> BDRV_SECTOR_BITS > sec);
|
||||
assert(UINT32_MAX >> BDRV_SECTOR_BITS > secn);
|
||||
const uint8_t *sp = (const uint8_t *)src;
|
||||
uint8_t *dp = 0;
|
||||
if (s->blk_cur) {
|
||||
dp = g_malloc(size);
|
||||
if (!dp || blk_read(s->blk_cur, sec, dp, secn) < 0) {
|
||||
if (!dp || blk_pread(s->blk_cur, offset, dp, size) < 0) {
|
||||
result = 1;
|
||||
}
|
||||
} else {
|
||||
if (sec + secn > s->secs_cur) {
|
||||
result = 1;
|
||||
} else {
|
||||
dp = (uint8_t *)s->current + (sec << 9);
|
||||
dp = (uint8_t *)s->current + offset;
|
||||
}
|
||||
}
|
||||
if (!result) {
|
||||
|
@ -278,7 +285,7 @@ static inline int onenand_prog_main(OneNANDState *s, int sec, int secn,
|
|||
dp[i] &= sp[i];
|
||||
}
|
||||
if (s->blk_cur) {
|
||||
result = blk_write(s->blk_cur, sec, dp, secn) < 0;
|
||||
result = blk_pwrite(s->blk_cur, offset, dp, size, 0) < 0;
|
||||
}
|
||||
}
|
||||
if (dp && s->blk_cur) {
|
||||
|
@ -295,7 +302,8 @@ static inline int onenand_load_spare(OneNANDState *s, int sec, int secn,
|
|||
uint8_t buf[512];
|
||||
|
||||
if (s->blk_cur) {
|
||||
if (blk_read(s->blk_cur, s->secs_cur + (sec >> 5), buf, 1) < 0) {
|
||||
uint32_t offset = (s->secs_cur + (sec >> 5)) << BDRV_SECTOR_BITS;
|
||||
if (blk_pread(s->blk_cur, offset, buf, BDRV_SECTOR_SIZE) < 0) {
|
||||
return 1;
|
||||
}
|
||||
memcpy(dest, buf + ((sec & 31) << 4), secn << 4);
|
||||
|
@ -304,7 +312,7 @@ static inline int onenand_load_spare(OneNANDState *s, int sec, int secn,
|
|||
} else {
|
||||
memcpy(dest, s->current + (s->secs_cur << 9) + (sec << 4), secn << 4);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -315,10 +323,12 @@ static inline int onenand_prog_spare(OneNANDState *s, int sec, int secn,
|
|||
if (secn > 0) {
|
||||
const uint8_t *sp = (const uint8_t *)src;
|
||||
uint8_t *dp = 0, *dpp = 0;
|
||||
uint32_t offset = (s->secs_cur + (sec >> 5)) << BDRV_SECTOR_BITS;
|
||||
assert(UINT32_MAX >> BDRV_SECTOR_BITS > s->secs_cur + (sec >> 5));
|
||||
if (s->blk_cur) {
|
||||
dp = g_malloc(512);
|
||||
if (!dp
|
||||
|| blk_read(s->blk_cur, s->secs_cur + (sec >> 5), dp, 1) < 0) {
|
||||
|| blk_pread(s->blk_cur, offset, dp, BDRV_SECTOR_SIZE) < 0) {
|
||||
result = 1;
|
||||
} else {
|
||||
dpp = dp + ((sec & 31) << 4);
|
||||
|
@ -336,8 +346,8 @@ static inline int onenand_prog_spare(OneNANDState *s, int sec, int secn,
|
|||
dpp[i] &= sp[i];
|
||||
}
|
||||
if (s->blk_cur) {
|
||||
result = blk_write(s->blk_cur, s->secs_cur + (sec >> 5),
|
||||
dp, 1) < 0;
|
||||
result = blk_pwrite(s->blk_cur, offset, dp,
|
||||
BDRV_SECTOR_SIZE, 0) < 0;
|
||||
}
|
||||
}
|
||||
g_free(dp);
|
||||
|
@ -355,14 +365,17 @@ static inline int onenand_erase(OneNANDState *s, int sec, int num)
|
|||
for (; num > 0; num--, sec++) {
|
||||
if (s->blk_cur) {
|
||||
int erasesec = s->secs_cur + (sec >> 5);
|
||||
if (blk_write(s->blk_cur, sec, blankbuf, 1) < 0) {
|
||||
if (blk_pwrite(s->blk_cur, sec << BDRV_SECTOR_BITS, blankbuf,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
if (blk_read(s->blk_cur, erasesec, tmpbuf, 1) < 0) {
|
||||
if (blk_pread(s->blk_cur, erasesec << BDRV_SECTOR_BITS, tmpbuf,
|
||||
BDRV_SECTOR_SIZE) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
memcpy(tmpbuf + ((sec & 31) << 4), blankbuf, 1 << 4);
|
||||
if (blk_write(s->blk_cur, erasesec, tmpbuf, 1) < 0) {
|
||||
if (blk_pwrite(s->blk_cur, erasesec << BDRV_SECTOR_BITS, tmpbuf,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -413,11 +413,11 @@ static void pflash_update(pflash_t *pfl, int offset,
|
|||
int offset_end;
|
||||
if (pfl->blk) {
|
||||
offset_end = offset + size;
|
||||
/* round to sectors */
|
||||
offset = offset >> 9;
|
||||
offset_end = (offset_end + 511) >> 9;
|
||||
blk_write(pfl->blk, offset, pfl->storage + (offset << 9),
|
||||
offset_end - offset);
|
||||
/* widen to sector boundaries */
|
||||
offset = QEMU_ALIGN_DOWN(offset, BDRV_SECTOR_SIZE);
|
||||
offset_end = QEMU_ALIGN_UP(offset_end, BDRV_SECTOR_SIZE);
|
||||
blk_pwrite(pfl->blk, offset, pfl->storage + offset,
|
||||
offset_end - offset, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -739,7 +739,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
|
|||
|
||||
if (pfl->blk) {
|
||||
/* read the initial flash content */
|
||||
ret = blk_read(pfl->blk, 0, pfl->storage, total_len >> 9);
|
||||
ret = blk_pread(pfl->blk, 0, pfl->storage, total_len);
|
||||
|
||||
if (ret < 0) {
|
||||
vmstate_unregister_ram(&pfl->mem, DEVICE(pfl));
|
||||
|
|
|
@ -253,11 +253,11 @@ static void pflash_update(pflash_t *pfl, int offset,
|
|||
int offset_end;
|
||||
if (pfl->blk) {
|
||||
offset_end = offset + size;
|
||||
/* round to sectors */
|
||||
offset = offset >> 9;
|
||||
offset_end = (offset_end + 511) >> 9;
|
||||
blk_write(pfl->blk, offset, pfl->storage + (offset << 9),
|
||||
offset_end - offset);
|
||||
/* widen to sector boundaries */
|
||||
offset = QEMU_ALIGN_DOWN(offset, BDRV_SECTOR_SIZE);
|
||||
offset_end = QEMU_ALIGN_UP(offset_end, BDRV_SECTOR_SIZE);
|
||||
blk_pwrite(pfl->blk, offset, pfl->storage + offset,
|
||||
offset_end - offset, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -622,7 +622,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
|
|||
pfl->chip_len = chip_len;
|
||||
if (pfl->blk) {
|
||||
/* read the initial flash content */
|
||||
ret = blk_read(pfl->blk, 0, pfl->storage, chip_len >> 9);
|
||||
ret = blk_pread(pfl->blk, 0, pfl->storage, chip_len);
|
||||
if (ret < 0) {
|
||||
vmstate_unregister_ram(&pfl->orig_mem, DEVICE(pfl));
|
||||
error_setg(errp, "failed to read the initial flash content");
|
||||
|
|
|
@ -322,7 +322,6 @@ static inline void submit_requests(BlockBackend *blk, MultiReqBuffer *mrb,
|
|||
{
|
||||
QEMUIOVector *qiov = &mrb->reqs[start]->qiov;
|
||||
int64_t sector_num = mrb->reqs[start]->sector_num;
|
||||
int nb_sectors = mrb->reqs[start]->qiov.size / BDRV_SECTOR_SIZE;
|
||||
bool is_write = mrb->is_write;
|
||||
|
||||
if (num_reqs > 1) {
|
||||
|
@ -331,7 +330,7 @@ static inline void submit_requests(BlockBackend *blk, MultiReqBuffer *mrb,
|
|||
int tmp_niov = qiov->niov;
|
||||
|
||||
/* mrb->reqs[start]->qiov was initialized from external so we can't
|
||||
* modifiy it here. We need to initialize it locally and then add the
|
||||
* modify it here. We need to initialize it locally and then add the
|
||||
* external iovecs. */
|
||||
qemu_iovec_init(qiov, niov);
|
||||
|
||||
|
@ -343,23 +342,22 @@ static inline void submit_requests(BlockBackend *blk, MultiReqBuffer *mrb,
|
|||
qemu_iovec_concat(qiov, &mrb->reqs[i]->qiov, 0,
|
||||
mrb->reqs[i]->qiov.size);
|
||||
mrb->reqs[i - 1]->mr_next = mrb->reqs[i];
|
||||
nb_sectors += mrb->reqs[i]->qiov.size / BDRV_SECTOR_SIZE;
|
||||
}
|
||||
assert(nb_sectors == qiov->size / BDRV_SECTOR_SIZE);
|
||||
|
||||
trace_virtio_blk_submit_multireq(mrb, start, num_reqs, sector_num,
|
||||
nb_sectors, is_write);
|
||||
trace_virtio_blk_submit_multireq(mrb, start, num_reqs,
|
||||
sector_num << BDRV_SECTOR_BITS,
|
||||
qiov->size, is_write);
|
||||
block_acct_merge_done(blk_get_stats(blk),
|
||||
is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ,
|
||||
num_reqs - 1);
|
||||
}
|
||||
|
||||
if (is_write) {
|
||||
blk_aio_writev(blk, sector_num, qiov, nb_sectors,
|
||||
virtio_blk_rw_complete, mrb->reqs[start]);
|
||||
blk_aio_pwritev(blk, sector_num << BDRV_SECTOR_BITS, qiov, 0,
|
||||
virtio_blk_rw_complete, mrb->reqs[start]);
|
||||
} else {
|
||||
blk_aio_readv(blk, sector_num, qiov, nb_sectors,
|
||||
virtio_blk_rw_complete, mrb->reqs[start]);
|
||||
blk_aio_preadv(blk, sector_num << BDRV_SECTOR_BITS, qiov, 0,
|
||||
virtio_blk_rw_complete, mrb->reqs[start]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -554,9 +554,8 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|||
block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct,
|
||||
ioreq->v.size, BLOCK_ACCT_READ);
|
||||
ioreq->aio_inflight++;
|
||||
blk_aio_readv(blkdev->blk, ioreq->start / BLOCK_SIZE,
|
||||
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
||||
qemu_aio_complete, ioreq);
|
||||
blk_aio_preadv(blkdev->blk, ioreq->start, &ioreq->v, 0,
|
||||
qemu_aio_complete, ioreq);
|
||||
break;
|
||||
case BLKIF_OP_WRITE:
|
||||
case BLKIF_OP_FLUSH_DISKCACHE:
|
||||
|
@ -569,9 +568,8 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|||
ioreq->req.operation == BLKIF_OP_WRITE ?
|
||||
BLOCK_ACCT_WRITE : BLOCK_ACCT_FLUSH);
|
||||
ioreq->aio_inflight++;
|
||||
blk_aio_writev(blkdev->blk, ioreq->start / BLOCK_SIZE,
|
||||
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
||||
qemu_aio_complete, ioreq);
|
||||
blk_aio_pwritev(blkdev->blk, ioreq->start, &ioreq->v, 0,
|
||||
qemu_aio_complete, ioreq);
|
||||
break;
|
||||
case BLKIF_OP_DISCARD:
|
||||
{
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
#include "hw/scsi/scsi.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
|
||||
#define ATAPI_SECTOR_BITS (2 + BDRV_SECTOR_BITS)
|
||||
#define ATAPI_SECTOR_SIZE (1 << ATAPI_SECTOR_BITS)
|
||||
|
||||
static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
|
||||
|
||||
static void padstr8(uint8_t *buf, int buf_size, const char *src)
|
||||
|
@ -111,7 +114,7 @@ cd_read_sector_sync(IDEState *s)
|
|||
{
|
||||
int ret;
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
|
||||
#ifdef DEBUG_IDE_ATAPI
|
||||
printf("cd_read_sector_sync: lba=%d\n", s->lba);
|
||||
|
@ -119,12 +122,12 @@ cd_read_sector_sync(IDEState *s)
|
|||
|
||||
switch (s->cd_sector_size) {
|
||||
case 2048:
|
||||
ret = blk_read(s->blk, (int64_t)s->lba << 2,
|
||||
s->io_buffer, 4);
|
||||
ret = blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS,
|
||||
s->io_buffer, ATAPI_SECTOR_SIZE);
|
||||
break;
|
||||
case 2352:
|
||||
ret = blk_read(s->blk, (int64_t)s->lba << 2,
|
||||
s->io_buffer + 16, 4);
|
||||
ret = blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS,
|
||||
s->io_buffer + 16, ATAPI_SECTOR_SIZE);
|
||||
if (ret >= 0) {
|
||||
cd_data_to_raw(s->io_buffer, s->lba);
|
||||
}
|
||||
|
@ -182,7 +185,7 @@ static int cd_read_sector(IDEState *s)
|
|||
s->iov.iov_base = (s->cd_sector_size == 2352) ?
|
||||
s->io_buffer + 16 : s->io_buffer;
|
||||
|
||||
s->iov.iov_len = 4 * BDRV_SECTOR_SIZE;
|
||||
s->iov.iov_len = ATAPI_SECTOR_SIZE;
|
||||
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
||||
|
||||
#ifdef DEBUG_IDE_ATAPI
|
||||
|
@ -190,7 +193,7 @@ static int cd_read_sector(IDEState *s)
|
|||
#endif
|
||||
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
|
||||
ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, 4,
|
||||
cd_read_sector_cb, s);
|
||||
|
@ -435,7 +438,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
|
|||
#endif
|
||||
|
||||
s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset);
|
||||
s->bus->dma->iov.iov_len = n * 4 * 512;
|
||||
s->bus->dma->iov.iov_len = n * ATAPI_SECTOR_SIZE;
|
||||
qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1);
|
||||
|
||||
s->bus->dma->aiocb = ide_buffered_readv(s, (int64_t)s->lba << 2,
|
||||
|
|
|
@ -442,7 +442,7 @@ static void ide_issue_trim_cb(void *opaque, int ret)
|
|||
}
|
||||
|
||||
BlockAIOCB *ide_issue_trim(BlockBackend *blk,
|
||||
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
||||
int64_t offset, QEMUIOVector *qiov, BdrvRequestFlags flags,
|
||||
BlockCompletionFunc *cb, void *opaque)
|
||||
{
|
||||
TrimAIOCB *iocb;
|
||||
|
@ -616,8 +616,8 @@ BlockAIOCB *ide_buffered_readv(IDEState *s, int64_t sector_num,
|
|||
req->iov.iov_len = iov->size;
|
||||
qemu_iovec_init_external(&req->qiov, &req->iov, 1);
|
||||
|
||||
aioreq = blk_aio_readv(s->blk, sector_num, &req->qiov, nb_sectors,
|
||||
ide_buffered_readv_cb, req);
|
||||
aioreq = blk_aio_preadv(s->blk, sector_num << BDRV_SECTOR_BITS,
|
||||
&req->qiov, 0, ide_buffered_readv_cb, req);
|
||||
|
||||
QLIST_INSERT_HEAD(&s->buffered_requests, req, list);
|
||||
return aioreq;
|
||||
|
@ -1006,8 +1006,8 @@ static void ide_sector_write(IDEState *s)
|
|||
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
||||
s->pio_aiocb = blk_aio_writev(s->blk, sector_num, &s->qiov, n,
|
||||
ide_sector_write_cb, s);
|
||||
s->pio_aiocb = blk_aio_pwritev(s->blk, sector_num << BDRV_SECTOR_BITS,
|
||||
&s->qiov, 0, ide_sector_write_cb, s);
|
||||
}
|
||||
|
||||
static void ide_flush_cb(void *opaque, int ret)
|
||||
|
|
|
@ -614,7 +614,7 @@ void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
|
|||
void ide_transfer_stop(IDEState *s);
|
||||
void ide_set_inactive(IDEState *s, bool more);
|
||||
BlockAIOCB *ide_issue_trim(BlockBackend *blk,
|
||||
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
||||
int64_t offset, QEMUIOVector *qiov, BdrvRequestFlags flags,
|
||||
BlockCompletionFunc *cb, void *opaque);
|
||||
BlockAIOCB *ide_buffered_readv(IDEState *s, int64_t sector_num,
|
||||
QEMUIOVector *iov, int nb_sectors,
|
||||
|
|
|
@ -55,8 +55,8 @@ static const int debug_macio = 0;
|
|||
/*
|
||||
* Unaligned DMA read/write access functions required for OS X/Darwin which
|
||||
* don't perform DMA transactions on sector boundaries. These functions are
|
||||
* modelled on bdrv_co_do_preadv()/bdrv_co_do_pwritev() and so should be
|
||||
* easy to remove if the unaligned block APIs are ever exposed.
|
||||
* modelled on bdrv_co_preadv()/bdrv_co_pwritev() and so should be easy to
|
||||
* remove if the unaligned block APIs are ever exposed.
|
||||
*/
|
||||
|
||||
static void pmac_dma_read(BlockBackend *blk,
|
||||
|
@ -120,8 +120,7 @@ static void pmac_dma_read(BlockBackend *blk,
|
|||
MACIO_DPRINTF("--- Block read transfer - sector_num: %" PRIx64 " "
|
||||
"nsector: %x\n", (offset >> 9), (bytes >> 9));
|
||||
|
||||
s->bus->dma->aiocb = blk_aio_readv(blk, (offset >> 9), &io->iov,
|
||||
(bytes >> 9), cb, io);
|
||||
s->bus->dma->aiocb = blk_aio_preadv(blk, offset, &io->iov, 0, cb, io);
|
||||
}
|
||||
|
||||
static void pmac_dma_write(BlockBackend *blk,
|
||||
|
@ -205,8 +204,7 @@ static void pmac_dma_write(BlockBackend *blk,
|
|||
MACIO_DPRINTF("--- Block write transfer - sector_num: %" PRIx64 " "
|
||||
"nsector: %x\n", (offset >> 9), (bytes >> 9));
|
||||
|
||||
s->bus->dma->aiocb = blk_aio_writev(blk, (offset >> 9), &io->iov,
|
||||
(bytes >> 9), cb, io);
|
||||
s->bus->dma->aiocb = blk_aio_pwritev(blk, offset, &io->iov, 0, cb, io);
|
||||
}
|
||||
|
||||
static void pmac_dma_trim(BlockBackend *blk,
|
||||
|
@ -232,8 +230,7 @@ static void pmac_dma_trim(BlockBackend *blk,
|
|||
s->io_buffer_index += io->len;
|
||||
io->len = 0;
|
||||
|
||||
s->bus->dma->aiocb = ide_issue_trim(blk, (offset >> 9), &io->iov,
|
||||
(bytes >> 9), cb, io);
|
||||
s->bus->dma->aiocb = ide_issue_trim(blk, offset, &io->iov, 0, cb, io);
|
||||
}
|
||||
|
||||
static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
|
||||
|
|
|
@ -124,7 +124,7 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
|
|||
|
||||
alen = len;
|
||||
if (nvram->blk) {
|
||||
alen = blk_pwrite(nvram->blk, offset, membuf, len);
|
||||
alen = blk_pwrite(nvram->blk, offset, membuf, len, 0);
|
||||
}
|
||||
|
||||
assert(nvram->buf);
|
||||
|
@ -190,7 +190,7 @@ static int spapr_nvram_post_load(void *opaque, int version_id)
|
|||
sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(opaque);
|
||||
|
||||
if (nvram->blk) {
|
||||
int alen = blk_pwrite(nvram->blk, 0, nvram->buf, nvram->size);
|
||||
int alen = blk_pwrite(nvram->blk, 0, nvram->buf, nvram->size, 0);
|
||||
|
||||
if (alen < 0) {
|
||||
return alen;
|
||||
|
|
|
@ -108,7 +108,7 @@ static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
|
|||
scsi_req_complete(&r->req, CHECK_CONDITION);
|
||||
}
|
||||
|
||||
static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
||||
static void scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
||||
{
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||
|
||||
|
@ -118,7 +118,6 @@ static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
|||
}
|
||||
r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
|
||||
qemu_iovec_init_external(&r->qiov, &r->iov, 1);
|
||||
return r->qiov.size / 512;
|
||||
}
|
||||
|
||||
static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
|
||||
|
@ -316,7 +315,6 @@ done:
|
|||
static void scsi_do_read(SCSIDiskReq *r, int ret)
|
||||
{
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||
uint32_t n;
|
||||
|
||||
assert (r->req.aiocb == NULL);
|
||||
|
||||
|
@ -340,11 +338,12 @@ static void scsi_do_read(SCSIDiskReq *r, int ret)
|
|||
r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector,
|
||||
scsi_dma_complete, r);
|
||||
} else {
|
||||
n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
||||
scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
r->req.aiocb = blk_aio_readv(s->qdev.conf.blk, r->sector, &r->qiov, n,
|
||||
scsi_read_complete, r);
|
||||
r->qiov.size, BLOCK_ACCT_READ);
|
||||
r->req.aiocb = blk_aio_preadv(s->qdev.conf.blk,
|
||||
r->sector << BDRV_SECTOR_BITS, &r->qiov,
|
||||
0, scsi_read_complete, r);
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -504,7 +503,6 @@ static void scsi_write_data(SCSIRequest *req)
|
|||
{
|
||||
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||
uint32_t n;
|
||||
|
||||
/* No data transfer may already be in progress */
|
||||
assert(r->req.aiocb == NULL);
|
||||
|
@ -544,11 +542,11 @@ static void scsi_write_data(SCSIRequest *req)
|
|||
r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector,
|
||||
scsi_dma_complete, r);
|
||||
} else {
|
||||
n = r->qiov.size / 512;
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, r->sector, &r->qiov, n,
|
||||
scsi_write_complete, r);
|
||||
r->qiov.size, BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
|
||||
r->sector << BDRV_SECTOR_BITS, &r->qiov,
|
||||
0, scsi_write_complete, r);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1730,13 +1728,13 @@ static void scsi_write_same_complete(void *opaque, int ret)
|
|||
if (data->iov.iov_len) {
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
||||
/* blk_aio_write doesn't like the qiov size being different from
|
||||
* nb_sectors, make sure they match.
|
||||
*/
|
||||
/* Reinitialize qiov, to handle unaligned WRITE SAME request
|
||||
* where final qiov may need smaller size */
|
||||
qemu_iovec_init_external(&data->qiov, &data->iov, 1);
|
||||
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, data->sector,
|
||||
&data->qiov, data->iov.iov_len / 512,
|
||||
scsi_write_same_complete, data);
|
||||
r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
|
||||
data->sector << BDRV_SECTOR_BITS,
|
||||
&data->qiov, 0,
|
||||
scsi_write_same_complete, data);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1781,8 +1779,8 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|||
nb_sectors * s->qdev.blocksize,
|
||||
BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_write_zeroes(s->qdev.conf.blk,
|
||||
r->req.cmd.lba * (s->qdev.blocksize / 512),
|
||||
nb_sectors * (s->qdev.blocksize / 512),
|
||||
r->req.cmd.lba * s->qdev.blocksize,
|
||||
nb_sectors * s->qdev.blocksize,
|
||||
flags, scsi_aio_complete, r);
|
||||
return;
|
||||
}
|
||||
|
@ -1803,9 +1801,10 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|||
scsi_req_ref(&r->req);
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, data->sector,
|
||||
&data->qiov, data->iov.iov_len / 512,
|
||||
scsi_write_same_complete, data);
|
||||
r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
|
||||
data->sector << BDRV_SECTOR_BITS,
|
||||
&data->qiov, 0,
|
||||
scsi_write_same_complete, data);
|
||||
}
|
||||
|
||||
static void scsi_disk_emulate_write_data(SCSIRequest *req)
|
||||
|
|
51
hw/sd/sd.c
51
hw/sd/sd.c
|
@ -123,7 +123,6 @@ struct SDState {
|
|||
qemu_irq readonly_cb;
|
||||
qemu_irq inserted_cb;
|
||||
BlockBackend *blk;
|
||||
uint8_t *buf;
|
||||
|
||||
bool enable;
|
||||
};
|
||||
|
@ -551,7 +550,7 @@ static const VMStateDescription sd_vmstate = {
|
|||
VMSTATE_UINT64(data_start, SDState),
|
||||
VMSTATE_UINT32(data_offset, SDState),
|
||||
VMSTATE_UINT8_ARRAY(data, SDState, 512),
|
||||
VMSTATE_BUFFER_POINTER_UNSAFE(buf, SDState, 1, 512),
|
||||
VMSTATE_UNUSED_V(1, 512),
|
||||
VMSTATE_BOOL(enable, SDState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
},
|
||||
|
@ -1577,57 +1576,17 @@ send_response:
|
|||
|
||||
static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
|
||||
{
|
||||
uint64_t end = addr + len;
|
||||
|
||||
DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
|
||||
(unsigned long long) addr, len);
|
||||
if (!sd->blk || blk_read(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||
if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
|
||||
fprintf(stderr, "sd_blk_read: read error on host side\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (end > (addr & ~511) + 512) {
|
||||
memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
|
||||
|
||||
if (blk_read(sd->blk, end >> 9, sd->buf, 1) < 0) {
|
||||
fprintf(stderr, "sd_blk_read: read error on host side\n");
|
||||
return;
|
||||
}
|
||||
memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
|
||||
} else
|
||||
memcpy(sd->data, sd->buf + (addr & 511), len);
|
||||
}
|
||||
|
||||
static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
|
||||
{
|
||||
uint64_t end = addr + len;
|
||||
|
||||
if ((addr & 511) || len < 512)
|
||||
if (!sd->blk || blk_read(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||
fprintf(stderr, "sd_blk_write: read error on host side\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (end > (addr & ~511) + 512) {
|
||||
memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
|
||||
if (blk_write(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (blk_read(sd->blk, end >> 9, sd->buf, 1) < 0) {
|
||||
fprintf(stderr, "sd_blk_write: read error on host side\n");
|
||||
return;
|
||||
}
|
||||
memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
|
||||
if (blk_write(sd->blk, end >> 9, sd->buf, 1) < 0) {
|
||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||
}
|
||||
} else {
|
||||
memcpy(sd->buf + (addr & 511), sd->data, len);
|
||||
if (!sd->blk || blk_write(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||
}
|
||||
if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
|
||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1925,8 +1884,6 @@ static void sd_realize(DeviceState *dev, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
sd->buf = blk_blockalign(sd->blk, 512);
|
||||
|
||||
if (sd->blk) {
|
||||
blk_set_dev_ops(sd->blk, &sd_block_ops, sd);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue