[libvirt] [PATCHv2 2/4] Enhance virStorageFileIsSharedFS
Daniel P. Berrange
berrange at redhat.com
Mon Jun 28 15:44:07 UTC 2010
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 :|
More information about the libvir-list
mailing list