mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-05 08:44:14 +02:00
The uid stored in struct kstat is logically a vfsuid; file systems initialize it by converting a kuid (filesystem perspective) to a vfsuid (mount perspective), then use vfsuid_into_kuid(), which essentially just typecasts from vfsuid to kuid. For now, just add a comment to note this mismatch between C type and semantic type. Below are some notes for anyone who wants to refactor this in the future. There are probably two options to refactor this away: 1. Change the type of kstat::uid to vfsuid_t, and perform the conversion from vfsuid to userspace-uid in the VFS layer. This wouldn't change machine code, just be more semantically correct. 2. Change the semantics of kstat::uid to really be a kuid_t, and let the VFS layer take care of doing the translation from kuid to vfsuid that is currently done in filesystem code (or in generic_fillattr, on behalf of the filesystem code). Option 2 is probably neater since it moves more logic into the generic VFS layer, and this is something that is expected to work the same way in all file systems? The following coccinelle script: ``` virtual context @@ struct kstat *stat; @@ * stat->uid @@ struct kstat *stat; @@ * stat->gid @@ struct kstat stat; @@ * stat.uid @@ struct kstat stat; @@ * stat.gid ``` detects 43 field accesses to these uid/gid fields. Signed-off-by: Jann Horn <jannh@google.com> Link: https://patch.msgid.link/20260803-vfs-comment-stat-uid-v1-1-162d062b737c@google.com Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
73 lines
1.9 KiB
C
73 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_STAT_H
|
|
#define _LINUX_STAT_H
|
|
|
|
|
|
#include <asm/stat.h>
|
|
#include <uapi/linux/stat.h>
|
|
|
|
#define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
|
|
#define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
|
|
#define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
|
|
#define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
|
|
#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
|
|
|
|
#define UTIME_NOW ((1l << 30) - 1l)
|
|
#define UTIME_OMIT ((1l << 30) - 2l)
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/time.h>
|
|
#include <linux/uidgid.h>
|
|
|
|
struct kstat {
|
|
u32 result_mask; /* What fields the user got */
|
|
umode_t mode;
|
|
unsigned int nlink;
|
|
uint32_t blksize; /* Preferred I/O size */
|
|
u64 attributes;
|
|
u64 attributes_mask;
|
|
#define KSTAT_ATTR_FS_IOC_FLAGS \
|
|
(STATX_ATTR_COMPRESSED | \
|
|
STATX_ATTR_IMMUTABLE | \
|
|
STATX_ATTR_APPEND | \
|
|
STATX_ATTR_NODUMP | \
|
|
STATX_ATTR_ENCRYPTED | \
|
|
STATX_ATTR_VERITY \
|
|
)/* Attrs corresponding to FS_*_FL flags */
|
|
#define KSTAT_ATTR_VFS_FLAGS \
|
|
(STATX_ATTR_IMMUTABLE | \
|
|
STATX_ATTR_APPEND \
|
|
) /* Attrs corresponding to S_* flags that are enforced by the VFS */
|
|
u64 ino;
|
|
dev_t dev;
|
|
dev_t rdev;
|
|
kuid_t uid; /* This is logically a vfsuid_t. */
|
|
kgid_t gid; /* This is logically a vfsgid_t. */
|
|
loff_t size;
|
|
struct timespec64 atime;
|
|
struct timespec64 mtime;
|
|
struct timespec64 ctime;
|
|
struct timespec64 btime; /* File creation time */
|
|
u64 blocks;
|
|
u64 mnt_id;
|
|
u64 change_cookie;
|
|
u64 subvol;
|
|
u32 dio_mem_align;
|
|
u32 dio_offset_align;
|
|
u32 dio_read_offset_align;
|
|
u32 atomic_write_unit_min;
|
|
u32 atomic_write_unit_max;
|
|
u32 atomic_write_unit_max_opt;
|
|
u32 atomic_write_segments_max;
|
|
};
|
|
|
|
/* These definitions are internal to the kernel for now. Mainly used by nfsd. */
|
|
|
|
/* mask values */
|
|
#define STATX_CHANGE_COOKIE 0x40000000U /* Want/got stx_change_attr */
|
|
|
|
/* file attribute values */
|
|
#define STATX_ATTR_CHANGE_MONOTONIC 0x8000000000000000ULL /* version monotonically increases */
|
|
|
|
#endif
|