mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-26 08:02:21 +00:00
46de1a6ec3
A new option is added to btrfs-receive to change the behavior when an <end cmd> is received in the Btrfs send stream. The traditional behavior (which still is the default) is to continue to read the stream until an EOF condition is encountered. If an <end cmd> is received, afterwards either an EOF or a new <stream header> is expected. The new behavior (if the -e option is set on the command line) is to terminate after an <end cmd> is read without the need for an EOF. This allows the stream (e.g. a single TCP stream) to carry additional data or even multiple Btrfs send streams. Old btrfs-send tools used to encode multiple snapshots like this (with 2 snapshots in this example): <stream header> + <sequence of commands> + <end cmd> + <stream header> + <sequence of commands> + <end cmd> + EOF If the new -e option is set, the expected format is like this: <stream header> + <sequence of commands> + <sequence of commands> + <end cmd> The btrfs-send tool is changed in a seperate commit to always use the new format, i.e. to send an <end cmd> only at the end. Note that the currently existing receivers treat <end cmd> only as an indication that a new <stream header> is following. This means, you can just skip the sequence <end cmd> <stream header> without loosing compatibility. As long as an EOF is following, the currently existing receivers handle the new format (if the two new flags are used) exactly as the old one. The goal of changing the semantic of <end cmd> is to be able to use a single stream (one TCP connection) to multiplex a request/response handshake plus Btrfs send streams, all in the same stream. In this case you cannot evaluate an EOF condition as an end of the Btrfs send stream. You need something else, and the <end cmd> is just perfect for this purpose. Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
68 lines
2.5 KiB
C
68 lines
2.5 KiB
C
/*
|
|
* Copyright (C) 2012 Alexander Block. 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.
|
|
*/
|
|
#ifndef SEND_STREAM_H_
|
|
#define SEND_STREAM_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct btrfs_send_ops {
|
|
int (*subvol)(const char *path, const u8 *uuid, u64 ctransid,
|
|
void *user);
|
|
int (*snapshot)(const char *path, const u8 *uuid, u64 ctransid,
|
|
const u8 *parent_uuid, u64 parent_ctransid,
|
|
void *user);
|
|
int (*mkfile)(const char *path, void *user);
|
|
int (*mkdir)(const char *path, void *user);
|
|
int (*mknod)(const char *path, u64 mode, u64 dev, void *user);
|
|
int (*mkfifo)(const char *path, void *user);
|
|
int (*mksock)(const char *path, void *user);
|
|
int (*symlink)(const char *path, const char *lnk, void *user);
|
|
int (*rename)(const char *from, const char *to, void *user);
|
|
int (*link)(const char *path, const char *lnk, void *user);
|
|
int (*unlink)(const char *path, void *user);
|
|
int (*rmdir)(const char *path, void *user);
|
|
int (*write)(const char *path, const void *data, u64 offset, u64 len,
|
|
void *user);
|
|
int (*clone)(const char *path, u64 offset, u64 len,
|
|
const u8 *clone_uuid, u64 clone_ctransid,
|
|
const char *clone_path, u64 clone_offset,
|
|
void *user);
|
|
int (*set_xattr)(const char *path, const char *name, const void *data,
|
|
int len, void *user);
|
|
int (*remove_xattr)(const char *path, const char *name, void *user);
|
|
int (*truncate)(const char *path, u64 size, void *user);
|
|
int (*chmod)(const char *path, u64 mode, void *user);
|
|
int (*chown)(const char *path, u64 uid, u64 gid, void *user);
|
|
int (*utimes)(const char *path, struct timespec *at,
|
|
struct timespec *mt, struct timespec *ct,
|
|
void *user);
|
|
int (*update_extent)(const char *path, u64 offset, u64 len, void *user);
|
|
};
|
|
|
|
int btrfs_read_and_process_send_stream(int fd,
|
|
struct btrfs_send_ops *ops, void *user,
|
|
int honor_end_cmd);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* SEND_STREAM_H_ */
|