[libvirt] [PATCHv2 3/4] use virStorageFileIsSharedFS utility function in qemudDomainSaveFlag

Daniel P. Berrange berrange at redhat.com
Mon Jun 28 15:45:24 UTC 2010


On Fri, Jun 25, 2010 at 01:22:16PM -0400, Laine Stump wrote:
> Previously, this function had it's own bit of code performing the same
> function. Since there's now an equivalent utility function, let's use it.
> ---
>  src/qemu/qemu_driver.c |   83 +++++++++++++----------------------------------
>  1 files changed, 23 insertions(+), 60 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 9140b50..b248fdb 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -46,13 +46,6 @@
>  #include <sys/ioctl.h>
>  #include <sys/un.h>
>  
> -#ifdef __linux__
> -# include <sys/vfs.h>
> -# ifndef NFS_SUPER_MAGIC
> -#  define NFS_SUPER_MAGIC 0x6969
> -# endif /* NFS_SUPER_MAGIC */
> -#endif /* __linux__ */
> -
>  #include "virterror_internal.h"
>  #include "logging.h"
>  #include "datatypes.h"
> @@ -5069,62 +5062,32 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
>                  goto endjob;
>              }
>  
> -#ifdef __linux__
>              /* On Linux we can also verify the FS-type of the directory. */
> -            char *dirpath, *p;
> -            struct statfs st;
> -            int statfs_ret;
> -
> -            if ((dirpath = strdup(path)) == NULL) {
> -                virReportOOMError();
> -                goto endjob;
> -            }
> -
> -            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) {
> -                    qemuReportError(VIR_ERR_INVALID_ARG,
> -                                    _("Invalid relative path '%s' for domain save file"),
> -                                    path);
> -                    VIR_FREE(dirpath);
> -                    goto endjob;
> -                }
> -
> -                if (p == dirpath)
> -                    *(p+1) = '\0';
> -                else
> -                    *p = '\0';
> -
> -                statfs_ret = statfs(dirpath, &st);
> -
> -            } while ((statfs_ret == -1) && (p != dirpath));
> -
> -            if (statfs_ret == -1) {
> -                virReportSystemError(errno,
> -                                     _("Failed to create domain save file "
> -                                       "'%s': statfs of all elements of path "
> -                                       "failed"),
> -                                     path);
> -                VIR_FREE(dirpath);
> -                goto endjob;
> -            }
> +            switch (virStorageFileIsSharedFS(path)) {
> +                case 1:
> +                   /* it was on a network share, so we'll continue
> +                    * as outlined above
> +                    */
> +                   break;
> +
> +                case -1:
> +                   virReportSystemError(errno,
> +                                        _("Failed to create domain save file "
> +                                          "'%s': couldn't determine fs type"),
> +                                        path);
> +                   goto endjob;
> +                   break;
> +
> +                case 0:
> +                default:
> +                   /* local file - log the error returned by virFileOperation */
> +                   virReportSystemError(rc,
> +                                        _("Failed to create domain save file '%s'"),
> +                                        path);
> +                   goto endjob;
> +                   break;
>  
> -            if (st.f_type != NFS_SUPER_MAGIC) {
> -                virReportSystemError(rc,
> -                                     _("Failed to create domain save file '%s'"
> -                                       " (fstype of '%s' is 0x%X"),
> -                                     path, dirpath, (unsigned int) st.f_type);
> -                VIR_FREE(dirpath);
> -                goto endjob;
>              }
> -            VIR_FREE(dirpath);
> -#endif
>  
>              /* Retry creating the file as driver->user */

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