mirror of https://github.com/xemu-project/xemu.git
Drop internal bdrv_pread()/bdrv_pwrite() APIs (Avi Kivity)
Now that scsi generic no longer uses bdrv_pread() and bdrv_pwrite(), we can drop the corresponding internal APIs, which overlap bdrv_read()/bdrv_write() and, being byte oriented, are unnatural for a block device. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6824 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
04eeb8b6d6
commit
eda578e559
|
@ -358,6 +358,12 @@ static int raw_pread(BlockDriverState *bs, int64_t offset,
|
||||||
return raw_pread_aligned(bs, offset, buf, count) + sum;
|
return raw_pread_aligned(bs, offset, buf, count) + sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int raw_read(BlockDriverState *bs, int64_t sector_num,
|
||||||
|
uint8_t *buf, int nb_sectors)
|
||||||
|
{
|
||||||
|
return raw_pread(bs, sector_num * 512, buf, (uint64_t)nb_sectors * 512);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* offset and count are in bytes and possibly not aligned. For files opened
|
* offset and count are in bytes and possibly not aligned. For files opened
|
||||||
* with O_DIRECT, necessary alignments are ensured before calling
|
* with O_DIRECT, necessary alignments are ensured before calling
|
||||||
|
@ -436,6 +442,12 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset,
|
||||||
return raw_pwrite_aligned(bs, offset, buf, count) + sum;
|
return raw_pwrite_aligned(bs, offset, buf, count) + sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int raw_write(BlockDriverState *bs, int64_t sector_num,
|
||||||
|
const uint8_t *buf, int nb_sectors)
|
||||||
|
{
|
||||||
|
return raw_pwrite(bs, sector_num * 512, buf, (uint64_t)nb_sectors * 512);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_AIO
|
#ifdef CONFIG_AIO
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* Unix AIO using POSIX AIO */
|
/* Unix AIO using POSIX AIO */
|
||||||
|
@ -843,8 +855,8 @@ BlockDriver bdrv_raw = {
|
||||||
.aiocb_size = sizeof(RawAIOCB),
|
.aiocb_size = sizeof(RawAIOCB),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.bdrv_pread = raw_pread,
|
.bdrv_read = raw_read,
|
||||||
.bdrv_pwrite = raw_pwrite,
|
.bdrv_write = raw_write,
|
||||||
.bdrv_truncate = raw_truncate,
|
.bdrv_truncate = raw_truncate,
|
||||||
.bdrv_getlength = raw_getlength,
|
.bdrv_getlength = raw_getlength,
|
||||||
};
|
};
|
||||||
|
@ -1219,8 +1231,8 @@ BlockDriver bdrv_host_device = {
|
||||||
.aiocb_size = sizeof(RawAIOCB),
|
.aiocb_size = sizeof(RawAIOCB),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.bdrv_pread = raw_pread,
|
.bdrv_read = raw_read,
|
||||||
.bdrv_pwrite = raw_pwrite,
|
.bdrv_write = raw_write,
|
||||||
.bdrv_getlength = raw_getlength,
|
.bdrv_getlength = raw_getlength,
|
||||||
|
|
||||||
/* removable device support */
|
/* removable device support */
|
||||||
|
|
|
@ -122,13 +122,15 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_pread(BlockDriverState *bs, int64_t offset,
|
static int raw_read(BlockDriverState *bs, int64_t sector_num,
|
||||||
uint8_t *buf, int count)
|
uint8_t *buf, int nb_sectors)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
OVERLAPPED ov;
|
OVERLAPPED ov;
|
||||||
DWORD ret_count;
|
DWORD ret_count;
|
||||||
int ret;
|
int ret;
|
||||||
|
int64_t offset = sector_num * 512;
|
||||||
|
int count = nb_sectors * 512;
|
||||||
|
|
||||||
memset(&ov, 0, sizeof(ov));
|
memset(&ov, 0, sizeof(ov));
|
||||||
ov.Offset = offset;
|
ov.Offset = offset;
|
||||||
|
@ -146,13 +148,15 @@ static int raw_pread(BlockDriverState *bs, int64_t offset,
|
||||||
return ret_count;
|
return ret_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_pwrite(BlockDriverState *bs, int64_t offset,
|
static int raw_write(BlockDriverState *bs, int64_t sector_num,
|
||||||
const uint8_t *buf, int count)
|
const uint8_t *buf, int nb_sectors)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
OVERLAPPED ov;
|
OVERLAPPED ov;
|
||||||
DWORD ret_count;
|
DWORD ret_count;
|
||||||
int ret;
|
int ret;
|
||||||
|
int64_t offset = sector_num * 512;
|
||||||
|
int count = nb_sectors * 512;
|
||||||
|
|
||||||
memset(&ov, 0, sizeof(ov));
|
memset(&ov, 0, sizeof(ov));
|
||||||
ov.Offset = offset;
|
ov.Offset = offset;
|
||||||
|
@ -359,8 +363,8 @@ BlockDriver bdrv_raw = {
|
||||||
.bdrv_aio_cancel = raw_aio_cancel,
|
.bdrv_aio_cancel = raw_aio_cancel,
|
||||||
.aiocb_size = sizeof(RawAIOCB);
|
.aiocb_size = sizeof(RawAIOCB);
|
||||||
#endif
|
#endif
|
||||||
.bdrv_pread = raw_pread,
|
.bdrv_read = raw_read,
|
||||||
.bdrv_pwrite = raw_pwrite,
|
.bdrv_write = raw_write,
|
||||||
.bdrv_truncate = raw_truncate,
|
.bdrv_truncate = raw_truncate,
|
||||||
.bdrv_getlength = raw_getlength,
|
.bdrv_getlength = raw_getlength,
|
||||||
};
|
};
|
||||||
|
@ -508,7 +512,7 @@ BlockDriver bdrv_host_device = {
|
||||||
.bdrv_aio_cancel = raw_aio_cancel,
|
.bdrv_aio_cancel = raw_aio_cancel,
|
||||||
.aiocb_size = sizeof(RawAIOCB);
|
.aiocb_size = sizeof(RawAIOCB);
|
||||||
#endif
|
#endif
|
||||||
.bdrv_pread = raw_pread,
|
.bdrv_read = raw_read,
|
||||||
.bdrv_pwrite = raw_pwrite,
|
.bdrv_write = raw_write,
|
||||||
.bdrv_getlength = raw_getlength,
|
.bdrv_getlength = raw_getlength,
|
||||||
};
|
};
|
||||||
|
|
79
block.c
79
block.c
|
@ -142,7 +142,7 @@ static void bdrv_register(BlockDriver *bdrv)
|
||||||
bdrv->bdrv_aio_write = bdrv_aio_write_em;
|
bdrv->bdrv_aio_write = bdrv_aio_write_em;
|
||||||
bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em;
|
bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em;
|
||||||
bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync);
|
bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync);
|
||||||
} else if (!bdrv->bdrv_read && !bdrv->bdrv_pread) {
|
} else if (!bdrv->bdrv_read) {
|
||||||
/* add synchronous IO emulation layer */
|
/* add synchronous IO emulation layer */
|
||||||
bdrv->bdrv_read = bdrv_read_em;
|
bdrv->bdrv_read = bdrv_read_em;
|
||||||
bdrv->bdrv_write = bdrv_write_em;
|
bdrv->bdrv_write = bdrv_write_em;
|
||||||
|
@ -568,22 +568,7 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
|
||||||
if (bdrv_check_request(bs, sector_num, nb_sectors))
|
if (bdrv_check_request(bs, sector_num, nb_sectors))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (drv->bdrv_pread) {
|
return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
|
||||||
int ret, len;
|
|
||||||
len = nb_sectors * 512;
|
|
||||||
ret = drv->bdrv_pread(bs, sector_num * 512, buf, len);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
else if (ret != len)
|
|
||||||
return -EINVAL;
|
|
||||||
else {
|
|
||||||
bs->rd_bytes += (unsigned) len;
|
|
||||||
bs->rd_ops ++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return < 0 if error. Important errors are:
|
/* Return < 0 if error. Important errors are:
|
||||||
|
@ -603,27 +588,11 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
|
||||||
if (bdrv_check_request(bs, sector_num, nb_sectors))
|
if (bdrv_check_request(bs, sector_num, nb_sectors))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (drv->bdrv_pwrite) {
|
|
||||||
int ret, len, count = 0;
|
|
||||||
len = nb_sectors * 512;
|
|
||||||
do {
|
|
||||||
ret = drv->bdrv_pwrite(bs, sector_num * 512, buf, len - count);
|
|
||||||
if (ret < 0) {
|
|
||||||
printf("bdrv_write ret=%d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
count += ret;
|
|
||||||
buf += ret;
|
|
||||||
} while (count != len);
|
|
||||||
bs->wr_bytes += (unsigned) len;
|
|
||||||
bs->wr_ops ++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
|
return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bdrv_pread_em(BlockDriverState *bs, int64_t offset,
|
int bdrv_pread(BlockDriverState *bs, int64_t offset,
|
||||||
uint8_t *buf, int count1)
|
void *buf, int count1)
|
||||||
{
|
{
|
||||||
uint8_t tmp_buf[SECTOR_SIZE];
|
uint8_t tmp_buf[SECTOR_SIZE];
|
||||||
int len, nb_sectors, count;
|
int len, nb_sectors, count;
|
||||||
|
@ -666,8 +635,8 @@ static int bdrv_pread_em(BlockDriverState *bs, int64_t offset,
|
||||||
return count1;
|
return count1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bdrv_pwrite_em(BlockDriverState *bs, int64_t offset,
|
int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
|
||||||
const uint8_t *buf, int count1)
|
const void *buf, int count1)
|
||||||
{
|
{
|
||||||
uint8_t tmp_buf[SECTOR_SIZE];
|
uint8_t tmp_buf[SECTOR_SIZE];
|
||||||
int len, nb_sectors, count;
|
int len, nb_sectors, count;
|
||||||
|
@ -714,42 +683,6 @@ static int bdrv_pwrite_em(BlockDriverState *bs, int64_t offset,
|
||||||
return count1;
|
return count1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Read with byte offsets (needed only for file protocols)
|
|
||||||
*/
|
|
||||||
int bdrv_pread(BlockDriverState *bs, int64_t offset,
|
|
||||||
void *buf1, int count1)
|
|
||||||
{
|
|
||||||
BlockDriver *drv = bs->drv;
|
|
||||||
|
|
||||||
if (!drv)
|
|
||||||
return -ENOMEDIUM;
|
|
||||||
if (bdrv_check_byte_request(bs, offset, count1))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (!drv->bdrv_pread)
|
|
||||||
return bdrv_pread_em(bs, offset, buf1, count1);
|
|
||||||
return drv->bdrv_pread(bs, offset, buf1, count1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write with byte offsets (needed only for file protocols)
|
|
||||||
*/
|
|
||||||
int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
|
|
||||||
const void *buf1, int count1)
|
|
||||||
{
|
|
||||||
BlockDriver *drv = bs->drv;
|
|
||||||
|
|
||||||
if (!drv)
|
|
||||||
return -ENOMEDIUM;
|
|
||||||
if (bdrv_check_byte_request(bs, offset, count1))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (!drv->bdrv_pwrite)
|
|
||||||
return bdrv_pwrite_em(bs, offset, buf1, count1);
|
|
||||||
return drv->bdrv_pwrite(bs, offset, buf1, count1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Truncate file to 'offset' bytes (needed only for file protocols)
|
* Truncate file to 'offset' bytes (needed only for file protocols)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -58,10 +58,6 @@ struct BlockDriver {
|
||||||
int aiocb_size;
|
int aiocb_size;
|
||||||
|
|
||||||
const char *protocol_name;
|
const char *protocol_name;
|
||||||
int (*bdrv_pread)(BlockDriverState *bs, int64_t offset,
|
|
||||||
uint8_t *buf, int count);
|
|
||||||
int (*bdrv_pwrite)(BlockDriverState *bs, int64_t offset,
|
|
||||||
const uint8_t *buf, int count);
|
|
||||||
int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset);
|
int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset);
|
||||||
int64_t (*bdrv_getlength)(BlockDriverState *bs);
|
int64_t (*bdrv_getlength)(BlockDriverState *bs);
|
||||||
int (*bdrv_write_compressed)(BlockDriverState *bs, int64_t sector_num,
|
int (*bdrv_write_compressed)(BlockDriverState *bs, int64_t sector_num,
|
||||||
|
|
Loading…
Reference in New Issue