mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 06:50:37 +00:00

XFS will be able to support large atomic writes (atomic write > 1x block) in future. This will be achieved by using different operating methods, depending on the size of the write. Specifically a new method of operation based in FS atomic extent remapping will be supported in addition to the current HW offload-based method. The FS method will generally be appreciably slower performing than the HW-offload method. However the FS method will be typically able to contribute to achieving a larger atomic write unit max limit. XFS will support a hybrid mode, where HW offload method will be used when possible, i.e. HW offload is used when the length of the write is supported, and for other times FS-based atomic writes will be used. As such, there is an atomic write length at which the user may experience appreciably slower performance. Advertise this limit in a new statx field, stx_atomic_write_unit_max_opt. When zero, it means that there is no such performance boundary. Masks STATX{_ATTR}_WRITE_ATOMIC can be used to get this new field. This is ok for older kernels which don't support this new field, as they would report 0 in this field (from zeroing in cp_statx()) already. Furthermore those older kernels don't support large atomic writes - apart from block fops, but there would be consistent performance there for atomic writes in range [unit min, unit max]. Reviewed-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Darrick J. Wong <djwong@kernel.org> Acked-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: John Garry <john.g.garry@oracle.com>
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;
|
|
kgid_t gid;
|
|
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
|