On Tue, 3 Jul 2018 12:01:55 +0200
Marc-André Lureau <marcandre.lur...@gmail.com> wrote:

> Hi
> 
> On Tue, Jul 3, 2018 at 10:31 AM, Tomáš Golembiovský <tgole...@redhat.com> 
> wrote:
> > Report total file system size and free space in output of command
> > "guest-get-fsinfo". Values are optional and it is not an error if they 
> > cannot
> > be retrieved for some reason.
> >  
> 
> I am afraid this will miss 3.0, since it's a new feature

I kind of expected this.

> > Signed-off-by: Tomáš Golembiovský <tgole...@redhat.com>
> > ---
> >  qga/commands-posix.c | 18 ++++++++++++++++++
> >  qga/commands-win32.c | 16 ++++++++++++++++
> >  qga/qapi-schema.json |  5 ++++-
> >  3 files changed, 38 insertions(+), 1 deletion(-)
> >
> > diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> > index eae817191b..1f2fb25b91 100644
> > --- a/qga/commands-posix.c
> > +++ b/qga/commands-posix.c
> > @@ -13,6 +13,7 @@
> >
> >  #include "qemu/osdep.h"
> >  #include <sys/ioctl.h>
> > +#include <sys/statvfs.h>
> >  #include <sys/utsname.h>
> >  #include <sys/wait.h>
> >  #include <dirent.h>
> > @@ -1074,11 +1075,28 @@ static GuestFilesystemInfo 
> > *build_guest_fsinfo(struct FsMount *mount,
> >      GuestFilesystemInfo *fs = g_malloc0(sizeof(*fs));
> >      char *devpath = g_strdup_printf("/sys/dev/block/%u:%u",
> >                                      mount->devmajor, mount->devminor);
> > +    struct statvfs vfs_stats;
> >
> >      fs->mountpoint = g_strdup(mount->dirname);
> >      fs->type = g_strdup(mount->devtype);
> >      build_guest_fsinfo_for_device(devpath, fs, errp);
> >
> > +    g_debug(" get filesystem statistics for '%s'", mount->dirname);
> > +    if (statvfs(mount->dirname, &vfs_stats) != 0) {
> > +        /* This is not fatal, just log this incident */
> > +        Error *local_err = NULL;
> > +        error_setg_errno(&local_err, errno, "statfs(\"%s\")",  
> 
> statvfs()
> 
> > +            mount->dirname);
> > +        slog("failed to stat filesystem: %s",
> > +            error_get_pretty(local_err));
> > +        error_free(local_err);  
> 
> The usage of Error is a bit overkill, perhaps you may juste use slog()
> / strerror() directly.
> 
> > +    } else {
> > +        fs->size = vfs_stats.f_frsize * vfs_stats.f_blocks;
> > +        fs->has_size = true;
> > +        fs->free = vfs_stats.f_frsize * vfs_stats.f_bfree;
> > +        fs->has_free = true;
> > +    }
> > +
> >      g_free(devpath);
> >      return fs;
> >  }
> > diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> > index 70ee5379f6..6d6ca05281 100644
> > --- a/qga/commands-win32.c
> > +++ b/qga/commands-win32.c
> > @@ -706,6 +706,22 @@ static GuestFilesystemInfo *build_guest_fsinfo(char 
> > *guid, Error **errp)
> >      }
> >      fs->type = g_strdup(fs_name);
> >      fs->disk = build_guest_disk_info(guid, errp);
> > +
> > +    if (len > 0) {
> > +        if (GetDiskFreeSpaceEx(mnt_point, 0, (PULARGE_INTEGER)&fs->size,
> > +                (PULARGE_INTEGER)&fs->free) != 0) {  
> 
> I would rather use some local ULARGE_INTEGER and access the QuadPart
> to avoid the cast, but it should work.

I tried that, but the returned values were nonsensical. Maybe I did
something wrong along the way. I'll give it one more try.

Thanks for quick response,

    Tomas

> 
> > +            /* This is not fatal, just log this incident */
> > +            Error *local_err = NULL;
> > +            error_setg_win32(&local_err, GetLastError(),
> > +                "failed to get free space on volume \"%s\"", mnt_point);
> > +            slog("%s", error_get_pretty(local_err));
> > +            error_free(local_err);
> > +        } else {
> > +            fs->has_size = true;
> > +            fs->has_free = true;
> > +        }
> > +    }
> > +
> >  free:
> >      g_free(mnt_point);
> >      return fs;
> > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> > index 17884c7c70..28a32444d3 100644
> > --- a/qga/qapi-schema.json
> > +++ b/qga/qapi-schema.json
> > @@ -848,12 +848,15 @@
> >  # @type: file system type string
> >  # @disk: an array of disk hardware information that the volume lies on,
> >  #        which may be empty if the disk type is not supported
> > +# @size: total number of bytes on the file system (Since 2.13)
> > +# @free: number of bytes available on the file system (Since 2.13)  
> 
> "Since 3.1", most probably
> 
> >  #
> >  # Since: 2.2
> >  ##
> >  { 'struct': 'GuestFilesystemInfo',
> >    'data': {'name': 'str', 'mountpoint': 'str', 'type': 'str',
> > -           'disk': ['GuestDiskAddress']} }
> > +           'disk': ['GuestDiskAddress'], '*size': 'uint64',
> > +           '*free': 'uint64'} }
> >
> >  ##
> >  # @guest-get-fsinfo:
> > --
> > 2.17.1
> >
> >  
> 
> 
> 
> -- 
> Marc-André Lureau


-- 
Tomáš Golembiovský <tgole...@redhat.com>

Reply via email to