Re: [Qemu-devel] [PATCH] block: allow resizing of images residing on host devices

2011-09-09 Thread Kevin Wolf
Am 07.09.2011 13:02, schrieb Christoph Hellwig:
> Allow to resize images that reside on host devices up to the available
> space.  This allows to grow images after resizing the device manually or
> vice versa.
> 
> Reviewed-by: Christoph Hellwig 

You mean Signed-off-by, no?

> Index: qemu/block/raw-posix.c
> ===
> --- qemu.orig/block/raw-posix.c   2011-09-01 17:37:42.579651525 +0200
> +++ qemu/block/raw-posix.c2011-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;

Coding style requires braces.

> +
> +if (S_ISREG(st.st_mode)) {
> +if (ftruncate(s->fd, offset) < 0)
> +return -errno;

Here as well.

> +} else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
> +   if (offset > raw_getlength(bs)) {
> +   return -EINVAL;
> +   }
> +   return 0;

This return isn't needed and it's not there in the S_ISREG case. It
should be symmetrical at least.

Semantically the patch looks okay.

Kevin



[Qemu-devel] [PATCH] block: allow resizing of images residing on host devices

2011-09-07 Thread Christoph Hellwig
Allow to resize images that reside on host devices up to the available
space.  This allows to grow images after resizing the device manually or
vice versa.

Reviewed-by: Christoph Hellwig 

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,