]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Forbid to shrink the vol's capacity if no --shrink is specified
authorOsier Yang <jyang@redhat.com>
Fri, 31 May 2013 05:16:15 +0000 (13:16 +0800)
committerOsier Yang <jyang@redhat.com>
Wed, 5 Jun 2013 10:40:43 +0000 (18:40 +0800)
As the document for "virsh-resize" says:
<...>
Attempts to shrink the volume will fail unless I<--shrink> is present;
</...>

This makes sense as it at least prevent the user shrinking the important
data of volume without a notice.

src/storage/storage_driver.c

index e7516eb040e1a5b5760f67538bcf8ca751d006c7..858aeca163aad25011d8fa7bf2858446f4068a4a 100644 (file)
@@ -1762,7 +1762,8 @@ storageVolResize(virStorageVolPtr obj,
     int ret = -1;
 
     virCheckFlags(VIR_STORAGE_VOL_RESIZE_ALLOCATE |
-                  VIR_STORAGE_VOL_RESIZE_DELTA, -1);
+                  VIR_STORAGE_VOL_RESIZE_DELTA |
+                  VIR_STORAGE_VOL_RESIZE_SHRINK, -1);
 
     storageDriverLock(driver);
     pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
@@ -1814,6 +1815,14 @@ storageVolResize(virStorageVolPtr obj,
         goto out;
     }
 
+    if (abs_capacity < vol->capacity &&
+        !(flags & VIR_STORAGE_VOL_RESIZE_SHRINK)) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("Can't shrink capacity below current "
+                         "capacity with shrink flag explicitly specified"));
+        goto out;
+    }
+
     if (abs_capacity > vol->capacity + pool->def->available) {
         virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                        _("Not enough space left on storage pool"));