From: Eric Blake Date: Mon, 18 Nov 2013 22:24:05 +0000 (-0700) Subject: storage: improve handling of symlinks in gluster X-Git-Tag: v1.2.0-rc1~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79eb21f9765495841daecee2e3ec6bf402022327;p=thirdparty%2Flibvirt.git storage: improve handling of symlinks in gluster 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 --- diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c index 685ad57db2..f0ec35771f 100644 --- a/src/storage/storage_backend_gluster.c +++ b/src/storage/storage_backend_gluster.c @@ -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;