mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
cb95e7bf7b
This patch adds the flag, BTRFS_SEND_FLAG_NO_FILE_DATA to the btrfs send ioctl code. When this flag is set, the btrfs send code will never write file data into the stream (thus also avoiding expensive reads of that data in the first place). BTRFS_SEND_C_UPDATE_EXTENT commands will be sent (instead of BTRFS_SEND_C_WRITE) with an offset, length pair indicating the extent in question. This patch does not affect the operation of BTRFS_SEND_C_CLONE commands - they will continue to be sent when a search finds an appropriate extent to clone from. Signed-off-by: Mark Fasheh <mfasheh@suse.de> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
136 lines
3.0 KiB
C
136 lines
3.0 KiB
C
/*
|
|
* 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_UPDATE_EXTENT,
|
|
__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);
|
|
int write_buf(struct file *filp, const void *buf, u32 len, loff_t *off);
|
|
#endif
|