Btrfs: introduce BTRFS_IOC_SEND for btrfs send/receive
This patch introduces the BTRFS_IOC_SEND ioctl that is required for send. It allows btrfs-progs to implement full and incremental sends. Patches for btrfs-progs will follow. Signed-off-by: Alexander Block <ablock84@googlemail.com> Reviewed-by: David Sterba <dave@jikos.cz> Reviewed-by: Arne Jansen <sensille@gmx.net> Reviewed-by: Jan Schmidt <list.btrfs@jan-o-sch.net> Reviewed-by: Alex Lyakas <alex.bolshoy.btrfs@gmail.com>
This commit is contained in:
		
							parent
							
								
									7069830a9e
								
							
						
					
					
						commit
						31db9f7c23
					
				| @ -8,7 +8,7 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \ | ||||
| 	   extent_io.o volumes.o async-thread.o ioctl.o locking.o orphan.o \
 | ||||
| 	   export.o tree-log.o free-space-cache.o zlib.o lzo.o \
 | ||||
| 	   compression.o delayed-ref.o relocation.o delayed-inode.o scrub.o \
 | ||||
| 	   reada.o backref.o ulist.o | ||||
| 	   reada.o backref.o ulist.o send.o | ||||
| 
 | ||||
| btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o | ||||
| btrfs-$(CONFIG_BTRFS_FS_CHECK_INTEGRITY) += check-integrity.o | ||||
|  | ||||
| @ -54,6 +54,7 @@ | ||||
| #include "inode-map.h" | ||||
| #include "backref.h" | ||||
| #include "rcu-string.h" | ||||
| #include "send.h" | ||||
| 
 | ||||
| /* Mask out flags that are inappropriate for the given type of inode. */ | ||||
| static inline __u32 btrfs_mask_flags(umode_t mode, __u32 flags) | ||||
| @ -3571,6 +3572,8 @@ long btrfs_ioctl(struct file *file, unsigned int | ||||
| 		return btrfs_ioctl_balance_progress(root, argp); | ||||
| 	case BTRFS_IOC_SET_RECEIVED_SUBVOL: | ||||
| 		return btrfs_ioctl_set_received_subvol(file, argp); | ||||
| 	case BTRFS_IOC_SEND: | ||||
| 		return btrfs_ioctl_send(file, argp); | ||||
| 	case BTRFS_IOC_GET_DEV_STATS: | ||||
| 		return btrfs_ioctl_get_dev_stats(root, argp, 0); | ||||
| 	case BTRFS_IOC_GET_AND_RESET_DEV_STATS: | ||||
|  | ||||
| @ -310,6 +310,15 @@ struct btrfs_ioctl_received_subvol_args { | ||||
| 	__u64	reserved[16];		/* in */ | ||||
| }; | ||||
| 
 | ||||
| struct btrfs_ioctl_send_args { | ||||
| 	__s64 send_fd;			/* in */ | ||||
| 	__u64 clone_sources_count;	/* in */ | ||||
| 	__u64 __user *clone_sources;	/* in */ | ||||
| 	__u64 parent_root;		/* in */ | ||||
| 	__u64 flags;			/* in */ | ||||
| 	__u64 reserved[4];		/* in */ | ||||
| }; | ||||
| 
 | ||||
| #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ | ||||
| 				   struct btrfs_ioctl_vol_args) | ||||
| #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ | ||||
| @ -376,6 +385,7 @@ struct btrfs_ioctl_received_subvol_args { | ||||
| 					struct btrfs_ioctl_ino_path_args) | ||||
| #define BTRFS_IOC_SET_RECEIVED_SUBVOL _IOWR(BTRFS_IOCTL_MAGIC, 37, \ | ||||
| 				struct btrfs_ioctl_received_subvol_args) | ||||
| #define BTRFS_IOC_SEND _IOW(BTRFS_IOCTL_MAGIC, 38, struct btrfs_ioctl_send_args) | ||||
| #define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, \ | ||||
| 				      struct btrfs_ioctl_get_dev_stats) | ||||
| #define BTRFS_IOC_GET_AND_RESET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 53, \ | ||||
|  | ||||
							
								
								
									
										4570
									
								
								fs/btrfs/send.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4570
									
								
								fs/btrfs/send.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										133
									
								
								fs/btrfs/send.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								fs/btrfs/send.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,133 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2012 Alexander Block.  All rights reserved. | ||||
|  * Copyright (C) 2012 STRATO.  All rights reserved. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public | ||||
|  * License v2 as published by the Free Software Foundation. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public | ||||
|  * License along with this program; if not, write to the | ||||
|  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||||
|  * Boston, MA 021110-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include "ctree.h" | ||||
| 
 | ||||
| #define BTRFS_SEND_STREAM_MAGIC "btrfs-stream" | ||||
| #define BTRFS_SEND_STREAM_VERSION 1 | ||||
| 
 | ||||
| #define BTRFS_SEND_BUF_SIZE (1024 * 64) | ||||
| #define BTRFS_SEND_READ_SIZE (1024 * 48) | ||||
| 
 | ||||
| enum btrfs_tlv_type { | ||||
| 	BTRFS_TLV_U8, | ||||
| 	BTRFS_TLV_U16, | ||||
| 	BTRFS_TLV_U32, | ||||
| 	BTRFS_TLV_U64, | ||||
| 	BTRFS_TLV_BINARY, | ||||
| 	BTRFS_TLV_STRING, | ||||
| 	BTRFS_TLV_UUID, | ||||
| 	BTRFS_TLV_TIMESPEC, | ||||
| }; | ||||
| 
 | ||||
| struct btrfs_stream_header { | ||||
| 	char magic[sizeof(BTRFS_SEND_STREAM_MAGIC)]; | ||||
| 	__le32 version; | ||||
| } __attribute__ ((__packed__)); | ||||
| 
 | ||||
| struct btrfs_cmd_header { | ||||
| 	/* len excluding the header */ | ||||
| 	__le32 len; | ||||
| 	__le16 cmd; | ||||
| 	/* crc including the header with zero crc field */ | ||||
| 	__le32 crc; | ||||
| } __attribute__ ((__packed__)); | ||||
| 
 | ||||
| struct btrfs_tlv_header { | ||||
| 	__le16 tlv_type; | ||||
| 	/* len excluding the header */ | ||||
| 	__le16 tlv_len; | ||||
| } __attribute__ ((__packed__)); | ||||
| 
 | ||||
| /* commands */ | ||||
| enum btrfs_send_cmd { | ||||
| 	BTRFS_SEND_C_UNSPEC, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_SUBVOL, | ||||
| 	BTRFS_SEND_C_SNAPSHOT, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_MKFILE, | ||||
| 	BTRFS_SEND_C_MKDIR, | ||||
| 	BTRFS_SEND_C_MKNOD, | ||||
| 	BTRFS_SEND_C_MKFIFO, | ||||
| 	BTRFS_SEND_C_MKSOCK, | ||||
| 	BTRFS_SEND_C_SYMLINK, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_RENAME, | ||||
| 	BTRFS_SEND_C_LINK, | ||||
| 	BTRFS_SEND_C_UNLINK, | ||||
| 	BTRFS_SEND_C_RMDIR, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_SET_XATTR, | ||||
| 	BTRFS_SEND_C_REMOVE_XATTR, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_WRITE, | ||||
| 	BTRFS_SEND_C_CLONE, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_TRUNCATE, | ||||
| 	BTRFS_SEND_C_CHMOD, | ||||
| 	BTRFS_SEND_C_CHOWN, | ||||
| 	BTRFS_SEND_C_UTIMES, | ||||
| 
 | ||||
| 	BTRFS_SEND_C_END, | ||||
| 	__BTRFS_SEND_C_MAX, | ||||
| }; | ||||
| #define BTRFS_SEND_C_MAX (__BTRFS_SEND_C_MAX - 1) | ||||
| 
 | ||||
| /* attributes in send stream */ | ||||
| enum { | ||||
| 	BTRFS_SEND_A_UNSPEC, | ||||
| 
 | ||||
| 	BTRFS_SEND_A_UUID, | ||||
| 	BTRFS_SEND_A_CTRANSID, | ||||
| 
 | ||||
| 	BTRFS_SEND_A_INO, | ||||
| 	BTRFS_SEND_A_SIZE, | ||||
| 	BTRFS_SEND_A_MODE, | ||||
| 	BTRFS_SEND_A_UID, | ||||
| 	BTRFS_SEND_A_GID, | ||||
| 	BTRFS_SEND_A_RDEV, | ||||
| 	BTRFS_SEND_A_CTIME, | ||||
| 	BTRFS_SEND_A_MTIME, | ||||
| 	BTRFS_SEND_A_ATIME, | ||||
| 	BTRFS_SEND_A_OTIME, | ||||
| 
 | ||||
| 	BTRFS_SEND_A_XATTR_NAME, | ||||
| 	BTRFS_SEND_A_XATTR_DATA, | ||||
| 
 | ||||
| 	BTRFS_SEND_A_PATH, | ||||
| 	BTRFS_SEND_A_PATH_TO, | ||||
| 	BTRFS_SEND_A_PATH_LINK, | ||||
| 
 | ||||
| 	BTRFS_SEND_A_FILE_OFFSET, | ||||
| 	BTRFS_SEND_A_DATA, | ||||
| 
 | ||||
| 	BTRFS_SEND_A_CLONE_UUID, | ||||
| 	BTRFS_SEND_A_CLONE_CTRANSID, | ||||
| 	BTRFS_SEND_A_CLONE_PATH, | ||||
| 	BTRFS_SEND_A_CLONE_OFFSET, | ||||
| 	BTRFS_SEND_A_CLONE_LEN, | ||||
| 
 | ||||
| 	__BTRFS_SEND_A_MAX, | ||||
| }; | ||||
| #define BTRFS_SEND_A_MAX (__BTRFS_SEND_A_MAX - 1) | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
| long btrfs_ioctl_send(struct file *mnt_file, void __user *arg); | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user