If there is a dangling symbol link in filesystem pool, the pool
will be failed to start or refresh, this patch is to fix it by
ignoring it with a warning log.
* src/storage/storage_backend.c
* src/storage/storage_backend_fs.c (update the comments)
---
src/storage/storage_backend.c | 10 +++++++++-
src/storage/storage_backend_fs.c | 2 +-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 10ea33c..caac42a 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -52,6 +52,7 @@
#include "storage_backend.h"
#include "logging.h"
#include "files.h"
+#include "areadlink.h"
#if WITH_STORAGE_LVM
# include "storage_backend_logical.h"
@@ -977,7 +978,8 @@ virStorageBackendForType(int type) {
/*
* Allows caller to silently ignore files with improper mode
*
- * Returns -1 on error, -2 if file mode is unexpected.
+ * Returns -1 on error, -2 if file mode is unexpected or symbol
+ * link is dangling.
*/
int
virStorageBackendVolOpenCheckMode(const char *path, unsigned int flags)
@@ -986,6 +988,12 @@ virStorageBackendVolOpenCheckMode(const char *path, unsigned int
flags)
struct stat sb;
if ((fd = open(path, O_RDONLY|O_NONBLOCK|O_NOCTTY)) < 0) {
+ if (areadlink(path)) {
+ VIR_WARN("cannot open volume '%s': %s", path,
+ strerror(errno));
+ return -2;
+ }
+
virReportSystemError(errno,
_("cannot open volume '%s'"),
path);
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index d916d2d..242508c 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -651,7 +651,7 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn
ATTRIBUTE_UNUSED,
goto cleanup;
else {
/* Silently ignore non-regular files,
- * eg '.' '..', 'lost+found' */
+ * eg '.' '..', 'lost+found', dangling symbol
link */
virStorageVolDefFree(vol);
vol = NULL;
continue;
--
1.7.3.2