git: 86db734ae292 - main - stat(2): add st_bsdflags field

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Thu, 03 Apr 2025 15:00:40 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=86db734ae292fee58532f09b17b50438f6889cc8

commit 86db734ae292fee58532f09b17b50438f6889cc8
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-04-02 20:43:53 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-04-03 14:45:05 +0000

    stat(2): add st_bsdflags field
    
    Reviewed by:    markj, rmacklem
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D49651
---
 sys/compat/freebsd32/freebsd32.h      | 2 +-
 sys/compat/freebsd32/freebsd32_misc.c | 2 +-
 sys/kern/kern_descrip.c               | 1 +
 sys/kern/vfs_default.c                | 2 ++
 sys/kern/vfs_subr.c                   | 1 +
 sys/sys/stat.h                        | 5 ++++-
 sys/sys/vnode.h                       | 4 ++--
 7 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index 3b45d291c70a..9d7a99535288 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -214,7 +214,7 @@ struct stat32 {
 	ino_t st_ino;
 	nlink_t st_nlink;
 	mode_t	st_mode;
-	uint16_t st_padding0;
+	uint16_t st_bsdflags;
 	uid_t	st_uid;
 	gid_t	st_gid;
 	uint32_t st_padding1;
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index e10f5782c10f..3efc93969419 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -2309,8 +2309,8 @@ copy_stat(struct stat *in, struct stat32 *out)
 	CP(*in, *out, st_flags);
 	CP(*in, *out, st_gen);
 	CP(*in, *out, st_filerev);
+	CP(*in, *out, st_bsdflags);
 	TS_CP(*in, *out, st_birthtim);
-	out->st_padding0 = 0;
 	out->st_padding1 = 0;
 #ifdef __STAT32_TIME_T_EXT
 	out->st_atim_ext = 0;
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 9d81c30df328..f007b22f90ec 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1618,6 +1618,7 @@ kern_fstat(struct thread *td, int fd, struct stat *sbp)
 	AUDIT_ARG_FILE(td->td_proc, fp);
 
 	sbp->st_filerev = 0;
+	sbp->st_bsdflags = 0;
 	error = fo_stat(fp, sbp, td->td_ucred);
 	fdrop(fp, td);
 #ifdef __STAT_TIME_T_EXT
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 9f150570945b..c76fc9f9dc59 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1513,6 +1513,7 @@ vop_stdstat(struct vop_stat_args *a)
 	vap->va_gen = 0;
 	vap->va_rdev = NODEV;
 	vap->va_filerev = 0;
+	vap->va_bsdflags = 0;
 
 	error = VOP_GETATTR(vp, vap, a->a_active_cred);
 	if (error)
@@ -1590,6 +1591,7 @@ vop_stdstat(struct vop_stat_args *a)
 	sb->st_blocks = vap->va_bytes / S_BLKSIZE;
 	sb->st_gen = vap->va_gen;
 	sb->st_filerev = vap->va_filerev;
+	sb->st_bsdflags = vap->va_bsdflags;
 out:
 	return (vop_stat_helper_post(a, error));
 }
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index c8ccbc18a7fe..fb624f751402 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1202,6 +1202,7 @@ vattr_null(struct vattr *vap)
 	vap->va_gen = VNOVAL;
 	vap->va_vaflags = 0;
 	vap->va_filerev = VNOVAL;
+	vap->va_bsdflags = 0;
 }
 
 /*
diff --git a/sys/sys/stat.h b/sys/sys/stat.h
index 15b7ec99bdd9..6aa536732efd 100644
--- a/sys/sys/stat.h
+++ b/sys/sys/stat.h
@@ -159,7 +159,7 @@ struct stat {
 	ino_t	  st_ino;		/* inode's number */
 	nlink_t	  st_nlink;		/* number of hard links */
 	mode_t	  st_mode;		/* inode protection mode */
-	__int16_t st_padding0;
+	__int16_t st_bsdflags;		/* misc system flags */
 	uid_t	  st_uid;		/* user ID of the file's owner */
 	gid_t	  st_gid;		/* group ID of the file's group */
 	__int32_t st_padding1;
@@ -340,6 +340,9 @@ struct nstat {
 #define	SF_NOUNLINK	0x00100000	/* file may not be removed or renamed */
 #define	SF_SNAPSHOT	0x00200000	/* snapshot inode */
 
+/* st_bsdflags */
+#define	SFBSD_NAMEDATTR	0x0001		/* file is named attribute or dir */
+
 #ifdef _KERNEL
 /*
  * Shorthand abbreviations of above.
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 8b4ac2031cf2..a2706e6e6b88 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -283,7 +283,7 @@ _Static_assert(sizeof(struct vnode) <= 448, "vnode size crosses 448 bytes");
 struct vattr {
 	__enum_uint8(vtype)	va_type;	/* vnode type (for create) */
 	u_short		va_mode;	/* files access mode and type */
-	u_short		va_padding0;
+	uint16_t	va_bsdflags;	/* same as st_bsdflags from stat(2) */
 	uid_t		va_uid;		/* owner user id */
 	gid_t		va_gid;		/* owner group id */
 	nlink_t		va_nlink;	/* number of references to file */
@@ -988,10 +988,10 @@ void	vop_rename_fail(struct vop_rename_args *ap);
 	AUDIT_ARG_VNODE1(ap->a_vp);						\
 	_error = mac_vnode_check_stat(_ap->a_active_cred, _ap->a_file_cred, _ap->a_vp);\
 	if (__predict_true(_error == 0)) {					\
-		ap->a_sb->st_padding0 = 0;					\
 		ap->a_sb->st_padding1 = 0;					\
 		bzero(_ap->a_sb->st_spare, sizeof(_ap->a_sb->st_spare));	\
 		ap->a_sb->st_filerev = 0;					\
+		ap->a_sb->st_bsdflags = 0;					\
 	}									\
 	_error;									\
 })