On Fri, Jun 25, 2010 at 01:22:15PM -0400, Laine Stump wrote:
virStorageFileIsSharedFS would previously only work if the entire
path
in question was stat'able by the uid of the libvirtd process. This
patch changes it to crawl backwards up the path retrying the statfs
call until it gets to a partial path that *can* be stat'ed.
This is necessary to use the function to learn the fstype for files
stored as a different user (and readable only by that user) on a
root-squashed remote filesystem.
---
src/util/storage_file.c | 37 ++++++++++++++++++++++++++++++++++++-
1 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/src/util/storage_file.c b/src/util/storage_file.c
index 6cc8d5f..0adea40 100644
--- a/src/util/storage_file.c
+++ b/src/util/storage_file.c
@@ -434,9 +434,44 @@ virStorageFileGetMetadata(const char *path,
int virStorageFileIsSharedFS(const char *path)
{
+ char *dirpath, *p;
struct statfs sb;
+ int statfs_ret;
- if (statfs(path, &sb) < 0) {
+ if ((dirpath = strdup(path)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+
+ do {
+
+ /* Try less and less of the path until we get to a
+ * directory we can stat. Even if we don't have 'x'
+ * permission on any directory in the path on the NFS
+ * server (assuming it's NFS), we will be able to stat the
+ * mount point, and that will properly tell us if the
+ * fstype is NFS.
+ */
+
+ if ((p = strrchr(dirpath, '/')) == NULL) {
+ virReportSystemError(EINVAL,
+ _("Invalid relative path '%s'"), path);
+ VIR_FREE(dirpath);
+ return -1;
+ }
+
+ if (p == dirpath)
+ *(p+1) = '\0';
+ else
+ *p = '\0';
+
+ statfs_ret = statfs(dirpath, &sb);
+
+ } while ((statfs_ret < 0) && (p != dirpath));
+
+ VIR_FREE(dirpath);
+
+ if (statfs_ret < 0) {
virReportSystemError(errno,
_("cannot determine filesystem for
'%s'"),
path);
ACK
Daniel
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://deltacloud.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|