|
@ -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) |
|
|
|
|
|
#define FUSE_DIRENT_ALIGN(x) \ |
|
|
|
|
|
|
|
|
/* Align variable length records to 64bit boundary */ |
|
|
|
|
|
#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 */ |