xref: /openbmc/linux/include/linux/fileattr.h (revision 8782a9ae)
14c5b4799SMiklos Szeredi /* SPDX-License-Identifier: GPL-2.0 */
24c5b4799SMiklos Szeredi 
34c5b4799SMiklos Szeredi #ifndef _LINUX_FILEATTR_H
44c5b4799SMiklos Szeredi #define _LINUX_FILEATTR_H
54c5b4799SMiklos Szeredi 
64c5b4799SMiklos Szeredi /* Flags shared betwen flags/xflags */
74c5b4799SMiklos Szeredi #define FS_COMMON_FL \
84c5b4799SMiklos Szeredi 	(FS_SYNC_FL | FS_IMMUTABLE_FL | FS_APPEND_FL | \
94c5b4799SMiklos Szeredi 	 FS_NODUMP_FL |	FS_NOATIME_FL | FS_DAX_FL | \
104c5b4799SMiklos Szeredi 	 FS_PROJINHERIT_FL)
114c5b4799SMiklos Szeredi 
124c5b4799SMiklos Szeredi #define FS_XFLAG_COMMON \
134c5b4799SMiklos Szeredi 	(FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND | \
144c5b4799SMiklos Szeredi 	 FS_XFLAG_NODUMP | FS_XFLAG_NOATIME | FS_XFLAG_DAX | \
154c5b4799SMiklos Szeredi 	 FS_XFLAG_PROJINHERIT)
164c5b4799SMiklos Szeredi 
174c5b4799SMiklos Szeredi /*
184c5b4799SMiklos Szeredi  * Merged interface for miscellaneous file attributes.  'flags' originates from
194c5b4799SMiklos Szeredi  * ext* and 'fsx_flags' from xfs.  There's some overlap between the two, which
204c5b4799SMiklos Szeredi  * is handled by the VFS helpers, so filesystems are free to implement just one
214c5b4799SMiklos Szeredi  * or both of these sub-interfaces.
224c5b4799SMiklos Szeredi  */
234c5b4799SMiklos Szeredi struct fileattr {
244c5b4799SMiklos Szeredi 	u32	flags;		/* flags (FS_IOC_GETFLAGS/FS_IOC_SETFLAGS) */
254c5b4799SMiklos Szeredi 	/* struct fsxattr: */
264c5b4799SMiklos Szeredi 	u32	fsx_xflags;	/* xflags field value (get/set) */
274c5b4799SMiklos Szeredi 	u32	fsx_extsize;	/* extsize field value (get/set)*/
284c5b4799SMiklos Szeredi 	u32	fsx_nextents;	/* nextents field value (get)	*/
294c5b4799SMiklos Szeredi 	u32	fsx_projid;	/* project identifier (get/set) */
304c5b4799SMiklos Szeredi 	u32	fsx_cowextsize;	/* CoW extsize field value (get/set)*/
314c5b4799SMiklos Szeredi 	/* selectors: */
324c5b4799SMiklos Szeredi 	bool	flags_valid:1;
334c5b4799SMiklos Szeredi 	bool	fsx_valid:1;
344c5b4799SMiklos Szeredi };
354c5b4799SMiklos Szeredi 
364c5b4799SMiklos Szeredi int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user *ufa);
374c5b4799SMiklos Szeredi 
384c5b4799SMiklos Szeredi void fileattr_fill_xflags(struct fileattr *fa, u32 xflags);
394c5b4799SMiklos Szeredi void fileattr_fill_flags(struct fileattr *fa, u32 flags);
404c5b4799SMiklos Szeredi 
414c5b4799SMiklos Szeredi /**
424c5b4799SMiklos Szeredi  * fileattr_has_fsx - check for extended flags/attributes
434c5b4799SMiklos Szeredi  * @fa:		fileattr pointer
444c5b4799SMiklos Szeredi  *
454c5b4799SMiklos Szeredi  * Return: true if any attributes are present that are not represented in
464c5b4799SMiklos Szeredi  * ->flags.
474c5b4799SMiklos Szeredi  */
fileattr_has_fsx(const struct fileattr * fa)484c5b4799SMiklos Szeredi static inline bool fileattr_has_fsx(const struct fileattr *fa)
494c5b4799SMiklos Szeredi {
504c5b4799SMiklos Szeredi 	return fa->fsx_valid &&
514c5b4799SMiklos Szeredi 		((fa->fsx_xflags & ~FS_XFLAG_COMMON) || fa->fsx_extsize != 0 ||
524c5b4799SMiklos Szeredi 		 fa->fsx_projid != 0 ||	fa->fsx_cowextsize != 0);
534c5b4799SMiklos Szeredi }
544c5b4799SMiklos Szeredi 
554c5b4799SMiklos Szeredi int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa);
56*8782a9aeSChristian Brauner int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry,
574c5b4799SMiklos Szeredi 		     struct fileattr *fa);
584c5b4799SMiklos Szeredi 
594c5b4799SMiklos Szeredi #endif /* _LINUX_FILEATTR_H */
60