162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2012 Alexander Block.  All rights reserved.
462306a36Sopenharmony_ci * Copyright (C) 2012 STRATO.  All rights reserved.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef BTRFS_SEND_H
862306a36Sopenharmony_ci#define BTRFS_SEND_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/types.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define BTRFS_SEND_STREAM_MAGIC "btrfs-stream"
1362306a36Sopenharmony_ci/* Conditional support for the upcoming protocol version. */
1462306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_DEBUG
1562306a36Sopenharmony_ci#define BTRFS_SEND_STREAM_VERSION 3
1662306a36Sopenharmony_ci#else
1762306a36Sopenharmony_ci#define BTRFS_SEND_STREAM_VERSION 2
1862306a36Sopenharmony_ci#endif
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/*
2162306a36Sopenharmony_ci * In send stream v1, no command is larger than 64K. In send stream v2, no
2262306a36Sopenharmony_ci * limit should be assumed, the buffer size is set to be a header with
2362306a36Sopenharmony_ci * compressed extent size.
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_ci#define BTRFS_SEND_BUF_SIZE_V1				SZ_64K
2662306a36Sopenharmony_ci#define BTRFS_SEND_BUF_SIZE_V2	ALIGN(SZ_16K + BTRFS_MAX_COMPRESSED, PAGE_SIZE)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct inode;
2962306a36Sopenharmony_cistruct btrfs_ioctl_send_args;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cienum btrfs_tlv_type {
3262306a36Sopenharmony_ci	BTRFS_TLV_U8,
3362306a36Sopenharmony_ci	BTRFS_TLV_U16,
3462306a36Sopenharmony_ci	BTRFS_TLV_U32,
3562306a36Sopenharmony_ci	BTRFS_TLV_U64,
3662306a36Sopenharmony_ci	BTRFS_TLV_BINARY,
3762306a36Sopenharmony_ci	BTRFS_TLV_STRING,
3862306a36Sopenharmony_ci	BTRFS_TLV_UUID,
3962306a36Sopenharmony_ci	BTRFS_TLV_TIMESPEC,
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct btrfs_stream_header {
4362306a36Sopenharmony_ci	char magic[sizeof(BTRFS_SEND_STREAM_MAGIC)];
4462306a36Sopenharmony_ci	__le32 version;
4562306a36Sopenharmony_ci} __attribute__ ((__packed__));
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct btrfs_cmd_header {
4862306a36Sopenharmony_ci	/* len excluding the header */
4962306a36Sopenharmony_ci	__le32 len;
5062306a36Sopenharmony_ci	__le16 cmd;
5162306a36Sopenharmony_ci	/* crc including the header with zero crc field */
5262306a36Sopenharmony_ci	__le32 crc;
5362306a36Sopenharmony_ci} __attribute__ ((__packed__));
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct btrfs_tlv_header {
5662306a36Sopenharmony_ci	__le16 tlv_type;
5762306a36Sopenharmony_ci	/* len excluding the header */
5862306a36Sopenharmony_ci	__le16 tlv_len;
5962306a36Sopenharmony_ci} __attribute__ ((__packed__));
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* commands */
6262306a36Sopenharmony_cienum btrfs_send_cmd {
6362306a36Sopenharmony_ci	BTRFS_SEND_C_UNSPEC		= 0,
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	/* Version 1 */
6662306a36Sopenharmony_ci	BTRFS_SEND_C_SUBVOL		= 1,
6762306a36Sopenharmony_ci	BTRFS_SEND_C_SNAPSHOT		= 2,
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	BTRFS_SEND_C_MKFILE		= 3,
7062306a36Sopenharmony_ci	BTRFS_SEND_C_MKDIR		= 4,
7162306a36Sopenharmony_ci	BTRFS_SEND_C_MKNOD		= 5,
7262306a36Sopenharmony_ci	BTRFS_SEND_C_MKFIFO		= 6,
7362306a36Sopenharmony_ci	BTRFS_SEND_C_MKSOCK		= 7,
7462306a36Sopenharmony_ci	BTRFS_SEND_C_SYMLINK		= 8,
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	BTRFS_SEND_C_RENAME		= 9,
7762306a36Sopenharmony_ci	BTRFS_SEND_C_LINK		= 10,
7862306a36Sopenharmony_ci	BTRFS_SEND_C_UNLINK		= 11,
7962306a36Sopenharmony_ci	BTRFS_SEND_C_RMDIR		= 12,
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	BTRFS_SEND_C_SET_XATTR		= 13,
8262306a36Sopenharmony_ci	BTRFS_SEND_C_REMOVE_XATTR	= 14,
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	BTRFS_SEND_C_WRITE		= 15,
8562306a36Sopenharmony_ci	BTRFS_SEND_C_CLONE		= 16,
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	BTRFS_SEND_C_TRUNCATE		= 17,
8862306a36Sopenharmony_ci	BTRFS_SEND_C_CHMOD		= 18,
8962306a36Sopenharmony_ci	BTRFS_SEND_C_CHOWN		= 19,
9062306a36Sopenharmony_ci	BTRFS_SEND_C_UTIMES		= 20,
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	BTRFS_SEND_C_END		= 21,
9362306a36Sopenharmony_ci	BTRFS_SEND_C_UPDATE_EXTENT	= 22,
9462306a36Sopenharmony_ci	BTRFS_SEND_C_MAX_V1		= 22,
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	/* Version 2 */
9762306a36Sopenharmony_ci	BTRFS_SEND_C_FALLOCATE		= 23,
9862306a36Sopenharmony_ci	BTRFS_SEND_C_FILEATTR		= 24,
9962306a36Sopenharmony_ci	BTRFS_SEND_C_ENCODED_WRITE	= 25,
10062306a36Sopenharmony_ci	BTRFS_SEND_C_MAX_V2		= 25,
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	/* Version 3 */
10362306a36Sopenharmony_ci	BTRFS_SEND_C_ENABLE_VERITY	= 26,
10462306a36Sopenharmony_ci	BTRFS_SEND_C_MAX_V3		= 26,
10562306a36Sopenharmony_ci	/* End */
10662306a36Sopenharmony_ci	BTRFS_SEND_C_MAX		= 26,
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* attributes in send stream */
11062306a36Sopenharmony_cienum {
11162306a36Sopenharmony_ci	BTRFS_SEND_A_UNSPEC		= 0,
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	/* Version 1 */
11462306a36Sopenharmony_ci	BTRFS_SEND_A_UUID		= 1,
11562306a36Sopenharmony_ci	BTRFS_SEND_A_CTRANSID		= 2,
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	BTRFS_SEND_A_INO		= 3,
11862306a36Sopenharmony_ci	BTRFS_SEND_A_SIZE		= 4,
11962306a36Sopenharmony_ci	BTRFS_SEND_A_MODE		= 5,
12062306a36Sopenharmony_ci	BTRFS_SEND_A_UID		= 6,
12162306a36Sopenharmony_ci	BTRFS_SEND_A_GID		= 7,
12262306a36Sopenharmony_ci	BTRFS_SEND_A_RDEV		= 8,
12362306a36Sopenharmony_ci	BTRFS_SEND_A_CTIME		= 9,
12462306a36Sopenharmony_ci	BTRFS_SEND_A_MTIME		= 10,
12562306a36Sopenharmony_ci	BTRFS_SEND_A_ATIME		= 11,
12662306a36Sopenharmony_ci	BTRFS_SEND_A_OTIME		= 12,
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	BTRFS_SEND_A_XATTR_NAME		= 13,
12962306a36Sopenharmony_ci	BTRFS_SEND_A_XATTR_DATA		= 14,
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	BTRFS_SEND_A_PATH		= 15,
13262306a36Sopenharmony_ci	BTRFS_SEND_A_PATH_TO		= 16,
13362306a36Sopenharmony_ci	BTRFS_SEND_A_PATH_LINK		= 17,
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	BTRFS_SEND_A_FILE_OFFSET	= 18,
13662306a36Sopenharmony_ci	/*
13762306a36Sopenharmony_ci	 * As of send stream v2, this attribute is special: it must be the last
13862306a36Sopenharmony_ci	 * attribute in a command, its header contains only the type, and its
13962306a36Sopenharmony_ci	 * length is implicitly the remaining length of the command.
14062306a36Sopenharmony_ci	 */
14162306a36Sopenharmony_ci	BTRFS_SEND_A_DATA		= 19,
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	BTRFS_SEND_A_CLONE_UUID		= 20,
14462306a36Sopenharmony_ci	BTRFS_SEND_A_CLONE_CTRANSID	= 21,
14562306a36Sopenharmony_ci	BTRFS_SEND_A_CLONE_PATH		= 22,
14662306a36Sopenharmony_ci	BTRFS_SEND_A_CLONE_OFFSET	= 23,
14762306a36Sopenharmony_ci	BTRFS_SEND_A_CLONE_LEN		= 24,
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	BTRFS_SEND_A_MAX_V1		= 24,
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	/* Version 2 */
15262306a36Sopenharmony_ci	BTRFS_SEND_A_FALLOCATE_MODE	= 25,
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	/*
15562306a36Sopenharmony_ci	 * File attributes from the FS_*_FL namespace (i_flags, xflags),
15662306a36Sopenharmony_ci	 * translated to BTRFS_INODE_* bits (BTRFS_INODE_FLAG_MASK) and stored
15762306a36Sopenharmony_ci	 * in btrfs_inode_item::flags (represented by btrfs_inode::flags and
15862306a36Sopenharmony_ci	 * btrfs_inode::ro_flags).
15962306a36Sopenharmony_ci	 */
16062306a36Sopenharmony_ci	BTRFS_SEND_A_FILEATTR		= 26,
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	BTRFS_SEND_A_UNENCODED_FILE_LEN	= 27,
16362306a36Sopenharmony_ci	BTRFS_SEND_A_UNENCODED_LEN	= 28,
16462306a36Sopenharmony_ci	BTRFS_SEND_A_UNENCODED_OFFSET	= 29,
16562306a36Sopenharmony_ci	/*
16662306a36Sopenharmony_ci	 * COMPRESSION and ENCRYPTION default to NONE (0) if omitted from
16762306a36Sopenharmony_ci	 * BTRFS_SEND_C_ENCODED_WRITE.
16862306a36Sopenharmony_ci	 */
16962306a36Sopenharmony_ci	BTRFS_SEND_A_COMPRESSION	= 30,
17062306a36Sopenharmony_ci	BTRFS_SEND_A_ENCRYPTION		= 31,
17162306a36Sopenharmony_ci	BTRFS_SEND_A_MAX_V2		= 31,
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	/* Version 3 */
17462306a36Sopenharmony_ci	BTRFS_SEND_A_VERITY_ALGORITHM	= 32,
17562306a36Sopenharmony_ci	BTRFS_SEND_A_VERITY_BLOCK_SIZE	= 33,
17662306a36Sopenharmony_ci	BTRFS_SEND_A_VERITY_SALT_DATA	= 34,
17762306a36Sopenharmony_ci	BTRFS_SEND_A_VERITY_SIG_DATA	= 35,
17862306a36Sopenharmony_ci	BTRFS_SEND_A_MAX_V3		= 35,
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	__BTRFS_SEND_A_MAX		= 35,
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cilong btrfs_ioctl_send(struct inode *inode, struct btrfs_ioctl_send_args *arg);
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci#endif
186