1699
storageVolumeResize(virStorageVolPtr obj,
1700
unsigned long long capacity,
1703
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1704
virStorageBackendPtr backend;
1705
virStoragePoolObjPtr pool = NULL;
1706
virStorageVolDefPtr vol = NULL;
1707
unsigned long long abs_capacity;
1710
virCheckFlags(VIR_STORAGE_VOL_RESIZE_DELTA, -1);
1712
storageDriverLock(driver);
1713
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1714
storageDriverUnlock(driver);
1717
virStorageReportError(VIR_ERR_NO_STORAGE_POOL,
1718
_("no storage pool with matching uuid"));
1722
if (!virStoragePoolObjIsActive(pool)) {
1723
virStorageReportError(VIR_ERR_OPERATION_INVALID,
1724
_("storage pool is not active"));
1728
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
1731
vol = virStorageVolDefFindByName(pool, obj->name);
1734
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
1735
_("no storage vol with matching name '%s'"),
1740
if (vol->building) {
1741
virStorageReportError(VIR_ERR_OPERATION_INVALID,
1742
_("volume '%s' is still being allocated."),
1747
if (flags & VIR_STORAGE_VOL_RESIZE_DELTA) {
1748
abs_capacity = vol->capacity + capacity;
1749
flags &= ~VIR_STORAGE_VOL_RESIZE_DELTA;
1751
abs_capacity = capacity;
1754
if (abs_capacity < vol->allocation) {
1755
virStorageReportError(VIR_ERR_INVALID_ARG,
1756
_("can't shrink capacity below "
1757
"existing allocation"));
1761
if (abs_capacity > vol->capacity + pool->def->available) {
1762
virStorageReportError(VIR_ERR_OPERATION_FAILED,
1763
_("Not enough space left on storage pool"));
1767
if (!backend->resizeVol) {
1768
virStorageReportError(VIR_ERR_NO_SUPPORT,
1769
_("storage pool does not support changing of "
1770
"volume capacity"));
1774
if (backend->resizeVol(obj->conn, pool, vol, abs_capacity, flags) < 0)
1777
vol->capacity = abs_capacity;
1782
virStoragePoolObjUnlock(pool);
1700
1787
/* If the volume we're wiping is already a sparse file, we simply
1701
1788
* truncate and extend it to its original size, filling it with
1828
if (S_ISREG(st.st_mode) && st.st_blocks < (st.st_size / DEV_BSIZE)) {
1829
ret = storageVolumeZeroSparseFile(def, st.st_size, fd);
1918
if (algorithm != VIR_STORAGE_VOL_WIPE_ALG_ZERO) {
1919
const char *alg_char ATTRIBUTE_UNUSED = NULL;
1920
switch (algorithm) {
1921
case VIR_STORAGE_VOL_WIPE_ALG_NNSA:
1924
case VIR_STORAGE_VOL_WIPE_ALG_DOD:
1927
case VIR_STORAGE_VOL_WIPE_ALG_BSI:
1930
case VIR_STORAGE_VOL_WIPE_ALG_GUTMANN:
1931
alg_char = "gutmann";
1933
case VIR_STORAGE_VOL_WIPE_ALG_SCHNEIER:
1934
alg_char = "schneier";
1936
case VIR_STORAGE_VOL_WIPE_ALG_PFITZNER7:
1937
alg_char = "pfitzner7";
1939
case VIR_STORAGE_VOL_WIPE_ALG_PFITZNER33:
1940
alg_char = "pfitzner33";
1942
case VIR_STORAGE_VOL_WIPE_ALG_RANDOM:
1943
alg_char = "random";
1946
virStorageReportError(VIR_ERR_INVALID_ARG,
1947
_("unsupported algorithm %d"),
1950
cmd = virCommandNew(SCRUB);
1951
virCommandAddArgList(cmd, "-f", "-p", alg_char,
1952
def->target.path, NULL);
1954
if (virCommandRun(cmd, NULL) < 0)
1832
if (VIR_ALLOC_N(writebuf, st.st_blksize) != 0) {
1833
virReportOOMError();
1960
if (S_ISREG(st.st_mode) && st.st_blocks < (st.st_size / DEV_BSIZE)) {
1961
ret = storageVolumeZeroSparseFile(def, st.st_size, fd);
1964
if (VIR_ALLOC_N(writebuf, st.st_blksize) != 0) {
1965
virReportOOMError();
1969
ret = storageWipeExtent(def,
1837
ret = storageWipeExtent(def,
1980
virCommandFree(cmd);
1847
1981
VIR_FREE(writebuf);
1849
1982
VIR_FORCE_CLOSE(fd);
1988
storageVolumeWipePattern(virStorageVolPtr obj,
1989
unsigned int algorithm,
1992
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1993
virStoragePoolObjPtr pool = NULL;
1994
virStorageVolDefPtr vol = NULL;
1997
virCheckFlags(0, -1);
1999
if (algorithm >= VIR_STORAGE_VOL_WIPE_ALG_LAST) {
2000
virStorageReportError(VIR_ERR_INVALID_ARG,
2001
_("wiping algorithm %d not supported"),
2006
storageDriverLock(driver);
2007
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
2008
storageDriverUnlock(driver);
2011
virStorageReportError(VIR_ERR_NO_STORAGE_POOL,
2012
"%s", _("no storage pool with matching uuid"));
2016
if (!virStoragePoolObjIsActive(pool)) {
2017
virStorageReportError(VIR_ERR_OPERATION_INVALID,
2018
"%s", _("storage pool is not active"));
2022
vol = virStorageVolDefFindByName(pool, obj->name);
2025
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
2026
_("no storage vol with matching name '%s'"),
2031
if (vol->building) {
2032
virStorageReportError(VIR_ERR_OPERATION_INVALID,
2033
_("volume '%s' is still being allocated."),
2038
if (storageVolumeWipeInternal(vol, algorithm) == -1) {
2046
virStoragePoolObjUnlock(pool);
1856
2054
storageVolumeWipe(virStorageVolPtr obj,
1857
2055
unsigned int flags)
1859
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1860
virStoragePoolObjPtr pool = NULL;
1861
virStorageVolDefPtr vol = NULL;
1864
virCheckFlags(0, -1);
1866
storageDriverLock(driver);
1867
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1868
storageDriverUnlock(driver);
1871
virStorageReportError(VIR_ERR_NO_STORAGE_POOL,
1872
"%s", _("no storage pool with matching uuid"));
1876
if (!virStoragePoolObjIsActive(pool)) {
1877
virStorageReportError(VIR_ERR_OPERATION_INVALID,
1878
"%s", _("storage pool is not active"));
1882
vol = virStorageVolDefFindByName(pool, obj->name);
1885
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
1886
_("no storage vol with matching name '%s'"),
1891
if (vol->building) {
1892
virStorageReportError(VIR_ERR_OPERATION_INVALID,
1893
_("volume '%s' is still being allocated."),
1898
if (storageVolumeWipeInternal(vol) == -1) {
1906
virStoragePoolObjUnlock(pool);
2057
return storageVolumeWipePattern(obj, VIR_STORAGE_VOL_WIPE_ALG_ZERO, flags);
2175
2322
.volUpload = storageVolumeUpload, /* 0.9.0 */
2176
2323
.volDelete = storageVolumeDelete, /* 0.4.0 */
2177
2324
.volWipe = storageVolumeWipe, /* 0.8.0 */
2325
.volWipePattern = storageVolumeWipePattern, /* 0.9.10 */
2178
2326
.volGetInfo = storageVolumeGetInfo, /* 0.4.0 */
2179
2327
.volGetXMLDesc = storageVolumeGetXMLDesc, /* 0.4.0 */
2180
2328
.volGetPath = storageVolumeGetPath, /* 0.4.0 */
2329
.volResize = storageVolumeResize, /* 0.9.10 */
2182
2331
.poolIsActive = storagePoolIsActive, /* 0.7.3 */
2183
2332
.poolIsPersistent = storagePoolIsPersistent, /* 0.7.3 */