diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 9ad38e1854..eae959c9ff 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -64,6 +64,7 @@ struct _virStorageVolDef { int type; /* enum virStorageVolType */ unsigned int building; + unsigned int in_use; virStorageVolSource source; virStorageSource target; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 2cb8347563..542b3827a4 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1640,6 +1640,13 @@ storageVolDelete(virStorageVolPtr obj, if (virStorageVolDeleteEnsureACL(obj->conn, pool->def, vol) < 0) goto cleanup; + if (vol->in_use) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("volume '%s' is still in use."), + vol->name); + goto cleanup; + } + if (vol->building) { virReportError(VIR_ERR_OPERATION_INVALID, _("volume '%s' is still being allocated."), @@ -1912,8 +1919,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, /* Drop the pool lock during volume allocation */ pool->asyncjobs++; - origvol->building = 1; newvol->building = 1; + origvol->in_use++; virStoragePoolObjUnlock(pool); if (origpool) { @@ -1929,7 +1936,7 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, virStoragePoolObjLock(origpool); storageDriverUnlock(driver); - origvol->building = 0; + origvol->in_use--; newvol->building = 0; allocation = newvol->target.allocation; pool->asyncjobs--; @@ -2076,6 +2083,13 @@ storageVolUpload(virStorageVolPtr obj, if (virStorageVolUploadEnsureACL(obj->conn, pool->def, vol) < 0) goto cleanup; + if (vol->in_use) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("volume '%s' is still in use."), + vol->name); + goto cleanup; + } + if (vol->building) { virReportError(VIR_ERR_OPERATION_INVALID, _("volume '%s' is still being allocated."), @@ -2167,6 +2181,13 @@ storageVolResize(virStorageVolPtr obj, if (virStorageVolResizeEnsureACL(obj->conn, pool->def, vol) < 0) goto cleanup; + if (vol->in_use) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("volume '%s' is still in use."), + vol->name); + goto cleanup; + } + if (vol->building) { virReportError(VIR_ERR_OPERATION_INVALID, _("volume '%s' is still being allocated."), @@ -2474,6 +2495,13 @@ storageVolWipePattern(virStorageVolPtr obj, if (virStorageVolWipePatternEnsureACL(obj->conn, pool->def, vol) < 0) goto cleanup; + if (vol->in_use) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("volume '%s' is still in use."), + vol->name); + goto cleanup; + } + if (vol->building) { virReportError(VIR_ERR_OPERATION_INVALID, _("volume '%s' is still being allocated."),