19888c340SDavid Sterba /* SPDX-License-Identifier: GPL-2.0 */ 231db9f7cSAlexander Block /* 331db9f7cSAlexander Block * Copyright (C) 2012 Alexander Block. All rights reserved. 431db9f7cSAlexander Block * Copyright (C) 2012 STRATO. All rights reserved. 531db9f7cSAlexander Block */ 631db9f7cSAlexander Block 79888c340SDavid Sterba #ifndef BTRFS_SEND_H 89888c340SDavid Sterba #define BTRFS_SEND_H 99888c340SDavid Sterba 108234d3f6SDavid Sterba #include <linux/types.h> 1131db9f7cSAlexander Block 1231db9f7cSAlexander Block #define BTRFS_SEND_STREAM_MAGIC "btrfs-stream" 139971a741SBoris Burkov /* Conditional support for the upcoming protocol version. */ 149971a741SBoris Burkov #ifdef CONFIG_BTRFS_DEBUG 159971a741SBoris Burkov #define BTRFS_SEND_STREAM_VERSION 3 169971a741SBoris Burkov #else 17d6815592SOmar Sandoval #define BTRFS_SEND_STREAM_VERSION 2 189971a741SBoris Burkov #endif 1931db9f7cSAlexander Block 20b7c14f23SOmar Sandoval /* 21*875c627cSWang Yugui * In send stream v1, no command is larger than 64K. In send stream v2, no 22*875c627cSWang Yugui * limit should be assumed, the buffer size is set to be a header with 23*875c627cSWang Yugui * compressed extent size. 24b7c14f23SOmar Sandoval */ 25b7c14f23SOmar Sandoval #define BTRFS_SEND_BUF_SIZE_V1 SZ_64K 26*875c627cSWang Yugui #define BTRFS_SEND_BUF_SIZE_V2 ALIGN(SZ_16K + BTRFS_MAX_COMPRESSED, PAGE_SIZE) 2731db9f7cSAlexander Block 288234d3f6SDavid Sterba struct inode; 298234d3f6SDavid Sterba struct btrfs_ioctl_send_args; 308234d3f6SDavid Sterba 3131db9f7cSAlexander Block enum btrfs_tlv_type { 3231db9f7cSAlexander Block BTRFS_TLV_U8, 3331db9f7cSAlexander Block BTRFS_TLV_U16, 3431db9f7cSAlexander Block BTRFS_TLV_U32, 3531db9f7cSAlexander Block BTRFS_TLV_U64, 3631db9f7cSAlexander Block BTRFS_TLV_BINARY, 3731db9f7cSAlexander Block BTRFS_TLV_STRING, 3831db9f7cSAlexander Block BTRFS_TLV_UUID, 3931db9f7cSAlexander Block BTRFS_TLV_TIMESPEC, 4031db9f7cSAlexander Block }; 4131db9f7cSAlexander Block 4231db9f7cSAlexander Block struct btrfs_stream_header { 4331db9f7cSAlexander Block char magic[sizeof(BTRFS_SEND_STREAM_MAGIC)]; 4431db9f7cSAlexander Block __le32 version; 4531db9f7cSAlexander Block } __attribute__ ((__packed__)); 4631db9f7cSAlexander Block 4731db9f7cSAlexander Block struct btrfs_cmd_header { 4831db9f7cSAlexander Block /* len excluding the header */ 4931db9f7cSAlexander Block __le32 len; 5031db9f7cSAlexander Block __le16 cmd; 5131db9f7cSAlexander Block /* crc including the header with zero crc field */ 5231db9f7cSAlexander Block __le32 crc; 5331db9f7cSAlexander Block } __attribute__ ((__packed__)); 5431db9f7cSAlexander Block 5531db9f7cSAlexander Block struct btrfs_tlv_header { 5631db9f7cSAlexander Block __le16 tlv_type; 5731db9f7cSAlexander Block /* len excluding the header */ 5831db9f7cSAlexander Block __le16 tlv_len; 5931db9f7cSAlexander Block } __attribute__ ((__packed__)); 6031db9f7cSAlexander Block 6131db9f7cSAlexander Block /* commands */ 6231db9f7cSAlexander Block enum btrfs_send_cmd { 6354cab6afSOmar Sandoval BTRFS_SEND_C_UNSPEC = 0, 6431db9f7cSAlexander Block 65e77fbf99SDavid Sterba /* Version 1 */ 6654cab6afSOmar Sandoval BTRFS_SEND_C_SUBVOL = 1, 6754cab6afSOmar Sandoval BTRFS_SEND_C_SNAPSHOT = 2, 6831db9f7cSAlexander Block 6954cab6afSOmar Sandoval BTRFS_SEND_C_MKFILE = 3, 7054cab6afSOmar Sandoval BTRFS_SEND_C_MKDIR = 4, 7154cab6afSOmar Sandoval BTRFS_SEND_C_MKNOD = 5, 7254cab6afSOmar Sandoval BTRFS_SEND_C_MKFIFO = 6, 7354cab6afSOmar Sandoval BTRFS_SEND_C_MKSOCK = 7, 7454cab6afSOmar Sandoval BTRFS_SEND_C_SYMLINK = 8, 7531db9f7cSAlexander Block 7654cab6afSOmar Sandoval BTRFS_SEND_C_RENAME = 9, 7754cab6afSOmar Sandoval BTRFS_SEND_C_LINK = 10, 7854cab6afSOmar Sandoval BTRFS_SEND_C_UNLINK = 11, 7954cab6afSOmar Sandoval BTRFS_SEND_C_RMDIR = 12, 8031db9f7cSAlexander Block 8154cab6afSOmar Sandoval BTRFS_SEND_C_SET_XATTR = 13, 8254cab6afSOmar Sandoval BTRFS_SEND_C_REMOVE_XATTR = 14, 8331db9f7cSAlexander Block 8454cab6afSOmar Sandoval BTRFS_SEND_C_WRITE = 15, 8554cab6afSOmar Sandoval BTRFS_SEND_C_CLONE = 16, 8631db9f7cSAlexander Block 8754cab6afSOmar Sandoval BTRFS_SEND_C_TRUNCATE = 17, 8854cab6afSOmar Sandoval BTRFS_SEND_C_CHMOD = 18, 8954cab6afSOmar Sandoval BTRFS_SEND_C_CHOWN = 19, 9054cab6afSOmar Sandoval BTRFS_SEND_C_UTIMES = 20, 9131db9f7cSAlexander Block 9254cab6afSOmar Sandoval BTRFS_SEND_C_END = 21, 9354cab6afSOmar Sandoval BTRFS_SEND_C_UPDATE_EXTENT = 22, 9454cab6afSOmar Sandoval BTRFS_SEND_C_MAX_V1 = 22, 95e77fbf99SDavid Sterba 96e77fbf99SDavid Sterba /* Version 2 */ 97b7c14f23SOmar Sandoval BTRFS_SEND_C_FALLOCATE = 23, 9848247359SDavid Sterba BTRFS_SEND_C_FILEATTR = 24, 99b7c14f23SOmar Sandoval BTRFS_SEND_C_ENCODED_WRITE = 25, 100b7c14f23SOmar Sandoval BTRFS_SEND_C_MAX_V2 = 25, 101e77fbf99SDavid Sterba 10238622010SBoris Burkov /* Version 3 */ 10338622010SBoris Burkov BTRFS_SEND_C_ENABLE_VERITY = 26, 10438622010SBoris Burkov BTRFS_SEND_C_MAX_V3 = 26, 105e77fbf99SDavid Sterba /* End */ 10638622010SBoris Burkov BTRFS_SEND_C_MAX = 26, 10731db9f7cSAlexander Block }; 10831db9f7cSAlexander Block 10931db9f7cSAlexander Block /* attributes in send stream */ 11031db9f7cSAlexander Block enum { 11154cab6afSOmar Sandoval BTRFS_SEND_A_UNSPEC = 0, 11231db9f7cSAlexander Block 113b7c14f23SOmar Sandoval /* Version 1 */ 11454cab6afSOmar Sandoval BTRFS_SEND_A_UUID = 1, 11554cab6afSOmar Sandoval BTRFS_SEND_A_CTRANSID = 2, 11631db9f7cSAlexander Block 11754cab6afSOmar Sandoval BTRFS_SEND_A_INO = 3, 11854cab6afSOmar Sandoval BTRFS_SEND_A_SIZE = 4, 11954cab6afSOmar Sandoval BTRFS_SEND_A_MODE = 5, 12054cab6afSOmar Sandoval BTRFS_SEND_A_UID = 6, 12154cab6afSOmar Sandoval BTRFS_SEND_A_GID = 7, 12254cab6afSOmar Sandoval BTRFS_SEND_A_RDEV = 8, 12354cab6afSOmar Sandoval BTRFS_SEND_A_CTIME = 9, 12454cab6afSOmar Sandoval BTRFS_SEND_A_MTIME = 10, 12554cab6afSOmar Sandoval BTRFS_SEND_A_ATIME = 11, 12654cab6afSOmar Sandoval BTRFS_SEND_A_OTIME = 12, 12731db9f7cSAlexander Block 12854cab6afSOmar Sandoval BTRFS_SEND_A_XATTR_NAME = 13, 12954cab6afSOmar Sandoval BTRFS_SEND_A_XATTR_DATA = 14, 13031db9f7cSAlexander Block 13154cab6afSOmar Sandoval BTRFS_SEND_A_PATH = 15, 13254cab6afSOmar Sandoval BTRFS_SEND_A_PATH_TO = 16, 13354cab6afSOmar Sandoval BTRFS_SEND_A_PATH_LINK = 17, 13431db9f7cSAlexander Block 13554cab6afSOmar Sandoval BTRFS_SEND_A_FILE_OFFSET = 18, 136b7c14f23SOmar Sandoval /* 137b7c14f23SOmar Sandoval * As of send stream v2, this attribute is special: it must be the last 138b7c14f23SOmar Sandoval * attribute in a command, its header contains only the type, and its 139b7c14f23SOmar Sandoval * length is implicitly the remaining length of the command. 140b7c14f23SOmar Sandoval */ 14154cab6afSOmar Sandoval BTRFS_SEND_A_DATA = 19, 14231db9f7cSAlexander Block 14354cab6afSOmar Sandoval BTRFS_SEND_A_CLONE_UUID = 20, 14454cab6afSOmar Sandoval BTRFS_SEND_A_CLONE_CTRANSID = 21, 14554cab6afSOmar Sandoval BTRFS_SEND_A_CLONE_PATH = 22, 14654cab6afSOmar Sandoval BTRFS_SEND_A_CLONE_OFFSET = 23, 14754cab6afSOmar Sandoval BTRFS_SEND_A_CLONE_LEN = 24, 14831db9f7cSAlexander Block 149b7c14f23SOmar Sandoval BTRFS_SEND_A_MAX_V1 = 24, 150b7c14f23SOmar Sandoval 151b7c14f23SOmar Sandoval /* Version 2 */ 152b7c14f23SOmar Sandoval BTRFS_SEND_A_FALLOCATE_MODE = 25, 153b7c14f23SOmar Sandoval 15448247359SDavid Sterba /* 15548247359SDavid Sterba * File attributes from the FS_*_FL namespace (i_flags, xflags), 15648247359SDavid Sterba * translated to BTRFS_INODE_* bits (BTRFS_INODE_FLAG_MASK) and stored 15748247359SDavid Sterba * in btrfs_inode_item::flags (represented by btrfs_inode::flags and 15848247359SDavid Sterba * btrfs_inode::ro_flags). 15948247359SDavid Sterba */ 16048247359SDavid Sterba BTRFS_SEND_A_FILEATTR = 26, 161b7c14f23SOmar Sandoval 162b7c14f23SOmar Sandoval BTRFS_SEND_A_UNENCODED_FILE_LEN = 27, 163b7c14f23SOmar Sandoval BTRFS_SEND_A_UNENCODED_LEN = 28, 164b7c14f23SOmar Sandoval BTRFS_SEND_A_UNENCODED_OFFSET = 29, 165b7c14f23SOmar Sandoval /* 166b7c14f23SOmar Sandoval * COMPRESSION and ENCRYPTION default to NONE (0) if omitted from 167b7c14f23SOmar Sandoval * BTRFS_SEND_C_ENCODED_WRITE. 168b7c14f23SOmar Sandoval */ 169b7c14f23SOmar Sandoval BTRFS_SEND_A_COMPRESSION = 30, 170b7c14f23SOmar Sandoval BTRFS_SEND_A_ENCRYPTION = 31, 171b7c14f23SOmar Sandoval BTRFS_SEND_A_MAX_V2 = 31, 172b7c14f23SOmar Sandoval 17338622010SBoris Burkov /* Version 3 */ 17438622010SBoris Burkov BTRFS_SEND_A_VERITY_ALGORITHM = 32, 17538622010SBoris Burkov BTRFS_SEND_A_VERITY_BLOCK_SIZE = 33, 17638622010SBoris Burkov BTRFS_SEND_A_VERITY_SALT_DATA = 34, 17738622010SBoris Burkov BTRFS_SEND_A_VERITY_SIG_DATA = 35, 17838622010SBoris Burkov BTRFS_SEND_A_MAX_V3 = 35, 17938622010SBoris Burkov 18038622010SBoris Burkov __BTRFS_SEND_A_MAX = 35, 18131db9f7cSAlexander Block }; 18231db9f7cSAlexander Block 1839ad12305SSahil Kang long btrfs_ioctl_send(struct inode *inode, struct btrfs_ioctl_send_args *arg); 1849888c340SDavid Sterba 1859888c340SDavid Sterba #endif 186