btrfs-progs: Add support for BTRFS_SEND_FLAG_NO_FILE_DATA
authorMark Fasheh <mfasheh@suse.de>
Wed, 30 Jan 2013 22:50:23 +0000 (14:50 -0800)
committerDavid Sterba <dsterba@suse.cz>
Tue, 12 Feb 2013 22:46:15 +0000 (23:46 +0100)
The flag and command are synced from kernel to user. Also, this patch adds a
callback for the BTRFS_SEND_C_UPDATE_EXTENT in struct btrfs_send_ops.
read_and_process_cmd() is updated to decode BTRFS_SEND_C_UPDATE_EXTENT and
send the values through the right callback. I did not add a callback
definition to cmds-receive.c as that code never uses
BTRFS_SEND_FLAG_NO_FILE_DATA.

Signed-off-by: Mark Fasheh <mfasheh@suse.de>
ioctl.h
send-stream.c
send-stream.h
send.h

diff --git a/ioctl.h b/ioctl.h
index d57afb2..8c32a2a 100644 (file)
--- a/ioctl.h
+++ b/ioctl.h
@@ -364,6 +364,13 @@ struct btrfs_ioctl_received_subvol_args {
        __u64   reserved[16];           /* in */
 };
 
+/*
+ * Caller doesn't want file data in the send stream, even if the
+ * search of clone sources doesn't find an extent. UPDATE_EXTENT
+ * commands will be sent instead of WRITE commands.
+ */
+#define        BTRFS_SEND_FLAG_NO_FILE_DATA    0x1
+
 struct btrfs_ioctl_send_args {
        __s64 send_fd;                  /* in */
        __u64 clone_sources_count;      /* in */
index 55fa728..a3628e4 100644 (file)
@@ -418,6 +418,12 @@ static int read_and_process_cmd(struct btrfs_send_stream *s)
                TLV_GET_TIMESPEC(s, BTRFS_SEND_A_CTIME, &ct);
                ret = s->ops->utimes(path, &at, &mt, &ct, s->user);
                break;
+       case BTRFS_SEND_C_UPDATE_EXTENT:
+               TLV_GET_STRING(s, BTRFS_SEND_A_PATH, &path);
+               TLV_GET_U64(s, BTRFS_SEND_A_FILE_OFFSET, &offset);
+               TLV_GET_U64(s, BTRFS_SEND_A_SIZE, &tmp);
+               ret = s->ops->update_extent(path, offset, tmp, s->user);
+               break;
        case BTRFS_SEND_C_END:
                ret = 1;
                break;
index b69b7f1..9a17e32 100644 (file)
@@ -49,6 +49,7 @@ struct btrfs_send_ops {
        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,
diff --git a/send.h b/send.h
index 9934e94..48d425a 100644 (file)
--- a/send.h
+++ b/send.h
@@ -86,6 +86,7 @@ enum btrfs_send_cmd {
        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)