Skip to contentSkip to conversation

block: allow resizing of images residing on host devices

PATCH Applied Christoph Hellwig 2 participants 2 messages Sep 20, 2011 – Sep 21, 2011 Block layer

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 block: allow resizing of images residing on host devices

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.

block/raw-posix.c +21 -3
Index: qemu/block/raw-posix.c
===================================================================
@@ -649,10 +649,24 @@ 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;
+       }
+    } else {
+        return -ENOTSUP;
+    }
+
     return 0;
 }
 
@@ -1171,6 +1185,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,
@@ -1292,6 +1307,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,
@@ -1393,6 +1409,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,
@@ -1514,6 +1531,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,
Applied
#1 lore raw

Am 21.09.2011 01:10, schrieb Christoph Hellwig:

Quoted 5 lines

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.

Thanks, applied to the block branch.

Kevin