From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v2.1 08/10] btrfs-progs: image: Introduce -d option to dump data
Date: Thu, 4 Jul 2019 14:11:01 +0800 [thread overview]
Message-ID: <20190704061103.20096-9-wqu@suse.com> (raw)
In-Reply-To: <20190704061103.20096-1-wqu@suse.com>
This new data dump feature will dump the whole image, not long the
existing tree blocks but also all its data extents(*).
This feature will rely on the new dump format (_DUmP_v1), as it needs
extra large extent size limit, and older btrfs-image dump can't handle
such large item/cluster size.
Since we're dumping all extents including data extents, for the restored
image there is no need to use any extra super block flags to inform
kernel.
Kernel should just treat the restored image as any ordinary btrfs.
*: The data extents will be dumped as is, that's to say, even for
preallocated extent, its (meaningless) data will be read out and
dumpped.
This behavior will cause extra space usage for the image, but we can
skip all the complex partially shared preallocated extent check.
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
image/main.c | 53 +++++++++++++++++++++++++++++++++++++-----------
image/metadump.h | 2 +-
2 files changed, 42 insertions(+), 13 deletions(-)
diff --git a/image/main.c b/image/main.c
index a82d21b01b46..922a046272a8 100644
--- a/image/main.c
+++ b/image/main.c
@@ -52,7 +52,15 @@ const struct dump_version dump_versions[NR_DUMP_VERSIONS] = {
{ .version = 0,
.max_pending_size = SZ_256K,
.magic_cpu = 0xbd5c25e27295668bULL,
- .extra_sb_flags = 1 }
+ .extra_sb_flags = 1 },
+ /*
+ * The newer format, with much larger item size to contain
+ * any data extent.
+ */
+ { .version = 1,
+ .max_pending_size = SZ_256M,
+ .magic_cpu = 0x31765f506d55445fULL, /* ascii _DUmP_v1, no null */
+ .extra_sb_flags = 0 },
};
const struct dump_version *current_version = &dump_versions[0];
@@ -452,10 +460,14 @@ static void metadump_destroy(struct metadump_struct *md, int num_threads)
static int metadump_init(struct metadump_struct *md, struct btrfs_root *root,
FILE *out, int num_threads, int compress_level,
- enum sanitize_mode sanitize_names)
+ bool dump_data, enum sanitize_mode sanitize_names)
{
int i, ret = 0;
+ /* We need larger item/cluster limit for data extents */
+ if (dump_data)
+ current_version = &dump_versions[1];
+
memset(md, 0, sizeof(*md));
INIT_LIST_HEAD(&md->list);
INIT_LIST_HEAD(&md->ordered);
@@ -883,7 +895,7 @@ static int copy_space_cache(struct btrfs_root *root,
}
static int copy_from_extent_tree(struct metadump_struct *metadump,
- struct btrfs_path *path)
+ struct btrfs_path *path, bool dump_data)
{
struct btrfs_root *extent_root;
struct extent_buffer *leaf;
@@ -948,9 +960,15 @@ static int copy_from_extent_tree(struct metadump_struct *metadump,
ei = btrfs_item_ptr(leaf, path->slots[0],
struct btrfs_extent_item);
if (btrfs_extent_flags(leaf, ei) &
- BTRFS_EXTENT_FLAG_TREE_BLOCK) {
+ BTRFS_EXTENT_FLAG_TREE_BLOCK ||
+ btrfs_extent_flags(leaf, ei) &
+ BTRFS_EXTENT_FLAG_DATA) {
+ bool is_data;
+
+ is_data = btrfs_extent_flags(leaf, ei) &
+ BTRFS_EXTENT_FLAG_DATA;
ret = add_extent(bytenr, num_bytes, metadump,
- 0);
+ is_data);
if (ret) {
error("unable to add block %llu: %d",
(unsigned long long)bytenr, ret);
@@ -973,7 +991,7 @@ static int copy_from_extent_tree(struct metadump_struct *metadump,
static int create_metadump(const char *input, FILE *out, int num_threads,
int compress_level, enum sanitize_mode sanitize,
- int walk_trees)
+ int walk_trees, bool dump_data)
{
struct btrfs_root *root;
struct btrfs_path path;
@@ -988,7 +1006,7 @@ static int create_metadump(const char *input, FILE *out, int num_threads,
}
ret = metadump_init(&metadump, root, out, num_threads,
- compress_level, sanitize);
+ compress_level, dump_data, sanitize);
if (ret) {
error("failed to initialize metadump: %d", ret);
close_ctree(root);
@@ -1020,7 +1038,7 @@ static int create_metadump(const char *input, FILE *out, int num_threads,
goto out;
}
} else {
- ret = copy_from_extent_tree(&metadump, &path);
+ ret = copy_from_extent_tree(&metadump, &path, dump_data);
if (ret) {
err = ret;
goto out;
@@ -2813,6 +2831,7 @@ static void print_usage(int ret)
printf("\t-s \tsanitize file names, use once to just use garbage, use twice if you want crc collisions\n");
printf("\t-w \twalk all trees instead of using extent tree, do this if your extent tree is broken\n");
printf("\t-m \trestore for multiple devices\n");
+ printf("\t-d \talso dump data, conflicts with -w\n");
printf("\n");
printf("\tIn the dump mode, source is the btrfs device and target is the output file (use '-' for stdout).\n");
printf("\tIn the restore mode, source is the dumped image and target is the btrfs device/file.\n");
@@ -2832,6 +2851,7 @@ int BOX_MAIN(image)(int argc, char *argv[])
int ret;
enum sanitize_mode sanitize = SANITIZE_NONE;
int dev_cnt = 0;
+ bool dump_data = false;
int usage_error = 0;
FILE *out;
@@ -2840,7 +2860,7 @@ int BOX_MAIN(image)(int argc, char *argv[])
{ "help", no_argument, NULL, GETOPT_VAL_HELP},
{ NULL, 0, NULL, 0 }
};
- int c = getopt_long(argc, argv, "rc:t:oswm", long_options, NULL);
+ int c = getopt_long(argc, argv, "rc:t:oswmd", long_options, NULL);
if (c < 0)
break;
switch (c) {
@@ -2880,6 +2900,9 @@ int BOX_MAIN(image)(int argc, char *argv[])
create = 0;
multi_devices = 1;
break;
+ case 'd':
+ dump_data = true;
+ break;
case GETOPT_VAL_HELP:
default:
print_usage(c != GETOPT_VAL_HELP);
@@ -2898,10 +2921,15 @@ int BOX_MAIN(image)(int argc, char *argv[])
"create and restore cannot be used at the same time");
usage_error++;
}
+ if (dump_data && walk_trees) {
+ error("-d conflicts with -f option");
+ usage_error++;
+ }
} else {
- if (walk_trees || sanitize != SANITIZE_NONE || compress_level) {
+ if (walk_trees || sanitize != SANITIZE_NONE || compress_level ||
+ dump_data) {
error(
- "using -w, -s, -c options for restore makes no sense");
+ "using -w, -s, -c, -d options for restore makes no sense");
usage_error++;
}
if (multi_devices && dev_cnt < 2) {
@@ -2954,7 +2982,8 @@ int BOX_MAIN(image)(int argc, char *argv[])
}
ret = create_metadump(source, out, num_threads,
- compress_level, sanitize, walk_trees);
+ compress_level, sanitize, walk_trees,
+ dump_data);
} else {
ret = restore_metadump(source, out, old_restore, num_threads,
0, target, multi_devices);
diff --git a/image/metadump.h b/image/metadump.h
index 941d4b827a24..a04f63a910d6 100644
--- a/image/metadump.h
+++ b/image/metadump.h
@@ -38,7 +38,7 @@ struct dump_version {
unsigned int extra_sb_flags:1;
};
-#define NR_DUMP_VERSIONS 1
+#define NR_DUMP_VERSIONS 2
extern const struct dump_version dump_versions[NR_DUMP_VERSIONS];
const extern struct dump_version *current_version;
--
2.22.0
next prev parent reply other threads:[~2019-07-04 6:11 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-04 6:10 [PATCH v2.1 00/10] btrfs-progs: image: Enhancement with new data dump feature Qu Wenruo
2019-07-04 6:10 ` [PATCH v2.1 01/10] btrfs-progs: image: Output error message for chunk tree build error Qu Wenruo
2019-07-04 6:10 ` [PATCH v2.1 02/10] btrfs-progs: image: Fix error output to show correct return value Qu Wenruo
2019-07-04 6:10 ` [PATCH v2.1 03/10] btrfs-progs: image: Don't waste memory when we're just extracting super block Qu Wenruo
2019-07-04 6:10 ` [PATCH v2.1 04/10] btrfs-progs: image: Allow restore to record system chunk ranges for later usage Qu Wenruo
2019-07-04 6:10 ` [PATCH v2.1 05/10] btrfs-progs: image: Introduce helper to determine if a tree block is in the range of system chunks Qu Wenruo
2019-07-04 6:10 ` [PATCH v2.1 06/10] btrfs-progs: image: Rework how we search chunk tree blocks Qu Wenruo
2019-07-04 6:11 ` [PATCH v2.1 07/10] btrfs-progs: image: Introduce framework for more dump versions Qu Wenruo
2019-07-04 6:11 ` Qu Wenruo [this message]
2019-07-15 3:57 ` [PATCH v2.1 08/10] btrfs-progs: image: Introduce -d option to dump data Anand Jain
2019-07-15 4:09 ` Anand Jain
2019-07-04 6:11 ` [PATCH v2.1 09/10] btrfs-progs: image: Reduce memory requirement for decompression Qu Wenruo
2019-07-04 6:11 ` [PATCH v2.1 10/10] btrfs-progs: image: Reduce memory usage for chunk tree search Qu Wenruo
2019-09-19 7:19 ` [PATCH v2.1 00/10] btrfs-progs: image: Enhancement with new data dump feature WenRuo Qu
2019-09-24 11:31 ` Anand Jain
2019-09-24 11:40 ` Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190704061103.20096-9-wqu@suse.com \
--to=wqu@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox