Commit 043296a8 authored by Han-Wen Nienhuys's avatar Han-Wen Nienhuys

fuse: sync opcodes and capabilities

This adds opcodes and capabilities from this week's upstream kernel.

As of commit 53db28933 ("fuse: extend init flags"), the init message
has been extended to 104 bytes, with more flags added in a flags2
field.

Prepare for this by allowing _OP_INIT to have short reads.

Tested on Fedora 38 (Linux 6.4.14) and Fedora 34 (Linux 5.11)

Change-Id: I366ecda9e23f1a329134677075ee839674ff4c57
parent 36842ef6
......@@ -62,6 +62,12 @@ const (
_OP_LSEEK = uint32(46) // protocol version 24
_OP_COPY_FILE_RANGE = uint32(47) // protocol version 28.
_OP_SETUPMAPPING = 48
_OP_REMOVEMAPPING = 49
_OP_SYNCFS = 50
_OP_TMPFILE = 51
_OP_STATX = 52
// The following entries don't have to be compatible across Go-FUSE versions.
_OP_NOTIFY_INVAL_ENTRY = uint32(100)
_OP_NOTIFY_INVAL_INODE = uint32(101)
......@@ -692,6 +698,10 @@ func init() {
_OP_RENAME2: "RENAME2",
_OP_LSEEK: "LSEEK",
_OP_COPY_FILE_RANGE: "COPY_FILE_RANGE",
_OP_SETUPMAPPING: "SETUPMAPPING",
_OP_REMOVEMAPPING: "REMOVEMAPPING",
_OP_SYNCFS: "SYNCFS",
_OP_TMPFILE: "TMPFILE",
} {
operationHandlers[op].Name = v
}
......
......@@ -46,6 +46,17 @@ var (
CAP_CACHE_SYMLINKS: "CACHE_SYMLINKS",
CAP_NO_OPENDIR_SUPPORT: "NO_OPENDIR_SUPPORT",
CAP_EXPLICIT_INVAL_DATA: "EXPLICIT_INVAL_DATA",
CAP_MAP_ALIGNMENT: "MAP_ALIGNMENT",
CAP_SUBMOUNTS: "SUBMOUNTS",
CAP_HANDLE_KILLPRIV_V2: "HANDLE_KILLPRIV_V2",
CAP_SETXATTR_EXT: "SETXATTR_EXT",
CAP_INIT_EXT: "INIT_EXT",
CAP_INIT_RESERVED: "INIT_RESERVED",
CAP_SECURITY_CTX: "SECURITY_CTX",
CAP_HAS_INODE_DAX: "HAS_INODE_DAX",
CAP_CREATE_SUPP_GROUP: "CREATE_SUPP_GROUP",
CAP_HAS_EXPIRE_ONLY: "HAS_EXPIRE_ONLY",
CAP_DIRECT_IO_RELAX: "DIRECT_IO_RELAX",
})
releaseFlagNames = newFlagNames(map[int64]string{
RELEASE_FLUSH: "FLUSH",
......@@ -209,7 +220,7 @@ func (in *OpenOut) string() string {
func (in *InitIn) string() string {
return fmt.Sprintf("{%d.%d Ra %d %s}",
in.Major, in.Minor, in.MaxReadAhead,
flagString(initFlagNames, int64(in.Flags), ""))
flagString(initFlagNames, int64(in.Flags)|(int64(in.Flags2)<<32), ""))
}
func (o *InitOut) string() string {
......
......@@ -181,7 +181,12 @@ func (r *request) parse() {
return
}
if len(r.arg) < int(r.handler.InputSize) {
inSz := int(r.handler.InputSize)
if r.inHeader.Opcode == _OP_INIT && inSz > len(r.arg) {
// Minor version 36 extended the size of InitIn struct
inSz = len(r.arg)
}
if len(r.arg) < inSz {
log.Printf("Short read for %v: %v", operationName(r.inHeader.Opcode), r.arg)
r.status = EIO
return
......@@ -189,7 +194,7 @@ func (r *request) parse() {
if r.handler.InputSize > 0 {
r.inData = unsafe.Pointer(&r.arg[0])
r.arg = r.arg[r.handler.InputSize:]
r.arg = r.arg[inSz:]
} else {
r.arg = r.arg[unsafe.Sizeof(InHeader{}):]
}
......
......@@ -137,6 +137,7 @@ const ( // SetAttrIn.Valid
FATTR_MTIME_NOW = (1 << 8)
FATTR_LOCKOWNER = (1 << 9)
FATTR_CTIME = (1 << 10)
FATTR_KILL_SUIDGID = (1 << 11)
)
type SetAttrInCommon struct {
......@@ -256,6 +257,8 @@ const (
FOPEN_NONSEEKABLE = (1 << 2)
FOPEN_CACHE_DIR = (1 << 3)
FOPEN_STREAM = (1 << 4)
FOPEN_NOFLUSH = (1 << 5)
FOPEN_PARALLEL_DIRECT_WRITES = (1 << 6)
)
type OpenOut struct {
......@@ -299,6 +302,19 @@ const (
CAP_CACHE_SYMLINKS = (1 << 23)
CAP_NO_OPENDIR_SUPPORT = (1 << 24)
CAP_EXPLICIT_INVAL_DATA = (1 << 25)
CAP_MAP_ALIGNMENT = (1 << 26)
CAP_SUBMOUNTS = (1 << 27)
CAP_HANDLE_KILLPRIV_V2 = (1 << 28)
CAP_SETXATTR_EXT = (1 << 29)
CAP_INIT_EXT = (1 << 30)
CAP_INIT_RESERVED = (1 << 31)
/* bits 32..63 get shifted down 32 bits into the Flags2 field */
CAP_SECURITY_CTX = (1 << 32)
CAP_HAS_INODE_DAX = (1 << 33)
CAP_CREATE_SUPP_GROUP = (1 << 34)
CAP_HAS_EXPIRE_ONLY = (1 << 35)
CAP_DIRECT_IO_RELAX = (1 << 36)
)
type InitIn struct {
......@@ -308,6 +324,8 @@ type InitIn struct {
Minor uint32
MaxReadAhead uint32
Flags uint32
Flags2 uint32
Unused [11]uint32
}
type InitOut struct {
......@@ -321,7 +339,8 @@ type InitOut struct {
TimeGran uint32
MaxPages uint16
Padding uint16
Unused [8]uint32
Flags2 uint32
Unused [7]uint32
}
type _CuseInitIn struct {
......@@ -647,6 +666,7 @@ const (
const (
WRITE_CACHE = (1 << 0)
WRITE_LOCKOWNER = (1 << 1)
WRITE_KILL_SUIDGID = (1 << 2)
)
type FallocateIn struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment