mirror of https://github.com/xemu-project/xemu.git
bdrv_write should not stop on partial write (Gleb Natapov)
Should return real error instead. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6323 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
c2b3b41a0b
commit
42fb2807d9
27
block.c
27
block.c
|
@ -565,21 +565,22 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
|
||||||
if (bs->read_only)
|
if (bs->read_only)
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
if (drv->bdrv_pwrite) {
|
if (drv->bdrv_pwrite) {
|
||||||
int ret, len;
|
int ret, len, count = 0;
|
||||||
len = nb_sectors * 512;
|
len = nb_sectors * 512;
|
||||||
ret = drv->bdrv_pwrite(bs, sector_num * 512, buf, len);
|
do {
|
||||||
if (ret < 0)
|
ret = drv->bdrv_pwrite(bs, sector_num * 512, buf, len - count);
|
||||||
return ret;
|
if (ret < 0) {
|
||||||
else if (ret != len)
|
printf("bdrv_write ret=%d\n", ret);
|
||||||
return -EIO;
|
return ret;
|
||||||
else {
|
}
|
||||||
bs->wr_bytes += (unsigned) len;
|
count += ret;
|
||||||
bs->wr_ops ++;
|
buf += ret;
|
||||||
return 0;
|
} while (count != len);
|
||||||
}
|
bs->wr_bytes += (unsigned) len;
|
||||||
} else {
|
bs->wr_ops ++;
|
||||||
return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
|
return 0;
|
||||||
}
|
}
|
||||||
|
return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bdrv_pread_em(BlockDriverState *bs, int64_t offset,
|
static int bdrv_pread_em(BlockDriverState *bs, int64_t offset,
|
||||||
|
|
Loading…
Reference in New Issue