<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 803e2eafa8325bab448633276c31fec7af1c4716 Mon Sep 17 00:00:00 2001
From: Kevin Wolf &lt;kwolf@redhat.com&gt;
Date: Tue, 14 Feb 2012 11:13:52 +0100
Subject: [PATCH 27/99] block: allow resizing of images residing on host
 devices

RH-Author: Kevin Wolf &lt;kwolf@redhat.com&gt;
Message-id: &lt;1329218101-24213-28-git-send-email-kwolf@redhat.com&gt;
Patchwork-id: 37228
O-Subject: [RHEL-6.3 qemu-kvm PATCH v2 27/96] block: allow resizing of images residing on host devices
Bugzilla: 783950
RH-Acked-by: Paolo Bonzini &lt;pbonzini@redhat.com&gt;
RH-Acked-by: Marcelo Tosatti &lt;mtosatti@redhat.com&gt;
RH-Acked-by: Laszlo Ersek &lt;lersek@redhat.com&gt;

From: Christoph Hellwig &lt;hch@lst.de&gt;

Bugzilla: 783950

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.

Signed-off-by: Christoph Hellwig &lt;hch@lst.de&gt;
Signed-off-by: Kevin Wolf &lt;kwolf@redhat.com&gt;
(cherry picked from commit 55b949c84761ade81ca93b2596ea45b09ad6d60a)
---
 block/raw-posix.c |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)

Signed-off-by: Michal Novotny &lt;minovotn@redhat.com&gt;
---
 block/raw-posix.c |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/block/raw-posix.c b/block/raw-posix.c
index 23bb484..df199a2 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -632,10 +632,24 @@ static void raw_close(BlockDriverState *bs)
 static int raw_truncate(BlockDriverState *bs, int64_t offset)
 {
     BDRVRawState *s = bs-&gt;opaque;
-    if (s-&gt;type != FTYPE_FILE)
-        return -ENOTSUP;
-    if (ftruncate(s-&gt;fd, offset) &lt; 0)
+    struct stat st;
+
+    if (fstat(s-&gt;fd, &amp;st)) {
         return -errno;
+    }
+
+    if (S_ISREG(st.st_mode)) {
+        if (ftruncate(s-&gt;fd, offset) &lt; 0) {
+            return -errno;
+        }
+    } else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
+       if (offset &gt; raw_getlength(bs)) {
+           return -EINVAL;
+       }
+    } else {
+        return -ENOTSUP;
+    }
+
     return 0;
 }
 
@@ -1060,6 +1074,7 @@ static BlockDriver bdrv_host_device = {
 
     .bdrv_read          = raw_read,
     .bdrv_write         = raw_write,
+    .bdrv_truncate      = raw_truncate,
     .bdrv_getlength	= raw_getlength,
 
     /* generic scsi device */
@@ -1156,6 +1171,7 @@ static BlockDriver bdrv_host_floppy = {
 
     .bdrv_read          = raw_read,
     .bdrv_write         = raw_write,
+    .bdrv_truncate      = raw_truncate,
     .bdrv_getlength	= raw_getlength,
 
     /* removable device support */
@@ -1252,6 +1268,7 @@ static BlockDriver bdrv_host_cdrom = {
 
     .bdrv_read          = raw_read,
     .bdrv_write         = raw_write,
+    .bdrv_truncate      = raw_truncate,
     .bdrv_getlength     = raw_getlength,
 
     /* removable device support */
@@ -1371,6 +1388,7 @@ static BlockDriver bdrv_host_cdrom = {
 
     .bdrv_read          = raw_read,
     .bdrv_write         = raw_write,
+    .bdrv_truncate      = raw_truncate,
     .bdrv_getlength     = raw_getlength,
 
     /* removable device support */
-- 
1.7.7.5

</pre></body></html>