diff options
author | Eric Sandeen <sandeen@redhat.com> | 2014-05-13 21:03:04 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2014-08-22 14:39:31 +0200 |
commit | fd518cfcb1fdb49ec4e5f09c397d16abb36178b8 (patch) | |
tree | 49e4e65e42f14d1f49c98a53092a953c61d37220 /btrfs-show-super.c | |
parent | da65695cc5f600c0f70efefd36c87d229e1ed3b4 (diff) | |
download | btrfs-progs-fd518cfcb1fdb49ec4e5f09c397d16abb36178b8.tar.gz |
btrfs-show-super: don't try to print not-superblocks
If we point btrfs-show-super at a not-btrfs-device and
try to print all superblocks, bad things are apt to happen:
superblock: bytenr=274877906944, device=/dev/sdc2
---------------------------------------------------------
btrfs-show-super: ctree.h:1984: btrfs_super_csum_size: \
Assertion `!(t >= (sizeof(btrfs_csum_sizes) / sizeof((btrfs_csum_sizes)[0])))' failed.
csum 0xAborted
Don't try to print superblocks that don't look like superblocks,
and add an "-f" (force) option to try anyway, if the user
really wants to give it a shot.
Fix some spelling & capitalization while we're at it.
The manpage says that if any problem happens, 1 will
be returned, but that's already not true today LOL, so
I didn't bother to make it true when we detect bad
sb magic, either...
I figure it's worth continuing and trying all superblocks
in case just one has a corrupt magic.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
[renamed -f to -F due to clash with existing option, converted
relevant docs to asciidoc]
Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'btrfs-show-super.c')
-rw-r--r-- | btrfs-show-super.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/btrfs-show-super.c b/btrfs-show-super.c index c2ad332..ed0311f 100644 --- a/btrfs-show-super.c +++ b/btrfs-show-super.c @@ -40,16 +40,17 @@ static void print_usage(void); static void dump_superblock(struct btrfs_super_block *sb, int full); int main(int argc, char **argv); -static int load_and_dump_sb(char *, int fd, u64 sb_bytenr, int full); +static int load_and_dump_sb(char *, int fd, u64 sb_bytenr, int full, int force); static void print_usage(void) { fprintf(stderr, - "usage: btrfs-show-super [-i super_mirror|-a|-f] dev [dev..]\n"); + "usage: btrfs-show-super [-i super_mirror|-a|-f|-F] dev [dev..]\n"); fprintf(stderr, "\t-f : print full superblock information\n"); fprintf(stderr, "\t-a : print information of all superblocks\n"); fprintf(stderr, "\t-i <super_mirror> : specify which mirror to print out\n"); + fprintf(stderr, "\t-F : attempt to dump superblocks with bad magic\n"); fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION); } @@ -58,13 +59,14 @@ int main(int argc, char **argv) int opt; int all = 0; int full = 0; + int force = 0; char *filename; int fd = -1; int i; u64 arg; u64 sb_bytenr = btrfs_sb_offset(0); - while ((opt = getopt(argc, argv, "fai:")) != -1) { + while ((opt = getopt(argc, argv, "fFai:")) != -1) { switch (opt) { case 'i': arg = arg_strtou64(optarg); @@ -84,6 +86,9 @@ int main(int argc, char **argv) case 'f': full = 1; break; + case 'F': + force = 1; + break; default: print_usage(); exit(1); @@ -108,7 +113,7 @@ int main(int argc, char **argv) for (idx = 0; idx < BTRFS_SUPER_MIRROR_MAX; idx++) { sb_bytenr = btrfs_sb_offset(idx); if (load_and_dump_sb(filename, fd, - sb_bytenr, full)) { + sb_bytenr, full, force)) { close(fd); exit(1); } @@ -116,7 +121,7 @@ int main(int argc, char **argv) putchar('\n'); } } else { - load_and_dump_sb(filename, fd, sb_bytenr, full); + load_and_dump_sb(filename, fd, sb_bytenr, full, force); putchar('\n'); } close(fd); @@ -125,7 +130,8 @@ int main(int argc, char **argv) exit(0); } -static int load_and_dump_sb(char *filename, int fd, u64 sb_bytenr, int full) +static int load_and_dump_sb(char *filename, int fd, u64 sb_bytenr, int full, + int force) { u8 super_block_data[BTRFS_SUPER_INFO_SIZE]; struct btrfs_super_block *sb; @@ -150,7 +156,13 @@ static int load_and_dump_sb(char *filename, int fd, u64 sb_bytenr, int full) } printf("superblock: bytenr=%llu, device=%s\n", sb_bytenr, filename); printf("---------------------------------------------------------\n"); - dump_superblock(sb, full); + if (btrfs_super_magic(sb) != BTRFS_MAGIC && !force) { + fprintf(stderr, + "ERROR: bad magic on superblock on %s at %llu\n", + filename, (unsigned long long)sb_bytenr); + } else { + dump_superblock(sb, full); + } return 0; } |