2020-11-25 16:52:40

by David Howells

[permalink] [raw]
Subject: UAPI value collision: STATX_ATTR_MOUNT_ROOT vs STATX_ATTR_DAX

Hi Linus, Miklos, Ira,

It seems that two patches that got merged in the 5.8 merge window collided and
no one noticed until now:

80340fe3605c0 (Miklos Szeredi 2020-05-14 184) #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */
...
712b2698e4c02 (Ira Weiny 2020-04-30 186) #define STATX_ATTR_DAX 0x00002000 /* [I] File is DAX */

The question is, what do we do about it? Renumber one or both of the
constants?

David


2020-11-25 22:48:18

by Eric Sandeen

[permalink] [raw]
Subject: Re: UAPI value collision: STATX_ATTR_MOUNT_ROOT vs STATX_ATTR_DAX

On 11/25/20 10:50 AM, David Howells wrote:
> Hi Linus, Miklos, Ira,
>
> It seems that two patches that got merged in the 5.8 merge window collided and
> no one noticed until now:
>
> 80340fe3605c0 (Miklos Szeredi 2020-05-14 184) #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */
> ...
> 712b2698e4c02 (Ira Weiny 2020-04-30 186) #define STATX_ATTR_DAX 0x00002000 /* [I] File is DAX */
>
> The question is, what do we do about it? Renumber one or both of the
> constants?
>
> David

Related to this, nothing sets STATX_ATTR_DAX into statx->attributes_mask,
anywhere in the kernel.

The flag is set into statx->attributes in vfs_getattr_nosec(), but that
does not know whether the particular filesystem under query supports dax
or not.

This is related to my other email about exactly what attributes_mask
means, so should STATX_ATTR_DAX be set in statx->attributes_mask only
in the filesystems that support dax?

(And should that be done only if CONFIG_DAX is turned on, etc?)

-Eric

2020-11-26 08:07:09

by Miklos Szeredi

[permalink] [raw]
Subject: Re: UAPI value collision: STATX_ATTR_MOUNT_ROOT vs STATX_ATTR_DAX

On Wed, Nov 25, 2020 at 5:57 PM David Howells <[email protected]> wrote:
>
> Hi Linus, Miklos, Ira,
>
> It seems that two patches that got merged in the 5.8 merge window collided and
> no one noticed until now:
>
> 80340fe3605c0 (Miklos Szeredi 2020-05-14 184) #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */
> ...
> 712b2698e4c02 (Ira Weiny 2020-04-30 186) #define STATX_ATTR_DAX 0x00002000 /* [I] File is DAX */
>
> The question is, what do we do about it? Renumber one or both of the
> constants?

<uapi/linux/stat.h>:
* Note that the flags marked [I] correspond to generic FS_IOC_FLAGS
* semantically. Where possible, the numerical value is picked to correspond
* also.

<uapi/linux/fs.h>:
#define FS_DAX_FL 0x02000000 /* Inode is DAX */

The DAX one can be the same value as FS_DAX_FL, the placement (after
STATX_ATTR_VERITY, instead of before) seems to confirm this intention.

Not that I care too much, the important thing is to have distinct values.
Thanks,
Miklos

2020-11-26 08:18:28

by Miklos Szeredi

[permalink] [raw]
Subject: Re: UAPI value collision: STATX_ATTR_MOUNT_ROOT vs STATX_ATTR_DAX

> Related to this, nothing sets STATX_ATTR_DAX into statx->attributes_mask,
> anywhere in the kernel.
>
> The flag is set into statx->attributes in vfs_getattr_nosec(), but that
> does not know whether the particular filesystem under query supports dax
> or not.
>
> This is related to my other email about exactly what attributes_mask
> means, so should STATX_ATTR_DAX be set in statx->attributes_mask only
> in the filesystems that support dax?
>
> (And should that be done only if CONFIG_DAX is turned on, etc?)

I think the mask/flag combinations should mean:

mask:off, flag:off -> value unknown
mask:off, flag:on -> N/A
mask:on, flag:off -> value is off
mask:on, flag:on -> value is on

So mask should be off iff STATX_ATTR_DAX will not be set even if DAX
is enabled on a particular inode (such as on an old kernel not
supporting STATX_ATTR_DAX).

Thanks,
Miklos

2020-11-26 19:16:42

by Andreas Dilger

[permalink] [raw]
Subject: Re: UAPI value collision: STATX_ATTR_MOUNT_ROOT vs STATX_ATTR_DAX

On Nov 25, 2020, at 12:26 PM, Miklos Szeredi <[email protected]> wrote:
>
> On Wed, Nov 25, 2020 at 5:57 PM David Howells <[email protected]> wrote:
>>
>> Hi Linus, Miklos, Ira,
>>
>> It seems that two patches that got merged in the 5.8 merge window collided and
>> no one noticed until now:
>>
>> 80340fe3605c0 (Miklos Szeredi 2020-05-14 184) #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */
>> ...
>> 712b2698e4c02 (Ira Weiny 2020-04-30 186) #define STATX_ATTR_DAX 0x00002000 /* [I] File is DAX */
>>
>> The question is, what do we do about it? Renumber one or both of the
>> constants?
>
> <uapi/linux/stat.h>:
> * Note that the flags marked [I] correspond to generic FS_IOC_FLAGS
> * semantically. Where possible, the numerical value is picked to correspond
> * also.
>
> <uapi/linux/fs.h>:
> #define FS_DAX_FL 0x02000000 /* Inode is DAX */
>
> The DAX one can be the same value as FS_DAX_FL, the placement (after
> STATX_ATTR_VERITY, instead of before) seems to confirm this intention.

Yes, this looks like a bug in the STATX_ATTR_DAX value. It should be the same
as FS_DAX_FL, like all of the other STATX_ATTR_* [I] values are.

Cheers, Andreas






Attachments:
signature.asc (890.00 B)
Message signed with OpenPGP