[libvirt] [PATCHv8 01/11] storage: let format probing work on root-squash NFS

Daniel Veillard veillard at redhat.com
Mon Oct 22 13:33:04 UTC 2012


On Sat, Oct 20, 2012 at 03:47:10PM -0600, Eric Blake wrote:
> Yet another instance of where using plain open() mishandles files
> that live on root-squash NFS, and where improving the API can
> improve the chance of a successful probe.
> 
> * src/util/storage_file.h (virStorageFileProbeFormat): Alter
> signature.
> * src/util/storage_file.c (virStorageFileProbeFormat): Use better
> method for opening file.
> * src/qemu/qemu_driver.c (qemuDomainGetBlockInfo): Update caller.
> * src/storage/storage_backend_fs.c (virStorageBackendProbeTarget):
> Likewise.
> ---
> 
> v8: new patch
> 
>  src/qemu/qemu_driver.c           | 3 ++-
>  src/storage/storage_backend_fs.c | 2 +-
>  src/util/storage_file.c          | 4 ++--
>  src/util/storage_file.h          | 2 +-
>  4 files changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index feda4d9..dc9c62c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -9309,7 +9309,8 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
>          format = disk->format;
>      } else {
>          if (driver->allowDiskFormatProbing) {
> -            if ((format = virStorageFileProbeFormat(disk->src)) < 0)
> +            if ((format = virStorageFileProbeFormat(disk->src, driver->user,
> +                                                    driver->group)) < 0)
>                  goto cleanup;
>          } else {
>              virReportError(VIR_ERR_INTERNAL_ERROR,
> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index cecc2d2..30e203c 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -104,7 +104,7 @@ virStorageBackendProbeTarget(virStorageVolTargetPtr target,
>          meta->backingStore = NULL;
>          if (meta->backingStoreFormat == VIR_STORAGE_FILE_AUTO &&
>              meta->backingStoreIsFile) {
> -            if ((ret = virStorageFileProbeFormat(*backingStore)) < 0) {
> +            if ((ret = virStorageFileProbeFormat(*backingStore, -1, -1)) < 0) {
>                  /* If the backing file is currently unavailable, only log an error,
>                   * but continue. Returning -1 here would disable the whole storage
>                   * pool, making it unavailable for even maintenance. */
> diff --git a/src/util/storage_file.c b/src/util/storage_file.c
> index 882df6e..e0b4178 100644
> --- a/src/util/storage_file.c
> +++ b/src/util/storage_file.c
> @@ -830,11 +830,11 @@ cleanup:
>   * Best option: Don't use this function
>   */
>  int
> -virStorageFileProbeFormat(const char *path)
> +virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid)
>  {
>      int fd, ret;
> 
> -    if ((fd = open(path, O_RDONLY)) < 0) {
> +    if ((fd = virFileOpenAs(path, O_RDONLY, 0, uid, gid, 0)) < 0) {
>          virReportSystemError(errno, _("cannot open file '%s'"), path);
>          return -1;
>      }
> diff --git a/src/util/storage_file.h b/src/util/storage_file.h
> index 9b00dba..abfaca9 100644
> --- a/src/util/storage_file.h
> +++ b/src/util/storage_file.h
> @@ -66,7 +66,7 @@ struct _virStorageFileMetadata {
>  #  define DEV_BSIZE 512
>  # endif
> 
> -int virStorageFileProbeFormat(const char *path);
> +int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid);
>  int virStorageFileProbeFormatFromFD(const char *path,
>                                      int fd);
> 

  I don't see how passing more context informations could be a bad idea
and usually we can't predict when something may break various NFS
scenario except by testing the code, ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list