[libvirt] [RFC] virfile: fix cast-align error

Michal Privoznik mprivozn at redhat.com
Tue Oct 9 14:52:29 UTC 2018


On 10/09/2018 04:39 PM, Bjoern Walk wrote:
> Michal Privoznik <mprivozn at redhat.com> [2018-10-09, 03:45PM +0200]:
>> On 10/08/2018 08:41 PM, Marc Hartmayer wrote:
>>> Use the correct type in order to fix the following error on s390x:
>>>
>>> In function 'virFileIsSharedFSType':
>>> ../../src/util/virfile.c:3578:38: error: cast increases required alignment of target type [-Werror=cast-align]
>>>          virFileIsSharedFixFUSE(path, (long *) &sb.f_type);
>>>
>>> Signed-off-by: Marc Hartmayer <mhartmay at linux.ibm.com>
>>> ---
>>>  src/util/virfile.c | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/src/util/virfile.c b/src/util/virfile.c
>>> index 2a7e87102a25..832d832696d5 100644
>>> --- a/src/util/virfile.c
>>> +++ b/src/util/virfile.c
>>> @@ -3466,7 +3466,7 @@ int virFilePrintf(FILE *fp, const char *msg, ...)
>>>  
>>>  static int
>>>  virFileIsSharedFixFUSE(const char *path,
>>> -                       long *f_type)
>>> +                       unsigned int *f_type)
>>>  {
>>>      char *dirpath = NULL;
>>>      const char **mounts = NULL;
>>> @@ -3575,7 +3575,7 @@ virFileIsSharedFSType(const char *path,
>>>  
>>>      if (sb.f_type == FUSE_SUPER_MAGIC) {
>>>          VIR_DEBUG("Found FUSE mount for path=%s. Trying to fix it", path);
>>> -        virFileIsSharedFixFUSE(path, (long *) &sb.f_type);
>>> +        virFileIsSharedFixFUSE(path, &sb.f_type);
>>
>> This won't fly on x86_64 where f_type is long. I think we can use
>> __fsword_t directly.
>>
>>>      }
>>>  
>>>      VIR_DEBUG("Check if path %s with FS magic %lld is shared",
>>>
>>
>> Does that work for you?
> 
> Hmm, __fsword_t is still a long int but the f_type member is defined as
> unsigned int in the userspace header.

What header file are you looking at? From /usr/include/bits/statfs.h:

struct statfs
  {
    __fsword_t f_type;
    __fsword_t f_bsize;

/* ..... */

    __fsid_t f_fsid;
    __fsword_t f_namelen;
    __fsword_t f_frsize;
    __fsword_t f_flags;
    __fsword_t f_spare[4];
  };


> Also, I am against exposing any
> internal data types.

It's not internal if it is exposed in a public header file.

> 
> virFileIsSharedFixFUSE could just return the value, the return value
> right now is not checked anyways.

Sure, but since you claim the f_type member is an unsigned type, then we
would hit the sign warning anyway.
Also, not sure. If virFileIsSharedFixFUSE() is unable to tell the
filesystem it should not touch the f_type at all.

Michal




More information about the libvir-list mailing list