diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/raw-posix.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/block/raw-posix.c b/block/raw-posix.c index 31b68ff813..8b1e67c063 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -117,6 +117,7 @@ typedef struct BDRVRawState { static int posix_aio_init(void); static int fd_open(BlockDriverState *bs); +static int64_t raw_getlength(BlockDriverState *bs); #if defined(__FreeBSD__) static int cdrom_reopen(BlockDriverState *bs); @@ -231,6 +232,16 @@ static int raw_pread_aligned(BlockDriverState *bs, int64_t offset, if (ret == count) goto label__raw_read__success; + /* Allow reads beyond the end (needed for pwrite) */ + if ((ret == 0) && bs->growable) { + int64_t size = raw_getlength(bs); + if (offset >= size) { + memset(buf, 0, count); + ret = count; + goto label__raw_read__success; + } + } + DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64 "] read failed %d : %d = %s\n", s->fd, bs->filename, offset, buf, count, |