btrfs-progs: send: add option to for the no-data mode
authorDavid Sterba <dsterba@suse.cz>
Fri, 12 Jun 2015 11:15:41 +0000 (13:15 +0200)
committerDavid Sterba <dsterba@suse.cz>
Fri, 12 Jun 2015 14:44:47 +0000 (16:44 +0200)
Signed-off-by: David Sterba <dsterba@suse.cz>
Documentation/btrfs-send.asciidoc
cmds-send.c

index 6721428..1dba8a3 100644 (file)
@@ -40,6 +40,10 @@ Use this snapshot as a clone source for an incremental send (multiple allowed).
 -f <outfile>::
 Output is normally written to stdout. To write to a file, use this option.
 An alternative would be to use pipes.
+--no-data::
+Send in NO_FILE_DATA mode. The output stream does not contain any file
+data and thus cannot be used to transfer changes. This mode is faster and
+useful to show the differences in metadata.
 
 EXIT STATUS
 -----------
index e59ba50..5c46658 100644 (file)
@@ -31,7 +31,7 @@
 #include <libgen.h>
 #include <mntent.h>
 #include <assert.h>
-
+#include <getopt.h>
 #include <uuid/uuid.h>
 
 #include "ctree.h"
@@ -243,7 +243,8 @@ out:
 }
 
 static int do_send(struct btrfs_send *send, u64 parent_root_id,
-                  int is_first_subvol, int is_last_subvol, char *subvol)
+                  int is_first_subvol, int is_last_subvol, char *subvol,
+                  u64 flags)
 {
        int ret;
        pthread_t t_read;
@@ -281,6 +282,7 @@ static int do_send(struct btrfs_send *send, u64 parent_root_id,
                goto out;
        }
 
+       io_send.flags = flags;
        io_send.clone_sources = (__u64*)send->clone_sources;
        io_send.clone_sources_count = send->clone_sources_count;
        io_send.parent_root = parent_root_id;
@@ -424,7 +426,6 @@ out:
 int cmd_send(int argc, char **argv)
 {
        char *subvol = NULL;
-       int c;
        int ret;
        char *outname = NULL;
        struct btrfs_send send;
@@ -435,11 +436,21 @@ int cmd_send(int argc, char **argv)
        u64 parent_root_id = 0;
        int full_send = 1;
        int new_end_cmd_semantic = 0;
+       u64 send_flags = 0;
 
        memset(&send, 0, sizeof(send));
        send.dump_fd = fileno(stdout);
 
-       while ((c = getopt(argc, argv, "vec:f:i:p:")) != -1) {
+       while (1) {
+               enum { GETOPT_VAL_SEND_NO_DATA = 256 };
+               static const struct option long_options[] = {
+                       { "no-data", no_argument, NULL, GETOPT_VAL_SEND_NO_DATA }
+               };
+               int c = getopt_long(argc, argv, "vec:f:i:p:", long_options, NULL);
+
+               if (c < 0)
+                       break;
+
                switch (c) {
                case 'v':
                        g_verbose++;
@@ -530,6 +541,9 @@ int cmd_send(int argc, char **argv)
                                "ERROR: -i was removed, use -c instead\n");
                        ret = 1;
                        goto out;
+               case GETOPT_VAL_SEND_NO_DATA:
+                       send_flags |= BTRFS_SEND_FLAG_NO_FILE_DATA;
+                       break;
                case '?':
                default:
                        fprintf(stderr, "ERROR: send args invalid.\n");
@@ -632,6 +646,9 @@ int cmd_send(int argc, char **argv)
                }
        }
 
+       if (send_flags & BTRFS_SEND_FLAG_NO_FILE_DATA)
+               printf("Mode NO_FILE_DATA enabled\n");
+
        for (i = optind; i < argc; i++) {
                int is_first_subvol;
                int is_last_subvol;
@@ -678,7 +695,7 @@ int cmd_send(int argc, char **argv)
                        is_last_subvol = 1;
                }
                ret = do_send(&send, parent_root_id, is_first_subvol,
-                             is_last_subvol, subvol);
+                             is_last_subvol, subvol, send_flags);
                if (ret < 0)
                        goto out;
 
@@ -731,5 +748,9 @@ const char * const cmd_send_usage[] = {
        "-f <outfile>     Output is normally written to stdout. To write to",
        "                 a file, use this option. An alternative would be to",
        "                 use pipes.",
+       "--no-data        send in NO_FILE_DATA mode, Note: the output stream",
+       "                 does not contain any file data and thus cannot be used",
+       "                 to transfer changes. This mode is faster and useful to",
+       "                 show the differences in metadata.",
        NULL
 };