* [PATCH -V2 1/6] btrfs-progs: Move files around
@ 2010-02-04 17:44 Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 2/6] btrfs-progs: Add debug-btrfs command Aneesh Kumar K.V
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2010-02-04 17:44 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs, Aneesh Kumar K.V
Build libbtrfs.a and link against that for the commands
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
Makefile | 72 +++----------------
lib/Makefile | 47 ++++++++++++
bit-radix.c => lib/bit-radix.c | 0
bit-radix.h => lib/bit-radix.h | 0
crc32c.c => lib/crc32c.c | 0
crc32c.h => lib/crc32c.h | 0
ctree.c => lib/ctree.c | 0
ctree.h => lib/ctree.h | 0
dir-item.c => lib/dir-item.c | 0
disk-io.c => lib/disk-io.c | 0
disk-io.h => lib/disk-io.h | 0
extent-cache.c => lib/extent-cache.c | 0
extent-cache.h => lib/extent-cache.h | 0
extent-tree.c => lib/extent-tree.c | 0
extent_io.c => lib/extent_io.c | 0
extent_io.h => lib/extent_io.h | 0
file-item.c => lib/file-item.c | 0
hash.h => lib/hash.h | 0
inode-item.c => lib/inode-item.c | 0
inode-map.c => lib/inode-map.c | 0
ioctl.h => lib/ioctl.h | 0
kerncompat.h => lib/kerncompat.h | 0
list.h => lib/list.h | 0
print-tree.c => lib/print-tree.c | 0
print-tree.h => lib/print-tree.h | 0
radix-tree.c => lib/radix-tree.c | 0
radix-tree.h => lib/radix-tree.h | 0
rbtree.c => lib/rbtree.c | 0
rbtree.h => lib/rbtree.h | 0
root-tree.c => lib/root-tree.c | 0
transaction.h => lib/transaction.h | 0
utils.c => lib/utils.c | 0
utils.h => lib/utils.h | 0
volumes.c => lib/volumes.c | 0
volumes.h => lib/volumes.h | 0
misc/Makefile | 79 ++++++++++++++++++++
bcp => misc/bcp | 0
btrfs-image.c => misc/btrfs-image.c | 0
btrfs-map-logical.c => misc/btrfs-map-logical.c | 0
btrfs-show.c => misc/btrfs-show.c | 0
btrfs-vol.c => misc/btrfs-vol.c | 0
btrfsck.c => misc/btrfsck.c | 0
btrfsctl.c => misc/btrfsctl.c | 0
btrfstune.c => misc/btrfstune.c | 0
convert.c => misc/convert.c | 0
debug-tree.c => misc/debug-tree.c | 0
mkfs.c => misc/mkfs.c | 0
version.sh => misc/version.sh | 0
tests/Makefile | 88 +++++++++++++++++++++++
dir-test.c => tests/dir-test.c | 0
hasher.c => tests/hasher.c | 0
quick-test.c => tests/quick-test.c | 0
random-test.c => tests/random-test.c | 0
show-blocks => tests/show-blocks | 0
54 files changed, 223 insertions(+), 63 deletions(-)
create mode 100644 lib/Makefile
rename bit-radix.c => lib/bit-radix.c (100%)
rename bit-radix.h => lib/bit-radix.h (100%)
rename crc32c.c => lib/crc32c.c (100%)
rename crc32c.h => lib/crc32c.h (100%)
rename ctree.c => lib/ctree.c (100%)
rename ctree.h => lib/ctree.h (100%)
rename dir-item.c => lib/dir-item.c (100%)
rename disk-io.c => lib/disk-io.c (100%)
rename disk-io.h => lib/disk-io.h (100%)
rename extent-cache.c => lib/extent-cache.c (100%)
rename extent-cache.h => lib/extent-cache.h (100%)
rename extent-tree.c => lib/extent-tree.c (100%)
rename extent_io.c => lib/extent_io.c (100%)
rename extent_io.h => lib/extent_io.h (100%)
rename file-item.c => lib/file-item.c (100%)
rename hash.h => lib/hash.h (100%)
rename inode-item.c => lib/inode-item.c (100%)
rename inode-map.c => lib/inode-map.c (100%)
rename ioctl.h => lib/ioctl.h (100%)
rename kerncompat.h => lib/kerncompat.h (100%)
rename list.h => lib/list.h (100%)
rename print-tree.c => lib/print-tree.c (100%)
rename print-tree.h => lib/print-tree.h (100%)
rename radix-tree.c => lib/radix-tree.c (100%)
rename radix-tree.h => lib/radix-tree.h (100%)
rename rbtree.c => lib/rbtree.c (100%)
rename rbtree.h => lib/rbtree.h (100%)
rename root-tree.c => lib/root-tree.c (100%)
rename transaction.h => lib/transaction.h (100%)
rename utils.c => lib/utils.c (100%)
rename utils.h => lib/utils.h (100%)
rename volumes.c => lib/volumes.c (100%)
rename volumes.h => lib/volumes.h (100%)
create mode 100644 misc/Makefile
rename bcp => misc/bcp (100%)
mode change 100755 => 100644
rename btrfs-image.c => misc/btrfs-image.c (100%)
rename btrfs-map-logical.c => misc/btrfs-map-logical.c (100%)
rename btrfs-show.c => misc/btrfs-show.c (100%)
rename btrfs-vol.c => misc/btrfs-vol.c (100%)
rename btrfsck.c => misc/btrfsck.c (100%)
rename btrfsctl.c => misc/btrfsctl.c (100%)
rename btrfstune.c => misc/btrfstune.c (100%)
rename convert.c => misc/convert.c (100%)
rename debug-tree.c => misc/debug-tree.c (100%)
rename mkfs.c => misc/mkfs.c (100%)
rename version.sh => misc/version.sh (100%)
create mode 100644 tests/Makefile
rename dir-test.c => tests/dir-test.c (100%)
rename hasher.c => tests/hasher.c (100%)
rename quick-test.c => tests/quick-test.c (100%)
rename random-test.c => tests/random-test.c (100%)
rename show-blocks => tests/show-blocks (100%)
mode change 100755 => 100644
diff --git a/Makefile b/Makefile
index 02f881e..a30c212 100644
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,6 @@
CC=gcc
AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
CFLAGS = -g -Werror -Os
-objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \
- root-tree.o dir-item.o file-item.o inode-item.o \
- inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \
- volumes.o utils.o
-
#
CHECKFLAGS=-D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
-Wuninitialized -Wshadow -Wundef
@@ -16,8 +11,7 @@ prefix ?= /usr/local
bindir = $(prefix)/bin
LIBS=-luuid
-progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
- btrfs-map-logical
+SUBDIRS=lib misc man
# make C=1 to enable sparse
ifdef C
@@ -31,60 +25,12 @@ endif
$(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
-all: version $(progs) manpages
-
-version:
- bash version.sh
-
-btrfsctl: $(objects) btrfsctl.o
- gcc $(CFLAGS) -o btrfsctl btrfsctl.o $(objects) $(LDFLAGS) $(LIBS)
-
-btrfs-vol: $(objects) btrfs-vol.o
- gcc $(CFLAGS) -o btrfs-vol btrfs-vol.o $(objects) $(LDFLAGS) $(LIBS)
-
-btrfs-show: $(objects) btrfs-show.o
- gcc $(CFLAGS) -o btrfs-show btrfs-show.o $(objects) $(LDFLAGS) $(LIBS)
-
-btrfsck: $(objects) btrfsck.o
- gcc $(CFLAGS) -o btrfsck btrfsck.o $(objects) $(LDFLAGS) $(LIBS)
-
-mkfs.btrfs: $(objects) mkfs.o
- gcc $(CFLAGS) -o mkfs.btrfs $(objects) mkfs.o $(LDFLAGS) $(LIBS)
-
-btrfs-debug-tree: $(objects) debug-tree.o
- gcc $(CFLAGS) -o btrfs-debug-tree $(objects) debug-tree.o $(LDFLAGS) $(LIBS)
-
-btrfstune: $(objects) btrfstune.o
- gcc $(CFLAGS) -o btrfstune $(objects) btrfstune.o $(LDFLAGS) $(LIBS)
-
-btrfs-map-logical: $(objects) btrfs-map-logical.o
- gcc $(CFLAGS) -o btrfs-map-logical $(objects) btrfs-map-logical.o $(LDFLAGS) $(LIBS)
-
-btrfs-image: $(objects) btrfs-image.o
- gcc $(CFLAGS) -o btrfs-image $(objects) btrfs-image.o -lpthread -lz $(LDFLAGS) $(LIBS)
-
-dir-test: $(objects) dir-test.o
- gcc $(CFLAGS) -o dir-test $(objects) dir-test.o $(LDFLAGS) $(LIBS)
-
-quick-test: $(objects) quick-test.o
- gcc $(CFLAGS) -o quick-test $(objects) quick-test.o $(LDFLAGS) $(LIBS)
-
-convert: $(objects) convert.o
- gcc $(CFLAGS) -o btrfs-convert $(objects) convert.o -lext2fs $(LDFLAGS) $(LIBS)
-
-manpages:
- cd man; make
-
-install-man:
- cd man; make install
-
-clean :
- rm -f $(progs) cscope.out *.o .*.d btrfs-convert
- cd man; make clean
-
-install: $(progs) install-man
- $(INSTALL) -m755 -d $(DESTDIR)$(bindir)
- $(INSTALL) $(progs) $(DESTDIR)$(bindir)
- if [ -e btrfs-convert ]; then $(INSTALL) btrfs-convert $(DESTDIR)$(bindir); fi
+all clean install:
+ @for subdir in $(SUBDIRS); do \
+ if test -d $$subdir ; then \
+ target=`echo $@`; \
+ echo making $$target in $$subdir; \
+ (cd $$subdir && $(MAKE) $$target) || exit 1; \
+ fi ; \
+ done
--include .*.d
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644
index 0000000..7ece415
--- /dev/null
+++ b/lib/Makefile
@@ -0,0 +1,47 @@
+CC=gcc
+AR = ar
+ARGEN = $(AR) rc
+RANLIB = ranlib
+AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
+CFLAGS = -g -Werror -Os
+objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \
+ root-tree.o dir-item.o file-item.o inode-item.o \
+ inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \
+ volumes.o utils.o
+
+#
+CHECKFLAGS=-D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
+ -Wuninitialized -Wshadow -Wundef
+DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
+
+INSTALL= install
+prefix ?= /usr/local
+libdir = $(prefix)/lib/
+
+
+# make C=1 to enable sparse
+ifdef C
+ check=sparse $(CHECKFLAGS)
+else
+ check=ls
+endif
+
+.c.o:
+ $(check) $<
+ $(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
+
+all: libbtrfs.a
+
+libbtrfs.a: $(objects)
+ $(ARGEN) $@ $(objects)
+ $(RANLIB) $@
+
+clean :
+ rm -f $(progs) *.o .*.d
+ rm -f libbtrfs.a
+
+install: $(progs)
+ $(INSTALL) -m755 -d $(DESTDIR)$(libdir)
+ $(INSTALL) libbtrfs.a $(DESTDIR)$(libdir)
+
+-include .*.d
diff --git a/bit-radix.c b/lib/bit-radix.c
similarity index 100%
rename from bit-radix.c
rename to lib/bit-radix.c
diff --git a/bit-radix.h b/lib/bit-radix.h
similarity index 100%
rename from bit-radix.h
rename to lib/bit-radix.h
diff --git a/crc32c.c b/lib/crc32c.c
similarity index 100%
rename from crc32c.c
rename to lib/crc32c.c
diff --git a/crc32c.h b/lib/crc32c.h
similarity index 100%
rename from crc32c.h
rename to lib/crc32c.h
diff --git a/ctree.c b/lib/ctree.c
similarity index 100%
rename from ctree.c
rename to lib/ctree.c
diff --git a/ctree.h b/lib/ctree.h
similarity index 100%
rename from ctree.h
rename to lib/ctree.h
diff --git a/dir-item.c b/lib/dir-item.c
similarity index 100%
rename from dir-item.c
rename to lib/dir-item.c
diff --git a/disk-io.c b/lib/disk-io.c
similarity index 100%
rename from disk-io.c
rename to lib/disk-io.c
diff --git a/disk-io.h b/lib/disk-io.h
similarity index 100%
rename from disk-io.h
rename to lib/disk-io.h
diff --git a/extent-cache.c b/lib/extent-cache.c
similarity index 100%
rename from extent-cache.c
rename to lib/extent-cache.c
diff --git a/extent-cache.h b/lib/extent-cache.h
similarity index 100%
rename from extent-cache.h
rename to lib/extent-cache.h
diff --git a/extent-tree.c b/lib/extent-tree.c
similarity index 100%
rename from extent-tree.c
rename to lib/extent-tree.c
diff --git a/extent_io.c b/lib/extent_io.c
similarity index 100%
rename from extent_io.c
rename to lib/extent_io.c
diff --git a/extent_io.h b/lib/extent_io.h
similarity index 100%
rename from extent_io.h
rename to lib/extent_io.h
diff --git a/file-item.c b/lib/file-item.c
similarity index 100%
rename from file-item.c
rename to lib/file-item.c
diff --git a/hash.h b/lib/hash.h
similarity index 100%
rename from hash.h
rename to lib/hash.h
diff --git a/inode-item.c b/lib/inode-item.c
similarity index 100%
rename from inode-item.c
rename to lib/inode-item.c
diff --git a/inode-map.c b/lib/inode-map.c
similarity index 100%
rename from inode-map.c
rename to lib/inode-map.c
diff --git a/ioctl.h b/lib/ioctl.h
similarity index 100%
rename from ioctl.h
rename to lib/ioctl.h
diff --git a/kerncompat.h b/lib/kerncompat.h
similarity index 100%
rename from kerncompat.h
rename to lib/kerncompat.h
diff --git a/list.h b/lib/list.h
similarity index 100%
rename from list.h
rename to lib/list.h
diff --git a/print-tree.c b/lib/print-tree.c
similarity index 100%
rename from print-tree.c
rename to lib/print-tree.c
diff --git a/print-tree.h b/lib/print-tree.h
similarity index 100%
rename from print-tree.h
rename to lib/print-tree.h
diff --git a/radix-tree.c b/lib/radix-tree.c
similarity index 100%
rename from radix-tree.c
rename to lib/radix-tree.c
diff --git a/radix-tree.h b/lib/radix-tree.h
similarity index 100%
rename from radix-tree.h
rename to lib/radix-tree.h
diff --git a/rbtree.c b/lib/rbtree.c
similarity index 100%
rename from rbtree.c
rename to lib/rbtree.c
diff --git a/rbtree.h b/lib/rbtree.h
similarity index 100%
rename from rbtree.h
rename to lib/rbtree.h
diff --git a/root-tree.c b/lib/root-tree.c
similarity index 100%
rename from root-tree.c
rename to lib/root-tree.c
diff --git a/transaction.h b/lib/transaction.h
similarity index 100%
rename from transaction.h
rename to lib/transaction.h
diff --git a/utils.c b/lib/utils.c
similarity index 100%
rename from utils.c
rename to lib/utils.c
diff --git a/utils.h b/lib/utils.h
similarity index 100%
rename from utils.h
rename to lib/utils.h
diff --git a/volumes.c b/lib/volumes.c
similarity index 100%
rename from volumes.c
rename to lib/volumes.c
diff --git a/volumes.h b/lib/volumes.h
similarity index 100%
rename from volumes.h
rename to lib/volumes.h
diff --git a/misc/Makefile b/misc/Makefile
new file mode 100644
index 0000000..4a39c80
--- /dev/null
+++ b/misc/Makefile
@@ -0,0 +1,79 @@
+CC=gcc
+AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
+CFLAGS = -g -Werror -Os -I../lib/
+#
+CHECKFLAGS=-D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
+ -Wuninitialized -Wshadow -Wundef
+DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
+
+INSTALL= install
+prefix ?= /usr/local
+bindir = $(prefix)/bin
+LIBS=-luuid
+TOPDIR=../
+
+progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
+ btrfs-map-logical
+
+# make C=1 to enable sparse
+ifdef C
+ check=sparse $(CHECKFLAGS)
+else
+ check=ls
+endif
+
+.c.o:
+ $(check) $<
+ $(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
+
+all: version $(progs)
+
+version:
+ bash version.sh
+
+btrfsctl: $(TOPDIR)/lib/libbtrfs.a btrfsctl.o
+ gcc $(CFLAGS) -static -o btrfsctl btrfsctl.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfs-vol: $(TOPDIR)/lib/libbtrfs.a btrfs-vol.o
+ gcc $(CFLAGS) -o btrfs-vol btrfs-vol.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfs-show: $(TOPDIR)/lib/libbtrfs.a btrfs-show.o
+ gcc $(CFLAGS) -o btrfs-show btrfs-show.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfsck: $(TOPDIR)/lib/libbtrfs.a btrfsck.o
+ gcc $(CFLAGS) -o btrfsck btrfsck.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+mkfs.btrfs: $(TOPDIR)/lib/libbtrfs.a mkfs.o
+ gcc $(CFLAGS) -o mkfs.btrfs mkfs.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfs-debug-tree: $(TOPDIR)/lib/libbtrfs.a debug-tree.o
+ gcc $(CFLAGS) -o btrfs-debug-tree debug-tree.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfstune: $(TOPDIR)/lib/libbtrfs.a btrfstune.o
+ gcc $(CFLAGS) -o btrfstune btrfstune.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfs-map-logical: $(TOPDIR)/lib/libbtrfs.a btrfs-map-logical.o
+ gcc $(CFLAGS) -o btrfs-map-logical btrfs-map-logical.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+btrfs-image: $(TOPDIR)/lib/libbtrfs.a btrfs-image.o
+ gcc $(CFLAGS) -o btrfs-image btrfs-image.o $(TOPDIR)/lib/libbtrfs.a -lpthread -lz $(LDFLAGS) $(LIBS)
+
+dir-test: $(TOPDIR)/lib/libbtrfs.a dir-test.o
+ gcc $(CFLAGS) -o dir-test dir-test.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+quick-test: $(TOPDIR)/lib/libbtrfs.a quick-test.o
+ gcc $(CFLAGS) -o quick-test quick-test.o $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+convert: $(TOPDIR)/lib/libbtrfs.a convert.o
+ gcc $(CFLAGS) -o btrfs-convert convert.o $(TOPDIR)/lib/libbtrfs.a -lext2fs $(LDFLAGS) $(LIBS)
+
+clean :
+ rm -f $(progs) cscope.out *.o .*.d btrfs-convert
+ rm -f version.h
+
+install: $(progs) install-man
+ $(INSTALL) -m755 -d $(DESTDIR)$(bindir)
+ $(INSTALL) $(progs) $(DESTDIR)$(bindir)
+ if [ -e btrfs-convert ]; then $(INSTALL) btrfs-convert $(DESTDIR)$(bindir); fi
+
+-include .*.d
diff --git a/bcp b/misc/bcp
old mode 100755
new mode 100644
similarity index 100%
rename from bcp
rename to misc/bcp
diff --git a/btrfs-image.c b/misc/btrfs-image.c
similarity index 100%
rename from btrfs-image.c
rename to misc/btrfs-image.c
diff --git a/btrfs-map-logical.c b/misc/btrfs-map-logical.c
similarity index 100%
rename from btrfs-map-logical.c
rename to misc/btrfs-map-logical.c
diff --git a/btrfs-show.c b/misc/btrfs-show.c
similarity index 100%
rename from btrfs-show.c
rename to misc/btrfs-show.c
diff --git a/btrfs-vol.c b/misc/btrfs-vol.c
similarity index 100%
rename from btrfs-vol.c
rename to misc/btrfs-vol.c
diff --git a/btrfsck.c b/misc/btrfsck.c
similarity index 100%
rename from btrfsck.c
rename to misc/btrfsck.c
diff --git a/btrfsctl.c b/misc/btrfsctl.c
similarity index 100%
rename from btrfsctl.c
rename to misc/btrfsctl.c
diff --git a/btrfstune.c b/misc/btrfstune.c
similarity index 100%
rename from btrfstune.c
rename to misc/btrfstune.c
diff --git a/convert.c b/misc/convert.c
similarity index 100%
rename from convert.c
rename to misc/convert.c
diff --git a/debug-tree.c b/misc/debug-tree.c
similarity index 100%
rename from debug-tree.c
rename to misc/debug-tree.c
diff --git a/mkfs.c b/misc/mkfs.c
similarity index 100%
rename from mkfs.c
rename to misc/mkfs.c
diff --git a/version.sh b/misc/version.sh
similarity index 100%
rename from version.sh
rename to misc/version.sh
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000..e8df52c
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,88 @@
+CC=gcc
+AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
+CFLAGS = -g -Werror -Os
+objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \
+ root-tree.o dir-item.o file-item.o inode-item.o \
+ inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \
+ volumes.o utils.o
+
+#
+CHECKFLAGS=-D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
+ -Wuninitialized -Wshadow -Wundef
+DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
+
+INSTALL= install
+prefix ?= /usr/local
+bindir = $(prefix)/bin
+LIBS=-luuid
+
+progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
+ btrfs-map-logical
+
+# make C=1 to enable sparse
+ifdef C
+ check=sparse $(CHECKFLAGS)
+else
+ check=ls
+endif
+
+.c.o:
+ $(check) $<
+ $(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
+
+
+all: version $(progs) manpages
+
+version:
+ bash version.sh
+
+btrfsctl: $(objects) btrfsctl.o
+ gcc $(CFLAGS) -static -o btrfsctl btrfsctl.o $(objects) $(LDFLAGS) $(LIBS)
+
+btrfs-vol: $(objects) btrfs-vol.o
+ gcc $(CFLAGS) -o btrfs-vol btrfs-vol.o $(objects) $(LDFLAGS) $(LIBS)
+ gcc $(CFLAGS) -o btrfs-show btrfs-show.o $(objects) $(LDFLAGS) $(LIBS)
+
+btrfsck: $(objects) btrfsck.o
+ gcc $(CFLAGS) -o btrfsck btrfsck.o $(objects) $(LDFLAGS) $(LIBS)
+
+mkfs.btrfs: $(objects) mkfs.o
+ gcc $(CFLAGS) -o mkfs.btrfs $(objects) mkfs.o $(LDFLAGS) $(LIBS)
+
+btrfs-debug-tree: $(objects) debug-tree.o
+ gcc $(CFLAGS) -o btrfs-debug-tree $(objects) debug-tree.o $(LDFLAGS) $(LIBS)
+
+btrfstune: $(objects) btrfstune.o
+ gcc $(CFLAGS) -o btrfstune $(objects) btrfstune.o $(LDFLAGS) $(LIBS)
+
+btrfs-map-logical: $(objects) btrfs-map-logical.o
+ gcc $(CFLAGS) -o btrfs-map-logical $(objects) btrfs-map-logical.o $(LDFLAGS) $(LIBS)
+
+btrfs-image: $(objects) btrfs-image.o
+ gcc $(CFLAGS) -o btrfs-image $(objects) btrfs-image.o -lpthread -lz $(LDFLAGS) $(LIBS)
+
+dir-test: $(objects) dir-test.o
+ gcc $(CFLAGS) -o dir-test $(objects) dir-test.o $(LDFLAGS) $(LIBS)
+
+quick-test: $(objects) quick-test.o
+ gcc $(CFLAGS) -o quick-test $(objects) quick-test.o $(LDFLAGS) $(LIBS)
+
+convert: $(objects) convert.o
+ gcc $(CFLAGS) -o btrfs-convert $(objects) convert.o -lext2fs $(LDFLAGS) $(LIBS)
+
+manpages:
+ cd man; make
+
+install-man:
+ cd man; make install
+
+clean :
+ rm -f $(progs) cscope.out *.o .*.d btrfs-convert
+ cd man; make clean
+
+install: $(progs) install-man
+ $(INSTALL) -m755 -d $(DESTDIR)$(bindir)
+ $(INSTALL) $(progs) $(DESTDIR)$(bindir)
+ if [ -e btrfs-convert ]; then $(INSTALL) btrfs-convert $(DESTDIR)$(bindir); fi
+
+-include .*.d
diff --git a/dir-test.c b/tests/dir-test.c
similarity index 100%
rename from dir-test.c
rename to tests/dir-test.c
diff --git a/hasher.c b/tests/hasher.c
similarity index 100%
rename from hasher.c
rename to tests/hasher.c
diff --git a/quick-test.c b/tests/quick-test.c
similarity index 100%
rename from quick-test.c
rename to tests/quick-test.c
diff --git a/random-test.c b/tests/random-test.c
similarity index 100%
rename from random-test.c
rename to tests/random-test.c
diff --git a/show-blocks b/tests/show-blocks
old mode 100755
new mode 100644
similarity index 100%
rename from show-blocks
rename to tests/show-blocks
--
1.7.0.rc0.48.gdace5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -V2 2/6] btrfs-progs: Add debug-btrfs command
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
@ 2010-02-04 17:44 ` Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 3/6] debug-btrfs: Add open file system command Aneesh Kumar K.V
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2010-02-04 17:44 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs, Aneesh Kumar K.V
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
Makefile | 3 ++
debugbtrfs/Makefile | 44 +++++++++++++++++++++++++++++
debugbtrfs/cmds.c | 27 ++++++++++++++++++
debugbtrfs/debug_btrfs.c | 59 ++++++++++++++++++++++++++++++++++++++++
debugbtrfs/debug_btrfs.h | 29 +++++++++++++++++++
debugbtrfs/debug_btrfs_cmds.ct | 24 ++++++++++++++++
6 files changed, 186 insertions(+), 0 deletions(-)
create mode 100644 debugbtrfs/Makefile
create mode 100644 debugbtrfs/cmds.c
create mode 100644 debugbtrfs/debug_btrfs.c
create mode 100644 debugbtrfs/debug_btrfs.h
create mode 100644 debugbtrfs/debug_btrfs_cmds.ct
diff --git a/Makefile b/Makefile
index a30c212..3efd405 100644
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,9 @@ bindir = $(prefix)/bin
LIBS=-luuid
SUBDIRS=lib misc man
+ifneq ($(E2FSPRGS_BUILD_DIR),)
+ SUBDIRS += debugbtrfs
+endif
# make C=1 to enable sparse
ifdef C
diff --git a/debugbtrfs/Makefile b/debugbtrfs/Makefile
new file mode 100644
index 0000000..348160b
--- /dev/null
+++ b/debugbtrfs/Makefile
@@ -0,0 +1,44 @@
+CC=gcc
+AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
+CFLAGS = -g -Werror -Os -I$(E2FSPRGS_BUILD_DIR)/lib/ -I../lib/
+
+#
+CHECKFLAGS=-D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
+ -Wuninitialized -Wshadow -Wundef
+DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
+
+INSTALL= install
+prefix ?= /usr/local
+bindir = $(prefix)/bin
+LIBS=-L$(E2FSPRGS_BUILD_DIR)/lib/ss -lss -ldl -lcom_err -luuid
+TOPDIR=../
+
+MK_CMDS= _SS_DIR_OVERRIDE=$(E2FSPRGS_BUILD_DIR)/lib/ss $(E2FSPRGS_BUILD_DIR)/lib/ss/mk_cmds
+
+progs = debug-btrfs
+
+# make C=1 to enable sparse
+ifdef C
+ check=sparse $(CHECKFLAGS)
+else
+ check=ls
+endif
+
+.c.o:
+ $(check) $<
+ $(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
+
+all: $(progs)
+
+debug_btrfs_cmds.c: debug_btrfs_cmds.ct
+ $(MK_CMDS) debug_btrfs_cmds.ct
+
+debug-btrfs: $(TOPDIR)/lib/libbtrfs.a debug_btrfs.o cmds.o debug_btrfs_cmds.o
+ $(CC) $(CFLAGS) -o debug-btrfs $^ $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
+
+clean:
+ rm -f *.o debug_btrfs_cmds.c
+ rm -f .*.d
+ rm -f debug-btrfs
+
+-include .*.d
diff --git a/debugbtrfs/cmds.c b/debugbtrfs/cmds.c
new file mode 100644
index 0000000..f5ed877
--- /dev/null
+++ b/debugbtrfs/cmds.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright IBM Corporation, 2010
+ * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include "debug_btrfs.h"
+
+void do_show_debugfs_params(int argc, char *argv[])
+{
+ FILE *out = stdout;
+ fprintf(out, "Filesystem in use: %s\n", current_device);
+}
diff --git a/debugbtrfs/debug_btrfs.c b/debugbtrfs/debug_btrfs.c
new file mode 100644
index 0000000..44d6f64
--- /dev/null
+++ b/debugbtrfs/debug_btrfs.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright IBM Corporation, 2010
+ * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ss/ss.h>
+#include "debug_btrfs.h"
+
+extern ss_request_table btrfs_debug_cmds;
+const char *current_device;
+
+void usage(char *prg)
+{
+ fprintf(stderr, "Usage: %s device\n", prg);
+ exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+ int sci_idx;
+ int retval;
+
+ if (argc < 2)
+ usage(argv[0]);
+
+ current_device = argv[1];
+ sci_idx = ss_create_invocation("debug-btrfs", "0.0", NULL,
+ &btrfs_debug_cmds, &retval);
+ if (retval) {
+ ss_perror(sci_idx, retval, "create invocation");
+ exit(1);
+ }
+ ss_get_readline(sci_idx);
+ (void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &retval);
+ if (retval) {
+ ss_perror(sci_idx, retval, "adding standard requests");
+ exit (1);
+ }
+ ss_listen(sci_idx);
+ ss_delete_invocation(sci_idx);
+
+ return 0;
+}
diff --git a/debugbtrfs/debug_btrfs.h b/debugbtrfs/debug_btrfs.h
new file mode 100644
index 0000000..55d7b17
--- /dev/null
+++ b/debugbtrfs/debug_btrfs.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright IBM Corporation, 2010
+ * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * 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.
+ */
+
+#ifndef DEBUG_BTRFS_H
+#define DEBUG_BTRFS_H
+#include <getopt.h>
+
+extern const char *current_device;
+static inline void reset_getopt(void)
+{
+ optind = 0;
+}
+#endif
diff --git a/debugbtrfs/debug_btrfs_cmds.ct b/debugbtrfs/debug_btrfs_cmds.ct
new file mode 100644
index 0000000..29095d3
--- /dev/null
+++ b/debugbtrfs/debug_btrfs_cmds.ct
@@ -0,0 +1,24 @@
+# Copyright IBM Corporation, 2010
+# Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+#
+# 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.
+
+command_table btrfs_debug_cmds;
+
+request do_show_debugfs_params, "Show btrfs_debug parameters",
+ show_debugfs_params, params;
+
+end;
+
--
1.7.0.rc0.48.gdace5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -V2 3/6] debug-btrfs: Add open file system command
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 2/6] btrfs-progs: Add debug-btrfs command Aneesh Kumar K.V
@ 2010-02-04 17:44 ` Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 4/6] debug-btrfs: Add command to dump each of the btrfs trees Aneesh Kumar K.V
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2010-02-04 17:44 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs, Aneesh Kumar K.V
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
debugbtrfs/cmds.c | 23 +++++++++++++++++++++++
debugbtrfs/debug_btrfs.c | 16 +++++++---------
debugbtrfs/debug_btrfs.h | 1 +
debugbtrfs/debug_btrfs_cmds.ct | 3 +++
4 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/debugbtrfs/cmds.c b/debugbtrfs/cmds.c
index f5ed877..cd2901b 100644
--- a/debugbtrfs/cmds.c
+++ b/debugbtrfs/cmds.c
@@ -18,6 +18,11 @@
*/
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ctree.h"
+#include "disk-io.h"
#include "debug_btrfs.h"
void do_show_debugfs_params(int argc, char *argv[])
@@ -25,3 +30,21 @@ void do_show_debugfs_params(int argc, char *argv[])
FILE *out = stdout;
fprintf(out, "Filesystem in use: %s\n", current_device);
}
+
+void do_open_filesys(int argc, char *argv[])
+{
+ if (argc != 1) {
+ free((void *)current_device);
+ current_device = strdup(argv[1]);
+ }
+
+ if (current_fs_root)
+ close_ctree(current_fs_root);
+
+ radix_tree_init();
+ current_fs_root = open_ctree(current_device, 0, 0);
+ if (!current_fs_root) {
+ fprintf(stderr, "unable to open %s\n", current_device);
+ return;
+ }
+}
diff --git a/debugbtrfs/debug_btrfs.c b/debugbtrfs/debug_btrfs.c
index 44d6f64..d9f10e9 100644
--- a/debugbtrfs/debug_btrfs.c
+++ b/debugbtrfs/debug_btrfs.c
@@ -19,27 +19,25 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <ss/ss.h>
#include "debug_btrfs.h"
extern ss_request_table btrfs_debug_cmds;
const char *current_device;
-
-void usage(char *prg)
-{
- fprintf(stderr, "Usage: %s device\n", prg);
- exit(1);
-}
+struct btrfs_root *current_fs_root;
+extern void do_open_filesys(int argc, char *argv[]);
int main(int argc, char *argv[])
{
int sci_idx;
int retval;
- if (argc < 2)
- usage(argv[0]);
+ if (argc != 1) {
+ /* open the file system */
+ do_open_filesys(argc, argv);
+ }
- current_device = argv[1];
sci_idx = ss_create_invocation("debug-btrfs", "0.0", NULL,
&btrfs_debug_cmds, &retval);
if (retval) {
diff --git a/debugbtrfs/debug_btrfs.h b/debugbtrfs/debug_btrfs.h
index 55d7b17..1ea4fb2 100644
--- a/debugbtrfs/debug_btrfs.h
+++ b/debugbtrfs/debug_btrfs.h
@@ -22,6 +22,7 @@
#include <getopt.h>
extern const char *current_device;
+extern struct btrfs_root *current_fs_root;
static inline void reset_getopt(void)
{
optind = 0;
diff --git a/debugbtrfs/debug_btrfs_cmds.ct b/debugbtrfs/debug_btrfs_cmds.ct
index 29095d3..e9890ee 100644
--- a/debugbtrfs/debug_btrfs_cmds.ct
+++ b/debugbtrfs/debug_btrfs_cmds.ct
@@ -20,5 +20,8 @@ command_table btrfs_debug_cmds;
request do_show_debugfs_params, "Show btrfs_debug parameters",
show_debugfs_params, params;
+request do_open_filesys, "Open the file system",
+ open_filesys, open;
+
end;
--
1.7.0.rc0.48.gdace5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -V2 4/6] debug-btrfs: Add command to dump each of the btrfs trees
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 2/6] btrfs-progs: Add debug-btrfs command Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 3/6] debug-btrfs: Add open file system command Aneesh Kumar K.V
@ 2010-02-04 17:44 ` Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 5/6] debug-btrfs: Add pager support Aneesh Kumar K.V
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2010-02-04 17:44 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs, Aneesh Kumar K.V
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
debugbtrfs/Makefile | 2 +-
debugbtrfs/debug_btrfs_cmds.ct | 24 ++++
debugbtrfs/debug_tree.c | 238 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 263 insertions(+), 1 deletions(-)
create mode 100644 debugbtrfs/debug_tree.c
diff --git a/debugbtrfs/Makefile b/debugbtrfs/Makefile
index 348160b..970990e 100644
--- a/debugbtrfs/Makefile
+++ b/debugbtrfs/Makefile
@@ -33,7 +33,7 @@ all: $(progs)
debug_btrfs_cmds.c: debug_btrfs_cmds.ct
$(MK_CMDS) debug_btrfs_cmds.ct
-debug-btrfs: $(TOPDIR)/lib/libbtrfs.a debug_btrfs.o cmds.o debug_btrfs_cmds.o
+debug-btrfs: $(TOPDIR)/lib/libbtrfs.a debug_btrfs.o cmds.o debug_btrfs_cmds.o debug_tree.o
$(CC) $(CFLAGS) -o debug-btrfs $^ $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
clean:
diff --git a/debugbtrfs/debug_btrfs_cmds.ct b/debugbtrfs/debug_btrfs_cmds.ct
index e9890ee..cd40cf4 100644
--- a/debugbtrfs/debug_btrfs_cmds.ct
+++ b/debugbtrfs/debug_btrfs_cmds.ct
@@ -23,5 +23,29 @@ request do_show_debugfs_params, "Show btrfs_debug parameters",
request do_open_filesys, "Open the file system",
open_filesys, open;
+request do_dump_tree, "Show full btrfs tree",
+ dump_tree;
+
+request do_dump_extent_tree, "Show Extent tree",
+ dump_extent_tree;
+
+request do_dump_root_tree, "Show root tree",
+ dump_root_tree;
+
+request do_dump_chunk_tree, "Show btrfs chunk tree",
+ dump_chunk_tree;
+
+request do_dump_dev_tree, "Show btrfs dev tree",
+ dump_dev_tree;
+
+request do_dump_fs_tree, "Show btrfs fs tree",
+ dump_fs_tree;
+
+request do_dump_csum_tree, "Show btrfs checksum tree",
+ dump_csum_tree;
+
+request do_dump_log_tree, "Show btrfs log tree",
+ dump_log_tree;
+
end;
diff --git a/debugbtrfs/debug_tree.c b/debugbtrfs/debug_tree.c
new file mode 100644
index 0000000..e92d6d0
--- /dev/null
+++ b/debugbtrfs/debug_tree.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2007 Oracle. 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <uuid/uuid.h>
+#include "kerncompat.h"
+#include "radix-tree.h"
+#include "ctree.h"
+#include "disk-io.h"
+#include "print-tree.h"
+#include "transaction.h"
+#include "debug_btrfs.h"
+
+void do_dump_extent_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("Extent tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->extent_root,
+ current_fs_root->fs_info->extent_root->node);
+}
+
+void do_dump_root_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("root tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->tree_root,
+ current_fs_root->fs_info->tree_root->node);
+}
+
+void do_dump_chunk_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("chunk tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->chunk_root,
+ current_fs_root->fs_info->chunk_root->node);
+}
+
+void do_dump_dev_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("Device tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->dev_root,
+ current_fs_root->fs_info->dev_root->node);
+}
+
+void do_dump_fs_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("FS tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->fs_root,
+ current_fs_root->fs_info->fs_root->node);
+}
+
+void do_dump_csum_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("Checksum tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->csum_root,
+ current_fs_root->fs_info->csum_root->node);
+}
+
+void do_dump_log_tree(int argc, char *argv[])
+{
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("Log tree\n");
+ if (!current_fs_root->fs_info->log_root_tree) {
+ printf("Nothing to replay \n");
+ return;
+ }
+ btrfs_print_tree(current_fs_root->fs_info->log_root_tree,
+ current_fs_root->fs_info->log_root_tree->node);
+}
+
+void do_dump_tree(int argc, char *argv[])
+{
+ struct btrfs_path path;
+ struct btrfs_key key;
+ struct btrfs_root_item ri;
+ struct extent_buffer *leaf;
+ struct btrfs_disk_key disk_key;
+ struct btrfs_key found_key;
+ char uuidbuf[37];
+ int ret;
+ int slot;
+ struct btrfs_root *tree_root_scan;
+
+ if (!current_fs_root) {
+ fprintf(stderr, "File system not yet opened: %s\n", current_device);
+ return;
+ }
+ printf("root tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->tree_root,
+ current_fs_root->fs_info->tree_root->node);
+
+ printf("chunk tree\n");
+ btrfs_print_tree(current_fs_root->fs_info->chunk_root,
+ current_fs_root->fs_info->chunk_root->node);
+
+ tree_root_scan = current_fs_root->fs_info->tree_root;
+
+ btrfs_init_path(&path);
+again:
+ key.offset = 0;
+ key.objectid = 0;
+ btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
+ ret = btrfs_search_slot(NULL, tree_root_scan, &key, &path, 0, 0);
+ BUG_ON(ret < 0);
+ while(1) {
+ leaf = path.nodes[0];
+ slot = path.slots[0];
+ if (slot >= btrfs_header_nritems(leaf)) {
+ ret = btrfs_next_leaf(tree_root_scan, &path);
+ if (ret != 0)
+ break;
+ leaf = path.nodes[0];
+ slot = path.slots[0];
+ }
+ btrfs_item_key(leaf, &disk_key, path.slots[0]);
+ btrfs_disk_key_to_cpu(&found_key, &disk_key);
+ if (btrfs_key_type(&found_key) == BTRFS_ROOT_ITEM_KEY) {
+ unsigned long offset;
+ struct extent_buffer *buf;
+
+ offset = btrfs_item_ptr_offset(leaf, slot);
+ read_extent_buffer(leaf, &ri, offset, sizeof(ri));
+ buf = read_tree_block(tree_root_scan,
+ btrfs_root_bytenr(&ri),
+ tree_root_scan->leafsize, 0);
+ switch(found_key.objectid) {
+ case BTRFS_ROOT_TREE_OBJECTID:
+ printf("root");
+ break;
+ case BTRFS_EXTENT_TREE_OBJECTID:
+ printf("extent");
+ break;
+ case BTRFS_CHUNK_TREE_OBJECTID:
+ printf("chunk");
+ break;
+ case BTRFS_DEV_TREE_OBJECTID:
+ printf("device");
+ break;
+ case BTRFS_FS_TREE_OBJECTID:
+ printf("fs");
+ break;
+ case BTRFS_ROOT_TREE_DIR_OBJECTID:
+ printf("directory");
+ break;
+ case BTRFS_CSUM_TREE_OBJECTID:
+ printf("checksum");
+ break;
+ case BTRFS_ORPHAN_OBJECTID:
+ printf("orphan");
+ break;
+ case BTRFS_TREE_LOG_OBJECTID:
+ printf("log");
+ break;
+ case BTRFS_TREE_LOG_FIXUP_OBJECTID:
+ printf("log fixup");
+ break;
+ case BTRFS_TREE_RELOC_OBJECTID:
+ printf("reloc");
+ break;
+ case BTRFS_DATA_RELOC_TREE_OBJECTID:
+ printf("data reloc");
+ break;
+ case BTRFS_EXTENT_CSUM_OBJECTID:
+ printf("extent checksum");
+ break;
+ case BTRFS_MULTIPLE_OBJECTIDS:
+ printf("multiple");
+ break;
+ default:
+ printf("file");
+ }
+
+ printf(" tree ");
+ btrfs_print_key(&disk_key);
+ printf(" \n");
+ btrfs_print_tree(tree_root_scan, buf);
+
+ }
+ path.slots[0]++;
+ }
+ btrfs_release_path(current_fs_root, &path);
+
+ if (tree_root_scan == current_fs_root->fs_info->tree_root &&
+ current_fs_root->fs_info->log_root_tree) {
+ tree_root_scan = current_fs_root->fs_info->log_root_tree;
+ goto again;
+ }
+
+ printf("total bytes %llu\n",
+ (unsigned long long)btrfs_super_total_bytes(¤t_fs_root->fs_info->super_copy));
+ printf("bytes used %llu\n",
+ (unsigned long long)btrfs_super_bytes_used(¤t_fs_root->fs_info->super_copy));
+ uuidbuf[36] = '\0';
+ uuid_unparse(current_fs_root->fs_info->super_copy.fsid, uuidbuf);
+ printf("uuid %s\n", uuidbuf);
+ return;
+}
--
1.7.0.rc0.48.gdace5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -V2 5/6] debug-btrfs: Add pager support
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
` (2 preceding siblings ...)
2010-02-04 17:44 ` [PATCH -V2 4/6] debug-btrfs: Add command to dump each of the btrfs trees Aneesh Kumar K.V
@ 2010-02-04 17:44 ` Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 6/6] debug-btrfs: Add print_inode command Aneesh Kumar K.V
2010-02-04 17:48 ` Add debug-btrfs (btrfs file system debugger) Aneesh Kumar K. V
5 siblings, 0 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2010-02-04 17:44 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs, Aneesh Kumar K.V
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
debugbtrfs/Makefile | 2 +-
debugbtrfs/debug_btrfs.h | 3 +
debugbtrfs/debug_tree.c | 107 ++++++++++++--------
| 49 +++++++++
lib/ctree.c | 22 ++--
lib/extent-tree.c | 10 +-
lib/print-tree.c | 256 +++++++++++++++++++++++-----------------------
lib/print-tree.h | 8 +-
lib/root-tree.c | 11 +-
misc/debug-tree.c | 8 +-
10 files changed, 277 insertions(+), 199 deletions(-)
create mode 100644 debugbtrfs/pager.c
diff --git a/debugbtrfs/Makefile b/debugbtrfs/Makefile
index 970990e..217a8f7 100644
--- a/debugbtrfs/Makefile
+++ b/debugbtrfs/Makefile
@@ -33,7 +33,7 @@ all: $(progs)
debug_btrfs_cmds.c: debug_btrfs_cmds.ct
$(MK_CMDS) debug_btrfs_cmds.ct
-debug-btrfs: $(TOPDIR)/lib/libbtrfs.a debug_btrfs.o cmds.o debug_btrfs_cmds.o debug_tree.o
+debug-btrfs: $(TOPDIR)/lib/libbtrfs.a debug_btrfs.o cmds.o debug_btrfs_cmds.o debug_tree.o pager.o
$(CC) $(CFLAGS) -o debug-btrfs $^ $(TOPDIR)/lib/libbtrfs.a $(LDFLAGS) $(LIBS)
clean:
diff --git a/debugbtrfs/debug_btrfs.h b/debugbtrfs/debug_btrfs.h
index 1ea4fb2..7f3b4b9 100644
--- a/debugbtrfs/debug_btrfs.h
+++ b/debugbtrfs/debug_btrfs.h
@@ -19,6 +19,7 @@
#ifndef DEBUG_BTRFS_H
#define DEBUG_BTRFS_H
+#include <stdio.h>
#include <getopt.h>
extern const char *current_device;
@@ -27,4 +28,6 @@ static inline void reset_getopt(void)
{
optind = 0;
}
+extern FILE *open_pager(void);
+extern void close_pager(FILE *);
#endif
diff --git a/debugbtrfs/debug_tree.c b/debugbtrfs/debug_tree.c
index e92d6d0..5e159d9 100644
--- a/debugbtrfs/debug_tree.c
+++ b/debugbtrfs/debug_tree.c
@@ -30,87 +30,110 @@
void do_dump_extent_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("Extent tree\n");
- btrfs_print_tree(current_fs_root->fs_info->extent_root,
+ fp = open_pager();
+ fprintf(fp, "Extent tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->extent_root,
current_fs_root->fs_info->extent_root->node);
+ close_pager(fp);
}
void do_dump_root_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("root tree\n");
- btrfs_print_tree(current_fs_root->fs_info->tree_root,
+ fp = open_pager();
+ fprintf(fp, "root tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->tree_root,
current_fs_root->fs_info->tree_root->node);
+ close_pager(fp);
}
void do_dump_chunk_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("chunk tree\n");
- btrfs_print_tree(current_fs_root->fs_info->chunk_root,
+ fp = open_pager();
+ fprintf(fp, "chunk tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->chunk_root,
current_fs_root->fs_info->chunk_root->node);
+ close_pager(fp);
}
void do_dump_dev_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("Device tree\n");
- btrfs_print_tree(current_fs_root->fs_info->dev_root,
+ fp = open_pager();
+ fprintf(fp, "Device tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->dev_root,
current_fs_root->fs_info->dev_root->node);
+ close_pager(fp);
}
void do_dump_fs_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("FS tree\n");
- btrfs_print_tree(current_fs_root->fs_info->fs_root,
+ fp = open_pager();
+ fprintf(fp, "FS tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->fs_root,
current_fs_root->fs_info->fs_root->node);
+ close_pager(fp);
}
void do_dump_csum_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("Checksum tree\n");
- btrfs_print_tree(current_fs_root->fs_info->csum_root,
+ fp = open_pager();
+ fprintf(fp, "Checksum tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->csum_root,
current_fs_root->fs_info->csum_root->node);
+ close_pager(fp);
}
void do_dump_log_tree(int argc, char *argv[])
{
+ FILE *fp;
if (!current_fs_root) {
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("Log tree\n");
+ fp = open_pager();
+ fprintf(fp, "Log tree\n");
if (!current_fs_root->fs_info->log_root_tree) {
- printf("Nothing to replay \n");
+ fprintf(fp, "Nothing to replay \n");
+ close_pager(fp);
return;
}
- btrfs_print_tree(current_fs_root->fs_info->log_root_tree,
+ btrfs_print_tree(fp, current_fs_root->fs_info->log_root_tree,
current_fs_root->fs_info->log_root_tree->node);
+ close_pager(fp);
}
void do_dump_tree(int argc, char *argv[])
{
+ FILE *fp;
struct btrfs_path path;
struct btrfs_key key;
struct btrfs_root_item ri;
@@ -126,12 +149,13 @@ void do_dump_tree(int argc, char *argv[])
fprintf(stderr, "File system not yet opened: %s\n", current_device);
return;
}
- printf("root tree\n");
- btrfs_print_tree(current_fs_root->fs_info->tree_root,
+ fp = open_pager();
+ fprintf(fp, "root tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->tree_root,
current_fs_root->fs_info->tree_root->node);
- printf("chunk tree\n");
- btrfs_print_tree(current_fs_root->fs_info->chunk_root,
+ fprintf(fp, "chunk tree\n");
+ btrfs_print_tree(fp, current_fs_root->fs_info->chunk_root,
current_fs_root->fs_info->chunk_root->node);
tree_root_scan = current_fs_root->fs_info->tree_root;
@@ -166,55 +190,55 @@ again:
tree_root_scan->leafsize, 0);
switch(found_key.objectid) {
case BTRFS_ROOT_TREE_OBJECTID:
- printf("root");
+ fprintf(fp, "root");
break;
case BTRFS_EXTENT_TREE_OBJECTID:
- printf("extent");
+ fprintf(fp, "extent");
break;
case BTRFS_CHUNK_TREE_OBJECTID:
- printf("chunk");
+ fprintf(fp, "chunk");
break;
case BTRFS_DEV_TREE_OBJECTID:
- printf("device");
+ fprintf(fp, "device");
break;
case BTRFS_FS_TREE_OBJECTID:
- printf("fs");
+ fprintf(fp, "fs");
break;
case BTRFS_ROOT_TREE_DIR_OBJECTID:
- printf("directory");
+ fprintf(fp, "directory");
break;
case BTRFS_CSUM_TREE_OBJECTID:
- printf("checksum");
+ fprintf(fp, "checksum");
break;
case BTRFS_ORPHAN_OBJECTID:
- printf("orphan");
+ fprintf(fp, "orphan");
break;
case BTRFS_TREE_LOG_OBJECTID:
- printf("log");
+ fprintf(fp, "log");
break;
case BTRFS_TREE_LOG_FIXUP_OBJECTID:
- printf("log fixup");
+ fprintf(fp, "log fixup");
break;
case BTRFS_TREE_RELOC_OBJECTID:
- printf("reloc");
+ fprintf(fp, "reloc");
break;
case BTRFS_DATA_RELOC_TREE_OBJECTID:
- printf("data reloc");
+ fprintf(fp, "data reloc");
break;
case BTRFS_EXTENT_CSUM_OBJECTID:
- printf("extent checksum");
+ fprintf(fp, "extent checksum");
break;
case BTRFS_MULTIPLE_OBJECTIDS:
- printf("multiple");
+ fprintf(fp, "multiple");
break;
default:
- printf("file");
+ fprintf(fp, "file");
}
- printf(" tree ");
- btrfs_print_key(&disk_key);
- printf(" \n");
- btrfs_print_tree(tree_root_scan, buf);
+ fprintf(fp, " tree ");
+ btrfs_print_key(fp, &disk_key);
+ fprintf(fp, " \n");
+ btrfs_print_tree(fp, tree_root_scan, buf);
}
path.slots[0]++;
@@ -227,12 +251,13 @@ again:
goto again;
}
- printf("total bytes %llu\n",
+ fprintf(fp, "total bytes %llu\n",
(unsigned long long)btrfs_super_total_bytes(¤t_fs_root->fs_info->super_copy));
- printf("bytes used %llu\n",
+ fprintf(fp, "bytes used %llu\n",
(unsigned long long)btrfs_super_bytes_used(¤t_fs_root->fs_info->super_copy));
uuidbuf[36] = '\0';
uuid_unparse(current_fs_root->fs_info->super_copy.fsid, uuidbuf);
- printf("uuid %s\n", uuidbuf);
+ fprintf(fp, "uuid %s\n", uuidbuf);
+ close_pager(fp);
return;
}
--git a/debugbtrfs/pager.c b/debugbtrfs/pager.c
new file mode 100644
index 0000000..b2d3a96
--- /dev/null
+++ b/debugbtrfs/pager.c
@@ -0,0 +1,49 @@
+/* derived from e2fsprogs debugfs/util.c */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <string.h>
+
+static const char *pager_search_list[] = { "pager", "more", "less", 0 };
+static const char *pager_dir_list[] = { "/usr/bin", "/bin", 0 };
+
+static const char *find_pager(char *buf)
+{
+ const char **i, **j;
+
+ for (i = pager_search_list; *i; i++) {
+ for (j = pager_dir_list; *j; j++) {
+ sprintf(buf, "%s/%s", *j, *i);
+ if (access(buf, X_OK) == 0)
+ return(buf);
+ }
+ }
+ return 0;
+}
+
+FILE *open_pager(void)
+{
+ FILE *outfile = 0;
+ const char *pager = getenv("DEBUGFS_PAGER");
+ char buf[80];
+
+ signal(SIGPIPE, SIG_IGN);
+ if (!isatty(1))
+ return stdout;
+ if (!pager)
+ pager = getenv("PAGER");
+ if (!pager)
+ pager = find_pager(buf);
+ if (!pager ||
+ (strcmp(pager, "__none__") == 0) ||
+ ((outfile = popen(pager, "w")) == 0))
+ return stdout;
+ return outfile;
+}
+
+void close_pager(FILE *stream)
+{
+ if (stream && stream != stdout) pclose(stream);
+}
diff --git a/lib/ctree.c b/lib/ctree.c
index f70e10c..45e98ae 100644
--- a/lib/ctree.c
+++ b/lib/ctree.c
@@ -657,13 +657,13 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
btrfs_item_key(leaf, &leaf_key, slot);
btrfs_item_key_to_cpu(leaf, &cpukey, slot - 1);
if (btrfs_comp_keys(&leaf_key, &cpukey) <= 0) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
printk("slot %d offset bad key\n", slot);
BUG_ON(1);
}
if (btrfs_item_offset_nr(leaf, slot - 1) !=
btrfs_item_end_nr(leaf, slot)) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
printk("slot %d offset bad\n", slot);
BUG_ON(1);
}
@@ -674,7 +674,7 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
BUG_ON(btrfs_comp_keys(&leaf_key, &cpukey) >= 0);
if (btrfs_item_offset_nr(leaf, slot) !=
btrfs_item_end_nr(leaf, slot + 1)) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
printk("slot %d offset bad\n", slot);
BUG_ON(1);
}
@@ -2356,7 +2356,7 @@ split:
ret = 0;
if (btrfs_leaf_free_space(root, leaf) < 0) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
BUG();
}
kfree(buf);
@@ -2456,7 +2456,7 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans,
ret = 0;
if (btrfs_leaf_free_space(root, leaf) < 0) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
BUG();
}
return ret;
@@ -2484,7 +2484,7 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans,
data_end = leaf_data_end(root, leaf);
if (btrfs_leaf_free_space(root, leaf) < data_size) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
BUG();
}
slot = path->slots[0];
@@ -2492,7 +2492,7 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans,
BUG_ON(slot < 0);
if (slot >= nritems) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
printk("slot %d too large, nritems %d\n", slot, nritems);
BUG_ON(1);
}
@@ -2521,7 +2521,7 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans,
ret = 0;
if (btrfs_leaf_free_space(root, leaf) < 0) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
BUG();
}
return ret;
@@ -2572,7 +2572,7 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
data_end = leaf_data_end(root, leaf);
if (btrfs_leaf_free_space(root, leaf) < total_size) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
printk("not enough freespace need %u have %d\n",
total_size, btrfs_leaf_free_space(root, leaf));
BUG();
@@ -2586,7 +2586,7 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
unsigned int old_data = btrfs_item_end_nr(leaf, slot);
if (old_data < data_end) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
printk("slot %d old_data %d data_end %d\n",
slot, old_data, data_end);
BUG_ON(1);
@@ -2634,7 +2634,7 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
}
if (btrfs_leaf_free_space(root, leaf) < 0) {
- btrfs_print_leaf(root, leaf);
+ btrfs_print_leaf(stdout, root, leaf);
BUG();
}
diff --git a/lib/extent-tree.c b/lib/extent-tree.c
index b2f9bb2..210da17 100644
--- a/lib/extent-tree.c
+++ b/lib/extent-tree.c
@@ -1447,7 +1447,7 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
if (ret < 0)
goto out;
if (ret != 0) {
- btrfs_print_leaf(root, path->nodes[0]);
+ btrfs_print_leaf(stdout, root, path->nodes[0]);
printk("failed to find block number %Lu\n", bytenr);
BUG();
}
@@ -1505,7 +1505,7 @@ int btrfs_set_block_flags(struct btrfs_trans_handle *trans,
if (ret < 0)
goto out;
if (ret != 0) {
- btrfs_print_leaf(root, path->nodes[0]);
+ btrfs_print_leaf(stdout, root, path->nodes[0]);
printk("failed to find block number %Lu\n",
(unsigned long long)bytenr);
BUG();
@@ -2126,13 +2126,13 @@ static int __free_extent(struct btrfs_trans_handle *trans,
printk(KERN_ERR "umm, got %d back from search"
", was looking for %llu\n", ret,
(unsigned long long)bytenr);
- btrfs_print_leaf(extent_root, path->nodes[0]);
+ btrfs_print_leaf(stdout, extent_root, path->nodes[0]);
}
BUG_ON(ret);
extent_slot = path->slots[0];
}
} else {
- btrfs_print_leaf(extent_root, path->nodes[0]);
+ btrfs_print_leaf(stdout, extent_root, path->nodes[0]);
WARN_ON(1);
printk(KERN_ERR "btrfs unable to find ref byte nr %llu "
"parent %llu root %llu owner %llu offset %llu\n",
@@ -2165,7 +2165,7 @@ static int __free_extent(struct btrfs_trans_handle *trans,
printk(KERN_ERR "umm, got %d back from search"
", was looking for %llu\n", ret,
(unsigned long long)bytenr);
- btrfs_print_leaf(extent_root, path->nodes[0]);
+ btrfs_print_leaf(stdout, extent_root, path->nodes[0]);
}
BUG_ON(ret);
extent_slot = path->slots[0];
diff --git a/lib/print-tree.c b/lib/print-tree.c
index 59f4358..af09b8c 100644
--- a/lib/print-tree.c
+++ b/lib/print-tree.c
@@ -25,7 +25,7 @@
#include "disk-io.h"
#include "print-tree.h"
-static int print_dir_item(struct extent_buffer *eb, struct btrfs_item *item,
+static int print_dir_item(FILE *out, struct extent_buffer *eb, struct btrfs_item *item,
struct btrfs_dir_item *di)
{
u32 total;
@@ -39,14 +39,14 @@ static int print_dir_item(struct extent_buffer *eb, struct btrfs_item *item,
total = btrfs_item_size(eb, item);
while(cur < total) {
btrfs_dir_item_key(eb, di, &location);
- printf("\t\tlocation ");
- btrfs_print_key(&location);
- printf(" type %u\n", btrfs_dir_type(eb, di));
+ fprintf(out, "\t\tlocation ");
+ btrfs_print_key(out, &location);
+ fprintf(out, " type %u\n", btrfs_dir_type(eb, di));
name_len = btrfs_dir_name_len(eb, di);
data_len = btrfs_dir_data_len(eb, di);
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
read_extent_buffer(eb, namebuf, (unsigned long)(di + 1), len);
- printf("\t\tnamelen %u datalen %u name: %.*s\n",
+ fprintf(out, "\t\tnamelen %u datalen %u name: %.*s\n",
name_len, data_len, len, namebuf);
len = sizeof(*di) + name_len + data_len;
di = (struct btrfs_dir_item *)((char *)di + len);
@@ -55,7 +55,7 @@ static int print_dir_item(struct extent_buffer *eb, struct btrfs_item *item,
return 0;
}
-static int print_inode_ref_item(struct extent_buffer *eb, struct btrfs_item *item,
+static int print_inode_ref_item(FILE *out, struct extent_buffer *eb, struct btrfs_item *item,
struct btrfs_inode_ref *ref)
{
u32 total;
@@ -70,7 +70,7 @@ static int print_inode_ref_item(struct extent_buffer *eb, struct btrfs_item *ite
index = btrfs_inode_ref_index(eb, ref);
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
- printf("\t\tinode ref index %llu namelen %u name: %.*s\n",
+ fprintf(out, "\t\tinode ref index %llu namelen %u name: %.*s\n",
(unsigned long long)index, name_len, len, namebuf);
len = sizeof(*ref) + name_len;
ref = (struct btrfs_inode_ref *)((char *)ref + len);
@@ -79,32 +79,32 @@ static int print_inode_ref_item(struct extent_buffer *eb, struct btrfs_item *ite
return 0;
}
-static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk)
+static void print_chunk(FILE *out, struct extent_buffer *eb, struct btrfs_chunk *chunk)
{
int num_stripes = btrfs_chunk_num_stripes(eb, chunk);
int i;
- printf("\t\tchunk length %llu owner %llu type %llu num_stripes %d\n",
+ fprintf(out, "\t\tchunk length %llu owner %llu type %llu num_stripes %d\n",
(unsigned long long)btrfs_chunk_length(eb, chunk),
(unsigned long long)btrfs_chunk_owner(eb, chunk),
(unsigned long long)btrfs_chunk_type(eb, chunk),
num_stripes);
for (i = 0 ; i < num_stripes ; i++) {
- printf("\t\t\tstripe %d devid %llu offset %llu\n", i,
+ fprintf(out, "\t\t\tstripe %d devid %llu offset %llu\n", i,
(unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i),
(unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i));
}
}
-static void print_dev_item(struct extent_buffer *eb,
+static void print_dev_item(FILE *out, struct extent_buffer *eb,
struct btrfs_dev_item *dev_item)
{
- printf("\t\tdev item devid %llu "
+ fprintf(out, "\t\tdev item devid %llu "
"total_bytes %llu bytes used %Lu\n",
(unsigned long long)btrfs_device_id(eb, dev_item),
(unsigned long long)btrfs_device_total_bytes(eb, dev_item),
(unsigned long long)btrfs_device_bytes_used(eb, dev_item));
}
-static void print_uuids(struct extent_buffer *eb)
+static void print_uuids(FILE *out, struct extent_buffer *eb)
{
char fs_uuid[37];
char chunk_uuid[37];
@@ -122,17 +122,17 @@ static void print_uuids(struct extent_buffer *eb)
chunk_uuid[36] = '\0';
uuid_unparse(disk_uuid, chunk_uuid);
- printf("fs uuid %s\nchunk uuid %s\n", fs_uuid, chunk_uuid);
+ fprintf(out, "fs uuid %s\nchunk uuid %s\n", fs_uuid, chunk_uuid);
}
-static void print_file_extent_item(struct extent_buffer *eb,
+static void print_file_extent_item(FILE *out, struct extent_buffer *eb,
struct btrfs_item *item,
struct btrfs_file_extent_item *fi)
{
int extent_type = btrfs_file_extent_type(eb, fi);
if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
- printf("\t\tinline extent data size %u "
+ fprintf(out, "\t\tinline extent data size %u "
"ram %u compress %d\n",
btrfs_file_extent_inline_item_len(eb, item),
btrfs_file_extent_inline_len(eb, fi),
@@ -140,26 +140,26 @@ static void print_file_extent_item(struct extent_buffer *eb,
return;
}
if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
- printf("\t\tprealloc data disk byte %llu nr %llu\n",
+ fprintf(out, "\t\tprealloc data disk byte %llu nr %llu\n",
(unsigned long long)btrfs_file_extent_disk_bytenr(eb, fi),
(unsigned long long)btrfs_file_extent_disk_num_bytes(eb, fi));
- printf("\t\tprealloc data offset %llu nr %llu\n",
+ fprintf(out, "\t\tprealloc data offset %llu nr %llu\n",
(unsigned long long)btrfs_file_extent_offset(eb, fi),
(unsigned long long)btrfs_file_extent_num_bytes(eb, fi));
return;
}
- printf("\t\textent data disk byte %llu nr %llu\n",
+ fprintf(out, "\t\textent data disk byte %llu nr %llu\n",
(unsigned long long)btrfs_file_extent_disk_bytenr(eb, fi),
(unsigned long long)btrfs_file_extent_disk_num_bytes(eb, fi));
- printf("\t\textent data offset %llu nr %llu ram %llu\n",
+ fprintf(out, "\t\textent data offset %llu nr %llu ram %llu\n",
(unsigned long long)btrfs_file_extent_offset(eb, fi),
(unsigned long long)btrfs_file_extent_num_bytes(eb, fi),
(unsigned long long)btrfs_file_extent_ram_bytes(eb, fi));
- printf("\t\textent compression %d\n",
+ fprintf(out, "\t\textent compression %d\n",
btrfs_file_extent_compression(eb, fi));
}
-static void print_extent_item(struct extent_buffer *eb, int slot)
+static void print_extent_item(FILE *out, struct extent_buffer *eb, int slot)
{
struct btrfs_extent_item *ei;
struct btrfs_extent_inline_ref *iref;
@@ -178,7 +178,7 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
struct btrfs_extent_item_v0 *ei0;
BUG_ON(item_size != sizeof(*ei0));
ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0);
- printf("\t\textent refs %u\n",
+ fprintf(out, "\t\textent refs %u\n",
btrfs_extent_refs_v0(eb, ei0));
return;
#else
@@ -189,7 +189,7 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
flags = btrfs_extent_flags(eb, ei);
- printf("\t\textent refs %llu gen %llu flags %llu\n",
+ fprintf(out, "\t\textent refs %llu gen %llu flags %llu\n",
(unsigned long long)btrfs_extent_refs(eb, ei),
(unsigned long long)btrfs_extent_generation(eb, ei),
(unsigned long long)flags);
@@ -198,7 +198,7 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
struct btrfs_tree_block_info *info;
info = (struct btrfs_tree_block_info *)(ei + 1);
btrfs_tree_block_key(eb, info, &key);
- printf("\t\ttree block key (%llu %x %llu) level %d\n",
+ fprintf(out, "\t\ttree block key (%llu %x %llu) level %d\n",
(unsigned long long)btrfs_disk_key_objectid(&key),
key.type,
(unsigned long long)btrfs_disk_key_offset(&key),
@@ -216,16 +216,16 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
offset = btrfs_extent_inline_ref_offset(eb, iref);
switch (type) {
case BTRFS_TREE_BLOCK_REF_KEY:
- printf("\t\ttree block backref root %llu\n",
+ fprintf(out, "\t\ttree block backref root %llu\n",
(unsigned long long)offset);
break;
case BTRFS_SHARED_BLOCK_REF_KEY:
- printf("\t\tshared block backref parent %llu\n",
+ fprintf(out, "\t\tshared block backref parent %llu\n",
(unsigned long long)offset);
break;
case BTRFS_EXTENT_DATA_REF_KEY:
dref = (struct btrfs_extent_data_ref *)(&iref->offset);
- printf("\t\textent data backref root %llu "
+ fprintf(out, "\t\textent data backref root %llu "
"objectid %llu offset %llu count %u\n",
(unsigned long long)btrfs_extent_data_ref_root(eb, dref),
(unsigned long long)btrfs_extent_data_ref_objectid(eb, dref),
@@ -234,7 +234,7 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
break;
case BTRFS_SHARED_DATA_REF_KEY:
sref = (struct btrfs_shared_data_ref *)(iref + 1);
- printf("\t\tshared data backref parent %llu count %u\n",
+ fprintf(out, "\t\tshared data backref parent %llu count %u\n",
(unsigned long long)offset,
btrfs_shared_data_ref_count(eb, sref));
break;
@@ -247,12 +247,12 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
}
#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
-static void print_extent_ref_v0(struct extent_buffer *eb, int slot)
+static void print_extent_ref_v0(FILE *out, struct extent_buffer *eb, int slot)
{
struct btrfs_extent_ref_v0 *ref0;
ref0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_ref_v0);
- printf("\t\textent back ref root %llu gen %llu "
+ fprintf(out, "\t\textent back ref root %llu gen %llu "
"owner %llu num_refs %lu\n",
(unsigned long long)btrfs_ref_root_v0(eb, ref0),
(unsigned long long)btrfs_ref_generation_v0(eb, ref0),
@@ -261,7 +261,7 @@ static void print_extent_ref_v0(struct extent_buffer *eb, int slot)
}
#endif
-static void print_root_ref(struct extent_buffer *leaf, int slot, char *tag)
+static void print_root_ref(FILE *out, struct extent_buffer *leaf, int slot, char *tag)
{
struct btrfs_root_ref *ref;
char namebuf[BTRFS_NAME_LEN];
@@ -270,169 +270,169 @@ static void print_root_ref(struct extent_buffer *leaf, int slot, char *tag)
ref = btrfs_item_ptr(leaf, slot, struct btrfs_root_ref);
namelen = btrfs_root_ref_name_len(leaf, ref);
read_extent_buffer(leaf, namebuf, (unsigned long)(ref + 1), namelen);
- printf("\t\troot %s key dirid %llu sequence %llu name %.*s\n", tag,
+ fprintf(out, "\t\troot %s key dirid %llu sequence %llu name %.*s\n", tag,
(unsigned long long)btrfs_root_ref_dirid(leaf, ref),
(unsigned long long)btrfs_root_ref_sequence(leaf, ref),
namelen, namebuf);
}
-static void print_key_type(u8 type)
+static void print_key_type(FILE *out, u8 type)
{
switch (type) {
case BTRFS_INODE_ITEM_KEY:
- printf("INODE_ITEM");
+ fprintf(out, "INODE_ITEM");
break;
case BTRFS_INODE_REF_KEY:
- printf("INODE_REF");
+ fprintf(out, "INODE_REF");
break;
case BTRFS_DIR_ITEM_KEY:
- printf("DIR_ITEM");
+ fprintf(out, "DIR_ITEM");
break;
case BTRFS_DIR_INDEX_KEY:
- printf("DIR_INDEX");
+ fprintf(out, "DIR_INDEX");
break;
case BTRFS_DIR_LOG_ITEM_KEY:
- printf("DIR_LOG_ITEM");
+ fprintf(out, "DIR_LOG_ITEM");
break;
case BTRFS_DIR_LOG_INDEX_KEY:
- printf("DIR_LOG_INDEX");
+ fprintf(out, "DIR_LOG_INDEX");
break;
case BTRFS_XATTR_ITEM_KEY:
- printf("XATTR_ITEM");
+ fprintf(out, "XATTR_ITEM");
break;
case BTRFS_ORPHAN_ITEM_KEY:
- printf("ORPHAN_ITEM");
+ fprintf(out, "ORPHAN_ITEM");
break;
case BTRFS_ROOT_ITEM_KEY:
- printf("ROOT_ITEM");
+ fprintf(out, "ROOT_ITEM");
break;
case BTRFS_ROOT_REF_KEY:
- printf("ROOT_REF");
+ fprintf(out, "ROOT_REF");
break;
case BTRFS_ROOT_BACKREF_KEY:
- printf("ROOT_BACKREF");
+ fprintf(out, "ROOT_BACKREF");
break;
case BTRFS_EXTENT_ITEM_KEY:
- printf("EXTENT_ITEM");
+ fprintf(out, "EXTENT_ITEM");
break;
case BTRFS_TREE_BLOCK_REF_KEY:
- printf("TREE_BLOCK_REF");
+ fprintf(out, "TREE_BLOCK_REF");
break;
case BTRFS_SHARED_BLOCK_REF_KEY:
- printf("SHARED_BLOCK_REF");
+ fprintf(out, "SHARED_BLOCK_REF");
break;
case BTRFS_EXTENT_DATA_REF_KEY:
- printf("EXTENT_DATA_REF");
+ fprintf(out, "EXTENT_DATA_REF");
break;
case BTRFS_SHARED_DATA_REF_KEY:
- printf("SHARED_DATA_REF");
+ fprintf(out, "SHARED_DATA_REF");
break;
case BTRFS_EXTENT_REF_V0_KEY:
- printf("EXTENT_REF_V0");
+ fprintf(out, "EXTENT_REF_V0");
break;
case BTRFS_CSUM_ITEM_KEY:
- printf("CSUM_ITEM");
+ fprintf(out, "CSUM_ITEM");
break;
case BTRFS_EXTENT_CSUM_KEY:
- printf("EXTENT_CSUM");
+ fprintf(out, "EXTENT_CSUM");
break;
case BTRFS_EXTENT_DATA_KEY:
- printf("EXTENT_DATA");
+ fprintf(out, "EXTENT_DATA");
break;
case BTRFS_BLOCK_GROUP_ITEM_KEY:
- printf("BLOCK_GROUP_ITEM");
+ fprintf(out, "BLOCK_GROUP_ITEM");
break;
case BTRFS_CHUNK_ITEM_KEY:
- printf("CHUNK_ITEM");
+ fprintf(out, "CHUNK_ITEM");
break;
case BTRFS_DEV_ITEM_KEY:
- printf("DEV_ITEM");
+ fprintf(out, "DEV_ITEM");
break;
case BTRFS_DEV_EXTENT_KEY:
- printf("DEV_EXTENT");
+ fprintf(out, "DEV_EXTENT");
break;
case BTRFS_STRING_ITEM_KEY:
- printf("STRING_ITEM");
+ fprintf(out, "STRING_ITEM");
break;
default:
- printf("UNKNOWN");
+ fprintf(out, "UNKNOWN");
};
}
-static void print_objectid(unsigned long long objectid, u8 type)
+static void print_objectid(FILE *out, unsigned long long objectid, u8 type)
{
if (type == BTRFS_DEV_EXTENT_KEY) {
- printf("%llu", objectid); /* device id */
+ fprintf(out, "%llu", objectid); /* device id */
return;
}
switch (objectid) {
case BTRFS_ROOT_TREE_OBJECTID:
if (type == BTRFS_DEV_ITEM_KEY)
- printf("DEV_ITEMS");
+ fprintf(out, "DEV_ITEMS");
else
- printf("ROOT_TREE");
+ fprintf(out, "ROOT_TREE");
break;
case BTRFS_EXTENT_TREE_OBJECTID:
- printf("EXTENT_TREE");
+ fprintf(out, "EXTENT_TREE");
break;
case BTRFS_CHUNK_TREE_OBJECTID:
- printf("CHUNK_TREE");
+ fprintf(out, "CHUNK_TREE");
break;
case BTRFS_DEV_TREE_OBJECTID:
- printf("DEV_TREE");
+ fprintf(out, "DEV_TREE");
break;
case BTRFS_FS_TREE_OBJECTID:
- printf("FS_TREE");
+ fprintf(out, "FS_TREE");
break;
case BTRFS_ROOT_TREE_DIR_OBJECTID:
- printf("ROOT_TREE_DIR");
+ fprintf(out, "ROOT_TREE_DIR");
break;
case BTRFS_CSUM_TREE_OBJECTID:
- printf("CSUM_TREE");
+ fprintf(out, "CSUM_TREE");
break;
case BTRFS_ORPHAN_OBJECTID:
- printf("ORPHAN");
+ fprintf(out, "ORPHAN");
break;
case BTRFS_TREE_LOG_OBJECTID:
- printf("TREE_LOG");
+ fprintf(out, "TREE_LOG");
break;
case BTRFS_TREE_LOG_FIXUP_OBJECTID:
- printf("LOG_FIXUP");
+ fprintf(out, "LOG_FIXUP");
break;
case BTRFS_TREE_RELOC_OBJECTID:
- printf("TREE_RELOC");
+ fprintf(out, "TREE_RELOC");
break;
case BTRFS_DATA_RELOC_TREE_OBJECTID:
- printf("DATA_RELOC_TREE");
+ fprintf(out, "DATA_RELOC_TREE");
break;
case BTRFS_EXTENT_CSUM_OBJECTID:
- printf("EXTENT_CSUM");
+ fprintf(out, "EXTENT_CSUM");
break;
case BTRFS_MULTIPLE_OBJECTIDS:
- printf("MULTIPLE");
+ fprintf(out, "MULTIPLE");
break;
case BTRFS_FIRST_CHUNK_TREE_OBJECTID:
- printf("FIRST_CHUNK_TREE");
+ fprintf(out, "FIRST_CHUNK_TREE");
break;
default:
- printf("%llu", objectid);
+ fprintf(out, "%llu", objectid);
}
}
-void btrfs_print_key(struct btrfs_disk_key *disk_key)
+void btrfs_print_key(FILE *out, struct btrfs_disk_key *disk_key)
{
u8 type;
- printf("key (");
+ fprintf(out, "key (");
type = btrfs_disk_key_type(disk_key);
- print_objectid((unsigned long long)btrfs_disk_key_objectid(disk_key),
+ print_objectid(out, (unsigned long long)btrfs_disk_key_objectid(disk_key),
type);
- printf(" ");
- print_key_type(type);
- printf(" %llu)", (unsigned long long)btrfs_disk_key_offset(disk_key));
+ fprintf(out, " ");
+ print_key_type(out, type);
+ fprintf(out, " %llu)", (unsigned long long)btrfs_disk_key_offset(disk_key));
}
-void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
+void btrfs_print_leaf(FILE *out, struct btrfs_root *root, struct extent_buffer *l)
{
int i;
char *str;
@@ -454,26 +454,26 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
u32 nr = btrfs_header_nritems(l);
u32 type;
- printf("leaf %llu items %d free space %d generation %llu owner %llu\n",
+ fprintf(out, "leaf %llu items %d free space %d generation %llu owner %llu\n",
(unsigned long long)btrfs_header_bytenr(l), nr,
btrfs_leaf_free_space(root, l),
(unsigned long long)btrfs_header_generation(l),
(unsigned long long)btrfs_header_owner(l));
- print_uuids(l);
- fflush(stdout);
+ print_uuids(out, l);
+ fflush(out);
for (i = 0 ; i < nr ; i++) {
item = btrfs_item_nr(l, i);
btrfs_item_key(l, &disk_key, i);
type = btrfs_disk_key_type(&disk_key);
- printf("\titem %d ", i);
- btrfs_print_key(&disk_key);
- printf(" itemoff %d itemsize %d\n",
+ fprintf(out, "\titem %d ", i);
+ btrfs_print_key(out, &disk_key);
+ fprintf(out, " itemoff %d itemsize %d\n",
btrfs_item_offset(l, item),
btrfs_item_size(l, item));
switch (type) {
case BTRFS_INODE_ITEM_KEY:
ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
- printf("\t\tinode generation %llu size %llu block group %llu mode %o links %u\n",
+ fprintf(out, "\t\tinode generation %llu size %llu block group %llu mode %o links %u\n",
(unsigned long long)btrfs_inode_generation(l, ii),
(unsigned long long)btrfs_inode_size(l, ii),
(unsigned long long)btrfs_inode_block_group(l,ii),
@@ -482,27 +482,27 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
break;
case BTRFS_INODE_REF_KEY:
iref = btrfs_item_ptr(l, i, struct btrfs_inode_ref);
- print_inode_ref_item(l, item, iref);
+ print_inode_ref_item(out, l, item, iref);
break;
case BTRFS_DIR_ITEM_KEY:
case BTRFS_DIR_INDEX_KEY:
case BTRFS_XATTR_ITEM_KEY:
di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
- print_dir_item(l, item, di);
+ print_dir_item(out, l, item, di);
break;
case BTRFS_DIR_LOG_INDEX_KEY:
case BTRFS_DIR_LOG_ITEM_KEY:
dlog = btrfs_item_ptr(l, i, struct btrfs_dir_log_item);
- printf("\t\tdir log end %Lu\n",
+ fprintf(out, "\t\tdir log end %Lu\n",
btrfs_dir_log_end(l, dlog));
break;
case BTRFS_ORPHAN_ITEM_KEY:
- printf("\t\torphan item\n");
+ fprintf(out, "\t\torphan item\n");
break;
case BTRFS_ROOT_ITEM_KEY:
ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
read_extent_buffer(l, &root_item, (unsigned long)ri, sizeof(root_item));
- printf("\t\troot data bytenr %llu level %d dirid %llu refs %u\n",
+ fprintf(out, "\t\troot data bytenr %llu level %d dirid %llu refs %u\n",
(unsigned long long)btrfs_root_bytenr(&root_item),
btrfs_root_level(&root_item),
(unsigned long long)btrfs_root_dirid(&root_item),
@@ -511,29 +511,29 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
struct btrfs_key drop_key;
btrfs_disk_key_to_cpu(&drop_key,
&root_item.drop_progress);
- printf("\t\tdrop ");
- btrfs_print_key(&root_item.drop_progress);
- printf(" level %d\n", root_item.drop_level);
+ fprintf(out, "\t\tdrop ");
+ btrfs_print_key(out, &root_item.drop_progress);
+ fprintf(out, " level %d\n", root_item.drop_level);
}
break;
case BTRFS_ROOT_REF_KEY:
- print_root_ref(l, i, "ref");
+ print_root_ref(out, l, i, "ref");
break;
case BTRFS_ROOT_BACKREF_KEY:
- print_root_ref(l, i, "backref");
+ print_root_ref(out, l, i, "backref");
break;
case BTRFS_EXTENT_ITEM_KEY:
- print_extent_item(l, i);
+ print_extent_item(out, l, i);
break;
case BTRFS_TREE_BLOCK_REF_KEY:
- printf("\t\ttree block backref\n");
+ fprintf(out, "\t\ttree block backref\n");
break;
case BTRFS_SHARED_BLOCK_REF_KEY:
- printf("\t\tshared block backref\n");
+ fprintf(out, "\t\tshared block backref\n");
break;
case BTRFS_EXTENT_DATA_REF_KEY:
dref = btrfs_item_ptr(l, i, struct btrfs_extent_data_ref);
- printf("\t\textent data backref root %llu "
+ fprintf(out, "\t\textent data backref root %llu "
"objectid %llu offset %llu count %u\n",
(unsigned long long)btrfs_extent_data_ref_root(l, dref),
(unsigned long long)btrfs_extent_data_ref_objectid(l, dref),
@@ -542,50 +542,50 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
break;
case BTRFS_SHARED_DATA_REF_KEY:
sref = btrfs_item_ptr(l, i, struct btrfs_shared_data_ref);
- printf("\t\tshared data backref count %u\n",
+ fprintf(out, "\t\tshared data backref count %u\n",
btrfs_shared_data_ref_count(l, sref));
break;
case BTRFS_EXTENT_REF_V0_KEY:
#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
- print_extent_ref_v0(l, i);
+ print_extent_ref_v0(out, l, i);
#else
BUG();
#endif
break;
case BTRFS_CSUM_ITEM_KEY:
ci = btrfs_item_ptr(l, i, struct btrfs_csum_item);
- printf("\t\tcsum item\n");
+ fprintf(out, "\t\tcsum item\n");
break;
case BTRFS_EXTENT_CSUM_KEY:
ci = btrfs_item_ptr(l, i, struct btrfs_csum_item);
- printf("\t\textent csum item\n");
+ fprintf(out, "\t\textent csum item\n");
break;
case BTRFS_EXTENT_DATA_KEY:
fi = btrfs_item_ptr(l, i,
struct btrfs_file_extent_item);
- print_file_extent_item(l, item, fi);
+ print_file_extent_item(out, l, item, fi);
break;
case BTRFS_BLOCK_GROUP_ITEM_KEY:
bi = btrfs_item_ptr(l, i,
struct btrfs_block_group_item);
read_extent_buffer(l, &bg_item, (unsigned long)bi,
sizeof(bg_item));
- printf("\t\tblock group used %llu chunk_objectid %llu flags %llu\n",
+ fprintf(out, "\t\tblock group used %llu chunk_objectid %llu flags %llu\n",
(unsigned long long)btrfs_block_group_used(&bg_item),
(unsigned long long)btrfs_block_group_chunk_objectid(&bg_item),
(unsigned long long)btrfs_block_group_flags(&bg_item));
break;
case BTRFS_CHUNK_ITEM_KEY:
- print_chunk(l, btrfs_item_ptr(l, i, struct btrfs_chunk));
+ print_chunk(out, l, btrfs_item_ptr(l, i, struct btrfs_chunk));
break;
case BTRFS_DEV_ITEM_KEY:
- print_dev_item(l, btrfs_item_ptr(l, i,
+ print_dev_item(out, l, btrfs_item_ptr(l, i,
struct btrfs_dev_item));
break;
case BTRFS_DEV_EXTENT_KEY:
dev_extent = btrfs_item_ptr(l, i,
struct btrfs_dev_extent);
- printf("\t\tdev extent chunk_tree %llu\n"
+ fprintf(out, "\t\tdev extent chunk_tree %llu\n"
"\t\tchunk objectid %llu chunk offset %llu "
"length %llu\n",
(unsigned long long)
@@ -600,14 +600,14 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
case BTRFS_STRING_ITEM_KEY:
/* dirty, but it's simple */
str = l->data + btrfs_item_ptr_offset(l, i);
- printf("\t\titem data %.*s\n", btrfs_item_size(l, item), str);
+ fprintf(out, "\t\titem data %.*s\n", btrfs_item_size(l, item), str);
break;
};
- fflush(stdout);
+ fflush(out);
}
}
-void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb)
+void btrfs_print_tree(FILE *out, struct btrfs_root *root, struct extent_buffer *eb)
{
int i;
u32 nr;
@@ -619,29 +619,29 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb)
return;
nr = btrfs_header_nritems(eb);
if (btrfs_is_leaf(eb)) {
- btrfs_print_leaf(root, eb);
+ btrfs_print_leaf(out, root, eb);
return;
}
- printf("node %llu level %d items %d free %u generation %llu owner %llu\n",
+ fprintf(out, "node %llu level %d items %d free %u generation %llu owner %llu\n",
(unsigned long long)eb->start,
btrfs_header_level(eb), nr,
(u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr,
(unsigned long long)btrfs_header_generation(eb),
(unsigned long long)btrfs_header_owner(eb));
- print_uuids(eb);
- fflush(stdout);
+ print_uuids(out, eb);
+ fflush(out);
size = btrfs_level_size(root, btrfs_header_level(eb) - 1);
for (i = 0; i < nr; i++) {
u64 blocknr = btrfs_node_blockptr(eb, i);
btrfs_node_key(eb, &disk_key, i);
btrfs_disk_key_to_cpu(&key, &disk_key);
- printf("\t");
- btrfs_print_key(&disk_key);
- printf(" block %llu (%llu) gen %llu\n",
+ fprintf(out, "\t");
+ btrfs_print_key(out, &disk_key);
+ fprintf(out, " block %llu (%llu) gen %llu\n",
(unsigned long long)blocknr,
(unsigned long long)blocknr / size,
(unsigned long long)btrfs_node_ptr_generation(eb, i));
- fflush(stdout);
+ fflush(out);
}
for (i = 0; i < nr; i++) {
struct extent_buffer *next = read_tree_block(root,
@@ -660,7 +660,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb)
if (btrfs_header_level(next) !=
btrfs_header_level(eb) - 1)
BUG();
- btrfs_print_tree(root, next);
+ btrfs_print_tree(out, root, next);
free_extent_buffer(next);
}
}
diff --git a/lib/print-tree.h b/lib/print-tree.h
index 4d1a01a..a7e9826 100644
--- a/lib/print-tree.h
+++ b/lib/print-tree.h
@@ -18,7 +18,9 @@
#ifndef __PRINT_TREE_
#define __PRINT_TREE_
-void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l);
-void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *t);
-void btrfs_print_key(struct btrfs_disk_key *disk_key);
+#include <stdio.h>
+
+void btrfs_print_leaf(FILE *out, struct btrfs_root *root, struct extent_buffer *l);
+void btrfs_print_tree(FILE *out, struct btrfs_root *root, struct extent_buffer *t);
+void btrfs_print_key(FILE *out, struct btrfs_disk_key *disk_key);
#endif
diff --git a/lib/root-tree.c b/lib/root-tree.c
index 782472c..e1df044 100644
--- a/lib/root-tree.c
+++ b/lib/root-tree.c
@@ -182,12 +182,11 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
if (ret < 0)
goto out;
if (ret) {
-btrfs_print_leaf(root, path->nodes[0]);
-printk("failed to del %llu %u %llu\n",
- (unsigned long long)key->objectid,
- key->type,
- (unsigned long long)key->offset);
-
+ btrfs_print_leaf(stdout, root, path->nodes[0]);
+ printk("failed to del %llu %u %llu\n",
+ (unsigned long long)key->objectid,
+ key->type,
+ (unsigned long long)key->offset);
}
BUG_ON(ret != 0);
leaf = path->nodes[0];
diff --git a/misc/debug-tree.c b/misc/debug-tree.c
index 1d47519..64f6f83 100644
--- a/misc/debug-tree.c
+++ b/misc/debug-tree.c
@@ -144,11 +144,11 @@ int main(int ac, char **av)
}
if (!extent_only) {
printf("root tree\n");
- btrfs_print_tree(root->fs_info->tree_root,
+ btrfs_print_tree(stdout, root->fs_info->tree_root,
root->fs_info->tree_root->node);
printf("chunk tree\n");
- btrfs_print_tree(root->fs_info->chunk_root,
+ btrfs_print_tree(stdout, root->fs_info->chunk_root,
root->fs_info->chunk_root->node);
}
tree_root_scan = root->fs_info->tree_root;
@@ -258,9 +258,9 @@ again:
}
if (!skip && !extent_only) {
printf(" tree ");
- btrfs_print_key(&disk_key);
+ btrfs_print_key(stdout, &disk_key);
printf(" \n");
- btrfs_print_tree(tree_root_scan, buf);
+ btrfs_print_tree(stdout, tree_root_scan, buf);
} else if (extent_only && !skip) {
print_extents(tree_root_scan, buf);
}
--
1.7.0.rc0.48.gdace5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -V2 6/6] debug-btrfs: Add print_inode command
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
` (3 preceding siblings ...)
2010-02-04 17:44 ` [PATCH -V2 5/6] debug-btrfs: Add pager support Aneesh Kumar K.V
@ 2010-02-04 17:44 ` Aneesh Kumar K.V
2010-02-04 17:48 ` Add debug-btrfs (btrfs file system debugger) Aneesh Kumar K. V
5 siblings, 0 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2010-02-04 17:44 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs, Aneesh Kumar K.V
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
debugbtrfs/cmds.c | 191 ++++++++++++++++++++++++++++++++++++++++
debugbtrfs/debug_btrfs_cmds.ct | 3 +
lib/volumes.c | 16 ----
lib/volumes.h | 12 +++
4 files changed, 206 insertions(+), 16 deletions(-)
diff --git a/debugbtrfs/cmds.c b/debugbtrfs/cmds.c
index cd2901b..55a1ed7 100644
--- a/debugbtrfs/cmds.c
+++ b/debugbtrfs/cmds.c
@@ -20,10 +20,15 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <uuid/uuid.h>
+#include <time.h>
#include "ctree.h"
#include "disk-io.h"
+#include "extent_io.h"
+#include "transaction.h"
#include "debug_btrfs.h"
+#include "volumes.h"
void do_show_debugfs_params(int argc, char *argv[])
{
@@ -48,3 +53,189 @@ void do_open_filesys(int argc, char *argv[])
return;
}
}
+
+void dump_inode_details(FILE *out, u64 ino, struct extent_buffer *leaf,
+ struct btrfs_inode_item *inode_item)
+{
+ time_t t;
+ fprintf(out, "%-7s%-20llu", "Inode:", (unsigned long long)ino);
+ fprintf(out, "Generation: %llu\n",
+ btrfs_inode_generation(leaf, inode_item));
+
+ fprintf(out, "%-7s%-5o", "Mode:",
+ btrfs_inode_mode(leaf, inode_item) & 0777);
+
+ fprintf(out, "%-7s%-10d", "User:",
+ btrfs_inode_gid(leaf, inode_item));
+ fprintf(out, "%-7s%-10d\n", "Group:",
+ btrfs_inode_uid(leaf, inode_item));
+
+ fprintf(out, "%-7s%-20llu", "Size:", (unsigned long long)
+ btrfs_inode_size(leaf, inode_item));
+ fprintf(out, "%-7s%u\n", "Link:",
+ (unsigned int)btrfs_inode_nlink(leaf, inode_item));
+
+ t = (time_t)btrfs_timespec_sec(leaf,
+ btrfs_inode_atime(inode_item));
+ fprintf(out, "atime: %s", ctime(&t));
+ t = (time_t)btrfs_timespec_sec(leaf,
+ btrfs_inode_ctime(inode_item));
+ fprintf(out, "ctime: %s", ctime(&t));
+ t = (time_t)btrfs_timespec_sec(leaf,
+ btrfs_inode_mtime(inode_item));
+ fprintf(out, "mtime: %s", ctime(&t));
+ t = (time_t)btrfs_timespec_sec(leaf,
+ btrfs_inode_otime(inode_item));
+ fprintf(out, "otime: %s", ctime(&t));
+
+ return;
+}
+
+void dump_map_type(FILE *out, struct map_lookup *map)
+{
+ u64 type = map->type;
+
+ fprintf(out, "Raid type = ");
+
+ if (type & BTRFS_BLOCK_GROUP_RAID0)
+ fprintf(out, "Raid0");
+ else if (type & BTRFS_BLOCK_GROUP_RAID1)
+ fprintf(out, "Raid1");
+ else if (type & BTRFS_BLOCK_GROUP_RAID10)
+ fprintf(out, "Raid10");
+ else if (type & BTRFS_BLOCK_GROUP_DUP)
+ fprintf(out, "Duplicated data");
+ else
+ fprintf(out, "None");
+
+ fprintf(out, "\n");
+}
+
+void dump_chunk_details(FILE *out, u64 logical, u64 length)
+{
+ int ret, i;
+ char fs_uuid[37];
+ struct cache_extent *ce;
+ struct map_lookup *map;
+ struct btrfs_multi_bio *multi = NULL;
+ struct btrfs_mapping_tree *map_tree = ¤t_fs_root->fs_info->mapping_tree;
+
+ ret = btrfs_map_block(map_tree, WRITE, logical, &length, &multi, 0);
+ if (ret) {
+ fprintf(stderr, "Error in finding the chunk details \n");
+ return;
+ }
+ fprintf(out, "Number of devices = %d\n", multi->num_stripes);
+ ce = find_first_cache_extent(&map_tree->cache_tree, logical);
+ map = container_of(ce, struct map_lookup, ce);
+ dump_map_type(out, map);
+ for (i = 0; i < multi->num_stripes; i++) {
+ uuid_unparse(multi->stripes[i].dev->uuid , fs_uuid);
+ fprintf(out, "Device uuid = %s\n", fs_uuid);
+ fprintf(out, "Device = %s Offset = %llu \n",
+ multi->stripes[i].dev->name,
+ multi->stripes[i].physical);
+
+ }
+}
+
+void dump_file_extent(FILE *out, int count, u64 offset,
+ struct extent_buffer *leaf,
+ struct btrfs_file_extent_item *file_extent_item,
+ int print_chunk_details)
+{
+ fprintf(out, "\nExtent %d\n", count);
+ fprintf(out, "Logical offset = %llu Extent size = %llu\n",
+ (unsigned long long) offset,
+ btrfs_file_extent_num_bytes(leaf, file_extent_item));
+
+ fprintf(out, "Disk bytenr = %llu Actual disk size = %llu",
+ (unsigned long long)
+ btrfs_file_extent_disk_bytenr(leaf, file_extent_item),
+ btrfs_file_extent_disk_num_bytes(leaf, file_extent_item));
+
+ if (!btrfs_file_extent_disk_bytenr(leaf, file_extent_item))
+ fprintf(out, " (Hole)");
+ fprintf(out, "\n");
+ if (print_chunk_details)
+ dump_chunk_details(out, btrfs_file_extent_disk_bytenr(leaf, file_extent_item),
+ btrfs_file_extent_disk_num_bytes(leaf, file_extent_item));
+ return ;
+}
+
+void do_print_inode(int argc, char *argv[])
+{
+ FILE *out;
+ int c;
+ int print_chunk_details = 0;
+ int ret, count = 0;
+ u64 offset, inode_i_size;
+ struct btrfs_path *path;
+ struct btrfs_key inode_key;
+ struct extent_buffer *leaf;
+ struct btrfs_trans_handle *trans;
+ struct btrfs_inode_item *inode_item;
+ struct btrfs_file_extent_item *file_extent_item;
+
+
+ reset_getopt();
+ while ((c = getopt (argc, argv, "ch")) != EOF) {
+ switch (c) {
+ case 'c':
+ print_chunk_details = 1;
+ break;
+ default:
+ fprintf(stderr, "Usage %s [-ch] inode number\n",
+ argv[0]);
+ return;
+ }
+ }
+ if (optind == argc) {
+ fprintf(stderr, "Usage %s [-ch] inode number\n",
+ argv[0]);
+ return;
+ }
+ out = open_pager();
+ inode_key.objectid = atoll(argv[optind]);
+ inode_key.type = BTRFS_INODE_ITEM_KEY;
+ inode_key.offset = 0;
+
+ path = btrfs_alloc_path();
+ btrfs_init_path(path);
+ trans = btrfs_start_transaction(current_fs_root, 1);
+
+ ret = btrfs_search_slot(trans, current_fs_root, &inode_key, path, 0, 0);
+ if (ret != 0) {
+ fprintf(stderr, "Failed get the inode details for %llu\n",
+ (unsigned long long)inode_key.objectid);
+ goto err_out;
+ }
+ leaf = path->nodes[0];
+ inode_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_inode_item);
+ dump_inode_details(out, inode_key.objectid, leaf, inode_item);
+ inode_i_size = btrfs_inode_size(leaf, inode_item);
+ btrfs_release_path(current_fs_root, path);
+
+ /* get the file extent details */
+ offset = 0;
+ while (offset < inode_i_size) {
+ ret = btrfs_lookup_file_extent(trans, current_fs_root, path,
+ inode_key.objectid, offset, 0);
+ if (ret != 0) {
+ fprintf(stderr, "Not able to retrive extent information\n");
+ break;
+ }
+ leaf = path->nodes[0];
+ file_extent_item = btrfs_item_ptr(leaf, path->slots[0],
+ struct btrfs_file_extent_item);
+ dump_file_extent(out, count, offset,
+ leaf, file_extent_item, print_chunk_details);
+ offset += btrfs_file_extent_num_bytes(leaf, file_extent_item);
+ btrfs_release_path(current_fs_root, path);
+ count++;
+ }
+err_out:
+ btrfs_free_path(path);
+ btrfs_commit_transaction(trans, current_fs_root);
+ close_pager(out);
+}
diff --git a/debugbtrfs/debug_btrfs_cmds.ct b/debugbtrfs/debug_btrfs_cmds.ct
index cd40cf4..e6c5801 100644
--- a/debugbtrfs/debug_btrfs_cmds.ct
+++ b/debugbtrfs/debug_btrfs_cmds.ct
@@ -47,5 +47,8 @@ request do_dump_csum_tree, "Show btrfs checksum tree",
request do_dump_log_tree, "Show btrfs log tree",
dump_log_tree;
+request do_print_inode, "Print inode details",
+ print_inode;
+
end;
diff --git a/lib/volumes.c b/lib/volumes.c
index 7671855..08b75bb 100644
--- a/lib/volumes.c
+++ b/lib/volumes.c
@@ -30,22 +30,6 @@
#include "print-tree.h"
#include "volumes.h"
-struct stripe {
- struct btrfs_device *dev;
- u64 physical;
-};
-
-struct map_lookup {
- struct cache_extent ce;
- u64 type;
- int io_align;
- int io_width;
- int stripe_len;
- int sector_size;
- int num_stripes;
- int sub_stripes;
- struct btrfs_bio_stripe stripes[];
-};
#define map_lookup_size(n) (sizeof(struct map_lookup) + \
(sizeof(struct btrfs_bio_stripe) * (n)))
diff --git a/lib/volumes.h b/lib/volumes.h
index bb78751..4c35b7a 100644
--- a/lib/volumes.h
+++ b/lib/volumes.h
@@ -88,6 +88,18 @@ struct btrfs_multi_bio {
struct btrfs_bio_stripe stripes[];
};
+struct map_lookup {
+ struct cache_extent ce;
+ u64 type;
+ int io_align;
+ int io_width;
+ int stripe_len;
+ int sector_size;
+ int num_stripes;
+ int sub_stripes;
+ struct btrfs_bio_stripe stripes[];
+};
+
#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
(sizeof(struct btrfs_bio_stripe) * (n)))
--
1.7.0.rc0.48.gdace5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Add debug-btrfs (btrfs file system debugger)
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
` (4 preceding siblings ...)
2010-02-04 17:44 ` [PATCH -V2 6/6] debug-btrfs: Add print_inode command Aneesh Kumar K.V
@ 2010-02-04 17:48 ` Aneesh Kumar K. V
5 siblings, 0 replies; 7+ messages in thread
From: Aneesh Kumar K. V @ 2010-02-04 17:48 UTC (permalink / raw)
To: chris.mason; +Cc: linux-btrfs
Hi Chris,
This is the -V2 version of the patch. I have cleaned up the
patches and added -c option to print_inode to print the
chunk mapping details. I guess they are ready to be merged
Patches can also be found at
http://www.kernel.org/pub/linux/kernel/people/kvaneesh/debug-btrfs/
-aneesh
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-02-04 17:48 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-04 17:44 [PATCH -V2 1/6] btrfs-progs: Move files around Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 2/6] btrfs-progs: Add debug-btrfs command Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 3/6] debug-btrfs: Add open file system command Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 4/6] debug-btrfs: Add command to dump each of the btrfs trees Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 5/6] debug-btrfs: Add pager support Aneesh Kumar K.V
2010-02-04 17:44 ` [PATCH -V2 6/6] debug-btrfs: Add print_inode command Aneesh Kumar K.V
2010-02-04 17:48 ` Add debug-btrfs (btrfs file system debugger) Aneesh Kumar K. V
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).