mirror of
https://github.com/trapexit/mergerfs.git
synced 2025-03-15 02:35:12 +08:00
commit
83d7886a0a
@ -172,6 +172,31 @@
|
|||||||
* - add FUSE_WRITE_KILL_PRIV flag
|
* - add FUSE_WRITE_KILL_PRIV flag
|
||||||
* - add FUSE_SETUPMAPPING and FUSE_REMOVEMAPPING
|
* - add FUSE_SETUPMAPPING and FUSE_REMOVEMAPPING
|
||||||
* - add map_alignment to fuse_init_out, add FUSE_MAP_ALIGNMENT flag
|
* - add map_alignment to fuse_init_out, add FUSE_MAP_ALIGNMENT flag
|
||||||
|
*
|
||||||
|
* 7.32
|
||||||
|
* - add flags to fuse_attr, add FUSE_ATTR_SUBMOUNT, add FUSE_SUBMOUNTS
|
||||||
|
*
|
||||||
|
* 7.33
|
||||||
|
* - add FUSE_HANDLE_KILLPRIV_V2, FUSE_WRITE_KILL_SUIDGID, FATTR_KILL_SUIDGID
|
||||||
|
* - add FUSE_OPEN_KILL_SUIDGID
|
||||||
|
* - extend fuse_setxattr_in, add FUSE_SETXATTR_EXT
|
||||||
|
* - add FUSE_SETXATTR_ACL_KILL_SGID
|
||||||
|
*
|
||||||
|
* 7.34
|
||||||
|
* - add FUSE_SYNCFS
|
||||||
|
*
|
||||||
|
* 7.35
|
||||||
|
* - add FOPEN_NOFLUSH
|
||||||
|
*
|
||||||
|
* 7.36
|
||||||
|
* - extend fuse_init_in with reserved fields, add FUSE_INIT_EXT init flag
|
||||||
|
* - add flags2 to fuse_init_in and fuse_init_out
|
||||||
|
* - add FUSE_SECURITY_CTX init flag
|
||||||
|
* - add security context to create, mkdir, symlink, and mknod requests
|
||||||
|
* - add FUSE_HAS_INODE_DAX, FUSE_ATTR_DAX
|
||||||
|
*
|
||||||
|
* 7.37
|
||||||
|
* - add FUSE_TMPFILE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LINUX_FUSE_H
|
#ifndef _LINUX_FUSE_H
|
||||||
@ -207,7 +232,7 @@
|
|||||||
#define FUSE_KERNEL_VERSION 7
|
#define FUSE_KERNEL_VERSION 7
|
||||||
|
|
||||||
/** Minor version number of this interface */
|
/** Minor version number of this interface */
|
||||||
#define FUSE_KERNEL_MINOR_VERSION 31
|
#define FUSE_KERNEL_MINOR_VERSION 37
|
||||||
|
|
||||||
/** The node ID of the root inode */
|
/** The node ID of the root inode */
|
||||||
#define FUSE_ROOT_ID 1
|
#define FUSE_ROOT_ID 1
|
||||||
@ -231,7 +256,7 @@ struct fuse_attr {
|
|||||||
uint32_t gid;
|
uint32_t gid;
|
||||||
uint32_t rdev;
|
uint32_t rdev;
|
||||||
uint32_t blksize;
|
uint32_t blksize;
|
||||||
uint32_t padding;
|
uint32_t flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fuse_kstatfs {
|
struct fuse_kstatfs {
|
||||||
@ -268,6 +293,7 @@ struct fuse_file_lock {
|
|||||||
#define FATTR_MTIME_NOW (1 << 8)
|
#define FATTR_MTIME_NOW (1 << 8)
|
||||||
#define FATTR_LOCKOWNER (1 << 9)
|
#define FATTR_LOCKOWNER (1 << 9)
|
||||||
#define FATTR_CTIME (1 << 10)
|
#define FATTR_CTIME (1 << 10)
|
||||||
|
#define FATTR_KILL_SUIDGID (1 << 11)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flags returned by the OPEN request
|
* Flags returned by the OPEN request
|
||||||
@ -277,12 +303,14 @@ struct fuse_file_lock {
|
|||||||
* FOPEN_NONSEEKABLE: the file is not seekable
|
* FOPEN_NONSEEKABLE: the file is not seekable
|
||||||
* FOPEN_CACHE_DIR: allow caching this directory
|
* FOPEN_CACHE_DIR: allow caching this directory
|
||||||
* FOPEN_STREAM: the file is stream-like (no file position at all)
|
* FOPEN_STREAM: the file is stream-like (no file position at all)
|
||||||
|
* FOPEN_NOFLUSH: don't flush data cache on close (unless FUSE_WRITEBACK_CACHE)
|
||||||
*/
|
*/
|
||||||
#define FOPEN_DIRECT_IO (1 << 0)
|
#define FOPEN_DIRECT_IO (1 << 0)
|
||||||
#define FOPEN_KEEP_CACHE (1 << 1)
|
#define FOPEN_KEEP_CACHE (1 << 1)
|
||||||
#define FOPEN_NONSEEKABLE (1 << 2)
|
#define FOPEN_NONSEEKABLE (1 << 2)
|
||||||
#define FOPEN_CACHE_DIR (1 << 3)
|
#define FOPEN_CACHE_DIR (1 << 3)
|
||||||
#define FOPEN_STREAM (1 << 4)
|
#define FOPEN_STREAM (1 << 4)
|
||||||
|
#define FOPEN_NOFLUSH (1 << 5)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* INIT request/reply flags
|
* INIT request/reply flags
|
||||||
@ -313,7 +341,21 @@ struct fuse_file_lock {
|
|||||||
* FUSE_CACHE_SYMLINKS: cache READLINK responses
|
* FUSE_CACHE_SYMLINKS: cache READLINK responses
|
||||||
* FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir
|
* FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir
|
||||||
* FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request
|
* FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request
|
||||||
* FUSE_MAP_ALIGNMENT: map_alignment field is valid
|
* FUSE_MAP_ALIGNMENT: init_out.map_alignment contains log2(byte alignment) for
|
||||||
|
* foffset and moffset fields in struct
|
||||||
|
* fuse_setupmapping_out and fuse_removemapping_one.
|
||||||
|
* FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts
|
||||||
|
* FUSE_HANDLE_KILLPRIV_V2: fs kills suid/sgid/cap on write/chown/trunc.
|
||||||
|
* Upon write/truncate suid/sgid is only killed if caller
|
||||||
|
* does not have CAP_FSETID. Additionally upon
|
||||||
|
* write/truncate sgid is killed only if file has group
|
||||||
|
* execute permission. (Same as Linux VFS behavior).
|
||||||
|
* FUSE_SETXATTR_EXT: Server supports extended struct fuse_setxattr_in
|
||||||
|
* FUSE_INIT_EXT: extended fuse_init_in request
|
||||||
|
* FUSE_INIT_RESERVED: reserved, do not use
|
||||||
|
* FUSE_SECURITY_CTX: add security context to create, mkdir, symlink, and
|
||||||
|
* mknod
|
||||||
|
* FUSE_HAS_INODE_DAX: use per inode DAX
|
||||||
*/
|
*/
|
||||||
#define FUSE_ASYNC_READ (1 << 0)
|
#define FUSE_ASYNC_READ (1 << 0)
|
||||||
#define FUSE_POSIX_LOCKS (1 << 1)
|
#define FUSE_POSIX_LOCKS (1 << 1)
|
||||||
@ -342,6 +384,14 @@ struct fuse_file_lock {
|
|||||||
#define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
|
#define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
|
||||||
#define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
|
#define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
|
||||||
#define FUSE_MAP_ALIGNMENT (1 << 26)
|
#define FUSE_MAP_ALIGNMENT (1 << 26)
|
||||||
|
#define FUSE_SUBMOUNTS (1 << 27)
|
||||||
|
#define FUSE_HANDLE_KILLPRIV_V2 (1 << 28)
|
||||||
|
#define FUSE_SETXATTR_EXT (1 << 29)
|
||||||
|
#define FUSE_INIT_EXT (1 << 30)
|
||||||
|
#define FUSE_INIT_RESERVED (1 << 31)
|
||||||
|
/* bits 32..63 get shifted down 32 bits into the flags2 field */
|
||||||
|
#define FUSE_SECURITY_CTX (1ULL << 32)
|
||||||
|
#define FUSE_HAS_INODE_DAX (1ULL << 33)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CUSE INIT request/reply flags
|
* CUSE INIT request/reply flags
|
||||||
@ -371,11 +421,14 @@ struct fuse_file_lock {
|
|||||||
*
|
*
|
||||||
* FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
|
* FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
|
||||||
* FUSE_WRITE_LOCKOWNER: lock_owner field is valid
|
* FUSE_WRITE_LOCKOWNER: lock_owner field is valid
|
||||||
* FUSE_WRITE_KILL_PRIV: kill suid and sgid bits
|
* FUSE_WRITE_KILL_SUIDGID: kill suid and sgid bits
|
||||||
*/
|
*/
|
||||||
#define FUSE_WRITE_CACHE (1 << 0)
|
#define FUSE_WRITE_CACHE (1 << 0)
|
||||||
#define FUSE_WRITE_LOCKOWNER (1 << 1)
|
#define FUSE_WRITE_LOCKOWNER (1 << 1)
|
||||||
#define FUSE_WRITE_KILL_PRIV (1 << 2)
|
#define FUSE_WRITE_KILL_SUIDGID (1 << 2)
|
||||||
|
|
||||||
|
/* Obsolete alias; this flag implies killing suid/sgid only. */
|
||||||
|
#define FUSE_WRITE_KILL_PRIV FUSE_WRITE_KILL_SUIDGID
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read flags
|
* Read flags
|
||||||
@ -417,6 +470,27 @@ struct fuse_file_lock {
|
|||||||
*/
|
*/
|
||||||
#define FUSE_FSYNC_FDATASYNC (1 << 0)
|
#define FUSE_FSYNC_FDATASYNC (1 << 0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fuse_attr flags
|
||||||
|
*
|
||||||
|
* FUSE_ATTR_SUBMOUNT: Object is a submount root
|
||||||
|
* FUSE_ATTR_DAX: Enable DAX for this file in per inode DAX mode
|
||||||
|
*/
|
||||||
|
#define FUSE_ATTR_SUBMOUNT (1 << 0)
|
||||||
|
#define FUSE_ATTR_DAX (1 << 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open flags
|
||||||
|
* FUSE_OPEN_KILL_SUIDGID: Kill suid and sgid if executable
|
||||||
|
*/
|
||||||
|
#define FUSE_OPEN_KILL_SUIDGID (1 << 0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setxattr flags
|
||||||
|
* FUSE_SETXATTR_ACL_KILL_SGID: Clear SGID when system.posix_acl_access is set
|
||||||
|
*/
|
||||||
|
#define FUSE_SETXATTR_ACL_KILL_SGID (1 << 0)
|
||||||
|
|
||||||
enum fuse_opcode {
|
enum fuse_opcode {
|
||||||
FUSE_LOOKUP = 1,
|
FUSE_LOOKUP = 1,
|
||||||
FUSE_FORGET = 2, /* no reply */
|
FUSE_FORGET = 2, /* no reply */
|
||||||
@ -465,6 +539,8 @@ enum fuse_opcode {
|
|||||||
FUSE_COPY_FILE_RANGE = 47,
|
FUSE_COPY_FILE_RANGE = 47,
|
||||||
FUSE_SETUPMAPPING = 48,
|
FUSE_SETUPMAPPING = 48,
|
||||||
FUSE_REMOVEMAPPING = 49,
|
FUSE_REMOVEMAPPING = 49,
|
||||||
|
FUSE_SYNCFS = 50,
|
||||||
|
FUSE_TMPFILE = 51,
|
||||||
|
|
||||||
/* CUSE specific operations */
|
/* CUSE specific operations */
|
||||||
CUSE_INIT = 4096,
|
CUSE_INIT = 4096,
|
||||||
@ -578,14 +654,14 @@ struct fuse_setattr_in {
|
|||||||
|
|
||||||
struct fuse_open_in {
|
struct fuse_open_in {
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
uint32_t unused;
|
uint32_t open_flags; /* FUSE_OPEN_... */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fuse_create_in {
|
struct fuse_create_in {
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
uint32_t mode;
|
uint32_t mode;
|
||||||
uint32_t umask;
|
uint32_t umask;
|
||||||
uint32_t padding;
|
uint32_t open_flags; /* FUSE_OPEN_... */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fuse_open_out {
|
struct fuse_open_out {
|
||||||
@ -647,9 +723,13 @@ struct fuse_fsync_in {
|
|||||||
uint32_t padding;
|
uint32_t padding;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define FUSE_COMPAT_SETXATTR_IN_SIZE 8
|
||||||
|
|
||||||
struct fuse_setxattr_in {
|
struct fuse_setxattr_in {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
uint32_t setxattr_flags;
|
||||||
|
uint32_t padding;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fuse_getxattr_in {
|
struct fuse_getxattr_in {
|
||||||
@ -684,6 +764,8 @@ struct fuse_init_in {
|
|||||||
uint32_t minor;
|
uint32_t minor;
|
||||||
uint32_t max_readahead;
|
uint32_t max_readahead;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
uint32_t flags2;
|
||||||
|
uint32_t unused[11];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FUSE_COMPAT_INIT_OUT_SIZE 8
|
#define FUSE_COMPAT_INIT_OUT_SIZE 8
|
||||||
@ -700,7 +782,8 @@ struct fuse_init_out {
|
|||||||
uint32_t time_gran;
|
uint32_t time_gran;
|
||||||
uint16_t max_pages;
|
uint16_t max_pages;
|
||||||
uint16_t map_alignment;
|
uint16_t map_alignment;
|
||||||
uint32_t unused[8];
|
uint32_t flags2;
|
||||||
|
uint32_t unused[7];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CUSE_INIT_INFO_MAX 4096
|
#define CUSE_INIT_INFO_MAX 4096
|
||||||
@ -808,9 +891,12 @@ struct fuse_dirent {
|
|||||||
char name[];
|
char name[];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
|
/* Align variable length records to 64bit boundary */
|
||||||
#define FUSE_DIRENT_ALIGN(x) \
|
#define FUSE_REC_ALIGN(x) \
|
||||||
(((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
|
(((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
|
||||||
|
|
||||||
|
#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
|
||||||
|
#define FUSE_DIRENT_ALIGN(x) FUSE_REC_ALIGN(x)
|
||||||
#define FUSE_DIRENT_SIZE(d) \
|
#define FUSE_DIRENT_SIZE(d) \
|
||||||
FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
|
FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
|
||||||
|
|
||||||
@ -869,7 +955,8 @@ struct fuse_notify_retrieve_in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Device ioctls: */
|
/* Device ioctls: */
|
||||||
#define FUSE_DEV_IOC_CLONE _IOR(229, 0, uint32_t)
|
#define FUSE_DEV_IOC_MAGIC 229
|
||||||
|
#define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t)
|
||||||
|
|
||||||
struct fuse_lseek_in {
|
struct fuse_lseek_in {
|
||||||
uint64_t fh;
|
uint64_t fh;
|
||||||
@ -892,4 +979,60 @@ struct fuse_copy_file_range_in {
|
|||||||
uint64_t flags;
|
uint64_t flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
|
||||||
|
#define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
|
||||||
|
struct fuse_setupmapping_in {
|
||||||
|
/* An already open handle */
|
||||||
|
uint64_t fh;
|
||||||
|
/* Offset into the file to start the mapping */
|
||||||
|
uint64_t foffset;
|
||||||
|
/* Length of mapping required */
|
||||||
|
uint64_t len;
|
||||||
|
/* Flags, FUSE_SETUPMAPPING_FLAG_* */
|
||||||
|
uint64_t flags;
|
||||||
|
/* Offset in Memory Window */
|
||||||
|
uint64_t moffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse_removemapping_in {
|
||||||
|
/* number of fuse_removemapping_one follows */
|
||||||
|
uint32_t count;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse_removemapping_one {
|
||||||
|
/* Offset into the dax window start the unmapping */
|
||||||
|
uint64_t moffset;
|
||||||
|
/* Length of mapping required */
|
||||||
|
uint64_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FUSE_REMOVEMAPPING_MAX_ENTRY \
|
||||||
|
(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
|
||||||
|
|
||||||
|
struct fuse_syncfs_in {
|
||||||
|
uint64_t padding;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For each security context, send fuse_secctx with size of security context
|
||||||
|
* fuse_secctx will be followed by security context name and this in turn
|
||||||
|
* will be followed by actual context label.
|
||||||
|
* fuse_secctx, name, context
|
||||||
|
*/
|
||||||
|
struct fuse_secctx {
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t padding;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Contains the information about how many fuse_secctx structures are being
|
||||||
|
* sent and what's the total size of all security contexts (including
|
||||||
|
* size of fuse_secctx_header).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct fuse_secctx_header {
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t nr_secctx;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _LINUX_FUSE_H */
|
#endif /* _LINUX_FUSE_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user