From 5079a7b3e2daf6dab793978776ffff0b7cadef90 Mon Sep 17 00:00:00 2001 From: Sascha Peilicke Date: Wed, 11 Jul 2012 16:34:58 +0100 Subject: [PATCH] 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. --- AUTHORS | 1 + src/storage/storage_backend_fs.c | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 64276aaa99..7eaeb26d47 100644 --- a/AUTHORS +++ b/AUTHORS @@ -247,6 +247,7 @@ Patches have also been contributed by: Viktor Mihajlovski Thang Pham Eiichi Tsukata + Sascha Peilicke [....send patches to get your name here....] diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 4894994649..451841bd29 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -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; } -- 2.47.2