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:
aliguori 2009-01-15 20:43:39 +00:00
parent c2b3b41a0b
commit 42fb2807d9
1 changed files with 14 additions and 13 deletions

27
block.c
View File

@ -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,