Message ID | 20180601152746.17169-2-chen_han_xiao@126.com |
---|---|
State | New |
Headers | show |
Series | qga: report the usage of fs in | expand |
On 06/01/2018 10:27 AM, Chen Hanxiao wrote: > From: Chen Hanxiao <chenhanxiao@gmail.com> > > This patch adds support for getting the usage of mounted > filesystem. > The usage of fs stored as used_bytes and total_bytes. > It's very useful when we try to monitor guest's filesystem. > > Cc: Michael Roth <mdroth@linux.vnet.ibm.com> > Cc: Eric Blake <eblake@redhat.com> > Cc: Daniel P. Berrangé <berrange@redhat.com> > Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> > > +++ b/qga/qapi-schema.json > @@ -840,12 +840,24 @@ > 'bus-type': 'GuestDiskBusType', > 'bus': 'int', 'target': 'int', 'unit': 'int'} } > > +## > +# @GuestFsUsage: > +# > +# @used-bytes: file system used bytes > +# @total-bytes: file system total bytes for nonroot user > +# > +# Since: 3.0 > +## > +{ 'struct': 'GuestFsUsage', > + 'data': {'used-bytes': 'uint64', 'total-bytes': 'uint64'} } That seems like pointless nesting on the wire, unless we have plans of reusing this type in other API calls. Is it any easier... > + > ## > # @GuestFilesystemInfo: > # > # @name: disk name > # @mountpoint: mount point path > # @type: file system type string > +# @usage: file system usage struct (since 3.0) > # @disk: an array of disk hardware information that the volume lies on, > # which may be empty if the disk type is not supported > # > @@ -853,7 +865,7 @@ > ## > { 'struct': 'GuestFilesystemInfo', > 'data': {'name': 'str', 'mountpoint': 'str', 'type': 'str', > - 'disk': ['GuestDiskAddress']} } > + '*usage': 'GuestFsUsage', 'disk': ['GuestDiskAddress']} } ...to just inline '*used-bytes' and '*total-bytes' here?
在 2018-06-01 23:47:04,"Eric Blake" <eblake@redhat.com> 写道: >On 06/01/2018 10:27 AM, Chen Hanxiao wrote: >> From: Chen Hanxiao <chenhanxiao@gmail.com> >> >> This patch adds support for getting the usage of mounted >> filesystem. >> The usage of fs stored as used_bytes and total_bytes. >> It's very useful when we try to monitor guest's filesystem. >> >> Cc: Michael Roth <mdroth@linux.vnet.ibm.com> >> Cc: Eric Blake <eblake@redhat.com> >> Cc: Daniel P. Berrangé <berrange@redhat.com> >> Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> >> > >> +++ b/qga/qapi-schema.json >> @@ -840,12 +840,24 @@ >> 'bus-type': 'GuestDiskBusType', >> 'bus': 'int', 'target': 'int', 'unit': 'int'} } >> >> +## >> +# @GuestFsUsage: >> +# >> +# @used-bytes: file system used bytes >> +# @total-bytes: file system total bytes for nonroot user >> +# >> +# Since: 3.0 >> +## >> +{ 'struct': 'GuestFsUsage', >> + 'data': {'used-bytes': 'uint64', 'total-bytes': 'uint64'} } > >That seems like pointless nesting on the wire, unless we have plans of >reusing this type in other API calls. Is it any easier... > >> + >> ## >> # @GuestFilesystemInfo: >> # >> # @name: disk name >> # @mountpoint: mount point path >> # @type: file system type string >> +# @usage: file system usage struct (since 3.0) >> # @disk: an array of disk hardware information that the volume lies on, >> # which may be empty if the disk type is not supported >> # >> @@ -853,7 +865,7 @@ >> ## >> { 'struct': 'GuestFilesystemInfo', >> 'data': {'name': 'str', 'mountpoint': 'str', 'type': 'str', >> - 'disk': ['GuestDiskAddress']} } >> + '*usage': 'GuestFsUsage', 'disk': ['GuestDiskAddress']} } > >...to just inline '*used-bytes' and '*total-bytes' here? > I just want to group them together, and use one has_XXX. I'll make a some fix for this. Thanks for you advice. Regards, - Chen
diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 0dc219dbcf..83192f284c 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -46,6 +46,7 @@ extern char **environ; #include <arpa/inet.h> #include <sys/socket.h> #include <net/if.h> +#include <sys/statvfs.h> #ifdef FIFREEZE #define CONFIG_FSFREEZE @@ -1072,6 +1073,9 @@ static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount, Error **errp) { GuestFilesystemInfo *fs = g_malloc0(sizeof(*fs)); + GuestFsUsage *usage; + struct statvfs buf; + unsigned long used, nonroot_total, fr_size; char *devpath = g_strdup_printf("/sys/dev/block/%u:%u", mount->devmajor, mount->devminor); @@ -1079,7 +1083,22 @@ static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount, fs->type = g_strdup(mount->devtype); build_guest_fsinfo_for_device(devpath, fs, errp); + if (statvfs(fs->mountpoint, &buf)) { + fs->has_usage = false; + } else { + fr_size = buf.f_frsize; + used = buf.f_blocks - buf.f_bfree; + nonroot_total = used + buf.f_bavail; + usage = g_malloc0(sizeof(*usage)); + usage->used_bytes = used * fr_size; + usage->total_bytes = nonroot_total * fr_size; + + fs->has_usage = true; + fs->usage = usage; + } + g_free(devpath); + return fs; } diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json index 17884c7c70..2f742474f6 100644 --- a/qga/qapi-schema.json +++ b/qga/qapi-schema.json @@ -840,12 +840,24 @@ 'bus-type': 'GuestDiskBusType', 'bus': 'int', 'target': 'int', 'unit': 'int'} } +## +# @GuestFsUsage: +# +# @used-bytes: file system used bytes +# @total-bytes: file system total bytes for nonroot user +# +# Since: 3.0 +## +{ 'struct': 'GuestFsUsage', + 'data': {'used-bytes': 'uint64', 'total-bytes': 'uint64'} } + ## # @GuestFilesystemInfo: # # @name: disk name # @mountpoint: mount point path # @type: file system type string +# @usage: file system usage struct (since 3.0) # @disk: an array of disk hardware information that the volume lies on, # which may be empty if the disk type is not supported # @@ -853,7 +865,7 @@ ## { 'struct': 'GuestFilesystemInfo', 'data': {'name': 'str', 'mountpoint': 'str', 'type': 'str', - 'disk': ['GuestDiskAddress']} } + '*usage': 'GuestFsUsage', 'disk': ['GuestDiskAddress']} } ## # @guest-get-fsinfo: