]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: improve handling of symlinks in gluster
authorEric Blake <eblake@redhat.com>
Mon, 18 Nov 2013 22:24:05 +0000 (15:24 -0700)
committerEric Blake <eblake@redhat.com>
Mon, 25 Nov 2013 19:51:33 +0000 (12:51 -0700)
With this patch, dangling and looping symlinks are silently
ignored, while links to files and directories are treated the
same as the underlying file or directory.  This is the same
behavior as both 'directory' and 'netfs' pools.

* src/storage/storage_backend_gluster.c
(virStorageBackendGlusterRefreshVol): Treat symlinks similar to
directory and netfs pools.

Signed-off-by: Eric Blake <eblake@redhat.com>
src/storage/storage_backend_gluster.c

index 685ad57db2a18f4ddce52e19d9b1f17190f8451b..f0ec35771f1a9c251dc4ea5299d6ea9c440cffd9 100644 (file)
@@ -166,6 +166,17 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state,
     if (STREQ(name, ".") || STREQ(name, ".."))
         return 0;
 
+    /* Follow symlinks; silently skip broken links and loops.  */
+    if (S_ISLNK(st->st_mode) && glfs_stat(state->vol, name, st) < 0) {
+        if (errno == ENOENT || errno == ELOOP) {
+            VIR_WARN("ignoring dangling symlink '%s'", name);
+            ret = 0;
+        } else {
+            virReportSystemError(errno, _("cannot stat '%s'"), name);
+        }
+        return ret;
+    }
+
     if (VIR_ALLOC(vol) < 0)
         goto cleanup;