Fix directory removal in filesystem storage driver

Fix the virStorageBackendFileSystemVolDelete method to not use
unlink() unconditionally. It must use rmdir() for volumes which
are directories. It should also raise an error if given a volume
which has the network/block type.
This commit is contained in:
Sascha Peilicke 2012-07-11 16:34:58 +01:00 committed by Daniel P. Berrange
parent 8a544719aa
commit 5079a7b3e2
2 changed files with 25 additions and 5 deletions

View File

@ -247,6 +247,7 @@ Patches have also been contributed by:
Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Thang Pham <thang.pham@us.ibm.com>
Eiichi Tsukata <eiichi.tsukata.xh@hitachi.com>
Sascha Peilicke <saschpe@suse.de>
[....send patches to get your name here....]

View File

@ -1127,7 +1127,7 @@ virStorageBackendFileSystemVolBuildFrom(virConnectPtr conn,
}
/**
* Remove a volume - just unlinks for now
* Remove a volume - no support for BLOCK and NETWORK yet
*/
static int
virStorageBackendFileSystemVolDelete(virConnectPtr conn ATTRIBUTE_UNUSED,
@ -1137,14 +1137,33 @@ virStorageBackendFileSystemVolDelete(virConnectPtr conn ATTRIBUTE_UNUSED,
{
virCheckFlags(0, -1);
if (unlink(vol->target.path) < 0) {
/* Silently ignore failures where the vol has already gone away */
if (errno != ENOENT) {
switch (vol->type) {
case VIR_STORAGE_VOL_FILE:
if (unlink(vol->target.path) < 0) {
/* Silently ignore failures where the vol has already gone away */
if (errno != ENOENT) {
virReportSystemError(errno,
_("cannot unlink file '%s'"),
vol->target.path);
return -1;
}
}
break;
case VIR_STORAGE_VOL_DIR:
if (rmdir(vol->target.path) < 0) {
virReportSystemError(errno,
_("cannot unlink file '%s'"),
_("cannot remove directory '%s'"),
vol->target.path);
return -1;
}
break;
case VIR_STORAGE_VOL_BLOCK:
case VIR_STORAGE_VOL_NETWORK:
default:
virStorageReportError(VIR_ERR_NO_SUPPORT,
_("removing block or network volumes is not supported: %s"),
vol->target.path);
return -1;
}
return 0;
}