aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/fs_incfs.txt
blob: 95c8ee6eb2d19776773e71ffcb325e45580d3c19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Copyright 2020 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

# incremental-fs is ChromeOS/Android-specific:
# https://chromium.googlesource.com/chromiumos/third_party/kernel/+/2db8add7871ad%5E%21/

# This was generated on:
# https://chromium.googlesource.com/chromiumos/third_party/kernel 3a36438201f3
meta noextract
meta arches["386", "amd64", "arm", "arm64"]

include <asm/ioctls.h>
include <linux/stat.h>
include <uapi/linux/fcntl.h>
include <uapi/linux/incrementalfs.h>

mount$incfs(src ptr[in, filename], dst ptr[in, filename], type ptr[in, string["incremental-fs"]], flags flags[mount_flags], opts ptr[in, fs_options[incfs_options]])

incfs_options [
	read_timeout_ms	fs_opt_dec["read_timeout_ms", int32]
	readahead	fs_opt_dec["readahead", int32]
	no_bf_cache	fs_opt_dec["no_bf_cache", bool32]
	no_bf_readahead	fs_opt_dec["no_bf_readahead", bool32]
	rlog_pages	fs_opt_dec["rlog_pages", int32]
	rlog_wakeup_cnt	fs_opt_dec["rlog_wakeup_cnt", int32]
] [varlen]

ioctl$INCFS_IOC_CREATE_FILE(fd fd, cmd const[INCFS_IOC_CREATE_FILE], arg ptr[in, incfs_new_file_args])
ioctl$INCFS_IOC_FILL_BLOCKS(fd fd, cmd const[INCFS_IOC_FILL_BLOCKS], arg ptr[in, incfs_fill_blocks])
ioctl$INCFS_IOC_PERMIT_FILL(fd fd, cmd const[INCFS_IOC_PERMIT_FILL], arg ptr[in, incfs_permit_fill])
ioctl$INCFS_IOC_READ_FILE_SIGNATURE(fd fd, cmd const[INCFS_IOC_READ_FILE_SIGNATURE], arg ptr[in, incfs_get_file_sig_args])
ioctl$INCFS_IOC_GET_FILLED_BLOCKS(fd fd, cmd const[INCFS_IOC_GET_FILLED_BLOCKS], arg ptr[in, incfs_get_filled_blocks_args])

openat$incfs(fd fd_dir, file ptr[in, string[incfs_filename]], flags flags[open_flags], mode flags[open_mode]) fd

incfs_filename = ".pending_reads", ".log"

setxattr$incfs_id(path ptr[in, filename], name ptr[in, string["user.incfs.id"]], val ptr[in, incfs_uuid_str], size bytesize[val], flags flags[setxattr_flags])
setxattr$incfs_size(path ptr[in, filename], name ptr[in, string["user.incfs.size"]], val ptr[in, int64], size bytesize[val], flags flags[setxattr_flags])
setxattr$incfs_metadata(path ptr[in, filename], name ptr[in, string["user.incfs.metadata"]], val ptr[in, array[int8]], size bytesize[val], flags flags[setxattr_flags])

incfs_uuid_t {
	zeros	array[const[0, int8], 15]
	id	int8[0:3]
} [align[8]]

incfs_uuid_str {
	zeros	array[const['0', int8], 31]
	id	int8['0':'3']
}

incfs_new_file_args {
	file_id		incfs_uuid_t
	size		align64[int64]
	mode		flags[open_mode, int16]
	reserved1	const[0, int16]
	reserved2	const[0, int32]
	directory_path	ptr[in, filename]
	file_name	ptr[in, filename]
	file_attr	ptr64[in, array[int8, 0:INCFS_MAX_FILE_ATTR_SIZE]]
	file_attr_len	bytesize[file_attr, int32]
	reserved4	const[0, int32]
	signature_info	ptr64[in, incfs_signature_info]
	signature_size	bytesize[signature_info, int64]
	reserved6	const[0, int16]
}

incfs_signature_info {
	version			const[INCFS_SIGNATURE_VERSION, int32]
	hash_info_size		bytesize[hash_info, int32]
	hash_info		incfs_hash_info_section
	signing_info_size	bytesize[signing_info, int32]
	signing_info		array[int8]
} [packed]

incfs_hash_info_section {
	hash_algorithm	flags[incfs_hash_tree_algorithm, int32]
	log2_blocksize	const[12, int8]
	salt_size	bytesize[salt, int32]
	salt		array[int8]
	hash_size	bytesize[root_hash, int32]
	root_hash	array[int8]
} [packed]

incfs_hash_tree_algorithm = INCFS_HASH_TREE_NONE, INCFS_HASH_TREE_SHA256

incfs_fill_blocks {
	count		len[fill_blocks, int64]
	fill_blocks	ptr64[in, array[incfs_fill_block]]
}

incfs_fill_block {
	block_index	int32
	data_len	bytesize[data, int32]
	data		ptr64[in, array[int8]]
	compression	flags[incfs_compression_alg, int8]
	flags		flags[incfs_block_flags, int8]
	reserved1	const[0, int16]
	reserved2	const[0, int32]
	reserved3	const[0, int64]
}

incfs_compression_alg = COMPRESSION_NONE, COMPRESSION_LZ4
incfs_block_flags = INCFS_BLOCK_FLAGS_NONE, INCFS_BLOCK_FLAGS_HASH

incfs_permit_fill {
	incfs_permit_fill	fd
}

incfs_get_file_sig_args {
	file_signature		ptr64[out, array[int8]]
	file_signature_buf_size	bytesize[file_signature, int32]
	file_signature_len_out	const[0, int32]
}

incfs_get_filled_blocks_args {
	range_buffer		ptr64[out, array[int8]]
	range_buffer_size	bytesize[range_buffer, int32]
	start_index		int32
	end_index		int32
	total_blocks_out	const[0, int32]
	data_blocks_out		const[0, int32]
	range_buffer_size_out	const[0, int32]
	index_out		const[0, int32]
}