On Thu, Sep 01, 2011 at 05:55:43PM +0200, Christoph Hellwig wrote: > Please try the attached (untested) patch:
Yes, this patch worked succesfully with the following test case: $ dd if=/dev/zero of=loop.img bs=1M seek=100 count=0 $ losetup -f loop.img $ ./x86_64-softmmu/qemu-system-x86_64 -hda /dev/loop0 -monitor stdio (qemu) info block ide0-hd0: removable=0 file=/dev/loop0 sectors=204800 ro=0 drv=raw encrypted=0 ide1-cd0: removable=1 locked=0 [not inserted] floppy0: removable=1 locked=0 [not inserted] sd0: removable=1 locked=0 [not inserted] $ dd if=/dev/zero of=loop.img bs=1M seek=200 count=0 $ losetup -c /dev/loop0 (qemu) block_resize ide0-hd0 200 (qemu) info block ide0-hd0: removable=0 file=/dev/loop0 sectors=409600 ro=0 drv=raw encrypted=0 ide1-cd0: removable=1 locked=0 [not inserted] floppy0: removable=1 locked=0 [not inserted] sd0: removable=1 locked=0 [not inserted] Regards, Daniel > Index: qemu/block/raw-posix.c > =================================================================== > --- qemu.orig/block/raw-posix.c 2011-09-01 17:37:42.579651525 +0200 > +++ qemu/block/raw-posix.c 2011-09-01 17:43:28.882967337 +0200 > @@ -645,10 +645,23 @@ static void raw_close(BlockDriverState * > static int raw_truncate(BlockDriverState *bs, int64_t offset) > { > BDRVRawState *s = bs->opaque; > - if (s->type != FTYPE_FILE) > - return -ENOTSUP; > - if (ftruncate(s->fd, offset) < 0) > + struct stat st; > + > + if (fstat(s->fd, &st)) > return -errno; > + > + if (S_ISREG(st.st_mode)) { > + if (ftruncate(s->fd, offset) < 0) > + return -errno; > + } else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) { > + if (offset > raw_getlength(bs)) { > + return -EINVAL; > + } > + return 0; > + > + } else { > + return -ENOTSUP; > + } > return 0; > } > > @@ -1167,6 +1180,7 @@ static BlockDriver bdrv_host_device = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > @@ -1288,6 +1302,7 @@ static BlockDriver bdrv_host_floppy = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > @@ -1389,6 +1404,7 @@ static BlockDriver bdrv_host_cdrom = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > @@ -1510,6 +1526,7 @@ static BlockDriver bdrv_host_cdrom = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size,