db07609875
segfaults from bnc#710486 due to unchecked usage of return value of open_ctree() [fixed compilation warnings] - pull upstream, replace existing patches, spec update - update 'restore' utility - lzo support - tools may now take earlies superblock when opening the fs - other fixes - pull integration-20111030 branch - mkfs: force mkfs if desired - other fixes - add btrfs-dump-super to mkinitrd - other fixes - skip non-existent devices or without media - documentation updates - scrubbing single device - graceful error handling when opening fs fails - updated mkinitrd script to scan devices before mount (bnc#727383) OBS-URL: https://build.opensuse.org/package/show/filesystems/btrfsprogs?expand=0&rev=115
162 lines
4.9 KiB
Diff
162 lines
4.9 KiB
Diff
From db874f1e8924e86bbdee6600b0e5b3e6d11f9238 Mon Sep 17 00:00:00 2001
|
|
From: David Marcin <djmarcin@google.com>
|
|
Date: Tue, 22 Nov 2011 10:08:00 -0800
|
|
Subject: [PATCH 25/35] btrfs-progs: Add utility to dump all superblocks found
|
|
on a device.
|
|
|
|
Signed-off-by: David Marcin <djmarcin@google.com>
|
|
---
|
|
.gitignore | 4 ++
|
|
Makefile | 9 ++++-
|
|
btrfs-dump-super.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
3 files changed, 98 insertions(+), 2 deletions(-)
|
|
create mode 100644 btrfs-dump-super.c
|
|
|
|
Index: btrfs-progs-v0.19-117-g6da41f2/.gitignore
|
|
===================================================================
|
|
--- btrfs-progs-v0.19-117-g6da41f2.orig/.gitignore
|
|
+++ btrfs-progs-v0.19-117-g6da41f2/.gitignore
|
|
@@ -3,12 +3,16 @@
|
|
version.h
|
|
man/*.gz
|
|
btrfs
|
|
+btrfs-corrupt-block
|
|
btrfs-debug-tree
|
|
+btrfs-dump-super
|
|
btrfs-map-logical
|
|
+btrfs-select-super
|
|
btrfs-show
|
|
btrfs-vol
|
|
btrfsck
|
|
btrfsctl
|
|
+calc-size
|
|
find-root
|
|
mkfs.btrfs
|
|
repair
|
|
Index: btrfs-progs-v0.19-117-g6da41f2/Makefile
|
|
===================================================================
|
|
--- btrfs-progs-v0.19-117-g6da41f2.orig/Makefile
|
|
+++ btrfs-progs-v0.19-117-g6da41f2/Makefile
|
|
@@ -17,7 +17,8 @@ LIBS=-luuid
|
|
RESTORE_LIBS=-lz
|
|
|
|
progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
|
|
- btrfs btrfs-map-logical restore find-root calc-size btrfs-corrupt-block
|
|
+ btrfs btrfs-map-logical restore find-root calc-size btrfs-corrupt-block \
|
|
+ btrfs-dump-super
|
|
|
|
btrfs_man_page_source = btrfs.c btrfs_cmds.c scrub.c
|
|
|
|
@@ -76,6 +77,9 @@ btrfs-zero-log: $(objects) btrfs-zero-lo
|
|
btrfs-select-super: $(objects) btrfs-select-super.o
|
|
$(CC) $(CFLAGS) -o btrfs-select-super $(objects) btrfs-select-super.o $(LDFLAGS) $(LIBS)
|
|
|
|
+btrfs-dump-super: $(objects) btrfs-dump-super.o
|
|
+ $(CC) $(CFLAGS) -o btrfs-dump-super $(objects) btrfs-dump-super.o $(LDFLAGS) $(LIBS)
|
|
+
|
|
btrfstune: $(objects) btrfstune.o
|
|
$(CC) $(CFLAGS) -o btrfstune $(objects) btrfstune.o $(LDFLAGS) $(LIBS)
|
|
|
|
@@ -128,7 +132,8 @@ install-man:
|
|
clean :
|
|
rm -f man/btrfs.8.in
|
|
rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image btrfs-select-super \
|
|
- btrfs-zero-log btrfstune dir-test ioctl-test quick-test version.h
|
|
+ btrfs-dump-super btrfs-zero-log btrfstune dir-test ioctl-test quick-test \
|
|
+ version.h
|
|
rm -f helpmsg.c
|
|
cd man; make clean
|
|
|
|
Index: btrfs-progs-v0.19-117-g6da41f2/btrfs-dump-super.c
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ btrfs-progs-v0.19-117-g6da41f2/btrfs-dump-super.c
|
|
@@ -0,0 +1,87 @@
|
|
+/*
|
|
+ * Copyright (C) 2011 Google. 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.
|
|
+ */
|
|
+
|
|
+#define _XOPEN_SOURCE 500
|
|
+#define _GNU_SOURCE 1
|
|
+#include <stdio.h>
|
|
+#include <stdlib.h>
|
|
+#include <unistd.h>
|
|
+#include <fcntl.h>
|
|
+#include <sys/stat.h>
|
|
+#include "kerncompat.h"
|
|
+#include "ctree.h"
|
|
+#include "disk-io.h"
|
|
+#include "version.h"
|
|
+
|
|
+static void print_usage(void)
|
|
+{
|
|
+ fprintf(stderr, "usage: btrfs-dump-super dev\n");
|
|
+ fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION);
|
|
+ exit(1);
|
|
+}
|
|
+
|
|
+static int read_block(const char* filename, u64 bytenr, struct btrfs_super_block* sb) {
|
|
+ int fd = open(filename, O_RDONLY, 0600);
|
|
+ int block_size = sizeof(struct btrfs_super_block);
|
|
+ int bytes_read = 0;
|
|
+
|
|
+ if (fd < 0) {
|
|
+ fprintf(stderr, "Could not open %s\n", filename);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ bytes_read = pread(fd, sb, block_size, bytenr);
|
|
+ if (bytes_read < block_size) {
|
|
+ fprintf(stderr, "Only read %d bytes of %d.\n", bytes_read, block_size);
|
|
+ }
|
|
+
|
|
+ close(fd);
|
|
+ return bytes_read;
|
|
+}
|
|
+
|
|
+int main(int ac, char **av)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ if (ac != 2)
|
|
+ print_usage();
|
|
+
|
|
+ for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
|
|
+ u64 bytenr = btrfs_sb_offset(i);
|
|
+ int fd;
|
|
+ struct btrfs_super_block sb;
|
|
+ int block_size = sizeof(struct btrfs_super_block);
|
|
+ char filename[1024];
|
|
+ int bytes_read = read_block(av[optind], bytenr, &sb);
|
|
+ if (bytes_read < block_size)
|
|
+ continue;
|
|
+
|
|
+ sprintf(filename, "/tmp/block.%s.%llu",
|
|
+ strrchr(av[optind], '/') + 1, bytenr);
|
|
+ fd = open(filename, O_CREAT|O_WRONLY, 0644);
|
|
+ if (block_size != pwrite(fd, &sb, block_size, 0)) {
|
|
+ fprintf(stderr, "Failed to dump superblock %d", i);
|
|
+ continue;
|
|
+ }
|
|
+ fprintf(stderr, "Dumped superblock %s:%d, gen %llu to %s.\n",
|
|
+ av[optind], i, sb.generation, filename);
|
|
+ close(fd);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|