The branch stable/14 has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=70ba4df540eaa923ed7d01480506c359d6679c3b

commit 70ba4df540eaa923ed7d01480506c359d6679c3b
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-04-02 20:43:53 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-04-09 00:53:17 +0000

    stat(2): add st_bsdflags field
    
    (cherry picked from commit 86db734ae292fee58532f09b17b50438f6889cc8)
---
 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 6fcb4f9a9582..81715ed102b3 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 7fa03e002ad7..2d1c0d4aea5f 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1620,6 +1620,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 d044a52bce2d..006da1c19f3d 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1515,6 +1515,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)
@@ -1592,6 +1593,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 bf1ed1b51109..009d305b8c1f 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1167,6 +1167,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 bbdf485581c6..baf80dbdf978 100644
--- a/sys/sys/stat.h
+++ b/sys/sys/stat.h
@@ -161,7 +161,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;
@@ -342,6 +342,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 404121ecabc2..ba9f43cd0af5 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 */
@@ -991,10 +991,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;                                                                 
\
 })

Reply via email to