Re: [PATCH v11 14/14] btrfs: send: enable support for stream v2 and compressed writes
From: Nikolay Borisov <hidden>
Date: 2021-10-18 12:44:26
Also in:
linux-btrfs, linux-fsdevel
On 1.09.21 г. 20:01, Omar Sandoval wrote:
From: Omar Sandoval <redacted> Now that the new support is implemented, allow the ioctl to accept the flags and update the version in sysfs.
This seems like an appropriate place to bring up the discussion about versioned streams. SO instead of adding a BTRFS_SEND_FLAG_STREAM_V2 flag, which implies that for the next version we have to add BTRFS_SEND_FLAG_STREAM_V3 etc. Why not generalize the flag to BTRFS_SEND_FLAG_STREAM_VERSIONED and carve an u32 from one of the reserved fields so that in the future we simply increment the version field?
quoted hunk ↗ jump to hunk
Signed-off-by: Omar Sandoval <redacted> --- fs/btrfs/send.c | 10 +++++++++- fs/btrfs/send.h | 2 +- include/uapi/linux/btrfs.h | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-)diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 0ba8dc3a9f56..90ca915fed78 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c@@ -671,7 +671,10 @@ static int send_header(struct send_ctx *sctx) struct btrfs_stream_header hdr; strcpy(hdr.magic, BTRFS_SEND_STREAM_MAGIC); - hdr.version = cpu_to_le32(BTRFS_SEND_STREAM_VERSION); + if (sctx->flags & BTRFS_SEND_FLAG_STREAM_V2) + hdr.version = cpu_to_le32(2); + else + hdr.version = cpu_to_le32(1); return write_buf(sctx->send_filp, &hdr, sizeof(hdr), &sctx->send_off);@@ -7466,6 +7469,11 @@ long btrfs_ioctl_send(struct file *mnt_file, struct btrfs_ioctl_send_args *arg) ret = -EINVAL; goto out; } + if ((arg->flags & BTRFS_SEND_FLAG_COMPRESSED) && + !(arg->flags & BTRFS_SEND_FLAG_STREAM_V2)) { + ret = -EINVAL; + goto out; + } sctx = kzalloc(sizeof(struct send_ctx), GFP_KERNEL); if (!sctx) {diff --git a/fs/btrfs/send.h b/fs/btrfs/send.h index 9f4f7b96b1eb..9c83e14a43b2 100644 --- a/fs/btrfs/send.h +++ b/fs/btrfs/send.h@@ -10,7 +10,7 @@ #include "ctree.h" #define BTRFS_SEND_STREAM_MAGIC "btrfs-stream" -#define BTRFS_SEND_STREAM_VERSION 1 +#define BTRFS_SEND_STREAM_VERSION 2 /* * In send stream v1, no command is larger than 64k. In send stream v2, no limitdiff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h index 4f875f355e83..5c13e407982f 100644 --- a/include/uapi/linux/btrfs.h +++ b/include/uapi/linux/btrfs.h@@ -787,7 +787,9 @@ struct btrfs_ioctl_received_subvol_args { #define BTRFS_SEND_FLAG_MASK \ (BTRFS_SEND_FLAG_NO_FILE_DATA | \ BTRFS_SEND_FLAG_OMIT_STREAM_HEADER | \ - BTRFS_SEND_FLAG_OMIT_END_CMD) + BTRFS_SEND_FLAG_OMIT_END_CMD | \ + BTRFS_SEND_FLAG_STREAM_V2 | \ + BTRFS_SEND_FLAG_COMPRESSED) struct btrfs_ioctl_send_args { __s64 send_fd; /* in */