diff --git a/CREDITS b/CREDITS
index 8e47774..f396a2d 100644
--- a/CREDITS
+++ b/CREDITS
@@ -45,11 +45,11 @@
 project in many little ways.
 
 Vitaly Fertman wrote  fsck for V3 and  maintains the reiserfsprogs package now.
-He wrote librepair,  userspace plugins repair code, fsck for V4,  and worked on
-developing libreiser4 and userspace plugins with Umka.
+He worked on libreiser4 and userspace plugins; developped librepair, userspace 
+plugins repair code, fsck & debugfs for V4.
 
 Yury Umanets  (aka Umka)  developed  libreiser4,  userspace  plugins,  and  all
-userspace tools (reiser4progs) except of fsck.
+userspace tools (reiser4progs) except of fsck & debugfs.
 
 Joshua Macdonald wrote the first draft of the transaction manager. Yuri Rupasov
 did testing  and benchmarking,  plus he invented the r5 hash  (also used by the
@@ -79,10 +79,6 @@
 V3 maintenance. Reiserfs integration in their distro is consistently solid, and
 they were key to our becoming widely used.
 
-Lycos Europe  (www.lycos-europe.com)  had  a  support  contract  with  us  that
-consistently came in just when we would otherwise have missed payroll, and that
-they kept doubling every year. Much thanks to them.
-
 Many persons came to www.namesys.com/support.html,  and got a question answered
 for $25, or just gave us a small donation there.
 
diff --git a/INSTALL b/INSTALL
index b42a17a..1cdbbeb 100644
--- a/INSTALL
+++ b/INSTALL
@@ -85,7 +85,7 @@
 ==================
 
    By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+`/usr/local/sbin', `/usr/local/man', etc.  You can specify an
 installation prefix other than `/usr/local' by giving `configure' the
 option `--prefix=PATH'.
 
diff --git a/Makefile.am b/Makefile.am
index bcb518d..48a28d6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,8 +1,18 @@
-SUBDIRS = include lib reiserfscore fsck debugreiserfs resize_reiserfs mkreiserfs tune
+SUBDIRS		= include libmisc libreiserfs libutil utils
 
-noinst_DATA = reiserfsprogs.spec
+EXTRA_DIST	= AUTHORS COPYING NEWS README CREDITS \
+		  reiserfsprogs.spec reiserfsprogs.spec.in depcomp
+#		  libreiserfs.m4
 
-EXTRA_DIST = CREDITS version.h
+aclocaldir 	= $(datadir)/aclocal
+#aclocal_DATA	= libreiserfs.m4
 
-dist-hook:
-	cp -f reiserfsprogs.spec $(distdir)
+define all-sources
+	( find ./ -name '*.[ch]' | grep -v SCCS | grep -v "Attic" | grep -v "reiserfsprogs" )
+endef
+
+TAGS:
+	$(all-sources) | etags -
+
+tags:
+	$(all-sources) | xargs -- ctags -w -o TAGS
diff --git a/Makefile.in b/Makefile.in
index 5b4b0f1..f430cca 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -13,7 +13,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
 VPATH = @srcdir@
@@ -21,7 +20,6 @@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 top_builddir = .
-
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
@@ -35,7 +33,45 @@
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
+build_triplet = @build@
 host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(srcdir)/reiserfsprogs.spec.in $(top_srcdir)/configure \
+	AUTHORS COPYING ChangeLog INSTALL NEWS compile config.guess \
+	config.sub depcomp install-sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = reiserfsprogs.spec
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
 AMDEP_FALSE = @AMDEP_FALSE@
 AMDEP_TRUE = @AMDEP_TRUE@
@@ -78,6 +114,7 @@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
 RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -92,6 +129,8 @@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
 bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
@@ -112,6 +151,7 @@
 libexecdir = @libexecdir@
 localstatedir = @localstatedir@
 mandir = @mandir@
+mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
@@ -119,48 +159,68 @@
 sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
-SUBDIRS = include lib reiserfscore fsck debugreiserfs resize_reiserfs mkreiserfs tune
+SUBDIRS = include libmisc libreiserfs libutil utils
+EXTRA_DIST = AUTHORS COPYING NEWS README CREDITS \
+		  reiserfsprogs.spec reiserfsprogs.spec.in depcomp
 
-noinst_DATA = reiserfsprogs.spec
-
-EXTRA_DIST = CREDITS version.h
-subdir = .
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-DATA = $(noinst_DATA)
-
-
-RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
-	ps-recursive install-info-recursive uninstall-info-recursive \
-	all-recursive install-data-recursive install-exec-recursive \
-	installdirs-recursive install-recursive uninstall-recursive \
-	check-recursive installcheck-recursive
-DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
-	Makefile.in NEWS aclocal.m4 config.guess config.sub configure \
-	configure.in depcomp install-sh missing mkinstalldirs
-DIST_SUBDIRS = $(SUBDIRS)
-all: all-recursive
+#		  libreiserfs.m4
+aclocaldir = $(datadir)/aclocal
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
-
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+am--refresh:
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
 	cd $(top_srcdir) && \
 	  $(AUTOMAKE) --gnu  Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
 
-$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	$(SHELL) ./config.status --recheck
-$(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
-	cd $(srcdir) && $(AUTOCONF)
 
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in 
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+	cd $(top_srcdir) && $(AUTOHEADER)
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+reiserfsprogs.spec: $(top_builddir)/config.status $(srcdir)/reiserfsprogs.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
 uninstall-info-am:
 
 # This directory's subdirectories are mostly independent; you can cd
@@ -170,7 +230,13 @@
 #     (which will cause the Makefiles to be regenerated when you run `make');
 # (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
-	@set fnord $$MAKEFLAGS; amf=$$2; \
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
 	dot_seen=no; \
 	target=`echo $@ | sed s/-recursive//`; \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
@@ -182,7 +248,7 @@
 	    local_target="$$target"; \
 	  fi; \
 	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
@@ -190,7 +256,13 @@
 
 mostlyclean-recursive clean-recursive distclean-recursive \
 maintainer-clean-recursive:
-	@set fnord $$MAKEFLAGS; amf=$$2; \
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
 	dot_seen=no; \
 	case "$@" in \
 	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
@@ -211,7 +283,7 @@
 	    local_target="$$target"; \
 	  fi; \
 	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
@@ -222,14 +294,6 @@
 	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -238,38 +302,12 @@
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
 	mkid -fID $$unique
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if (etags --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	else \
-	  include_option=--include; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -f $$subdir/TAGS && \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
 ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
 	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
@@ -286,23 +324,11 @@
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = .
-distdir = $(PACKAGE)-$(VERSION)
-
-am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
-
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
 	mkdir $(distdir)
+	$(mkdir_p) $(distdir)/.
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
 	list='$(DISTFILES)'; for file in $$list; do \
@@ -314,7 +340,7 @@
 	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
 	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
 	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
 	  else \
 	    dir=''; \
 	  fi; \
@@ -329,41 +355,67 @@
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(SUBDIRS)'; for subdir in $$list; do \
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
-	    test -d $(distdir)/$$subdir \
-	    || mkdir $(distdir)/$$subdir \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
 	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
 	    (cd $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$(top_distdir)" \
-	        distdir=../$(distdir)/$$subdir \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
 	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-hook
 	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
 	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r $(distdir)
 dist-gzip: distdir
-	$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
 	$(am__remove_distdir)
 
 dist dist-all: distdir
-	$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
 	$(am__remove_distdir)
 
 # This target untars the dist file and tries a VPATH configuration.  Then
 # it guarantees that the distribution is self-contained by making another
 # tarfile.
 distcheck: dist
-	$(am__remove_distdir)
-	GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
 	chmod -R a-w $(distdir); chmod a+w $(distdir)
 	mkdir $(distdir)/_build
 	mkdir $(distdir)/_inst
@@ -383,19 +435,20 @@
 	        distuninstallcheck \
 	  && chmod -R a-w "$$dc_install_base" \
 	  && ({ \
-	       (cd ../.. && $(mkinstalldirs) "$$dc_destdir") \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
 	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
 	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
 	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
 	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
 	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
 	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \
-	  && rm -f $(distdir).tar.gz \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
 	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
 	$(am__remove_distdir)
-	@echo "$(distdir).tar.gz is ready for distribution" | \
-	  sed 'h;s/./=/g;p;x;p;x'
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
 distuninstallcheck:
 	@cd $(distuninstallcheck_dir) \
 	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
@@ -416,10 +469,9 @@
 	       exit 1; } >&2
 check-am: all-am
 check: check-recursive
-all-am: Makefile $(DATA)
+all-am: Makefile config.h
 installdirs: installdirs-recursive
 installdirs-am:
-
 install: install-recursive
 install-exec: install-exec-recursive
 install-data: install-data-recursive
@@ -431,7 +483,7 @@
 installcheck: installcheck-recursive
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 	  `test -z '$(STRIP)' || \
 	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 mostlyclean-generic:
@@ -439,7 +491,7 @@
 clean-generic:
 
 distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -450,12 +502,15 @@
 
 distclean: distclean-recursive
 	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-distclean-am: clean-am distclean-generic distclean-tags
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
 
 dvi: dvi-recursive
 
 dvi-am:
 
+html: html-recursive
+
 info: info-recursive
 
 info-am:
@@ -473,6 +528,7 @@
 maintainer-clean: maintainer-clean-recursive
 	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
 	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
 mostlyclean: mostlyclean-recursive
@@ -491,26 +547,32 @@
 
 uninstall-info: uninstall-info-recursive
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
-	clean-generic clean-recursive ctags ctags-recursive dist \
-	dist-all dist-gzip distcheck distclean distclean-generic \
-	distclean-recursive distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am dvi-recursive info info-am \
-	info-recursive install install-am install-data install-data-am \
-	install-data-recursive install-exec install-exec-am \
-	install-exec-recursive install-info install-info-am \
-	install-info-recursive install-man install-recursive \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am installdirs-recursive maintainer-clean \
-	maintainer-clean-generic maintainer-clean-recursive mostlyclean \
-	mostlyclean-generic mostlyclean-recursive pdf pdf-am \
-	pdf-recursive ps ps-am ps-recursive tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am \
-	uninstall-info-recursive uninstall-recursive
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+	check-am clean clean-generic clean-recursive ctags \
+	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+	dist-tarZ dist-zip distcheck distclean distclean-generic \
+	distclean-hdr distclean-recursive distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic maintainer-clean-recursive \
+	mostlyclean mostlyclean-generic mostlyclean-recursive pdf \
+	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-info-am
 
+#aclocal_DATA	= libreiserfs.m4
 
-dist-hook:
-	cp -f reiserfsprogs.spec $(distdir)
+define all-sources
+	( find ./ -name '*.[ch]' | grep -v SCCS | grep -v "Attic" | grep -v "reiserfsprogs" )
+endef
+
+TAGS:
+	$(all-sources) | etags -
+
+tags:
+	$(all-sources) | xargs -- ctags -w -o TAGS
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/aclocal.m4 b/aclocal.m4
index 6a91c51..cd564ba 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.7.6 -*- Autoconf -*-
+# generated automatically by aclocal 1.9.5 -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -11,332 +11,6063 @@
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
-# Do all the work for Automake.                            -*- Autoconf -*-
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 
-# This macro actually does too much some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
+# serial 47 AC_PROG_LIBTOOL
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+         [],
+         [m4_define([AC_PROVIDE_IFELSE],
+	         [m4_ifdef([AC_PROVIDE_$1],
+		           [$2], [$3])])])
 
-# 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
-# 02111-1307, USA.
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+  AC_PROVIDE_IFELSE([AC_PROG_CXX],
+    [AC_LIBTOOL_CXX],
+    [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+  ])])
+dnl And a similar setup for Fortran 77 support
+  AC_PROVIDE_IFELSE([AC_PROG_F77],
+    [AC_LIBTOOL_F77],
+    [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
 
-# serial 10
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+  AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+    [AC_LIBTOOL_GCJ],
+    [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+      [AC_LIBTOOL_GCJ],
+      [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+	[AC_LIBTOOL_GCJ],
+      [ifdef([AC_PROG_GCJ],
+	     [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+       ifdef([A][M_PROG_GCJ],
+	     [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+       ifdef([LT_AC_PROG_GCJ],
+	     [define([LT_AC_PROG_GCJ],
+		defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
 
-AC_PREREQ([2.54])
 
-# Autoconf 2.50 wants to disallow AM_ names.  We explicitly allow
-# the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
 
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
- AC_REQUIRE([AC_PROG_INSTALL])dnl
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+    ;;
+  *)
+    old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
 fi
 
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    AC_PATH_MAGIC
+  fi
+  ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+    [AC_HELP_STRING([--disable-libtool-lock],
+	[avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+    [AC_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+[$]*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    IFS="$lt_save_ifs"
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "[$]0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
   fi
 fi
-AC_SUBST([CYGPATH_W])
+fi
 
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
 
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
 
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AM_MISSING_PROG(AMTAR, tar)
-AM_PROG_INSTALL_SH
-AM_PROG_INSTALL_STRIP
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-                  [_AM_DEPENDENCIES(CC)],
-                  [define([AC_PROG_CC],
-                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                  [_AM_DEPENDENCIES(CXX)],
-                  [define([AC_PROG_CXX],
-                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-])
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+    [AC_HELP_STRING([--disable-libtool-lock],
+	[avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *ELF-32*)
+      HPUX_IA64_MODE="32"
+      ;;
+    *ELF-64*)
+      HPUX_IA64_MODE="64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+   if test "$lt_cv_prog_gnu_ld" = yes; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -melf32bsmip"
+      ;;
+    *N32*)
+      LD="${LD-ld} -melf32bmipn32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -melf64bmip"
+      ;;
+    esac
+   else
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+   fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case "`/usr/bin/file conftest.o`" in
+    *32-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_i386"
+          ;;
+        ppc64-*linux*|powerpc64-*linux*)
+          LD="${LD-ld} -m elf32ppclinux"
+          ;;
+        s390x-*linux*)
+          LD="${LD-ld} -m elf_s390"
+          ;;
+        sparc64-*linux*)
+          LD="${LD-ld} -m elf32_sparc"
+          ;;
+      esac
+      ;;
+    *64-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        ppc*-*linux*|powerpc*-*linux*)
+          LD="${LD-ld} -m elf64ppc"
+          ;;
+        s390*-*linux*)
+          LD="${LD-ld} -m elf64_s390"
+          ;;
+        sparc*-*linux*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+  ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+  ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test ! -s conftest.err; then
+       $2=yes
+     fi
+   fi
+   $rm conftest*
 ])
 
+if test x"[$]$2" = xyes; then
+    ifelse([$5], , :, [$5])
+else
+    ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
 
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
 
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $1 | $1:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                          [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+     else
+       $2=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    ifelse([$4], , :, [$4])
+else
+    ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536 # usable default for *BSD
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    ;;
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    # 
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  *)
+    # If test is not a shell built-in, we'll probably end up computing a
+    # maximum length that is only half of the actual maximum length, but
+    # we can't tell.
+    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+    while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+	       = "XX$teststring") >/dev/null 2>&1 &&
+	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
+	    lt_cv_sys_max_cmd_len=$new_result &&
+	    test $i != 17 # 1/2 MB should be enough
+    do
+      i=`expr $i + 1`
+      teststring=$teststring$teststring
+    done
+    teststring=
+    # Add a significant safety factor because C++ compilers can tack on massive
+    # amounts of additional arguments before passing them to the linker.
+    # It appears as though 1/2 is a usable value.
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    ;;
   esac
-done
-echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
 
-# Copyright 2002  Free Software Foundation, Inc.
 
+# _LT_AC_CHECK_DLFCN
+# --------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}]
+EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_unknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# -------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+   ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+   ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      LDFLAGS="$LDFLAGS $link_static_flag"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+    	  lt_cv_dlopen_self_static, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test ! -s out/conftest.err; then
+       _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w .
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+   test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+   test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_AC_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+   darwin*)
+       if test -n "$STRIP" ; then
+         striplib="$STRIP -x"
+         AC_MSG_RESULT([yes])
+       else
+  AC_MSG_RESULT([no])
+fi
+       ;;
+   *)
+  AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  *) # from 3.2 on
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case "$host_cpu" in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+    [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+        [include additional configurations @<:@automatic@:>@])],
+    [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+  if test ! -f "${ofile}"; then
+    AC_MSG_WARN([output file `$ofile' does not exist])
+  fi
+
+  if test -z "$LTCC"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+    if test -z "$LTCC"; then
+      AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+    else
+      AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+    fi
+  fi
+
+  # Extract list of available tagged configurations in $ofile.
+  # Note that this assumes the entire list is on one line.
+  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+  for tagname in $tagnames; do
+    IFS="$lt_save_ifs"
+    # Check whether tagname contains only valid characters
+    case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+    "") ;;
+    *)  AC_MSG_ERROR([invalid tag name: $tagname])
+	;;
+    esac
+
+    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+    then
+      AC_MSG_ERROR([tag name \"$tagname\" already exists])
+    fi
+
+    # Update the list of available tags.
+    if test -n "$tagname"; then
+      echo appending configuration tag \"$tagname\" to $ofile
+
+      case $tagname in
+      CXX)
+	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+	    (test "X$CXX" != "Xg++"))) ; then
+	  AC_LIBTOOL_LANG_CXX_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      F77)
+	if test -n "$F77" && test "X$F77" != "Xno"; then
+	  AC_LIBTOOL_LANG_F77_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      GCJ)
+	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+	  AC_LIBTOOL_LANG_GCJ_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      RC)
+	AC_LIBTOOL_LANG_RC_CONFIG
+	;;
+
+      *)
+	AC_MSG_ERROR([Unsupported tag name: $tagname])
+	;;
+      esac
+
+      # Append the new tag name to the list of available tags.
+      if test -n "$tagname" ; then
+      available_tags="$available_tags $tagname"
+    fi
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  # Now substitute the updated list of available tags.
+  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+    mv "${ofile}T" "$ofile"
+    chmod +x "$ofile"
+  else
+    rm -f "${ofile}T"
+    AC_MSG_ERROR([unable to update list of available tagged configurations.])
+  fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 dll's
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+    [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+#- set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+    [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+    [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+   [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="ifelse([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+    [AC_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case "$host_cpu" in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+nto-qnx*)
+  lt_cv_deplibs_check_method=unknown
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    tmp_nm="$ac_dir/${ac_tool_prefix}nm"
+    if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      # Tru64's nm complains that /dev/null is an invalid object file
+      case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+      */dev/null* | *'Invalid file or object type'*)
+	lt_cv_path_NM="$tmp_nm -B"
+	break
+        ;;
+      *)
+	case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	*/dev/null*)
+	  lt_cv_path_NM="$tmp_nm -p"
+	  break
+	  ;;
+	*)
+	  lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	  continue # so that we can try to find one that supports BSD flags
+	  ;;
+	esac
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments.  Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If
+# DIRECTORY is not provided, it is assumed to be `libltdl'.  LIBLTDL will
+# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!).  If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  case $enable_ltdl_convenience in
+  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+  "") enable_ltdl_convenience=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+  esac
+  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments.  Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If
+# DIRECTORY is not provided and an installed libltdl is not found, it is
+# assumed to be `libltdl'.  LIBLTDL will be prefixed with '${top_builddir}/'
+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
+# quotes!).  If your package is not flat and you're not using automake,
+# define top_builddir and top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  AC_CHECK_LIB(ltdl, lt_dlinit,
+  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+  [if test x"$enable_ltdl_install" = xno; then
+     AC_MSG_WARN([libltdl not installed, but installation disabled])
+   else
+     enable_ltdl_install=yes
+   fi
+  ])
+  if test x"$enable_ltdl_install" = x"yes"; then
+    ac_configure_args="$ac_configure_args --enable-ltdl-install"
+    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  else
+    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+    LIBLTDL="-lltdl"
+    LTDLINCL=
+  fi
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ---------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+    [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+      [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+	 [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+	   [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# --------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+#
+# Check for any special shared library compilation flags.
+#
+_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)=
+if test "$GCC" = no; then
+  case $host_os in
+  sco3.2v5*)
+    _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf'
+    ;;
+  esac
+fi
+if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then
+  AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries])
+  if echo "$old_CC $old_CFLAGS " | grep "[[ 	]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ 	]]" >/dev/null; then :
+  else
+    AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure])
+    _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no
+  fi
+fi
+
+
+#
+# Check to make sure the static flag actually works.
+#
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works],
+  _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+  $_LT_AC_TAGVAR(lt_prog_compiler_static, $1),
+  [],
+  [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+# Report which librarie types wil actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+    ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cc
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+  unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+  lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+  unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+  # Set up default GNU C++ configuration
+
+  AC_PROG_LD
+
+  # Check if GNU C++ uses GNU ld as the underlying linker, since the
+  # archiving commands below assume that GNU ld is being used.
+  if test "$with_gnu_ld" = yes; then
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+    #     investigate it a little bit more. (MM)
+    wlarc='${wl}'
+
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+	grep 'no-whole-archive' > /dev/null; then
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    with_gnu_ld=no
+    wlarc=
+
+    # A generic and very simple default shared library creation
+    # command for GNU C++ for the case where it uses the native
+    # linker, instead of GNU ld.  If possible, this setting should
+    # overridden to take advantage of the native linker features on
+    # the platform it is being used on.
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+  fi
+
+  # Commands to make compiler produce verbose output that lists
+  # what "hidden" libraries, object files and flags are used when
+  # linking a shared library.
+  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+  GXX=no
+  with_gnu_ld=no
+  wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+  aix3*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  case $ld_flag in
+	  *-brtl*)
+	    aix_use_runtimelinking=yes
+	    break
+	    ;;
+	  esac
+	done
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    _LT_AC_TAGVAR(archive_cmds, $1)=''
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+    if test "$GXX" = yes; then
+      case $host_os in aix4.[[012]]|aix4.[[012]].*)
+      # We only want to do this on AIX 4.2 and lower, the check
+      # below for broken collect2 doesn't work under 4.3+
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	else
+	  # We have old collect2
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+	fi
+      esac
+      shared_flag='-shared'
+      if test "$aix_use_runtimelinking" = yes; then
+	shared_flag="$shared_flag "'${wl}-G'
+      fi
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	shared_flag='-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall does not export symbols beginning with
+    # underscore (_), so it is better to generate a list of symbols to export.
+    _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+      # Determine the default libpath from the value encoded in an empty executable.
+      _LT_AC_SYS_LIBPATH_AIX
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+     else
+      if test "$host_cpu" = ia64; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+      else
+	# Determine the default libpath from the value encoded in an empty executable.
+	_LT_AC_SYS_LIBPATH_AIX
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	# -bexpall does not export symbols beginning with underscore (_)
+	_LT_AC_TAGVAR(always_export_symbols, $1)=yes
+	# Exported symbols can be pulled into shared objects from archives
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' '
+	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+	# This is similar to how AIX traditionally builds it's shared libraries.
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+      fi
+    fi
+    ;;
+  chorus*)
+    case $cc_basename in
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+
+
+  cygwin* | mingw* | pw32*)
+    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+    # as there is no search path for DLLs.
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+    _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+    _LT_AC_TAGVAR(always_export_symbols, $1)=no
+    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+      # If the export-symbols file already is a .def file (1st line
+      # is EXPORTS), use it as is; otherwise, prepend...
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname.def;
+      else
+	echo EXPORTS > $output_objdir/$soname.def;
+	cat $export_symbols >> $output_objdir/$soname.def;
+      fi~
+      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+    else
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    fi
+  ;;
+      darwin* | rhapsody*)
+        case "$host_os" in
+        rhapsody* | darwin1.[[012]])
+         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[[012]])
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+        esac
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+    if test "$GXX" = yes ; then
+      lt_int_apple_cc_single_mod=no
+      output_verbose_link_cmd='echo'
+      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+       lt_int_apple_cc_single_mod=yes
+      fi
+      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+       _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      else
+          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+        fi
+        _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          else
+            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          fi
+            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      else
+      case "$cc_basename" in
+        xlc*)
+         output_verbose_link_cmd='echo'
+          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+          _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         _LT_AC_TAGVAR(ld_shlibs, $1)=no
+          ;;
+      esac
+      fi
+        ;;
+
+  dgux*)
+    case $cc_basename in
+      ec++)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      ghcx)
+	# Green Hills C++ Compiler
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  freebsd[[12]]*)
+    # C++ shared libraries reported to be fairly broken before switch to ELF
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  freebsd-elf*)
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    ;;
+  freebsd* | kfreebsd*-gnu | dragonfly*)
+    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+    # conventions
+    _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+    ;;
+  gnu*)
+    ;;
+  hpux9*)
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				# but as the default
+				# location of the library.
+
+    case $cc_basename in
+    CC)
+      # FIXME: insert proper C++ library support
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    aCC)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      #
+      # There doesn't appear to be a way to prevent this compiler from
+      # explicitly linking system object files so we need to strip them
+      # from the output so that they don't get included in the library
+      # dependencies.
+      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      ;;
+    *)
+      if test "$GXX" = yes; then
+        _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+        # FIXME: insert proper C++ library support
+        _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+    ;;
+  hpux10*|hpux11*)
+    if test $with_gnu_ld = no; then
+      case "$host_cpu" in
+      hppa*64*)
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+        ;;
+      ia64*)
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        ;;
+      *)
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        ;;
+      esac
+    fi
+    case "$host_cpu" in
+    hppa*64*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+    ia64*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    *)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    esac
+
+    case $cc_basename in
+      CC)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      aCC)
+	case "$host_cpu" in
+	hppa*64*|ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	esac
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test $with_gnu_ld = no; then
+	    case "$host_cpu" in
+	    ia64*|hppa*64*)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+	      ;;
+	    *)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    esac
+	  fi
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  irix5* | irix6*)
+    case $cc_basename in
+      CC)
+	# SGI C++
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+	# Archives containing C++ object files must be created using
+	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test "$with_gnu_ld" = no; then
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+	  else
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+	  fi
+	fi
+	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+	;;
+    esac
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+    ;;
+  linux*)
+    case $cc_basename in
+      KCC)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	;;
+      icpc)
+	# Intel C++
+	with_gnu_ld=yes
+	# version 8.0 and above of icpc choke on multiply defined symbols
+	# if we add $predep_objects and $postdep_objects, however 7.1 and
+	# earlier do not add the objects themselves.
+	case `$CC -V 2>&1` in
+	*"Version 7."*)
+  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	*)  # Version 8.0 or newer
+	  tmp_idyn=
+	  case $host_cpu in
+	    ia64*) tmp_idyn=' -i_dynamic';;
+	  esac
+  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	esac
+	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	;;
+      pgCC)
+        # Portland Group C++ compiler
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+        ;;
+      cxx)
+	# Compaq C++
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	runpath_var=LD_RUN_PATH
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+    esac
+    ;;
+  lynxos*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  m88k*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  mvs*)
+    case $cc_basename in
+      cxx)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+      wlarc=
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    fi
+    # Workaround some broken pre-1.5 toolchains
+    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+    ;;
+  openbsd2*)
+    # C++ shared libraries are fairly broken
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  openbsd*)
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    fi
+    output_verbose_link_cmd='echo'
+    ;;
+  osf3*)
+    case $cc_basename in
+      KCC)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+	;;
+      RCC)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      cxx)
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  osf4* | osf5*)
+    case $cc_basename in
+      KCC)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Archives containing C++ object files must be created using
+	# the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+	;;
+      RCC)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      cxx)
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	  echo "-hidden">> $lib.exp~
+	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry $objdir/so_locations -o $lib~
+	  $rm $lib.exp'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	 _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  psos*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  sco*)
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    case $cc_basename in
+      CC)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  sunos4*)
+    case $cc_basename in
+      CC)
+	# Sun C++ 4.x
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      lcc)
+	# Lucid
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  solaris*)
+    case $cc_basename in
+      CC)
+	# Sun C++ 4.2, 5.x and Centerline C++
+	_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	$CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	case $host_os in
+	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	  *)
+	    # The C++ compiler is used as linker so we must use $wl
+	    # flag to pass the commands to the underlying system
+	    # linker.
+	    # Supported since Solaris 2.6 (maybe 2.5.1?)
+	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	    ;;
+	esac
+	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	# Archives containing C++ object files must be created using
+	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	;;
+      gcx)
+	# Green Hills C++ Compiler
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	# The C++ compiler must be used to create the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	;;
+      *)
+	# GNU C++ compiler with Solaris linker
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	  if $CC --version | grep -v '^2\.7' > /dev/null; then
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  else
+	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	    # platform.
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  fi
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	fi
+	;;
+    esac
+    ;;
+  sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*)
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    ;;
+  tandem*)
+    case $cc_basename in
+      NCC)
+	# NonStop-UX NCC 3.20
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  vxworks*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  *)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  # The `*' in the case matches for architectures that use `case' in
+  # $output_verbose_cmd can trigger glob expansion during the loop
+  # eval without this substitution.
+  output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`"
+
+  for p in `eval $output_verbose_link_cmd`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" \
+	  || test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+	   _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+	   _LT_AC_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+	   _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="      program t\n      end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+aix4* | aix5*)
+  test "$enable_shared" = yes && enable_static=no
+  ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars.  Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS AS EGREP RANLIB LN_S LTCC NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    _LT_AC_TAGVAR(compiler, $1) \
+    _LT_AC_TAGVAR(CC, $1) \
+    _LT_AC_TAGVAR(LD, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+    _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+    _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+    _LT_AC_TAGVAR(old_archive_cmds, $1) \
+    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+    _LT_AC_TAGVAR(predep_objects, $1) \
+    _LT_AC_TAGVAR(postdep_objects, $1) \
+    _LT_AC_TAGVAR(predeps, $1) \
+    _LT_AC_TAGVAR(postdeps, $1) \
+    _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+    _LT_AC_TAGVAR(archive_cmds, $1) \
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+    _LT_AC_TAGVAR(postinstall_cmds, $1) \
+    _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+    _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+    _LT_AC_TAGVAR(no_undefined_flag, $1) \
+    _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+    _LT_AC_TAGVAR(hardcode_automatic, $1) \
+    _LT_AC_TAGVAR(module_cmds, $1) \
+    _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+    _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+    _LT_AC_TAGVAR(exclude_expsyms, $1) \
+    _LT_AC_TAGVAR(include_expsyms, $1); do
+
+    case $var in
+    _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+    _LT_AC_TAGVAR(archive_cmds, $1) | \
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(module_cmds, $1) | \
+    _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+    _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\[$]0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+    ;;
+  esac
+
+ifelse([$1], [],
+  [cfgfile="${ofile}T"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  $rm -f "$cfgfile"
+  AC_MSG_NOTICE([creating $ofile])],
+  [cfgfile="$ofile"])
+
+  cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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.
-
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS=$lt_AS
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" || \
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+])
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+linux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDGIRSTW]]'
+    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris* | sysv5*)
+  symcode='[[BDRT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if grep ' nm_test_var$' "$nlist" >/dev/null; then
+	if grep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | os2* | pw32*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case "$host_cpu" in
+      hppa*64*|ia64*)
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix4* | aix5*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68)
+	  # Green Hills C++ Compiler
+	  # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+       darwin*)
+         # PIC is the default on this platform
+         # Common symbols not allowed in MH_DYLIB files
+         case "$cc_basename" in
+           xlc*)
+           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           ;;
+         esac
+       ;;
+      dgux*)
+	case $cc_basename in
+	  ec++)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx)
+	    # Green Hills C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | kfreebsd*-gnu | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+	    if test "$host_cpu" != ia64; then
+	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+	    case "$host_cpu" in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux*)
+	case $cc_basename in
+	  KCC)
+	    # KAI C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  icpc* | ecpc*)
+	    # Intel C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC)
+	    # Portland Group C++ compiler.
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  cxx)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC)
+	    # Rational C++ 2.4.1
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx)
+	    # Digital/Compaq C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      sco*)
+	case $cc_basename in
+	  CC)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx)
+	    # Green Hills C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC)
+	    # Sun C++ 4.x
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc)
+	    # Lucid
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC)
+	    # NonStop-UX NCC 3.20
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      unixware*)
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case "$host_cpu" in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case "$cc_basename" in
+         xlc*)
+         _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+         _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case "$host_cpu" in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    newsos6)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      pgcc | pgf77 | pgf90)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      ccc*)
+        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    sco3.2v5*)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn'
+      ;;
+
+    solaris*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sunos4*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    unicos*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+    _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+    [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case "$host_os" in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix4* | aix5*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw*)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+],[
+  runpath_var=
+  _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_AC_TAGVAR(archive_cmds, $1)=
+  _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+  _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+  _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+  _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+  _LT_AC_TAGVAR(module_cmds, $1)=
+  _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+  _LT_AC_TAGVAR(always_export_symbols, $1)=no
+  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_AC_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(always_export_symbols, $1)=no
+      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000  ${wl}--out-implib,$lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris* | sysv5*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sunos4*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+  linux*)
+    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+      tmp_addflag=
+      case $CC,$host_cpu in
+      pgf77* | pgf90* )			# Portland Group f77 and f90 compilers
+        tmp_addflag=' -fpic' ;;
+      ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+        tmp_addflag=' -i_dynamic' ;;
+      efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+        tmp_addflag=' -i_dynamic -nofor_main' ;;
+      ifc* | ifort*)			# Intel Fortran compiler
+      	tmp_addflag=' -nofor_main' ;;
+      esac
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      supports_anon_versioning=no
+      case `$LD -v 2>/dev/null` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+        *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+        *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+        *\ 2.11.*) ;; # other 2.11 versions
+        *) supports_anon_versioning=yes ;;
+      esac
+      if test $supports_anon_versioning = yes; then
+        _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+$echo "local: *; };" >> $output_objdir/$libname.ver~
+        $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+      else
+        _LT_AC_TAGVAR(archive_expsym_cmds, $1)=$_LT_AC_TAGVAR(archive_cmds, $1)
+      fi
+    else
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    fi
+    ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then
+      runpath_var=LD_RUN_PATH
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ 	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+      fi
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$link_static_flag"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_AC_TAGVAR(archive_cmds, $1)=''
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	  else
+  	  # We have old collect2
+  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+  	if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+  	fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       _LT_AC_SYS_LIBPATH_AIX
+       _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 _LT_AC_SYS_LIBPATH_AIX
+	 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # -bexpall does not export symbols beginning with underscore (_)
+	  _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' '
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds it's shared libraries.
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      # see comment about different semantics on the GNU ld section
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    bsdi[[45]]*)
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case "$host_os" in
+        rhapsody* | darwin1.[[012]])
+         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[[012]])
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case "$cc_basename" in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         _LT_AC_TAGVAR(ld_shlibs, $1)=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10* | hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case "$host_cpu" in
+	hppa*64*|ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case "$host_cpu" in
+	hppa*64*|ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	case "$host_cpu" in
+	hppa*64*)
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    openbsd*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	   _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	   ;;
+	 *)
+	   _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    sco3.2v5*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ;;
+
+    solaris*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;;
+      esac
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4.2uw2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      hardcode_runpath_var=yes
+      runpath_var=LD_RUN_PATH
+      ;;
+
+   sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[[78]]* | unixware7*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text'
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      runpath_var='LD_RUN_PATH'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv5*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+      # $CC -shared without GNU ld will not create a library from C++
+      # object files and a static libstdc++, better avoid it by now
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+      ;;
+
+    uts4*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+  fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_AC_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+        _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+  test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+  AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_MSG_RESULT([$SED])
+])
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
 # Automake X.Y traces this macro to ensure aclocal.m4 has been
 # generated from the m4 files accompanying Automake X.Y.
-AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"])
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
 
 # AM_SET_CURRENT_AUTOMAKE_VERSION
 # -------------------------------
 # Call AM_AUTOMAKE_VERSION so it can be traced.
 # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-	 [AM_AUTOMAKE_VERSION([1.7.6])])
+	 [AM_AUTOMAKE_VERSION([1.9.5])])
 
-# Helper functions for option handling.                    -*- Autoconf -*-
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright 2001, 2002  Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-# serial 2
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 #
-# Check to make sure that the build environment is sane.
-#
-
-# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-# serial 3
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-#  -*- Autoconf -*-
-
-
-# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-# serial 3
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# AM_AUX_DIR_EXPAND
-
-# Copyright 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
 # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
@@ -376,131 +6107,55 @@
 # absolute PATH.  The drawback is that using absolute paths prevent a
 # configured tree to be moved without reconfiguration.
 
-# Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])
-
-AC_DEFUN([AM_AUX_DIR_EXPAND], [
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
 ])
 
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
+# AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright 2001 Free Software Foundation, Inc.
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# serial 7
 
-# 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
-# 02111-1307, USA.
-
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
-AC_SUBST(install_sh)])
-
-# AM_PROG_INSTALL_STRIP
-
-# Copyright 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-#                                                          -*- Autoconf -*-
-# Copyright (C) 2003  Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-# serial 1
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
 else
-  am__leading_dot=_
+  $1_TRUE='#'
+  $1_FALSE=
 fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
 
-# serial 5						-*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003  Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
+# serial 8
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -509,7 +6164,6 @@
 # CC etc. in the Makefile, will ask for an AC_PROG_CC use...
 
 
-
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
@@ -568,7 +6222,9 @@
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      : > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
@@ -596,9 +6252,14 @@
        grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
       # icc doesn't choke on unknown options, it will just issue warnings
-      # (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored.
-      if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
         am_cv_$1_dependencies_compiler_type=$depmode
         break
       fi
@@ -632,8 +6293,8 @@
 # ------------
 AC_DEFUN([AM_DEP_TRACK],
 [AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking Speeds up one-time builds
-  --enable-dependency-tracking  Do not reject slow dependency extractors])
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
@@ -642,26 +6303,16 @@
 AC_SUBST([AMDEPBACKSLASH])
 ])
 
-# Generate code to set up dependency tracking.   -*- Autoconf -*-
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-#serial 2
+#serial 3
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
@@ -680,27 +6331,21 @@
   else
     continue
   fi
-  grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue
-  # Extract the definition of DEP_FILES from the Makefile without
-  # running `make'.
-  DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
   test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
   # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n -e '/^U = / s///p' < "$mf"`
-  test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
-  # We invoke sed twice because it is the simplest approach to
-  # changing $(DEPDIR) to its actual value in the expansion.
-  for file in `sed -n -e '
-    /^DEP_FILES = .*\\\\$/ {
-      s/^DEP_FILES = //
-      :loop
-	s/\\\\$//
-	p
-	n
-	/\\\\$/ b loop
-      p
-    }
-    /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
     # Make sure the directory exists.
     test -f "$dirpart/$file" && continue
@@ -726,27 +6371,206 @@
      [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
 ])
 
-# Check to see how 'make' treats includes.	-*- Autoconf -*-
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+# serial 8
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
 
-# 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.
+# Do all the work for Automake.                             -*- Autoconf -*-
 
-# 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
-# 02111-1307, USA.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # serial 2
 
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode is disabled by default
+  AC_ARG_ENABLE(maintainer-mode,
+[  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      USE_MAINTAINER_MODE=$enableval,
+      USE_MAINTAINER_MODE=no)
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
 # AM_MAKE_INCLUDE()
 # -----------------
 # Check to see how make treats includes.
@@ -789,112 +6613,310 @@
 rm -f confinc confmf
 ])
 
-# AM_CONDITIONAL                                              -*- Autoconf -*-
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright 1997, 2000, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# serial 4
 
-# 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.
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
 
-# 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
-# 02111-1307, USA.
 
-# serial 5
-
-AC_PREREQ(2.52)
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-        [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])
-AC_SUBST([$1_FALSE])
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
 else
-  $1_TRUE='#'
-  $1_FALSE=
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
 fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.])
-fi])])
+])
 
-# Add --enable-maintainer-mode option to configure.
-# From Jim Meyering
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# Copyright 1996, 1998, 2000, 2001, 2002  Free Software Foundation, Inc.
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# Helper functions for option handling.                     -*- Autoconf -*-
 
-# 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.
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# 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
-# 02111-1307, USA.
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # serial 2
 
-AC_DEFUN([AM_MAINTAINER_MODE],
-[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
-  dnl maintainer-mode is disabled by default
-  AC_ARG_ENABLE(maintainer-mode,
-[  --enable-maintainer-mode enable make rules and dependencies not useful
-                          (and sometimes confusing) to the casual installer],
-      USE_MAINTAINER_MODE=$enableval,
-      USE_MAINTAINER_MODE=no)
-  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
-  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
-  MAINT=$MAINTAINER_MODE_TRUE
-  AC_SUBST(MAINT)dnl
-]
-)
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
 
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
 
-# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
 
-# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# 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
-# 02111-1307, USA.
-
-AC_PREREQ([2.52])
-
-# serial 6
-
-# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
-AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
 
diff --git a/compile b/compile
new file mode 100755
index 0000000..ad57e2f
--- /dev/null
+++ b/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-02-03.08
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# 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 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as `compile cc -o foo foo.c'.
+	# So we strip `-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/config.guess b/config.guess
index c8fc683..44f30e6 100755
--- a/config.guess
+++ b/config.guess
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
-timestamp='2003-07-02'
+timestamp='2005-02-10'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
@@ -207,15 +207,21 @@
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 	echo "${machine}-${os}${release}"
 	exit 0 ;;
+    amd64:OpenBSD:*:*)
+	echo x86_64-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
     amiga:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
-    arc:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+    cats:OpenBSD:*:*)
+	echo arm-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
     hp300:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
+    luna88k:OpenBSD:*:*)
+    	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
     mac68k:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
@@ -231,25 +237,33 @@
     mvmeppc:OpenBSD:*:*)
 	echo powerpc-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
-    pmax:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
     sgi:OpenBSD:*:*)
-	echo mipseb-unknown-openbsd${UNAME_RELEASE}
+	echo mips64-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
     sun3:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
-    wgrisc:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
     *:OpenBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit 0 ;;
+    macppc:MirBSD:*:*)
+	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit 0 ;;
     alpha:OSF1:*:*)
-	if test $UNAME_RELEASE = "V4.0"; then
+	case $UNAME_RELEASE in
+	*4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-	fi
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
 	# OSF/1 and Tru64 systems produced since 1995.  I hope that
 	# covers most systems running today.  This code pipes the CPU
@@ -287,14 +301,12 @@
 	    "EV7.9 (21364A)")
 		UNAME_MACHINE="alphaev79" ;;
 	esac
+	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit 0 ;;
-    Alpha*:OpenVMS:*:*)
-	echo alpha-hp-vms
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
 	exit 0 ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
@@ -317,6 +329,12 @@
     *:OS/390:*:*)
 	echo i370-ibm-openedition
 	exit 0 ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit 0 ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit 0 ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit 0;;
@@ -337,7 +355,7 @@
     DRS?6000:unix:4.0:6*)
 	echo sparc-icl-nx6
 	exit 0 ;;
-    DRS?6000:UNIX_SV:4.2*:7*)
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
 	case `/usr/bin/uname -p` in
 	    sparc) echo sparc-icl-nx7 && exit 0 ;;
 	esac ;;
@@ -409,6 +427,9 @@
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
         echo m68k-unknown-mint${UNAME_RELEASE}
         exit 0 ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
     powerpc:machten:*:*)
 	echo powerpc-apple-machten${UNAME_RELEASE}
 	exit 0 ;;
@@ -744,7 +765,7 @@
 	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
     *:UNICOS/mp:*:*)
-	echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
@@ -752,6 +773,11 @@
         FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
         echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
         exit 0 ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit 0 ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
 	exit 0 ;;
@@ -761,22 +787,8 @@
     *:BSD/OS:*:*)
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 	exit 0 ;;
-    *:FreeBSD:*:*|*:GNU/FreeBSD:*:*)
-	# Determine whether the default compiler uses glibc.
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#if __GLIBC__ >= 2
-	LIBC=gnu
-	#else
-	LIBC=
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
-	# GNU/FreeBSD systems have a "k" prefix to indicate we are using
-	# FreeBSD's kernel, but not the complete OS.
-	case ${LIBC} in gnu) kernel_only='k' ;; esac
-	echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit 0 ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
@@ -802,6 +814,9 @@
     i*:UWIN*:*)
 	echo ${UNAME_MACHINE}-pc-uwin
 	exit 0 ;;
+    amd64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit 0 ;;
     p*:CYGWIN*:*)
 	echo powerpcle-unknown-cygwin
 	exit 0 ;;
@@ -809,8 +824,13 @@
 	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit 0 ;;
     *:GNU:*:*)
+	# the GNU system
 	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit 0 ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit 0 ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit 0 ;;
@@ -820,9 +840,18 @@
     cris:Linux:*:*)
 	echo cris-axis-linux
 	exit 0 ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux
+	exit 0 ;;
+    frv:Linux:*:*)
+    	echo frv-${VENDOR}-linux
+	exit 0 ;;
     ia64:Linux:*:*)
 	echo ${UNAME_MACHINE}-${VENDOR}-linux
 	exit 0 ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-${VENDOR}-linux
+	exit 0 ;;
     m68*:Linux:*:*)
 	echo ${UNAME_MACHINE}-${VENDOR}-linux
 	exit 0 ;;
@@ -958,6 +987,9 @@
 	LIBC=gnuaout
 	#endif
 	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
 	test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}" | sed 's/linux-gnu/linux/' && exit 0
@@ -988,6 +1020,9 @@
     i*86:atheos:*:*)
 	echo ${UNAME_MACHINE}-unknown-atheos
 	exit 0 ;;
+	i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit 0 ;;
     i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
 	echo i386-unknown-lynxos${UNAME_RELEASE}
 	exit 0 ;;
@@ -1057,9 +1092,9 @@
     M680?0:D-NIX:5.3:*)
 	echo m68k-diab-dnix
 	exit 0 ;;
-    M68*:*:R3V[567]*:*)
+    M68*:*:R3V[5678]*:*)
 	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
 	OS_REL=''
 	test -r /etc/.relid \
 	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
@@ -1157,9 +1192,10 @@
 	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
 	exit 0 ;;
     *:Darwin:*:*)
-	case `uname -p` in
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
 	    *86) UNAME_PROCESSOR=i686 ;;
-	    powerpc) UNAME_PROCESSOR=powerpc ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
 	esac
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit 0 ;;
@@ -1174,7 +1210,10 @@
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit 0 ;;
-    NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*)
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
 	echo nsr-tandem-nsk${UNAME_RELEASE}
 	exit 0 ;;
     *:NonStop-UX:*:*)
@@ -1218,6 +1257,19 @@
     SEI:*:*:SEIUX)
         echo mips-sei-seiux${UNAME_RELEASE}
 	exit 0 ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms && exit 0 ;;
+	    I*) echo ia64-dec-vms && exit 0 ;;
+	    V*) echo vax-dec-vms && exit 0 ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit 0 ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
diff --git a/include/config.h.in b/config.h.in
similarity index 74%
rename from include/config.h.in
rename to config.h.in
index 5c60a71..c0ae185 100644
--- a/include/config.h.in
+++ b/config.h.in
@@ -1,11 +1,21 @@
-/* include/config.h.in.  Generated from configure.in by autoheader.  */
+/* config.h.in.  Generated from configure.in by autoheader.  */
 
 /* Define for enable debug info. */
 #undef ENABLE_DEBUG
 
+/* Define to 1 if you have the <asm/unaligned.h> header file. */
+#undef HAVE_ASM_UNALIGNED_H
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
 /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
 #undef HAVE_DOPRNT
 
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
 /* Define to 1 if you have the <fcntl.h> header file. */
 #undef HAVE_FCNTL_H
 
@@ -33,12 +43,22 @@
 /* Define to 1 if you have the `memset' function. */
 #undef HAVE_MEMSET
 
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <print.h> header file. */
+#undef HAVE_PRINT_H
+
 /* Define to 1 if you have the `register_printf_function' function. */
 #undef HAVE_REGISTER_PRINTF_FUNCTION
 
 /* Define to 1 if you have the `statfs' function. */
 #undef HAVE_STATFS
 
+/* Define to 1 if `stat' has the bug that it succeeds when given the
+   zero-length file name argument. */
+#undef HAVE_STAT_EMPTY_STRING_BUG
+
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
 
@@ -70,9 +90,17 @@
    `HAVE_STRUCT_STAT_ST_RDEV' instead. */
 #undef HAVE_ST_RDEV
 
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
@@ -97,6 +125,10 @@
 /* gets set when configure --enable-io-failure-emulation */
 #undef IO_FAILURE_EMULATION
 
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+   slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
 /* Define to 1 if `major', `minor', and `makedev' are declared in <mkdev.h>.
    */
 #undef MAJOR_IN_MKDEV
@@ -135,6 +167,10 @@
 /* Version number of package */
 #undef VERSION
 
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
 /* Number of bits in a file offset, on hosts where this is settable. */
 #undef _FILE_OFFSET_BITS
 
@@ -144,9 +180,11 @@
 /* Define to empty if `const' does not conform to ANSI C. */
 #undef const
 
-/* Define as `__inline' if that's what the C compiler calls it, or to nothing
-   if it is not supported. */
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
 #undef inline
+#endif
 
 /* Define to `unsigned' if <sys/types.h> does not define. */
 #undef size_t
diff --git a/config.sub b/config.sub
index 9952c14..c884ad4 100755
--- a/config.sub
+++ b/config.sub
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
-timestamp='2003-07-04'
+timestamp='2005-02-10'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -70,7 +70,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
@@ -118,7 +118,8 @@
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
@@ -144,7 +145,7 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis)
+	-apple | -axis | -knuth | -cray)
 		os=
 		basic_machine=$1
 		;;
@@ -228,14 +229,15 @@
 	| a29k \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
 	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
 	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
 	| fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| i370 | i860 | i960 | ia64 \
-	| ip2k \
-	| m32r | m68000 | m68k | m88k | mcore \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -247,6 +249,7 @@
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
 	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipstx39 | mipstx39el \
@@ -259,12 +262,12 @@
 	| pyramid \
 	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
-	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
 	| strongarm \
 	| tahoe | thumb | tic4x | tic80 | tron \
 	| v850 | v850e \
 	| we32k \
-	| x86 | xscale | xstormy16 | xtensa \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
 	| z8k)
 		basic_machine=$basic_machine-unknown
 		;;
@@ -297,17 +300,17 @@
 	| avr-* \
 	| bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | cydra-* \
+	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* \
-	| m32r-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -319,11 +322,13 @@
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
 	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
 	| msp430-* \
-	| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
@@ -332,14 +337,14 @@
 	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
-	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
 	| tahoe-* | thumb-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tron-* \
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
-	| xtensa-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
 	| ymp-* \
 	| z8k-*)
 		;;
@@ -359,6 +364,9 @@
 		basic_machine=a29k-amd
 		os=-udi
 		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
 	adobe68k)
 		basic_machine=m68010-adobe
 		os=-scout
@@ -376,6 +384,9 @@
 	amd64)
 		basic_machine=x86_64-pc
 		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	amdahl)
 		basic_machine=580-amdahl
 		os=-sysv
@@ -435,12 +446,27 @@
 		basic_machine=j90-cray
 		os=-unicos
 		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
 	crds | unos)
 		basic_machine=m68k-crds
 		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
 	cris | cris-* | etrax*)
 		basic_machine=cris-axis
 		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
 	da30 | da30-*)
 		basic_machine=m68k-da30
 		;;
@@ -463,6 +489,10 @@
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
 	dpx20 | dpx20-*)
 		basic_machine=rs6000-bull
 		os=-bosx
@@ -641,10 +671,6 @@
 	mips3*)
 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
 		;;
-	mmix*)
-		basic_machine=mmix-knuth
-		os=-mmixware
-		;;
 	monitor)
 		basic_machine=m68k-rom68k
 		os=-coff
@@ -725,10 +751,6 @@
 	np1)
 		basic_machine=np1-gould
 		;;
-	nv1)
-		basic_machine=nv1-cray
-		os=-unicosmp
-		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -740,6 +762,10 @@
 		basic_machine=or32-unknown
 		os=-coff
 		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
 	OSE68000 | ose68000)
 		basic_machine=m68000-ericsson
 		os=-ose
@@ -960,6 +986,10 @@
 	tower | tower-32)
 		basic_machine=m68k-ncr
 		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
 	udi29k)
 		basic_machine=a29k-amd
 		os=-udi
@@ -1003,6 +1033,10 @@
 		basic_machine=hppa1.1-winbond
 		os=-proelf
 		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
@@ -1033,6 +1067,9 @@
 	romp)
 		basic_machine=romp-ibm
 		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
 	rs6000)
 		basic_machine=rs6000-ibm
 		;;
@@ -1055,7 +1092,7 @@
 	sh64)
 		basic_machine=sh64-unknown
 		;;
-	sparc | sparcv9 | sparcv9b)
+	sparc | sparcv8 | sparcv9 | sparcv9b)
 		basic_machine=sparc-sun
 		;;
 	cydra)
@@ -1128,19 +1165,20 @@
 	      | -aos* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \
-	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -mingw32* | -linux* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei*)
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1164,6 +1202,9 @@
 	-mac*)
 		os=`echo $os | sed -e 's|mac|macos|'`
 		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
 	-sunos5*)
 		os=`echo $os | sed -e 's|sunos5|solaris2|'`
 		;;
@@ -1173,6 +1214,9 @@
 	-opened*)
 		os=-openedition
 		;;
+        -os400*)
+		os=-os400
+		;;
 	-wince*)
 		os=-wince
 		;;
@@ -1194,6 +1238,9 @@
 	-atheos*)
 		os=-atheos
 		;;
+	-syllable*)
+		os=-syllable
+		;;
 	-386bsd)
 		os=-bsd
 		;;
@@ -1216,6 +1263,9 @@
 	-sinix*)
 		os=-sysv4
 		;;
+        -tpf*)
+		os=-tpf
+		;;
 	-triton*)
 		os=-sysv3
 		;;
@@ -1252,6 +1302,9 @@
 	-kaos*)
 		os=-kaos
 		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
 	-none)
 		;;
 	*)
@@ -1332,6 +1385,9 @@
 	*-ibm)
 		os=-aix
 		;;
+    	*-knuth)
+		os=-mmixware
+		;;
 	*-wec)
 		os=-proelf
 		;;
@@ -1464,9 +1520,15 @@
 			-mvs* | -opened*)
 				vendor=ibm
 				;;
+			-os400*)
+				vendor=ibm
+				;;
 			-ptx*)
 				vendor=sequent
 				;;
+			-tpf*)
+				vendor=ibm
+				;;
 			-vxsim* | -vxworks* | -windiss*)
 				vendor=wrs
 				;;
diff --git a/configure b/configure
index 66ef57d..2f45f37 100755
--- a/configure
+++ b/configure
@@ -1,9 +1,8 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57.
+# Generated by GNU Autoconf 2.59.
 #
-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
+# Copyright (C) 2003 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
@@ -20,9 +19,10 @@
 elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
   set -o posix
 fi
+DUALCASE=1; export DUALCASE # for MKS sh
 
 # Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   as_unset=unset
 else
   as_unset=false
@@ -41,7 +41,7 @@
   LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
   LC_TELEPHONE LC_TIME
 do
-  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
     eval $as_var=C; export $as_var
   else
     $as_unset $as_var
@@ -218,16 +218,17 @@
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
 else
+  test -d ./-p && rmdir ./-p
   as_mkdir_p=false
 fi
 
 as_executable_p="test -f"
 
 # Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 
 # Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
 # IFS
@@ -270,7 +271,7 @@
 PACKAGE_STRING=
 PACKAGE_BUGREPORT=
 
-ac_unique_file="version.h"
+ac_unique_file="include/reiserfs/libreiserfs.h"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -308,7 +309,7 @@
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE LN_S RANLIB ac_ct_RANLIB UUID_LIBS CPP EGREP LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LN_S RANLIB ac_ct_RANLIB EGREP LIBOBJS UUID_LIBS PROGS_LDFLAGS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -667,7 +668,7 @@
 
 # Be sure to have absolute paths.
 for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-              localstatedir libdir includedir oldincludedir infodir mandir
+	      localstatedir libdir includedir oldincludedir infodir mandir
 do
   eval ac_val=$`echo $ac_var`
   case $ac_val in
@@ -707,10 +708,10 @@
   # Try the directory containing this script, then its parent.
   ac_confdir=`(dirname "$0") 2>/dev/null ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$0" : 'X\(//\)[^/]' \| \
-         X"$0" : 'X\(//\)$' \| \
-         X"$0" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$0" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -802,9 +803,9 @@
   cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
+			  [$ac_default_prefix]
   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
+			  [PREFIX]
 
 By default, \`make install' will install all the files in
 \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
@@ -848,11 +849,14 @@
 Optional Features:
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-maintainer-mode enable make rules and dependencies not useful
-                          (and sometimes confusing) to the casual installer
-  --disable-dependency-tracking Speeds up one-time builds
-  --enable-dependency-tracking  Do not reject slow dependency extractors
-  --enable-debug          enable extra checks
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --enable-debug      enable extra checks
+  --enable-static     build all static
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]
+                          build shared libraries [default=yes]
   --disable-largefile     omit support for large files
   --enable-io-failure-emulation      Never use that. It is for debugging only
 
@@ -901,12 +905,45 @@
     ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
     ac_top_srcdir=$ac_top_builddir$srcdir ;;
 esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
 
     cd $ac_dir
     # Check for guested configure; otherwise get Cygnus style configure.
@@ -917,7 +954,7 @@
       echo
       $SHELL $ac_srcdir/configure  --help=recursive
     elif test -f $ac_srcdir/configure.ac ||
-           test -f $ac_srcdir/configure.in; then
+	   test -f $ac_srcdir/configure.in; then
       echo
       $ac_configure --help
     else
@@ -931,8 +968,7 @@
 if $ac_init_version; then
   cat <<\_ACEOF
 
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-Free Software Foundation, Inc.
+Copyright (C) 2003 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -944,7 +980,7 @@
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by $as_me, which was
-generated by GNU Autoconf 2.57.  Invocation command line was
+generated by GNU Autoconf 2.59.  Invocation command line was
 
   $ $0 $@
 
@@ -1021,19 +1057,19 @@
     2)
       ac_configure_args1="$ac_configure_args1 '$ac_arg'"
       if test $ac_must_keep_next = true; then
-        ac_must_keep_next=false # Got value, back to normal.
+	ac_must_keep_next=false # Got value, back to normal.
       else
-        case $ac_arg in
-          *=* | --config-cache | -C | -disable-* | --disable-* \
-          | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-          | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-          | -with-* | --with-* | -without-* | --without-* | --x)
-            case "$ac_configure_args0 " in
-              "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-            esac
-            ;;
-          -* ) ac_must_keep_next=true ;;
-        esac
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
       fi
       ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
       # Get rid of the leading space.
@@ -1067,12 +1103,12 @@
     case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
     *ac_space=\ *)
       sed -n \
-        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
       ;;
     *)
       sed -n \
-        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
       ;;
     esac;
 }
@@ -1101,7 +1137,7 @@
       for ac_var in $ac_subst_files
       do
 	eval ac_val=$`echo $ac_var`
-        echo "$ac_var='"'"'$ac_val'"'"'"
+	echo "$ac_var='"'"'$ac_val'"'"'"
       done | sort
       echo
     fi
@@ -1120,7 +1156,7 @@
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core core.* *.core &&
+  rm -f core *.core &&
   rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
      ' 0
@@ -1200,7 +1236,7 @@
 # value.
 ac_cache_corrupted=false
 for ac_var in `(set) 2>&1 |
-               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
   eval ac_old_val="\$ac_cv_env_${ac_var}_value"
@@ -1217,13 +1253,13 @@
     ,);;
     *)
       if test "x$ac_old_val" != "x$ac_new_val"; then
-        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
 echo "$as_me:   former value:  $ac_old_val" >&2;}
-        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
 echo "$as_me:   current value: $ac_new_val" >&2;}
-        ac_cache_corrupted=:
+	ac_cache_corrupted=:
       fi;;
   esac
   # Pass precious variables to config.status.
@@ -1357,7 +1393,23 @@
 
 
 
-am__api_version="1.7"
+
+
+
+
+
+LIBREISERFS_MAJOR_VERSION=3
+LIBREISERFS_MINOR_VERSION=6
+LIBREISERFS_MICRO_VERSION=20
+LIBREISERFS_VERSION=$LIBREISERFS_MAJOR_VERSION.$LIBREISERFS_MINOR_VERSION.$LIBREISERFS_MICRO_VERSION
+
+
+
+
+PACKAGE=reiserfsprogs
+VERSION=$LIBREISERFS_VERSION
+
+am__api_version="1.9"
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -1369,6 +1421,7 @@
 # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
 echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
@@ -1385,6 +1438,7 @@
 case $as_dir/ in
   ./ | .// | /cC/* | \
   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
   /usr/ucb/* ) ;;
   *)
     # OSF1 and SCO ODT 3.0 have their own names for install.
@@ -1392,20 +1446,20 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-          if test $ac_prog = install &&
-            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-            # AIX install.  It has an incompatible calling convention.
-            :
-          elif test $ac_prog = install &&
-            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-            # program-specific install script used by HP pwplus--don't use.
-            :
-          else
-            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-            break 3
-          fi
-        fi
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
       done
     done
     ;;
@@ -1493,7 +1547,6 @@
 program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
 rm conftest.sed
 
-
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
 
@@ -1507,6 +1560,39 @@
 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -1549,7 +1635,7 @@
 
 echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
 if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1585,7 +1671,7 @@
 fi
 rmdir .tst 2>/dev/null
 
- # test to see if srcdir already configured
+# test to see if srcdir already configured
 if test "`cd $srcdir && pwd`" != "`pwd`" &&
    test -f $srcdir/config.status; then
   { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
@@ -1604,8 +1690,8 @@
 
 
 # Define the identity of the package.
- PACKAGE=reiserfsprogs
- VERSION=3.6.19
+ PACKAGE=$PACKAGE
+ VERSION=$VERSION
 
 
 cat >>confdefs.h <<_ACEOF
@@ -1633,9 +1719,6 @@
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
 install_sh=${install_sh-"$am_aux_dir/install-sh"}
 
 # Installed binaries are usually stripped using `strip' when the user
@@ -1728,9 +1811,18 @@
 
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
 
 
 
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
 echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
@@ -1757,9 +1849,30 @@
 
 
 
-          ac_config_headers="$ac_config_headers include/config.h"
 
+# Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+  enableval="$enable_debug"
 
+else
+  enable_debug=no
+
+fi;
+
+PROGS_LDFLAGS=""
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval="$enable_static"
+
+else
+  enable_static=no
+
+fi;
+
+if test x$enable_static = xyes; then
+	PROGS_LDFLAGS=-static
+fi
 
 
 PRESET_CFLAGS=$CFLAGS
@@ -2100,7 +2213,6 @@
   (exit $ac_status); }
 
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2120,8 +2232,8 @@
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output" >&5
-echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
 if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
   (eval $ac_link_default) 2>&5
@@ -2141,23 +2253,23 @@
   test -f "$ac_file" || continue
   case $ac_file in
     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-        ;;
+	;;
     conftest.$ac_ext )
-        # This is the source file.
-        ;;
+	# This is the source file.
+	;;
     [ab].out )
-        # We found the default executable, but exeext='' is most
-        # certainly right.
-        break;;
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
     *.* )
-        ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-        # FIXME: I believe we export ac_cv_exeext for Libtool,
-        # but it would be cool to find out if it's true.  Does anybody
-        # maintain Libtool? --akim.
-        export ac_cv_exeext
-        break;;
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
     * )
-        break;;
+	break;;
   esac
 done
 else
@@ -2231,8 +2343,8 @@
   case $ac_file in
     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-          export ac_cv_exeext
-          break;;
+	  export ac_cv_exeext
+	  break;;
     * ) break;;
   esac
 done
@@ -2257,7 +2369,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2308,7 +2419,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2328,11 +2438,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2345,7 +2465,7 @@
 
 ac_compiler_gnu=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
@@ -2361,7 +2481,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2378,11 +2497,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2395,7 +2524,7 @@
 
 ac_cv_prog_cc_g=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
@@ -2422,7 +2551,6 @@
   ac_cv_prog_cc_stdc=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2450,6 +2578,16 @@
   va_end (v);
   return s;
 }
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2476,11 +2614,21 @@
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2493,7 +2641,7 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext
+rm -f conftest.err conftest.$ac_objext
 done
 rm -f conftest.$ac_ext conftest.$ac_objext
 CC=$ac_save_CC
@@ -2521,19 +2669,28 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   for ac_declaration in \
-   ''\
-   '#include <stdlib.h>' \
+   '' \
    'extern "C" void std::exit (int) throw (); using std::exit;' \
    'extern "C" void std::exit (int); using std::exit;' \
    'extern "C" void exit (int) throw ();' \
@@ -2541,14 +2698,13 @@
    'void exit (int);'
 do
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <stdlib.h>
 $ac_declaration
+#include <stdlib.h>
 int
 main ()
 {
@@ -2559,11 +2715,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2576,9 +2742,8 @@
 
 continue
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2595,11 +2760,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2611,7 +2786,7 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 rm -f conftest*
 if test -n "$ac_declaration"; then
@@ -2625,7 +2800,7 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2738,7 +2913,9 @@
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      : > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
@@ -2766,9 +2943,14 @@
        grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
       # icc doesn't choke on unknown options, it will just issue warnings
-      # (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored.
-      if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
         am_cv_CC_dependencies_compiler_type=$depmode
         break
       fi
@@ -2799,6 +2981,240 @@
 fi
 
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -2850,6 +3266,7 @@
 # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
 echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
@@ -2866,6 +3283,7 @@
 case $as_dir/ in
   ./ | .// | /cC/* | \
   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
   /usr/ucb/* ) ;;
   *)
     # OSF1 and SCO ODT 3.0 have their own names for install.
@@ -2873,20 +3291,20 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-          if test $ac_prog = install &&
-            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-            # AIX install.  It has an incompatible calling convention.
-            :
-          elif test $ac_prog = install &&
-            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-            # program-specific install script used by HP pwplus--don't use.
-            :
-          else
-            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-            break 3
-          fi
-        fi
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
       done
     done
     ;;
@@ -2929,7 +3347,7 @@
 
 echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
 if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3037,8 +3455,34 @@
 fi
 
 
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval="$enable_shared"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi;
+
+
 
 # Check for LIBUUID
+LIBS=""
 
 
 echo "$as_me:$LINENO: checking for uuid_generate in -luuid" >&5
@@ -3049,7 +3493,6 @@
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-luuid  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3073,11 +3516,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3090,7 +3543,8 @@
 
 ac_cv_lib_uuid_uuid_generate=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_uuid_uuid_generate" >&5
@@ -3110,241 +3564,6 @@
 UUID_LIBS="$LIBS"
 
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
 echo "$as_me:$LINENO: checking for egrep" >&5
 echo $ECHO_N "checking for egrep... $ECHO_C" >&6
 if test "${ac_cv_prog_egrep+set}" = set; then
@@ -3366,7 +3585,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3387,11 +3605,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3404,12 +3632,11 @@
 
 ac_cv_header_stdc=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3431,7 +3658,6 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3456,7 +3682,6 @@
   :
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3468,9 +3693,9 @@
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
 #else
 # define ISLOWER(c) \
-                   (('a' <= (c) && (c) <= 'i') \
-                     || ('j' <= (c) && (c) <= 'r') \
-                     || ('s' <= (c) && (c) <= 'z'))
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
 # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
 #endif
 
@@ -3481,7 +3706,7 @@
   int i;
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
-        || toupper (i) != TOUPPER (i))
+	|| toupper (i) != TOUPPER (i))
       exit(2);
   exit (0);
 }
@@ -3506,7 +3731,7 @@
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
@@ -3520,6 +3745,336 @@
 
 fi
 
+
+
+
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+if test "${ac_cv_search_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+ac_cv_search_opendir=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="none required"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_opendir" = no; then
+  for ac_lib in dir; do
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="-l$ac_lib"
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+  done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6
+if test "$ac_cv_search_opendir" != no; then
+  test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+
+fi
+
+else
+  echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+if test "${ac_cv_search_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+ac_cv_search_opendir=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="none required"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_opendir" = no; then
+  for ac_lib in x; do
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="-l$ac_lib"
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+  done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6
+if test "$ac_cv_search_opendir" != no; then
+  test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+
+fi
+
+fi
+
 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
 
 
@@ -3531,7 +4086,7 @@
 
 
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-                  inttypes.h stdint.h unistd.h
+		  inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
 echo "$as_me:$LINENO: checking for $ac_header" >&5
@@ -3540,7 +4095,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3552,11 +4106,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3569,7 +4133,7 @@
 
 eval "$as_ac_Header=no"
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
@@ -3589,7 +4153,9 @@
 
 
 
-for ac_header in fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h
+
+
+for ac_header in print.h errno.h fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
@@ -3605,7 +4171,6 @@
 echo "$as_me:$LINENO: checking $ac_header usability" >&5
 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3616,11 +4181,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3633,7 +4208,7 @@
 
 ac_header_compiler=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
 echo "${ECHO_T}$ac_header_compiler" >&6
 
@@ -3641,7 +4216,6 @@
 echo "$as_me:$LINENO: checking $ac_header presence" >&5
 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3659,6 +4233,7 @@
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -3678,33 +4253,32 @@
 echo "${ECHO_T}$ac_header_preproc" >&6
 
 # So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc in
-  yes:no )
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
     { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
     ;;
-  no:yes )
+  no:yes:* )
     { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
     (
       cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists.  ##
+## ------------------------------------------ ##
 _ASBOX
     ) |
       sed "s/^/$as_me: WARNING:     /" >&2
@@ -3715,7 +4289,7 @@
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  eval "$as_ac_Header=$ac_header_preproc"
+  eval "$as_ac_Header=\$ac_header_preproc"
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
@@ -3730,13 +4304,163 @@
 
 done
 
+
+for ac_header in asm/unaligned.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists.  ##
+## ------------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
 echo "$as_me:$LINENO: checking whether sys/types.h defines makedev" >&5
 echo $ECHO_N "checking whether sys/types.h defines makedev... $ECHO_C" >&6
 if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3753,11 +4477,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3770,7 +4504,8 @@
 
 ac_cv_header_sys_types_h_makedev=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 
 fi
 echo "$as_me:$LINENO: result: $ac_cv_header_sys_types_h_makedev" >&5
@@ -3790,7 +4525,6 @@
 echo "$as_me:$LINENO: checking sys/mkdev.h usability" >&5
 echo $ECHO_N "checking sys/mkdev.h usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3801,11 +4535,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3818,7 +4562,7 @@
 
 ac_header_compiler=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
 echo "${ECHO_T}$ac_header_compiler" >&6
 
@@ -3826,7 +4570,6 @@
 echo "$as_me:$LINENO: checking sys/mkdev.h presence" >&5
 echo $ECHO_N "checking sys/mkdev.h presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3844,6 +4587,7 @@
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -3863,33 +4607,32 @@
 echo "${ECHO_T}$ac_header_preproc" >&6
 
 # So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc in
-  yes:no )
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
     { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: accepted by the compiler, rejected by the preprocessor!" >&5
 echo "$as_me: WARNING: sys/mkdev.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/mkdev.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
     ;;
-  no:yes )
+  no:yes:* )
     { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: present but cannot be compiled" >&5
 echo "$as_me: WARNING: sys/mkdev.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: sys/mkdev.h: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/mkdev.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/mkdev.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/mkdev.h:     section \"Present But Cannot Be Compiled\"" >&2;}
     { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&5
 echo "$as_me: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/mkdev.h: in the future, the compiler will take precedence" >&2;}
     (
       cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists.  ##
+## ------------------------------------------ ##
 _ASBOX
     ) |
       sed "s/^/$as_me: WARNING:     /" >&2
@@ -3930,7 +4673,6 @@
 echo "$as_me:$LINENO: checking sys/sysmacros.h usability" >&5
 echo $ECHO_N "checking sys/sysmacros.h usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3941,11 +4683,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3958,7 +4710,7 @@
 
 ac_header_compiler=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
 echo "${ECHO_T}$ac_header_compiler" >&6
 
@@ -3966,7 +4718,6 @@
 echo "$as_me:$LINENO: checking sys/sysmacros.h presence" >&5
 echo $ECHO_N "checking sys/sysmacros.h presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3984,6 +4735,7 @@
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
   else
     ac_cpp_err=
   fi
@@ -4003,33 +4755,32 @@
 echo "${ECHO_T}$ac_header_preproc" >&6
 
 # So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc in
-  yes:no )
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
     { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: accepted by the compiler, rejected by the preprocessor!" >&5
 echo "$as_me: WARNING: sys/sysmacros.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
     ;;
-  no:yes )
+  no:yes:* )
     { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: present but cannot be compiled" >&5
 echo "$as_me: WARNING: sys/sysmacros.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: sys/sysmacros.h: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/sysmacros.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/sysmacros.h:     section \"Present But Cannot Be Compiled\"" >&2;}
     { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&5
 echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: in the future, the compiler will take precedence" >&2;}
     (
       cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to bug-autoconf@gnu.org. ##
-## ------------------------------------ ##
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists.  ##
+## ------------------------------------------ ##
 _ASBOX
     ) |
       sed "s/^/$as_me: WARNING:     /" >&2
@@ -4065,7 +4816,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4128,11 +4878,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4145,7 +4905,7 @@
 
 ac_cv_c_const=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
 echo "${ECHO_T}$ac_cv_c_const" >&6
@@ -4165,7 +4925,6 @@
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4180,11 +4939,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4196,23 +4965,27 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 
 fi
 echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
 echo "${ECHO_T}$ac_cv_c_inline" >&6
+
+
 case $ac_cv_c_inline in
   inline | yes) ;;
-  no)
-cat >>confdefs.h <<\_ACEOF
-#define inline
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
 _ACEOF
- ;;
-  *)  cat >>confdefs.h <<_ACEOF
-#define inline $ac_cv_c_inline
-_ACEOF
- ;;
+    ;;
 esac
 
 echo "$as_me:$LINENO: checking for size_t" >&5
@@ -4221,7 +4994,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4241,11 +5013,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4258,7 +5040,7 @@
 
 ac_cv_type_size_t=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
 echo "${ECHO_T}$ac_cv_type_size_t" >&6
@@ -4279,7 +5061,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4298,11 +5079,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4314,7 +5105,6 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4333,11 +5123,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4350,9 +5150,9 @@
 
 ac_cv_member_struct_stat_st_rdev=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_rdev" >&5
 echo "${ECHO_T}$ac_cv_member_struct_stat_st_rdev" >&6
@@ -4370,15 +5170,236 @@
 fi
 
 
-
-# Check whether --enable-debug or --disable-debug was given.
-if test "${enable_debug+set}" = set; then
-  enableval="$enable_debug"
-  enable_debug=yes
+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+if test "${ac_cv_c_bigendian+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  enable_debug=no
+  # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
 
-fi;
+int
+main ()
+{
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_bigendian=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_bigendian=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+# It does not; compile a test program.
+if test "$cross_compiling" = yes; then
+  # try to guess the endianness by grepping values into an object file
+  ac_cv_c_bigendian=unknown
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
+int
+main ()
+{
+ _ascii (); _ebcdic ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
+  ac_cv_c_bigendian=yes
+fi
+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+  if test "$ac_cv_c_bigendian" = unknown; then
+    ac_cv_c_bigendian=no
+  else
+    # finding both strings is unlikely to happen, but who knows?
+    ac_cv_c_bigendian=unknown
+  fi
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+int
+main ()
+{
+  /* Are we little or big endian?  From Harbison&Steele.  */
+  union
+  {
+    long l;
+    char c[sizeof (long)];
+  } u;
+  u.l = 1;
+  exit (u.c[sizeof (long) - 1] == 1);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_bigendian=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+case $ac_cv_c_bigendian in
+  yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+ ;;
+  no)
+     ;;
+  *)
+    { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+
 
 echo "$as_me:$LINENO: checking whether -fPIC works" >&5
 echo $ECHO_N "checking whether -fPIC works... $ECHO_C" >&6
@@ -4389,7 +5410,6 @@
 	saved_CPPFLAGS="$CPPFLAGS"
 	CPPFLAGS="-fPIC -DPIC"
 	cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4406,11 +5426,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4423,7 +5453,7 @@
 
 pic=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 	CPPFLAGS="$saved_CPPFLAGS"
 
 fi
@@ -4440,7 +5470,6 @@
 	saved_CPPFLAGS="$CPPFLAGS"
 	CPPFLAGS="-O1 -Wuninitialized"
 	cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4457,11 +5486,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4474,7 +5513,7 @@
 
 uninitialized=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 	CPPFLAGS="$saved_CPPFLAGS"
 
 fi
@@ -4490,7 +5529,6 @@
 	saved_CPPFLAGS="$CPPFLAGS"
 	CPPFLAGS="-Wno-unused-parameter"
 	cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4507,11 +5545,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4524,7 +5572,7 @@
 
 no_unused_parameter=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 	CPPFLAGS="$saved_CPPFLAGS"
 
 fi
@@ -4540,7 +5588,6 @@
 	saved_CPPFLAGS="$CPPFLAGS"
 	CPPFLAGS="-Wredundant-decls"
 	cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4557,11 +5604,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4574,7 +5631,7 @@
 
 redundant_decls=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 	CPPFLAGS="$saved_CPPFLAGS"
 
 fi
@@ -4600,8 +5657,7 @@
        while :; do
      	 # IRIX 6.2 and later do not support large files by default,
      	 # so use the C compiler's -n32 option if that helps.
-         cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
+	 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4626,11 +5682,21 @@
 _ACEOF
      	 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4642,15 +5708,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext
+rm -f conftest.err conftest.$ac_objext
      	 CC="$CC -n32"
      	 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4662,8 +5738,8 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext
-         break
+rm -f conftest.err conftest.$ac_objext
+	 break
        done
        CC=$ac_save_CC
        rm -f conftest.$ac_ext
@@ -4683,7 +5759,6 @@
   while :; do
   ac_cv_sys_file_offset_bits=no
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4708,11 +5783,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4724,9 +5809,8 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4752,11 +5836,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4768,7 +5862,7 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   break
 done
 fi
@@ -4790,7 +5884,6 @@
   while :; do
   ac_cv_sys_large_files=no
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4815,11 +5908,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4831,9 +5934,8 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4859,11 +5961,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4875,7 +5987,7 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   break
 done
 fi
@@ -4892,7 +6004,7 @@
 fi
 
 
-if test -z "${ac_cv_sys_file_offset_bits}"; then
+if test x${ac_cv_sys_file_offset_bits} = xno; then
 	{ echo "$as_me:$LINENO: WARNING: Can't detect right _FILE_OFFSET_BITS. Will be forced to 64bit." >&5
 echo "$as_me: WARNING: Can't detect right _FILE_OFFSET_BITS. Will be forced to 64bit." >&2;}
 	ac_cv_sys_file_offset_bits=64
@@ -4904,7 +6016,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4929,11 +6040,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4946,7 +6067,7 @@
 
 ac_cv_type_off_t=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
 echo "${ECHO_T}$ac_cv_type_off_t" >&6
@@ -4964,7 +6085,6 @@
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -4988,11 +6108,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5001,7 +6131,6 @@
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5025,11 +6154,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5041,20 +6180,19 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_lo=`expr $ac_mid + 1`
-                    if test $ac_lo -le $ac_mid; then
-                      ac_lo= ac_hi=
-                      break
-                    fi
-                    ac_mid=`expr 2 '*' $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5078,11 +6216,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5091,7 +6239,6 @@
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5115,11 +6262,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5131,13 +6288,13 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_hi=`expr '(' $ac_mid ')' - 1`
-                       if test $ac_mid -le $ac_hi; then
-                         ac_lo= ac_hi=
-                         break
-                       fi
-                       ac_mid=`expr 2 '*' $ac_mid`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
@@ -5145,14 +6302,13 @@
 
 ac_lo= ac_hi=
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5176,11 +6332,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5193,7 +6359,7 @@
 
 ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_off_t=$ac_lo;;
@@ -5212,7 +6378,6 @@
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5279,7 +6444,7 @@
 See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 rm -f conftest.val
@@ -5301,7 +6466,6 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5326,11 +6490,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5343,7 +6517,7 @@
 
 ac_cv_type_blkcnt_t=no
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_type_blkcnt_t" >&5
 echo "${ECHO_T}$ac_cv_type_blkcnt_t" >&6
@@ -5361,7 +6535,6 @@
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5385,11 +6558,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5398,7 +6581,6 @@
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5422,11 +6604,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5438,20 +6630,19 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_lo=`expr $ac_mid + 1`
-                    if test $ac_lo -le $ac_mid; then
-                      ac_lo= ac_hi=
-                      break
-                    fi
-                    ac_mid=`expr 2 '*' $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5475,11 +6666,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5488,7 +6689,6 @@
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5512,11 +6712,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5528,13 +6738,13 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ac_hi=`expr '(' $ac_mid ')' - 1`
-                       if test $ac_mid -le $ac_hi; then
-                         ac_lo= ac_hi=
-                         break
-                       fi
-                       ac_mid=`expr 2 '*' $ac_mid`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
@@ -5542,14 +6752,13 @@
 
 ac_lo= ac_hi=
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5573,11 +6782,21 @@
 _ACEOF
 rm -f conftest.$ac_objext
 if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5590,7 +6809,7 @@
 
 ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.$ac_objext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_blkcnt_t=$ac_lo;;
@@ -5609,7 +6828,6 @@
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5676,7 +6894,7 @@
 See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 rm -f conftest.val
@@ -5700,7 +6918,6 @@
 else
     ac_pattern="Autoconf.*'x'"
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5720,7 +6937,6 @@
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5744,6 +6960,152 @@
   fi
 fi
 
+echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5
+echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6
+if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  rm -f conftest.sym conftest.file
+echo >conftest.file
+if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_lstat_dereferences_slashed_symlink=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+struct stat sbuf;
+     /* Linux will dereference the symlink and fail.
+	That is better in the sense that it means we will not
+	have to compile and use the lstat wrapper.  */
+     exit (lstat ("conftest.sym/", &sbuf) ? 0 : 1);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_lstat_dereferences_slashed_symlink=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_lstat_dereferences_slashed_symlink=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+else
+  # If the `ln -s' command failed, then we probably don't even
+  # have an lstat function.
+  ac_cv_func_lstat_dereferences_slashed_symlink=no
+fi
+rm -f conftest.sym conftest.file
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5
+echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6
+
+test $ac_cv_func_lstat_dereferences_slashed_symlink = yes &&
+
+cat >>confdefs.h <<_ACEOF
+#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
+_ACEOF
+
+
+if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then
+  case $LIBOBJS in
+    "lstat.$ac_objext"   | \
+  *" lstat.$ac_objext"   | \
+    "lstat.$ac_objext "* | \
+  *" lstat.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;;
+esac
+
+fi
+
+echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5
+echo $ECHO_N "checking whether stat accepts an empty string... $ECHO_C" >&6
+if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_stat_empty_string_bug=yes
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+struct stat sbuf;
+  exit (stat ("", &sbuf) ? 1 : 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_stat_empty_string_bug=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_stat_empty_string_bug=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5
+echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6
+if test $ac_cv_func_stat_empty_string_bug = yes; then
+  case $LIBOBJS in
+    "stat.$ac_objext"   | \
+  *" stat.$ac_objext"   | \
+    "stat.$ac_objext "* | \
+  *" stat.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;;
+esac
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STAT_EMPTY_STRING_BUG 1
+_ACEOF
+
+fi
+
 echo "$as_me:$LINENO: checking for working memcmp" >&5
 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
 if test "${ac_cv_func_memcmp_working+set}" = set; then
@@ -5753,13 +7115,12 @@
   ac_cv_func_memcmp_working=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-
+$ac_includes_default
 int
 main ()
 {
@@ -5778,12 +7139,12 @@
     int i;
     for (i = 0; i < 4; i++)
       {
-        char *a = foo + i;
-        char *b = bar + i;
-        strcpy (a, "--------01111111");
-        strcpy (b, "--------10000000");
-        if (memcmp (a, b, 16) >= 0)
-          exit (1);
+	char *a = foo + i;
+	char *b = bar + i;
+	strcpy (a, "--------01111111");
+	strcpy (b, "--------10000000");
+	if (memcmp (a, b, 16) >= 0)
+	  exit (1);
       }
     exit (0);
   }
@@ -5812,12 +7173,19 @@
 ( exit $ac_status )
 ac_cv_func_memcmp_working=no
 fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5
 echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6
-test $ac_cv_func_memcmp_working = no && LIBOBJS="$LIBOBJS memcmp.$ac_objext"
+test $ac_cv_func_memcmp_working = no && case $LIBOBJS in
+    "memcmp.$ac_objext"   | \
+  *" memcmp.$ac_objext"   | \
+    "memcmp.$ac_objext "* | \
+  *" memcmp.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;;
+esac
+
 
 
 for ac_func in strftime
@@ -5829,21 +7197,28 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.
     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
     <limits.h> exists even on freestanding compilers.  */
+
 #ifdef __STDC__
 # include <limits.h>
 #else
 # include <assert.h>
 #endif
+
+#undef $ac_func
+
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
@@ -5874,11 +7249,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5891,7 +7276,8 @@
 
 eval "$as_ac_var=no"
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
@@ -5910,7 +7296,6 @@
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lintl  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -5934,11 +7319,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5951,7 +7346,8 @@
 
 ac_cv_lib_intl_strftime=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_intl_strftime" >&5
@@ -5977,21 +7373,28 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.
     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
     <limits.h> exists even on freestanding compilers.  */
+
 #ifdef __STDC__
 # include <limits.h>
 #else
 # include <assert.h>
 #endif
+
+#undef $ac_func
+
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
@@ -6022,11 +7425,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -6039,7 +7452,8 @@
 
 eval "$as_ac_var=no"
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
@@ -6054,21 +7468,28 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+/* Define _doprnt to an innocuous variant, in case <limits.h> declares _doprnt.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define _doprnt innocuous__doprnt
+
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char _doprnt (); below.
     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
     <limits.h> exists even on freestanding compilers.  */
+
 #ifdef __STDC__
 # include <limits.h>
 #else
 # include <assert.h>
 #endif
+
+#undef _doprnt
+
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
@@ -6099,11 +7520,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -6116,7 +7547,8 @@
 
 ac_cv_func__doprnt=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5
 echo "${ECHO_T}$ac_cv_func__doprnt" >&6
@@ -6152,21 +7584,28 @@
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.
     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
     <limits.h> exists even on freestanding compilers.  */
+
 #ifdef __STDC__
 # include <limits.h>
 #else
 # include <assert.h>
 #endif
+
+#undef $ac_func
+
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
@@ -6197,11 +7636,21 @@
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  (eval $ac_link) 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -6214,7 +7663,8 @@
 
 eval "$as_ac_var=no"
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
 fi
 echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
@@ -6242,7 +7692,7 @@
 
 fi;
 
-credits="./CREDITS"
+credits="$srcdir/CREDITS"
 echo "$as_me:$LINENO: checking for $credits" >&5
 echo $ECHO_N "checking for $credits... $ECHO_C" >&6
 if test -r $credits ; then
@@ -6279,7 +7729,7 @@
     }
 }
 END    { print "\n};\n#define CREDITS_COUNT "  count }
-'  $credits > include/credits.h
+'  $credits > "$srcdir/include/util/credits.h"
 
 if test x$enable_debug = xyes; then
 	if test "x" = "x$PRESET_CFLAGS"; then
@@ -6299,11 +7749,11 @@
 	if test x$uninitialized = xyes; then
 		CFLAGS="$CFLAGS -Wuninitialized -O1"
 	else
-		CFLAGS="$CFLAGS -O2"
+		CFLAGS="$CFLAGS -O0"
 	fi
 else
 	if test "x" = "x$PRESET_CFLAGS"; then
-		CFLAGS="-g -Wall -O2"
+		CFLAGS="-Wall -O2"
 	fi
 fi
 
@@ -6311,7 +7761,11 @@
 	CFLAGS="$CFLAGS -fPIC -DPIC"
 fi
 
-                                                                                          ac_config_files="$ac_config_files include/Makefile mkreiserfs/Makefile resize_reiserfs/Makefile fsck/Makefile lib/Makefile Makefile reiserfscore/Makefile debugreiserfs/Makefile tune/Makefile"
+
+
+
+
+                                                                                                                                                      ac_config_files="$ac_config_files Makefile include/Makefile include/misc/Makefile include/reiserfs/Makefile include/util/Makefile libmisc/Makefile libreiserfs/Makefile libutil/Makefile utils/Makefile utils/mkfs/Makefile utils/resizer/Makefile utils/fsck/Makefile utils/debugfs/Makefile utils/tune/Makefile reiserfsprogs.spec"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
@@ -6340,13 +7794,13 @@
       # `set' does not quote correctly, so add quotes (double-quote
       # substitution turns \\\\ into \\, and sed turns \\ into \).
       sed -n \
-        "s/'/'\\\\''/g;
-    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
       ;;
     *)
       # `set' quotes correctly as required by POSIX, so do not add quotes.
       sed -n \
-        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
       ;;
     esac;
 } |
@@ -6376,13 +7830,13 @@
 # trailing colons and then remove the whole line if VPATH becomes empty
 # (actually we leave an empty line to preserve line numbers).
 if test "x$srcdir" = x.; then
-  ac_vpsub='/^[ 	]*VPATH[ 	]*=/{
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
 s/:*\$(srcdir):*/:/;
 s/:*\${srcdir}:*/:/;
 s/:*@srcdir@:*/:/;
-s/^\([^=]*=[ 	]*\):*/\1/;
+s/^\([^=]*=[	 ]*\):*/\1/;
 s/:*$//;
-s/^[^=]*=[ 	]*$//;
+s/^[^=]*=[	 ]*$//;
 }'
 fi
 
@@ -6393,7 +7847,7 @@
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_i=`echo "$ac_i" |
-         sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
   # 2. Add them.
   ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
   ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
@@ -6458,9 +7912,10 @@
 elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
   set -o posix
 fi
+DUALCASE=1; export DUALCASE # for MKS sh
 
 # Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   as_unset=unset
 else
   as_unset=false
@@ -6479,7 +7934,7 @@
   LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
   LC_TELEPHONE LC_TIME
 do
-  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
     eval $as_var=C; export $as_var
   else
     $as_unset $as_var
@@ -6658,16 +8113,17 @@
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
 else
+  test -d ./-p && rmdir ./-p
   as_mkdir_p=false
 fi
 
 as_executable_p="test -f"
 
 # Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 
 # Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
 # IFS
@@ -6694,7 +8150,7 @@
 cat >&5 <<_CSEOF
 
 This file was extended by $as_me, which was
-generated by GNU Autoconf 2.57.  Invocation command line was
+generated by GNU Autoconf 2.59.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -6738,9 +8194,9 @@
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
   --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
+		   instantiate the configuration file FILE
   --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
+		   instantiate the configuration header FILE
 
 Configuration files:
 $config_files
@@ -6757,11 +8213,10 @@
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
 config.status
-configured by $0, generated by GNU Autoconf 2.57,
+configured by $0, generated by GNU Autoconf 2.59,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
+Copyright (C) 2003 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 srcdir=$srcdir
@@ -6867,17 +8322,23 @@
 do
   case "$ac_config_target" in
   # Handling of arguments.
-  "include/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
-  "mkreiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES mkreiserfs/Makefile" ;;
-  "resize_reiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES resize_reiserfs/Makefile" ;;
-  "fsck/Makefile" ) CONFIG_FILES="$CONFIG_FILES fsck/Makefile" ;;
-  "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
   "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "reiserfscore/Makefile" ) CONFIG_FILES="$CONFIG_FILES reiserfscore/Makefile" ;;
-  "debugreiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES debugreiserfs/Makefile" ;;
-  "tune/Makefile" ) CONFIG_FILES="$CONFIG_FILES tune/Makefile" ;;
+  "include/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
+  "include/misc/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/misc/Makefile" ;;
+  "include/reiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/reiserfs/Makefile" ;;
+  "include/util/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/util/Makefile" ;;
+  "libmisc/Makefile" ) CONFIG_FILES="$CONFIG_FILES libmisc/Makefile" ;;
+  "libreiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES libreiserfs/Makefile" ;;
+  "libutil/Makefile" ) CONFIG_FILES="$CONFIG_FILES libutil/Makefile" ;;
+  "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+  "utils/mkfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/mkfs/Makefile" ;;
+  "utils/resizer/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/resizer/Makefile" ;;
+  "utils/fsck/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/fsck/Makefile" ;;
+  "utils/debugfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/debugfs/Makefile" ;;
+  "utils/tune/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/tune/Makefile" ;;
+  "reiserfsprogs.spec" ) CONFIG_FILES="$CONFIG_FILES reiserfsprogs.spec" ;;
   "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
@@ -6982,14 +8443,17 @@
 s,@AUTOMAKE@,$AUTOMAKE,;t t
 s,@AUTOHEADER@,$AUTOHEADER,;t t
 s,@MAKEINFO@,$MAKEINFO,;t t
-s,@AMTAR@,$AMTAR,;t t
 s,@install_sh@,$install_sh,;t t
 s,@STRIP@,$STRIP,;t t
 s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
 s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
 s,@AWK@,$AWK,;t t
 s,@SET_MAKE@,$SET_MAKE,;t t
 s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
 s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
 s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
 s,@MAINT@,$MAINT,;t t
@@ -7009,13 +8473,14 @@
 s,@CCDEPMODE@,$CCDEPMODE,;t t
 s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
 s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
 s,@LN_S@,$LN_S,;t t
 s,@RANLIB@,$RANLIB,;t t
 s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@UUID_LIBS@,$UUID_LIBS,;t t
-s,@CPP@,$CPP,;t t
 s,@EGREP@,$EGREP,;t t
 s,@LIBOBJS@,$LIBOBJS,;t t
+s,@UUID_LIBS@,$UUID_LIBS,;t t
+s,@PROGS_LDFLAGS@,$PROGS_LDFLAGS,;t t
 s,@LTLIBOBJS@,$LTLIBOBJS,;t t
 CEOF
 
@@ -7046,9 +8511,9 @@
       (echo ':t
   /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
       if test -z "$ac_sed_cmds"; then
-  	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
       else
-  	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
       fi
       ac_sed_frag=`expr $ac_sed_frag + 1`
       ac_beg=$ac_end
@@ -7066,21 +8531,21 @@
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
   case $ac_file in
   - | *:- | *:-:* ) # input from stdin
-        cat >$tmp/stdin
-        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
   *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
   * )   ac_file_in=$ac_file.in ;;
   esac
 
   # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
   ac_dir=`(dirname "$ac_file") 2>/dev/null ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$ac_file" : 'X\(//\)[^/]' \| \
-         X"$ac_file" : 'X\(//\)$' \| \
-         X"$ac_file" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$ac_file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7096,10 +8561,10 @@
       as_dirs="$as_dir $as_dirs"
       as_dir=`(dirname "$as_dir") 2>/dev/null ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$as_dir" : 'X\(//\)[^/]' \| \
-         X"$as_dir" : 'X\(//\)$' \| \
-         X"$as_dir" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7137,12 +8602,45 @@
     ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
     ac_top_srcdir=$ac_top_builddir$srcdir ;;
 esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
 
 
   case $INSTALL in
@@ -7164,7 +8662,7 @@
     configure_input="$ac_file.  "
   fi
   configure_input=$configure_input"Generated from `echo $ac_file_in |
-                                     sed 's,.*/,,'` by configure."
+				     sed 's,.*/,,'` by configure."
 
   # First look for the input files in the build tree, otherwise in the
   # src tree.
@@ -7173,24 +8671,24 @@
       case $f in
       -) echo $tmp/stdin ;;
       [\\/$]*)
-         # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
-         echo $f;;
+	 echo "$f";;
       *) # Relative
-         if test -f "$f"; then
-           # Build tree
-           echo $f
-         elif test -f "$srcdir/$f"; then
-           # Source tree
-           echo $srcdir/$f
-         else
-           # /dev/null tree
-           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
-         fi;;
+	 fi;;
       esac
     done` || { (exit 1); exit 1; }
 _ACEOF
@@ -7232,12 +8730,12 @@
 # NAME is the cpp macro being defined and VALUE is the value it is being given.
 #
 # ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
-ac_dB='[ 	].*$,\1#\2'
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
 ac_dC=' '
 ac_dD=',;t'
 # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
 ac_uB='$,\1#\2define\3'
 ac_uC=' '
 ac_uD=',;t'
@@ -7246,11 +8744,11 @@
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
   case $ac_file in
   - | *:- | *:-:* ) # input from stdin
-        cat >$tmp/stdin
-        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
   *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
   * )   ac_file_in=$ac_file.in ;;
   esac
 
@@ -7264,28 +8762,29 @@
       case $f in
       -) echo $tmp/stdin ;;
       [\\/$]*)
-         # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
-         echo $f;;
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
       *) # Relative
-         if test -f "$f"; then
-           # Build tree
-           echo $f
-         elif test -f "$srcdir/$f"; then
-           # Source tree
-           echo $srcdir/$f
-         else
-           # /dev/null tree
-           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
-         fi;;
+	 fi;;
       esac
     done` || { (exit 1); exit 1; }
   # Remove the trailing spaces.
-  sed 's/[ 	]*$//' $ac_file_inputs >$tmp/in
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
 
 _ACEOF
 
@@ -7308,9 +8807,9 @@
 s,[\\$`],\\&,g
 t clear
 : clear
-s,^[ 	]*#[ 	]*define[ 	][ 	]*\([^ 	(][^ 	(]*\)\(([^)]*)\)[ 	]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
 t end
-s,^[ 	]*#[ 	]*define[ 	][ 	]*\([^ 	][^ 	]*\)[ 	]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
 : end
 _ACEOF
 # If some macros were called several times there might be several times
@@ -7324,13 +8823,13 @@
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
 cat >>conftest.undefs <<\_ACEOF
-s,^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
 _ACEOF
 
 # Break up conftest.defines because some shells have a limit on the size
 # of here documents, and old seds have small limits too (100 cmds).
 echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[ 	]*#[ 	]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
 echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
 echo '  :' >>$CONFIG_STATUS
 rm -f conftest.tail
@@ -7339,7 +8838,7 @@
   # Write a limited-size here document to $tmp/defines.sed.
   echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
   # Speed up: don't consider the non `#define' lines.
-  echo '/^[ 	]*#[ 	]*define/!b' >>$CONFIG_STATUS
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
   # Work around the forget-to-reset-the-flag bug.
   echo 't clr' >>$CONFIG_STATUS
   echo ': clr' >>$CONFIG_STATUS
@@ -7366,7 +8865,7 @@
   # Write a limited-size here document to $tmp/undefs.sed.
   echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
   # Speed up: don't consider the non `#undef'
-  echo '/^[ 	]*#[ 	]*undef/!b' >>$CONFIG_STATUS
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
   # Work around the forget-to-reset-the-flag bug.
   echo 't clr' >>$CONFIG_STATUS
   echo ': clr' >>$CONFIG_STATUS
@@ -7400,10 +8899,10 @@
     else
       ac_dir=`(dirname "$ac_file") 2>/dev/null ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$ac_file" : 'X\(//\)[^/]' \| \
-         X"$ac_file" : 'X\(//\)$' \| \
-         X"$ac_file" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$ac_file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7419,10 +8918,10 @@
       as_dirs="$as_dir $as_dirs"
       as_dir=`(dirname "$as_dir") 2>/dev/null ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$as_dir" : 'X\(//\)[^/]' \| \
-         X"$as_dir" : 'X\(//\)$' \| \
-         X"$as_dir" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7454,10 +8953,10 @@
 done
 echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
 $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X$ac_file : 'X\(//\)[^/]' \| \
-         X$ac_file : 'X\(//\)$' \| \
-         X$ac_file : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X$ac_file |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7476,16 +8975,41 @@
   ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
   ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
 $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$ac_dest" : 'X\(//\)[^/]' \| \
-         X"$ac_dest" : 'X\(//\)$' \| \
-         X"$ac_dest" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$ac_dest" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
   	  /^X\(\/\/\)$/{ s//\1/; q; }
   	  /^X\(\/\).*/{ s//\1/; q; }
   	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
   ac_builddir=.
 
 if test "$ac_dir" != .; then
@@ -7511,12 +9035,45 @@
     ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
     ac_top_srcdir=$ac_top_builddir$srcdir ;;
 esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
 
 
   { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
@@ -7534,10 +9091,10 @@
   if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
     dirpart=`(dirname "$mf") 2>/dev/null ||
 $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$mf" : 'X\(//\)[^/]' \| \
-         X"$mf" : 'X\(//\)$' \| \
-         X"$mf" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$mf" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7547,36 +9104,30 @@
   else
     continue
   fi
-  grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
-  # Extract the definition of DEP_FILES from the Makefile without
-  # running `make'.
-  DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
   test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
   # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n -e '/^U = / s///p' < "$mf"`
-  test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
-  # We invoke sed twice because it is the simplest approach to
-  # changing $(DEPDIR) to its actual value in the expansion.
-  for file in `sed -n -e '
-    /^DEP_FILES = .*\\\\$/ {
-      s/^DEP_FILES = //
-      :loop
-	s/\\\\$//
-	p
-	n
-	/\\\\$/ b loop
-      p
-    }
-    /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
     # Make sure the directory exists.
     test -f "$dirpart/$file" && continue
     fdir=`(dirname "$file") 2>/dev/null ||
 $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$file" : 'X\(//\)[^/]' \| \
-         X"$file" : 'X\(//\)$' \| \
-         X"$file" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7592,10 +9143,10 @@
       as_dirs="$as_dir $as_dirs"
       as_dir=`(dirname "$as_dir") 2>/dev/null ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-         X"$as_dir" : 'X\(//\)[^/]' \| \
-         X"$as_dir" : 'X\(//\)$' \| \
-         X"$as_dir" : 'X\(/\)' \| \
-         .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
 echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
   	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
@@ -7648,4 +9199,4 @@
 
 
 echo
-echo Type \'make\' to compile reiserfsprogs
+echo Type \'make\' to compile reiserfsprogs and \'make install\' to install it.
diff --git a/configure.in b/configure.in
index bcb4789..6229f3c 100644
--- a/configure.in
+++ b/configure.in
@@ -1,41 +1,87 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT(version.h)
+AC_INIT(include/reiserfs/libreiserfs.h)
 AC_CANONICAL_HOST
 AC_PREREQ(2.50)
 
+AH_TEMPLATE([PACKAGE], [Define this to be the name of the package.])
+AH_TEMPLATE([VERSION], [Define to the version of the package.])
 AH_TEMPLATE([HAVE_LIBUUID], [Define for enable libuuid using.])
 AH_TEMPLATE([ENABLE_DEBUG], [Define for enable debug info.])
 
-AM_INIT_AUTOMAKE(reiserfsprogs, 3.6.19)
+dnl AH_TEMPLATE([LIBREISERFS_MAX_INTERFACE_VERSION], [Define to the max interface version.])
+dnl AH_TEMPLATE([LIBREISERFS_MIN_INTERFACE_VERSION], [Define to the min interface version.])
+
+LIBREISERFS_MAJOR_VERSION=3
+LIBREISERFS_MINOR_VERSION=6
+LIBREISERFS_MICRO_VERSION=20
+LIBREISERFS_VERSION=$LIBREISERFS_MAJOR_VERSION.$LIBREISERFS_MINOR_VERSION.$LIBREISERFS_MICRO_VERSION
+
+dnl LIBREISERFS_INTERFACE_AGE=0
+dnl LIBREISERFS_BINARY_AGE=0
+
+dnl LT_RELEASE=$LIBREISERFS_MAJOR_VERSION.$LIBREISERFS_MINOR_VERSION
+
+dnl LT_CURRENT=`expr $LIBREISERFS_MICRO_VERSION - $LIBREISERFS_INTERFACE_AGE`
+dnl LT_REVISION=$LIBREISERFS_INTERFACE_AGE
+dnl LT_AGE=`expr $LIBREISERFS_BINARY_AGE - $LIBREISERFS_INTERFACE_AGE`
+
+PACKAGE=reiserfsprogs
+VERSION=$LIBREISERFS_VERSION
+
+AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
+AM_CONFIG_HEADER(config.h)
 AM_MAINTAINER_MODE
 
+dnl AC_DEFINE_UNQUOTED(LIBREISERFS_MAX_INTERFACE_VERSION, $LIBREISERFS_BINARY_AGE)
+dnl AC_DEFINE_UNQUOTED(LIBREISERFS_MIN_INTERFACE_VERSION, $LIBREISERFS_INTERFACE_AGE)
+
+
+AC_ARG_ENABLE(debug,
+	[  --enable-debug      enable extra checks], ,
+	enable_debug=no
+)
+
+PROGS_LDFLAGS=""
+
+AC_ARG_ENABLE(static,
+    	[  --enable-static     build all static], ,
+		enable_static=no
+)
+
+if test x$enable_static = xyes; then
+	PROGS_LDFLAGS=-static
+fi
+
 dnl We install in /sbin, the utils are to be available on boot
 dnl AC_PREFIX(/)
 
-AM_CONFIG_HEADER(include/config.h)
-
-AC_SUBST(sbindir)
-
 PRESET_CFLAGS=$CFLAGS
 
 dnl Checks for programs.
 AC_PROG_CC
+AC_PROG_CPP
 AC_PROG_AWK 
 AC_PROG_INSTALL
 AC_PROG_LN_S
 AC_PROG_MAKE_SET
 AC_PROG_RANLIB
 
+AM_ENABLE_SHARED
+dnl AM_PROG_LIBTOOL
+
 dnl Checks for libraries.
 
 # Check for LIBUUID
+LIBS=""
 AC_CHECK_LIB(uuid, uuid_generate, , AC_MSG_WARN(libuuid could not be found))
 UUID_LIBS="$LIBS"
-AC_SUBST(UUID_LIBS)
 
 dnl Checks for header files.
 AC_HEADER_STDC
-AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h)
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS(print.h errno.h fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h)
+AC_CHECK_HEADERS([asm/unaligned.h])
+
 AC_HEADER_MAJOR
 
 dnl Checks for typedefs, structures, and compiler characteristics.
@@ -43,11 +89,7 @@
 AC_C_INLINE
 AC_TYPE_SIZE_T
 AC_STRUCT_ST_RDEV
-
-AC_ARG_ENABLE(debug, [  --enable-debug          enable extra checks], 
-	      enable_debug=yes,
-	      enable_debug=no
-)
+AC_C_BIGENDIAN
 
 dnl Check for the compiler pic option.
 AC_CACHE_CHECK([whether -fPIC works], [pic], [
@@ -82,7 +124,7 @@
 # Check for large file
 AC_SYS_LARGEFILE
 
-if test -z "${ac_cv_sys_file_offset_bits}"; then
+if test x${ac_cv_sys_file_offset_bits} = xno; then
 	AC_MSG_WARN(Can't detect right _FILE_OFFSET_BITS. Will be forced to 64bit.)
 	ac_cv_sys_file_offset_bits=64
 fi
@@ -101,6 +143,7 @@
 
 dnl Checks for library functions.
 AC_PROG_GCC_TRADITIONAL
+AC_FUNC_STAT
 AC_FUNC_MEMCMP
 AC_FUNC_STRFTIME
 AC_FUNC_VPRINTF
@@ -117,7 +160,7 @@
   fi
 ])
 
-credits="./CREDITS"
+credits="$srcdir/CREDITS"
 AC_MSG_CHECKING(for $credits)
 if test -r $credits ; then
     AC_MSG_RESULT(yes)
@@ -150,7 +193,7 @@
     }
 }
 END    { print "\n};\n#define CREDITS_COUNT "  count }
-']  $credits > include/credits.h
+']  $credits > "$srcdir/include/util/credits.h"
 
 if test x$enable_debug = xyes; then
 	if test "x" = "x$PRESET_CFLAGS"; then
@@ -170,11 +213,11 @@
 	if test x$uninitialized = xyes; then
 		CFLAGS="$CFLAGS -Wuninitialized -O1"
 	else
-		CFLAGS="$CFLAGS -O2"
+		CFLAGS="$CFLAGS -O0"
 	fi
 else
 	if test "x" = "x$PRESET_CFLAGS"; then
-		CFLAGS="-g -Wall -O2"
+		CFLAGS="-Wall -O2"
 	fi
 fi
 
@@ -182,16 +225,30 @@
 	CFLAGS="$CFLAGS -fPIC -DPIC"
 fi
 
+dnl AC_SUBST(LT_RELEASE)
+dnl AC_SUBST(LT_CURRENT)
+dnl AC_SUBST(LT_REVISION)
+dnl AC_SUBST(LT_AGE)
+
+AC_SUBST(UUID_LIBS)
+AC_SUBST(PROGS_LDFLAGS)
+
 AC_OUTPUT(
-    include/Makefile 
-    mkreiserfs/Makefile 
-    resize_reiserfs/Makefile 
-    fsck/Makefile 
-    lib/Makefile 
     Makefile 
-    reiserfscore/Makefile 
-    debugreiserfs/Makefile 
-    tune/Makefile)
+    include/Makefile 
+    include/misc/Makefile
+    include/reiserfs/Makefile 
+    include/util/Makefile
+    libmisc/Makefile
+    libreiserfs/Makefile 
+    libutil/Makefile
+    utils/Makefile
+    utils/mkfs/Makefile 
+    utils/resizer/Makefile 
+    utils/fsck/Makefile
+    utils/debugfs/Makefile
+    utils/tune/Makefile
+    reiserfsprogs.spec)
 
 echo
-echo Type \'make\' to compile reiserfsprogs
+echo Type \'make\' to compile reiserfsprogs and \'make install\' to install it.
diff --git a/debugreiserfs/Makefile.am b/debugreiserfs/Makefile.am
deleted file mode 100644
index c06296a..0000000
--- a/debugreiserfs/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-sbin_PROGRAMS = debugreiserfs
-
-debugreiserfs_SOURCES = debugreiserfs.c pack.c unpack.c stat.c corruption.c scan.c recover.c debugreiserfs.h
-man_MANS = debugreiserfs.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
diff --git a/debugreiserfs/Makefile.in b/debugreiserfs/Makefile.in
deleted file mode 100644
index 7c23b92..0000000
--- a/debugreiserfs/Makefile.in
+++ /dev/null
@@ -1,464 +0,0 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UUID_LIBS = @UUID_LIBS@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-sbin_PROGRAMS = debugreiserfs
-
-debugreiserfs_SOURCES = debugreiserfs.c pack.c unpack.c stat.c corruption.c scan.c recover.c debugreiserfs.h
-man_MANS = debugreiserfs.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-subdir = debugreiserfs
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-sbin_PROGRAMS = debugreiserfs$(EXEEXT)
-PROGRAMS = $(sbin_PROGRAMS)
-
-am_debugreiserfs_OBJECTS = debugreiserfs.$(OBJEXT) pack.$(OBJEXT) \
-	unpack.$(OBJEXT) stat.$(OBJEXT) corruption.$(OBJEXT) \
-	scan.$(OBJEXT) recover.$(OBJEXT)
-debugreiserfs_OBJECTS = $(am_debugreiserfs_OBJECTS)
-debugreiserfs_LDADD = $(LDADD)
-debugreiserfs_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
-	$(top_srcdir)/reiserfscore/libcore.a
-debugreiserfs_LDFLAGS =
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/corruption.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/debugreiserfs.Po ./$(DEPDIR)/pack.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/recover.Po ./$(DEPDIR)/scan.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/stat.Po ./$(DEPDIR)/unpack.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(debugreiserfs_SOURCES)
-
-NROFF = nroff
-MANS = $(man_MANS)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(debugreiserfs_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  debugreiserfs/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(sbindir)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f"; \
-	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f $(DESTDIR)$(sbindir)/$$f"; \
-	  rm -f $(DESTDIR)$(sbindir)/$$f; \
-	done
-
-clean-sbinPROGRAMS:
-	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
-debugreiserfs$(EXEEXT): $(debugreiserfs_OBJECTS) $(debugreiserfs_DEPENDENCIES) 
-	@rm -f debugreiserfs$(EXEEXT)
-	$(LINK) $(debugreiserfs_LDFLAGS) $(debugreiserfs_OBJECTS) $(debugreiserfs_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/corruption.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugreiserfs.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recover.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unpack.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-uninstall-info-am:
-
-man8dir = $(mandir)/man8
-install-man8: $(man8_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(man8dir)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
-	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
-	done
-uninstall-man8:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
-	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(MANS)
-
-installdirs:
-	$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir)
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-exec-am: install-sbinPROGRAMS
-
-install-info: install-info-am
-
-install-man: install-man8
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-man uninstall-sbinPROGRAMS
-
-uninstall-man: uninstall-man8
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-sbinPROGRAMS ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man8 install-sbinPROGRAMS \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man8 uninstall-sbinPROGRAMS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/debugreiserfs/corruption.c b/debugreiserfs/corruption.c
deleted file mode 100644
index d584130..0000000
--- a/debugreiserfs/corruption.c
+++ /dev/null
@@ -1,1312 +0,0 @@
-/*
- * Copyright 2000-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "debugreiserfs.h"
-#include <time.h>
-
-extern struct reiserfs_fsstat g_stat_info;
-
-int  do_one_ih_corrupt (struct item_head * ih, unsigned int nr_bytes);
-int  do_one_ih_random_corrupt (struct item_head * ih);
-
-void do_one_corruption_in_one_block (reiserfs_filsys_t * fs, struct buffer_head * bh, char * corruption_command);
-int corrupt_block_header (struct block_head * blkh, unsigned int offset, unsigned int bytes );
-void do_one_block_random_corrupt (struct buffer_head * bh);
-
-static int str2int (char * str, int * res)
-{
-    int val;
-    char * tmp;
-
-    val = (int) strtol (str, &tmp, 0);
-    if (tmp == str)
-		/* could not convert string into a number */
-		return 0;
-    *res = val;
-    return 1;
-}
-
-static int get_rand (double min, double max) {
-
-	/* srand (time (0)); */
-	int ret;
-
-	ret =  (int)(min + (int)((max - min + 1) * rand() / (RAND_MAX + 1.0)));
-	if ((ret < min) || (ret > max))
-		die ("get_rand failed: min %d, max %d, returned %d\n", (int)min, (int)max, ret);
-
-	return ret;
-}
-
-static void edit_journal_params (struct journal_params * jp)
-{
-    char * str;
-    size_t n;
-    int num;
-
-    printf ("Journal parameters:\n");
-    printf ("\tDevice: current: %x: new:", get_jp_journal_dev (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_dev (jp, num);
-
-    printf ("\tFirst block: current: %d: new:",
-			get_jp_journal_1st_block (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_1st_block (jp, num);
-
-    printf ("\tSize: current: %d: new:", get_jp_journal_size (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_size (jp, num);
-
-    printf ("\tMagic number: current: %d: new:", get_jp_journal_magic (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_magic (jp, num);
-
-    printf ("\tMax transaction size: current: %d: new:",
-			get_jp_journal_max_trans_len (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_max_trans_len (jp, num);
-
-    printf ("\tMax batch size: current: %d: new:",
-			get_jp_journal_max_batch (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_max_batch (jp, num);
-
-    printf ("\tMax commit age: current: %d: new:",
-			get_jp_journal_max_commit_age (jp));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_jp_journal_max_commit_age (jp, num);
-}
-
-/* this allows to edit all super block fields */
-static void edit_super_block (reiserfs_filsys_t * fs)
-{
-    char * str;
-    size_t n;
-    int num;
-
-    str = 0;
-    n = 0;
-
-    /* bs_block_count */
-    printf ("\tBlock count: current: %u: new:",
-			get_sb_block_count (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_block_count (fs->fs_ondisk_sb, num);
-
-    
-    /* sb_free_blocks */
-    printf ("\tFree block count: current: %u: new:",
-			get_sb_free_blocks (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_free_blocks (fs->fs_ondisk_sb, num);
-
-    /* sb_root_block */
-    printf ("\tRoot block: current: %u: new:",
-			get_sb_root_block (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_root_block (fs->fs_ondisk_sb, num);
-
-    /* sb_journal */
-    edit_journal_params (sb_jp (fs->fs_ondisk_sb));
-    
-    /* sb_blocksize */
-    printf ("\tBlocksize: current: %u: new:",
-			get_sb_block_size (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_block_size (fs->fs_ondisk_sb, num);
-
-    /* sb_oid_maxsize */
-    printf ("\tMax objectid size: current: %u: new:",
-			get_sb_oid_maxsize (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_oid_maxsize (fs->fs_ondisk_sb, num);
-
-    /* sb_oid_cursize */
-    printf ("\tCur objectid size: current: %u: new:",
-			get_sb_oid_cursize (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_oid_cursize (fs->fs_ondisk_sb, num);
-	
-    /* sb_state */
-    printf ("\tUmount state: current: %u: new:",
-			get_sb_umount_state (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_umount_state (fs->fs_ondisk_sb, num);
-
-    /* char s_magic [10]; */
-    printf ("\tMagic: current: \"%s\": new:", fs->fs_ondisk_sb->s_v1.s_magic);
-    getline (&str, &n, stdin);
-    if (strcmp (str, "\n"))
-		strncpy (fs->fs_ondisk_sb->s_v1.s_magic, str, n > 10 ? 10 : n);
-    
-    /* __u16 sb_fsck_state; */
-    printf ("\tFielsystem state: current: %u: new:", get_sb_fs_state (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_fs_state (fs->fs_ondisk_sb, num);
-	
-    /* __u32 sb_hash_function_code; */
-    printf ("\tHash code: current: %u: new (tea %d, r5 %d, rupasov %d):",
-			get_sb_hash_code (fs->fs_ondisk_sb), TEA_HASH, R5_HASH, YURA_HASH);
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_hash_code (fs->fs_ondisk_sb, num);
-    
-    /* __u16 sb_tree_height; */
-    printf ("\tTree height: current: %u: new:",
-			get_sb_tree_height (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_tree_height (fs->fs_ondisk_sb, num);
-    
-    /* __u16 sb_bmap_nr; */
-    printf ("\tNumber of bitmaps: current: %u: new:",
-			get_sb_bmap_nr (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_bmap_nr (fs->fs_ondisk_sb, num);
-
-    /* __u16 sb_version; */
-    printf ("\tFilesystem format: current: %u: new:",
-			le16_to_cpu (fs->fs_ondisk_sb->s_v1.sb_version));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_version (fs->fs_ondisk_sb, num);
-
-    /* __u16 sb_reserved_for_journal; */
-    printf ("\tSpace reserved for journal: current: %u: new:",
-			get_sb_reserved_for_journal (fs->fs_ondisk_sb));
-    getline (&str, &n, stdin);
-    if (str2int (str, &num))
-		set_sb_reserved_for_journal (fs->fs_ondisk_sb, num);
-
-    print_block (stdout, fs, fs->fs_super_bh);
-    if (user_confirmed (stderr, "Is this ok ? [N/Yes]: ", "Yes\n")) {
-		mark_buffer_dirty (fs->fs_super_bh);
-		bwrite (fs->fs_super_bh);
-    }
-}
-
-
-static void corrupt_clobber_hash (char * name, struct item_head * ih, 
-								  struct reiserfs_de_head * deh)
-{
-    printf ("\tCorrupting deh_offset of entry \"%s\" of [%u %u]\n", name,
-			get_key_dirid (&ih->ih_key), get_key_objectid (&ih->ih_key));
-    set_deh_offset (deh, 700);
-}
-
-
-/* this reads list of desired corruptions from stdin and perform the
-   corruptions. Format of that list:
-   A hash_code
-   C name objectid     - 'C'ut entry 'name' from directory item with 'objectid'
-   H name objectid     - clobber 'H'hash of entry 'name' of directory 'objectid'
-   I item_num pos_in_item  make pos_in_item-th slot of indirect item to point out of device
-   O item_num          - destroy item 'O'rder - make 'item_num'-th to have key bigger than 'item_num' + 1-th item
-   D item_num          - 'D'elete item_num-th item
-   S item_num value    - change file size (item_num-th item must be stat data)
-   F item_num value    - change sd_first_direct_byte of stat data
-   J item_num objectid
-   E name objectid new - change entry's deh_objectid to new
-   P                   - print the block
-   B offset bytes_to_corrupt - corrupt bytes_to_corrupt bytes in block header,
-                               start from offset
-*/
-
-void do_corrupt_one_block (reiserfs_filsys_t * fs, char * fline)
-{
-    struct buffer_head * bh;
-    char * line = 0;
-    size_t n = 0;
-    unsigned long block;
-
-    block = certain_block (fs);
-    printf ("block = %lu\n", block);
-    if (block == fs->fs_super_bh->b_blocknr) {
-		edit_super_block (fs);
-		return;
-    }
-
-    if (!fs->fs_bitmap2) {
-        struct buffer_head * bm_bh;
-        unsigned long bm_block;
-        
-        if (spread_bitmaps (fs))
-            bm_block = ( block / (fs->fs_blocksize * 8) ) ? 
-				(block / (fs->fs_blocksize * 8)) * (fs->fs_blocksize * 8) : 
-			fs->fs_super_bh->b_blocknr + 1;
-        else
-            bm_block = fs->fs_super_bh->b_blocknr + 1 + (block / (fs->fs_blocksize * 8));
-        
-        bm_bh = bread (fs->fs_dev, bm_block, fs->fs_blocksize);
-        if (bm_bh) {
-            if ( misc_test_bit((block % (fs->fs_blocksize * 8)), bm_bh->b_data) )
-                fprintf (stderr, "%lu is used in ondisk bitmap\n", block);
-            else
-				fprintf (stderr, "%lu is free in ondisk bitmap\n", block);
-	        
-            brelse (bm_bh);
-        }
-    } else {
-        if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, block))
-			fprintf (stderr, "%lu is used in ondisk bitmap\n", block);
-        else
-			fprintf (stderr, "%lu is free in ondisk bitmap\n", block);
-    }
-    
-    /* READ block */
-    bh = bread (fs->fs_dev, block, fs->fs_blocksize);
-    if (!bh) {
-		printf ("corrupt_one_block: bread fialed\n");
-		return;
-    }
-
-    if (who_is_this (bh->b_data, fs->fs_blocksize) != THE_LEAF) {
-		printf ("Can not corrupt not a leaf node\n");
-		brelse (bh);
-		return;
-    }
-
-    printf ("Corrupting block %lu..\n", bh->b_blocknr);
-
-    if (data(fs)->log_file_name) {
-		printf ("Log file : %s\n", data(fs)->log_file_name);
-    } else {
-		printf ("No Log file specified\n");
-    }
-
-    if (fline != NULL) {
-		do_one_corruption_in_one_block (fs, bh, fline);
-		if ((data(fs)->log_file_name) && (data(fs)->log)) {
-			fprintf (data(fs)->log, "%lu\n", block);
-			fprintf (data(fs)->log, "%s\n", fline);
-		}
-    } else {
-		/* Get list of corruptions from stdin */
-        while (getline (&line, &n, stdin) != -1) {
-			if ( line [0] == '\n' ) {
-				free (line);
-				line = 0;
-				n = 0;
-				break;
-			}
-			do_one_corruption_in_one_block (fs, bh, line);
-			if ((data(fs)->log_file_name) && (data(fs)->log)) {
-				fprintf (data(fs)->log, "%lu\n", block);
-				fprintf (data(fs)->log, "%s\n", line);
-			}
-			
-			free (line);
-			line = 0;
-			n = 0;
-		}
-    }
-
-    printf ("Done\n");
-    bwrite(bh);
-    brelse (bh);
-    return;
-}
-
-void do_one_corruption_in_one_block (reiserfs_filsys_t * fs,
-									 struct buffer_head * bh,
-									 char * corruption_command)
-{
-    int i, j;
-    struct item_head * ih;
-    int item_num;
-    int item_numbers;
-    int bytes_to_corrupt;
-    char code, name [100];
-    __u32 objectid, new_objectid;
-    int value;
-    int hash_code;
-    unsigned int pos_in_item;
-    int type, format;
-
-    printf ("corruption_command  : %s", corruption_command);
-
-    switch (corruption_command [0]) {
-	case '#':
-	case '\n':
-		break;
-		
-	case '?':
-		printf ("A hash_code     - reset hAsh code in super block\n"
-				"T item_num type (0, 1, 2, 3) format (0, 1)\n"
-				"C name objectid - Cut entry 'name' from directory item with 'objectid'\n"
-				"H name objectid - clobber Hash of entry 'name' of directory 'objectid'\n"
-				"I item_num pos_in_item  make pos_in_tem-th slot of Indirect item to point out of device\n"
-				"O item_num      - destroy item Order - make 'item_num'-th to have key bigger than 'item_num' + 1-th item\n"
-				"D item_num      - Delete item_num-th item\n"
-				"S item_num value - change file Size (item_num-th item must be stat data)\n"
-				"F item_num value - change sd_First_direct_byte of stat data\n"
-				"J item_num objectid - set 'obJectid' of 'item_num'-th item\n"
-				"E name objectid objectid - set deh_objectid of an entry to objectid\n"
-				"N item_numbers bytes_to_corrupt - corrupt bytes_to_corrupt in number of bytes in item_numbers items\n"
-				"B offset bytes_to_corrupt - corrupt bytes_to_corrupt in block_header, start corruption from offset\n");
-		
-	    break;
-		
-	case 'P':
-		print_block (stderr, fs, bh, 3, -1, -1);
-		break;
-	    
-	case 'A':
-		/* corrupt hash record in super block */
-		if (sscanf (corruption_command, "%c %d\n", &code, &hash_code) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		reiserfs_warning (stderr, "Changing %s to %s\n",
-						  code2name (get_sb_hash_code (fs->fs_ondisk_sb)),
-						  code2name (hash_code));
-		set_sb_hash_code (fs->fs_ondisk_sb, hash_code);
-		break;
-	    
-	case 'C': /* cut entry */
-	case 'H': /* make hash wrong */
-		if (sscanf (corruption_command, "%c %s %u\n", &code, name, &objectid) != 3) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-	  }
-		
-		ih = B_N_PITEM_HEAD (bh, 0);
-		for (i = 0; i < get_blkh_nr_items (B_BLK_HEAD (bh)); i ++, ih ++) {
-			struct reiserfs_de_head * deh;
-			/* look for property objectid */
-			if (get_key_objectid (&ih->ih_key) != objectid || !is_direntry_ih (ih))
-				continue;
-
-			deh = B_I_DEH (bh, ih);
-			
-			for (j = 0; j < get_ih_entry_count (ih); j ++, deh ++) {
-				/* look for proper entry */
-				if (name_in_entry_length (ih, deh, j) == (int)strlen (name) &&
-					!strncmp (name, name_in_entry (deh, j), strlen (name)))
-					break;
-			}
-			if (j == get_ih_entry_count (ih)) {
-				printf ("Can't find entry %s\n", name);
-				exit (1);
-			}
-			switch (code) {
-			case 'H' : /* clobber hash */
-				corrupt_clobber_hash (name, ih, deh);
-				break;
-
-			case 'C' : /* cut entry */
-				cut_entry (fs, bh, i, j, 1);
-				break;
-
-			default:
-				printf ("Unknown command found\n");
-			}
-		}
-
-		if (!B_IS_IN_TREE (bh)) {
-			printf ("NOTE: block is deleted from the tree\n");
-			exit (0);
-		}
-		break;
-		
-	case 'E': /* set objectid : used to simulate objectid sharing problem */
-		if (sscanf (corruption_command, "%c %s %u %d\n", &code, name, &objectid, &new_objectid) != 4) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		ih = B_N_PITEM_HEAD (bh, 0);
-		for (i = 0; i < get_blkh_nr_items (B_BLK_HEAD (bh)); i ++, ih ++) {
-			struct reiserfs_de_head * deh;
-			/* look for property objectid */
-			if (get_key_objectid (&ih->ih_key) != objectid || !is_direntry_ih (ih))
-				continue;
-			deh = B_I_DEH (bh, ih);
-			set_deh_objectid (deh, new_objectid);
-			break;
-		}  
-		break;
-		
-	case 'T': /* set type of item */
-	    if (sscanf (corruption_command, "%c %d %d %d\n", &code, &item_num, &type, &format) != 4) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-	    }
-	    if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-			printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
-			return;
-	    }
-		
-	    ih = B_N_PITEM_HEAD (bh, item_num);
-	    set_ih_key_format (ih, format);
-	    set_type (format, &ih->ih_key, type);
-		
-	    break;
-		
-	case 'J': /* set objectid : used to simulate objectid sharing problem */
-	    if (sscanf (corruption_command, "%c %d %d\n", &code, &item_num, &objectid) != 3) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-	    }
-	    if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-			printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
-			return;
-	    }
-	    ih = B_N_PITEM_HEAD (bh, item_num);
-	    set_key_objectid (&ih->ih_key, objectid);
-	    break;
-		
-	case 'I': /* break unformatted node pointer */
-	    if (sscanf (corruption_command, "%c %d %u\n", &code, &item_num, &pos_in_item) != 3) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-	    }
-	    if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-			printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
-			return;
-	    }
-	    ih = B_N_PITEM_HEAD (bh, item_num);
-	    if (!is_indirect_ih (ih) || pos_in_item >= I_UNFM_NUM (ih)) {
-	        reiserfs_warning (stderr, "Not an indirect item or there is "
-							  "not so many unfm ptrs in it\n");
-			return;
-	    }
-	    d32_put((__u32 *)B_I_PITEM (bh, ih), pos_in_item, 
-		    get_sb_block_count (fs->fs_ondisk_sb) + 100);
-	    break;
-	    
-	case 'D': /* delete item */
-	    if (sscanf (corruption_command, "%c %d\n", &code, &item_num) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-	    }
-	    if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-			printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
-			return;
-	    }
-	    delete_item (fs, bh, item_num);
-	    break;
-		
-	case 'O': /* make item out of order */
-		{
-			struct key * key;
-			if (sscanf (corruption_command, "%c %d\n", &code, &item_num) != 2) {
-				printf ("Wrong format \'%c\'\n", corruption_command [0]);
-				return;
-			}
-			if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-				printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
-				return;
-			}
-			
-			/* destroy item order */
-			
-			if (item_num == get_blkh_nr_items (B_BLK_HEAD (bh)) - 1) {
-				printf ("can not destroy order\n");
-				return;
-			}
-			ih = B_N_PITEM_HEAD (bh, item_num);
-			key = &(ih + 1)->ih_key;
-			set_key_dirid (&ih->ih_key, get_key_dirid (key) + 1);
-			
-			break;
-		}  
-	case 'S': /* corrupt st_size */
-		{
-			/* fixme: old stat data only */
-			struct stat_data_v1 * sd;
-			
-			if (sscanf (corruption_command, "%c %d %d\n", &code, &item_num, &value) != 3) {
-				printf ("Wrong format \'%c\'\n", corruption_command [0]);
-				return;
-			}
-			if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-				printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
-				return;
-			}
-			ih = B_N_PITEM_HEAD (bh, item_num);
-			
-			sd = (struct stat_data_v1 *)B_I_PITEM (bh, ih); 
-			reiserfs_warning (stderr, "Changing sd_size of %k from %d to %d\n",
-							  &ih->ih_key, sd_v1_size(sd), value);
-			set_sd_v1_size( sd, value );
-			break;
-		}
-		
-    case 'F': /*         st_first_direct_byte */
-		{
-			/* fixme: old stat data only */
-			struct stat_data_v1 * sd;
-			
-			if (sscanf (corruption_command, "%c %d %d\n", &code, &item_num, &value) != 3) {
-				printf ("Wrong format \'%c\'\n", corruption_command [0]);
-				return;
-			}
-			if (item_num > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-				printf ("Wrong format \'%c\', wrong item_num \n",
-						corruption_command [0]);
-				return;
-			}
-			ih = B_N_PITEM_HEAD (bh, item_num);
-			
-			sd = (struct stat_data_v1 *)B_I_PITEM (bh, ih); 
-			reiserfs_warning (stderr, "Changing sd_first_direct_byte of %k from %d to %d\n",
-							  &ih->ih_key, sd_v1_first_direct_byte(sd), value);		
-			set_sd_v1_first_direct_byte( sd, value );
-			break;
-		}
-		
-	case 'N': /* corrupt N number of items */
-	    if (sscanf (corruption_command, "%c %d %d\n",
-					&code, &item_numbers, &bytes_to_corrupt) != 3) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-	    }
-		
-	    if (item_numbers > get_blkh_nr_items (B_BLK_HEAD (bh))) {
-			printf ("Wrong item_numbers %d expected not more then %d\n",
-					item_numbers,
-					get_blkh_nr_items (B_BLK_HEAD (bh)));
-			return;
-	    }
-		
-	    for (i = 0; i < item_numbers; i++) { 
-			printf ("Do corruptions :  %d item header; \n", i );
-			ih = B_N_PITEM_HEAD (bh, i);
-			do_one_ih_corrupt (ih, bytes_to_corrupt);
-			printf ("Ok\n");
-	    }
-		
-	    break;
-	case 'B' :
-		{
-			struct block_head * blkh;
-			unsigned int offset;
-			
-			if (sscanf (corruption_command, "%c %d %d\n",
-						&code, &offset, &bytes_to_corrupt) != 3) {
-				printf ("Wrong format \'%c\'\n", corruption_command [0]);
-				return;
-			}
-			
-			blkh = B_BLK_HEAD (bh);
-			corrupt_block_header (blkh, offset, bytes_to_corrupt);
-			break;
-		}
-		
-	default:
-		printf ("Unknown command found\n");
-	} 
-    mark_buffer_dirty (bh);
-    return;
-}
-
-/* corrupt first nr_bytes bytes in item header */
-int do_one_ih_corrupt (struct item_head * ih, unsigned int nr_bytes)
-{
-	if (nr_bytes > IH_SIZE) {
-		printf ("Bad byte number %u expected not more then %lu\n", nr_bytes,
-				(unsigned long)IH_SIZE);
-		exit (1);
-	}
-
-	if (memset ((char *)ih, 0, nr_bytes) != ih ) {
-		perror ("do_one_ih_corrupt: memset failed");
-		exit (1);
-	}
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "\tfirst %u bytes corrupted\n", nr_bytes);
-
-	printf ("\tfirst %u bytes corrupted\n", nr_bytes);
-	return 0;
-}
-
-/* item header random corruption */
-int do_one_ih_random_corrupt (struct item_head * ih)
-{
-	unsigned int i;
-	unsigned int from;
-	unsigned int count;
-		
-	from = get_rand (0,  IH_SIZE - 1);
-	count = get_rand (1, IH_SIZE);
-
-	if (from + count > IH_SIZE)
-		count = IH_SIZE - from;
-
-	for (i = from; i < from + count; i ++)
-		((char *)ih)[i] = get_rand(0, 255);
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "\tfrom %u ( %u )\n", from, count);
-
-	printf ("\tfrom %u ( %u )\n",  from, count);
-	return 0;
-}
-
-/* Corrupt n bytes in block header */
-int corrupt_block_header (struct block_head * blkh, unsigned int offset, 
-			  unsigned int bytes) 
-{
-	if ((offset + bytes) > BLKH_SIZE) {
-		printf ("Bad offset number: %u or bad bytes number: %u, the suumary "
-			"value expected not more then %lu\n", offset, bytes, 
-			(unsigned long)BLKH_SIZE);
-		exit (1);
-	} 
-
-	if (memset ((char *)blkh, 0, bytes) != blkh ) {
-		perror ("corrupt_block_head: memset failed");
-		exit (1);   
-	}
-
-	printf ("offset : %u, corrupt %u bytes\n", offset, bytes);
-	return 0;
-}
-
-/* corrupt random number of bytes within block header started from random
-   offset */
-void do_one_blkh_random_corrupt (struct buffer_head * bh)
-{
-	struct block_head * blkh;
-	unsigned int from;
-	unsigned int count;
-	unsigned int i;
-
-	from = get_rand (0, BLKH_SIZE - 1);
-	count = get_rand (1, BLKH_SIZE);
-
-	blkh = B_BLK_HEAD (bh);
-
-	if (from + count > BLKH_SIZE)
-		count = BLKH_SIZE - from;
-
-	for (i = from; i < from + count; i ++)
-		((char *)blkh)[i] = get_rand(0, 255);
-
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "# : %lu #    ", bh->b_blocknr);
-		fprintf (data(fs)->log, "from %u (%u)\n", from, count);
-	}
-
-	printf ("# : %lu #   ", bh->b_blocknr);
-	printf ("from %u (%u)\n", from, count);
-
-}
-
-void do_leaves_corruption (reiserfs_filsys_t * fs,
-						   unsigned long nr_leaves_cr) 
-						   
-{
-	struct buffer_head * bh;
-    unsigned long nr_leaves = 0;
-	unsigned int i, should_be_corrupted;
-
-	srand (time (0));
-	printf ("%lu leaves will be corrupted\n", nr_leaves_cr);
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "Block headers in %lu leaves will be corrupted\n", nr_leaves_cr);
-	}
-
-    if (reiserfs_open_ondisk_bitmap (fs) < 0)
-		reiserfs_exit (1, "Could not open ondisk bitmap");
-
-    for (i = 0; (i < get_sb_block_count (fs->fs_ondisk_sb)) &&
-			 nr_leaves < nr_leaves_cr; i ++) {
-
-		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
-			continue;
-
-		bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-		if (!bh) {
-			reiserfs_warning (stderr, "could not read block %lu\n", i);
-			continue;
-		}
-
-		if (who_is_this (bh->b_data, bh->b_size) != THE_LEAF) {
-			brelse (bh);	
-			continue;
-		}
-
-		if ((!is_leaf_node (bh)) || (block_of_journal (fs, i))) {
-			brelse (bh);	
-			continue;
-		}
-
-		should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-		if (should_be_corrupted == 0)
-		{
-			brelse (bh);
-			continue;
-		}
-		do_one_blkh_random_corrupt (bh);
-		/* do_one_block_random_corrupt (bh); */
-		mark_buffer_dirty (bh);
-		bwrite(bh);
-		brelse (bh);
-		nr_leaves ++;
-	}
-
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log,
-				 "%lu leaves WERE corrupted\n",
-				 nr_leaves);
-	}
-
-	printf ("%lu leaves WERE corrupted\n", nr_leaves);
-
-	reiserfs_close_ondisk_bitmap (fs);
-	return;
-}
-
-void do_one_block_random_corrupt (struct buffer_head * bh) 
-{
-	unsigned int from = get_rand (0, bh->b_size - 1);
-	unsigned int count = get_rand (1, bh->b_size);
-	unsigned int i;
-
-	if (from + count > bh->b_size)
-		count = bh->b_size - from;
-
-	for (i = from; i < from + count; i ++)
-		((char *)bh->b_data)[i] = get_rand(0, 255);
-
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "# block %lu: ", bh->b_blocknr);
-		fprintf (data(fs)->log, "from %u ( %u )\n", from, count);
-	}
-
-	printf ("# block %lu: ", bh->b_blocknr);
-	printf ("from %u ( %u )\n", from, count);
-	
-}
-
-void do_bitmap_corruption (reiserfs_filsys_t * fs)
-{
-
-	unsigned long first = fs->fs_super_bh->b_blocknr + 1;
-	unsigned long nr_bitmap_to_corrupt;
-	unsigned long block;
-	struct buffer_head * bh;
-	unsigned int i;
-
-	nr_bitmap_to_corrupt = (unsigned long)get_rand (1, get_sb_bmap_nr (fs->fs_ondisk_sb) - 1);
-
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "%lu bitmaps will be corrupted\n", nr_bitmap_to_corrupt);
-	}
-	printf ("%lu bitmaps will be corrupted\n", nr_bitmap_to_corrupt);
-	for (i = 0; i < nr_bitmap_to_corrupt; i ++ )
-		{
-			block = ( i == 0 ) ? first 
-				: fs->fs_blocksize * 8 * i;
-			bh = bread (fs->fs_dev, block, fs->fs_blocksize);
-
-			if (!bh) {
-				printf ("do_bitmap_corruption: bread failed for bitmap %d: %lu\n",
-						i, block); 
-				exit (1);
-			}
-			do_one_block_random_corrupt (bh);
-			mark_buffer_dirty (bh);
-			bwrite(bh);
-			brelse (bh);
-		}
-
-} 
-
-/* corrupt the random number of item headers in random number of leaves */
-void do_ih_random_corrupt (reiserfs_filsys_t * fs,
-							  unsigned long nr_leaves_cr) 
-{
-	unsigned int nr_ih_cr;
-	unsigned int i, j;
-	struct buffer_head * bh;
-	struct item_head * ih;
-	unsigned long nr_leaves = 0;
-	unsigned int should_be_corrupted = 0;
-
-	srand (time (0));
-
-	printf ("item headers in %lu leaves will be corrupted\n", nr_leaves_cr);
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "item headers in %lu leaves will be corrupted\n", nr_leaves_cr);
-	}
-
-    if (reiserfs_open_ondisk_bitmap (fs) < 0)
-		reiserfs_exit (1, "Could not open ondisk bitmap");
-
-    for (i = 0; (i < get_sb_block_count (fs->fs_ondisk_sb)) &&
-			 nr_leaves < nr_leaves_cr; i ++) {
-
-		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
-			continue;
-
-		bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-		if (!bh) {
-			reiserfs_warning (stderr, "could not read block %lu\n", i);
-			continue;
-		}
-
-		if (who_is_this (bh->b_data, bh->b_size) != THE_LEAF) {
-			brelse (bh);	
-			continue;
-		}
-
-		if ((!is_leaf_node (bh)) || (block_of_journal (fs, i))) {
-			brelse (bh);	
-			continue;
-		}
-
-		should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-		if (should_be_corrupted == 0)
-		{
-			brelse (bh);
-			continue;
-		}
-
-		nr_ih_cr = get_rand (1, get_blkh_nr_items (B_BLK_HEAD (bh))); 
-		for (j = 0; j < nr_ih_cr; j ++ ) {
-			should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-			if (should_be_corrupted == 0)
-				continue;
-
-			if ((data(fs)->log_file_name) && (data(fs)->log))
-				fprintf (data(fs)->log, "# block %lu , item header %d\n",
-						 bh->b_blocknr, j);
-			printf ("# block %lu , item header %d\n", bh->b_blocknr, j);
-			
-			ih = B_N_PITEM_HEAD (bh, j);
-			do_one_ih_random_corrupt (ih);
-		}
-		mark_buffer_dirty (bh);
-		bwrite(bh);
-		brelse (bh);
-		nr_leaves ++ ;
-	}
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "item headers in %lu leaves WERE corrupted\n",
-				 nr_leaves);
-	printf ("item headers in %lu leaves WERE corrupted\n", nr_leaves);
-
-	reiserfs_close_ondisk_bitmap (fs);
-}
-
-/* corrupt item */
-void do_one_item_random_corrupt (struct buffer_head * bh,
-								 struct item_head * ih)
-{
-	unsigned int i;
-	unsigned int from;
-	unsigned int count;
-	char * p;
-
-	p = (char *)B_I_PITEM(bh, ih);
-
-	from = get_rand (0, get_ih_item_len(ih)  - 1);
-	count = get_rand (1, get_ih_item_len(ih));
-
-	if (from + count > get_ih_item_len(ih))
-		count = get_ih_item_len(ih) - from;
-
-	for (i = from; i < from + count; i ++)
-		((char *)p)[i] = get_rand(0, 255);
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "item body \tfrom %u ( %u )\n", from, count);
-
-	printf ("item body \tfrom %u ( %u )\n",  from, count);
-	return ;
-
-}
-
-
-/* corrupt the random number of directory items in random number of leaves */
-void do_dir_random_corrupt (reiserfs_filsys_t * fs,
-							unsigned long nr_leaves_cr) 
-{
- 	unsigned int nr_ih_cr;
-	unsigned int i, j;
-	struct buffer_head * bh;
-	struct item_head * ih;
-	unsigned long nr_leaves = 0;
-	unsigned int should_be_corrupted = 0;
-
-	srand (time (0));
-
-	printf ("DIR items in %lu leaves will be corrupted\n", nr_leaves_cr);
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "DIR items in %lu leaves will be corrupted\n", nr_leaves_cr);
-	}
-
-    if (reiserfs_open_ondisk_bitmap (fs) < 0)
-		reiserfs_exit (1, "Could not open ondisk bitmap");
-
-    for (i = 0; (i < get_sb_block_count (fs->fs_ondisk_sb)) &&
-			 nr_leaves < nr_leaves_cr; i ++) {
-
-		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
-			continue;
-
-		bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-		if (!bh) {
-			reiserfs_warning (stderr, "could not read block %lu\n", i);
-			continue;
-		}
-
-		if (who_is_this (bh->b_data, bh->b_size) != THE_LEAF) {
-			brelse (bh);	
-			continue;
-		}
-
-		if ((!is_leaf_node (bh)) || (block_of_journal (fs, i))) {
-			brelse (bh);	
-			continue;
-		}
-
-		should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-		if (should_be_corrupted == 0)
-		{
-			brelse (bh);
-			continue;
-		}
-
-		/* get next item, look is it a DIR */
-		nr_ih_cr = get_rand (1, get_blkh_nr_items (B_BLK_HEAD (bh))); 
-		for (j = 0; j < nr_ih_cr; j ++ ) {
-			should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-			if (should_be_corrupted == 0)
-				continue;
-
-			if ((data(fs)->log_file_name) && (data(fs)->log))
-				fprintf (data(fs)->log, "# block %lu , item %d\n",
-						 bh->b_blocknr, j);
-			printf ("# block %lu , item %d\n", bh->b_blocknr, j);
-			
-			ih = B_N_PITEM_HEAD (bh, j);
-			if (get_type (&ih->ih_key) != TYPE_DIRENTRY)
-				continue;
-			do_one_item_random_corrupt (bh, ih);
-		}
-		mark_buffer_dirty (bh);
-		bwrite(bh);
-		brelse (bh);
-		nr_leaves ++ ;
-	}
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "DIR items in %lu leaves WERE corrupted\n",
-				 nr_leaves);
-	printf ("DIR items in %lu leaves WERE corrupted\n", nr_leaves);
-
-	reiserfs_close_ondisk_bitmap (fs);
-}
-
-/* corrupt the random number of stat data items in random number of leaves */
-void do_sd_random_corrupt (reiserfs_filsys_t * fs,
-						   unsigned long nr_leaves_cr) 
-{
- 	unsigned int nr_ih_cr;
-	unsigned int i, j;
-	struct buffer_head * bh;
-	struct item_head * ih;
-	unsigned long nr_leaves = 0;
-	unsigned int should_be_corrupted = 0;
-
-	srand (time (0));
-
-	printf ("SD items in %lu leaves will be corrupted\n", nr_leaves_cr);
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "SD items in %lu leaves will be corrupted\n", nr_leaves_cr);
-	}
-
-    if (reiserfs_open_ondisk_bitmap (fs) < 0)
-		reiserfs_exit (1, "Could not open ondisk bitmap");
-
-    for (i = 0; (i < get_sb_block_count (fs->fs_ondisk_sb)) &&
-			 nr_leaves < nr_leaves_cr; i ++) {
-
-		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
-			continue;
-
-		bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-		if (!bh) {
-			reiserfs_warning (stderr, "could not read block %lu\n", i);
-			continue;
-		}
-
-		if (who_is_this (bh->b_data, bh->b_size) != THE_LEAF) {
-			brelse (bh);	
-			continue;
-		}
-
-		if ((!is_leaf_node (bh)) || (block_of_journal (fs, i))) {
-			brelse (bh);	
-			continue;
-		}
-		
-		should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-		if (should_be_corrupted == 0)
-		{
-			brelse (bh);
-			continue;
-		}
-
-		/* get next item, look is it a SD */
-		nr_ih_cr = get_rand (1, get_blkh_nr_items (B_BLK_HEAD (bh))); 
-		for (j = 0; j < nr_ih_cr; j ++ ) {
-			should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-			if (should_be_corrupted == 0)
-				continue;
-
-			if ((data(fs)->log_file_name) && (data(fs)->log))
-				fprintf (data(fs)->log, "# block %lu , item %d\n",
-						 bh->b_blocknr, j);
-			printf ("# block %lu , item %d\n", bh->b_blocknr, j);
-			
-			ih = B_N_PITEM_HEAD (bh, j);
-			if (get_type (&ih->ih_key) != TYPE_STAT_DATA)
-				continue;
-			do_one_item_random_corrupt (bh, ih);
-		}
-		mark_buffer_dirty (bh);
-		bwrite(bh);
-		brelse (bh);
-		nr_leaves ++ ;
-	}
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "SD items in %lu leaves WERE corrupted\n",
-				 nr_leaves);
-	printf ("SD items in %lu leaves WERE corrupted\n", nr_leaves);
-
-	reiserfs_close_ondisk_bitmap (fs);
-}
-
-/* corrupt the random number of indierct items in random number of leaves */
-void do_ind_random_corrupt (reiserfs_filsys_t * fs,
-						   unsigned long nr_leaves_cr) 
-{
- 	unsigned int nr_ih_cr;
-	unsigned int i, j;
-	struct buffer_head * bh;
-	struct item_head * ih;
-	unsigned long nr_leaves = 0;
-	unsigned int should_be_corrupted = 0;
-
-	srand (time (0));
-
-	printf ("IND items in %lu leaves will be corrupted\n", nr_leaves_cr);
-	if ((data(fs)->log_file_name) && (data(fs)->log)) {
-		fprintf (data(fs)->log, "IND items in %lu leaves will be corrupted\n", nr_leaves_cr);
-	}
-
-    if (reiserfs_open_ondisk_bitmap (fs) < 0)
-		reiserfs_exit (1, "Could not open ondisk bitmap");
-
-    for (i = 0; (i < get_sb_block_count (fs->fs_ondisk_sb)) &&
-			 nr_leaves < nr_leaves_cr; i ++) {
-
-		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
-			continue;
-
-		bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-		if (!bh) {
-			reiserfs_warning (stderr, "could not read block %lu\n", i);
-			continue;
-		}
-
-		if (who_is_this (bh->b_data, bh->b_size) != THE_LEAF) {
-			brelse (bh);	
-			continue;
-		}
-
-		if ((!is_leaf_node (bh)) || (block_of_journal (fs, i))) {
-			brelse (bh);	
-			continue;
-		}
-		
-		should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-		if (should_be_corrupted == 0)
-		{
-			brelse (bh);
-			continue;
-		}
-
-		/* get next item, look is it an IND */
-		nr_ih_cr = get_rand (1, get_blkh_nr_items (B_BLK_HEAD (bh))); 
-		for (j = 0; j < nr_ih_cr; j ++ ) {
-			should_be_corrupted = (unsigned int) get_rand ((double)0, (double)1);
-			if (should_be_corrupted == 0)
-				continue;
-
-			ih = B_N_PITEM_HEAD (bh, j);
-			if (get_type (&ih->ih_key) != TYPE_INDIRECT)
-				continue;
-			if ((data(fs)->log_file_name) && (data(fs)->log))
-				fprintf (data(fs)->log, "# block %lu , item %d\n",
-						 bh->b_blocknr, j);
-			printf ("# block %lu , item %d\n", bh->b_blocknr, j);
-
-			do_one_item_random_corrupt (bh, ih);
-		}
-		mark_buffer_dirty (bh);
-		bwrite(bh);
-		brelse (bh);
-		nr_leaves ++ ;
-	}
-
-	if ((data(fs)->log_file_name) && (data(fs)->log))
-		fprintf (data(fs)->log, "IND items in %lu leaves WERE corrupted\n",
-				 nr_leaves);
-	printf ("IND items in %lu leaves WERE corrupted\n", nr_leaves);
-
-	reiserfs_close_ondisk_bitmap (fs);
-}
-
-/* this reads list of desired corruptions from stdin and performs the
-   corruptions. Format of that list:
-   B           - the random number of bitmap to be corrupted
-   L nr_leaves - block headers in nr_leaves leaves to be corupted
-   H nr_leaves - the random number of item headers in nr_leaves to be corrupted
-   S nr_leaves - the random number of stat data items in nr_leaves to be
-                 corrupted
-   D nr_leaves - the random number of directory items in nr_leaves to be
-                 corrupted
-   I nr_leaves - the random number of indirect items in nr_leaves to be
-                 corrupted
-*/
-
-void what_to_corrupt (reiserfs_filsys_t * fs, char * corruption_command)
-{
-	unsigned long nr_leaves_cr;
-	char code;
-
-	switch (corruption_command [0]){
-	case 'B' :
-		/* bitmap */
-		do_bitmap_corruption (fs);
-		break;
-
-	case 'L' :
-		/* leaves */
-		if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		do_leaves_corruption (fs, nr_leaves_cr);		
-		break;
-
-	case 'H' :
-		/* item headers */
-		if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		do_ih_random_corrupt (fs, nr_leaves_cr);
-		break;
-
-	case 'D' :
-		/* directory items */
-		if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		do_dir_random_corrupt (fs, nr_leaves_cr);
-		break;
-
-	case 'S' :
-		/* stat data items */
-		if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		do_sd_random_corrupt (fs, nr_leaves_cr);
-		break;
-
-	case 'I' :
-		/* indirect items */
-		if (sscanf (corruption_command, "%c %lu\n", &code, &nr_leaves_cr) != 2) {
-			printf ("Wrong format \'%c\'\n", corruption_command [0]);
-			return;
-		}
-		do_ind_random_corrupt (fs, nr_leaves_cr);
-		break;
-
-	default :
-		printf ("Unknown command specified\n");
-	}
-}
-
-void do_fs_random_corrupt (reiserfs_filsys_t * fs)
-{
-    char * line = 0;
-    size_t n = 0;
-
-    printf ("Corrupting fs. Please insert one of the following command\n"
-			" B - the random number of bitmap to be corrupted\n"
-			" L nr_leaves - block headers in nr_leaves leaves to be corupted\n"
-			" H nr_leaves - the random number of item headers in nr_leaves to be corrupted\n"
-			" S nr_leaves - the random number of stat data items in nr_leaves to be corrupted\n"
-			" D nr_leaves - the random number of directory items in nr_leaves to be corrupted\n"
-			" I nr_leaves - the random number of indirect items in nr_leaves to be corrupted\n"
-			".. ->\n");
-
-	/* Get list of corruptions from stdin */
-	while (getline (&line, &n, stdin) != -1) {
-		if ( line [0] == '\n' ) {
-			free (line);
-			line = 0;
-			n = 0;
-			break;
-		}
-		printf ("################## command : %s", line);
-		if ((data(fs)->log_file_name) && (data(fs)->log)) {
-			fprintf (data(fs)->log, "################## command : %s", line);
-		}
-
-		what_to_corrupt (fs, line);
-		
-		free (line);
-		line = 0;
-		n = 0;
-	}
-}
-
-/*
-   Local variables:
-   c-indentation-style: "K&R"
-   mode-name: "LC"
-   c-basic-offset: 4
-   tab-width: 4
-   fill-column: 80
-   End:
-*/
-
-
-
-
-
-
-
-
diff --git a/debugreiserfs/unpack.c b/debugreiserfs/unpack.c
deleted file mode 100644
index fb93b6b..0000000
--- a/debugreiserfs/unpack.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * Copyright 2000-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-  
-#include "debugreiserfs.h"
-#include <sys/resource.h>
-
-
-#define print_usage_and_exit() die ("Usage: %s [-v] [-b filename] device\n\
--v		prints blocks number of every block unpacked\n\
--b filename	saves bitmap of blocks unpacked to filename\n\
--j filename     stores journal in the filename\n", argv[0]);
-
-
-/* when super block gets unpacked for the first time - create a bitmap
-   and mark in it what have been unpacked. Save that bitmap at the end */
-reiserfs_bitmap_t * what_unpacked = 0;
-
-
-int leaves, full;
-
-int verbose = 0;
-
-int Default_journal = 1;
-
-static void unpack_offset (struct packed_item * pi, struct item_head * ih, int blocksize)
-{
-
-    if (get_pi_mask(pi) & OFFSET_BITS_64) {
-	__u64 v64;
-
-	if (get_ih_key_format (ih) != KEY_FORMAT_2)
-	    die ("unpack_offset: key format is not set or wrong");
-	fread_le64 (&v64);
-	set_offset (KEY_FORMAT_2, &ih->ih_key, v64);
-	return;
-    }
-
-    if (get_pi_mask(pi) & OFFSET_BITS_32) {
-	__u32 v32;
-
-	fread_le32 (&v32);
-	set_offset (get_ih_key_format (ih), &ih->ih_key, v32);
-	return;
-    }
-
-    if ((get_pi_mask(pi) & DIR_ID) == 0 && (get_pi_mask(pi) & OBJECT_ID) == 0) {
-	/* offset was not sent, as it can be calculated looking at the
-           previous item */
-	if (is_stat_data_ih (ih - 1))
-	    set_offset (get_ih_key_format (ih), &ih->ih_key, 1);
-	if (is_indirect_ih (ih - 1))
-	    set_offset (get_ih_key_format (ih), &ih->ih_key, 
-			get_offset (&(ih - 1)->ih_key) + get_bytes_number (ih - 1, blocksize));
-    }
-
-    // offset is 0
-    return;
-}
-
-
-static void unpack_type (struct packed_item * pi, struct item_head * ih)
-{
-    set_type (get_ih_key_format (ih), &ih->ih_key, get_pi_type(pi));
-    if (type_unknown (&ih->ih_key))
-	reiserfs_panic ("unpack_type: unknown type %d unpacked for %H\n",
-			get_pi_type(pi), ih);
-}
-
-
-/* direntry item comes in the following format: 
-   for each entry
-      mask - 8 bits
-      entry length - 16 bits
-      entry itself
-      deh_objectid - 32 bits
-      	maybe deh_dir_id (32 bits)
-	maybe gencounter (16)
-	maybe deh_state (16)
-*/
-static void unpack_direntry (struct packed_item * pi, struct buffer_head * bh,
-			     struct item_head * ih, hashf_t hash_func)
-{
-    __u16 entry_count, namelen, gen_counter, entry_len;
-    __u8 mask;
-    int i;
-    struct reiserfs_de_head * deh;
-    int location;
-    char * item;
-
-/*    if (!hash_func)
-	die ("unpack_direntry: hash function is not set");*/
-
-    if (!(get_pi_mask(pi) & IH_FREE_SPACE))
-        die ("ih_entry_count must be packed for directory items");
-
-    entry_count = get_ih_entry_count (ih);
-/*    if (!entry_count)
-	reiserfs_panic ("unpack_direntry: entry count should be set already");*/
-
-    item = bh->b_data + get_ih_location (ih);
-    deh = (struct reiserfs_de_head *)item;
-    location = get_pi_item_len(pi);
-    for (i = 0; i < entry_count; i ++, deh ++) {
-	fread8 (&mask);
-	fread_le16 (&entry_len);
-	location -= entry_len;
-	set_deh_location (deh, location);
-	fread (item + location, entry_len, 1, stdin);
-
-	/* find name length */
-	if (*(item + location + entry_len - 1))
-	    namelen = entry_len;
-	else
-	    namelen = strlen (item + location);
-
-	fread32 (&deh->deh2_objectid);
-	if (mask & HAS_DIR_ID)
-	    fread32 (&deh->deh2_dir_id);
-	else
-	    set_deh_dirid (deh, get_key_objectid (&ih->ih_key));
-
-	if (*(item + location) == '.' && namelen == 1)
-	    /* old or new "." */
-	    set_deh_offset (deh, DOT_OFFSET);
-	else if (*(item + location) == '.' && *(item + location + 1) == '.' && namelen == 2)
-	    /* old or new ".." */
-	    set_deh_offset (deh, DOT_DOT_OFFSET);
-	else if (hash_func)
-	    set_deh_offset (deh, hash_value(hash_func, item + location, namelen));
-	if (mask & HAS_GEN_COUNTER) {
-	    fread_le16 (&gen_counter);
-	    set_deh_offset (deh, get_deh_offset (deh) | gen_counter);
-	}
-
-	if (mask & HAS_STATE)
-	    fread16 (&deh->deh2_state);
-	else
-	    set_deh_state (deh, (1 << DEH_Visible2));
-    }
-
-    return;
-}
-
-
-/* struct packed_item is already unpacked */
-static void unpack_stat_data (struct packed_item * pi, struct buffer_head * bh,
-			      struct item_head * ih)
-{
-    if (!(get_pi_mask(pi) & IH_FREE_SPACE)) {
-        /* ih_free_space was not packed - set default */
-        set_ih_entry_count (ih, 0xffff);
-    }
-
-    if (get_ih_key_format (ih) == KEY_FORMAT_1) {
-	/* stat data comes in the following format:
-	   if this is old stat data:
-	   mode - 16 bits
-	   nlink - 16 bits
-	   size - 32 bits
-	   blocks/rdev - 32 bits
-	   maybe first_direct byte 32 bits
-	*/
-	struct stat_data_v1 * sd;
-
-	sd = (struct stat_data_v1 *)B_I_PITEM (bh, ih);
-	memset (sd, 0, sizeof (sd));
-
-	fread16 (&sd->sd_mode);
-	fread16 (&sd->sd_nlink);
-	fread32 (&sd->sd_size);
-	fread32 (&sd->u.sd_blocks);
-	
-	if (get_pi_mask(pi) & WITH_SD_FIRST_DIRECT_BYTE) {
-	    fread32 (&sd->sd_first_direct_byte);
-	} else {
-	    sd->sd_first_direct_byte = 0xffffffff;
-	}
-    } else {
-	/* for new stat data
-	   mode - 16 bits
-	   nlink in either 16 or 32 bits
-	   size in either 32 or 64 bits
-	   blocks - 32 bits
-	*/
-	struct stat_data * sd;
-
-	sd = (struct stat_data *)B_I_PITEM (bh, ih);
-	memset (sd, 0, sizeof (sd));
-	
-	fread16 (&sd->sd_mode);
-
-	if (get_pi_mask(pi) & NLINK_BITS_32) {
-	    fread32 (&sd->sd_nlink);
-	} else {
-	    __u16 nlink16;
-
-	    fread16 (&nlink16);
-            set_sd_v2_nlink (sd, le16_to_cpu(nlink16));
-	}
-
-	if (get_pi_mask(pi) & SIZE_BITS_64) {
-	    fread64 (&sd->sd_size);
-	} else {
-	    __u32 size32;
-
-            /* We need the endian conversions since sd->sd_size is 64 bit */
-	    fread_le32 (&size32);
-            set_sd_v2_size (sd, size32 );
-	}
-
-	fread32 (&sd->sd_blocks);
-    }
-
-    return;
-}
-
-
-/* indirect item comes either in packed form or as is. ih_free_space
-   can go first */
-static void unpack_indirect (struct packed_item * pi, struct buffer_head * bh,
-			     struct item_head * ih)
-{
-    __u32 * ind_item, * end;
-    int i;
-    __u16 v16;
-
-    if (!(get_pi_mask(pi) & IH_FREE_SPACE)) {
-        /* ih_free_space was not packed - set default */
-        set_ih_entry_count (ih, 0);
-    }
-
-    ind_item = (__u32 *)B_I_PITEM (bh, ih);
-
-    if (get_pi_mask(pi) & SAFE_LINK) {
-	d32_put(ind_item, 0, get_key_dirid(&ih->ih_key));
-	set_key_dirid(&ih->ih_key, (__u32)-1);
-	return;
-    }
-
-    if (get_pi_mask(pi) & WHOLE_INDIRECT) {
-	fread (ind_item, get_pi_item_len(pi), 1, stdin);
-	return;
-    }
-
-    end = ind_item + I_UNFM_NUM (ih);
-    while (ind_item < end) {
-        __u32 base;
-	fread32 (ind_item);
-	fread_le16 (&v16);
-        base = d32_get(ind_item, 0);
-	for (i = 1; i < v16; i ++) {
-	    if (base != 0)
-		d32_put(ind_item, i, base + i);
-	    else
-		d32_put(ind_item, i, 0);
-	}
-	ind_item += i;
-    }
-    return;
-}
-
-
-// FIXME: we have no way to preserve symlinks
-static void unpack_direct (struct packed_item * pi, struct buffer_head * bh,
-			   struct item_head * ih)
-{
-    __u32 * d_item = (__u32 *)B_I_PITEM (bh, ih);
-
-    if (!(get_pi_mask(pi) & IH_FREE_SPACE))
-        /* ih_free_space was not packed - set default */
-        set_ih_entry_count (ih, 0xffff);
-
-    if (get_pi_mask(pi) & SAFE_LINK) {
-	d32_put(d_item, 0, get_key_dirid(&ih->ih_key));
-	set_key_dirid(&ih->ih_key, (__u32)-1);
-    } else {
-	memset (d_item, 'a', get_pi_item_len(pi));
-    }
-    return;
-}
-
-
-static void unpack_leaf (int dev, hashf_t hash_func, __u16 blocksize)
-{
-    static int unpacked_leaves = 0;
-    struct buffer_head * bh;
-    struct packed_item pi;
-    struct item_head * ih;
-    int i;
-    __u16 v16;
-    __u32 v32;
-    
-    /* block number */
-    fread_le32 (&v32);
-
-
-    /* item number */
-    fread_le16 (&v16);
-
-    if (verbose)
-	reiserfs_warning (stderr, "leaf %d: %d items\n", v32, v16);
-
-    bh = getblk (dev, v32, blocksize);
-    if (!bh)
-	die ("unpack_leaf: getblk failed");
-
-    set_blkh_nr_items (B_BLK_HEAD (bh), v16);
-    set_blkh_level (B_BLK_HEAD (bh), DISK_LEAF_NODE_LEVEL);
-    set_blkh_free_space (B_BLK_HEAD (bh), MAX_FREE_SPACE (bh->b_size));
-    
-
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < get_blkh_nr_items (B_BLK_HEAD (bh)); i ++, ih ++) {
-#if 0
-	fread32 (&v32);
-	if (v32 != ITEM_START_MAGIC)
-	    die ("unpack_leaf: no start item magic found: block %lu, item %i",
-		 bh->b_blocknr, i);
-#endif	
-
-	fread (&pi, sizeof (struct packed_item), 1, stdin);
-	
-	/* dir_id - if it is there */
-	if (get_pi_mask(&pi) & DIR_ID) {
-	    fread32 (&v32);
-            set_key_dirid (&ih->ih_key, le32_to_cpu(v32));
-	} else {
-	    if (!i)
-		die ("unpack_leaf: dir_id is not set");
-	    set_key_dirid (&ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-	}
-
-	/* object_id - if it is there */
-	if (get_pi_mask(&pi) & OBJECT_ID) {
-	    fread32 (&v32);
-            set_key_objectid (&ih->ih_key, le32_to_cpu(v32));
-	} else {
-	    if (!i)
-		die ("unpack_leaf: object_id is not set");
-	    set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-	}
-
-	// we need to set item format before offset unpacking
-	set_ih_key_format (ih, (get_pi_mask(&pi) & NEW_FORMAT) ? KEY_FORMAT_2 : KEY_FORMAT_1);
-
-	// offset
-	unpack_offset (&pi, ih, bh->b_size);
-
-	/* type */
-	unpack_type (&pi, ih);
-
-	/* ih_free_space and ih_format */
-	if (get_pi_mask(&pi) & IH_FREE_SPACE) {
-	    fread16 (&v16);
-	    set_ih_entry_count (ih, le16_to_cpu(v16));
-	}
-
-	if (get_pi_mask(&pi) & IH_FORMAT)
-	    fread16 (&ih->ih_format);
-
-	/* item length and item location */
-	set_ih_item_len (ih, get_pi_item_len(&pi));
-	set_ih_location (ih, (i ? get_ih_location (ih - 1) : bh->b_size) - get_pi_item_len(&pi));
-
-	// item itself
-	if (is_direct_ih (ih)) {
-	    unpack_direct (&pi, bh, ih);
-	} else if (is_indirect_ih (ih)) {
-	    unpack_indirect (&pi, bh, ih);
-	} else if (is_direntry_ih (ih)) {
-	    unpack_direntry (&pi, bh, ih, hash_func);
-	} else if (is_stat_data_ih (ih)) {
-	    unpack_stat_data (&pi, bh, ih);
-	}
-	set_blkh_free_space (B_BLK_HEAD (bh), get_blkh_free_space (B_BLK_HEAD (bh)) -
-			     (IH_SIZE + get_ih_item_len (ih)));
-
-#if 0
-	fread32 (&v32);
-	if (v32 != ITEM_END_MAGIC)
-	    die ("unpack_leaf: no end item magic found: block %lu, item %i",
-		 bh->b_blocknr, i);
-	if (verbose)
-	    reiserfs_warning (stderr, "%d: %H\n", i, ih);
-#endif
-    }
-
-    fread_le16 (&v16);
-    if (v16 != LEAF_END_MAGIC)
-	die ("unpack_leaf: wrong end signature found - %x, block %lu", 
-	     v16, bh->b_blocknr);
-
-    mark_buffer_uptodate (bh, 1);
-    mark_buffer_dirty (bh);
-    bwrite (bh);
-    /*
-    if (!not_data_block (bh->b_blocknr))
-	data_blocks_unpacked ++;
-    */
-    brelse (bh);
-
-    if (what_unpacked)
-	reiserfs_bitmap_set_bit (what_unpacked, bh->b_blocknr);
-    /*unpacked ++;*/
-
-    if (!(++ unpacked_leaves % 10))
-	fprintf (stderr, "#");
-}
-
-
-static void unpack_full_block (int dev, int blocksize)
-{
-    static int full_blocks_unpacked = 0;
-    __u32 block;
-    struct buffer_head * bh;
-
-    fread_le32 (&block);
-
-    if (verbose)
-	fprintf (stderr, "full #%d\n", block);
-
-    bh = getblk (dev, block, blocksize);
-    if (!bh)
-	die ("unpack_full_block: getblk failed");
-
-    fread (bh->b_data, bh->b_size, 1, stdin);
-
-    if (who_is_this (bh->b_data, bh->b_size) == THE_SUPER && !what_unpacked) {
-	unsigned long blocks;
-	struct buffer_head * tmp;
-	
-	blocks = get_sb_block_count ((struct reiserfs_super_block *)(bh->b_data));
-	fprintf (stderr, "There were %lu blocks on the device\n", blocks);
-	what_unpacked = reiserfs_create_bitmap (blocks);
-
-	/* make file as long as filesystem is */
-	tmp = getblk (dev, blocks - 1, blocksize);
-	mark_buffer_dirty (tmp);
-	mark_buffer_uptodate (tmp, 0);
-	bwrite (tmp);
-	brelse (tmp);
-    }
-
-    mark_buffer_uptodate (bh, 1);
-    mark_buffer_dirty (bh);
-    bwrite (bh);
-/*
-    if (!not_data_block (bh->b_blocknr))
-	data_blocks_unpacked ++;
-*/
-    brelse (bh);
-
-    if (what_unpacked)
-	reiserfs_bitmap_set_bit (what_unpacked, block);
-    /*unpacked ++;*/
-
-    if (!(++ full_blocks_unpacked % 50))
-	fprintf (stderr, ".");
-}
-
-
-/* just skip bitmaps of unformatted nodes */
-static void unpack_unformatted_bitmap (int dev, int blocksize)
-{
-    __u16 bmap_num;
-    __u32 block_count;
-    int i;
-    char * buf;
- 
-    fread_le16 (&bmap_num);
-    fread_le32 (&block_count);
-    
-    buf = malloc (blocksize);
-    if (!buf)
-	reiserfs_panic ("unpack_unformatted_bitmap: malloc failed: %m");
-
-    for (i = 0; i < bmap_num; i ++) {
-	if (fread (buf, blocksize, 1, stdin) != 1)
-	    reiserfs_panic ("unpack_unformatted_bitmap: "
-			    "could not read bitmap #%d: %m", i);
-    }
-    free (buf);
-}
-
-
-// read packed reiserfs partition metadata from stdin
-void unpack_partition (int fd, int jfd)
-{
-    __u32 magic32;
-    long position;
-    __u16 magic16;
-    __u16 blocksize;
-    int dev = fd;
-    
-    fread_le32 (&magic32);
-    if (magic32 != REISERFS_SUPER_MAGIC)
-	die ("unpack_partition: reiserfs magic number (0x%x) not found - %x\n",
-             REISERFS_SUPER_MAGIC, magic32);
-    
-    fread_le16 (&blocksize);
-    
-    if (verbose)
-	fprintf (stderr, "Blocksize %d\n", blocksize);
-    
-    while (!feof (stdin)) {
-	char c[2];
-
-	fread (c, 1, 1, stdin);
-	switch (c[0]) {
-	case '.':
-	    if (verbose)
-		fprintf (stderr, "\".\" skipped\n");
-	    continue;
-
-	case '1':
-	    fread (c, 1, 1, stdin); /* that was 100%, read in first 0 */
-	case '2':
-	case '4':
-	case '6':
-	case '8':
-	    fread (c, 1, 1, stdin);
-	case '0':
-	    fread (c + 1, 1, 1, stdin); /* read % */
-		
-	    if (c[0] != '0' || c[1] != '%')
-		die ("0%% expected\n");
-
-	    if (verbose)
-		fprintf (stderr, "0%% skipped\n");
-	    continue;
-	}
-
-	fread (c + 1, 1, 1, stdin);
-	magic16 = le16_to_cpu(*(__u16 *)c);
-	/*fread16 (&magic16);*/
-	
-	switch (magic16 & 0xff) {
-	case LEAF_START_MAGIC:
-	    leaves ++;
-	    unpack_leaf (dev, code2func (magic16 >> 8), blocksize);
-	    break;
-	    
-	case SEPARATED_JOURNAL_START_MAGIC:
-	    if (Default_journal)
-		die ("file name for separated journal has to be specified");	
-	    dev = jfd;
-	    break;    
-
-	case SEPARATED_JOURNAL_END_MAGIC:
-	    dev = fd;
-	    break;
-	    
-	case FULL_BLOCK_START_MAGIC:
-	    full ++;
-	    unpack_full_block (dev, blocksize);
-	    break;
-
-	case UNFORMATTED_BITMAP_START_MAGIC:
-	    fprintf (stderr, "\nBitmap of unformatted - ignored\n");
-	    unpack_unformatted_bitmap (dev, blocksize);
-	    break;
-	    
-	case END_MAGIC:
-	    goto out;
-
-	default:
-	    position = ftell(stdin);
-	    if (position == ~(long)0)
-		die ("unpack_partition: bad magic found - %x", magic16 & 0xff);
-	    else
-		die ("unpack_partition: bad magic found - %x, position %lu", 
-		    magic16 & 0xff, ftell(stdin));
-	}
-    }
-out:
-    fprintf (stderr, "Unpacked %d leaves, %d full blocks\n", leaves, full);
-
-
-    /*    fclose (block_list);*/
-}
-
-
-int do_unpack(char *host, char *j_filename, char *filename, int verbose) {
-    int fd, fdj = -2;
-    struct rlimit lim = {RLIM_INFINITY, RLIM_INFINITY};
-
-    if (filename == NULL)
-	    filename = ".bitmap";
-    
-    if (j_filename)
-	    Default_journal = 0;
-    
-    /* with this 2.4.0-test9's file_write does not send SIGXFSZ */
-    if (setrlimit (RLIMIT_FSIZE, &lim)) {
-	fprintf  (stderr, "sertlimit failed: %m\n");
-    }
-
-    if (misc_device_mounted(host) > 0) {
-	fprintf(stderr, "%s seems mounted, umount it first\n", host);
-	return 0;
-    }
-  
-    fd = open (host, O_RDWR | O_LARGEFILE);
-    if (fd == -1) {
-	perror ("open failed");
-	return 0;
-    }
-
-    if (!Default_journal) {
-	fdj = open (j_filename, O_RDWR | O_LARGEFILE);
-	if (fdj == -1) {
-	    perror ("open failed");
-	    return 0;
-	}
-    }
-
-    unpack_partition (fd, fdj);
-
-    if (what_unpacked && filename) {
-        FILE * file = open_file(filename, "w+");
-        reiserfs_bitmap_save (file,  what_unpacked);
-        close_file(file);
-    }
-
-    close (fd);
-    if (!Default_journal)
-	close (fdj);	
-    return 0;
-}
diff --git a/depcomp b/depcomp
index aea3d00..ffcd540 100755
--- a/depcomp
+++ b/depcomp
@@ -1,7 +1,9 @@
 #! /bin/sh
-
 # depcomp - compile a program generating dependencies as side-effects
-# Copyright 1999, 2000 Free Software Foundation, Inc.
+
+scriptversion=2005-02-09.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -25,22 +27,45 @@
 
 # Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
 
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
 fi
-# `libtool' can also be set to `yes' or `no'.
 
-if test -z "$depfile"; then
-   base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
-   dir=`echo "$object" | sed 's,/.*$,/,'`
-   if test "$dir" = "$object"; then
-      dir=
-   fi
-   # FIXME: should be _deps on DOS.
-   depfile="$dir.deps/$base"
-fi
-
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
 tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
 
 rm -f "$tmpdepfile"
@@ -172,19 +197,25 @@
 
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  This file always lives in the current directory.
-  # Also, the AIX compiler puts `$object:' at the start of each line;
-  # $object doesn't have directory information.
-  stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
   tmpdepfile="$stripped.u"
-  outname="$stripped.o"
   if test "$libtool" = yes; then
     "$@" -Wc,-M
   else
     "$@" -M
   fi
-
   stat=$?
+
+  if test -f "$tmpdepfile"; then :
+  else
+    stripped=`echo "$stripped" | sed 's,^.*/,,'`
+    tmpdepfile="$stripped.u"
+  fi
+
   if test $stat -eq 0; then :
   else
     rm -f "$tmpdepfile"
@@ -192,6 +223,7 @@
   fi
 
   if test -f "$tmpdepfile"; then
+    outname="$stripped.o"
     # Each line is of the form `foo.o: dependent.h'.
     # Do two passes, one to just change these to
     # `$object: dependent.h' and one to simply `dependent.h:'.
@@ -255,31 +287,47 @@
    base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
 
    if test "$libtool" = yes; then
-      tmpdepfile1="$dir.libs/$base.lo.d"
-      tmpdepfile2="$dir.libs/$base.d"
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mecanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
       "$@" -Wc,-MD
    else
-      tmpdepfile1="$dir$base.o.d"
-      tmpdepfile2="$dir$base.d"
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
       "$@" -MD
    fi
 
    stat=$?
    if test $stat -eq 0; then :
    else
-      rm -f "$tmpdepfile1" "$tmpdepfile2"
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
       exit $stat
    fi
 
-   if test -f "$tmpdepfile1"; then
-      tmpdepfile="$tmpdepfile1"
-   else
-      tmpdepfile="$tmpdepfile2"
-   fi
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
    if test -f "$tmpdepfile"; then
       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a space and a tab in the [].
-      sed -e 's,^.*\.[a-z]*:[ 	]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
    else
       echo "#dummy" > "$depfile"
    fi
@@ -292,7 +340,7 @@
 
 dashmstdout)
   # Important note: in order to support this mode, a compiler *must*
-  # always write the proprocessed file to stdout, regardless of -o.
+  # always write the preprocessed file to stdout, regardless of -o.
   "$@" || exit $?
 
   # Remove the call to Libtool.
@@ -388,7 +436,7 @@
 
 cpp)
   # Important note: in order to support this mode, a compiler *must*
-  # always write the proprocessed file to stdout.
+  # always write the preprocessed file to stdout.
   "$@" || exit $?
 
   # Remove the call to Libtool.
@@ -430,7 +478,7 @@
 
 msvisualcpp)
   # Important note: in order to support this mode, a compiler *must*
-  # always write the proprocessed file to stdout, regardless of -o,
+  # always write the preprocessed file to stdout, regardless of -o,
   # because we must use -o when running libtool.
   "$@" || exit $?
   IFS=" "
@@ -470,3 +518,12 @@
 esac
 
 exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/fsck/Makefile.am b/fsck/Makefile.am
deleted file mode 100644
index fcf73fe..0000000
--- a/fsck/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-sbin_PROGRAMS = reiserfsck
-
-reiserfsck_SOURCES = main.c pass0.c pass1.c pass2.c semantic_check.c \
-semantic_rebuild.c pass4.c lost+found.c ubitmap.c uobjectid.c ustree.c \
-ufile.c check_tree.c info.c super.c fsck.h
-
-man_MANS = reiserfsck.8
-EXTRA_DIST = $(man_MANS)
-
-reiserfsck_LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-
diff --git a/fsck/Makefile.in b/fsck/Makefile.in
deleted file mode 100644
index 53b6bcc..0000000
--- a/fsck/Makefile.in
+++ /dev/null
@@ -1,483 +0,0 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UUID_LIBS = @UUID_LIBS@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-sbin_PROGRAMS = reiserfsck
-
-reiserfsck_SOURCES = main.c pass0.c pass1.c pass2.c semantic_check.c \
-semantic_rebuild.c pass4.c lost+found.c ubitmap.c uobjectid.c ustree.c \
-ufile.c check_tree.c info.c super.c fsck.h
-
-
-man_MANS = reiserfsck.8
-EXTRA_DIST = $(man_MANS)
-
-reiserfsck_LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-subdir = fsck
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-sbin_PROGRAMS = reiserfsck$(EXEEXT)
-PROGRAMS = $(sbin_PROGRAMS)
-
-am_reiserfsck_OBJECTS = main.$(OBJEXT) pass0.$(OBJEXT) pass1.$(OBJEXT) \
-	pass2.$(OBJEXT) semantic_check.$(OBJEXT) \
-	semantic_rebuild.$(OBJEXT) pass4.$(OBJEXT) lost+found.$(OBJEXT) \
-	ubitmap.$(OBJEXT) uobjectid.$(OBJEXT) ustree.$(OBJEXT) \
-	ufile.$(OBJEXT) check_tree.$(OBJEXT) info.$(OBJEXT) \
-	super.$(OBJEXT)
-reiserfsck_OBJECTS = $(am_reiserfsck_OBJECTS)
-reiserfsck_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
-	$(top_srcdir)/reiserfscore/libcore.a
-reiserfsck_LDFLAGS =
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/check_tree.Po ./$(DEPDIR)/info.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/lost+found.Po ./$(DEPDIR)/main.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/pass0.Po ./$(DEPDIR)/pass1.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/pass2.Po ./$(DEPDIR)/pass4.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/semantic_check.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/semantic_rebuild.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/super.Po ./$(DEPDIR)/ubitmap.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/ufile.Po ./$(DEPDIR)/uobjectid.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/ustree.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(reiserfsck_SOURCES)
-
-NROFF = nroff
-MANS = $(man_MANS)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(reiserfsck_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  fsck/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(sbindir)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f"; \
-	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f $(DESTDIR)$(sbindir)/$$f"; \
-	  rm -f $(DESTDIR)$(sbindir)/$$f; \
-	done
-
-clean-sbinPROGRAMS:
-	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
-reiserfsck$(EXEEXT): $(reiserfsck_OBJECTS) $(reiserfsck_DEPENDENCIES) 
-	@rm -f reiserfsck$(EXEEXT)
-	$(LINK) $(reiserfsck_LDFLAGS) $(reiserfsck_OBJECTS) $(reiserfsck_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_tree.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lost+found.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pass0.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pass1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pass2.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pass4.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/semantic_check.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/semantic_rebuild.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/super.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ubitmap.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ufile.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uobjectid.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ustree.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-uninstall-info-am:
-
-man8dir = $(mandir)/man8
-install-man8: $(man8_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(man8dir)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
-	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
-	done
-uninstall-man8:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
-	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(MANS)
-
-installdirs:
-	$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir)
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-exec-am: install-sbinPROGRAMS
-
-install-info: install-info-am
-
-install-man: install-man8
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-man uninstall-sbinPROGRAMS
-
-uninstall-man: uninstall-man8
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-sbinPROGRAMS ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man8 install-sbinPROGRAMS \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man8 uninstall-sbinPROGRAMS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/fsck/check_tree.c b/fsck/check_tree.c
deleted file mode 100644
index 8a53d37..0000000
--- a/fsck/check_tree.c
+++ /dev/null
@@ -1,1177 +0,0 @@
-/*
- * Copyright 1999-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-#if 0
-struct check_relocated {
-    __u32 old_dir_id;
-    __u32 old_objectid;
-    /*mode_t mode;*/
-    struct check_relocated * next;
-};
-
-static struct check_relocated * relocated_list;
-
-void to_be_relocated (struct key * key)
-{
-    struct check_relocated * cur, * prev, * new_relocated;
-
-    cur = relocated_list;
-    prev = 0;
-
-    while (cur && comp_short_keys(key, (struct key *)cur) != 1) {
-	if (comp_short_keys (key, (struct key *)cur) == 0)
-	    return;
-	prev = cur;
-        cur = cur->next;
-    }
-        
-    new_relocated = getmem (sizeof (struct check_relocated));
-    copy_short_key ((struct key *)new_relocated, key);
-             
-    if (prev) {
-        new_relocated->next = prev->next;
-        prev->next = new_relocated;
-    } else {
-        new_relocated->next = relocated_list;
-        relocated_list = new_relocated;
-    }
-}
-
-int should_be_relocated (struct key * key)
-{
-    struct check_relocated *cur, *prev;
-    int ret = 0;
-
-    if (!key)
-	return 0;
-    
-    cur = relocated_list;
-
-    prev = NULL;
-    while (cur && comp_short_keys(key, (struct key *)cur) != 1) {
-	if (comp_short_keys (key, (struct key *)cur) == 0) {
-	    ret = 1;
-	    break;
-	}
-	prev = cur;
-	cur = cur->next;
-    }
- 
-    if (ret) {
-	/* cur is found */
-	if (prev) /* not the first */
-	    prev->next = cur->next;
-	else /* first */
-	    relocated_list = cur->next;
-	freemem (cur);
-    }
- 
-    return ret;    
-}
-
-void clear_relocated_list() {
-    struct check_relocated *next;
-
-    while (relocated_list) {
-        next = relocated_list->next;
-        freemem (relocated_list);
-        relocated_list = next;
-    }
-}
-
-#endif
-
-//
-//
-//
-// check_fs_tree stops and recommends to run fsck --rebuild-tree when:
-// 1. read fails
-// 2. node of wrong level found in the tree
-// 3. something in the tree points to wrong block number
-//      out of filesystem boundary is pointed by tree
-//      to block marked as free in bitmap
-//      the same block is pointed from more than one place
-//      not data blocks (journal area, super block, bitmaps)
-// 4. bad formatted node found
-// 5. delimiting keys are incorrect
-//      
-
-
-
-/* mark every block we see in the tree in control bitmap, so, when to make
-   sure, that no blocks are pointed to from more than one place we use
-   additional bitmap (control_bitmap). If we see pointer to a block we set
-   corresponding bit to 1. If it is set already - run fsck with --rebuild-tree */
-static reiserfs_bitmap_t * control_bitmap;
-static reiserfs_bitmap_t * source_bitmap;
-
-static int tree_scanning_failed = 0;
-
-
-/* 1 if block is not marked as used in the bitmap */
-static int is_block_free (reiserfs_filsys_t * fs, unsigned long block)
-{
-    return !reiserfs_bitmap_test_bit (source_bitmap, block);
-}
-
-
-/*static int hits = 0;*/
-
-/* we have seen this block in the tree, mark corresponding bit in the
-   control bitmap */
-static void we_met_it (unsigned long block)
-{
-    reiserfs_bitmap_set_bit (control_bitmap, block);
-    /*hits ++;*/
-}
-
-
-/* have we seen this block somewhere in the tree before? */
-static int did_we_meet_it (unsigned long block)
-{
-    return reiserfs_bitmap_test_bit (control_bitmap, block);
-}
-
-
-static void init_control_bitmap (reiserfs_filsys_t * fs)
-{
-    unsigned int i;
-    unsigned long block;
-    unsigned long reserved;
-    
-
-    control_bitmap = reiserfs_create_bitmap(get_sb_block_count(fs->fs_ondisk_sb));
-    if (!control_bitmap)
-	die ("init_control_bitmap: Failed to allocate a control bitmap.");
-
-    /*printf ("Initially number of zeros in control bitmap %d\n", 
-	      reiserfs_bitmap_zeros (control_bitmap));*/
-
-    /* skipped and super block */
-    for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++)
-    	we_met_it (i);
-
-    /*printf ("SKIPPED: %d blocks marked used (%d)\n", hits, 
-              reiserfs_bitmap_zeros (control_bitmap));
-      hits = 0;*/
-
-    /* bitmaps */
-    block = fs->fs_super_bh->b_blocknr + 1;
-    for (i = 0; i < get_sb_bmap_nr (fs->fs_ondisk_sb); i ++) {
-        we_met_it (block);
-
-	if (spread_bitmaps (fs))
-	    block = (block / (fs->fs_blocksize * 8) + 1) * 
-		    (fs->fs_blocksize * 8);
-	else
-	    block ++;	
-    }
-    
-    /*printf ("BITMAPS: %d blocks marked used (%d)\n", hits, 
-	      reiserfs_bitmap_zeros (control_bitmap));
-	      
-      hits = 0;*/
-    
-    /* mark as used area of the main device either containing a journal or
-       reserved to hold it */
-
-    reserved = get_size_of_journal_or_reserved_area (fs->fs_ondisk_sb);
-    
-    /* where does journal area (or reserved journal area) start from */
-
-    if (!is_new_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) &&
-    	!is_old_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
-	die ("init_control_bitmap: Wrong super block location. You must run "
-	     "--rebuild-sb.");
-
-    block = get_journal_start_must (fs);
-
-    for (i = block; i < reserved + block; i ++)
-	we_met_it (i);
-
-    if (fs->fs_badblocks_bm)
-	for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
-	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))
-	    	we_met_it (i);	
-	}
-}
-
-
-/* if we managed to complete tree scanning and if control bitmap and/or proper
-   amount of free blocks mismatch with bitmap on disk and super block's
-   s_free_blocks - we can fix that */
-static void handle_bitmaps (reiserfs_filsys_t * fs)
-{
-    int problem = 0;
-
-    if (tree_scanning_failed) {
-	fsck_progress ("Could not scan the internal tree. --rebuild-tree "
-		       "is required\n");
-	return;
-    }
-
-    fsck_progress ("Comparing bitmaps..");
-
-    /* check free block counter */
-    if (get_sb_free_blocks (fs->fs_ondisk_sb) != 
-	reiserfs_bitmap_zeros (control_bitmap)) 
-    {
-/*	fsck_log ("vpf-10630: The count of free blocks in the on-disk bitmap "
-		  "(%lu) mismatches with the correct one (%lu).\n",  
-		  get_sb_free_blocks (fs->fs_ondisk_sb),
-		  reiserfs_bitmap_zeros (control_bitmap));
-*/
-	problem++;
-    }
-
-    if (reiserfs_bitmap_compare (source_bitmap, control_bitmap))
-	problem++;    
-
-    if (problem) {
-        if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-	    fsck_log ("vpf-10630: The on-disk and the correct bitmaps differs. "
-		"Will be fixed later.\n");
-//            fsck_progress ("Trying to fix bitmap ..\n");
-            /* mark blocks as used in source bitmap if they are used in 
-	       control bitmap */
-            reiserfs_bitmap_disjunction (source_bitmap, control_bitmap);
-            /* change used blocks count accordinly source bitmap, copy bitmap 
-	       changes to on_disk bitmap */
-            set_sb_free_blocks (fs->fs_ondisk_sb, 
-				reiserfs_bitmap_zeros(source_bitmap));
-            reiserfs_bitmap_copy (fs->fs_bitmap2, source_bitmap);
-            mark_buffer_dirty (fs->fs_super_bh);
-/*
-            // check again 
-            if ((diff = reiserfs_bitmap_compare(source_bitmap, 
-						control_bitmap)) != 0)  
-	    {
-                // do not mark them as fatal or fixable because one can live 
-		// with leaked space. So this is not a fatal corruption, and 
-		// fix-fixable cannot fix it 
-                fsck_progress (" bitmaps were not recovered.\n\tYou can either "
-		"run rebuild-tree or live with %d leaked blocks\n", diff);
-            } else {
-                fsck_progress ("finished\n");
-            }
-*/
-        } else if (problem) {
-	    fsck_log ("vpf-10640: The on-disk and the correct bitmaps differs.\n");
-            while (problem) {
-                /* fixable corruptions because we can try to recover them 
-		   without rebuilding the tree */
-        	one_more_corruption (fs, FIXABLE); 
-        	problem --;
-            }
-        }
-    } else 
-        fsck_progress ("finished\n");
-        
-    return;
-}
-
-static int auto_handle_bitmaps (reiserfs_filsys_t *fs) {
-    unsigned long i;
-    
-    if (source_bitmap->bm_byte_size != control_bitmap->bm_byte_size)
-	return -1;
-    
-    for (i = 0; i < source_bitmap->bm_byte_size; i ++) {
-	if (control_bitmap->bm_map[i] & ~source_bitmap->bm_map[i]) {
-	    return 1;
-	}
-    }
-    
-    return 0;
-}
-
-
-/* is this block legal to be pointed to by some place of the tree? */
-static int bad_block_number (reiserfs_filsys_t * fs, unsigned long block)
-{
-    if (block >= get_sb_block_count (fs->fs_ondisk_sb) ||
-	not_data_block (fs, block)) {
-	/* block has value which can not be used as a pointer in a tree */
-	
-	return 1;
-/*
-	if (is_unfm_pointer) {
-	    // unformatted node pointer will be zeroed
-	    one_more_corruption (fs, fixable);
-	    return 1;
-	}
-
-	// internal nodes can not have wrong pointer
-	one_more_corruption (fs, fatal);
-	return 1;
-*/
-
-    }
-
-    if (is_block_free (fs, block)) {
-	/* block is marked free - bitmap problems will be handled later */
-	//one_more_corruption (fs, fixable);
-    }
-
-    return 0;
-}
-
-
-static int got_already (reiserfs_filsys_t * fs, unsigned long block)
-{
-    if (did_we_meet_it (block)) {
-	/* block is in tree at least twice */
-    	return 1;
-    }
-    we_met_it (block);
-    return 0;
-}
-
-/* 1 if it does not look like reasonable stat data */
-static int bad_stat_data (reiserfs_filsys_t * fs, 
-			  struct buffer_head * bh, 
-			  struct item_head * ih)
-{
-    unsigned long objectid;
-//    __u32 links;
-
-    objectid = get_key_objectid (&ih->ih_key);
-    if (!is_objectid_used (fs, objectid)) {
-	/* FIXME: this could be cured right here */
-	fsck_log ("bad_stat_data: The objectid (%lu) is marked free, but used "
-		  "by an object %k\n", objectid, &ih->ih_key);
-
-        /* if it is FIX_FIXABLE we flush objectid map at the end
-           no way to call one_less_corruption later
-        */
-	if (fsck_mode (fs) != FSCK_FIX_FIXABLE)
-	    one_more_corruption (fs, FIXABLE);
-    }
-
-    if (id_map_mark(proper_id_map (fs), objectid)) {
-	fsck_log ("bad_stat_data: The objectid (%lu) is shared by at least two "
-		  "files. Can be fixed with --rebuild-tree only.\n", objectid);
-#if 0
-	to_be_relocated (&ih->ih_key);
-//	one_more_corruption (fs, FIXABLE);	
-#endif
-    }
-
-    return 0;
-/* Check this on semantic_check pass.    
-
-    sd = (struct stat_data *)B_I_PITEM(bh,ih);
-    get_sd_nlink (ih, sd, &links);
-    if (S_ISDIR(sd->sd_mode)) {
-        if (links < 2) {
-            fsck_log ("%s: block %lu: The directory StatData %k has bad nlink number (%u)\n",
-                __FUNCTION__, bh->b_blocknr, &ih->ih_key, links);
-            one_more_corruption (fs, fatal);
-        }
-    } else {
-        if (links == 0) {
-            fsck_log ("%s: block %lu: The StatData %k has bad nlink number (%u)\n",
-                __FUNCTION__, bh->b_blocknr, &ih->ih_key);
-            one_more_corruption (fs, fatal);
-        }
-    }
-*/    
-}
-
-
-/* it looks like we can check item length only */
-static int bad_direct_item (reiserfs_filsys_t * fs, 
-			    struct buffer_head * bh, 
-			    struct item_head * ih)
-{
-    return 0;
-}
-
-
-inline void handle_one_pointer (reiserfs_filsys_t * fs, 
-				struct buffer_head * bh,
-				__u32 * item, int offset)
-{
-    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-	fsck_log (" - zeroed");
-	d32_put (item, offset, 0);
-	mark_buffer_dirty (bh);
-    } else {
-	one_more_corruption (fs, FIXABLE);
-    }
-}
-
-
-static int bad_badblocks_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
-			      struct item_head * ih) {
-    __u32 i;
-    __u32 * ind = (__u32 *)B_I_PITEM (bh, ih);
-
-    if (get_ih_item_len (ih) % 4) {
-	fsck_log ("%s: block %lu: item (%H) has bad length\n", __FUNCTION__,
-		  bh->b_blocknr, ih);
-	one_more_corruption (fs, FATAL);
-	return 1;
-    }
-	
-    /* All valid badblocks are given in badblock bitmap. Nothing to check anymore. */
-    if (fs->fs_badblocks_bm)
-	    return 0;
-    
-    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-	if (!d32_get (ind, i)) {
-/*	    fsck_log ("%s: block %lu: badblocks item (%H) has zero pointer.",
-		      __FUNCTION__, bh->b_blocknr, ih);
-	    
-	    if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
-		    fsck_log("Not an error, but could be deleted with --fix-fixable\n");
-	    } else {
-		    fsck_log("Will be deleted later.\n");
-	    }*/
-	    
-	    continue;
-	}
-
-	/* check list of badblocks pointers */
-	if (d32_get (ind, i) >= get_sb_block_count (fs->fs_ondisk_sb)) {
-	    fsck_log ("%s: badblock pointer (block %lu) points out of disk spase (%lu)",
-			__FUNCTION__, bh->b_blocknr, d32_get (ind, i));
-	    handle_one_pointer (fs, bh, ind, i);
-	    fsck_log ("\n");
-	}
-
-	if (did_we_meet_it (d32_get (ind, i))) {
-	    /* it can be
-	       1. not_data_block
-	       		delete pointer
-	       2. ind [i] or internal/leaf
-	          advice to run fix-fixable if there is no fatal errors
-	          with list of badblocks, say that it could fix it. */
-	
-	    if (not_data_block (fs, d32_get (ind, i))) {
-		fsck_log ("%s: badblock pointer (block %lu) points on fs metadata (%lu)",
-			  __FUNCTION__, bh->b_blocknr, d32_get (ind, i));
-		handle_one_pointer (fs, bh, ind, i);
-		fsck_log ("\n");
-	    } else {
-		one_more_corruption(fs, FIXABLE);
-	        fsck_log ("%s: badblock pointer (block %lu) points to a block (%lu) "
-			  "which is in the tree already. Use badblock option (-B) to"
-			  " fix the problem\n", __FUNCTION__, bh->b_blocknr, 
-			  d32_get (ind, i));
-	    }
-
-	    continue;
-	}
-	
-	we_met_it(d32_get(ind, i));
-    }
-
-    return 0;
-}
-
-/* for each unformatted node pointer: make sure it points to data area and
-   that it is not in the tree yet */
-static int bad_indirect_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
-			      struct item_head * ih)
-{
-    __u32 * ind = (__u32 *)B_I_PITEM (bh, ih);
-    unsigned int i;
-
-    if (get_ih_item_len (ih) % 4) {
-	fsck_log ("%s: block %lu: The item (%H) has the bad length (%u)\n",
-	    __FUNCTION__, bh->b_blocknr, ih, get_ih_item_len (ih));
-	one_more_corruption (fs, FATAL);
-	return 1;
-    }
-
-    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-
-	fsck_check_stat (fs)->unfm_pointers ++;
-	if (!d32_get (ind, i)) {
-	    fsck_check_stat (fs)->zero_unfm_pointers ++;
-	    continue;
-	}
-
-	/* check unformatted node pointer and mark it used in the
-           control bitmap */
-	if (bad_block_number (fs, d32_get (ind, i))) {
-	    fsck_log ("%s: block %lu: The item %k has the bad pointer (%d) to "
-		      "the block (%lu)", __FUNCTION__, bh->b_blocknr, 
-		      &ih->ih_key, i, d32_get (ind, i));
-	    
-	    handle_one_pointer (fs, bh, ind, i);
-	    fsck_log ("\n");
-	    continue;
-	}
-
-        if (got_already (fs, d32_get (ind, i))) {
-	    fsck_log ("%s: block %lu: The item (%H) has the bad pointer (%d) "
-		      "to the block (%lu), which is in tree already", 
-		      __FUNCTION__, bh->b_blocknr, ih, i, d32_get (ind, i));
-	    
-	    handle_one_pointer (fs, bh, ind, i);
-	    fsck_log ("\n");
-            continue;
-	}
-    }
-
-#if 0
-    /* delete this check for 3.6 */
-    if (get_ih_free_space (ih) > fs->fs_blocksize - 1) {
-        if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-            /*FIXME: fix it if needed*/
-        } else {
-            fsck_log ("bad_indirect_item: %H has wrong ih_free_space\n", ih);
-            one_more_corruption (fs, fixable);
-        }
-    }
-#endif
-
-    return 0;
-}
-
-
-/* FIXME: this was is_bad_directory from pass0.c */
-static int bad_directory_item (reiserfs_filsys_t * fs, 
-			       struct buffer_head * bh, 
-			       struct item_head * ih)
-{
-    char *name, *prev_name;
-    __u32 off, prev_off;
-    unsigned int count, i;
-    struct reiserfs_de_head * deh = B_I_DEH (bh, ih);
-    int min_entry_size = 1;/* We have no way to understand whether the
-                              filesystem was created in 3.6 format or
-                              converted to it. So, we assume that minimal name
-                              length is 1 */
-    __u16 state;
-    int namelen;
-
-    count = get_ih_entry_count (ih);
-
-    if (count == 0) {
-	one_more_corruption (fs, FATAL);	
-	return 1;
-    }
-    
-    /* make sure item looks like a directory */
-    if (get_ih_item_len (ih) / (DEH_SIZE + min_entry_size) < count) {
-	/* entry count can not be that big */
-	fsck_log ("%s: block %lu: The directory item %k has the exsessively "
-		  "big entry count (%u)\n",  __FUNCTION__, bh->b_blocknr, 
-		  &ih->ih_key, count);
-	
-	one_more_corruption (fs, FATAL);	
-	return 1;
-    }
-
-    if (get_deh_location (&deh[count - 1]) != DEH_SIZE * count) {
-	/* last entry should start right after array of dir entry headers */
-	fsck_log ("%s: block %lu: The directory item %k has the corrupted "
-		  "entry structure\n", __FUNCTION__, bh->b_blocknr, 
-		  &ih->ih_key);
-	
-	one_more_corruption (fs, FATAL);
-	return 1;
-    }
-    
-    /* check name hashing */
-    prev_name = B_I_PITEM(bh, ih) + get_ih_item_len(ih);
-    prev_off = 0;
-
-    for (i = 0; i < count; i ++, deh ++) {
-	namelen = name_in_entry_length (ih, deh, i);
-	name = name_in_entry (deh, i);
-	off = get_deh_offset (deh);
-	
-	if (namelen > (int)REISERFS_MAX_NAME_LEN(fs->fs_blocksize) || 
-	    name >= prev_name || off <= prev_off) 
-	{
-	    fsck_log ("%s: block %lu: The directory item %k has a broken entry "
-		      "(%d)\n", __FUNCTION__, bh->b_blocknr, &ih->ih_key, i);
-	    one_more_corruption (fs, FATAL);
-	    return 1;
-	}
-
-	if (!is_properly_hashed (fs, name, namelen, off)) {
-	    fsck_log ("%s: block %lu: The directory item %k has a not properly "
-		      "hashed entry (%d)\n", __FUNCTION__, bh->b_blocknr, 
-		      &ih->ih_key, i);
-	    
-	    one_more_corruption (fs, FATAL);
-	    return 1;
-	}
-
-	prev_name = name;
-	prev_off = off;
-    }
-
-    deh = B_I_DEH (bh, ih);
-    state = (1 << DEH_Visible2);
-    /* ok, items looks like a directory */
-    for (i = 0; i < count; i ++, deh ++) {
-	if (get_deh_state (deh) != state) {
-	    fsck_log ("bad_directory_item: block %lu: The directory item %k "
-		      "has the entry (%d) \"%.*s\" with a not legal state "
-		      "(%o), (%o) expected", bh->b_blocknr, &ih->ih_key, i, 
-		      name_in_entry_length (ih, deh, i), name_in_entry (deh, i), 
-		      get_deh_state (deh), state);
-	    
-	    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-		set_deh_state (deh, 1 << DEH_Visible2);
-		mark_buffer_dirty (bh);
-		fsck_log (" - corrected\n");
-	    } else 
-		one_more_corruption (fs, FIXABLE);
-	    
-	    fsck_log ("\n");
-	}
-    }
-
-    return 0;
-}
-
-
-static int bad_item (reiserfs_filsys_t * fs, struct buffer_head * bh, int num)
-{
-    struct item_head * ih;
-    int format;
-
-    ih = B_N_PITEM_HEAD (bh, num);
-
-    if ((get_ih_flags(ih)) != 0) {
-	if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
-	    one_more_corruption (fs, FIXABLE);
-	    fsck_log ("%s: vpf-10570: block %lu: The item header (%d) has not "
-		      "cleaned flags.\n", __FUNCTION__, bh->b_blocknr, num);
-	} else {
-	    fsck_log ("%s: vpf-10580: block %lu: Flags in the item header "
-		      "(%d) were cleaned\n", __FUNCTION__, bh->b_blocknr, num);
-	    
-	    clean_ih_flags(ih);
-	    mark_buffer_dirty(bh);
-	}
-    }
-
-    
-    if (is_stat_data_ih(ih) && get_ih_item_len(ih) == SD_SIZE)
-	format = KEY_FORMAT_2;
-    else if (is_stat_data_ih(ih) && get_ih_item_len(ih) == SD_V1_SIZE)
-	format = KEY_FORMAT_1;
-    else 
-	format = key_format(&ih->ih_key);
-    
-    if (format != get_ih_key_format(ih)) {
-	if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
-	    one_more_corruption (fs, FIXABLE);
-	    fsck_log ("%s: vpf-10710: block %lu: The format (%d) specified "
-		      "in the item header (%d) differs from the key format "
-		      "(%d).\n", __FUNCTION__, bh->b_blocknr, 
-		      get_ih_key_format(ih), num, format);
-	} else {
-	    fsck_log ("%s: vpf-10720: block %lu: The format (%d) specified in "
-		      "the item header (%d) was fixed to the key format (%d).\n", 
-		      __FUNCTION__, bh->b_blocknr, get_ih_key_format(ih), num, 
-		      format);
-
-	    set_ih_key_format(ih, format);
-	    mark_buffer_dirty(bh);
-	}
-    }
-
-    if (get_key_objectid (&ih->ih_key) == BADBLOCK_OBJID) {
-	if (get_key_dirid (&ih->ih_key) == BADBLOCK_DIRID && is_indirect_ih (ih)) {
-		/* Bad Block support. */
-		return bad_badblocks_item (fs, bh, ih);
-	}
-
-	goto error;
-    } else {
-	if (get_key_dirid (&ih->ih_key) == (__u32)-1) {
-	    /*  Safe Link support. Allowable safe links are:
-		-1 object_id           0x1	INDIRECT (truncate) or
-		-1 object_id   blocksize+1	DIRECT   (unlink) */
-	    if (is_direct_ih(ih) && get_offset(&ih->ih_key) == fs->fs_blocksize + 1) {
-		if (get_ih_item_len (ih) == 4) {
-		    /*fsck_log("vpf-00010: safe link found %k\n", &ih->ih_key);*/
-		    fsck_check_stat(fs)->safe ++;
-		    return 0;
-		}
-	    }
-
-	    if (is_indirect_ih(ih) && get_offset(&ih->ih_key) == 0x1) {
-		if (get_ih_item_len (ih) == 4) {
-		    /*fsck_log("vpf-00020: safe link found %k\n", &ih->ih_key);*/
-		    fsck_check_stat(fs)->safe ++;
-		    return 0;
-		}
-	    }
-	
-	    /* it does not look like safe link */
-	    goto error;
-	}
-    }
-    
-    if (is_stat_data_ih (ih))
-	return bad_stat_data (fs, bh, ih);
-
-    if (is_direct_ih (ih))
-	return bad_direct_item (fs, bh, ih);
-
-    if (is_indirect_ih(ih))
-	return bad_indirect_item (fs, bh, ih);
-    
-    return bad_directory_item (fs, bh, ih);
- 
- error:
-    one_more_corruption (fs, FATAL);
-    fsck_log ("%s: vpf-10310: block %lu, item %d: The item has a wrong "
-	      "key %k\n", __FUNCTION__, num, bh->b_blocknr, &ih->ih_key);
-    return 1;
-}
-
-
-/* 1 if i-th and (i-1)-th items can not be neighbors in a leaf */
-int bad_pair (reiserfs_filsys_t * fs, struct buffer_head * bh, int pos) {
-    struct item_head * ih;
-
-    ih = B_N_PITEM_HEAD (bh, pos);
-
-    if (comp_keys (&((ih - 1)->ih_key), &ih->ih_key) != -1) {
-	if (fsck_mode (fs) != FSCK_REBUILD)
-	    one_more_corruption (fs, FATAL);	
-	return 1;
-    }
-
-    if (is_stat_data_ih (ih))
-	/* left item must be of another object */
-	if (comp_short_keys (&((ih - 1)->ih_key), &ih->ih_key) != -1) {
-	    if (fsck_mode (fs) != FSCK_REBUILD)
-		one_more_corruption (fs, FATAL);	
-	    return 1;
-	}
-
-    if (get_key_objectid (&ih->ih_key) == BADBLOCK_OBJID) {
-	/* BAD BLOCK LIST SUPPORT. */
-	if (get_key_dirid(&ih->ih_key) == BADBLOCK_DIRID && 
-	    is_indirect_ih(ih) && comp_short_keys(&((ih - 1)->ih_key), 
-						  &ih->ih_key))
-		return 0;
-    } else {
-	/* Safe link support. */
-	if (get_key_dirid (&ih->ih_key) == (__u32)-1) {
-	    if (comp_short_keys (&((ih - 1)->ih_key), &ih->ih_key) == 0) {
-		if (is_indirect_ih (ih - 1) && is_direct_ih(ih))
-		    return 0; /* safe link */
-		/* they do not look like safe links */
-	    } else {
-		if (is_indirect_ih (ih) || is_direct_ih(ih))
-		    return 0; /* safe link */
-		/* it does not look like safe link */
-	    }
-	}
-    }
-    
-    if (is_direct_ih(ih)) {
-	/* left item must be indirect or stat data item of the same file */
-	if (not_of_one_file (&((ih - 1)->ih_key), &ih->ih_key)) {
-	    if (fsck_mode (fs) != FSCK_REBUILD)
-		one_more_corruption (fs, FATAL);
-	    
-	    return 1;
-	}
-
-	if (!((is_stat_data_ih (ih - 1) && get_offset (&ih->ih_key) == 1) ||
-	      (is_indirect_ih (ih - 1) && get_offset (&(ih - 1)->ih_key) + 
-	       get_bytes_number (ih-1, bh->b_size) == get_offset (&ih->ih_key)))) 
-	{
-	    if (fsck_mode (fs) != FSCK_REBUILD)
-		one_more_corruption (fs, FATAL);
-	    
-	    return 1;
-	}
-    }
-
-    if (is_indirect_ih (ih) || is_direntry_ih (ih)) {
-	/* left item must be stat data of the same object */
-	if (not_of_one_file (&((ih - 1)->ih_key), &ih->ih_key) ||
-	    !is_stat_data_ih (ih - 1)) {
-	    if (fsck_mode (fs) != FSCK_REBUILD)
-		one_more_corruption (fs, FATAL);
-	    return 1;
-	}
-    }
-
-    return 0;
-}
-
-/* 1 if block head or any of items is bad */
-static int bad_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh)
-{
-    int i;
-
-    if (leaf_structure_check(fs, bh))
-	return 1;
-    
-    for (i = 0; i < B_NR_ITEMS (bh); i ++) {
-	if (bad_item (fs, bh, i)) {
-	    fsck_log ("bad_leaf: block %lu, item %d: The corrupted item found "
-		      "(%H)\n", bh->b_blocknr, i, B_N_PITEM_HEAD (bh, i));
-	}
-
-	if (i && bad_pair (fs, bh, i)) {
-	    fsck_log ("bad_leaf: block %lu, items %d and %d: The wrong order "
-		      "of items: %k, %k\n", bh->b_blocknr, i - 1, i, 
-		      &B_N_PITEM_HEAD (bh, i-1)->ih_key, 
-		      &B_N_PITEM_HEAD (bh, i)->ih_key);
-	}
-    }
-    return 0;
-}
-
-/* 1 if bh does not look like internal node */
-static int bad_internal (reiserfs_filsys_t * fs, struct buffer_head * bh)
-{
-    int i;
-
-    for (i = 0; i <= B_NR_ITEMS (bh); i ++) {
-        if (i != B_NR_ITEMS (bh) && i != B_NR_ITEMS (bh) - 1)
-	    /* make sure that keys are in increasing order */
-            if (comp_keys (B_N_PDELIM_KEY (bh, i), 
-			   B_N_PDELIM_KEY (bh, i + 1)) != -1) 
-	    {
-		fsck_log ("%s: vpf-10320: block %lu, items %d and %d: The "
-			  "wrong order of items: %k, %k\n", __FUNCTION__, 
-			  bh->b_blocknr, i, i + 1, B_N_PDELIM_KEY (bh, i), 
-			  B_N_PDELIM_KEY (bh, i + 1));
-		
-		one_more_corruption (fs, FATAL);
-                return 1;
-	    }
-
-	/* make sure that the child is correct */
-        if (bad_block_number (fs, get_dc_child_blocknr (B_N_CHILD (bh,i)))) {
-	    fsck_log ("%s: vpf-10330: block %lu, item %d: The internal item "
-		      "points to the not legal block (%lu)\n", __FUNCTION__, 
-		      bh->b_blocknr, i, get_dc_child_blocknr (B_N_CHILD (bh,i)));
-	    
-            one_more_corruption (fs, FATAL);
-            return 1;
-	}
-    }
-    return 0;
-}
-
-
-/* h == 0 for root level. block head's level == 1 for leaf level  */
-static inline int h_to_level (reiserfs_filsys_t * fs, int h)
-{
-    return get_sb_tree_height (fs->fs_ondisk_sb) - h - 1;
-}
-
-#if 0
-int dc_fix(struct buffer_head *bh, int pos, __u32 block) {
-	if (!bh || !bh->b_data)
-		return -1;
-
-	if (B_NR_ITEMS(bh) < pos)
-		return -1;
-
-	set_dc_child_blocknr(B_N_CHILD(bh,pos), block);
-
-	mark_buffer_dirty(bh);
-	bwrite(bh);
-
-	return 0;
-}
-
-/* Removes @N-th key and @(N+1) pointer. */
-int internal_remove(struct buffer_head *bh, int pos) {
-	char *delete;
-	__u32 nr;
-	
-	if (!bh || !bh->b_data)
-		return -1;
-
-	if (B_NR_ITEMS(bh) < pos)
-		return -1;
-
-	delete = (char *)B_N_CHILD(bh, pos + 2);
-	memmove(delete - DC_SIZE, delete, 
-		bh->b_size - (delete - bh->b_data));
-
-	delete = (char *)B_N_PDELIM_KEY(bh, pos + 1);
-	memmove(delete - KEY_SIZE, delete, 
-		bh->b_size - (delete - bh->b_data));
-
-	nr = B_NR_ITEMS(bh) - 1;
-	
-	set_blkh_nr_items(B_BLK_HEAD(bh), nr);
-	set_blkh_free_space(B_BLK_HEAD(bh), bh->b_size - 
-			    (BLKH_SIZE + KEY_SIZE * nr + DC_SIZE * (nr + 1)));
-	
-	mark_buffer_dirty(bh);
-	bwrite(bh);
-	
-	return 0;
-}
-
-int leaf_fix_key_oid(struct buffer_head *bh, int pos, __u32 oid) {
-	struct item_head * ih;
-
-
-	if (!bh || !bh->b_data)
-		return -1;
-
-	if (B_NR_ITEMS(bh) < pos)
-		return -1;
-
-	ih = B_N_PITEM_HEAD (bh, pos);
-	set_key_objectid(&ih->ih_key, oid);
-	
-	mark_buffer_dirty(bh);
-	bwrite(bh);
-
-	return 0;
-}
-#endif
-
-/* bh must be formatted node. blk_level must be tree_height - h + 1 */
-static int bad_node (reiserfs_filsys_t * fs, struct buffer_head ** path, int h)
-{
-    struct buffer_head ** pbh = &path[h];
-
-    if (B_LEVEL (*pbh) != h_to_level (fs, h)) {
-       	fsck_log ("block %lu: The level of the node (%d) is not correct, "
-		  "(%d) expected\n", (*pbh)->b_blocknr, B_LEVEL (*pbh), 
-		  h_to_level (fs, h));
-	
-	one_more_corruption (fs, FATAL);
-        return 1;
-    }
-
-    if (bad_block_number (fs, (*pbh)->b_blocknr)) {
-	one_more_corruption (fs, FATAL);
-	fsck_log ("%s: vpf-10340: The node in the wrong block number (%lu) "
-		  "found in the tree\n",  __FUNCTION__, (*pbh)->b_blocknr);
-	return 1;
-    }
-
-    if (got_already (fs, (*pbh)->b_blocknr)) {
-	fsck_log ("%s: vpf-10350: The block (%lu) is used more than once "
-		  "in the tree.\n",  __FUNCTION__, (*pbh)->b_blocknr);
-	one_more_corruption (fs, FATAL);
-        return 1;
-    }
-    
-    if (is_leaf_node (*pbh)) {
-	fsck_check_stat (fs)->leaves ++;
-	return bad_leaf (fs, *pbh);
-    }
-    
-    fsck_check_stat (fs)->internals ++;
-    return bad_internal (fs, *pbh);
-}
-
-
-/* internal node bh must point to block */
-static int get_pos (struct buffer_head * bh, unsigned long block)
-{
-    int i;
-
-    for (i = 0; i <= B_NR_ITEMS (bh); i ++) {
-	if (get_dc_child_blocknr (B_N_CHILD (bh, i)) == block)
-	    return i;
-    }
-    die ("An internal pointer to the block (%lu) cannot be found in the node (%lu)", 
-	block, bh->b_blocknr);
-    return 0;
-}
-
-
-/* path[h] - leaf node */
-static struct key * lkey (struct buffer_head ** path, int h)
-{
-    int pos;
-
-    while (h > 0) {
-       pos = get_pos (path[h - 1], path[h]->b_blocknr);
-       if (pos)
-           return B_N_PDELIM_KEY(path[h - 1], pos - 1);
-       h --;
-    }
-    return 0;
-}
-
-
-/* path[h] - leaf node */
-static struct key * rkey (struct buffer_head ** path, int h)
-{
-    int pos;
-
-    while (h > 0) {
-       pos = get_pos (path[h - 1], path[h]->b_blocknr);
-       if (pos != B_NR_ITEMS (path[h - 1]))
-           return B_N_PDELIM_KEY (path[h - 1], pos);
-       h --;
-    }
-    return 0;
-}
-
-
-/* are all delimiting keys correct */
-static int bad_path (reiserfs_filsys_t * fs, struct buffer_head ** path, int h1)
-{
-    int h = 0;
-    struct key * dk;
-    int pos = 0;
-
-    while (path[h])
-	h ++;
-
-    h--;
-    
-    // path[h] is leaf
-    if (h != h1)
-	die ("bad_path: The leaf is expected as the last element in the path");
-
-    if (h)
-	pos = get_pos (path[h - 1], path[h]->b_blocknr);
-
-    dk = lkey (path, h);
-    if (dk && comp_keys (dk, B_N_PKEY (path[h], 0))) {
-	/* left delimiting key must be equal to the key of 0-th item in the
-	   node */
-	fsck_log ("bad_path: The left delimiting key %k of the node (%lu) must "
-	    "be equal to the first element's key %k within the node.\n", dk, 
-	    path[h]->b_blocknr, B_N_PKEY (path[h], 0));
-	one_more_corruption (fs, FATAL);
-	return 1;
-    }
-    
-    dk = rkey (path, h);
-    if (dk && comp_keys (dk, B_N_PKEY (path[h],
-       get_blkh_nr_items (B_BLK_HEAD (path[h])) - 1)) != 1) {
-	/* right delimiting key must be gt the key of the last item in the node */
-	fsck_log ("bad_path: The right delimiting key %k of the node (%lu) must "
-	    "be greater than the last (%d) element's key %k within the node.\n", 
-	    dk, path[h]->b_blocknr, get_blkh_nr_items (B_BLK_HEAD (path[h])) - 1, 
-	    B_N_PKEY (path[h], get_blkh_nr_items (B_BLK_HEAD (path[h])) - 1));
-	one_more_corruption (fs, FATAL);
-	return 1;
-    }
-
-    if (h && (get_dc_child_size (B_N_CHILD(path[h-1],pos)) +
-    	get_blkh_free_space ((struct block_head *)path[h]->b_data) +
-    	BLKH_SIZE != path[h]->b_size))
-    {
-	/* wrong dc_size */
-	fsck_log ("bad_path: block %lu, pointer %d: The used space (%d) of the "
-	    "child block (%lu)", path[h-1]->b_blocknr, pos, 
-	    get_dc_child_size(B_N_CHILD(path[h-1],pos)), path[h]->b_blocknr);
-	fsck_log (" is not equal to the (blocksize (4096) - free space (%d) - "
-	    "header size (%u))", 
-	    get_blkh_free_space((struct block_head *)path[h]->b_data), BLKH_SIZE);
-	
-	if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-	    set_dc_child_size (B_N_CHILD(path[h-1],pos), path[h]->b_size -
-			       get_blkh_free_space ((struct block_head *)path[h]->b_data) 
-			       - BLKH_SIZE);
-	    fsck_log (" - corrected to (%lu)\n", 
-		      get_dc_child_size (B_N_CHILD(path[h-1], pos)));
-	    
-	    mark_buffer_dirty (path[h-1]);
-	} else {
-	    one_more_corruption (fs, FIXABLE);
-	    fsck_log ("\n");
-	    return 1;
-	}
-    }
-
-    return 0;
-}
-
-static void before_check_fs_tree (reiserfs_filsys_t * fs) {
-    init_control_bitmap (fs);
-
-    source_bitmap = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (source_bitmap, fs->fs_bitmap2);
-
-    proper_id_map (fs) = id_map_init();
-}
-
-static void after_check_fs_tree (reiserfs_filsys_t * fs) {
-    if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
-        reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);
-        reiserfs_flush (fs);
-        fs->fs_dirt = 1;
-	reiserfs_bitmap_delta (source_bitmap, control_bitmap);
-	fsck_deallocate_bitmap(fs) = source_bitmap;
-    } else 
-	reiserfs_delete_bitmap (source_bitmap);
-    
-    reiserfs_delete_bitmap (control_bitmap);
-    flush_buffers (fs->fs_dev);
-}
-
-/* pass internal tree of filesystem */
-void check_fs_tree (reiserfs_filsys_t * fs)
-{
-    before_check_fs_tree (fs);
-    
-    fsck_progress ("Checking internal tree..");
-    pass_through_tree (fs, bad_node, bad_path, fsck_mode(fs) == FSCK_AUTO ? 2 : -1);
-    /* internal tree is correct (including all objects have correct
-       sequences of items) */
-    fsck_progress ("finished\n");
-    
-    /* compare created bitmap with the original */
-    if (fsck_mode(fs) == FSCK_AUTO) {
-	if (auto_handle_bitmaps(fs)) {
-	    fprintf(stderr, "The on-disk bitmap looks corrupted.");
-	    one_more_corruption(fs, FIXABLE);
-	}
-	id_map_free(proper_id_map(fs));
-    } else
-	handle_bitmaps (fs);
-    
-    after_check_fs_tree (fs);
-}
-
-static int clean_attributes_handler (reiserfs_filsys_t * fs, 
-				     struct buffer_head ** path, 
-				     int h) 
-{
-    struct buffer_head * bh = path[h];
-    int i;
-
-    if (B_LEVEL (bh) != h_to_level (fs, h)) {
-       	reiserfs_panic ("The node (%lu) with wrong level (%d) found in the "
-			"tree, (%d) expected\n", bh->b_blocknr, B_LEVEL (bh), 
-			h_to_level (fs, h));
-    }
-
-    if (!is_leaf_node (bh))
-        return 0;
-
-    for (i = 0; i < B_NR_ITEMS (bh); i ++) {
-        if (is_stat_data_ih (B_N_PITEM_HEAD (bh, i)) &&
-            get_ih_item_len (B_N_PITEM_HEAD (bh, i)) == SD_SIZE) {
-	    set_sd_v2_sd_attrs((struct stat_data *)B_N_PITEM(bh, i), 0);
-	    mark_buffer_dirty (bh);
-	}
-    }
-
-    return 0;
-}
-
-void do_clean_attributes (reiserfs_filsys_t * fs) {
-    pass_through_tree (fs, clean_attributes_handler, NULL, -1);
-    set_sb_v2_flag (fs->fs_ondisk_sb, reiserfs_attrs_cleared);
-    mark_buffer_dirty (fs->fs_super_bh);
-}
diff --git a/fsck/fsck.h b/fsck/fsck.h
deleted file mode 100644
index 16648a5..0000000
--- a/fsck/fsck.h
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#define _GNU_SOURCE
-
-#ifndef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include "io.h"
-#include "misc.h"
-#include "reiserfs_lib.h"
-
-#include <string.h>
-#include <errno.h>
-#include <time.h>
-#include <assert.h>
-
-#include "../version.h"
-
-/* main.c */
-extern reiserfs_filsys_t * fs;
-int main (int argc, char * argv []);
-
-/* Exit codes. */
-#define EXIT_OK		0
-#define EXIT_FIXED	1
-#define EXIT_REBOOT	2
-#define EXIT_FATAL	4
-#define EXIT_FIXABLE	6
-#define EXIT_OPER	8   /* Some operation returns error. */
-#define EXIT_USER	16
-
-/*
- * modes
- */
-#define DO_NOTHING              0
-#define FSCK_CHECK              1
-#define FSCK_FIX_FIXABLE        2
-#define FSCK_SB                 3
-#define FSCK_REBUILD            4
-#define FSCK_ROLLBACK_CHANGES   5
-#define FSCK_CLEAN_ATTRIBUTES	7
-#define FSCK_AUTO               8 /* -a || -p specified */
-
-/* temporary */
-#define DO_TEST                 9
-
-/*
- * options
- */
-
-#define OPT_INTERACTIVE                 1 << 0
-#define OPT_ADJUST_FILE_SIZE            1 << 1	/* not default yet */
-#define OPT_QUIET                       1 << 2	/* no "speed" info */
-#define OPT_SILENT                      1 << 3	/* no complains about found corruptions */
-#define OPT_BACKGROUND                  1 << 4
-#define OPT_SKIP_JOURNAL                1 << 5
-#define OPT_HASH_DEFINED                1 << 6
-#define OPT_SAVE_PASSES_DUMP            1 << 7
-#define OPT_SAVE_ROLLBACK               1 << 8
-#define OPT_YES				1 << 9
-#define BADBLOCKS_FILE               	1 << 10
-
-
-/* pass0.c */
-void pass_0 (reiserfs_filsys_t *);
-void load_pass_0_result (FILE *, reiserfs_filsys_t *);
-
-int leaf_structure_check(reiserfs_filsys_t * fs, struct buffer_head * bh);
-
-int is_used_leaf (unsigned long block);
-int is_good_unformatted (unsigned long block);
-void mark_good_unformatted (unsigned long block);
-int is_bad_unformatted (unsigned long block);
-
-int are_there_allocable_blocks (unsigned int amout_needed);
-unsigned long alloc_block (void);
-void make_allocable (unsigned long block);
-void register_uninsertable (unsigned long block);
-void register_saved_item (void);
-int still_bad_unfm_ptr_1 (unsigned long block);
-int still_bad_unfm_ptr_2 (unsigned long block);
-void make_alloc_bitmap (reiserfs_filsys_t *);
-
-void delete_aux_bitmaps ();
-void set_aux_bitmaps(reiserfs_bitmap_t * leaves, reiserfs_bitmap_t * good, reiserfs_bitmap_t * bad);
-
-#define __is_marked(name,block) reiserfs_bitmap_test_bit (name##_bitmap, block)
-#define __mark(name,block) reiserfs_bitmap_set_bit (name##_bitmap, block)
-#define __unmark(name,block) reiserfs_bitmap_clear_bit (name##_bitmap, block)
-
-/* unformatted in tree */
-extern reiserfs_bitmap_t * bad_unfm_in_tree_once_bitmap;
-#define is_bad_unfm_in_tree_once(block) __is_marked (bad_unfm_in_tree_once, block)
-#define mark_bad_unfm_in_tree_once(block) __mark (bad_unfm_in_tree_once, block)
-
-
-
-/* pass1.c */
-void pass_1 (reiserfs_filsys_t *);
-void load_pass_1_result (FILE *, reiserfs_filsys_t *);
-struct buffer_head * make_buffer (int dev, unsigned long blocknr, int size, char * data);
-void build_the_tree (void);
-extern int g_unaccessed_items;
-int is_item_reachable (struct item_head * ih);
-void mark_item_reachable (struct item_head * ih, struct buffer_head * bh);
-void mark_item_unreachable (struct item_head * ih);
-
-struct si * remove_saved_item (struct si * si);
-int tree_is_empty (void);
-void make_single_leaf_tree (struct buffer_head * bh);
-
-
-/* pass2.c */
-void pass_2 (reiserfs_filsys_t *);
-void load_pass_2_result (reiserfs_filsys_t *);
-void insert_item_separately (struct item_head * ih, char * item, int was_in_tree);
-void save_item (struct si ** head, struct item_head * ih, char * item, __u32 blocknr);
-struct si * save_and_delete_file_item (struct si * si, struct path * path);
-void take_bad_blocks_put_into_tree (void);
-void rewrite_object (struct item_head * ih, int do_remap);
-void pass_2_take_bad_blocks_put_into_tree (void);
-/*int is_remapped (struct item_head * ih);*/
-void link_relocated_files (void);
-int should_relocate (struct item_head * ih);
-void relocate_dir (struct item_head * ih, int change_ih);
-
-extern __u32 objectid_for_relocation (struct key * key);
-extern void linked_already(struct key *new_key);
-
-/* file.c */
-struct si {
-    struct item_head si_ih;
-    char * si_dnm_data;
-    struct si * si_next;
-    __u32 si_blocknr;
-
-    // changed by XB;
-    struct si * last_known;
-};
-void put_saved_items_into_tree (struct si *);
-int reiserfsck_file_write (struct item_head * ih, char * item, int was_in_tree);
-int are_file_items_correct (struct item_head * sd_ih, void * sd, __u64 * size, __u32 * blocks, int mark_passed_items, int * symlink);
-int delete_N_items_after_key(struct key * start_key, struct si ** save_here, int skip_dir_items, int n_to_delete);
-void rewrite_file (struct item_head * ih, int should_relocate, int should_change_ih);
-
-
-
-/* semantic.c */
-
-/* return values for check_regular_file and check_semantic_tree */
-#define OK 0
-#define STAT_DATA_NOT_FOUND -1
-#define DIRECTORY_HAS_NO_ITEMS -2
-#define RELOCATED -3
-#define LOOP_FOUND -4
-
-void load_semantic_result (FILE *, reiserfs_filsys_t *);
-
-void pass_3_semantic (reiserfs_filsys_t *);
-void semantic_check (void);
-int check_semantic_tree (struct key * key, struct key * parent, int is_dot_dot, int lost_found, struct item_head * new_ih);
-void zero_nlink (struct item_head * ih, void * sd);
-int not_a_directory (void * sd);
-int not_a_regfile (void * sd);
-int fix_obviously_wrong_sd_mode (struct path * path);
-int is_dot_dot (char * name, int namelen);
-int is_dot (char * name, int namelen);
-/*void create_dir_sd (reiserfs_filsys_t * fs, 
-  struct path * path, struct key * key);*/
-int rebuild_check_regular_file (struct path * path, void * sd,
-				struct item_head * new_ih);
-int rebuild_semantic_pass (struct key * key, struct key * parent, int is_dot_dot,
-			   struct item_head * new_ih);
-
-
-
-
-/* lost+found.c */
-void pass_3a_look_for_lost (reiserfs_filsys_t *);
-
-void load_lost_found_result (reiserfs_filsys_t *);
-
-/* pass4.c */
-void pass_4_check_unaccessed_items (void);
-
-/* check.c */
-int is_leaf_bad (struct buffer_head * bh);
-int is_bad_item (struct buffer_head * bh, struct item_head *, char *);
-/*int check_file_system (void);*/
-void reiserfsck_check_pass1 (void);
-/*char * bad_name (char * name, int namelen);*/
-/* to test result of direcotry item recovering on pass 0 */
-int is_bad_directory (struct item_head * ih, char * item, int dev, int blocksize);
-
-
-//extern int bad_block_number (struct super_block * s, blocknr_t block);
-
-/* check_tree.c */
-void check_fs_tree (reiserfs_filsys_t *);
-void do_clean_attributes (reiserfs_filsys_t * fs);
-int bad_pair (reiserfs_filsys_t *, struct buffer_head * bh, int i);
-int bad_leaf_2 (reiserfs_filsys_t *, struct buffer_head * bh);
-
-#if 0
-extern int should_be_relocated (struct key * key);
-extern void to_be_relocated (struct key * key);
-extern void clear_relocated_list(void);
-#endif
-
-/* ustree.c */
-void reiserfsck_paste_into_item (struct path * path, const char * body, int size);
-void reiserfsck_insert_item (struct path * path, struct item_head * ih, const char * body);
-void reiserfsck_delete_item (struct path * path, int temporary);
-void reiserfsck_cut_from_item (struct path * path, int cut_size);
-/*typedef	int (comp3_function_t)(void * key1, void * key2, int version);*/
-/*typedef int (comp_function_t)(struct key * key1, struct key * key2);*/
-/*int ubin_search_id(__u32 * id, __u32 * base, __u32 number, __u32 * pos);*/
-/*int usearch_by_key (struct super_block * s, struct key * key, struct path * path);*/
-/*int usearch_by_key_3 (struct super_block * s, struct key * key, struct path * path, int * repeat, int stop_level,
-		      comp3_function_t comp_func, int version);		
-		      int usearch_by_entry_key (struct super_block * s, struct key * key, struct path * path);*/
-
-typedef int do_after_read_t (reiserfs_filsys_t *, struct buffer_head **, int h);
-typedef int do_on_full_path_t (reiserfs_filsys_t *, struct buffer_head **, int);
-void pass_through_tree (reiserfs_filsys_t *, do_after_read_t, do_on_full_path_t, int depth);
-
-/* bitmap.c */
-int reiserfsck_reiserfs_new_blocknrs (reiserfs_filsys_t * fs,
-				      unsigned long * pblocknrs,
-				      unsigned long start_from,
-				      int amount_needed);
-int reiserfsck_reiserfs_free_block (reiserfs_filsys_t * fs, unsigned long block);
-struct buffer_head * reiserfsck_get_new_buffer (unsigned long start);
-int is_block_used (unsigned long block);
-void mark_block_used (unsigned long block, int check_hardware);
-void mark_block_uninsertable (unsigned long block);
-int is_block_uninsertable (unsigned long block);
-
-
-/* objectid.c */
-int comp_ids(const void *p1, const void *p2);
-
-typedef struct id_map {
-    void **index;
-    __u32 count, last_used;
-} id_map_t;
-
-id_map_t *id_map_init();
-void id_map_free(id_map_t *);
-int id_map_test(id_map_t *map, __u32 id);
-int id_map_mark(id_map_t *map, __u32 id);
-__u32 id_map_alloc(id_map_t *map);
-void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs);
-    
-/* FIXME: Needs to be implemented
-void fetch_objectid_map (struct id_map * map, reiserfs_filsys_t * fs);
-
-void reiserfs_objectid_map_save (FILE * fp, struct id_map * id_map);
-struct id_map * reiserfs_objectid_map_load (FILE * fp);
-*/
-
-void mark_formatted_pointed_by_indirect (__u32);
-int is_formatted_pointed_by_indirect (__u32);
-
-#define MAP_NOT_PACKED	0
-#define MAP_PACKED	1
-
-struct pass0_stat {
-    unsigned long dealt_with; /* number of blocks read during pass 0 */
-    unsigned long leaves; /* blocks looking like reiserfs leaves found */
-    unsigned long leaves_corrected;
-    unsigned long all_contents_removed;
-    unsigned long too_old_leaves; /* these are leaves which contains
-                                     direntries with different hash from the
-                                     one specified with -h */
-    unsigned long wrong_pointers; /* pointers in indirect items pointing to
-                                     wrong area */
-    unsigned long pointed; /* pointers blocks of device pointed by all
-                              indirect items */
-};
-
-
-struct pass1_stat {
-    unsigned long leaves; /* leaves found in pass0 to build tree off */
-    unsigned long inserted_leaves; /* number of leaves inserted by pointers */
-    unsigned long pointed_leaves; /* pointers in indirect items which pointed
-				     to leaves (zeroed) */
-    unsigned long uninsertable_leaves;
-    unsigned long non_unique_pointers; /* pointers to already pointed unformatted nodes */
-    unsigned long correct_pointers;
-    unsigned long saved_items; /* items saved on pass1: should be 0 */
-    unsigned long allocable_blocks; /* allocable blocks before pass 1 starts */
-};
-
-
-struct pass2_stat {
-    unsigned long leaves; /* leaves inserted item by item */
-    unsigned long safe_non_unique_pointers; /* these are just the same pointers */
-    unsigned long relocated;
-    unsigned long shared_objectids;
-    unsigned long rewritten;
-};
-
-
-struct semantic_stat {
-    unsigned long oid_sharing_files_relocated;
-    unsigned long regular_files;
-    unsigned long directories;
-    unsigned long symlinks;
-    unsigned long broken_files;
-    unsigned long others;
-    unsigned long fixed_sizes;
-    unsigned long oid_sharing;
-    unsigned long oid_sharing_dirs_relocated;
-    unsigned long deleted_entries;
-};
-
-
-struct lost_found_stat {
-    unsigned long dir_recovered;
-    unsigned long empty_lost_dirs;
-    unsigned long lost_found;
-    unsigned long lost_found_files;
-    unsigned long lost_found_dirs;
-    unsigned long oid_sharing;
-    unsigned long oid_sharing_dirs_relocated;    
-    unsigned long oid_sharing_files_relocated;    
-};
-
-
-struct pass_4_stat {
-    unsigned long deleted_items;
-};
-
-
-struct rebuild_info {
-    union {
-	struct pass0_stat pass0;
-	struct pass1_stat pass1;
-	struct pass2_stat pass2;
-	struct {
-	    struct semantic_stat semantic;
-	    struct lost_found_stat lost_found;
-	} tree;
-	struct pass_4_stat pass4;
-    } pass_u;
-
-    /* bitmaps */
-    reiserfs_bitmap_t * source_bitmap;
-    reiserfs_bitmap_t * new_bitmap;
-    reiserfs_bitmap_t * allocable_bitmap;
-    reiserfs_bitmap_t * uninsertables;
-
-    char * bitmap_file_name;
-    /*char * new_bitmap_file_name;*/
-    char * passes_dump_file_name; /* after pass 0, 1 or 2 reiserfsck can store
-                                     data with which it will be able to start
-                                     from the point it stopped last time at */
-
-    unsigned short mode;
-    unsigned long options;
-
-    /* rollback file */
-    char * rollback_file;
-  
-    /* hash hits stat */
-    int hash_amount;
-    unsigned long * hash_hits;
-    char * defined_hash;
-
-#define USED_BLOCKS 1
-#define EXTERN_BITMAP 2
-#define ALL_BLOCKS 3
-    int scan_area;
-    int use_journal_area;
-    int test;
-};
-
-
-struct check_info {
-    unsigned long bad_nodes;
-    unsigned long fatal_corruptions;
-    unsigned long fixable_corruptions;
-//    unsigned long badblocks_corruptions;
-    unsigned long leaves;
-    unsigned long internals;
-    unsigned long dirs;
-    unsigned long files;
-    unsigned long safe;
-    unsigned long unfm_pointers;
-    unsigned long zero_unfm_pointers;
-    reiserfs_bitmap_t * deallocate_bitmap;
-};
-
-
-struct fsck_data {
-    unsigned short mode; /* check, rebuild, etc*/
-    unsigned long options;
-    unsigned long mounted;
-
-    struct rebuild_info rebuild;
-    struct check_info check;
-
-    char * journal_dev_name; 
-    /* log file name and handle */
-    char * log_file_name;
-    FILE * log;
-
-    /* this is a file where reiserfsck will explain what it is doing. This is
-       usually stderr. But when -g is specified - reiserfsck runs in the
-       background and append progress information into 'fsck.run' */
-    FILE * progress;
-
-    /* objectid maps */
-    id_map_t * proper_id_map;
-    id_map_t * semantic_id_map; /* this objectid map is used to
-                                        cure objectid sharing problem */
-};
-
-
-#define fsck_data(fs) ((struct fsck_data *)((fs)->fs_vp))
-#define pass_0_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass0))
-#define pass_1_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass1))
-#define pass_2_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass2))
-#define sem_pass_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.tree.semantic))
-#define lost_found_pass_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.tree.lost_found))
-#define pass_4_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass4))
-
-#define fsck_check_stat(fs) (&(fsck_data(fs)->check))
-
-
-#define proper_id_map(s) fsck_data(s)->proper_id_map
-#define semantic_id_map(s) fsck_data(s)->semantic_id_map
-
-#define fsck_source_bitmap(fs) fsck_data(fs)->rebuild.source_bitmap
-#define fsck_new_bitmap(fs) fsck_data(fs)->rebuild.new_bitmap
-#define fsck_allocable_bitmap(fs) fsck_data(fs)->rebuild.allocable_bitmap
-#define fsck_uninsertables(fs) fsck_data(fs)->rebuild.uninsertables
-
-#define fsck_deallocate_bitmap(fs) fsck_data(fs)->check.deallocate_bitmap
-
-#define fsck_interactive(fs) (fsck_data(fs)->options & OPT_INTERACTIVE)
-//#define fsck_fix_fixable(fs) (fsck_data(fs)->options & OPT_FIX_FIXABLE)
-
-#define fsck_run_one_step(fs) (fsck_data(fs)->options & OPT_SAVE_PASSES_DUMP)
-
-#define fsck_save_rollback(fs) (fsck_data(fs)->options & OPT_SAVE_ROLLBACK)
-
-/* change unknown modes (corrupted) to mode of regular files, fix file
-   sizes which are bigger than a real file size, relocate files with
-   shared objectids (this slows fsck down (when there are too many
-   files sharing the same objectid), it will also remove other names
-   pointing to this file */
-#define fsck_adjust_file_size(fs) (fsck_data(fs)->options & OPT_ADJUST_FILE_SIZE)
-#define fsck_quiet(fs)	(fsck_data(fs)->options & OPT_QUIET)
-#define fsck_silent(fs)	(fsck_data(fs)->options & OPT_SILENT)
-#define fsck_in_background(fs) (fsck_data(fs)->options & OPT_BACKGROUND)
-#define fsck_hash_defined(fs) (fsck_data(fs)->options & OPT_HASH_DEFINED)
-#define fsck_skip_journal(fs) (fsck_data(fs)->options & OPT_SKIP_JOURNAL)
-#define fsck_yes_all(fs) (fsck_data(fs)->options & OPT_YES)
-
-
-#define fsck_mode(fs) (fsck_data(fs)->mode)
-#define fsck_log_file(fs) (fsck_data(fs)->log)
-#define fsck_progress_file(fs) ((fs && fsck_data(fs)->progress) ? fsck_data(fs)->progress : stderr)
-
-/* name of file where we store information for continuing */
-#define state_dump_file(fs) fsck_data(fs)->rebuild.passes_dump_file_name
-
-/* name of file where we store rollback data */
-#define state_rollback_file(fs) fsck_data(fs)->rebuild.rollback_file
-
-int fsck_user_confirmed (reiserfs_filsys_t * fs, char * q, char * a, int default_answer);
-void stage_report (int, reiserfs_filsys_t *);
-
-/* journal.c */
-int replay_journal (reiserfs_filsys_t *);
-
-/*pass1: rebuild super block*/
-void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * data);
-
-
-#define fsck_log(fmt, list...) \
-{\
-if (!fsck_silent (fs))\
-    reiserfs_warning (fsck_log_file (fs), fmt, ## list);\
-}
-
-#define fsck_progress(fmt, list...) \
-{\
-reiserfs_warning (fsck_progress_file(fs), fmt, ## list);\
-fflush (fsck_progress_file(fs));\
-}
-
-#define FATAL	1
-#define FIXABLE 2
-
-void one_more_corruption(reiserfs_filsys_t *fs, int kind);
-void one_less_corruption(reiserfs_filsys_t *fs, int kind);
-
-/*
-#define one_more_corruption(fs,kind) fsck_check_stat (fs)->kind##_corruptions++
-#define one_less_corruption(fs,kind) fsck_check_stat (fs)->kind##_corruptions--
-*/
-
-#define fsck_exit(fmt, list...) \
-{\
-reiserfs_warning (fsck_progress_file(fs), fmt, ## list);\
-exit (EXIT_USER);\
-}
diff --git a/fsck/info.c b/fsck/info.c
deleted file mode 100644
index d5621dd..0000000
--- a/fsck/info.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-
-int fsck_user_confirmed (reiserfs_filsys_t * fs, char * q, char * a, int default_answer)
-{
-    if (!fsck_interactive (fs))
-	return default_answer;
-    
-    return user_confirmed (fsck_progress_file (fs), q, a);
-}
-
-
-void stage_report (int pass, reiserfs_filsys_t * fs)
-{
-    switch (pass) {
-    case 0: 
-    {
-	struct pass0_stat * stat;
-
-	/* what has been done on pass 0 */	
-	stat = pass_0_stat (fs);
-	fsck_progress ("\tRead blocks (but not data blocks) %lu\n", stat->dealt_with);
-	fsck_progress ("\t\tLeaves among those %lu\n", stat->leaves);
-	if (stat->leaves_corrected)
-	    fsck_progress ("\t\t\t- corrected leaves %lu\n", stat->leaves_corrected);
-	if (stat->all_contents_removed)
-	    fsck_progress ("\t\t\t- leaves all contents of which could not be saved and deleted %lu\n",
-			   stat->all_contents_removed);
-	if (stat->too_old_leaves)
-	    fsck_progress ("\t\t\t- too old leaves %lu (skipped)\n", stat->too_old_leaves);
-	if (stat->wrong_pointers)
-	    fsck_progress ("\t\tpointers in indirect items to wrong area %lu (zeroed)\n",
-			   stat->wrong_pointers);
-	fsck_progress ("\t\tObjectids found %lu\n", proper_id_map(fs)->count);
-    }
-    break;
-	
-    case 1:
-    {
-	struct pass1_stat * stat;
-
-	/* what has been done on pass 1 */
-	stat = pass_1_stat (fs);
-	fsck_progress ("\t%lu leaves read\n", stat->leaves);
-	fsck_progress ("\t\t%lu inserted\n", stat->inserted_leaves);
-	if (stat->pointed_leaves)
-	    fsck_progress ("\t\t\t- pointers in indirect items pointing to metadata %lu (zeroed)\n",
-			   stat->pointed_leaves);
-	if (stat->saved_items)
-	    fsck_progress ("\tSaved %lu items\n", stat->saved_items);
-	if (stat->uninsertable_leaves)
-	    fsck_progress ("\t\t%lu not inserted\n", stat->uninsertable_leaves);
-	if (stat->non_unique_pointers)
-	    fsck_progress ("\tnon-unique pointers in indirect items (zeroed) %lu\n",
-			   stat->non_unique_pointers);
-    }
-    break;
-
-    case 2:
-    {
-	struct pass2_stat * stat;
-
-	/* what has been done on pass 2 */
-	stat = pass_2_stat (fs);
-	if (stat->leaves)
-	    fsck_progress ("\tLeaves inserted item by item %lu\n", stat->leaves);
-	if (stat->safe_non_unique_pointers)
-	    fsck_progress ("\t%lu \n",
-			   stat->safe_non_unique_pointers);
-	if (stat->shared_objectids)
-	    fsck_progress ("\t%lu shared objectids\n", stat->shared_objectids);
-	if (stat->relocated)
-	    fsck_progress ("\tFiles relocated because of key conflicts with a directory %lu\n",
-			   stat->relocated);
-	if (stat->rewritten)
-	    fsck_progress ("\tFiles rewritten %lu\n", stat->rewritten);
-    }
-    break;
-
-    case 3: /* semantic */
-    {
-	struct semantic_stat * stat;
-
-	/* what has been done on the semantic pass */
-	stat = sem_pass_stat (fs);
-	fsck_progress ("\tFiles found: %ld\n", stat->regular_files);
-	fsck_progress ("\tDirectories found: %ld\n", stat->directories);
-	if (stat->symlinks)
-	    fsck_progress ("\tSymlinks found: %ld\n", stat->symlinks);
-	if (stat->others)
-	    fsck_progress ("\tOthers: %ld\n", stat->others);
-	if (stat->broken_files)
-	    fsck_progress ("\tBroken (of files/symlinks/others): %ld\n", stat->broken_files);
-	if (stat->fixed_sizes)
-	    fsck_progress ("\tFiles with fixed size: %ld\n", stat->fixed_sizes);
-	if (stat->deleted_entries)
-	    fsck_progress ("\tNames pointing to nowhere (removed): %ld\n", stat->deleted_entries);
-	if (stat->oid_sharing)
-	    fsck_progress ("\tObjects having used objectids: %lu\n", stat->oid_sharing);
-	if (stat->oid_sharing_files_relocated)
-	    fsck_progress ("\t\tfiles fixed %lu\n", stat->oid_sharing_files_relocated);
-	if (stat->oid_sharing_dirs_relocated)
-	    fsck_progress ("\t\tdirs fixed %lu\n", stat->oid_sharing_dirs_relocated);
-    }
-    break;
-    
-    case 0x3a: /* lost+found pass */
-    {
-	struct lost_found_stat * stat;
-
-	/* what has been done on the semantic pass */
-	stat = lost_found_pass_stat (fs);
-	if (stat->lost_found)
-	    fsck_progress ("\tObjects without names %lu\n",
-			   stat->lost_found);
-	if (stat->empty_lost_dirs)
-	    fsck_progress ("\tEmpty lost dirs removed %lu\n",
-			   stat->empty_lost_dirs);
-	if (stat->lost_found_dirs)
-	    fsck_progress ("\tDirs linked to /lost+found: %lu\n",
-			   stat->lost_found_dirs);
-	if (stat->dir_recovered)
-	    fsck_progress ("\t\tDirs without stat data found %lu\n",
-			   stat->dir_recovered);
-
-	if (stat->lost_found_files)
-	    fsck_progress ("\tFiles linked to /lost+found %lu\n",
-			   stat->lost_found_files);
-	if (stat->oid_sharing)
-	    fsck_progress ("\tObjects having used objectids: %lu\n", stat->oid_sharing);
-	if (stat->oid_sharing_files_relocated)
-	    fsck_progress ("\t\tfiles fixed %lu\n", stat->oid_sharing_files_relocated);
-	if (stat->oid_sharing_dirs_relocated)
-	    fsck_progress ("\t\tdirs fixed %lu\n", stat->oid_sharing_dirs_relocated);
-    }
-    break;
-
-    case 4: /* removing of unreachable */
-    {
-	struct pass_4_stat * stat;
-
-	/* what has been done on the semantic pass */
-	stat = pass_4_stat (fs);
-	if (stat->deleted_items)
-	    fsck_progress ("\tDeleted unreachable items %lu\n",
-			   stat->deleted_items);
-    }
-    break;
-
-    case 5:
-	fsck_progress ("There are on the filesystem:\n"
-		       "\tLeaves %lu\n\tInternal nodes %lu\n"
-		       "\tDirectories %lu\n\tOther files %lu\n"
-		       "\tData block pointers %lu (%lu of them are zero)\n"
-		       "\tSafe links %lu\n",
-		       fsck_check_stat (fs)->leaves,
-		       fsck_check_stat (fs)->internals,
-		       fsck_check_stat (fs)->dirs,
-		       fsck_check_stat (fs)->files,
-		       fsck_check_stat (fs)->unfm_pointers,
-		       fsck_check_stat (fs)->zero_unfm_pointers,
-		       fsck_check_stat (fs)->safe);
-	
-	
-    } /* switch */
-
-    memset (&fsck_data (fs)->rebuild.pass_u, 0, sizeof (fsck_data (fs)->rebuild.pass_u));
-
-}
-
-
diff --git a/fsck/lost+found.c b/fsck/lost+found.c
deleted file mode 100644
index dfafa23..0000000
--- a/fsck/lost+found.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Copyright 2000-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-
-void erase_name (int len);
-void print_name (char * name, int len);
-
-void modify_item (struct item_head * ih, void * item);
-
-/* fixme: search_by_key is not needed after any add_entry */
-static __u64 _look_for_lost (reiserfs_filsys_t * fs, int link_lost_dirs)
-{
-    struct key key, prev_key, * rdkey;
-    INITIALIZE_PATH (path);
-    int item_pos;
-    struct buffer_head * bh;
-    struct item_head * ih;
-    unsigned long leaves;
-    int is_it_dir;
-    static int lost_files = 0; /* looking for lost dirs we calculate amount of
-				  lost files, so that when we will look for
-				  lost files we will be able to stop when
-				  there are no lost files anymore */
-    int retval;
-    __u64 size;
-
-    key = root_dir_key;
-
-    if (!link_lost_dirs && !lost_files) {
-	/* we have to look for lost files but we know already that there are
-           no any */
-	return 0;
-    }
-	
-    fsck_progress ("Looking for lost %s:\n", link_lost_dirs ? "directories" : "files");
-    leaves = 0;
-
-    /* total size of added entries */
-    size = 0;
-    while (1) {
-	retval = reiserfs_search_by_key_4 (fs, &key, &path);
-	/* fixme: we assume path ends up with a leaf */
-	bh = get_bh (&path);
-	item_pos = get_item_pos (&path);
-	if (retval != ITEM_FOUND) {
-	    if (item_pos == get_blkh_nr_items (B_BLK_HEAD (bh))) {
-		rdkey = uget_rkey (&path);
-		if (!rdkey) {
-		    pathrelse (&path);
-		    break;
-		}
-		key = *rdkey;
-		pathrelse (&path);
-		continue;
-	    }
-	    /* we are on the item in the buffer */
-	}
-
-	/* print ~ how many leaves were scanned and how fast it was */
-	if (!fsck_quiet (fs))
-	    print_how_fast (leaves++, 0, 50, 0);
-
-	for (ih = get_ih (&path); item_pos < get_blkh_nr_items (B_BLK_HEAD (bh)); item_pos ++, ih ++, PATH_LAST_POSITION(&path)++) {
-	    if (is_item_reachable (ih))
-		continue;
-
-	    /* found item which can not be reached */
-	    if (!is_direntry_ih (ih) && !is_stat_data_ih (ih)) {
-		continue;
-	    }
-
-	    if (is_direntry_ih (ih)) {
-		/* if this directory has no stat data - try to recover it */
-		struct key sd;
-		struct path tmp;
-
-		sd = ih->ih_key;
-		set_type_and_offset (KEY_FORMAT_1, &sd, SD_OFFSET, TYPE_STAT_DATA);
-		if (reiserfs_search_by_key_4 (fs, &sd, &tmp) == ITEM_FOUND) {
-		    /* should not happen - because if there were a stat data -
-                       we would have done with the whole directory */
-		    pathrelse (&tmp);
-		    continue;
-		}
-		lost_found_pass_stat (fs)->dir_recovered ++;
-		create_dir_sd (fs, &tmp, &sd, modify_item);
-                id_map_mark(proper_id_map (fs), get_key_objectid (&sd));
-		key = sd;
-		pathrelse (&path);
-		goto cont;
-	    }
-
-
-	    /* stat data marked "not having name" found */
-	    if (is_stat_data_ih (get_ih(&path)))
-		fix_obviously_wrong_sd_mode (&path);
-		
-    	    is_it_dir = ((not_a_directory (B_I_PITEM (bh,ih))) ? 0 : 1);
-
-	    if (is_it_dir) {
-		struct key tmp_key;
-		INITIALIZE_PATH (tmp_path);
-		struct item_head * tmp_ih;
-
-		/* there is no need to link empty lost directories into /lost+found */
-		tmp_key = ih->ih_key;
-		set_type_and_offset (KEY_FORMAT_1, &tmp_key, 0xffffffff, TYPE_DIRENTRY);
-		reiserfs_search_by_key_4 (fs, &tmp_key, &tmp_path);
-		tmp_ih = get_ih (&tmp_path);
-		tmp_ih --;
-		if (not_of_one_file (&tmp_key, tmp_ih))
-		    reiserfs_panic ("not directory found");
-		if (!is_direntry_ih (tmp_ih) ||
-		    (get_deh_offset (B_I_DEH (get_bh (&tmp_path), tmp_ih) + 
-				     get_ih_entry_count (tmp_ih) - 1) == DOT_DOT_OFFSET)) {
-		    /* last directory item is either stat data or empty
-                       directory item - do not link this dir into lost+found */
-		    lost_found_pass_stat (fs)->empty_lost_dirs ++;
-		    pathrelse (&tmp_path);
-		    continue;
-		}
-		pathrelse (&tmp_path);
-	    }
-
-	    if (link_lost_dirs && !is_it_dir) {
-		/* we are looking for directories and it is not a dir */
-		lost_files ++;
-		continue;
-	    }
-
-	    lost_found_pass_stat (fs)->lost_found ++;
-
-	    {
-		struct key obj_key = {0, 0, {{0, 0},}};
-		char * lost_name;
-		struct item_head tmp_ih;
-
-		/* key to continue */
-		key = ih->ih_key;
-		set_key_objectid (&key, get_key_objectid (&key) + 1);
-
-		tmp_ih = *ih;
-		if (id_map_test(semantic_id_map (fs), get_key_objectid (&ih->ih_key))) {
-		    /* objectid is used, relocate an object */
-		    lost_found_pass_stat (fs)->oid_sharing ++;
-		    
-		    if (is_it_dir) {
-			relocate_dir (&tmp_ih, 1);
-			lost_found_pass_stat (fs)->oid_sharing_dirs_relocated ++;
-		    } else {
-			rewrite_file (&tmp_ih, 1, 1);
-			lost_found_pass_stat (fs)->oid_sharing_files_relocated ++;
-		    }		    
-		    
-		    linked_already(&tmp_ih.ih_key);
-		} else {
-		    if (!is_it_dir)
-			id_map_mark(semantic_id_map (fs), get_key_objectid (&ih->ih_key));
-		}
-
-		asprintf (&lost_name, "%u_%u", get_key_dirid (&tmp_ih.ih_key),
-			  get_key_objectid (&tmp_ih.ih_key));
-
-		/* entry in lost+found directory will point to this key */
-		set_key_dirid (&obj_key, get_key_dirid (&tmp_ih.ih_key));
-		set_key_objectid (&obj_key, get_key_objectid (&tmp_ih.ih_key));
-
-		pathrelse (&path);
-		
-		/* 0 does not mean anyting - item with "." and ".." already
-		   exists and reached, so only name will be added */
-		size += reiserfs_add_entry (fs, &lost_found_dir_key, lost_name,
-			name_length (lost_name, lost_found_dir_format), &obj_key, 0/*fsck_need*/);
-
-		
-		if (is_it_dir) {
-		    /* fixme: we hope that if we will try to pull all the
-		       directory right now - then there will be less
-		       lost_found things */
-		    print_name (lost_name, strlen (lost_name));
-		    /*fsck_progress ("\tChecking lost dir \"%s\":", lost_name);*/
-		    rebuild_semantic_pass (&obj_key, &lost_found_dir_key, /*dot_dot*/0, /*reloc_ih*/0);
-		    erase_name (strlen (lost_name));
-		    /*fsck_progress ("finished\n");*/
-		    
-		    lost_found_pass_stat (fs)->lost_found_dirs ++;
-		} else {
-		    if (reiserfs_search_by_key_4 (fs, &obj_key, &path) != ITEM_FOUND)
-			reiserfs_panic ("look_for_lost: lost file stat data %K not found",
-					&obj_key);
-
-		    /* check_regular_file does not mark stat data reachable */
-		    mark_item_reachable (get_ih (&path), get_bh (&path));
-
-		    rebuild_check_regular_file (&path, get_item (&path), 0/*reloc_ih*/);
-		    pathrelse (&path);
-
-		    lost_found_pass_stat (fs)->lost_found_files ++;
-		    lost_files --;
-		}
-
-		free (lost_name);
-		goto cont;
-	    }
-	} /* for */
-
-	prev_key = key;
-	
-	PATH_LAST_POSITION(&path) = item_pos - 1;
-	rdkey = reiserfs_next_key (&path);
-	if (rdkey)
-	    key = *rdkey;
-	else
-	    break;
-	    	
-	if (comp_keys (&prev_key, &key) != -1)
-	    reiserfs_panic ("pass_3a: key must grow 2: prev=%k next=%k",
-			    &prev_key, &key);
-	pathrelse (&path);
-
-    cont:
-	if (!link_lost_dirs && !lost_files) {
-	    break;
-	}
-    }
-
-    pathrelse (&path);
-
-#if 0
-    /* check names added we just have added to/lost+found. Those names are
-       marked DEH_Lost_found flag */
-    fsck_progress ("Checking lost+found directory.."); fflush (stdout);
-    check_semantic_tree (&lost_found_dir_key, &root_dir_key, 0, 1/* lost+found*/);
-    fsck_progress ("finished\n");
-#endif
-
-    return size;
-
-}
-
-static void save_lost_found_result (reiserfs_filsys_t * fs)
-{
-    FILE * file;
-    int retval;
-
-    /* save bitmaps with which we will be able start reiserfs from
-       pass 1 */
-    file = open_file ("temp_fsck_file.deleteme", "w+");
-    if (!file)
-	return;
-
-    reiserfs_begin_stage_info_save (file, LOST_FOUND_DONE);
-    reiserfs_end_stage_info_save (file);
-    close_file (file);
-
-    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
-    if (retval != 0)
-	fsck_progress ("pass 0: Could not rename the temporary file temp_fsck_file.deleteme to %s",
-		       state_dump_file (fs));
-}
-
-/* we have nothing to load from a state file, but we have to fetch
-   on-disk bitmap, copy it to allocable bitmap, and fetch objectid
-   map */
-void load_lost_found_result (reiserfs_filsys_t * fs)
-{
-    fsck_new_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
-
-    fsck_allocable_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
-
-    fs->block_allocator = reiserfsck_reiserfs_new_blocknrs;
-    fs->block_deallocator = reiserfsck_reiserfs_free_block;
-
-    /* we need objectid map on semantic pass to be able to relocate files */
-    proper_id_map (fs) = id_map_init();
-    /* Not implemented yet.
-    fetch_objectid_map (proper_id_map (fs), fs);
-    */
-}
-
-void after_lost_found (reiserfs_filsys_t * fs)
-{
-    /* update super block: objectid map, fsck state */
-    set_sb_fs_state (fs->fs_ondisk_sb, LOST_FOUND_DONE);
-    mark_buffer_dirty (fs->fs_super_bh);
-
-    /* write all dirty blocks */
-    fsck_progress ("Flushing..");
-    id_map_flush(proper_id_map (fs), fs);
-    fs->fs_dirt = 1;
-    reiserfs_flush_to_ondisk_bitmap (fsck_new_bitmap(fs), fs);
-    reiserfs_flush (fs);
-    fsck_progress ("finished\n");
-
-    stage_report (0x3a, fs);
-
-    if (!fsck_run_one_step (fs)) {
-	if (fsck_user_confirmed (fs, "Continue? (Yes):", "Yes\n", 1))
-	    /* reiserfsck continues */
-	    return;
-    }
-
-    save_lost_found_result (fs);
-
-    id_map_free(proper_id_map (fs));
-    proper_id_map (fs) = 0;
-
-    fs->fs_dirt = 1;
-    reiserfs_close (fs);
-    exit(EXIT_OK);
-}
-
-void pass_3a_look_for_lost (reiserfs_filsys_t * fs)
-{
-    INITIALIZE_PATH (path);
-    struct item_head * ih;
-    void * sd;
-    __u64 size, sd_size;
-    __u32 blocks;
-    __u16 mode;
-    __u32 objectid;
-    unsigned int gen_counter;
-    fsck_progress ("Pass 3a (looking for lost dir/files):\n");
-
-    /* when warnings go not to stderr - separate them in the log */
-    if (fsck_log_file (fs) != stderr)
-	fsck_log ("####### Pass 3a (lost+found pass) #########\n");
-
-
-    /* look for lost dirs first */
-    size = _look_for_lost (fs, 1);
-
-    /* link files which are still lost */
-    size += _look_for_lost (fs, 0);
-
-    /* update /lost+found sd_size and sd_blocks (nlink is correct already) */
-
-    objectid = reiserfs_find_entry (fs, &root_dir_key, "lost+found",
-                                       &gen_counter, &lost_found_dir_key);
-
-    if (!objectid) {
-       reiserfs_panic ("look_for_lost: The entry 'lost+found' could not be found in the root directory.");
-    }
-
-    if (reiserfs_search_by_key_4 (fs, &lost_found_dir_key, &path) != ITEM_FOUND)
-	reiserfs_panic ("look_for_lost: The StatData of the 'lost+found' directory %K could not be found",
-			&lost_found_dir_key);
-    ih = get_ih (&path);
-    sd = get_item (&path);
-    get_sd_size (ih, sd, &sd_size);
-    size += sd_size;
-    blocks = dir_size2st_blocks (size);
-
-    set_sd_size (ih, sd, &size);
-    set_sd_blocks (ih, sd, &blocks);
-
-    /* make lost+found to be drwx------ */
-    mode = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR;
-    set_sd_mode (ih, sd, &mode);
-
-    mark_buffer_dirty (get_bh (&path));
-    pathrelse (&path);
-
-    after_lost_found (fs);
-}
-
diff --git a/fsck/pass0.c b/fsck/pass0.c
deleted file mode 100644
index 8d91cc4..0000000
--- a/fsck/pass0.c
+++ /dev/null
@@ -1,1999 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-
-
-/* 
- * Pass0 scans the used part of the partition. It creates two maps which will 
- * be used on the pass 1. These are a map of nodes looking like leaves and 
- * a map of "bad" unformatted nodes. After pass 0 we can detect unformatted 
- * node pointers pointing to leaves. 
- */
-
-
-/* leaves */
-reiserfs_bitmap_t * leaves_bitmap;
-#define pass0_is_leaf(block) __is_marked (leaves, block)
-#define pass0_mark_leaf(block) __mark (leaves, block)
-
-/* nodes which are referred to from only one indirect item */
-reiserfs_bitmap_t * good_unfm_bitmap;
-#define pass0_is_good_unfm(block) __is_marked (good_unfm, block)
-#define pass0_mark_good_unfm(block) __mark (good_unfm, block)
-#define pass0_unmark_good_unfm(block) __unmark (good_unfm, block)
-
-/* nodes which are referred to from more than one indirect item */
-reiserfs_bitmap_t * bad_unfm_bitmap;
-#define pass0_is_bad_unfm(block) __is_marked (bad_unfm, block)
-#define pass0_mark_bad_unfm(block) __mark (bad_unfm, block)
-#define pass0_unmark_bad_unfm(block) __unmark (bad_unfm, block)
-
-static int correct_direct_item_offset (__u64 offset, int format) {
-    if (format == KEY_FORMAT_2) {
-        return (offset && ((offset - 1) % 8 == 0));
-    } else {
-	return (offset);
-    }
-    return 0;
-}
-
-/* bitmaps which are built on pass 0 and are used on pass 1 */
-static void make_aux_bitmaps (reiserfs_filsys_t * fs)
-{
-    struct reiserfs_super_block * sb;
-
-    sb = fs->fs_ondisk_sb;
-
-    /* bitmap of leaves found on the device */
-    leaves_bitmap = reiserfs_create_bitmap (get_sb_block_count (sb));
-
-    good_unfm_bitmap = reiserfs_create_bitmap (get_sb_block_count (sb));
-
-    bad_unfm_bitmap = reiserfs_create_bitmap (get_sb_block_count (sb));
-}
-
-
-void delete_aux_bitmaps (void)
-{
-    reiserfs_delete_bitmap (leaves_bitmap);
-    reiserfs_delete_bitmap (good_unfm_bitmap);
-    reiserfs_delete_bitmap (bad_unfm_bitmap);
-}
-
-
-/* register block some indirect item points to */
-static void register_unfm (unsigned long block)
-{
-    if (!pass0_is_good_unfm (block) && !pass0_is_bad_unfm (block)) {
-	/* this block was not pointed by other indirect items yet */
-	pass0_mark_good_unfm (block);
-	return;
-    }
-
-    if (pass0_is_good_unfm (block)) {
-	/* block was pointed once already, unmark it in bitmap of good
-           unformatted nodes and mark in bitmap of bad pointers */
-	pass0_unmark_good_unfm (block);
-	pass0_mark_bad_unfm (block);
-	return;
-    }
-
-    assert (pass0_is_bad_unfm (block));
-}
-
-
-/* 'upper' item is correct if 'upper + 2' exists and its key is greater than
-   key of 'upper' */
-static int upper_correct (struct buffer_head * bh, struct item_head * upper,
-			  int upper_item_num)
-{
-    if (upper_item_num + 2 < B_NR_ITEMS (bh)) {
-	if (comp_keys (&upper->ih_key, &(upper + 2)->ih_key) != -1)
-	    /* item-num's item is out of order of order */
-	    return 0;
-	return 1;
-    }
-    
-    /* there is no item above the "bad pair" */
-    return 2;
-}
-
-
-/* 'lower' item is correct if 'lower - 2' exists and its key is smaller than
-   key of 'lower' */
-static int lower_correct (struct buffer_head * bh, struct item_head * lower,
-			  int lower_item_num)
-{
-    if (lower_item_num - 2 >= 0) {
-	if (comp_keys (&(lower - 2)->ih_key, &lower->ih_key) != -1)
-	    return 0;
-	return 1;
-    }
-    return 2;
-}
-
-
-/* return 1 if something was changed */
-static int correct_key_format (struct item_head * ih, int symlink)
-{
-    int dirty = 0;
-
-    if (is_stat_data_ih (ih)) {
-	/* for stat data we have no way to check whether key format in item
-	   head matches to the key format found from the key directly */
-	if (get_ih_item_len (ih) == SD_V1_SIZE) {
-	    if (get_ih_key_format (ih) != KEY_FORMAT_1) {
-		/*fsck_log ("correct_key_format: ih_key_format of (%H) is set to format 1\n",
-		  ih);*/
-		set_ih_key_format (ih, KEY_FORMAT_1);
-		return 1;
-	    }
-	    return 0;
-	}
-	if (get_ih_item_len (ih) == SD_SIZE) {
-	    if (get_ih_key_format (ih) != KEY_FORMAT_2) {
-		/*fsck_log ("correct_key_format: ih_key_format of (%H) is set to format 2\n",
-		  ih);*/
-		set_ih_key_format (ih, KEY_FORMAT_2);
-		return 1;
-	    }
-	    return 0;
-	}
-	
-	die ("stat_data item of the wrong length");
-    }
-    
-    if (symlink && is_direct_ih(ih) && (key_format(&ih->ih_key) != KEY_FORMAT_1)) {	
-	/* All symlinks are of 3.5 format */
-	/*fsck_log ("correct_key_format: Symlink keys should be of 3.5 format. %k - fixed.\n", &ih->ih_key); */
-	set_type_and_offset(KEY_FORMAT_1, &ih->ih_key, get_offset(&ih->ih_key), get_type(&ih->ih_key));
-    }
-	
-    if (key_format (&ih->ih_key) != get_ih_key_format (ih)) {
-	/*fsck_log ("correct_key_format: ih_key_format of (%H) is set to format found in the key\n",
-	  ih);*/
-	set_ih_key_format (ih, key_format (&ih->ih_key));
-	dirty = 1;
-    }
-    
-    if (is_direct_ih (ih) && get_offset (&ih->ih_key) > fs->fs_blocksize * 4) {
-	/*fsck_log ("correct_key_format: %H made of indirect type\n", ih);*/
-	set_type (key_format (&ih->ih_key), &ih->ih_key, TYPE_INDIRECT);
-	if (get_offset (&ih->ih_key) % fs->fs_blocksize != 1)
-	    fsck_log ("correct_key_format: Item header's key has the wrong offset %H\n", ih);
-	dirty = 1;
-    }
-    
-    return dirty;
-}
-
-#if 0
-/* fixme: we might try all available hashes */
-static int prob_name (reiserfs_filsys_t * fs,
-		      char ** name, int max_len, __u32 deh_offset)
-{
-    int start; /* */
-    int len;
-
-    for (start = 0; start < max_len; start ++) {
-	for (len = 0; len < max_len - start; len ++) {
-	    if (is_properly_hashed (fs, *name + start, len + 1, deh_offset)) {
-		*name = *name + start;
-		return len + 1;
-	    }
-	}
-    }
-    return 0;
-}
-#endif
-
-
-static void hash_hits_init (reiserfs_filsys_t * fs)
-{
-    fsck_data (fs)->rebuild.hash_amount = known_hashes ();
-    fsck_data (fs)->rebuild.hash_hits = getmem (sizeof (unsigned long) * fsck_data (fs)->rebuild.hash_amount);
-    return;
-}
-
-
-static void add_hash_hit (reiserfs_filsys_t * fs, int hash_code)
-{
-    fsck_data (fs)->rebuild.hash_hits [hash_code] ++;
-}
-
-
-/* deh_location look reasonable, try to find name length. return 0 if
-   we failed */
-static int try_to_get_name_length (struct item_head * ih, struct reiserfs_de_head * deh,
-				int i)
-{
-    int len;
-
-    if (i == 0 || !de_bad_location (deh - 1)) {
-	len = name_in_entry_length (ih, deh, i);
-	return (len > 0) ? len : 0;
-    }
-
-    /* previous entry had bad location so we had no way to find
-       name length */
-    return 0;
-}
-
-
-
-/* define this if you are using -t to debug recovering of corrupted directory
-   item */
-#define DEBUG_VERIFY_DENTRY
-#undef DEBUG_VERIFY_DENTRY
-
-
-/* check directory item and try to recover something */
-static int verify_directory_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
-				  int item_num)
-{
-    struct item_head * ih;
-    struct item_head tmp;
-    char * item;
-    struct reiserfs_de_head * deh;
-    char * name;
-    int name_len;
-    int bad, lost_found;
-    int i, j;
-    char buf[4096];
-    int dirty;
-    int hash_code;
-    int bad_locations;
-    int min_entry_size = 1;
-
-#ifdef DEBUG_VERIFY_DENTRY
-    char * direntries;
-#endif
-
-
-    ih = B_N_PITEM_HEAD (bh, item_num);
-    item = B_I_PITEM (bh,ih);
-    deh = (struct reiserfs_de_head *)item;
-
-    dirty = 0;
-    bad_locations = 0;
- 
-    if ( (get_ih_entry_count (ih) > (get_ih_item_len(ih) / (DEH_SIZE + min_entry_size))) ||
-          (get_ih_entry_count (ih) == 0))
-    {
-        set_ih_entry_count (ih, (int)get_ih_item_len(ih) / (DEH_SIZE + min_entry_size));
-        mark_buffer_dirty (bh);
-    }
-
-    if (get_ih_entry_count (ih) == 0) {
-	delete_item (fs, bh, item_num);
-	return -1;
-    }
-
-
-    /* check deh_location */
-    for (i = 0; i < get_ih_entry_count (ih); i ++) {
-	/* silently fix deh_state */
-	if (get_deh_state (deh + i) != (1 << DEH_Visible2)) {
-	    set_deh_state (deh + i, (1 << DEH_Visible2));
-	    mark_buffer_dirty (bh);
-	}
-	if (dir_entry_bad_location (deh + i, ih, !i))
-	    mark_de_bad_location (deh + i);
-    }    
-
-#ifdef DEBUG_VERIFY_DENTRY
-    direntries = getmem (ih_entry_count (ih) * sizeof (int));
-
-    printf ("Entries with bad locations within the directory: ");
-    for (i = 0; i < ih_entry_count (ih); i ++) {
-	if (de_bad_location (deh + i))
-	    printf ("%d ", i);
-    }
-    printf ("\n");
-#endif /* DEBUG_VERIFY_DENTRY */
-
-
-    /* find entries names in which have mismatching deh_offset */
-    for (i = get_ih_entry_count (ih) - 1; i >= 0; i --) {
-	if (de_bad (deh + i))
-	    /* bad location */
-	    continue;
-
-	if (i) {
-	    if (get_deh_location (deh + i - 1) < get_deh_location (deh + i))
-		mark_de_bad_location (deh + i - 1);
-	}
-
-	name = name_in_entry (deh + i, i);
-	/* Although we found a name, we not always can get its length as
-           it depends on deh_location of previous entry. */
-	name_len = try_to_get_name_length (ih, deh + i, i);
-
-#ifdef DEBUG_VERIFY_DENTRY
-	if (name_len == 0)
-	    printf ("Trying to find the name length for %d-th entry\n", i);
-#endif /* DEBUG_VERIFY_DENTRY */
-	if (is_dot (name, name_len)) {
-	    if (i != 0)
-		fsck_log ("block %lu: item %d: \".\" must be the first entry, but it is the %d-th entry\n",
-			  bh->b_blocknr, item_num, i);
-	    /* check and fix "." */
-	    
-	    if (get_deh_offset (deh + i) != DOT_OFFSET) {
-		set_deh_offset (deh + i, DOT_OFFSET);
-		mark_buffer_dirty (bh);
-	    }
-	    /* "." must point to the directory it is in */
-/*
-	    if (not_of_one_file (&(deh[i].deh2_dir_id), &(ih->ih_key))) {
-		fsck_log ("verify_direntry: block %lu, item %H has entry \".\" "
-			  "pointing to (%K) instead of (%K)\n", 
-			  bh->b_blocknr, ih,
-			  &(deh[i].deh2_dir_id), &(ih->ih_key));
-		set_deh_dirid (deh + i, get_key_dirid (&ih->ih_key));
-		set_deh_objectid (deh + i, get_key_objectid (&ih->ih_key));
-		mark_buffer_dirty (bh);
-	    }
-*/
-	} else if (is_dot_dot (name, name_len)) {
-	    if (i != 1)
-		fsck_log ("block %lu: item %d: \"..\" is %d-th entry\n",
-			  bh->b_blocknr, item_num, i);
-	    
-	    /* check and fix ".." */
-	    if (get_deh_offset (deh + i) != DOT_DOT_OFFSET) {
-		set_deh_offset (deh + i, DOT_DOT_OFFSET);
-		mark_buffer_dirty (bh);
-	    }
-	} else {
-	    int min_length, max_length;
-
-	    /* check other name */
-
-	    if (name_len == 0) {
-		/* we do not know the length of name - we will try to find it */
-		min_length = 1;
-		max_length = item + get_ih_item_len (ih) - name;
-	    } else
-		/* we kow name length, so we will try only one name length */
-		min_length = max_length = name_len;
-
-	    hash_code = 0;
-
-	    for (j = min_length; j <= max_length; j ++) {
-		hash_code = find_hash_in_use (name, j, get_deh_offset (deh + i),
-					      get_sb_hash_code (fs->fs_ondisk_sb));
-/*		add_hash_hit (fs, hash_code);*/
-		if (code2func (hash_code) != 0) {
-		    /* deh_offset matches to some hash of the name */
-		    if (fsck_hash_defined (fs) && 
-			hash_code != func2code (fs->fs_hash_function)) {
-			/* wrong hash selected - so we can skip this leaf */
-			return 1;
-		    }
-
-		    if (!name_len) {
-			fsck_log ("%s: block %lu, item %H: Found a name \"%.*s\" for %d-th entry "
-				  "matching to the hash %u.\n", __FUNCTION__,
-				  bh->b_blocknr, ih, j, name, i, get_deh_offset (deh + i));
-			/* FIXME: if next byte is 0 we think that the name is aligned to 8 byte boundary */
-			if (i) {
-			    set_deh_location (&deh[i - 1], get_deh_location (deh + i) +
-					    ((name[j] || fs->fs_format == REISERFS_FORMAT_3_5) ? j : ROUND_UP (j)));
-			    mark_de_good_location (deh + i - 1);
-			    mark_buffer_dirty (bh);
-			}
-		    }
-		    break;
-		}
-	    }
-
-	    add_hash_hit (fs, hash_code);
-
-	    if (j == max_length + 1) {
-		/* deh_offset does not match to anything. it will be
-		   deleted for now, but maybe we could just fix a
-		   deh_offset if it is in ordeer */
-		mark_de_bad_offset (deh + i);
-	    }
-	}
-    } /* for */
-
-#ifdef DEBUG_VERIFY_DENTRY
-    printf ("Entries with mismatching hash: ");
-    for (i = 0; i < ih_entry_count (ih); i ++) {
-	if (de_bad_offset (deh + i))
-	    printf ("%d ", i);
-    }
-    printf ("\n");
-#endif /* DEBUG_VERIFY_DENTRY */
-
-
-    /* correct deh_locations such that code cutting entries will not get
-       screwed up */
-    {
-	int prev_loc;
-	int loc_fixed;
-
-
-	prev_loc = get_ih_item_len (ih);
-	for (i = 0; i < get_ih_entry_count (ih); i ++) {
-	    loc_fixed = 0;
-	    if (de_bad_location (deh + i)) {
-		set_deh_location (deh + i, prev_loc/* - 1*/);
-		mark_buffer_dirty (bh);
-		loc_fixed = 1;
-	    } else {
-		if (get_deh_location (deh + i) >= prev_loc) {
-		    set_deh_location (deh + i, prev_loc/* - 1*/);
-		    mark_buffer_dirty (bh);
-		    loc_fixed = 1;
-		}
-	    }
-
-	    prev_loc = get_deh_location (deh + i);
-	    
-	    if (i == get_ih_entry_count (ih) - 1) {
-		/* last entry starts right after an array of dir entry headers */
-		if (!de_bad (deh + i) &&
-		    get_deh_location (deh + i) != (DEH_SIZE * get_ih_entry_count (ih))) {
-		    /* free space in the directory item */
-		    fsck_log ("%s: block %lu, item %H: Directory item has a free space - deleting\n", 
-			__FUNCTION__, bh->b_blocknr, ih);
-		    cut_entry (fs, bh, item_num, get_ih_entry_count (ih), 0);
-		}
-		if (get_deh_location (deh + i) != (DEH_SIZE * get_ih_entry_count (ih))) {
-		    set_deh_location (&deh[i], (DEH_SIZE * get_ih_entry_count (ih)));
-		    loc_fixed = 1;
-		    mark_buffer_dirty (bh);
-		}
-	    }
-
-#ifdef DEBUG_VERIFY_DENTRY
-	    if (loc_fixed)
-		direntries [i] = 1;
-#endif
-	} /* for */
-
-#ifdef DEBUG_VERIFY_DENTRY
-	printf ("Entries with fixed deh_locations: ");
-	for (i = 0; i < ih_entry_count (ih); i ++) {
-	    if (direntries [i])
-		printf ("%d ", i);
-	}
-	printf ("\n");
-#endif /* DEBUG_VERIFY_DENTRY */
-
-    }
-
-#ifdef DEBUG_VERIFY_DENTRY
-    printf (" N  location name\n");
-    for (i = 0; i < ih_entry_count (ih); i ++) {
-	if (de_bad (deh + i) ||
-	    (i && de_bad (deh + i - 1)) || /* previous entry marked bad */
-	    (i < ih_entry_count (ih) - 1 && de_bad (deh + i + 1))) { /* next entry is marked bad */
-	    /* print only entries to be deleted and their nearest neighbors */
-	    printf ("%3d: %8d ", i, deh_location (deh + i));
-	    if (de_bad (deh + i))
-		printf ("will be deleted\n");
-	    else
-		printf ("\"%.*s\"\n", name_in_entry_length (ih, deh + i, i),
-			name_in_entry (deh + i, i));
-	}
-    }
-#endif
-
-    bad = lost_found = 0;
-    tmp = *ih;
-
-    /* mark enries of /lost+found as bad */
-    deh = B_I_DEH (bh, ih);
-    for (i = 0; i < get_ih_entry_count (ih); i ++, deh ++) {
-	unsigned int dirid, objectid;
-
-	if (de_bad (deh))
-	    continue;
-
-	sprintf (buf, "%.*s", name_in_entry_length (ih, deh, i), name_in_entry (deh, i));
-	if (sscanf (buf, "%d_%d", &dirid, &objectid) != 2)
-	    continue;
-	
-	if (get_deh_dirid (deh) != dirid || get_deh_objectid (deh) != objectid)
-	    continue;
-	
-	/* entry in lost+found */
-//	printf ("%s - will be deleted\n", buf);
-	lost_found++;
-	mark_de_bad_offset (deh);
-    }
-
-    /* delete entries which are marked bad */
-    for (i = 0; i < get_ih_entry_count (ih); i ++) {
-	deh = B_I_DEH (bh, ih) + i;
-	if (de_bad (deh)) {
-	    bad ++;
-	    if (get_ih_entry_count (ih) == 1) {
-		delete_item (fs, bh, item_num);
-		break;
-	    } else {
-		cut_entry (fs, bh, item_num, i, 1);
-	    }
-	    i --;
-	}
-    }
-    
-    if (bad == get_ih_entry_count (&tmp)) {
-	if (lost_found != bad) {
-	    fsck_log ("%s: block %lu, item %H: All entries were deleted from the directory\n", 
-		      __FUNCTION__, bh->b_blocknr, &tmp);	
-	}
-	return -1;
-    }
-
-    deh = B_I_DEH (bh, ih);
-    if (get_offset (&ih->ih_key) != get_deh_offset (deh)) {
-	fsck_log ("verify_direntry: block %lu, item %H: Key's offset %k must match the directory's hash (%u) - changed.\n",
-		  bh->b_blocknr, ih, &ih->ih_key, get_deh_offset (deh));
-	set_offset (key_format (&ih->ih_key), &ih->ih_key, get_deh_offset (deh));
-	mark_buffer_dirty (bh);
-    }
-    
-    if (bad > lost_found)
-	fsck_log ("pass0: block %lu, item %H: %d entries were deleted\n",
-		  bh->b_blocknr, &tmp, bad - lost_found);
-	
-    return 0;
-
-}
-
-
-static __inline__ int does_it_fit_into_dev (__u64 offset, __u64 fs_size) {
-/* 
-   Count of unformatted pointers - offset / blocksize
-   Count of blocks to store them - UNFM_P_SIZE * offset / blocksize / MAX_ITEM_LEN
-   Size to store it              - blocksize * UNFM_P_SIZE * offset / blocksize / MAX_ITEM_LEN
-*/
-   return ( UNFM_P_SIZE * offset / MAX_ITEM_LEN(fs->fs_blocksize) < fs_size) ? 1 : 0;
-}
-
-
-static int is_wrong_short_key (struct key * key) {
-    if (get_key_dirid (key) == 0 || get_key_objectid (key) == 0 || get_key_objectid (key) == 1 ||
-	get_key_dirid (key) == ~(__u32)0 || get_key_objectid (key) == ~(__u32)0 ||
-	get_key_dirid (key) == get_key_objectid (key) ||
-	/* the alloc=packing_groups used to allow dirid = 1
-	(get_key_dirid (key) == 1 && get_key_objectid (key) != 2) || */
-	(get_key_dirid (key) != 1 && get_key_objectid (key) == 2) )
-	return 1;
-
-    return 0;
-}
-
-/* 1 if some of fields in the block head of bh look bad */
-int leaf_structure_check (reiserfs_filsys_t * fs, struct buffer_head * bh) {
-    struct block_head * blkh;
-    int free_space, counted;
-
-    blkh = B_BLK_HEAD (bh);
-    
-    if (!is_leaf_block_head(bh->b_data)) {
-	/* We should not get here on rebuild. */
-	fsck_log ("block %lu: The block does not look like a leaf.\n", bh->b_blocknr);
-        one_more_corruption (fs, FATAL);
-	return 1;
-    }
-
-    if (get_blkh_nr_items (blkh) == 0)
-	return 0;
-    
-    counted = leaf_count_ih(bh->b_data, bh->b_size);
-
-    if (counted < get_blkh_nr_items (blkh)) {
-	fsck_log ("block %lu: The number of items (%lu) is incorrect, should be (%lu)",
-		bh->b_blocknr, get_blkh_nr_items(blkh), counted);
-	if (fsck_mode(fs) == FSCK_REBUILD) {
-	    set_blkh_nr_items(blkh, counted);	    
-	    fsck_log (" - corrected\n");
-	    mark_buffer_dirty (bh);
-	} else {
-	    fsck_log ("\n");
-	    one_more_corruption (fs, FATAL);
-	    return 1;
-	}
-    }
-    
-    free_space = leaf_free_space_estimate(bh->b_data, bh->b_size);
-    if (get_blkh_free_space (blkh) != free_space) {
-	fsck_log ("block %lu: The free space (%lu) is incorrect, should be (%lu)",
-		bh->b_blocknr, get_blkh_free_space (blkh), free_space);
-	
-	if (fsck_mode(fs) != FSCK_CHECK && fsck_mode(fs) != FSCK_AUTO) {
-	    set_blkh_free_space (blkh, free_space);	    
-	    fsck_log (" - corrected\n");
-	    mark_buffer_dirty (bh);
-	} else {
-	    fsck_log ("\n");
-	    one_more_corruption (fs, FIXABLE);
-	    return 1;
-	}
-    }
-
-    return 0;
-}
-
-/* do this on pass 0 with every leaf marked used */
-
-/* FIXME: we can improve fixing of broken keys: we can ssfe direct items which
-   go after stat data and have broken keys */
-static void pass0_correct_leaf (reiserfs_filsys_t * fs,
-				struct buffer_head * bh)
-{
-    int file_format = KEY_FORMAT_UNDEFINED;
-    struct item_head * ih;
-    
-    __u32 * ind_item;
-    __u64 fs_size;
-    __u64 offset;
-    int symlnk = 0;
-    int bad_order;
-    
-    unsigned long unfm_ptr;
-//    unsigned int nr_items;
-    int i, j, nr_items;
-    int dirty = 0;
-
-    leaf_structure_check(fs, bh);
-
-    /* Delete all safe links. */
-    for (i = get_blkh_nr_items (B_BLK_HEAD (bh)) - 1; i >= 0; i--) {
-	if (get_key_dirid (&B_N_PITEM_HEAD (bh, i)->ih_key) == ~(__u32)0) {
-	    delete_item (fs, bh, i);
-	}
-	if (get_key_dirid (&B_N_PITEM_HEAD (bh, i)->ih_key) == BADBLOCK_DIRID && 
-	    get_key_objectid (&B_N_PITEM_HEAD (bh, i)->ih_key) == BADBLOCK_OBJID) {
-		delete_item (fs, bh, i);
-	}
-    }
-
-    fs_size = (__u64)fs->fs_blocksize * get_sb_block_count (fs->fs_ondisk_sb);
-
- start_again:
-
-    ih = B_N_PITEM_HEAD (bh, 0);
-    bad_order = 0;
-    for (i = 0; i < (nr_items = get_blkh_nr_items (B_BLK_HEAD (bh))); i ++, ih ++) {
-
-	if (is_indirect_ih(ih) && (get_ih_item_len (ih) % 4 != 0)) {
-	    set_type(get_ih_key_format(ih), &ih->ih_key, TYPE_UNKNOWN);
-	    dirty = 1;
-	}
-	    
-        if (type_unknown (&ih->ih_key)) {
-            if ((get_ih_item_len (ih) == SD_SIZE) || (get_ih_item_len (ih) == SD_V1_SIZE)) {
-                set_type_and_offset (KEY_FORMAT_1, &ih->ih_key, SD_OFFSET, TYPE_STAT_DATA);
-		dirty = 1;
-                fsck_log("pass0: vpf-10100: block %lu, item (%d): Unknown item type of StatData size,"
-                    " type set to StatData %k\n", bh->b_blocknr, i, &ih->ih_key);
-            } else {            
-                fsck_log("pass0: vpf-10110: block %lu, item (%d): Unknown item type found %k - deleted\n",
-                        bh->b_blocknr, i, &ih->ih_key);
-                delete_item (fs, bh, i);
-                goto start_again;
-            }
-        }
-
-	if (is_wrong_short_key (&ih->ih_key)) {
-	    /* sometimes stat datas get k_objectid==0 or k_dir_id==0 */
-	    
-/*	    if (i == (nr_items - 1)) {
-		
-		if (i == 0) {
-		    fsck_log ("block %lu: item %d: (%H) id equals 0\n",
-			      bh->b_blocknr, i, ih);
-		    return;
-		}
-		// delete last item 
-                fsck_log ("block %lu: item %d: (%H) id equals 0\n",
-			      bh->b_blocknr, i, ih);
-		delete_item (fs, bh, i - 1);
-		return;
-	    }
-*/
-
-            /* FIXME:
-		18842 19034    0x1 IND  (2)
-		19035 19035    0x0 SD   (0)
-		18842     1    0x1 IND  (1)
-		18842     1 0x1001 DRCT (2)
-             */
-	    /* there is next item: if it is not stat data - take its k_dir_id
-               and k_objectid. if key order will be still wrong - the changed
-               item will be deleted */
-
-	    if (i && !is_stat_data_ih (ih)) {
-	        /* previous item has a wrong short_key */
-		fsck_log ("pass0: vpf-10120: block %lu: item %d: Wrong key %k, corrected to ", 
-		    bh->b_blocknr, i, &ih->ih_key);
-		set_key_dirid (&ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		fsck_log ("%k\n", &ih->ih_key);
-		dirty = 1;
-	    } else if ((i < nr_items - 1) && !is_stat_data_ih (ih + 1)) {
-	        if (!is_wrong_short_key(&(ih + 1)->ih_key)) {
-		    fsck_log ("pass0: vpf-10130: block %lu: item %d: Wrong key %k, corrected to ", 
-			bh->b_blocknr, i, &ih->ih_key);
-		    set_key_dirid (&ih->ih_key, get_key_dirid (&(ih + 1)->ih_key));
-		    set_key_objectid (&ih->ih_key, get_key_objectid (&(ih + 1)->ih_key));
-/*		    set_offset (KEY_FORMAT_1, &ih->ih_key, 0);
-		    set_type (KEY_FORMAT_1, &ih->ih_key, TYPE_STAT_DATA);*/
-		    fsck_log ("%k\n", &ih->ih_key);
-		    dirty = 1;
-		    goto start_again;
-		} else {
-	            fsck_log ("pass0: vpf-10140: block %lu: items %d and %d have bad short keys %k, %k, both deleted\n",
-			      bh->b_blocknr, i, i+1, &ih->ih_key, &(ih + 1)->ih_key);
-		    delete_item (fs, bh, i);
-		    delete_item (fs, bh, i);
-		    goto start_again;
-		}
-	    } else {
-                fsck_log ("pass0: vpf-10150: block %lu: item %d: Wrong key %k, deleted\n",
-			      bh->b_blocknr, i, &ih->ih_key);
-		delete_item (fs, bh, i);
-		goto start_again;
-	    } 
-	}
-
-
-	if (i && i + 1 < nr_items) {
-            if (is_stat_data_ih (ih - 1) && !is_stat_data_ih (ih) &&
-                !is_direct_ih (ih + 1) && !is_stat_data_ih (ih + 1)) {
-                /* i or i+1 item should be SD or i+1 should be direct item */
-                if ((get_ih_item_len (ih) == SD_SIZE) || (get_ih_item_len (ih) == SD_V1_SIZE)) {
-                    /* make i as SD */
-                    fsck_log("pass0: vpf-10400: block %lu, item %d: Wrong order of items - "
-			"change the type of the key %k to StatData\n",  bh->b_blocknr, i, &ih->ih_key);
-                    set_type_and_offset (KEY_FORMAT_1, &ih->ih_key, SD_OFFSET, TYPE_STAT_DATA);
-		    dirty = 1;
-                } else if ((get_ih_item_len (ih+1) == SD_SIZE) || (get_ih_item_len (ih+1) == SD_V1_SIZE)) {
-                    /* make i+1 as SD */
-                    fsck_log("pass0: vpf-10410: block %lu, item %d: Wrong order of items - "
-			"change the type of the key %k to StatData\n", bh->b_blocknr, i + 1, &(ih + 1)->ih_key);
-                    set_type_and_offset (KEY_FORMAT_1, &(ih + 1)->ih_key, SD_OFFSET, TYPE_STAT_DATA);
-		    dirty = 1;
-                } else if (is_indirect_ih(ih)) {
-                    fsck_log("pass0: vpf-10420: block %lu, item %d: Wrong order of items - "
-			"change the type of the key %k to Direct\n", bh->b_blocknr, i+1, &(ih + 1)->ih_key);
-                    set_type (get_ih_key_format(ih+1), &(ih + 1)->ih_key, TYPE_DIRECT);
-		    dirty = 1;
-                }
-            }
-        }
-
-	if (i && ((is_stat_data_ih (ih - 1) &&
- 		   !is_stat_data_ih (ih) &&
-	           (get_key_dirid (&(ih - 1)->ih_key) != get_key_dirid (&ih->ih_key))) ||
-	          (is_stat_data_ih (ih) &&
-	           (get_key_dirid (&(ih - 1)->ih_key) > get_key_dirid (&ih->ih_key)))))
-        {
-            /* not the same dir_id of the same file or not increasing dir_id of different files */
-            if ((i > 1) && get_key_dirid (&(ih - 2)->ih_key) == get_key_dirid (&(ih - 1)->ih_key)) {
-                /* fix i-th */
-                if (!is_stat_data_ih (ih)) {
-                    fsck_log("pass0: vpf-10430: block %lu, item %d: Wrong order of items - "
-			"change the dir_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i, &ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		    set_key_dirid (&ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		    dirty = 1;
-                } else if (i + 1 < nr_items) {
-                    fsck_log("pass0: vpf-10440: block %lu, item %d: Wrong order of items - "
-			"change the dir_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i, &ih->ih_key, get_key_dirid (&(ih + 1)->ih_key));
-		    set_key_dirid (&ih->ih_key, get_key_dirid (&(ih + 1)->ih_key));
-		    dirty = 1;
-                }
-            } else 	
-            if ((i + 1 < nr_items) && get_key_dirid (&ih->ih_key) == get_key_dirid (&(ih + 1)->ih_key)) {
-                fsck_log("pass0: vpf-10450: block %lu, item %d: Wrong order of items - "
-		    "change the dir_id of the key %k to %lu\n",
-                    bh->b_blocknr, i - 1, &(ih - 1)->ih_key, get_key_dirid (&ih->ih_key));
-                /* fix (i - 1)-th */
-		set_key_dirid (&(ih - 1)->ih_key, get_key_dirid (&ih->ih_key));
-		dirty = 1;
-            }	
-        }
-
- 	if (i && i + 1 < nr_items) {
-      	    /* there is a previous and a next items */
-	    if ((get_key_dirid (&(ih - 1)->ih_key) == get_key_dirid (&(ih + 1)->ih_key)) &&
-		(get_key_dirid (&(ih - 1)->ih_key) != get_key_dirid (&ih->ih_key)))
-	    {
-                fsck_log("pass0: vpf-10460: block %lu, item %d: Wrong order of items - "
-		    "change the dir_id of the key %k to %lu\n",
-                    bh->b_blocknr, i, &ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		set_key_dirid (&ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		dirty = 1;
-            }
-            if (is_stat_data_ih (ih - 1) && is_indirect_ih (ih) && is_direct_ih (ih + 1)) {
-	    	if ((get_key_objectid (&(ih - 1)->ih_key) == get_key_objectid (&(ih + 1)->ih_key)) &&
-		    (get_key_objectid (&(ih - 1)->ih_key) != get_key_objectid (&ih->ih_key)))
-            	{
-		    fsck_log("pass0: vpf-10470: block %lu, item %d: Wrong order of items - "
-			"change the object_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i, &ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		    set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		    dirty = 1;
-		}
-	    	if ((get_key_objectid (&(ih - 1)->ih_key) == get_key_objectid (&ih->ih_key)) &&
-		    (get_key_objectid (&(ih - 1)->ih_key) != get_key_objectid (&(ih + 1)->ih_key)))
-            	{
-		    fsck_log("pass0: vpf-10480: block %lu, item %d: Wrong order of items - "
-			"change the object_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i + 1, &(ih+1)->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		    set_key_objectid (&(ih + 1)->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		    dirty = 1;
-		}
-	    	if ((get_key_objectid (&ih->ih_key) == get_key_objectid (&(ih + 1)->ih_key)) &&
-		    (get_key_objectid (&(ih - 1)->ih_key) != get_key_objectid (&(ih + 1)->ih_key)))
-            	{
-		    fsck_log("pass0: vpf-10490: block %lu, item %d: Wrong order of items - "
-			"change the object_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i - 1, &(ih-1)->ih_key, get_key_objectid (&(ih + 1)->ih_key));
-		    set_key_objectid (&(ih - 1)->ih_key, get_key_objectid (&(ih + 1)->ih_key));
-		    dirty = 1;
-		}
-		if ((get_key_dirid (&(ih - 1)->ih_key) == get_key_dirid (&ih->ih_key)) &&
-		    (get_key_dirid (&(ih - 1)->ih_key) != get_key_dirid (&(ih + 1)->ih_key)))
-	    	{
-		    fsck_log("pass0: vpf-10500: block %lu, item %d: Wrong order of items - "
-			"change the dir_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i + 1, &(ih+1)->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		    set_key_dirid (&(ih + 1)->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		    dirty = 1;
-		}
-		if ((get_key_dirid (&ih->ih_key) == get_key_dirid (&(ih + 1)->ih_key)) &&
-		    (get_key_dirid (&(ih - 1)->ih_key) != get_key_dirid (&(ih + 1)->ih_key)))
-	    	{
-		    fsck_log("pass0: vpf-10510: block %lu, item %d: Wrong order of items - " 
-			"change the dir_id of the key %k to %lu\n",
-                    	bh->b_blocknr, i - 1, &(ih-1)->ih_key, get_key_dirid (&(ih + 1)->ih_key));
-		    set_key_dirid (&(ih - 1)->ih_key, get_key_dirid (&(ih + 1)->ih_key));
-		    dirty = 1;
-		}
-            }
-     	}
-
-	if (i && is_stat_data_ih (ih) &&
-	    get_key_dirid (&(ih - 1)->ih_key) == get_key_dirid (&ih->ih_key) &&
-	    get_key_objectid (&(ih - 1)->ih_key) >= get_key_objectid (&ih->ih_key)) {
-	    if ((i + 1 < nr_items) && !is_stat_data_ih (ih + 1)) {
-         	if (get_key_objectid (&(ih - 1)->ih_key) < get_key_objectid (&(ih + 1)->ih_key)) {
-		    fsck_log("pass0: vpf-10520: block %lu, item %d: Wrong order of items - "
-			"change the object_id of the key %k to %lu\n",
-			bh->b_blocknr, i - 1, &(ih-1)->ih_key, get_key_objectid (&(ih + 1)->ih_key));
-		    set_key_objectid (&ih->ih_key, get_key_objectid (&(ih + 1)->ih_key));
-		    dirty = 1;
-		}
-	    }
-	}
-
-        if (i && is_stat_data_ih (ih - 1) && !is_stat_data_ih (ih) &&
-	    (get_key_objectid (&(ih - 1)->ih_key) != get_key_objectid (&ih->ih_key)))
-        {
-            int err = 0;
-            if (i > 1) {
-                if (comp_short_keys (&(ih - 2)->ih_key, &(ih - 1)->ih_key) != -1)
-                    misc_set_bit (1, &err);
-                if (comp_short_keys (&(ih - 2)->ih_key, &ih->ih_key) != -1)
-                    misc_set_bit (2, &err);
-            }
-            if (i + 1 < nr_items) {
-                if (comp_short_keys (&(ih - 1)->ih_key, &(ih + 1)->ih_key) != -1)
-                    misc_set_bit (3, &err);
-                if (comp_short_keys (&ih->ih_key, &(ih + 1)->ih_key) != -1)
-                    misc_set_bit (4, &err);
-            }
-/*
-            if ((test_bit (1, err) || test_bit (3, err)) &&
-		(test_bit (2, err) || test_bit (4, err))) {
-      		// thera are no problem-free keys, delete them both
-                delete_item (fs, bh, i - 1);
-                delete_item (fs, bh, i - 1);
-                goto start_again;
-      	    }
-*/
-            if (!misc_test_bit (1, &err) && !misc_test_bit (3, &err) &&
-		!misc_test_bit (2, &err) && !misc_test_bit (4, &err)) {
-      		if (i <= 1) {
-            	    /* take bigger */
-                    if (comp_short_keys (&(ih - 1)->ih_key, &ih->ih_key) == 1) {
-			fsck_log("pass0: vpf-10530: block %lu, item %d: Wrong order of items - "
-			    "change the object_id of the key %k to %lu\n",
-                    	    bh->b_blocknr, i, &ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-			set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-                    } else {
-			fsck_log("pass0: vpf-10540: block %lu, item %d: Wrong order of items - "
-			    "change the object_id of the key %k to %lu\n",
-                    	    bh->b_blocknr, i - 1, &(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-                        set_key_objectid (&(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-                    }
-            	} else {
-                    /* take smaller */
-                    if (comp_short_keys (&(ih - 1)->ih_key, &ih->ih_key) == 1) {
-			fsck_log("pass0: vpf-10550: block %lu, item %d: Wrong order of items - "
-			    "change the object_id of the key %k to %lu\n",
-                    	    bh->b_blocknr, i - 1, &(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-                        set_key_objectid (&(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-                    } else {
-			fsck_log("pass0: vpf-10560: block %lu, item %d: Wrong order of items - "
-			    "change the object_id of the key %k to %lu\n",
-                    	    bh->b_blocknr, i, &ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-			set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-                    }
-                }
-		dirty = 1;
-	    } else if (!misc_test_bit (1, &err) && !misc_test_bit (3, &err)) {
-      		/* take i - 1 */
-		fsck_log("pass0: vpf-10590: block %lu, item %d: Wrong order of items - "
-		    "change the object_id of the key %k to %lu\n",
-                    bh->b_blocknr, i, &ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		dirty = 1;
- 	    } else if (!misc_test_bit (2, &err) && !misc_test_bit (4, &err)) {
-      		/* take i */
-		fsck_log("pass0: vpf-10600: block %lu, item %d: Wrong order of items - "
-		    "change the object_id of the key %k to %lu\n",
-              	    bh->b_blocknr, i - 1, &(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-                set_key_objectid (&(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-		dirty = 1;
-	    }
-        }
-
-	/* this recovers corruptions like the below: 
-	   1774 1732 0 0
-	   116262638 1732 1 3
-	   1774 1736 0 0 */
-	if (i && is_stat_data_ih (ih - 1) && !is_stat_data_ih (ih)) {
-	    if (get_key_objectid (&ih->ih_key) != get_key_objectid (&(ih - 1)->ih_key) ||
-		get_key_dirid (&ih->ih_key) != get_key_dirid (&(ih - 1)->ih_key) ||
-		get_offset (&ih->ih_key) != 1) {
-		if (is_direntry_ih (ih)) {
-		    fsck_log ("pass0: vpf-10160: block %lu: item %d: No \".\" entry found in "
-			      "the first item of a directory\n", bh->b_blocknr, i);
-		    set_key_dirid (&ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		    set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		    dirty = 1;
-		} else {
-		    fsck_log ("pass0: vpf-10170: block %lu: item %d: Wrong order of items - "
-			"the item \n\t%H fixed to ", bh->b_blocknr, i, ih);
-		    
-		    set_key_dirid (&ih->ih_key, get_key_dirid (&(ih - 1)->ih_key));
-		    set_key_objectid (&ih->ih_key, get_key_objectid (&(ih - 1)->ih_key));
-		    
-		    if (get_ih_item_len (ih - 1) == SD_SIZE) {
-			/* stat data is new, therefore this item is new too */
-			set_offset (KEY_FORMAT_2, &(ih->ih_key), 1);
-			if ((get_ih_entry_count (ih) != 0xffff) && (get_ih_item_len (ih) % 4 == 0))
-			    set_type (KEY_FORMAT_2, &(ih->ih_key), TYPE_INDIRECT);
-			else
-			    set_type (KEY_FORMAT_2, &(ih->ih_key), TYPE_DIRECT);
-			set_ih_key_format (ih, KEY_FORMAT_2);
-		    } else {
-			/* stat data is old, therefore this item is old too */
-			set_offset (KEY_FORMAT_1, &(ih->ih_key), 1);
-			if ((get_ih_entry_count (ih) != 0xffff) && (get_ih_item_len (ih) % 4 == 0))
-			    set_type (KEY_FORMAT_1, &(ih->ih_key), TYPE_INDIRECT);
-			else {
-			    set_type (KEY_FORMAT_1, &(ih->ih_key), TYPE_DIRECT);
-			    set_ih_free_space (ih, 0xffff);
-			}
-			set_ih_key_format (ih, KEY_FORMAT_1);
-		    }
-		    fsck_log ("\n\t%H\n", ih);
-		    dirty = 1;
-		}
-	    }
-	}
-
-	/* FIXME: corruptions like:
-	   56702 66802 1 2
-	   56702 65536 0 0
-	   56702 66803 1 2
-	   do not get recovered (both last items will be deleted) */
-	/* delete item if it is not in correct order of object items */
-	if (i && not_of_one_file (&ih->ih_key, &(ih - 1)->ih_key) &&
-	    !is_stat_data_ih (ih)) {
-	    fsck_log ("pass0: vpf-10180: block %lu: item %d: The item %k, which follows non StatData item %k, is deleted\n",
-		      bh->b_blocknr, i, &ih->ih_key, &(ih - 1)->ih_key);
-	    delete_item (fs, bh, i);
-	    goto start_again;
-	}
-	
-	if (is_stat_data_ih (ih)) {
-            if (get_offset (&ih->ih_key) != 0) {
-                set_offset(KEY_FORMAT_1, &ih->ih_key, 0);
-                dirty = 1;
-            }
-	} else if (!is_direntry_ih (ih)) {
-	    /* not SD, not direntry */
-            if (i && comp_short_keys (&(ih - 1)->ih_key, &ih->ih_key) == 0) {
-                if (is_stat_data_ih (ih - 1)) {
-        	    if (get_offset (&ih->ih_key) != 1) {
-                        set_offset(key_format(&ih->ih_key), &ih->ih_key, 1);
-                        dirty = 1;
-                    }
-                } else if (is_indirect_ih (ih - 1) && is_direct_ih (ih)) {
-        	    if (get_offset (&ih->ih_key) != 
-        	        get_offset(&(ih - 1)->ih_key) + I_UNFM_NUM (ih - 1) * fs->fs_blocksize) 
-        	    {
-                        set_offset(key_format(&ih->ih_key), &ih->ih_key,
-                            get_offset(&(ih - 1)->ih_key) + I_UNFM_NUM (ih - 1) * fs->fs_blocksize);
-                        dirty = 1;
-        	    }
-                } else {
-                    /* if indirect item or not the first direct item in the leaf */
-                    fsck_log("pass0: vpf-10250: block %lu, item %d: The item %k with wrong type is deleted\n",
-                         bh->b_blocknr, i, &ih->ih_key);
-                    delete_item (fs, bh, i);
-                    goto start_again;
-                }
-		
-		/* Check the lenght of the direct item; offset should be ok already. */
-		if (is_direct_ih (ih)) {
-		    if (STORE_TAIL_IN_UNFM (get_offset (&ih->ih_key) + get_ih_item_len (ih) - 1, 
-			    get_ih_item_len (ih), bh->b_size)) 
-		    {
-                            fsck_log("pass0: vpf-10700: block %lu, item %d: The item with wrong offset"
-				" or length found %k, len % lu - deleted\n", bh->b_blocknr, i, &ih->ih_key, 
-				get_ih_item_len (ih));
-                            delete_item (fs, bh, i);
-                            goto start_again;
-		    }
-  		}
-            } else {
-		/*first item in the node or first item of the file */
-		
-  		if (i) {
-        	    /* first item of the file, but not SD - delete */
-		    fsck_log("pass0: vpf-10190: block %lu, item %d: The item %k, which follows non StatData"
-			" item %k, is deleted\n", bh->b_blocknr, i, &ih->ih_key, &(ih - 1)->ih_key );
-			delete_item (fs, bh, i);
-			goto start_again;
-        	}
-
-		/* indirect or direct is the first in the leaf */
-		offset = (__u64)get_offset (&ih->ih_key);
-		if (is_indirect_ih (ih)) {
-		    if (offset % fs->fs_blocksize != 1) {
-			fsck_log("pass0: vpf-10200: block %lu, item %d: The item %k with wrong offset is deleted\n",
-			    bh->b_blocknr, i, &ih->ih_key);
-			delete_item (fs, bh, i);
-			goto start_again;
-		    }
-		} else if (is_direct_ih (ih)) {
-		    if (!correct_direct_item_offset (get_offset (&ih->ih_key), key_format (&ih->ih_key)) ||
-			((get_offset (&ih->ih_key) % bh->b_size - 1) + get_ih_item_len (ih) > bh->b_size) || 
-          		STORE_TAIL_IN_UNFM (offset + get_ih_item_len (ih) - 1, get_ih_item_len (ih), bh->b_size)) 
-		    {
-                            fsck_log("pass0: vpf-10210: block %lu, item %d: The item with wrong offset ", 
-                                bh->b_blocknr, i);
-                            fsck_log("or length found %k, len % lu - deleted\n", &ih->ih_key, get_ih_item_len (ih));
-                            delete_item (fs, bh, i);
-                            goto start_again;
-		    }
-  		}
-		
-		offset += get_bytes_number (ih, fs->fs_blocksize);
-		if (!does_it_fit_into_dev (offset, fs_size)) {
-                    fsck_log("pass0: vpf-10230: block %lu, item %d: The item offset is is too big %k - deleted\n",
-                                        bh->b_blocknr, i, &ih->ih_key);
-                    delete_item (fs, bh, i);
-                    goto start_again;
-		}
-		
-	    }
-        }
-        
-
-        
-	if (i &&  comp_keys (&(ih - 1)->ih_key, &ih->ih_key) != -1) {
-	    /* previous item has key not smaller than the key of currect item */
-	    if (is_stat_data_ih (ih - 1) && !is_stat_data_ih (ih)) {
-		/* fix key of stat data such as if it was stat data of that item */
-		fsck_log ("pass0: block %lu, items %d, %d: Wrong order of items - make the StatData item %k of the file %k\n",
-		    bh->b_blocknr, i - 1, i, &(ih - 1)->ih_key, &ih->ih_key);
-		set_key_dirid (&(ih - 1)->ih_key, get_key_dirid (&ih->ih_key));
-		set_key_objectid (&(ih - 1)->ih_key, get_key_objectid (&ih->ih_key));
-		set_offset (KEY_FORMAT_1, &(ih - 1)->ih_key, 0);
-		set_type (KEY_FORMAT_1, &(ih - 1)->ih_key, TYPE_STAT_DATA);
-		dirty = 1;
-	    } else {
-		/* ok, we have to delete one of these two - decide which one */
-		int retval;
-
-		/* something will be deleted */
-		dirty = 1;
-		retval = upper_correct (bh, ih - 1, i - 1);
-		switch (retval) {
-		case 0:
-		    /* delete upper item */
-		    fsck_log ("pass0: block %lu, item %d (upper): Item %k is out of order - deleted\n",
-			      bh->b_blocknr, i - 1, &(ih - 1)->ih_key);
-		    delete_item (fs, bh, i - 1);
-		    goto start_again;
-
-		case 1:
-		    /* delete lower item */
-		    fsck_log ("pass0: block %lu, item %d (lower): Item %k is out of order - deleted\n",
-			      bh->b_blocknr, i, &ih->ih_key);
-		    delete_item (fs, bh, i);
-		    goto start_again;
-
-		default:
-		    /* upper item was the first item of a node */
-		    /* to make gcc 3.2 do not sware here */;
-		}
-
-		retval = lower_correct (bh, ih, i);
-		switch (retval) {
-		case 0:
-		    /* delete lower item */
-		    fsck_log ("pass0: block %lu, item %d (lower): Item %k is out of order - deleted\n",
-			      bh->b_blocknr, i, &ih->ih_key);
-		    delete_item (fs, bh, i);
-		    goto start_again;
-
-		case 1:
-		    /* delete upper item */
-		    fsck_log ("pass0: block %lu, %d (upper): Item %k is out of order - deleted\n",
-			      bh->b_blocknr, i - 1, &(ih - 1)->ih_key);
-		    delete_item (fs, bh, i - 1);
-		    goto start_again;
-
-		default:
-		    /* only 2 items in the node, how to decide what to delete, go and ask user */
-		    /* to make gcc 3.2 do not sware here */;
-		}
-		fsck_log ("pass0: block %lu, items %d and %d: Which of these items looks better (the other will be deleted.)?\n"
-			  "%k\n%k\n", bh->b_blocknr, i-1, i, &(ih - 1)->ih_key, &ih->ih_key);
-		if (fsck_user_confirmed (fs, "1 or 2?", "1\n", 1))
-		    delete_item (fs, bh, i - 1);
-		else
-		    delete_item (fs, bh, i);
-		goto start_again;
-	    }
-	}
-
-	if (is_stat_data_ih (ih) && (get_ih_item_len (ih) != SD_SIZE &&
-				     get_ih_item_len (ih) != SD_V1_SIZE)) {
-	    fsck_log ("pass0: block %lu, item %d: StatData item of wrong length found %H - deleted\n",
-		      bh->b_blocknr, i, ih);
-	    delete_item (fs, bh, i);
-	    goto start_again;
-	}
-
-	dirty += correct_key_format (ih, symlnk);
-	
-	if (is_stat_data_ih (ih)) {
-	    __u16 mode;
-
-            file_format = get_ih_key_format (ih);
-	
-	    get_sd_mode (ih, B_N_PITEM(bh,i), &mode);
-            symlnk = ( S_ISLNK(mode) ? 1 : 0);
-	    ;/*correct_stat_data (fs, bh, i);*/
-        } else if ( !is_direntry_ih(ih) &&
-                    !(symlnk && is_direct_ih(ih)) &&
-        	    (file_format != KEY_FORMAT_UNDEFINED) &&
-        	    (file_format != get_ih_key_format (ih)))
-        {
-            fsck_log("pass0: vpf-10240: block %lu, item (%d): Item %k, which format (%d) is not equal to StatData "
-		"format (%d), is deleted\n", bh->b_blocknr, i, &ih->ih_key, get_ih_key_format(ih), file_format);
-            delete_item (fs, bh, i);
-            goto start_again;
-        } else {
-	    file_format = KEY_FORMAT_UNDEFINED;
-	    symlnk = 0;
-	}
-
-
-	if (i && is_stat_data_ih (ih - 1) && !not_of_one_file (&ih->ih_key, &(ih - 1)->ih_key)) {
-	    __u16 mode;
-
-	    get_sd_mode (ih - 1, B_I_PITEM (bh, ih - 1), &mode);	
-	    if (not_a_directory (B_I_PITEM (bh, ih - 1)) && is_direntry_ih (ih)) {
-		/* make SD mode SD of dir */
-		fsck_log ("pass0: block %lu, item %d: The directory %K has the wrong mode (%M), corrected to ",
-			bh->b_blocknr, i, &ih->ih_key, mode);
-		mode &= ~S_IFMT;
-		mode |= S_IFDIR;
-		fsck_log ("(%M)\n", mode);
-		set_sd_mode (ih - 1, B_I_PITEM (bh, ih - 1), &mode);
-		dirty = 1;
-	    } else if (!not_a_directory (B_I_PITEM (bh, ih - 1)) && !is_direntry_ih (ih)) {
-		/* make SD mode SD of regular file */
-		fsck_log ("pass0: block %lu, item %d: Not the directory %K has the wrong mode (%M), corrected to ",
-			bh->b_blocknr, i, &ih->ih_key, mode);
-		mode &= ~S_IFMT;
-		mode |= S_IFREG;
-		fsck_log ("(%M)\n", mode);
-		set_sd_mode (ih - 1, B_I_PITEM (bh, ih - 1), &mode);
-		dirty = 1;
-	    }
-	    if (not_a_regfile (B_I_PITEM (bh, ih - 1)) && is_indirect_ih (ih)) {
-		fsck_log ("pass0: block %lu, item %d: The file %K has the wrong mode (%M), corrected to ",
-			  bh->b_blocknr, i, &ih->ih_key, mode);
-		mode &= ~S_IFMT;
-		mode |= S_IFREG;
-		fsck_log ("(%M)\n", mode);
-		set_sd_mode (ih - 1, B_I_PITEM (bh, ih - 1), &mode);
-		dirty = 1;
-	    }
-	}
-
-	if (is_direntry_ih (ih)) {
-	    j = verify_directory_item (fs, bh, i);
-	
-	    if (j == 1) {
-	        /* wrong hash, skip the leaf */
-		pass_0_stat (fs)->too_old_leaves ++;
-		mark_buffer_clean (bh);
-		return;
-	    } else if (j == -1) {
-		/* item was deleted */
-		goto start_again;
-	    }
-	    continue;
-	}
-
-	/*DEBUG*/
-        if (!is_stat_data_ih (ih) && get_offset (&ih->ih_key) == 0)
-            reiserfs_panic ("block %lu, item %d: Zero offset can have StatData items only, but found %k\n", 
-		bh->b_blocknr, i, &ih->ih_key);	
-	
-	if (!is_indirect_ih (ih))
-	    continue;
-
-	/* Darko Palic's filesystem had item: [20079 17328 0xfffb1001 IND, len 4048], format old */
-	{
-	    struct key tmp_key;
-
-	    tmp_key = ih->ih_key;
-	    set_offset (key_format (&tmp_key), &tmp_key,
-			get_offset (&tmp_key) + get_bytes_number (ih, bh->b_size) - 1);
-
-	    if (get_offset (&tmp_key) <	get_offset (&ih->ih_key)) {
-		fsck_log ("pass0: block %lu, item %d: The item, which has wrong offset %k, is deleted\n",
-		    bh->b_blocknr, i, &ih->ih_key);
-		delete_item (fs, bh, i);
-		goto start_again;
-	    }
-	}
-	
-	/* temporary ugly fix */
-/*
-	if (i && is_stat_data_ih (ih - 1) && !not_of_one_file (&ih->ih_key, &(ih - 1)->ih_key)) {
-	    __u16 mode;
-
-	    get_sd_mode (ih - 1, B_I_PITEM (bh, ih - 1), &mode);
-	    if (!S_ISREG (mode)) {
-		fsck_log ("pass0: block %lu: mode (%M) of file %K having indirect item is fixed to ",
-			  bh->b_blocknr, mode, &ih->ih_key);
-		mode &= ~S_IFMT;
-		mode |= S_IFREG;
-		set_sd_mode (ih - 1, B_I_PITEM (bh, ih - 1), &mode);
-		fsck_log ("(%M)\n", mode);
-		dirty = 1;
-	    }
-	}
-*/
-	ind_item = (__u32 *)B_I_PITEM (bh, ih);
-	for (j = 0; j < (int)I_UNFM_NUM (ih); j ++) {
-	    unfm_ptr = d32_get (ind_item, j);
-	    if (!unfm_ptr)
-		continue;
-#if 0
-	    if (fsck_mode (fs) == FSCK_ZERO_FILES) {
-		/* FIXME: this is temporary mode of fsck */
-		ind_item [j] = 0;
-		reiserfs_bitmap_clear_bit (fsck_new_bitmap(fs), unfm_ptr);
-		tmp_zeroed ++;
-		dirty = 1;
-		continue;
-	    }
-#endif
-
-	    if (not_data_block (fs, unfm_ptr) || /* journal area or bitmap or super block */
-		unfm_ptr >= get_sb_block_count (fs->fs_ondisk_sb) || /* garbage in pointer */
-		(fs->fs_badblocks_bm && /* bad block */
-		reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, unfm_ptr))) {
-
-		pass_0_stat (fs)->wrong_pointers ++;
-		/*
-		fsck_log ("pass0: %d-th pointer (%lu) in item %k (leaf block %lu) is wrong\n",
-			  j, unfm_ptr, &ih->ih_key, bh->b_blocknr);
-		*/
-		d32_put(ind_item, j, 0);
-		dirty = 1;
-		continue;
-	    }
-	    /* mark block in bitmaps of unformatted nodes */
-	    register_unfm (unfm_ptr);
-	}
-    }
-
-    /* mark all objectids in use */
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < get_blkh_nr_items (B_BLK_HEAD (bh)); i ++, ih ++) {
-	struct reiserfs_de_head * deh;
-
-	id_map_mark(proper_id_map (fs), get_key_dirid (&ih->ih_key));
-	id_map_mark(proper_id_map (fs), get_key_objectid (&ih->ih_key));
-	if (is_direntry_ih(ih)) {
-	    for (j = 0, deh = B_I_DEH (bh, ih); j < get_ih_entry_count (ih); j ++, deh++) 
-		id_map_mark(proper_id_map(fs), get_deh_objectid(deh));	    
-	}
-    }
-
-    if (get_blkh_nr_items (B_BLK_HEAD (bh)) < 1) {
-	/* pass 1 will skip this */
-	pass_0_stat (fs)->all_contents_removed ++;
-//	fsck_log ("pass0: block %lu: All items were deleted.\n", bh->b_blocknr);
-	dirty = 0;
-	mark_buffer_clean (bh);
-    } else {
-	/* pass1 will use this bitmap */
-	pass0_mark_leaf (bh->b_blocknr);
-	/*fsck_data (fs)->rebuild.leaves ++;*/
-    }
-    
-    if (dirty) {
-	pass_0_stat (fs)->leaves_corrected ++;
-	mark_buffer_dirty (bh);
-    }
-}
-
-
-static int is_bad_sd (struct item_head * ih, char * item)
-{
-    struct stat_data * sd = (struct stat_data *)item;
-
-    if (get_key_offset_v1 (&ih->ih_key) || get_key_uniqueness (&ih->ih_key)) {
-	fsck_log ("vpf-10610: StatData item %k has non zero offset found.\n", 
-	    &ih->ih_key);
-	return 1;
-    }
-
-    if (get_ih_item_len (ih) == SD_V1_SIZE) {
-	/* looks like old stat data */
-	if (get_ih_key_format (ih) != KEY_FORMAT_1)
-	    fsck_log ("vpf-10620: StatData item %k has wrong format.\n", 
-		&ih->ih_key);
-	return 0;
-    }
-
-    if (!S_ISDIR (sd_v2_mode(sd)) && !S_ISREG(sd_v2_mode(sd)) &&
-	!S_ISCHR (sd_v2_mode(sd)) && !S_ISBLK(sd_v2_mode(sd)) &&
-	!S_ISLNK (sd_v2_mode(sd)) && !S_ISFIFO(sd_v2_mode(sd)) &&
-	!S_ISSOCK(sd_v2_mode(sd))) {	
-	/*fsck_log ("file %k unexpected mode encountered 0%o\n", &ih->ih_key, sd_v2_mode(sd))*/;
-    }
-    return 0;
-}
-
-
-int is_bad_directory (struct item_head * ih, char * item, int dev, int blocksize)
-{
-    int i;
-    char * name;
-    int namelen, entrylen;
-    struct reiserfs_de_head * deh = (struct reiserfs_de_head *)item;
-    __u32 prev_offset = 0;
-    __u16 prev_location = get_ih_item_len (ih);
-    int min_entry_size = 1;/* we have no way to understand whether the
-                              filesystem wes created in 3.6 format or
-                              converted to it. So, we assume that minimal name
-                              length is 1 */
-
-    if (get_ih_item_len (ih) / (DEH_SIZE + min_entry_size) < get_ih_entry_count (ih))
-	/* entry count is too big */
-	return 1;
-
-    for (i = 0; i < get_ih_entry_count (ih); i ++, deh ++) {
-	entrylen = entry_length(ih, deh, i);
-	if (entrylen > (int)REISERFS_MAX_NAME_LEN (blocksize))
-	    return 1;
-	
-	if (get_deh_offset (deh) <= prev_offset)
-	    return 1;
-	
-	prev_offset = get_deh_offset (deh);
-
-	if (get_deh_location(deh) + entrylen != prev_location)
-	    return 1;
-	
-	prev_location = get_deh_location (deh);
-
-	namelen = name_in_entry_length (ih, deh, i);
-	name = name_in_entry (deh, i);
-	if (!is_properly_hashed (fs, name, namelen, get_deh_offset (deh)))
-	    return 1;
-    }
-    return 0;
-}
-
-
-/* change incorrect block adresses by 0. Do not consider such item as incorrect */
-static int is_bad_indirect (struct item_head * ih, char * item, int dev, int blocksize)
-{
-    unsigned long blocks;
-    unsigned int i;
-    int bad = 0;
-
-    if (get_ih_item_len(ih) % UNFM_P_SIZE) {
-	fsck_log ("is_bad_indirect: indirect item of %H of invalid length\n", ih);
-	return 1;
-    }
-
-    blocks = get_sb_block_count (fs->fs_ondisk_sb);
-  
-    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-	__u32 * ind = (__u32 *)item;
-
-	if (d32_get (ind, i) >= blocks) {
-	    bad ++;
-	    fsck_log ("is_bad_indirect: %d-th pointer of item %H looks bad (%lu)\n",
-		      i, ih, d32_get (ind, i));
-	    continue;
-	}
-    }
-    return bad;
-}
-
-
-/* this is used by pass1.c:save_item and check.c:is_leaf_bad */
-int is_bad_item (struct buffer_head * bh, struct item_head * ih, char * item)
-{
-    int blocksize, dev;
-
-    blocksize = bh->b_size;
-    dev = bh->b_dev;
-
-    // FIXME: refuse transparently bad items
-    if (get_key_dirid (&ih->ih_key) == get_key_objectid (&ih->ih_key))
-	return 1;
-    if (!get_key_dirid (&ih->ih_key) || !get_key_objectid (&ih->ih_key))
-	return 1;
-
-    if (is_stat_data_ih(ih))
-	return is_bad_sd (ih, item);
-
-    if (is_direntry_ih (ih))
-	return is_bad_directory (ih, item, dev, blocksize);
-
-    if (is_indirect_ih (ih))
-	return is_bad_indirect (ih, item, dev, blocksize);
-
-    if (is_direct_ih (ih))
-	return 0;
-
-    return 1;
-}
-
-
-int is_leaf_bad (struct buffer_head * bh)
-{
-    int i;
-    struct item_head * ih;
-    int bad = 0;
-
-    assert (is_leaf_node (bh));
-
-    for (i = 0, ih = B_N_PITEM_HEAD (bh,  0); i < B_NR_ITEMS (bh); i ++, ih ++) {
-	if (is_bad_item (bh, ih, B_I_PITEM (bh, ih))) {
-	    fsck_log ("is_leaf_bad: block %lu, item %d: The corrupted item found (%H)\n",
-		      bh->b_blocknr, i, ih);
-	    bad = 1;
-	    continue;
-	}
-
-	if (i && bad_pair (fs, bh, i)) {
-	    fsck_log ("is_leaf_bad: block %lu items %d and %d: Wrong order of items:"
-		"\n\t%H\n\t%H\n", bh->b_blocknr, i - 1, i, ih - 1, ih);
-	    bad = 1;
-	}
-    }
-
-    return bad;
-}
-
-
-static int is_to_be_read (reiserfs_filsys_t * fs, unsigned long block)
-{
-    return reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), block);
-}
-
-
-
-static void do_pass_0 (reiserfs_filsys_t * fs)
-{
-    struct buffer_head * bh;
-    unsigned long i;
-    int what_node;
-    unsigned long done = 0, total;
-
-
-    if (fsck_mode (fs) == DO_TEST) {
-	/* just to test pass0_correct_leaf */
-	bh = bread (fs->fs_dev, fsck_data (fs)->rebuild.test, fs->fs_blocksize);
-
-	if (!bh) {
-	    /* we were reading one block at time, and failed, so mark block bad */
-	    fsck_progress ("%s: Reading of the block %lu failed\n", __FUNCTION__, 
-		fsck_data (fs)->rebuild.test);
-	    reiserfs_free (fs);
-	    exit(0);
-	}
-
-	if (is_leaf_bad (bh)) {
-	    fsck_progress ("###############  bad #################\n");
-	}
-
-	pass0_correct_leaf (fs, bh);
-	
-	print_block (stdout, fs, bh, 3, -1, -1);
-
-	if (is_leaf_bad (bh)) {
-	    fsck_progress ("############### still bad #################\n");
-	}
-	brelse (bh);
-	reiserfs_free (fs);
-	exit(0);
-    }
-
-
-    total = reiserfs_bitmap_ones (fsck_source_bitmap (fs));
-	
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
-	if (!is_to_be_read (fs, i))
-	    continue;
-
-	print_how_far (fsck_progress_file (fs), &done, total, 1, fsck_quiet (fs));
-
-	bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-	if (!bh) {
-	    /* we were reading one block at time, and failed, so mark block bad */
-	    fsck_progress ("%s: Reading of the block %lu failed\n", __FUNCTION__, i);
-	    continue;
-	}
-
-	if (fs->fs_badblocks_bm && reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))
-	    reiserfs_panic ("The block (%lu), specified in badblock list, was read.", i);
-	
-	if (not_data_block (fs, i)) {
-	    /* block which could not be pointed by indirect item */
-	    if (!(block_of_journal (fs, i) && fsck_data(fs)->rebuild.use_journal_area))
-		reiserfs_panic ("The block (%lu) from non data area was read.", i);
-	}
-
-	pass_0_stat (fs)->dealt_with ++;
-	what_node = who_is_this (bh->b_data, bh->b_size);
-	if ( what_node != THE_LEAF && what_node != HAS_IH_ARRAY ) {
-	    brelse (bh);
-	    continue;
-	}
-	
-	pass_0_stat (fs)->leaves ++;
-	pass0_correct_leaf (fs, bh);
-	brelse (bh);
-    }
-    fsck_progress ("\n");
-
-
-    /* just in case */
-    id_map_mark(proper_id_map (fs), REISERFS_ROOT_OBJECTID);
-
-}
-
-
-
-int is_used_leaf (unsigned long block)
-{
-    return pass0_is_leaf (block);
-}
-
-/*
-int how_many_leaves_were_there (void)
-{
-    return fsck_data (fs)->rebuild.leaves;
-}
-*/
-
-/* these are used to correct uformatted node pointers */
-int is_bad_unformatted (unsigned long block)
-{
-    return pass0_is_bad_unfm (block);
-}
-
-/* these are used to correct uformatted node pointers */
-int is_good_unformatted (unsigned long block)
-{
-    return pass0_is_good_unfm (block);
-}
-
-
-/* this is for check only. With this we make sure that all pointers we
-   put into tree on pass 1 do not point to leaves (FIXME), do not
-   point to journal, bitmap, etc, do not point out of fs boundary (and
-   are marked used in on-disk bitmap - this condition skipped for now). */
-int still_bad_unfm_ptr_1 (unsigned long block)
-{
-    if (!block)
-	return 0;
-    if (pass0_is_leaf (block))
-	return 1;
-    if (pass0_is_bad_unfm (block) && !is_bad_unfm_in_tree_once (block))
-	return 2;
-    if (not_data_block (fs, block))
-	return 3;
-    /*
-    if (!was_block_used (block))
-	return 4;
-    */
-    if (block >= get_sb_block_count (fs->fs_ondisk_sb))
-	return 5;
-    return 0;
-    
-}
-
-
-/* pointers to data block which get into tree are checked with this */
-int still_bad_unfm_ptr_2 (unsigned long block)
-{
-    if (!block)
-	return 0;
-    if (is_block_used (block))
-	return 1;
-    if (block >= get_sb_block_count (fs->fs_ondisk_sb))
-	return 1;
-    return 0;
-}
-
-
-/* these are used to allocate blocks for tree building */
-int are_there_allocable_blocks (unsigned int amout_needed) {
-    if (reiserfs_bitmap_zeros (fsck_allocable_bitmap (fs)) < amout_needed) {
-	unsigned int zeros = 0, i;
-	
-	fsck_progress ("Not enough allocable blocks, checking bitmap...");
-	for (i = 0; i < fsck_allocable_bitmap (fs)->bm_bit_size; i ++) {
-	    if (!reiserfs_bitmap_test_bit (fsck_allocable_bitmap (fs), i))
-		zeros ++;
-	}
-	fsck_progress ("there are %u allocable blocks, btw\n", zeros);
-	return 0;
-    }
-    return 1;
-}
-
-
-unsigned long alloc_block (void)
-{
-    unsigned long block = 0; /* FIXME: start point could be used */
-
-    if (reiserfs_bitmap_find_zero_bit (fsck_allocable_bitmap (fs), &block)) {
-	die ("alloc_block: Allocable blocks counter is wrong");
-	return 0;
-    }
-    reiserfs_bitmap_set_bit (fsck_allocable_bitmap (fs), block);
-    return block;
-}
-
-
-void make_allocable (unsigned long block)
-{
-    reiserfs_bitmap_clear_bit (fsck_allocable_bitmap (fs), block);
-}
-
-static void choose_hash_function (reiserfs_filsys_t * fs)
-{
-    unsigned long max;
-    unsigned int hash_code;
-    int i;
-
-    if (fsck_hash_defined (fs))
-	return;
-
-    max = 0;
-    hash_code = func2code (0);
-
-    for (i = 0; i < fsck_data (fs)->rebuild.hash_amount; i ++) {
-	/* remember hash whihc got more hits */
-	if (fsck_data (fs)->rebuild.hash_hits [i] > max) {
-	    hash_code = i;
-	    max = fsck_data (fs)->rebuild.hash_hits [i];
-	}
-
-	if (fsck_data (fs)->rebuild.hash_hits [i])
-	    fsck_log ("%lu directory entries were hashed with %s hash.\n", 
-		      fsck_data (fs)->rebuild.hash_hits [i], code2name(i));
-    }
-
-    if (max == 0 || hash_code == 0) {
-	/* no names were found. take either super block value or
-           default */
-        hash_code = get_sb_hash_code (fs->fs_ondisk_sb);
-	if (!hash_code)
-	    hash_code = DEFAULT_HASH;
-        fsck_log ("Could not find a hash in use. Using %s\n",
-		  code2name (hash_code));
-    }
-    /* compare the most appropriate hash with the hash set in super block */
-    if (hash_code != get_sb_hash_code (fs->fs_ondisk_sb)) {
-        fsck_progress ("Selected hash (%s) does not match to the hash set in the super block (%s).\n",
-		code2name (hash_code), code2name (get_sb_hash_code (fs->fs_ondisk_sb)));
-        set_sb_hash_code (fs->fs_ondisk_sb, hash_code);
-    } 
-    fsck_progress ("\t%s hash is selected\n", code2name (hash_code));
-    
-    reiserfs_hash (fs) = code2func (hash_code);
-}
-
-/* create bitmap of blocks the tree is to be built off */
-/* debugreiserfs and pass0 should share this code -s should show
-the same as we could recover - test: zero first 32M */
-static void init_source_bitmap (reiserfs_filsys_t * fs)
-{
-    FILE * fp;
-    unsigned long block_count = get_sb_block_count (fs->fs_ondisk_sb);
-    unsigned long i, j;
-    unsigned long tmp;
-    unsigned long block, reserved, bits_amount;
-
-
-    switch (fsck_data (fs)->rebuild.scan_area) {
-    case ALL_BLOCKS:
-	fsck_source_bitmap (fs) = reiserfs_create_bitmap (block_count);
-	reiserfs_bitmap_fill (fsck_source_bitmap (fs));
-	fsck_progress ("The whole partition (%d blocks) is to be scanned\n", 
-		       reiserfs_bitmap_ones (fsck_source_bitmap (fs)));	
-	break;
-
-    case USED_BLOCKS:
-	fsck_progress ("Loading on-disk bitmap .. ");
-	fsck_source_bitmap (fs) = reiserfs_create_bitmap (block_count);	
-	reiserfs_bitmap_copy (fsck_source_bitmap (fs), fs->fs_bitmap2);
-	
-	fsck_progress ("ok, %d blocks marked used\n", 
-		       reiserfs_bitmap_ones (fsck_source_bitmap (fs)));
-	break;
-
-    case EXTERN_BITMAP:
-	fp = fopen (fsck_data (fs)->rebuild.bitmap_file_name, "r");
-	
-	if (!fp) {
-	    reiserfs_exit (EXIT_OPER, "Could not load bitmap: %s\n", 
-			   strerror(errno));
-	}
-	
-	fsck_source_bitmap (fs) = reiserfs_bitmap_load (fp);
-	
-	if (!fsck_source_bitmap (fs)) {
-	    reiserfs_exit (EXIT_OPER, "Could not load fitmap from \"%s\"", 
-			   fsck_data (fs)->rebuild.bitmap_file_name);
-	}
-
-	fsck_progress ("%d blocks marked used in extern bitmap\n", 
-		       reiserfs_bitmap_ones (fsck_source_bitmap (fs)));
-	fclose (fp);
-	break;
-
-    default:
-	reiserfs_panic ("No area to scan specified");
-    }
-
-    tmp = 0;
-
-    /* unmark bitmaps */
-    block = fs->fs_super_bh->b_blocknr + 1;
-
-    reserved = fsck_source_bitmap(fs)->bm_bit_size;
-    for (i = 0; i < get_sb_bmap_nr (fs->fs_ondisk_sb); i ++) {
-	if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), block)) {
-	    /* bitmap is definitely broken, mark all blocks of this bitmap block as used */
-	
-	    bits_amount = (reserved < fs->fs_blocksize * 8) ? reserved : fs->fs_blocksize * 8;
-	    fsck_log("%s: Bitmap %lu (of %lu bits) is wrong - mark all blocks [%lu - %lu] as used\n",
-		__FUNCTION__, i, bits_amount, i * fs->fs_blocksize * 8,
-		fs->fs_blocksize * 8 * i + bits_amount); 	
-				
-	    for (j = i * fs->fs_blocksize * 8; j < i * fs->fs_blocksize * 8 + bits_amount; j++) {
-	        if (!reiserfs_bitmap_test_bit (fsck_source_bitmap(fs), j))
-		    reiserfs_bitmap_set_bit (fsck_source_bitmap(fs), j);
-	    }
-        }
-        reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), block);
-
-	reserved -= fs->fs_blocksize * 8;
-	tmp ++;
-	/* next block fo bitmap */
-	if (spread_bitmaps (fs))
-	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);
-	else
-	    block ++;
-    }
-
-    /* pass 0 will skip super block and journal areas and bitmap blocks, find
-       how many blocks have to be read */
-    for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++) {
-	if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), i))
-	    continue;
-	reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i);
-	tmp ++;
-    }
-
-    /* unmark journal area as used if journal is standard or it is non standard
-       and initialy has been created on a main device */
-
-    reserved = get_size_of_journal_or_reserved_area (fs->fs_ondisk_sb);
-    /* where does journal area (or reserved journal area) start from */
-
-    if (!is_new_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) &&
-    	!is_old_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
-	die ("init_source_bitmap: Wrong super block location, you must run --rebuild-sb.");
-
-    block = get_journal_start_must (fs);
-
-    for (i = block; i < reserved + block; i ++) {
-	if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), i))
-	    continue;
-	reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i);
-	tmp ++;	
-    }
-
-    if (fs->fs_badblocks_bm)
-    	for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
-	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))
-		reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i);
-    	}
-
-    fsck_source_bitmap (fs)->bm_set_bits = reiserfs_bitmap_ones (fsck_source_bitmap (fs));
-
-    fsck_progress ("Skipping %d blocks (super block, journal, "
-		   "bitmaps) %d blocks will be read\n", tmp, fsck_source_bitmap (fs)->bm_set_bits);
-		
-}
-
-
-static void before_pass_0 (reiserfs_filsys_t * fs)
-{
-    /* bitmap of blocks to be read */
-    init_source_bitmap (fs);
-
-    /* bitmap of leaves, good and bad unformatted */
-    make_aux_bitmaps (fs);
-
-    /* on pass0 all objectids will be marked here as used */
-    proper_id_map (fs) = id_map_init();
-
-    /* pass0 gathers statistics about hash hits */
-    hash_hits_init (fs);
-}
-
-
-static void save_pass_0_result (reiserfs_filsys_t * fs)
-{
-    FILE * file;
-    int retval;
-
-    /* save bitmaps with which we will be able start reiserfs from
-       pass 1 */
-    file = open_file ("temp_fsck_file.deleteme", "w+");
-    if (!file)
-	return;
-
-    reiserfs_begin_stage_info_save (file, PASS_0_DONE);
-    reiserfs_bitmap_save (file,  leaves_bitmap);
-    reiserfs_bitmap_save (file,  good_unfm_bitmap);
-    reiserfs_bitmap_save (file,  bad_unfm_bitmap);
-    reiserfs_end_stage_info_save (file);
-    close_file (file);
-    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
-    if (retval != 0)
-	fsck_progress ("%s: Could not rename the temporary file temp_fsck_file.deleteme to %s",
-	    __FUNCTION__, state_dump_file (fs));
-}
-
-
-/* file 'fp' must contain 3 bitmaps saved during last pass 0: bitmap
-   of leaves, bitmaps of good and bad unfms*/
-void load_pass_0_result (FILE * fp, reiserfs_filsys_t * fs)
-{
-    leaves_bitmap = reiserfs_bitmap_load (fp);
-    good_unfm_bitmap = reiserfs_bitmap_load (fp);
-    bad_unfm_bitmap = reiserfs_bitmap_load (fp);
-    if (!leaves_bitmap || !good_unfm_bitmap || !bad_unfm_bitmap)
-	fsck_exit ("State dump file seems corrupted. Run without -d");
-
-    fsck_source_bitmap (fs) = leaves_bitmap;
-
-    /* on pass 1 we do not need proper objectid map */
-
-    fsck_progress ("Pass 0 result loaded. %d leaves, %d/%d good/bad data blocks\n",
-		   reiserfs_bitmap_ones (leaves_bitmap),
-		   reiserfs_bitmap_ones (good_unfm_bitmap),
-		   reiserfs_bitmap_ones (bad_unfm_bitmap));
-}
-
-
-static void after_pass_0 (reiserfs_filsys_t * fs)
-{
-    time_t t;
-
-    /* update super block: hash, objectid map, fsck state */
-    choose_hash_function (fs);
-    id_map_flush(proper_id_map (fs), fs);
-    set_sb_fs_state (fs->fs_ondisk_sb, PASS_0_DONE);
-    mark_buffer_dirty (fs->fs_super_bh);
-
-    /* write all dirty blocks */
-    fsck_progress ("Flushing..");
-    fs->fs_dirt = 1;
-    reiserfs_flush (fs);
-    fsck_progress ("finished\n");
-
-    stage_report (0, fs);
-
-    /* free what we do not need anymore */
-    reiserfs_delete_bitmap (fsck_source_bitmap (fs));
-    fsck_source_bitmap (fs) = 0;
-
-    if (!fsck_run_one_step (fs)) {
-	if (fsck_user_confirmed (fs, "Continue? (Yes):", "Yes\n", 1)) {
-	    /* reiserfsck continues */
-	    fsck_source_bitmap (fs) = leaves_bitmap;
-	    return;
-	}
-    } else
-	save_pass_0_result (fs);
-
-    id_map_free(proper_id_map (fs));
-    proper_id_map (fs) = 0;
-    
-    time (&t);
-    fsck_progress ("###########\n"
-		   "reiserfsck finished pass 0 at %s"
-		   "###########\n", ctime (&t));
-    fs->fs_dirt = 1;
-    reiserfs_close (fs);
-    exit(0);
-}
-
-
-void pass_0 (reiserfs_filsys_t * fs)
-{
-    if (get_reiserfs_format (fs->fs_ondisk_sb) != fs->fs_format || 
-        get_reiserfs_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_UNKNOWN)
-    {
-	reiserfs_exit (EXIT_OPER, "pass 0: ReiserFS format version mismatch "
-		       "found, you should run --rebuild-sb");
-    }
-  
-    fsck_progress ("\nPass 0:\n");
-    if (fsck_log_file (fs) != stderr)
-	/* this is just to separate warnings in the log file */
-	fsck_log ("####### Pass 0 #######\n");
-
-
-    before_pass_0 (fs);
-
-    /* scan the partition, find leaves and correct them */
-    do_pass_0 (fs);
-
-    after_pass_0 (fs);
-}
-
diff --git a/fsck/pass1.c b/fsck/pass1.c
deleted file mode 100644
index d27fbb6..0000000
--- a/fsck/pass1.c
+++ /dev/null
@@ -1,821 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README 
- */
-
-#include "fsck.h"
-
-reiserfs_bitmap_t * bad_unfm_in_tree_once_bitmap;
-
-
-//int step = 0; // 0 - find stat_data or any item ; 1 - find item ; 2 - already found
-
-
-/* allocates buffer head and copy buffer content */
-struct buffer_head * make_buffer (int dev, unsigned long blocknr, int size, char * data)
-{
-    struct buffer_head * bh;
-    
-    bh = getblk (dev, blocknr, size);
-    if (buffer_uptodate (bh))
-	return bh;
-//    die ("make_buffer: uptodate buffer found");
-    memcpy (bh->b_data, data, size);
-    misc_set_bit (BH_Uptodate, (char *)&bh->b_state);
-    return bh;
-}
-
-
-int find_not_of_one_file(struct key * to_find, struct key * key) {
-    if ((get_key_objectid (to_find) != ~(__u32)0) &&
-        (get_key_objectid (to_find) != get_key_objectid (key)))
-        return 1;
-    if ((get_key_dirid (to_find) != ~(__u32)0) &&
-        (get_key_dirid (to_find) != get_key_dirid (key)))
-        return 1;
-    return 0;
-}
-
-
-int is_item_reachable (struct item_head * ih)
-{
-    return ih_reachable (ih) ? 1 : 0;
-}
-
-
-void mark_item_unreachable (struct item_head * ih)
-{
-    clean_ih_flags (ih);
-    mark_ih_unreachable (ih);
-
-    if (is_indirect_ih (ih))
-	set_ih_free_space (ih, 0);
-}
-
-
-void mark_item_reachable (struct item_head * ih, struct buffer_head * bh)
-{
-    mark_ih_reachable (ih);
-    mark_buffer_dirty (bh);
-}
-
-static void stat_data_in_tree (struct buffer_head *bh,
-			       struct item_head * ih)
-{
-#if 0
-    __u32 objectid;
-    
-    objectid = get_key_objectid (&ih->ih_key);
-    
-    if (mark_objectid_really_used (proper_id_map (fs), objectid)) {
-	stat_shared_objectid_found (fs);
-	mark_objectid_really_used (shared_id_map (fs), objectid);
-    }
-#endif
-    
-    zero_nlink (ih, B_I_PITEM (bh, ih));
-}
-
-static char *still_bad_unfm_ptr_to_string (int val) {
-    switch (val) {
-	case 1:
-	    return "a leaf";
-	case 2:
-	    return "shared between a few files";
-	case 3:
-	    return "not a data block";
-	case 4:
-	    return "not used in on-disk bitmap";
-	case 5:
-	    return "out of partition boundary";
-    }
-    return "";
-}
-
-/* this just marks blocks pointed by an indirect item as used in the
-   new bitmap */
-static void indirect_in_tree (struct buffer_head * bh,
-			      struct item_head * ih)
-{
-    unsigned int i;
-    __u32 * unp;
-    __u32 unfm_ptr;
-    int ret;
-
-    unp = (__u32 *)B_I_PITEM (bh, ih);
-    
-    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-	unfm_ptr = d32_get (unp, i);
-	if (unfm_ptr == 0)
-	    continue;
-	if ((ret = still_bad_unfm_ptr_1 (unfm_ptr)))
-	    reiserfs_panic ("%s: block %lu: The file %k points to the block (%u) which is %s", 
-		__FUNCTION__, bh->b_blocknr, &ih->ih_key, unfm_ptr, still_bad_unfm_ptr_to_string(ret));
-
-	mark_block_used (unfm_ptr, 1);
-    }
-}
-
-
-static void leaf_is_in_tree_now (struct buffer_head * bh)
-{
-    item_action_t actions[] = {stat_data_in_tree, indirect_in_tree, 0, 0};
-
-    mark_block_used ((bh)->b_blocknr, 1);
-
-    for_every_item (bh, mark_item_unreachable, actions);
-
-    pass_1_stat (fs)->inserted_leaves ++;
-
-    mark_buffer_dirty (bh);
-}
-
-
-static void insert_pointer (struct buffer_head * bh, struct path * path)
-{
-    struct item_head * ih;
-    char * body;
-    int retval;
-    struct tree_balance tb;
-    
-    init_tb_struct (&tb, fs, path, 0x7fff);
-
-    /* fix_nodes & do_balance must work for internal nodes only */
-    ih = 0;
-
-    retval = fix_nodes (/*tb.transaction_handle,*/ M_INTERNAL, &tb, ih);
-    if (retval != CARRY_ON)
-	die ("insert_pointer: fix_nodes failed with retval == %d", retval);
-    
-    /* child_pos: we insert after position child_pos: this feature of the insert_child */
-    /* there is special case: we insert pointer after
-       (-1)-st key (before 0-th key) in the parent */
-    if (PATH_LAST_POSITION (path) == 0 && path->pos_in_item == 0)
-	PATH_H_B_ITEM_ORDER (path, 0) = -1;
-    else {
-	if (PATH_H_PPARENT (path, 0) == 0)
-	    PATH_H_B_ITEM_ORDER (path, 0) = 0;
-/*    PATH_H_B_ITEM_ORDER (path, 0) = PATH_H_PPARENT (path, 0) ? PATH_H_B_ITEM_ORDER (path, 0) : 0;*/
-    }
-    
-    ih = 0;
-    body = (char *)bh;
-    //memmode = 0;
-
-    do_balance (&tb, ih, body, M_INTERNAL, 0);
-
-    leaf_is_in_tree_now (bh);
-}
-
-
-/* return 1 if left and right can be joined. 0 otherwise */
-int balance_condition_fails (struct buffer_head * left, struct buffer_head * right)
-{
-    if (B_FREE_SPACE (left) >= B_CHILD_SIZE (right) -
-	(are_items_mergeable (B_N_PITEM_HEAD (left, B_NR_ITEMS (left) - 1), B_N_PITEM_HEAD (right, 0), left->b_size) ? IH_SIZE : 0))
-	return 1;
-    return 0;
-}
-
-
-/* return 1 if new can be joined with last node on the path or with
-   its right neighbor, 0 otherwise */
-int balance_condition_2_fails (struct buffer_head * new, struct path * path)
-{
-    struct buffer_head * bh;
-    struct key * right_dkey;
-    int pos, used_space;
-    
-    bh = PATH_PLAST_BUFFER (path);
-    
-
-    if (balance_condition_fails (bh, new))
-	/* new node can be joined with last buffer on the path */
-	return 1;
-    
-    /* new node can not be joined with its left neighbor */
-    
-    right_dkey = uget_rkey (path);
-    if (right_dkey == 0)
-	/* there is no right neighbor */
-	return 0;
-    
-    pos = PATH_H_POSITION (path, 1);
-    if (pos == B_NR_ITEMS (bh = PATH_H_PBUFFER (path, 1))) {
-	/* we have to read parent of right neighbor. For simplicity we
-	   call search_by_key, which will read right neighbor as well */
-	INITIALIZE_PATH(path_to_right_neighbor);
-	
-	if (reiserfs_search_by_key_4 (fs, right_dkey, &path_to_right_neighbor) != ITEM_FOUND)
-	    reiserfs_panic ("%s: block %lu, pointer %d: The left delimiting key %k of the block (%lu) is wrong,"
-		"the item cannot be found", __FUNCTION__, PATH_H_PBUFFER(path, 1)->b_blocknr, pos, 
-		right_dkey, get_dc_child_blocknr(B_N_CHILD (bh, pos + 1)));
-
-	used_space =  B_CHILD_SIZE (PATH_PLAST_BUFFER (&path_to_right_neighbor));
-	pathrelse (&path_to_right_neighbor);
-    }
-    else
-	used_space = get_dc_child_size (B_N_CHILD (bh, pos + 1));
-    
-    if (B_FREE_SPACE (new) >= used_space -
-	(are_items_mergeable (B_N_PITEM_HEAD (new, B_NR_ITEMS (new) - 1), (struct item_head *)right_dkey, new->b_size) ? IH_SIZE : 0))
-	return 1;
-
-    return 0;
-}
-
-
-static void get_max_buffer_key (struct buffer_head * bh, struct key * key)
-{
-    struct item_head * ih;
-
-    ih = B_N_PITEM_HEAD (bh, B_NR_ITEMS (bh) - 1);
-    copy_key (key, &(ih->ih_key));
-
-    if (is_direntry_key (key)) {
-	/* copy deh_offset 3-rd and 4-th key components of the last entry */
-	set_offset (KEY_FORMAT_1, key, 
-		    get_deh_offset (B_I_DEH (bh, ih) + get_ih_entry_count (ih) - 1));
-
-    } else if (!is_stat_data_key (key))
-	/* get key of the last byte, which is contained in the item */
-	set_offset (key_format (key), key, get_offset (key) + get_bytes_number (ih, bh->b_size) - 1);
-}
-
-
-int tree_is_empty (void)
-{
-    return (get_sb_root_block (fs->fs_ondisk_sb) == ~(__u32)0 || 
-	    get_sb_root_block (fs->fs_ondisk_sb) == 0) ? 1 : 0;
-}
-
-
-void make_single_leaf_tree (struct buffer_head * bh)
-{
-    /* tree is empty, make tree root */
-    set_sb_root_block (fs->fs_ondisk_sb, bh->b_blocknr);
-    set_sb_tree_height (fs->fs_ondisk_sb, 2);
-    mark_buffer_dirty (fs->fs_super_bh);
-    leaf_is_in_tree_now (bh);
-}
-
-
-/* inserts pointer to leaf into tree if possible. If not, marks node as
-   uninsertable in special bitmap */
-static void try_to_insert_pointer_to_leaf (struct buffer_head * new_bh)
-{
-    INITIALIZE_PATH (path);
-    struct buffer_head * bh;			/* last path buffer */
-    struct key * first_bh_key, last_bh_key;	/* first and last keys of new buffer */
-    struct key last_path_buffer_last_key, * right_dkey;
-    int ret_value;
-
-    if (tree_is_empty () == 1) {
-	make_single_leaf_tree (new_bh);
-	return;
-    }
-
-    first_bh_key = B_N_PKEY (new_bh, 0);
-    
-    /* try to find place in the tree for the first key of the coming node */
-    ret_value = reiserfs_search_by_key_4 (fs, first_bh_key, &path);
-    if (ret_value == ITEM_FOUND)
-	goto cannot_insert;
-
-    /* get max key in the new node */
-    get_max_buffer_key (new_bh, &last_bh_key);
-
-    bh = PATH_PLAST_BUFFER (&path);
-    if (comp_keys (B_N_PKEY (bh, 0), &last_bh_key) == 1/* first is greater*/) {
-	/* new buffer falls before the leftmost leaf */
-	if (balance_condition_fails (new_bh, bh))
-	    goto cannot_insert;
-	
-	if (uget_lkey (&path) != 0 || PATH_LAST_POSITION (&path) != 0)
-	    die ("try_to_insert_pointer_to_leaf: bad search result");
-	
-	path.pos_in_item = 0;
-	goto insert;
-    }
-    
-    /* get max key of buffer, that is in tree */
-    get_max_buffer_key (bh, &last_path_buffer_last_key);
-    if (comp_keys (&last_path_buffer_last_key, first_bh_key) != -1/* second is greater */)
-	/* first key of new buffer falls in the middle of node that is in tree */
-	goto cannot_insert;
-    
-    right_dkey = uget_rkey (&path);
-    if (right_dkey && comp_keys (right_dkey, &last_bh_key) != 1 /* first is greater */)
-	goto cannot_insert;
-    
-    if (balance_condition_2_fails (new_bh, &path))
-	goto cannot_insert;
-
-
- insert:
-    insert_pointer (new_bh, &path);
-    goto out;
-    
- cannot_insert:
-    /* statistic */
-
-    mark_block_uninsertable (new_bh->b_blocknr);
-    
- out:
-    pathrelse (&path);
-    return;
-}
-
-
-
-/* everything should be correct already in the leaf but contents of indirect
-   items. So we only
-   1. zero slots pointing to a leaf
-   2. zero pointers to blocks which are pointed already
-   3. what we should do with directory entries hashed by another hash?
-   they are deleted for now
-*/
-static void pass1_correct_leaf (reiserfs_filsys_t * fs,
-				struct buffer_head * bh)
-{
-    unsigned int i, j;
-    struct item_head * ih;
-    __u32 * ind_item;
-    __u32 unfm_ptr;
-    int dirty = 0;
-
-
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < B_NR_ITEMS (bh); i ++, ih ++) {
-	if (is_direntry_ih (ih)) {
-	    struct reiserfs_de_head * deh;
-	    __u32 offset;
-	    char * name;
-	    int name_len;
-	    unsigned int hash_code;
-
-	    deh = B_I_DEH (bh, ih);
-	    offset = 0;
-	    for (j = 0; j < get_ih_entry_count (ih); j ++) {
-		name = name_in_entry (deh + j, j);
-		name_len = name_in_entry_length (ih, deh + j, j);
-
-		if ((j == 0 && is_dot (name, name_len)) ||
-		    (j == 1 && is_dot_dot (name, name_len))) {
-		    continue;
-		}
-
-		hash_code = find_hash_in_use (name, name_len, get_deh_offset (deh + j),
-					      get_sb_hash_code (fs->fs_ondisk_sb));
-		if (hash_code != get_sb_hash_code (fs->fs_ondisk_sb)) {
-		    fsck_log ("pass1: block %lu, item %d, entry %d: The entry \"%.*s\" of the %k is hashed with %s "
-			"whereas proper hash is %s", bh->b_blocknr, i, j, name_len, name, &ih->ih_key,
-			      code2name (hash_code), code2name (get_sb_hash_code (fs->fs_ondisk_sb)));
-		    if (get_ih_entry_count (ih) == 1) {
-			delete_item (fs, bh, i);
-			fsck_log(" - the only entry - item was deleted\n");
-			i --;
-			ih --;
-			break;
-		    } else {
-			cut_entry (fs, bh, i, j, 1);
-			fsck_log(" - deleted\n");
-			j --;
-			deh = B_I_DEH (bh, ih);
-			continue;
-		    }
-		}
-
-		if (j && offset >= get_deh_offset (deh + j)) {
-		    fsck_log ("pass1: block %lu, item %d, entry %d: The entry "
-			      "\"%.*s\" of the %k has hash offset %lu not "
-			      "larger smaller than the previous one %lu. The "
-			      "entry is deleted.\n", bh->b_blocknr, 
-			      i, j, name_len, name, &ih->ih_key, 
-			      get_deh_offset(deh + j), offset);
-		    cut_entry (fs, bh, i, j, 1);
-		    j --;
-		    deh = B_I_DEH (bh, ih);
-		    continue;
-		}
-
-		offset = get_deh_offset (deh + j);
-	    }
-	    continue;
-	}
-
-
-	if (!is_indirect_ih (ih))
-	    continue;
-
-	/* correct indirect items */
-	ind_item = (__u32 *)B_I_PITEM (bh, ih);
-
-	for (j = 0; j < I_UNFM_NUM (ih); j ++) {
-	    unfm_ptr = d32_get (ind_item, j);
-
-	    if (!unfm_ptr)
-		continue;
-
-	    /* this corruption of indirect item had to be fixed in pass0 */
-	    if (not_data_block (fs, unfm_ptr) || unfm_ptr >= get_sb_block_count (fs->fs_ondisk_sb))
-		/*!was_block_used (unfm_ptr))*/
-		reiserfs_panic ("%s: block %lu, item %d, pointer %d: The wrong pointer (%u) in the file %K. "
-		    "Must be fixed on pass0.",  __FUNCTION__, bh->b_blocknr, i, j, unfm_ptr, &ih->ih_key);
-
-	    /* 1. zero slots pointing to a leaf */
-	    if (is_used_leaf (unfm_ptr)) {
-		dirty ++;
-		d32_put (ind_item, j, 0);
-		pass_1_stat (fs)->pointed_leaves ++;
-		continue;
-	    }
-
-	    /* 2. zero pointers to blocks which are pointed already */
-	    if (is_bad_unformatted (unfm_ptr)) {
-		/* this unformatted pointed more than once. Did we see it already? */
-		if (!is_bad_unfm_in_tree_once (unfm_ptr))
-		    /* keep first reference to it and mark about that in
-                       special bitmap */
-		    mark_bad_unfm_in_tree_once (unfm_ptr);
-		else {
-		    /* Yes, we have seen this pointer already, zero other pointers to it. */
-		    dirty ++;
-		    d32_put (ind_item, j, 0);
-		    pass_1_stat (fs)->non_unique_pointers ++;
-		    continue;
-		}
-	    } else
-		pass_1_stat (fs)->correct_pointers ++;
-	}
-    }
-
-    if (dirty)
-	mark_buffer_dirty (bh);
-}
-
-struct si * remove_saved_item (struct si * si)
-{
-    struct si * tmp = si->si_next;
-    
-    freemem (si->si_dnm_data);
-    freemem (si);
-    return tmp;
-}
-
-/* fsck starts creating of this bitmap on pass 1. It will then become
-   on-disk bitmap */
-static void init_new_bitmap (reiserfs_filsys_t * fs)
-{
-    unsigned int i;
-    unsigned long block;
-    unsigned long reserved;
-    
-
-    fsck_new_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-
-    /* mark_block_used skips 0, set the bit explicitly */
-    reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), 0);
-
-    /* mark other skipped blocks and super block used */
-    for (i = 1; i <= fs->fs_super_bh->b_blocknr; i ++)
-	mark_block_used (i, 1);
-
-    /* mark bitmap blocks as used */
-    block = fs->fs_super_bh->b_blocknr + 1;
-    for (i = 0; i < get_sb_bmap_nr (fs->fs_ondisk_sb); i ++) {
-	mark_block_used (block, 1);
-	if (spread_bitmaps (fs))
-	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);
-	else
-	    block ++;
-    }
-
-    reserved = get_size_of_journal_or_reserved_area (fs->fs_ondisk_sb);
-    /* where does journal area (or reserved journal area) start from */
-
-    if (!is_new_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) &&
-    	!is_old_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
-	die ("init_new_bitmap: Wrong super block location, you must run --rebuild-sb.");
-
-    block = get_journal_start_must (fs);
-
-    for (i = block; i < reserved + block; i ++)
-	mark_block_used (i, 1);
-	
-
-    if (fs->fs_badblocks_bm)
-    	for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
-	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) {
-	    	if (reiserfs_bitmap_test_bit (fsck_new_bitmap (fs), i))
-	    	    reiserfs_panic ("%s: The block pointer to not data area, must be fixed on the pass0.\n",
-	    	    	__FUNCTION__);	    	
-		reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), i);
-	    }
-    	}
-
-#if 0
-    /* mark journal area as used if journal is standard or it is non standard
-       and initialy has been created on a main device */
-    reserved = 0;
-    if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb))
-	reserved = get_jp_journal_size (sb_jp (fs->fs_ondisk_sb));
-    if (get_sb_reserved_for_journal (fs->fs_ondisk_sb))
-	reserved = get_sb_reserved_for_journal (fs->fs_ondisk_sb);
-    if (reserved) {
-	for (i = 0; i <= reserved; i ++)
-	    mark_block_used (i + get_jp_journal_1st_block (sb_jp
-							   (fs->fs_ondisk_sb)));
-    }
-#endif
-}
-
-
-/* this makes a map of blocks which can be allocated when fsck will
-   continue */
-static void find_allocable_blocks (reiserfs_filsys_t * fs)
-{
-    unsigned long i;
-
-    fsck_progress ("Looking for allocable blocks .. ");
-
-    fsck_allocable_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_fill (fsck_allocable_bitmap (fs));
-
-
-    /* find how many leaves are not pointed by any indirect items */
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
-	if (not_data_block (fs, i))
-	    /* journal (or reserved for it area), bitmaps, super block and
-	       blocks before it */
-	    continue;
-
-	if (is_good_unformatted (i) && is_bad_unformatted (i))
-	    die ("find_allocable_blocks: The block (%lu) is masr as good and as bad at once.", i);
-
-	if (is_good_unformatted (i) || is_bad_unformatted (i)) {
-	    /* blocks which were pointed once or more thn onec from indirect
-	       items - they will not be allocated */
-	    continue;
-	}
-
-	/* make allocable not leaves, not bad blocks */
-	if (!is_used_leaf (i) && (!fs->fs_badblocks_bm || 
-				  !reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))) 
-	{
-	    /* this is not leaf and it is not pointed by found indirect items,
-               so it does not contains anything valuable */
-	    make_allocable (i);
-	    pass_1_stat (fs)->allocable_blocks ++;
-	}
-    }
-    fsck_progress ("finished\n");
-
-    fs->block_allocator = reiserfsck_reiserfs_new_blocknrs;
-    fs->block_deallocator = reiserfsck_reiserfs_free_block;
-}
-
-
-static void before_pass_1 (reiserfs_filsys_t * fs)
-{
-    /* this will become an on-disk bitmap */
-    init_new_bitmap (fs);
-
-    /* bitmap of leaves which could not be inserted on pass 1. FIXME:
-       no need to have 1 bit per block */
-    fsck_uninsertables (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_fill (fsck_uninsertables (fs));
-    
-    /* find blocks which can be allocated */
-    find_allocable_blocks (fs);
-
-    /* bitmap of bad unformatted nodes which are in the tree already */
-    bad_unfm_in_tree_once_bitmap = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-
-    /* pass 1 does not deal with objectid */
-}
-
-
-static void save_pass_1_result (reiserfs_filsys_t * fs)
-{
-    FILE * file;
-    int retval;
-
-    file = open_file("temp_fsck_file.deleteme", "w+");
-    if (!file)
-	return;
-
-    /* to be able to get a new bitmap on pass2 we should flush it on disk
-       new_bitmap should not be flushed on disk if run without -d option, as
-       if fsck fails on pass1 we get wrong bitmap on the next fsck start */
-    reiserfs_flush_to_ondisk_bitmap (fsck_new_bitmap (fs), fs);
-    
-    /* to be able to restart with pass 2 we need bitmap of
-       uninsertable blocks and bitmap of alocable blocks */
-    reiserfs_begin_stage_info_save(file, PASS_1_DONE);
-    reiserfs_bitmap_save (file,  fsck_uninsertables (fs));
-    reiserfs_bitmap_save (file,  fsck_allocable_bitmap(fs));
-    reiserfs_end_stage_info_save (file);
-    close_file (file);
-    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
-    if (retval != 0)
-	fsck_progress ("pass 1: Could not rename the temporary file temp_fsck_file.deleteme to %s",
-		       state_dump_file (fs));
-}
-
-
-void load_pass_1_result (FILE * fp, reiserfs_filsys_t * fs)
-{
-    fsck_new_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
-    
-    fsck_uninsertables (fs) = reiserfs_bitmap_load (fp);
-    fsck_allocable_bitmap (fs) = reiserfs_bitmap_load (fp);
-    
-    fs->block_allocator = reiserfsck_reiserfs_new_blocknrs;
-    fs->block_deallocator = reiserfsck_reiserfs_free_block;
-
-    if (!fsck_new_bitmap (fs) || !fsck_allocable_bitmap (fs) ||
-	!fsck_allocable_bitmap (fs))
-	fsck_exit ("State dump file seems corrupted. Run without -d");
-
-
-    /* we need objectid map on pass 2 to be able to relocate files */
-    proper_id_map (fs) = id_map_init();
-    /* Not implemented yet.
-    fetch_objectid_map (proper_id_map (fs), fs);
-    */
-
-    fsck_progress ("Pass 1 result loaded. %d blocks used, %d allocable, "
-		   "still to be inserted %d\n",
-		   reiserfs_bitmap_ones (fsck_new_bitmap (fs)),
-		   reiserfs_bitmap_zeros (fsck_allocable_bitmap (fs)),
-		   reiserfs_bitmap_zeros (fsck_uninsertables (fs)));
-}
-
-
-extern reiserfs_bitmap_t * leaves_bitmap;
-
-/* reads blocks marked in leaves_bitmap and tries to insert them into
-   tree */
-static void do_pass_1 (reiserfs_filsys_t * fs)
-{
-    struct buffer_head * bh;
-    unsigned long i; 
-    int what_node;
-    unsigned long done = 0, total;
-
-
-    /* on pass0 we have found that amount of leaves */
-    total = reiserfs_bitmap_ones (leaves_bitmap);
-
-    /* read all leaves found on the pass 0 */
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
-	if (!is_used_leaf (i))
-	    continue;
-
-	print_how_far (fsck_progress_file (fs), &done, total, 1, fsck_quiet (fs));
-
-	/* at least one of nr_to_read blocks is to be checked */
-	bh = bread (fs->fs_dev, i, fs->fs_blocksize);
-	if (!bh) {
-	    /* we were reading one block at time, and failed, so mark
-	       block bad */
-	    fsck_progress ("pass1: Reading of the block %lu failed\n", i);
-	    continue;
-	}
-
-	what_node = who_is_this (bh->b_data, bh->b_size);
-	if ( what_node != THE_LEAF ) {
-	    check_memory_msg();
-	    die ("build_the_tree: Nothing but leaves are expected. Block %lu - %s\n", 
-		i, which_block(what_node));
-	}
-	
-	if (is_block_used (i) && !(block_of_journal (fs, i) &&
-				   fsck_data(fs)->rebuild.use_journal_area))
-	    /* block is in new tree already */
-	    die ("build_the_tree: The leaf (%lu) is in the tree already\n", i);
-		    
-	/* fprintf (block_list, "leaf %d\n", i + j);*/
-	pass_1_stat (fs)->leaves ++;
-
-	/* the leaf may still contain indirect items with wrong
-	   slots. Fix that */
-	pass1_correct_leaf (fs, bh);
-
-	if (get_blkh_nr_items (B_BLK_HEAD (bh)) == 0) {
-	    /* all items were deleted on pass 0 or pass 1 */
-	    mark_buffer_clean (bh);
-	    brelse (bh);
-	    continue;
-	}
-
-	if (is_leaf_bad (bh)) {
-	    /* FIXME: will die */
-	    fsck_log ("is_leaf_bad: WARNING: The leaf (%lu) is formatted badly. Will be handled on the the pass2.\n", 
-		bh->b_blocknr);
-	    mark_block_uninsertable (bh->b_blocknr);
-	    brelse (bh);
-	    continue;
-	}
-	
-	if (block_of_journal (fs, i) && fsck_data(fs)->rebuild.use_journal_area) {
-	    /* FIXME: temporary thing */
-	    if (tree_is_empty ()) {
-		/* we insert inot tree only first leaf of journal */
-		unsigned long block;
-		struct buffer_head * new_bh;
-		
-		block = alloc_block ();
-		if (!block)
-		    die ("could not allocate block");
-		new_bh = getblk (bh->b_dev, block, bh->b_size);
-		memcpy (new_bh->b_data, bh->b_data, bh->b_size);
-		mark_buffer_uptodate (new_bh, 1);
-		mark_buffer_dirty (new_bh);
-		make_single_leaf_tree (new_bh);
-		brelse (new_bh);
-		brelse (bh);
-		continue;
-	    }
-
-	    /* other blocks of journal will be inserted in pass 2 */
-	    mark_block_uninsertable (bh->b_blocknr);
-	    brelse (bh);
-	    continue;
-	}
-	
-	try_to_insert_pointer_to_leaf (bh);
-	brelse (bh);
-    }
-
-    fsck_progress ("\n");
-
-}
-
-
-static void after_pass_1 (reiserfs_filsys_t * fs)
-{
-    time_t t;
-
-    /* update fsck_state */
-    
-    /* we  should not flush bitmaps on disk after pass1, because
-       new_bitmap contains only those blocks which are good leaves or 
-       just allocated internal blocks. */
-       
-    set_sb_fs_state (fs->fs_ondisk_sb, PASS_1_DONE);
-    mark_buffer_dirty (fs->fs_super_bh);
-
-    /* write all dirty blocks */
-    fsck_progress ("Flushing..");
-    fs->fs_dirt = 1;
-    reiserfs_flush (fs);
-    fsck_progress ("finished\n");
-
-    stage_report (1, fs);
-
-    /* we do not need this anymore */
-    delete_aux_bitmaps ();
-    reiserfs_delete_bitmap (bad_unfm_in_tree_once_bitmap);
-
-    if (!fsck_run_one_step (fs)) {
-	if (fsck_user_confirmed (fs, "Continue? (Yes):", "Yes\n", 1))
-	    /* reiserfsck continues */
-	    return;
-    } else
-	save_pass_1_result (fs);
-
-    if (proper_id_map (fs)) {
-	/* when we run pass 1 only - we do not have proper_id_map */
-	id_map_free(proper_id_map (fs));
-	proper_id_map (fs) = 0;
-    }
-    
-    time (&t);
-    fsck_progress ("###########\n"
-		   "reiserfsck finished pass 1 at %s"
-		   "###########\n", ctime (&t));
-    fs->fs_dirt = 1;
-    reiserfs_close (fs);
-    exit(0);
-}
-
-
-void pass_1 (reiserfs_filsys_t * fs)
-{
-    fsck_progress ("\nPass 1 (will try to insert %lu leaves):\n",
-		   reiserfs_bitmap_ones (fsck_source_bitmap (fs)));
-    if (fsck_log_file (fs) != stderr)
-	fsck_log ("####### Pass 1 #######\n");
-
-
-    before_pass_1 (fs);
-
-    /* try to insert leaves found during pass 0 */
-    do_pass_1 (fs);
-
-    after_pass_1 (fs);
-}
-
diff --git a/fsck/pass2.c b/fsck/pass2.c
deleted file mode 100644
index a151369..0000000
--- a/fsck/pass2.c
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-
-/* on pass2 we take leaves which could not be inserted into tree
-   during pass1 and insert each item separately. It is possible that
-   items of different objects with the same key can be found. We treat
-   that in the following way: we put it into tree with new key and
-   link it into /lost+found directory with name made of dir,oid. When
-   coming item is a directory - we delete object from the tree, put it
-   back with different key, link it to /lost+found directory and
-   insert directory as it is */
-
-/* relocation rules: we have an item (it is taken from "non-insertable"
-   leaf). It has original key yet. We check to see if object with this
-   key is remapped. Object can be only remapped if it is not a piece
-   of directory */
-
-
-/* in list of this structures we store what has been relocated. */
-struct relocated {
-    unsigned long old_dir_id;
-    unsigned long old_objectid;
-    
-    unsigned long new_objectid;
-    
-    struct relocated * next;
-};
-
-/* all relocated files will be linked into lost+found directory at the
-   beginning of semantic pass */
-static struct relocated * relocated_list = NULL;
-
-static __u32 get_relocated_objectid_from_list (struct key * key) {
-    struct relocated *cur = relocated_list;
-
-    while (cur) {
-	if (cur->old_dir_id == get_key_dirid (key) &&
-	    cur->old_objectid == get_key_objectid (key))
-	    /* object is relocated already */
-	    return cur->new_objectid;
-	cur = cur->next;
-    }
-    return 0;
-}
-
-/* return objectid the object has to be remapped with */
-__u32 objectid_for_relocation (struct key * key)
-{
-    struct relocated * cur;
-    __u32 cur_id;
-
-    if ((cur_id = get_relocated_objectid_from_list (key)) != 0)
-    	return cur_id;
-
-    cur = getmem (sizeof (struct relocated));
-    cur->old_dir_id = get_key_dirid (key);
-    cur->old_objectid = get_key_objectid (key);
-    cur->new_objectid = id_map_alloc(proper_id_map(fs));
-    cur->next = relocated_list;
-    relocated_list = cur;
-/*    fsck_log ("relocation: (%K) is relocated to (%lu, %lu)\n",
-	      key, get_key_dirid (key), cur->new_objectid);*/
-    return cur->new_objectid;
-}
-
-/* relocated files get added into lost+found with slightly different names */
-static __u64 link_one (struct relocated * file) {
-    char * name;
-    struct key obj_key;
-    __u64 len = 0;
-
-    asprintf (&name, "%lu,%lu", file->old_dir_id, file->new_objectid);
-    set_key_dirid (&obj_key, file->old_dir_id);
-    set_key_objectid (&obj_key, file->new_objectid);
-
-    /* 0 for fsck_need does not mean too much - it would make effect if there 
-     * were no this directory yet. But /lost_found is there already */
-    len = reiserfs_add_entry (fs, &lost_found_dir_key, name, 
-	name_length(name, lost_found_dir_format), &obj_key, 0/*fsck_need*/);
-    pass_2_stat (fs)->relocated ++;
-    free (name);
-
-    return len;
-}
-
-void linked_already(struct key *new_key /*, link_func_t link_func*/) {
-    struct relocated *cur = relocated_list;
-    struct relocated *prev = NULL;
-
-    while (cur) {
-	if (cur->old_dir_id == get_key_dirid(new_key) && 
-	    cur->new_objectid == get_key_objectid(new_key))
-	    break;
-
-	prev = cur;
-	cur = cur->next;
-    }
-
-    if (cur) {	
-	/* len = link_func(cur); */
-
-	if (prev) 
-	    prev->next = cur->next;
-	else
-	    relocated_list = cur->next;
-
-	freemem (cur);
-    }
-}
-
-void link_relocated_files (void)
-{
-    struct relocated * tmp;
-    int count;
-    
-    count = 0;
-    while (relocated_list) {
-	link_one (relocated_list);
-	tmp = relocated_list;
-	relocated_list = relocated_list->next;
-	freemem (tmp);
-	count ++;
-    }
-}
-
-/* this item is in tree. All unformatted pointer are correct. Do not
-   check them */
-void save_item (struct si ** head, struct item_head * ih, char * item, __u32 blocknr)
-{
-    struct si * si, * cur;
-
-    si = getmem (sizeof (*si));
-    si->si_dnm_data = getmem (get_ih_item_len(ih));
-    /*si->si_blocknr = blocknr;*/
-    memcpy (&(si->si_ih), ih, IH_SIZE);
-    memcpy (si->si_dnm_data, item, get_ih_item_len(ih));
-
-    if (*head == 0)
-	*head = si;
-    else {
-	cur = *head;
-	while (cur->si_next)
-	    cur = cur->si_next;
-	cur->si_next = si;
-    }
-    return;
-}
-
-
-struct si * save_and_delete_file_item (struct si * si, struct path * path)
-{
-    struct buffer_head * bh = PATH_PLAST_BUFFER (path);
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-
-    save_item (&si, ih, B_I_PITEM (bh, ih), bh->b_blocknr);
-
-    /* delete item temporary - do not free unformatted nodes */
-    reiserfsck_delete_item (path, 1/*temporary*/);
-    return si;
-}
-
-
-/* check whether there are any directory items with this key */
-int should_relocate (struct item_head * ih)
-{
-    struct key key;
-    struct key * rkey;
-    struct path path;
-    struct item_head * path_ih;
-
-
-    /* starting with the leftmost item with this key */
-    key = ih->ih_key;
-    set_type_and_offset (KEY_FORMAT_1, &key, SD_OFFSET, TYPE_STAT_DATA);
-
-    while (1) {
-	reiserfs_search_by_key_4 (fs, &key, &path);
-	
-	if (get_item_pos (&path) == B_NR_ITEMS (get_bh (&path))) {
-	    rkey = uget_rkey (&path);
-	    if (rkey && !not_of_one_file (&key, rkey)) {
-		/* file continues in the right neighbor */
-		key = *rkey;
-		pathrelse (&path);
-		continue;
-	    }
-	    /* there is no more items with this key */
-	    pathrelse (&path);
-	    break;
-	}
-
-	path_ih = get_ih (&path);
-	if (not_of_one_file (&key, &(path_ih->ih_key))) {
-	    /* there are no more item with this key */
-	    pathrelse (&path);
-	    break;
-	}
-
-	if (is_stat_data_ih (path_ih)) {
-	    fix_obviously_wrong_sd_mode (&path);
-	    if (ih_checked (path_ih)) {
-		/* we have checked it already */
-		pathrelse (&path);
-
-		if (get_relocated_objectid_from_list (&path_ih->ih_key))
-		    return 1; /* it was relocated */
-		break;
-	    } else {
-		mark_ih_checked (path_ih);
-		mark_buffer_dirty (get_bh(&path));
-	    }
-	}
-	
-	/* ok, item found, but make sure that it is not a directory one */
-	if ((is_stat_data_ih (path_ih) && !not_a_directory (get_item (&path))) ||
-	    (is_direntry_ih (path_ih))) {
-	    /* item of directory found. so, we have to relocate the file */
-	    pathrelse (&path);
-	    return 1;
-	}
-	key = path_ih->ih_key;
-	set_offset (KEY_FORMAT_1, &key, get_offset (&key) + 1);
-	pathrelse (&path);
-    }
-    return 0;
-}
-
-
-/* this works for both new and old stat data */
-#define st_mode(sd) le16_to_cpu(((struct stat_data *)(sd))->sd_mode)
-
-#define st_mtime_v1(sd) le32_to_cpu(((struct stat_data_v1 *)(sd))->sd_mtime)
-#define st_mtime_v2(sd) le32_to_cpu(((struct stat_data *)(sd))->sd_mtime)
-
-
-/* either both sd-s are new of both are old */
-static void overwrite_stat_data (struct item_head * new_ih,
-				 void * new_item, struct path * path)
-{
-    __u16 new_mode, old_mode;
-
-    get_sd_mode (new_ih, new_item, &new_mode);
-    get_sd_mode (get_ih (path), get_item (path), &old_mode);
-
-
-    if (S_ISREG (new_mode) && !S_ISREG (old_mode)) {
-	/* in tree we have not regular file - overwrite its stat data
-           with stat data of regular file */
-	memcpy (get_item (path), new_item, get_ih_item_len (get_ih (path)));
-	mark_buffer_dirty (get_bh (path));
-	return;
-    }
-
-    if (S_ISREG (old_mode) && !S_ISREG (new_mode)) {
-	/* new stat data is not a stat data of regular file, keep
-           regular file stat data in tree */
-	return;
-    }
-    
-    /* if coming stat data has newer mtime - use that */
-    if (stat_data_v1 (new_ih)) {	
-	if (st_mtime_v1 (new_item) > st_mtime_v1 (get_item (path))) {
-	    memcpy (get_item (path), new_item, SD_V1_SIZE);
-	    mark_buffer_dirty (get_bh (path));
-	}
-    } else {
-	if (st_mtime_v2 (new_item) > st_mtime_v2 (get_item (path))) {
-	    memcpy (get_item (path), new_item, SD_SIZE);
-	    mark_buffer_dirty (get_bh (path));
-	}
-    }
-    return;
-}
-
-
-/* insert sd item if it does not exist, overwrite it otherwise */
-static void put_sd_into_tree (struct item_head * new_ih, char * new_item)
-{
-    struct path path;
-
-    if (!not_a_directory (new_item)) {
-	/* new item is a stat data of a directory. So we have to
-           relocate all items which have the same short key and are of
-           not a directory */
-	rewrite_file (new_ih, 1, 0/*do not change new_ih*/);
-    } else {
-	/* new item is a stat data of something else but directory. If
-           there are items of directory - we have to relocate the file */
-	if (should_relocate (new_ih))
-	    rewrite_file (new_ih, 1, 1/*change new_ih*/);
-    }
-    
-    /* if we will have to insert item into tree - it is ready */
-    zero_nlink (new_ih, new_item);
-    mark_item_unreachable (new_ih);
-    
-    /* we are sure now that if we are inserting stat data of a
-       directory - there are no items with the same key which are not
-       items of a directory, and that if we are inserting stat data is
-       of not a directory - it either has new key already or there are
-       no items with this key which are items of a directory */
-    if (reiserfs_search_by_key_4 (fs, &(new_ih->ih_key), &path) == ITEM_FOUND) {
-	/* this stat data is found */
-        if (get_ih_key_format (get_ih(&path)) != get_ih_key_format (new_ih)) {
-	    /* in tree stat data and a new one are of different
-               formats */
-	    fsck_log ("put_sd_into_tree: Inserting the StatData %K, mode (%M)...",
-		      &(new_ih->ih_key), st_mode (new_item));
-	    if (stat_data_v1 (new_ih)) {
-		/* sd to be inserted is of V1, where as sd in the tree
-                   is of V2 */
-		fsck_log ("found newer in the tree, mode (%M), insersion was skipped.\n",
-			  st_mode (get_item (&path)));
-	    	pathrelse (&path);
-	    } else {
-		/* the stat data in the tree is sd_v1 */
-		fsck_log ("older sd, mode (%M), is replaced with it.\n",
-			  st_mode (get_item (&path)));
-		reiserfsck_delete_item (&path, 0/*not temporary*/);
-		
-		reiserfs_search_by_key_4 (fs, &new_ih->ih_key, &path);
-		reiserfsck_insert_item (&path, new_ih, new_item);
-	    }
-	} else {
-	    /* both stat data are of the same version */
-	    overwrite_stat_data (new_ih, new_item, &path);
-	    pathrelse (&path);
-	}
-	return;
-    }
-    
-    /* item not found, insert a new one */
-    reiserfsck_insert_item (&path, new_ih, new_item);
-}
-
-
-/* this tries to put each item entry to the tree, if there is no items
-   of the directory, insert item containing 1 entry */
-static void put_directory_item_into_tree (struct item_head * comingih, char * item)
-{
-    struct reiserfs_de_head * deh;
-    int i;
-    char * buf;
-    char * name;
-    int namelen;
-
-    /* if there are anything with this key but a directory - move it
-       somewhere else */
-    rewrite_file (comingih, 1, 0/* do not change ih */);
-
-    deh = (struct reiserfs_de_head *)item;
-
-    for (i = 0; i < get_ih_entry_count (comingih); i ++, deh ++) {
-	name = name_in_entry (deh, i);
-	namelen = name_in_entry_length (comingih, deh, i);
-
-	if (!is_properly_hashed (fs, name, namelen, get_deh_offset (deh)))
-	    reiserfs_panic ("put_directory_item_into_tree: The entry (%d) \"%.*s\" of the directory %k has"
-		" badly hashed entry", i, namelen, name, &comingih->ih_key);
-
-	asprintf (&buf, "%.*s", namelen, name);
-	/* 1 for fsck is important: if there is no any items of this
-           directory in the tree yet - new item will be inserted
-           marked not reached */
-	reiserfs_add_entry (fs, &(comingih->ih_key), buf, entry_length (comingih, deh, i),
-			(struct key *)&(deh->deh2_dir_id), 1 << IH_Unreachable);
-	free (buf);
-    }
-}
-
-
-
-void insert_item_separately (struct item_head * ih,
-			     char * item, int was_in_tree)
-{
-    if (get_key_dirid (&ih->ih_key) == get_key_objectid (&ih->ih_key))
-	reiserfs_panic ("insert_item_separately: The item being inserted has the bad key %H", ih);
-    
-    if (is_stat_data_ih (ih)) {
-	put_sd_into_tree (ih, item);
-    } else if (is_direntry_ih (ih)) {
-	put_directory_item_into_tree (ih, item);
-    } else {
-	reiserfsck_file_write (ih, item, was_in_tree);
-    }
-}
-
-
-static void put_stat_data_items (struct buffer_head * bh) 
-{
-    int i;
-    struct item_head * ih;
-
-
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < B_NR_ITEMS (bh); i ++, ih ++) {
-
-        /* this check instead of saved_items */
-        if (!is_stat_data_ih (ih) || is_bad_item (bh, ih, B_I_PITEM (bh, ih))) {
-	    continue;
-        }
-	insert_item_separately (ih, B_I_PITEM (bh, ih), 0/*was in tree*/);
-    }
-}
-
-static void put_not_stat_data_items (struct buffer_head * bh)
-{
-    int i;
-    struct item_head * ih;
-
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < B_NR_ITEMS (bh); i ++, ih ++) {
-
-        if (is_stat_data_ih (ih) || is_bad_item (bh, ih, B_I_PITEM (bh, ih))) {
-	    continue;
-	}
-	insert_item_separately (ih, B_I_PITEM (bh, ih), 0/*was in tree*/);
-    }
-}
-
-
-static void before_pass_2 (reiserfs_filsys_t * fs)
-{
-    /* anything specific for pass 2 ? */
-}
-
-
-static void save_pass_2_result (reiserfs_filsys_t * fs)
-{
-    FILE * file;
-    int retval;
-
-    file = open_file("temp_fsck_file.deleteme", "w+");
-    if (!file)
-	return;
-    
-    /* to be able to restart from semantic we do not need to save
-       anything here, but two magic values */
-    reiserfs_begin_stage_info_save(file, TREE_IS_BUILT);
-    reiserfs_end_stage_info_save (file);
-    close_file (file);
-    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
-    if (retval != 0)
-	fsck_progress ("%s: Could not rename the temporary file temp_fsck_file.deleteme to %s",
-	    __FUNCTION__, state_dump_file (fs));
-}
-
-
-/* we have nothing to load from a state file, but we have to fetch
-   on-disk bitmap, copy it to allocable bitmap, and fetch objectid
-   map */
-void load_pass_2_result (reiserfs_filsys_t * fs)
-{
-    fsck_new_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
-    
-    fsck_allocable_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
-
-    fs->block_allocator = reiserfsck_reiserfs_new_blocknrs;
-    fs->block_deallocator = reiserfsck_reiserfs_free_block;
-
-    /* we need objectid map on semantic pass to be able to relocate files */
-    proper_id_map (fs) = id_map_init();
-    /* Not implemented yet.
-    fetch_objectid_map (proper_id_map (fs), fs);    
-    */
-}
-
-    
-/* uninsertable blocks are marked by 0s in uninsertable_leaf_bitmap
-   during the pass 1. They must be not in the tree */
-static void do_pass_2 (reiserfs_filsys_t * fs) {
-
-    struct buffer_head * bh;
-    unsigned long j;
-    int i, what_node;
-    unsigned long done = 0, total;
-
-
-    total = reiserfs_bitmap_zeros(fsck_uninsertables(fs)) * 2;
-    if (!total)
-	return;
-
-    fsck_progress ("\nPass 2:\n");
-
-    for (i = 0; i < 2; i++) {
-        j = 0;
-        while ((j < fsck_uninsertables(fs)->bm_bit_size) && 
-	       reiserfs_bitmap_find_zero_bit(fsck_uninsertables(fs), &j) == 0) 
-	{
-	    bh = bread (fs->fs_dev, j, fs->fs_blocksize);
-	    if (bh == 0) {
-	        fsck_log ("pass_2: Reading of the block (%lu) failed on the device 0x%x\n",
-		      j, fs->fs_dev);
-                goto cont;
-            }
-	
-            if (is_block_used (bh->b_blocknr) && !(block_of_journal (fs, bh->b_blocknr) &&
-					       fsck_data(fs)->rebuild.use_journal_area)) {
-		fsck_log("%s: The block (%lu) is in the tree already. Should not happen.\n", 
-		    __FUNCTION__, bh->b_blocknr);
-		goto cont;
-            }
-            /* this must be leaf */
-            what_node = who_is_this (bh->b_data, bh->b_size);
-	    if (what_node != THE_LEAF) { // || B_IS_KEYS_LEVEL(bh)) {
-	        fsck_log ("%s: The block (%b), marked as a leaf on the first two passes, "
-			  "is not a leaf! Will be skipped.\n", __FUNCTION__, bh);
-	        goto cont;
-	    }
-/*	
-	    fsck_log ("block %lu is being inserted\n", bh->b_blocknr);
-	    check_buffers_mem(fsck_log_file (fs));
-	    fflush(fsck_log_file (fs));
-*/	
-	    if (i) {
-                /* insert all not SD items */
-                put_not_stat_data_items (bh);
-                pass_2_stat (fs)->leaves ++;
-                make_allocable (j);
-            } else
-                /* insert SD items only */
-                put_stat_data_items (bh);
-
-            print_how_far (fsck_progress_file (fs), &done, total, 1, fsck_quiet (fs));
-        cont:
-	    brelse (bh);
-	    j ++;
-        }
-    }
-
-    fsck_progress ("\n");
-}
-
-
-static void after_pass_2 (reiserfs_filsys_t * fs)
-{
-    time_t t;
-
-    /* we can now flush new_bitmap on disk as tree is built and 
-       contains all data, which were found on dik at start in 
-       used bitmaps */
-    reiserfs_bitmap_copy (fs->fs_bitmap2, fsck_new_bitmap (fs));
-    
-    /* we should copy new_bitmap to allocable bitmap, becuase evth what is used 
-       for now (marked as used in new_bitmap) should not be allocablel;
-       and what is not in tree for now should be allocable.
-       these bitmaps differ because on pass2 we skip those blocks, whose SD's 
-       are not in the tree, and therefore indirect items of such bad leaves points 
-       to not used and not allocable blocks.       
-     */
-
-
-    /* DEBUG only */
-/*    if (reiserfs_bitmap_compare (fsck_allocable_bitmap (fs), fsck_new_bitmap(fs))) {
-        fsck_log ("Allocable bitmap differs from the new bitmap after pass2\n");
-	reiserfs_bitmap_copy (fsck_allocable_bitmap(fs), fsck_new_bitmap (fs));
-    }
-*/
-
-    /* update super block: objectid map, fsck state */
-    set_sb_fs_state (fs->fs_ondisk_sb, TREE_IS_BUILT);
-    mark_buffer_dirty (fs->fs_super_bh);
-  
-    /* write all dirty blocks */
-    fsck_progress ("Flushing..");
-    id_map_flush(proper_id_map (fs), fs);
-    fs->fs_dirt = 1;
-    reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);
-    reiserfs_flush (fs);
-    fsck_progress ("finished\n");
-    
-    /* fixme: should be optional */
-/*    fsck_progress ("Tree is built. Checking it - ");
-    reiserfsck_check_pass1 ();
-    fsck_progress ("finished\n");*/
-
-    stage_report (2, fs);
-
-    /* free what we do not need anymore */
-    reiserfs_delete_bitmap (fsck_uninsertables (fs));
-
-    if (!fsck_run_one_step (fs)) {
-	if (fsck_user_confirmed (fs, "Continue? (Yes):", "Yes\n", 1))
-	    /* reiserfsck continues */
-	    return;
-    } else
-	save_pass_2_result (fs);
-
-    
-    id_map_free(proper_id_map (fs));
-    proper_id_map (fs) = 0;
-    
-    reiserfs_delete_bitmap (fsck_new_bitmap (fs));
-    reiserfs_delete_bitmap (fsck_allocable_bitmap (fs));
-    
-    time (&t);
-    fsck_progress ("###########\n"
-		   "reiserfsck finished pass 2 at %s"
-		   "###########\n", ctime (&t));
-    fs->fs_dirt = 1;
-    reiserfs_close (fs);
-    exit(0);
-}
-
-
-
-void pass_2 (reiserfs_filsys_t * fs)
-{
-    if (fsck_log_file (fs) != stderr)
-	fsck_log ("####### Pass 2 #######\n");
-    
-    before_pass_2 (fs);
-    
-    /* take blocks which were not inserted into tree yet and put each
-	item separately */
-    do_pass_2 (fs);
-    
-    after_pass_2 (fs);
-
-    if (get_sb_root_block (fs->fs_ondisk_sb) == ~(__u32)0 || 
-	get_sb_root_block (fs->fs_ondisk_sb) == 0)
-	die ( "\nNo reiserfs metadata found.  If you are sure that you had the reiserfs\n"
-		"on this partition,  then the start  of the partition  might be changed\n"
-		"or all data were wiped out. The start of the partition may get changed\n"
-		"by a partitioner  if you have used one.  Then you probably rebuilt the\n"
-		"superblock as there was no one.  Zero the block at 64K offset from the\n"
-		"start of the partition (a new super block you have just built) and try\n"
-	        "to move the start of the partition a few cylinders aside  and check if\n" 
-		"debugreiserfs /dev/xxx detects a reiserfs super block. If it does this\n"
-	        "is likely to be the right super block version.                        \n"
-		"If this makes you nervous, try  www.namesys.com/support.html,  and for\n"
-		"$25 the author of fsck,  or a colleague  if he is out,  will  step you\n"
-		"through it all.\n");
-}
diff --git a/fsck/pass4.c b/fsck/pass4.c
deleted file mode 100644
index 3ecfe83..0000000
--- a/fsck/pass4.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-void pass_4_check_unaccessed_items (void)
-{
-    struct key key;
-    struct path path;
-    int i;
-    struct buffer_head * bh;
-    struct item_head * ih;
-    unsigned long items;
-    struct key * rdkey;
-
-    path.path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-    key = root_dir_key;
-    
-    fsck_progress ("Pass 4 - ");
-    items = 0;
-
-    while (reiserfs_search_by_key_4 (fs, &key, &path) == ITEM_FOUND) {
-	bh = PATH_PLAST_BUFFER (&path);
-
-	/* print ~ how many leaves were scanned and how fast it was */
-	if (!fsck_quiet (fs))
-	    print_how_fast (items++, 0, 50, 0);
-
-	for (i = get_item_pos (&path), ih = get_ih (&path); i < B_NR_ITEMS (bh); i ++, ih ++) {
-	    if (!is_item_reachable (ih)) {
-		PATH_LAST_POSITION (&path) = i;
-		rdkey = reiserfs_next_key(&path);
-		if (rdkey)
-		    key = *rdkey;
-		else
-		    memset (&key, 0xff, KEY_SIZE);	
-		
-		pass_4_stat (fs)->deleted_items ++;
-	
-		reiserfsck_delete_item (&path, 0);
-
-		goto cont;
-	    }
-	
-	    if (get_ih_flags(ih) != 0) {
-		clean_ih_flags(ih);
-		mark_buffer_dirty(bh);
-	    }
-	    
-	}
-	PATH_LAST_POSITION(&path) = i - 1;
-	rdkey = reiserfs_next_key (&path);
-	if (rdkey)
-	    key = *rdkey;
-	else
-	    memset (&key, 0xff, KEY_SIZE);	
-	
-	pathrelse (&path);
-
-    cont:
-	/* to make gcc 3.2 do not sware here */;
-    }
-
-    pathrelse (&path);
-
-    fsck_progress ("finished\n");
-    stage_report (4, fs);
-
-    /* after pass 4 */
-
-    /* put bitmap on place */
-    reiserfs_bitmap_copy (fs->fs_bitmap2, fsck_new_bitmap (fs));
-
-    /* update super block */
-    set_sb_free_blocks (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (fsck_new_bitmap (fs)));
-    mark_buffer_dirty (fs->fs_super_bh);
-
-    /* write all dirty blocks */
-    fsck_progress ("Flushing..");
-    fs->fs_dirt = 1;
-    id_map_flush(proper_id_map (fs), fs);
-    reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);
-    reiserfs_flush (fs);
-    fsck_progress ("finished\n");
-
-    
-    return;
-}
diff --git a/fsck/semantic_check.c b/fsck/semantic_check.c
deleted file mode 100644
index 73881ce..0000000
--- a/fsck/semantic_check.c
+++ /dev/null
@@ -1,816 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-static struct key *trunc_links = NULL;
-static __u32 links_num = 0;
-
-int wrong_mode (struct key * key, __u16 * mode, __u64 real_size, int symlink);
-int wrong_st_blocks(struct key * key, __u32 * blocks, __u32 sd_blocks, __u16 mode, 
-		    int new_format);
-int wrong_st_size (struct key * key, unsigned long long max_file_size, int blocksize,
-		   __u64 * size, __u64 sd_size, int type);
-int wrong_first_direct_byte (struct key * key, int blocksize, __u32 * first_direct_byte,
-			     __u32 sd_first_direct_byte, __u32 size);
-void get_object_key (struct reiserfs_de_head * deh, struct key * key, 
-		     struct key * entry_key, struct item_head * ih);
-void print_name (char * name, int len);
-void erase_name (int len);
-
-
-struct path_key
-{
-    struct short_key
-    {
-        __u32 k_dir_id;
-        __u32 k_objectid;
-    } key;
-    struct path_key * next, * prev;
-};
-
-struct path_key * head_key = NULL;
-struct path_key * tail_key = NULL;
-
-static int check_path_key(struct key * key)
-{
-    struct path_key * cur = head_key;
-
-    while(cur != NULL)
-    {
-        if (!comp_short_keys(&cur->key, key)) {
-            fsck_log("\nsemantic check: The directory %k has 2 names.", key);
-            return LOOP_FOUND;
-        }
-        cur = cur->next;
-    }
-    return 0;
-}
-
-static int add_path_key(struct key * key)
-{
-    if (check_path_key(key))
-    	return LOOP_FOUND;
-
-    if (tail_key == NULL)
-    {
-        tail_key = getmem(sizeof(struct path_key));
-        head_key = tail_key;
-        tail_key->prev = NULL;
-    }else{
-        tail_key->next = getmem(sizeof(struct path_key));
-        tail_key->next->prev = tail_key;
-        tail_key = tail_key->next;
-    }
-    copy_short_key (&tail_key->key, key);
-    tail_key->next = NULL;
-
-    return 0;
-}
-
-void del_path_key()
-{
-    if (tail_key == NULL)
-        die("Wrong path_key structure");
-
-    if (tail_key->prev == NULL)
-    {
-        freemem(tail_key);
-        tail_key = head_key = NULL;
-    }else{
-        tail_key = tail_key->prev;
-        freemem(tail_key->next);
-        tail_key->next = NULL;
-    }
-}
-
-/* path is path to stat data. If file will be relocated - new_ih will contain
-   a key file was relocated with */
-static int check_check_regular_file (struct path * path, void * sd,
-                                     struct item_head * new_ih)
-{
-    int is_new_file;
-//    struct key key, sd_key;
-    __u16 mode;
-    __u32 nlink;
-    __u64 real_size, sd_size;
-    __u32 blocks, sd_blocks;	/* proper values and value in stat data */
-    __u32 first_direct_byte, sd_first_direct_byte;
-
-    struct item_head * ih, sd_ih;
-    int fix_sd;
-    int symlnk = 0;
-    int retval = OK;
-    __u32 tmp_position;
-
-
-    ih = get_ih (path);
-
-    if (new_ih) {
-	/* this objectid is used already */
-	*new_ih = *ih;
-	pathrelse (path);
-	rewrite_file (new_ih, 1, 1);
-	linked_already(&new_ih->ih_key);
-	one_less_corruption (fs, FIXABLE);
-	sem_pass_stat (fs)->oid_sharing_files_relocated ++;
-	retval = RELOCATED;
-	if (reiserfs_search_by_key_4 (fs, &(new_ih->ih_key), path) == ITEM_NOT_FOUND)
-	    reiserfs_panic ("check_check_regular_file: Could not find a StatData of "
-		"the relocated file %K", &new_ih->ih_key);
-	/* stat data is marked unreachable again due to relocation, fix that */
-	ih = get_ih (path);
-	sd = get_item (path);
-    }
-    
-
-    if (get_ih_item_len (ih) == SD_SIZE)
-	is_new_file = 1;
-    else
-	is_new_file = 0;
-
-
-    get_sd_nlink (ih, sd, &nlink);
-    get_sd_mode (ih, sd, &mode);
-    get_sd_size (ih, sd, &sd_size);
-    get_sd_blocks (ih, sd, &sd_blocks);
-
-/*	
-    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-    	// check and set nlink first 
-    	nlink ++;
-    	set_sd_nlink (ih, sd, &nlink);
-    	mark_buffer_dirty (bh);
-
-    	if (nlink > 1)
-	    return OK;
-    }
-*/
-
-    if (!is_new_file)
-	get_sd_first_direct_byte (ih, sd, &sd_first_direct_byte);
-
-    if (S_ISLNK (mode)) 	
-	symlnk = 1;
-    
-    sd_ih = *ih;
-//    sd_key = sd_ih.ih_key;
-    pathrelse (path);
-
-    if (are_file_items_correct (&sd_ih, sd, &real_size, &blocks, 0/* do not mark reachable */,
-	&symlnk) != 1) 
-    {
-	one_more_corruption (fs, FATAL);
-	fsck_log ("check_regular_file: The file %K with the corrupted structure found\n", 
-	    &sd_ih.ih_key);
-    } else {
-	fix_sd = 0;
-    
-	fix_sd += wrong_mode (&sd_ih.ih_key, &mode, real_size, symlnk);
-	if (!is_new_file)
-	    fix_sd += wrong_first_direct_byte (&sd_ih.ih_key, fs->fs_blocksize,
-		&first_direct_byte, sd_first_direct_byte, real_size);
-	
-	if (reiserfs_bin_search(&sd_ih.ih_key, trunc_links, links_num, sizeof(sd_ih.ih_key), 
-	    &tmp_position, comp_short_keys) != POSITION_FOUND) 
-	{
-	    fix_sd += wrong_st_size (&sd_ih.ih_key, is_new_file ? MAX_FILE_SIZE_V2 : 
-		MAX_FILE_SIZE_V1, fs->fs_blocksize, &real_size, sd_size, 
-		symlnk ? TYPE_SYMLINK : 0);
-	} else {
-	    real_size = sd_size;
-	}
-	
-	fix_sd += wrong_st_blocks (&sd_ih.ih_key, &blocks, sd_blocks, mode, is_new_file);
-
-	if (fix_sd) {
-	    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-    		struct buffer_head * bh;
-  	        /* find stat data and correct it */
-  	        set_type_and_offset (KEY_FORMAT_1, &sd_ih.ih_key, SD_OFFSET, TYPE_STAT_DATA);
-	        if (reiserfs_search_by_key_4 (fs, &sd_ih.ih_key, path) != ITEM_FOUND) {
-		    fsck_log ("check_regular_file: A StatData of the file %K cannot be "
-			"found\n", &sd_ih.ih_key);
-                    one_more_corruption (fs, FATAL);
-                    return STAT_DATA_NOT_FOUND;
-	        }
-	    
-	        bh = get_bh (path);
-	        ih = get_ih (path);
-	        sd = get_item (path);
-	        set_sd_size (ih, sd, &real_size);
-	        set_sd_blocks (ih, sd, &blocks);
-	        set_sd_mode (ih, sd, &mode);
-	        if (!is_new_file)
-		    set_sd_first_direct_byte (ih, sd, &first_direct_byte);
-		mark_buffer_dirty (bh);
-	    } else {
-		fsck_check_stat (fs)->fixable_corruptions += fix_sd;
-	    }
-	}
-    }    
-    return retval;
-}
-
-/* returns buffer, containing found directory item.*/
-static char * get_next_directory_item (
-	struct key * key, /* on return this will contain key of next item in the tree */
-	struct key * parent, struct item_head * ih, __u32 * pos_in_item, int dir_format)
-{
-    INITIALIZE_PATH (path);
-    char * dir_item;
-    struct key * rdkey;
-    struct buffer_head * bh;
-    struct reiserfs_de_head * deh;
-    int i;
-    int retval;
-
-
-start_again:
-
-    retval = reiserfs_search_by_entry_key (fs, key, &path);
-
-    if (retval != POSITION_FOUND && get_offset (key) != DOT_OFFSET)
-	reiserfs_panic ("get_next_directory_item: The current directory %k cannot be found", 
-	    key);
-
-    /* leaf containing directory item */
-    bh = PATH_PLAST_BUFFER (&path);
-    *pos_in_item = path.pos_in_item;
-    *ih = *get_ih (&path);
-    deh = B_I_DEH (bh, ih);
-
-    /* position was not found for '.' or there is no '..' */
-    if (retval != POSITION_FOUND || ((get_offset (key) == DOT_OFFSET) &&
-	(get_ih_entry_count (ih) < 2 || name_in_entry_length (ih, deh + 1, 1) != 2 ||
-	 strncmp (name_in_entry (deh + 1, 1), "..", 2)))) {
-
-	fsck_log ("get_next_directory_item: The %s %k cannot be found in %k", 
-	    (retval == POSITION_NOT_FOUND) ? "entry" : "directory", key, &ih->ih_key);
-	
-	if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-	    /* add "." and ".." exist */
-	    pathrelse (&path);
-	    reiserfs_add_entry (fs, key, ".",  name_length (".", dir_format), key, 0);
-	    reiserfs_add_entry (fs, key, "..", name_length ("..", dir_format), parent, 0);
-	    fsck_log (" - entry was added\n");
-	    goto start_again;
-	} else {
-	    one_more_corruption (fs, FIXABLE);
-	    fsck_log ("\n");
-	    if (retval == DIRECTORY_NOT_FOUND)
-	        return 0;
-	}
-    }
-
-    /* make sure, that ".." exists as well */
-/*
-    if (get_offset (key) == DOT_OFFSET) {
-	if (get_ih_entry_count (ih) < 2 ||
-	    name_in_entry_length (ih, deh + 1, 1) != 2 ||
-	    strncmp (name_in_entry (deh + 1, 1), "..", 2))
-	{
-	    fsck_log ("get_next_directory_item: \"..\" not found in %H\n", ih);
-	    pathrelse (&path);
-	    return 0;
-	}
-    }
-*/
-    /* mark hidden entries as visible, set "." and ".." correctly */
-    deh += *pos_in_item;
-    for (i = *pos_in_item; i < get_ih_entry_count (ih); i ++, deh ++) {
-/*	int namelen;
-	char * name;
-
-	name = name_in_entry (deh, i);
-	namelen = name_in_entry_length (ih, deh, i);
-	if (de_hidden (deh)) // handled in check_tree
-	    reiserfs_panic ("get_next_directory_item: item %k: hidden entry %d \'%.*s\'\n",
-			    key, i, namelen, name);
-*/
-
-	if (get_deh_offset (deh) == DOT_OFFSET) {
-	    if (not_of_one_file (&(deh->deh2_dir_id), key)) {
-		/* "." must point to the directory it is in */
-		
-		//deh->deh_objectid != REISERFS_ROOT_PARENT_OBJECTID)/*????*/ {
-		fsck_log ("get_next_directory_item: The entry \".\" of the directory %K "
-		    "pointes to %K, instead of %K", key, (struct key *)(&(deh->deh2_dir_id)), 
-		    key);
-		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-		    set_deh_dirid (deh, get_key_dirid (key));
-		    set_deh_objectid (deh, get_key_objectid (key));
-		    mark_buffer_dirty (bh);
-		    fsck_log (" - corrected\n");
-		} else {
-		    one_more_corruption (fs, FIXABLE);
-		    fsck_log ("\n");
-		}
-	    }
-	}
-
-	if (get_deh_offset (deh) == DOT_DOT_OFFSET) {
-	    /* set ".." so that it points to the correct parent directory */
-	    if (comp_short_keys (&(deh->deh2_dir_id), parent)) {
-		fsck_log ("get_next_directory_item: The entry \"..\" of the directory %K "
-		    "pointes to %K, instead of %K", key, (struct key *)(&(deh->deh2_dir_id)));
-		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-		    set_deh_dirid (deh, get_key_dirid (parent));
-		    set_deh_objectid (deh, get_key_objectid (parent));
-		    mark_buffer_dirty (bh);
-		    fsck_log (" - corrected\n");
-		} else {
-		    one_more_corruption (fs, FIXABLE);
-		    fsck_log ("\n");
-		}
-	    }
-	}
-    }
-
-    /* copy directory item to the temporary buffer */
-    dir_item = getmem (get_ih_item_len (ih));
-    memcpy (dir_item, B_I_PITEM (bh, ih), get_ih_item_len (ih));
-
-
-    /* next item key */
-    if (PATH_LAST_POSITION (&path) == (B_NR_ITEMS (bh) - 1) &&
-	(rdkey = uget_rkey (&path)))
-	copy_key (key, rdkey);
-    else {
-	set_key_dirid (key, 0);
-	set_key_objectid (key, 0);
-    }
-
-    if (fsck_mode (fs) == FSCK_REBUILD)
-        mark_item_reachable (get_ih (&path), bh);
-    pathrelse (&path);
-
-    return dir_item;
-}
-
-/* semantic pass of --check */
-static int check_semantic_pass (struct key * key, struct key * parent, int dot_dot, 
-    struct item_head * new_ih)
-{
-    struct path path;
-    void * sd;
-    __u32 nlink;
-    int is_new_dir;
-    struct buffer_head * bh;
-    struct item_head * ih;
-    int retval;
-    char * dir_item;
-    __u32 pos_in_item;
-    struct item_head tmp_ih;
-    struct key next_item_key, entry_key, object_key;
-    __u64 dir_size = 0;
-    __u32 blocks;
-    __u64 sd_size;
-    __u32 sd_blocks;
-    int fix_sd;
-    /*int relocate;*/
-    int dir_format = 0;
-    __u16 mode;
-    	
-    retval = OK;
-
- /* start_again: when directory was relocated */
-
-    if (!KEY_IS_STAT_DATA_KEY (key)) {
-	fsck_log ("check_semantic_pass: The key %k must be key of a StatData\n", key);
-	one_more_corruption (fs, FATAL);
-        return STAT_DATA_NOT_FOUND;
-    }
-
-    /* look for stat data of an object */
-    if (reiserfs_search_by_key_4 (fs, key, &path) == ITEM_NOT_FOUND) {
-	pathrelse (&path);
-	return STAT_DATA_NOT_FOUND;
-    }
-
-    /* stat data has been found */
-    ih = get_ih (&path);
-    sd = get_item(&path);
-
-    get_sd_nlink (ih, sd, &nlink);
-
-    /* It seems quite difficult to relocate objects on fix-fixable - 
-     * rewrite_file calls reiserfs_file_write which can convert tails 
-     * to unfm, plus unreachable, was_tail flags, etc. */
-#if 0
-    if ((/* relocate = */ should_be_relocated(&ih->ih_key))) {
-	/*
-	if (fsck_mode(fs) == FSCK_CHECK)
-	    relocate = 0;
-	*/
-	one_more_corruption(fs, FATAL);
-    }
-#endif
-
-    if (fix_obviously_wrong_sd_mode (&path)) {
-        one_more_corruption (fs, FIXABLE);
-	pathrelse (&path);
-        return OK;
-    }
-    
-    if (nlink == 0) {
-	fsck_log ("%s: block %lu: The StatData %k has bad nlink number (%u)\n",
-            __FUNCTION__, get_bh(&path)->b_blocknr, &ih->ih_key, nlink);
-	one_more_corruption (fs, FATAL); 
-    }
-    
-    if (not_a_directory (sd)) {
-	fsck_check_stat (fs)->files ++;
-	
-	retval = check_check_regular_file (&path, sd, /* relocate ? new_ih : */ 0);
-	pathrelse (&path);
-	return retval;
-    }
-
-/*
-    if (relocate) {
-	if (!new_ih)
-	    reiserfs_panic ("check_semantic_pass: Memory is not prepared for relocation of "
-		"%K", &ih->ih_key);
-	*new_ih = *ih;
-	pathrelse (&path);
-	sem_pass_stat (fs)->oid_sharing_dirs_relocated ++;
-	relocate_dir (new_ih, 1);
-	linked_already(&new_ih->ih_key);
-	one_less_corruption (fs, FIXABLE);
-	*key = new_ih->ih_key;
-	retval = RELOCATED;
-	goto start_again;
-    }
-*/
-
-/* 
-    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-    	// it looks like stat data of a directory found 
-    	if (nlink) {
-	    // we saw this directory already 
-	    if (!dot_dot) {
-	    	// this name is not ".."  - and hard links are not allowed on directories 
-	    	pathrelse (&path);
-	    	return STAT_DATA_NOT_FOUND;
-	    } else {
-	    	// ".." found 
-	    	nlink ++;
-	    	set_sd_nlink (ih, sd, &nlink);
-	    	mark_buffer_dirty (get_bh (&path));
-	    	pathrelse (&path);
-	    	return OK;
-	    }
-    	} // do not run it for dot_dot on check at all
-    	
-     	nlink = 2;
-    	if (get_key_objectid (key) == REISERFS_ROOT_OBJECTID)
-	    nlink ++;
-    	set_sd_nlink (ih, sd, &nlink);
-    	mark_buffer_dirty (get_bh (&path));    
-    }
-*/
-
-    /* directory stat data found */
-    if (get_ih_item_len (ih) == SD_SIZE)
-	is_new_dir = 1;
-    else
-	is_new_dir = 0;
-
-    /* save stat data's size and st_blocks */
-    get_sd_size (ih, sd, &sd_size);
-    get_sd_blocks (ih, sd, &sd_blocks);
-    get_sd_mode (ih, sd, &mode);
-
-    dir_format = (get_ih_item_len (get_ih (&path)) == SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
-
-    /* release path pointing to stat data */
-    pathrelse (&path);
-
-    fsck_check_stat (fs)->dirs ++;
-
-    set_key_dirid (&next_item_key, get_key_dirid (key));
-    set_key_objectid (&next_item_key, get_key_objectid (key));
-    set_key_offset_v1 (&next_item_key, DOT_OFFSET);
-    set_key_uniqueness (&next_item_key, DIRENTRY_UNIQUENESS);
-
-    dir_size = 0;
-    while ((dir_item = get_next_directory_item (&next_item_key, parent, &tmp_ih, 
-	&pos_in_item, dir_format)) != 0) 
-    {
-	/* dir_item is copy of the item in separately allocated memory,
-	   item_key is a key of next item in the tree */
-	int i;
-	char * name = 0;
-	int namelen, entry_len;
-	struct reiserfs_de_head * deh = (struct reiserfs_de_head *)dir_item + pos_in_item;
-	
-	
-	for (i = pos_in_item; i < get_ih_entry_count (&tmp_ih); i ++, deh ++) {
-	    struct item_head relocated_ih;
-	    int ret = OK;
-	    
-	    if (name) {
-		free (name);
-		name = 0;
-	    }
-	
-	    namelen = name_in_entry_length (&tmp_ih, deh, i);
-	    asprintf (&name, "%.*s", namelen, name_in_entry (deh, i));	
-	    entry_len = entry_length (&tmp_ih, deh, i);
-	
-	    get_object_key (deh, &object_key, &entry_key, &tmp_ih);
-
-	    if ((dir_format == KEY_FORMAT_2) && (entry_len % 8 != 0)) {
-		/* not alighed directory of new format - delete it */
-		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-		    fsck_log ("Entry %K (\"%.*s\") in the directory %K is not formated "
-			"properly - deleted\n",	(struct key *)&(deh->deh2_dir_id), 
-			namelen, name, &tmp_ih.ih_key);
-		    reiserfs_remove_entry (fs, &entry_key);
-		    entry_len = name_length (name, dir_format);
-		    reiserfs_add_entry (fs, key, name, entry_len, 
-			(struct key *)&(deh->deh2_dir_id), 0);
-		} else {
-		    fsck_log ("Entry %K (\"%.*s\") in the directory %K is not formated "
-			"properly.\n", (struct key *)&(deh->deh2_dir_id), namelen, name, 
-			&tmp_ih.ih_key);
-		    one_more_corruption (fs, FIXABLE);
-		}
-	    }
-	
-	
-	    print_name (name, namelen);
-	    
-	    if (!is_properly_hashed (fs, name, namelen, get_deh_offset (deh))) {
-		one_more_corruption (fs, FATAL);
-		fsck_log ("check_semantic_pass: Hash mismatch detected for (%.*s) in "
-		    "directory %K\n", namelen, name, &tmp_ih.ih_key);
-	    }
-	
-	    if (is_dot (name, namelen) || (is_dot_dot (name, namelen))) {
-		/* do not go through "." and ".." */
-		ret = OK;
-	    } else {
-		if ((ret = add_path_key (&object_key)) == 0) {
-		    ret = check_semantic_pass (&object_key, key, 
-			is_dot_dot(name, namelen), &relocated_ih);
-		    del_path_key ();
-		}
-	    }
-	    
-	    erase_name (namelen);
-	    
-	    /* check what check_semantic_tree returned */
-	    switch (ret) {
-	    case OK:
-		dir_size += DEH_SIZE + entry_len;
-		break;
-		
-	    case STAT_DATA_NOT_FOUND:
-		fsck_log ("check_semantic_pass: Name \"%.*s\" in directory %K points to "
-		    "nowhere\n", namelen, name, &tmp_ih.ih_key);
-	    case LOOP_FOUND:
-		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-		    reiserfs_remove_entry (fs, &entry_key);
-		    fsck_log (" - removed");
-		} else {
-		    one_more_corruption (fs, FIXABLE);
-		}
-		fsck_log ("\n");
-		break;
-		    
-	    case DIRECTORY_HAS_NO_ITEMS:
-		fsck_log ("check_semantic_pass: Name \"%.*s\" in directory %K points a "
-		    "directory without body\n", namelen, name, &tmp_ih.ih_key);
-		
-		/* fixme: stat data should be deleted as well */
-		/*
-		  if (fsck_fix_fixable (fs)) {
-		  reiserfs_remove_entry (fs, &entry_key);
-		  fsck_data(fs)->deleted_entries ++;
-		  fsck_log (" - removed");
-		  }
-		  fsck_log ("\n");*/
-		break;
-		
-	    case RELOCATED:
-		/* file was relocated, update key in corresponding directory entry */
-		if (reiserfs_search_by_entry_key (fs, &entry_key, &path) != POSITION_FOUND) {
-		    fsck_log("Cannot find a name of the relocated file %K in the directory "
-			"%K\n", &entry_key, &tmp_ih.ih_key);
-		} else {
-		    /* update key dir entry points to */
-		    struct reiserfs_de_head * tmp_deh;
-		    
-		    tmp_deh = B_I_DEH (get_bh (&path), get_ih (&path)) + path.pos_in_item;
-		    fsck_log ("The directory %K pointing to %K (\"%.*s\") updated to point "
-			"to ",	&tmp_ih.ih_key, &tmp_deh->deh2_dir_id, namelen, name);
-		    set_deh_dirid (tmp_deh, get_key_dirid (&relocated_ih.ih_key));
-		    set_deh_objectid (tmp_deh, get_key_objectid (&relocated_ih.ih_key));
-
-		    fsck_log ("%K (\"%.*s\")\n",  &tmp_deh->deh2_dir_id, namelen, name);
-		    mark_buffer_dirty (get_bh (&path));
-		}
-		dir_size += DEH_SIZE + entry_len;
-		pathrelse (&path);
-		break;
-	    }
-	} /* for */
-	
-	freemem (dir_item);
-	free (name);
-	name = 0;
-
-	if (not_of_one_file (&next_item_key, key))
-	    /* next key is not of this directory */
-	    break;
-	
-    } /* while (dir_item) */
-    
-    
-    if (dir_size == 0)
-	/* FIXME: is it possible? */
-	return DIRECTORY_HAS_NO_ITEMS;
-    
-    /* calc correct value of sd_blocks field of stat data */
-    blocks = dir_size2st_blocks (dir_size);
-    
-    fix_sd = 0;
-    fix_sd += wrong_st_blocks (key, &blocks, sd_blocks, mode, is_new_dir);
-    fix_sd += wrong_st_size (key, is_new_dir ? MAX_FILE_SIZE_V2 : MAX_FILE_SIZE_V1,
-			     fs->fs_blocksize, &dir_size, sd_size, TYPE_DIRENTRY);
-
-    if (fix_sd) {
-	if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
-	    /* we have to fix either sd_size or sd_blocks, so look for stat data again */
-	    if (reiserfs_search_by_key_4 (fs, key, &path) != ITEM_FOUND) {
-		fsck_log ("check_semantic_tree: The StatData of the file %K was not found\n", 
-		    key);
-		one_more_corruption(fs, FATAL);
-                return STAT_DATA_NOT_FOUND;
-	    }
-	
-	    bh = get_bh (&path);
-	    ih = get_ih (&path);
-	    sd = get_item (&path);
-	
-	    set_sd_size (ih, sd, &dir_size);
-	    set_sd_blocks (ih, sd, &blocks);
-	    mark_buffer_dirty (bh);
-	    pathrelse (&path);
-	} else {
-	    fsck_check_stat (fs)->fixable_corruptions += fix_sd;
-	}
-    }
-    
-    return retval;
-}
-
-int check_safe_links ()
-{
-    struct path safe_link_path, path;
-    struct key safe_link_key = {-1, 0, {{0, 0}}};
-    struct key key = {0, 0, {{0, 0}}};
-    struct key * rkey;
-    struct item_head * tmp_ih;
-
-    while (1) {
-        if (get_key_dirid (&safe_link_key) == 0)
-            break;
-
-	reiserfs_search_by_key_4 (fs, &safe_link_key, &safe_link_path);
-	
-	if (get_blkh_nr_items ( B_BLK_HEAD (get_bh(&safe_link_path))) <= 
-	    PATH_LAST_POSITION (&safe_link_path)) 
-	{
-	    pathrelse (&safe_link_path);
-            break;
-	}	
-	
-	tmp_ih = get_ih(&safe_link_path);
-	
-        if (get_key_dirid(&tmp_ih->ih_key) != (__u32)-1 ||
-	    get_key_objectid(&tmp_ih->ih_key) == (__u32)-1) {
-	    pathrelse (&safe_link_path);
-            break;
-	}
-
-        if (get_ih_item_len (tmp_ih) != 4)
-	    reiserfs_panic ("Safe Link %k cannot be of the size %d", 
-		&tmp_ih->ih_key, get_ih_item_len (tmp_ih));
-	
-	set_key_dirid(&key, d32_get((__u32 *)get_item(&safe_link_path), 0));
-	set_key_objectid(&key, get_key_objectid(&tmp_ih->ih_key));
-	if ((rkey = reiserfs_next_key(&safe_link_path)) == NULL)
-	    set_key_dirid (&safe_link_key, 0);
-	else
-	    safe_link_key = *rkey;
-	
-	if (reiserfs_search_by_key_4 (fs, &key, &path) == ITEM_NOT_FOUND) {
-	    /*sware on check, delete on fix-fixable*/
-	    if (fsck_mode(fs) == FSCK_CHECK) {
-		fsck_log ("Invalid safe link %k: cannot find the pointed object (%K)\n", 
-		    &tmp_ih->ih_key, &key);
-		one_more_corruption (fs, FIXABLE);
-	    } else if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
-		fsck_log ("Invalid safe link %k: cannot find the pointed object (%K) - "
-		    "safe link was deleted\n", &tmp_ih->ih_key, &key);
-		d32_put((__u32 *)get_item(&safe_link_path), 0, 0);
-		pathrelse (&path);
-		reiserfsck_delete_item (&safe_link_path, 0);		
-		continue;
-	    }
-	} else if (get_offset(&tmp_ih->ih_key) == 0x1) {
-	    /* Truncate */
-	    if (!not_a_directory (get_item(&path))) {
-		/*truncate on directory should not happen*/
-		/*sware on check, delete on fix-fixable*/
-		if (fsck_mode(fs) == FSCK_CHECK) {
-		    fsck_log ("Invalid 'truncate' safe link %k, cannot happen for "
-			"directory (%K)\n", &tmp_ih->ih_key, &key);
-		    one_more_corruption (fs, FIXABLE);
-		} else if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
-		    fsck_log ("Invalid 'truncate' safe link %k, cannot happen for "
-			"a directory (%K) - safe link was deleted\n", &tmp_ih->ih_key, &key);
-		    d32_put((__u32 *)get_item(&safe_link_path), 0, 0);
-		    pathrelse (&path);
-		    reiserfsck_delete_item (&safe_link_path, 0);		
-		    continue;
-		}
-	    } else {
-		/* save 'safe truncate links' to avoid swaring on wrong sizes. */
-		__u32 position;
-		
-		if (reiserfs_bin_search (&key, trunc_links, links_num, sizeof(key), 
-		    &position, comp_short_keys) != POSITION_FOUND) 
-		{
-		    blocklist__insert_in_position(&key, (void *)&trunc_links, &links_num, 
-			sizeof(key), &position);
-		}		
-	    }
-	}
-	pathrelse (&path);
-	pathrelse (&safe_link_path);
-    }
-
-    return OK;
-}
-
-void release_safe_links () {
-    freemem(trunc_links);
-}
-
-/* called when --check is given */
-void semantic_check (void)
-{
-    if (fsck_data (fs)->check.bad_nodes) {
-        fsck_progress ("Bad nodes were found, Semantic pass skipped\n");
-        goto clean;
-    }
-
-    if (fsck_data (fs)->check.fatal_corruptions) {
-        fsck_progress ("Fatal corruptions were found, Semantic pass skipped\n");
-        goto clean;
-    }
- 
-    fsck_progress ("Checking Semantic tree:\n");
-
-    if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
-        /*create new_bitmap, and initialize new_bitmap & allocable bitmap*/
-        fsck_new_bitmap (fs) = reiserfs_create_bitmap(get_sb_block_count(fs->fs_ondisk_sb));
-        reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
-        fsck_allocable_bitmap (fs) = reiserfs_create_bitmap(get_sb_block_count
-	    (fs->fs_ondisk_sb));
-        reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
-	fs->block_allocator = reiserfsck_reiserfs_new_blocknrs;
-	fs->block_deallocator = reiserfsck_reiserfs_free_block;
-    }
-    
-    check_safe_links ();
-    
-    if (check_semantic_pass (&root_dir_key, &parent_root_dir_key, 0, 0) != OK) {
-        fsck_log ("check_semantic_tree: No root directory found");
-        one_more_corruption (fs, FATAL);
-    }
-
-    release_safe_links ();
-
-    if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
-        reiserfs_delete_bitmap (fs->fs_bitmap2);
-	reiserfs_bitmap_delta (fsck_new_bitmap (fs), fsck_deallocate_bitmap (fs));	
-        fs->fs_bitmap2 = fsck_new_bitmap (fs);
-        reiserfs_delete_bitmap (fsck_allocable_bitmap (fs));	
-        fsck_allocable_bitmap (fs) = NULL;
-        set_sb_free_blocks (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (fs->fs_bitmap2));
-        mark_buffer_dirty (fs->fs_super_bh);
-	add_badblock_list(fs, 1);
-    }
-    
-    fsck_progress ("finished\n");
-    
-clean:
-    if (fsck_deallocate_bitmap (fs))
-	reiserfs_delete_bitmap (fsck_deallocate_bitmap (fs));
-}
diff --git a/fsck/semantic_rebuild.c b/fsck/semantic_rebuild.c
deleted file mode 100644
index 551a2e6..0000000
--- a/fsck/semantic_rebuild.c
+++ /dev/null
@@ -1,1250 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-int screen_width;
-int screen_curr_pos;
-char *screen_savebuffer;
-int screen_savebuffer_len;
-
-#define MIN(a, b) (((a)>(b))?(b):(a))
-
-/* semantic pass progress */
-void print_name (char * name, int len)
-{
-    int i;
-
-    if (fsck_quiet (fs))
-	return;
-
-    if ( len + screen_curr_pos + 1 > screen_savebuffer_len) {
-	char *t;
-	
-	t = expandmem(screen_savebuffer, screen_savebuffer_len + 1, 
-	    len + screen_curr_pos - screen_savebuffer_len + 1);
-	if (!t) {
-	    fsck_progress("\nOut of memory\n");
-	    return; // ????
-	}
-	screen_savebuffer = t;
-	screen_savebuffer_len = len + screen_curr_pos + 1;
-    }
-    strcat(screen_savebuffer,"/");
-    strncat(screen_savebuffer,name,len);
-    i = screen_curr_pos;
-    screen_curr_pos += len+1;
-    for ( ; i<screen_curr_pos; i++)
-	if ( screen_savebuffer[i] < 32 )
-	    screen_savebuffer[i] = '?';
-    screen_savebuffer[screen_curr_pos]=0;
-
-    if ( screen_width < screen_curr_pos ) {
-	printf("\r... %.*s",screen_width - 4, 
-	    screen_savebuffer + ( screen_curr_pos - (screen_width - 4)));
-    } else
-	printf("/%.*s", len, screen_savebuffer + screen_curr_pos - len);
-
-    fflush (stdout);
-}
-
-
-void erase_name (int len)
-{
-    int i;
-
-    if (fsck_quiet (fs))
-	return;
-
-    if ( screen_curr_pos < screen_width ) {
-
-	screen_curr_pos-=len+1;
-	screen_savebuffer[screen_curr_pos]=0;
-
-	for (i = 0; i<=len; i++)
-	    printf("\b");
-	for (i = 0; i<=len+1; i++)
-	    printf(" ");
-	for (i = 0; i<=len+1; i++)
-	    printf("\b");
-    } else {
-	screen_curr_pos-=len+1;
-	if (screen_curr_pos < 0 )
-	    die("%s: Get out of buffer's data!\n", __FUNCTION__);
-
-	screen_savebuffer[screen_curr_pos]=0;
-	printf("\r");
-	if (screen_curr_pos >= screen_width ) {
-	    int t_preface=MIN(screen_curr_pos-screen_width,4);
-	    printf("%.*s%.*s", t_preface, "... ", screen_width-t_preface - 1, 
-		screen_savebuffer + ( screen_curr_pos - (screen_width - t_preface)) + 1);
-	} else {
-	    int space_used=printf("%s", screen_savebuffer);
-	    for ( i=space_used; i < screen_width; i++)
-		printf(" ");
-	    for ( i=space_used; i < screen_width; i++)
-		printf("\b");
-	}
-    }
-	    
-    fflush (stdout);
-}
-
-
-
-/* *size is "real" file size, sd_size - size from stat data */
-int wrong_st_size (struct key * key, unsigned long long max_file_size, 
-    int blocksize, __u64 * size, __u64 sd_size, int type)
-{
-    if (sd_size <= max_file_size) {
-	if (sd_size == *size)
-	    return 0;
-
-	if (type == TYPE_DIRENTRY) {
-	    /* directory size must match to the sum of length of its entries */
-	    fsck_log ("vpf-10650: The directory %K has the wrong size in the StatData "
-		"(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? 
-		", should be " : " - corrected to ", *size);
-	    return 1;
-	}
-	
-	if (sd_size > *size) {
-	    /* size in stat data can be bigger than size calculated by items */
-	    if (fsck_adjust_file_size (fs) || type == TYPE_SYMLINK) {
-		/* but it -o is given - fix that */
-		fsck_log ("vpf-10660: The file %K has too big size in the StatData "
-		    "(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? 
-		    ", should be " : " - corrected to ", *size);
-		sem_pass_stat (fs)->fixed_sizes ++;
-		return 1;
-	    }
-	    *size = sd_size;
-	    return 0;
-	}
-	
-	if (!(*size % blocksize)) {
-	    /* last item is indirect */
-	    if (((sd_size & ~(blocksize - 1)) == (*size - blocksize)) && 
-		sd_size % blocksize) 
-	    {
-		/* size in stat data is correct */
-		*size = sd_size;
-		return 0;
-	    }
-	} else {
-	    /* last item is a direct one */
-	    if (!(*size % 8)) {
-		if (((sd_size & ~7) == (*size - 8)) && sd_size % 8) {
-		    /* size in stat data is correct */
-		    *size = sd_size;
-		    return 0;
-		}
-	    }
-	}
-    }
-
-    fsck_log ("vpf-10670: The file %K has the wrong size in the StatData (%Lu)%s(%Lu)\n", key, 
-	sd_size, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", 
-	*size);
-    sem_pass_stat (fs)->fixed_sizes ++;
-    return 1;
-}
-
-
-/* sd_blocks is 32 bit only */
-/* old stat data shares sd_block and sd_dev - do not wipe sd_rdev out */
-/* we should fix it as following:
-|------------------------------------------------------------------|
-|                    |        3.6                   |       3.5    |
-|---------------------------------------------------|              |
-|                    |  blocks |  r_dev|generation  | blocks/r_dev |
-|------------------------------------------------------------------|
-|   fifo, sockets    |    0    |    generation      |      0       |
-|   chr/blk_dev      |    0    |     maj:min        |   maj:min    |
-|   file, dir, link  |  blocks |    generation      |   blocks     |
-|------------------------------------------------------------------|
-*/
-int wrong_st_blocks (struct key * key, __u32 * blocks, __u32 sd_blocks, __u16 mode, 
-    int new_format)
-{
-    int ret = 0;
-
-    if (S_ISREG (mode) || S_ISLNK (mode) || S_ISDIR (mode)) {
-	if ((!S_ISLNK(mode) && *blocks != sd_blocks) ||
-	    (S_ISLNK(mode) && *blocks != sd_blocks && (ROUND_UP(*blocks) != sd_blocks))) {
-	    fsck_log ("vpf-10680: The %s %K has the wrong block count in the StatData "
-		"(%u)%s(%u)\n", S_ISDIR (mode) ? "directory" : S_ISREG (mode) ? "file" : "link",  key, sd_blocks, 
-		fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", *blocks);
-	    ret = 1;
-	}
-    } else if (new_format || (S_ISFIFO (mode) || S_ISSOCK (mode))) {
-	if (sd_blocks != 0) {
-	    fsck_log ("vpf-10690: The object %K has the wrong block count in the StatData "
-		"(%u)%s(%u)\n",	key, sd_blocks, fsck_mode(fs) == FSCK_CHECK ? 
-		", should be " : " - corrected to ", 0);
-	    *blocks = 0;	
-	    ret = 1;
-	}
-    }
-
-    return ret;
-}
-/*
-int wrong_st_rdev (struct key * key, __u32 * sd_rdev, __u16 mode, int new_format)
-{
-    int ret = 0;
-
-    if (!new_format)
-	return 0;
-
-    if (!S_ISCHR (mode) && !S_ISBLK (mode)) {
-	if (*sd_rdev != 0) {
-	    fsck_log ("%s %K has wrong sd_rdev %u, has to be 0\n",
-		S_ISDIR (mode) ? "dir" : "file", key, *sd_rdev);
-	    *sd_rdev = 0;
-	    ret = 1;
-	}
-    }
-    return ret;
-}
-*/
-/* only regular files and symlinks may have items but stat
-   data. Symlink should have body */
-int wrong_mode (struct key * key, __u16 * mode, __u64 real_size, int symlink)
-{
-    int retval = 0;
-    if (S_ISLNK (*mode) && !symlink) {
-	fsck_log ("The file %K (%M) is too big to be the symlink%s regfile\n", 
-	    key, *mode, fsck_mode(fs) == FSCK_CHECK ? ", should be the" : " - corrected "
-	    "to the");
-	*mode &= ~S_IFMT;
-	*mode |= S_IFREG;
-	retval = 1;
-    }
-
-    if (ftypelet (*mode) != '?') {
-	/* mode looks reasonable */
-	if (S_ISREG (*mode) || S_ISLNK (*mode))
-	    return retval;
-	
-	/* device, pipe, socket have no items */
-	if (!real_size)
-	    return retval;
-    }
-    /* there are items, so change file mode to regular file. Otherwise
-       - file bodies do not get deleted */
-    if (fsck_mode(fs) == FSCK_CHECK) {
-	fsck_log ("The object %K has wrong mode (%M)\n", key, *mode);
-    } else {
-	fsck_log("The object %K has wrong mode (%M) - corrected to %M\n", 
-	    key, *mode, (S_IFREG | 0600));
-    }
-    *mode = (S_IFREG | 0600);
-    return 1;
-}
-
-
-/* key is a key of last file item */
-int wrong_first_direct_byte (struct key * key, int blocksize, 
-			     __u32 * first_direct_byte,
-			     __u32 sd_first_direct_byte, __u32 size)
-{
-    if (!size || is_indirect_key (key)) {
-	/* there is no direct item */
-	*first_direct_byte = NO_BYTES_IN_DIRECT_ITEM;
-	if (sd_first_direct_byte != NO_BYTES_IN_DIRECT_ITEM) {
-	    if (fsck_mode(fs) == FSCK_CHECK) {
-		fsck_log ("The file %K: The wrong info about the tail in the StatData, "
-		    "first_direct_byte (%d) - should be (%d)\n", key, 
-		    sd_first_direct_byte, *first_direct_byte);
-	    } else {
-		fsck_log ("The file %K: The wrong info about the tail in the StatData, "
-		    "first_direct_byte (%d) - corrected to (%d)\n", key, 
-		    sd_first_direct_byte, *first_direct_byte);
-	    }
-	    return 1;
-	}
-	return 0;
-    }
-
-    /* there is direct item */
-    *first_direct_byte = (get_offset (key) & ~(blocksize - 1)) + 1;
-    if (*first_direct_byte != sd_first_direct_byte) {
-	if (fsck_mode(fs) == FSCK_CHECK) {
-	    fsck_log ("The file %K: The wrong info about the tail in the StatData, "
-		"first_direct_byte (%d) - should be (%d)\n", key, sd_first_direct_byte, 
-		*first_direct_byte);
-	} else {
-	    fsck_log ("The file %K: The wrong info about the tail in the StatData, "
-		"first_direct_byte (%d) - corrected to (%d)\n", key, sd_first_direct_byte, 
-		*first_direct_byte);
-	}
-	    
-	return 1;
-    }
-    return 0;
-}
-
-
-/* delete all items (but directory ones) with the same key 'ih' has
-   (including stat data of not a directory) and put them back at the
-   other place */
-void relocate_dir (struct item_head * ih, int change_ih)
-{
-    struct key key;
-    struct key * rkey;
-    struct path path;
-    struct item_head * path_ih;
-    struct si * si;
-    __u32 new_objectid;
-
-    /* starting with the leftmost one - look for all items of file,
-       store them and delete */
-    key = ih->ih_key;
-    set_type_and_offset (KEY_FORMAT_1, &key, SD_OFFSET, TYPE_STAT_DATA);
-
-    si = 0;
-    while (1) {
-	reiserfs_search_by_key_4 (fs, &key, &path);
-	
-	if (get_item_pos (&path) == B_NR_ITEMS (get_bh (&path))) {
-	    rkey = uget_rkey (&path);
-	    if (rkey && !not_of_one_file (&key, rkey)) {
-		/* file continues in the right neighbor */
-		key = *rkey;
-		pathrelse (&path);
-		continue;
-	    }
-	    /* there is no more items of a directory */
-	    pathrelse (&path);
-	    break;
-	}
-
-	if (is_stat_data_ih (get_ih(&path)))
-	    fix_obviously_wrong_sd_mode (&path);
-	
-	path_ih = get_ih (&path);
-	if (not_of_one_file (&key, &(path_ih->ih_key))) {
-	    /* there are no more item with this key */
-	    pathrelse (&path);
-	    break;
-	}
-
-	/* ok, item found, but make sure that it is not a directory one */
-	if ((is_stat_data_ih (path_ih) && not_a_directory (get_item (&path))) ||
-	    is_direct_ih (path_ih) || is_indirect_ih (path_ih)) {
-	    /* item of not a directory found. Leave it in the
-               tree. FIXME: should not happen */
-	    key = path_ih->ih_key;
-	    set_offset (KEY_FORMAT_1, &key, get_offset (&key) + 1);
-	    pathrelse (&path);
-	    continue;
-	}
-
-	/* directory stat data ro directory item */
-	si = save_and_delete_file_item (si, &path);
-    }
-
-
-    if (!si) {
-	fsck_log ("relocate_dir: WARNING: No one item of the directory %K found\n", &key);
-	return;
-    }
-
-
-    /* get new objectid for relocation or get objectid with which file
-       was relocated already */
-    new_objectid = objectid_for_relocation (&ih->ih_key);
-    set_key_objectid (&ih->ih_key, new_objectid);
-
-    /* put all items removed back into tree */
-    while (si) {
-	fsck_log ("relocate_dir: Moving %k to ", &si->si_ih.ih_key);	
-	set_key_objectid (&si->si_ih.ih_key, new_objectid);
-	fsck_log ("%k\n", &si->si_ih.ih_key);
-	if (get_offset (&(si->si_ih.ih_key)) == DOT_OFFSET) {
-	    /* fix "." entry to point to a directtory properly */
-	    struct reiserfs_de_head * deh;
-
-	    deh = (struct reiserfs_de_head *)si->si_dnm_data;
-	    set_deh_objectid (deh, new_objectid);
-	}
-	insert_item_separately (&(si->si_ih), si->si_dnm_data, 1/*was in tree*/);
-	si = remove_saved_item (si);
-    }
-}
-
-
-
-/* path is path to stat data. If file will be relocated - new_ih will contain
-   a key file was relocated with */
-int rebuild_check_regular_file (struct path * path, void * sd,
-				struct item_head * new_ih)
-{
-    int is_new_file;
-//    struct key sd_key;
-    __u16 mode;
-    __u32 nlink;
-    __u64 real_size, saved_size;
-    __u32 blocks, saved_blocks;	/* proper values and value in stat data */
-    __u32 first_direct_byte, saved_first_direct_byte;
-
-    struct buffer_head * bh;
-    struct item_head * ih, sd_ih;
-    int fix_sd;
-    int symlnk = 0;
-    int retval;
-
-    retval = OK;
-
-    /* stat data of a file */
-    ih = get_ih (path);
-    bh = get_bh (path);
-
-    if (new_ih) {
-	/* this objectid is used already */
-	*new_ih = *ih;
-	pathrelse (path);
-	rewrite_file (new_ih, 1, 1);
-	linked_already(&new_ih->ih_key);
-	sem_pass_stat (fs)->oid_sharing_files_relocated ++;
-	retval = RELOCATED;
-	if (reiserfs_search_by_key_4 (fs, &(new_ih->ih_key), path) == ITEM_NOT_FOUND)
-	    reiserfs_panic ("%s: Could not find the StatData of the relocated file %k", 
-		__FUNCTION__, &(new_ih->ih_key));
-	/* stat data is marked unreachable again due to relocation, fix that */
-	ih = get_ih (path);
-	bh = get_bh (path);
-	mark_item_reachable (ih, bh);
-	sd = get_item (path);
-	
-    }
-	
-    id_map_mark(semantic_id_map(fs), get_key_objectid (&ih->ih_key));
-
-    /* check and set nlink first */
-    get_sd_nlink (ih, sd, &nlink);
-    nlink ++;
-    set_sd_nlink (ih, sd, &nlink);
-    mark_buffer_dirty (bh);
-
-    if (nlink > 1)
-	return retval;
-
-    /* firts name of a file found */
-    if (get_ih_item_len (ih) == SD_SIZE)
-	is_new_file = 1;
-    else
-	is_new_file = 0;
-
-    get_sd_mode (ih, sd, &mode);
-    get_sd_size (ih, sd, &saved_size);
-    get_sd_blocks (ih, sd, &saved_blocks);
-    if (!is_new_file)
-	get_sd_first_direct_byte (ih, sd, &saved_first_direct_byte);
-    
-    /* we met this file first time */
-    if (S_ISREG (mode)) {
-	sem_pass_stat(fs)->regular_files ++;
-    } else if (S_ISLNK (mode)) {
-	symlnk = 1;
-	sem_pass_stat (fs)->symlinks ++;
-    } else {
-	sem_pass_stat (fs)->others ++;
-    }
-
-
-    sd_ih = *ih;
-//    sd_key = sd_ih.ih_key;
-    pathrelse (path);
-    
-    if (are_file_items_correct (&sd_ih, sd, &real_size, &blocks, 1/*mark items reachable*/, 
-	&symlnk) != 1) 
-    {
-	/* unpassed items will be deleted in pass 4 as they left unaccessed */
-	sem_pass_stat (fs)->broken_files ++;
-    }
-    
-    fix_sd = 0;
-    
-    fix_sd += wrong_mode (/*&sd_key, */ &sd_ih.ih_key, &mode, real_size, symlnk);
-
-    if (!is_new_file)
-	fix_sd += wrong_first_direct_byte (&sd_ih.ih_key, fs->fs_blocksize,
-	    &first_direct_byte, saved_first_direct_byte, real_size);
-
-    fix_sd += wrong_st_size (/*&sd_key,*/ &sd_ih.ih_key, 
-	is_new_file ? MAX_FILE_SIZE_V2 : MAX_FILE_SIZE_V1,
-	fs->fs_blocksize, &real_size, saved_size, symlnk ? TYPE_SYMLINK : 0);
-
-    fix_sd += wrong_st_blocks (&sd_ih.ih_key, &blocks, saved_blocks, mode, is_new_file);
-
-    if (fix_sd) {
-	/* find stat data and correct it */
-	set_type_and_offset (KEY_FORMAT_1, &sd_ih.ih_key, SD_OFFSET, TYPE_STAT_DATA);
-	if (reiserfs_search_by_key_4 (fs, &sd_ih.ih_key, path) != ITEM_FOUND)
-	    reiserfs_panic ("%s: The StatData of the file %k could not be found", 
-		__FUNCTION__, &sd_ih.ih_key);
-	
-	bh = get_bh (path);
-	ih = get_ih (path);
-	sd = get_item (path);
-	set_sd_size (ih, sd, &real_size);
-	set_sd_blocks (ih, sd, &blocks);
-	set_sd_mode (ih, sd, &mode);
-	if (!is_new_file)
-	    set_sd_first_direct_byte (ih, sd, &first_direct_byte);
-	mark_buffer_dirty (bh);
-    }
-
-    return retval;
-}
-
-
-static int is_rootdir_key (struct key * key)
-{
-    if (comp_keys (key, &root_dir_key))
-	return 0;
-    return 1;
-}
-
-
-/* returns buffer, containing found directory item.*/
-static char * get_next_directory_item (struct key * key, /* on return this will
-						     contain key of next item
-						     in the tree */
-				struct key * parent,
-				struct item_head * ih,/*not in tree*/
-				__u32 * pos_in_item)
-{
-    INITIALIZE_PATH (path);
-    char * dir_item;
-    struct key * rdkey;
-    struct buffer_head * bh;
-    struct reiserfs_de_head * deh;
-    int i;
-    int retval;
-
-
-    if ((retval = reiserfs_search_by_entry_key (fs, key, &path)) != POSITION_FOUND)
-	reiserfs_panic ("get_next_directory_item: The current directory %k cannot be "
-	    "found", key);
-
-    /* leaf containing directory item */
-    bh = PATH_PLAST_BUFFER (&path);
-    *pos_in_item = path.pos_in_item;
-    *ih = *get_ih (&path);
-    deh = B_I_DEH (bh, ih);
-
-    /* make sure, that ".." exists as well */
-    if (get_offset (key) == DOT_OFFSET) {
-	if (get_ih_entry_count (ih) < 2 ||
-	    name_in_entry_length (ih, deh + 1, 1) != 2 ||
-	    strncmp (name_in_entry (deh + 1, 1), "..", 2))
-	{
-	    fsck_log ("get_next_directory_item: The entry \"..\" cannot be found in %k\n", &ih->ih_key);
-	    pathrelse (&path);
-	    return 0;
-	}
-    }
-
-    /* mark hidden entries as visible, set "." and ".." correctly */
-    deh += *pos_in_item; 
-    for (i = *pos_in_item; i < get_ih_entry_count (ih); i ++, deh ++) {
-	int namelen;
-	char * name;
-
-	name = name_in_entry (deh, i);
-	namelen = name_in_entry_length (ih, deh, i);
-	if (de_hidden (deh))
-	    reiserfs_panic ("get_next_directory_item: item %k: hidden entry %d \'%.*s\'\n",
-			    key, i, namelen, name);
-
-	if (get_deh_offset (deh) == DOT_OFFSET) {
-	    if (not_of_one_file (&(deh->deh2_dir_id), key)) {
-		/* "." must point to the directory it is in */
-		
-		//deh->deh_objectid != REISERFS_ROOT_PARENT_OBJECTID)/*????*/ {
-		fsck_log ("get_next_directory_item: The entry \".\" of the directory %K pointes to %K, instead of %K", 
-		    key, (struct key *)(&(deh->deh2_dir_id)), key);
-		set_deh_dirid (deh, get_key_dirid (key));
-		set_deh_objectid (deh, get_key_objectid (key));
-		mark_buffer_dirty (bh);
-		fsck_log (" - corrected\n");
-	    }
-	}
-
-	if (get_deh_offset (deh) == DOT_DOT_OFFSET) {
-	    /* set ".." so that it points to the correct parent directory */
-	    if (comp_short_keys (&(deh->deh2_dir_id), parent)) {
-		fsck_log ("get_next_directory_item: The entry \"..\" of the directory %K pointes to %K, instead of %K", 
-		    key, (struct key *)(&(deh->deh2_dir_id)), parent);
-		set_deh_dirid (deh, get_key_dirid (parent));
-		set_deh_objectid (deh, get_key_objectid (parent));
-		mark_buffer_dirty (bh);
-		fsck_log (" - corrected\n");
-	    }
-	}
-    }
-
-    /* copy directory item to the temporary buffer */
-    dir_item = getmem (get_ih_item_len (ih)); 
-    memcpy (dir_item, B_I_PITEM (bh, ih), get_ih_item_len (ih));
-
-
-    /* next item key */
-    if (PATH_LAST_POSITION (&path) == (B_NR_ITEMS (bh) - 1) &&
-	(rdkey = uget_rkey (&path)))
-	copy_key (key, rdkey);
-    else {
-	set_key_dirid (key, 0);
-	set_key_objectid (key, 0);
-    }
-
-    if (fsck_mode (fs) == FSCK_REBUILD)
-        mark_item_reachable (get_ih (&path), bh);
-    pathrelse (&path);
-
-    return dir_item;
-}
-
-
-// get key of an object pointed by direntry and the key of the entry itself
-void get_object_key (struct reiserfs_de_head * deh, struct key * key, 
-		     struct key * entry_key, struct item_head * ih)
-{
-    /* entry points to this key */
-    set_key_dirid (key, get_deh_dirid (deh));
-    set_key_objectid (key, get_deh_objectid (deh));
-    set_key_offset_v1 (key, SD_OFFSET);
-    set_key_uniqueness (key, 0);
-
-    /* key of entry */
-    set_key_dirid (entry_key, get_key_dirid (&ih->ih_key));
-    set_key_objectid (entry_key, get_key_objectid (&ih->ih_key));
-    set_key_offset_v1 (entry_key, get_deh_offset (deh));
-    set_key_uniqueness (entry_key, DIRENTRY_UNIQUENESS);
-}
-
-int fix_obviously_wrong_sd_mode (struct path * path) {
-    struct key * next_key = NULL;
-    __u16 mode;
-    int retval = 0;
-
-    next_key = reiserfs_next_key (path);
-
-    if (!next_key || not_of_one_file (next_key, &get_ih(path)->ih_key))
-    	return 0;
-    	
-    /* next item exists and of the same file. Fix the SD mode */
-
-    if (not_a_directory (get_item (path)) && is_direntry_key (next_key)) {
-        /* make SD mode SD of dir */
-	get_sd_mode (get_ih (path), get_item (path), &mode);
-	fsck_log ("The directory %K had wrong mode %M", &get_ih(path)->ih_key, mode);
-
-	if (fsck_mode(fs) != FSCK_CHECK) {
-	    mode &= ~S_IFMT;
-	    mode |= S_IFDIR;
-	    fsck_log (" - corrected to %M\n", mode);	
-	    set_sd_mode (get_ih (path), get_item (path), &mode);
-	    mark_buffer_dirty (get_bh(path));
-	} else {
-	    fsck_log ("\n");
-	    retval = 1;
-	}
-    } else if (!not_a_directory (get_item (path)) && !is_direntry_key (next_key)) {
-        /* make SD mode SD of regular file */
-	get_sd_mode (get_ih (path), get_item (path), &mode);
-	fsck_log ("The file %K had wrong mode %M", &get_ih(path)->ih_key, mode);
-	if (fsck_mode(fs) != FSCK_CHECK) {
-	    mode &= ~S_IFMT;
-	    mode |= S_IFREG;
-	    fsck_log (" - corrected to %M\n", mode);
-	    set_sd_mode (get_ih (path), get_item (path), &mode);
-	    mark_buffer_dirty (get_bh(path));
-	} else {
-	    fsck_log ("\n");
-	    retval = 1;
-	}
-	    
-    }
-
-    return retval;
-}
-
-/* check recursively the semantic tree. Returns OK if entry points to good
-   object, STAT_DATA_NOT_FOUND if stat data was not found or RELOCATED when
-   file was relocated because its objectid was already marked as used by
-   another file */
-int rebuild_semantic_pass (struct key * key, struct key * parent, int dot_dot,
-			   struct item_head * new_ih)
-{
-    struct path path;
-    void * sd;
-    int is_new_dir;
-    __u32 nlink;
-    struct buffer_head * bh;
-    struct item_head * ih;
-    int retval, retval1;
-    char * dir_item;
-    __u32 pos_in_item;
-    struct item_head tmp_ih;
-    struct key item_key, entry_key, object_key;
-    __u64 dir_size;
-    __u32 blocks;
-    __u64 saved_size;
-    __u32 saved_blocks;
-    int fix_sd;
-    int relocate;
-    int dir_format = 0;
-    __u16 mode;
-
-
-    retval = OK;
-
- start_again: /* when directory was relocated */
-
-    if (!KEY_IS_STAT_DATA_KEY (key))
-	reiserfs_panic ("rebuild_semantic_pass: The key %k must be key of a StatData", key);
-
-    /* look for stat data of an object */
-    if (reiserfs_search_by_key_4 (fs, key, &path) == ITEM_NOT_FOUND) {
-	pathrelse (&path);
-	if (is_rootdir_key (key))
-	    /* root directory has to exist at this point */
-	    reiserfs_panic ("rebuild_semantic_pass: The root directory StatData was not found");
-
-	return STAT_DATA_NOT_FOUND;
-    }
-
-
-    /* stat data has been found */
-    bh = get_bh (&path);
-    ih = get_ih (&path);
-    sd = get_item(&path);
-
-    /* */
-    get_sd_nlink (ih, sd, &nlink);
-
-    relocate = 0;
-    if (!nlink) {
-	/* we reached the stat data for the first time */
-	if (id_map_mark(semantic_id_map(fs), get_key_objectid (&ih->ih_key))) {
-	    /* calculate number of found files/dirs who are using objectid
-	       which is used by another file */
-	    sem_pass_stat (fs)->oid_sharing ++;
-	    if (1/*fsck_adjust_file_size (fs)*/)
-		/* this works for files only */
-		relocate = 1;
-	} 
-
-	mark_item_reachable (ih, bh);
-    }
-
-    fix_obviously_wrong_sd_mode (&path);
-
-    if (not_a_directory (sd)) {
-	retval = rebuild_check_regular_file (&path, sd, relocate ? new_ih : 0);
-	pathrelse (&path);
-	return retval;
-    }
-
-    if (relocate) {
-	if (!new_ih)
-	    reiserfs_panic ("rebuild_semantic_pass: Memory is not prepared for relocation of %K",
-		   &ih->ih_key);
-	*new_ih = *ih;
-	pathrelse (&path);
-	sem_pass_stat (fs)->oid_sharing_dirs_relocated ++;
-	relocate_dir (new_ih, 1);
-	linked_already(&new_ih->ih_key);
-	*key = new_ih->ih_key;	
-	retval = RELOCATED;
-	
-	goto start_again;
-    }
-
-    /* it looks like stat data of a directory found */
-    if (nlink) {
-	/* we saw this directory already */
-	if (!dot_dot) {
-	    /* this name is not ".."  - and hard links are not allowed on
-               directories */
-	    pathrelse (&path);
-	    return STAT_DATA_NOT_FOUND;
-	} else {
-	    /* ".." found */
-	    nlink ++;
-	    set_sd_nlink (ih, sd, &nlink);
-	    mark_buffer_dirty (bh);
-	    pathrelse (&path);
-	    return OK;
-	}
-    }
-
-
-    /* we see the directory first time */
-    sem_pass_stat (fs)->directories ++;
-    nlink = 2;
-    if (get_key_objectid (key) == REISERFS_ROOT_OBJECTID)
-	nlink ++;
-    set_sd_nlink (ih, sd, &nlink);
-    mark_buffer_dirty (bh);
-    
-    if (get_ih_item_len (ih) == SD_SIZE)
-	is_new_dir = 1;
-    else
-	is_new_dir = 0;
-
-
-/*
-    {
-	struct key * tmp;
-
-	// check next item: if it is not a directory item of the same file
-	// therefore sd_mode is corrupted so we just reset it to regular file
-	// mode
-	tmp = reiserfs_next_key (&path);
-	if (tmp && !not_of_one_file (tmp, key) && !is_direntry_key (tmp)) {
-	    __u16 mode;
-
-	    get_sd_mode (ih, sd, &mode);
-	    fsck_log ("file %K had broken mode %M, ", key, mode);
-	    mode &= ~S_IFMT;
-	    mode |= S_IFREG;
-	    fsck_log ("fixed to %M\n", mode);
-	    set_sd_mode (ih, sd, &mode);
-
-	    nlink = 0;
-	    set_sd_nlink (ih, sd, &nlink);
-	    
-	    retval = rebuild_check_regular_file (&path, sd, 0); //no relocate
-	    pathrelse (&path);
-	    return retval;
-	}
-    }
-*/
-
-
-    dir_format = (get_ih_item_len (get_ih (&path)) == SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
-    /* save stat data's size and st_blocks */
-    get_sd_size (ih, sd, &saved_size);
-    get_sd_blocks (ih, sd, &saved_blocks);	
-    get_sd_mode (ih, sd, &mode);
-
-    /* release path pointing to stat data */
-    pathrelse (&path);
-
-    /* make sure that "." and ".." exist */
-    reiserfs_add_entry (fs, key, ".",  name_length (".", dir_format), key, 1 << IH_Unreachable);
-    reiserfs_add_entry (fs, key, "..", name_length ("..", dir_format), parent, 1 << IH_Unreachable);
-
-    set_key_dirid (&item_key, get_key_dirid (key));
-    set_key_objectid (&item_key, get_key_objectid (key));
-    set_key_offset_v1 (&item_key, DOT_OFFSET);
-    set_key_uniqueness (&item_key, DIRENTRY_UNIQUENESS);
-
-
-    dir_size = 0;
-    while ((dir_item = get_next_directory_item (&item_key, parent, &tmp_ih, &pos_in_item)) != 0) {
-	/* dir_item is copy of the item in separately allocated memory,
-	   item_key is a key of next item in the tree */
-	int i;
-	char * name = 0;
-	int namelen, entry_len;
-	struct reiserfs_de_head * deh = (struct reiserfs_de_head *)dir_item + pos_in_item;	
-	
-	for (i = pos_in_item; i < get_ih_entry_count (&tmp_ih); i ++, deh ++) {
-	    struct item_head relocated_ih;
-	
-	    if (name) {
-	    	free (name);
-	    	name = 0;
-	    }
-	
-	    namelen = name_in_entry_length (&tmp_ih, deh, i);
-	    asprintf (&name, "%.*s", namelen, name_in_entry (deh, i));
-	
-	    entry_len = entry_length (&tmp_ih, deh, i);
-	
-	    get_object_key (deh, &object_key, &entry_key, &tmp_ih);
-	
-	    if ((dir_format == KEY_FORMAT_2) && (entry_len % 8 != 0)) {
-	    	/* not alighed directory of new format - delete it */
-		fsck_log ("Entry %K (\"%.*s\") in the directory %K is not formated properly - fixed.\n",
-			  (struct key *)&(deh->deh2_dir_id), namelen, name, &tmp_ih.ih_key);
-		reiserfs_remove_entry (fs, &entry_key);
-		entry_len = name_length (name, dir_format);
-		reiserfs_add_entry (fs, key, name, entry_len,
-                                (struct key *)&(deh->deh2_dir_id), 0);
-	    }
-/*	
-	    if ((dir_format == KEY_FORMAT_1) && (namelen != entry_len)) {
-	    	// aligned entry in directory of old format - remove and insert it back
-		fsck_log ("Entry %K (\"%.*s\") in the directory %K is not formated properly - deleted\n",
-		    (struct key *)&(deh->deh2_dir_id), namelen, name, &tmp_ih.ih_key);
-		reiserfs_remove_entry (fs, &entry_key);
-		entry_len = name_length (name, dir_format);
-		reiserfs_add_entry (fs, key, name, entry_len,
-				(struct key *)&(deh->deh2_dir_id), 0);
-	    }
-*/	
-	    if (is_dot (name, namelen)) {
-		dir_size += DEH_SIZE + entry_len;
-		continue;
-	    }
-	
-	    print_name (name, namelen);
-	    
-	    if (!is_properly_hashed (fs, name, namelen, get_deh_offset (deh)))
-		reiserfs_panic ("rebuild_semantic_pass: Hash mismatch detected for (\"%.*s\") in directory %K\n", 
-		    namelen, name, &tmp_ih.ih_key);
-	    
-	
-	    retval1 = rebuild_semantic_pass (&object_key, key, is_dot_dot (name, namelen), &relocated_ih);
-    
-	    erase_name (namelen);
-	    
-	    switch (retval1) {
-	    case OK:
-		dir_size += DEH_SIZE + entry_len;
-		break;
-
-	    case STAT_DATA_NOT_FOUND:
-	    case DIRECTORY_HAS_NO_ITEMS:
-		if (get_offset (&entry_key) == DOT_DOT_OFFSET && 
-		    get_key_objectid (&object_key) == REISERFS_ROOT_PARENT_OBJECTID) {
-		    /* ".." of root directory can not be found */
-		    dir_size += DEH_SIZE + entry_len;
-		    continue;
-		}
-		fsck_log ("%s: The entry %K (\"%.*s\") in directory %K points to nowhere - is removed\n",
-		    __FUNCTION__, &object_key, namelen, name, &tmp_ih.ih_key);
-		reiserfs_remove_entry (fs, &entry_key);
-		sem_pass_stat (fs)->deleted_entries ++;
-		break;
-		
-	    case RELOCATED:
-		/* file was relocated, update key in corresponding directory entry */
-		if (reiserfs_search_by_entry_key (fs, &entry_key, &path) != POSITION_FOUND) {
-		    fsck_log ("WARNING: Cannot find the name of the relocated file %K in the directory %K\n", 
-			&object_key, &tmp_ih.ih_key);
-		} else {
-		    /* update key dir entry points to */
-		    struct reiserfs_de_head * tmp_deh;
-		    
-		    tmp_deh = B_I_DEH (get_bh (&path), get_ih (&path)) + path.pos_in_item;
-		    fsck_log ("The entry %K (\"%.*s\") in directory %K updated to point to ",
-			&object_key, namelen, name, &tmp_ih.ih_key);
-		    set_deh_dirid (tmp_deh, get_key_dirid (&relocated_ih.ih_key));
-		    set_deh_objectid (tmp_deh, get_key_objectid (&relocated_ih.ih_key));
-
-		    fsck_log ("%K\n",  &tmp_deh->deh2_dir_id);
-		    mark_buffer_dirty (get_bh (&path));
-		}
-		dir_size += DEH_SIZE + entry_len;
-		pathrelse (&path);
-		break;
-	    }
-	} /* for */
-	
-	freemem (dir_item);
-    	free (name);
-    	name = 0;
-	
-	if (not_of_one_file (&item_key, key))
-	    /* next key is not of this directory */
-	    break;
-	
-    } /* while (dir_item) */
-    
-    
-    if (dir_size == 0)
-	/* FIXME: is it possible? */
-	return DIRECTORY_HAS_NO_ITEMS;
-    
-    /* calc correct value of sd_blocks field of stat data */
-    blocks = dir_size2st_blocks (dir_size);
-    
-    fix_sd = 0;
-    fix_sd += wrong_st_blocks (key, &blocks, saved_blocks, mode, is_new_dir);
-    fix_sd += wrong_st_size (key, is_new_dir ? MAX_FILE_SIZE_V2 : MAX_FILE_SIZE_V1,
-			     fs->fs_blocksize, &dir_size, saved_size, TYPE_DIRENTRY);
-
-    if (fix_sd) {
-	/* we have to fix either sd_size or sd_blocks, so look for stat data again */
-	if (reiserfs_search_by_key_4 (fs, key, &path) != ITEM_FOUND)
-	    reiserfs_panic ("rebuild_semantic_pass: The StatData of the file %K was not found", key);
-	    
-	bh = get_bh (&path);
-	ih = get_ih (&path);
-	sd = get_item (&path);
-	
-	set_sd_size (ih, sd, &dir_size);
-	set_sd_blocks (ih, sd, &blocks);
-	mark_buffer_dirty (bh);
-	pathrelse (&path);
-    }
-    
-    return retval;
-}
-
-
-int is_dot (char * name, int namelen)
-{
-    return (namelen == 1 && name[0] == '.') ? 1 : 0;
-}
-
-
-int is_dot_dot (char * name, int namelen)
-{
-    return (namelen == 2 && name[0] == '.' && name[1] == '.') ? 1 : 0;
-}
-
-
-int not_a_directory (void * sd)
-{
-    /* mode is at the same place and of the same size in both stat
-       datas (v1 and v2) */
-    struct stat_data_v1 * sd_v1 = sd;
-
-    return !(S_ISDIR (le16_to_cpu (sd_v1->sd_mode)));
-}
-
-int not_a_regfile (void * sd)
-{
-    /* mode is at the same place and of the same size in both stat
-       datas (v1 and v2) */
-    struct stat_data_v1 * sd_v1 = sd;
-
-    return !(S_ISREG (le16_to_cpu (sd_v1->sd_mode)));
-}
-
-
-
-void zero_nlink (struct item_head * ih, void * sd)
-{
-    int zero = 0;
-
-    if (get_ih_item_len (ih) == SD_V1_SIZE && get_ih_key_format (ih) != KEY_FORMAT_1) {
-	fsck_log ("zero_nlink: The StatData %k of the wrong format version (%d) - corrected to (%d)\n",
-	    ih, get_ih_key_format (ih), KEY_FORMAT_1);
-	set_ih_key_format (ih, KEY_FORMAT_1);
-    }
-    if (get_ih_item_len (ih) == SD_SIZE && get_ih_key_format (ih) != KEY_FORMAT_2) {
-	fsck_log ("zero_nlink: The StatData %k of the wrong format version (%d) - corrected to (%d)\n",
-	    ih, get_ih_key_format (ih), KEY_FORMAT_2);
-	set_ih_key_format (ih, KEY_FORMAT_2);
-    }
-
-    set_sd_nlink (ih, sd, &zero);
-}
-
-
-
-void modify_item (struct item_head * ih, void * item)
-{
-    zero_nlink (ih, item);
-    mark_item_unreachable (ih);    
-}
-
-
-/* mkreiserfs should have created this */
-static void make_sure_lost_found_exists (reiserfs_filsys_t * fs)
-{
-    int retval;
-    INITIALIZE_PATH (path);
-    unsigned int gen_counter;
-    __u32 objectid;
-    __u64 sd_size;
-    __u32 sd_blocks;
-    struct buffer_head * bh;
-    struct item_head * ih;
-    void * sd;
-    int item_len;
-
-
-    /* look for "lost+found" in the root directory */
-    retval = reiserfs_find_entry (fs, &root_dir_key,
-				  "lost+found", &gen_counter,
-				  &lost_found_dir_key);
-    if (!retval) {
-	objectid = id_map_alloc(proper_id_map(fs));
-	if (!objectid) {
-	    fsck_progress ("Could not allocate an objectid for \"/lost+found\", \
-		lost files will not be linked\n");
-	    return;
-	}
-	set_key_dirid (&lost_found_dir_key, REISERFS_ROOT_OBJECTID);
-	set_key_objectid (&lost_found_dir_key, objectid);
-    }
-
-
-    /* look for stat data of "lost+found" */
-    retval = reiserfs_search_by_key_4 (fs, &lost_found_dir_key, &path);
-    if (retval == ITEM_NOT_FOUND)
-	lost_found_dir_format = create_dir_sd (fs, &path, &lost_found_dir_key, modify_item);
-    else {
-    	struct item_head * ih = get_ih (&path);
-	
-    	if (!is_stat_data_ih (ih))
-	    reiserfs_panic ("It must be lost+found's stat data %k\n", &ih->ih_key);
-	
-	fix_obviously_wrong_sd_mode (&path);
-	
-	if (not_a_directory (get_item (&path))) {
-	    fsck_progress ("\"/lost+found\" exists, but it is not a directory, \
-		lost files will not be linked\n");
-	    set_key_objectid (&lost_found_dir_key, 0);
-	    pathrelse (&path);
-	    return;
-	}
-    	
-        lost_found_dir_format = (get_ih_item_len (get_ih (&path)) == SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
-        	
-	pathrelse (&path);
-    }
-
-    /* add "." and ".." if any of them do not exist */
-    reiserfs_add_entry (fs, &lost_found_dir_key, ".", name_length (".", lost_found_dir_format),
-    		&lost_found_dir_key, 1 << IH_Unreachable);    		
-    reiserfs_add_entry (fs, &lost_found_dir_key, "..", name_length ("..", lost_found_dir_format),
-    		&root_dir_key, 1 << IH_Unreachable);
-
-    item_len = reiserfs_add_entry (fs, &root_dir_key, "lost+found",
-    		name_length ("lost+found", root_dir_format), &lost_found_dir_key, 1 << IH_Unreachable);
-
-    if (item_len) {
-	if (reiserfs_search_by_key_4 (fs, &root_dir_key, &path) == ITEM_NOT_FOUND)
-	    reiserfs_panic ("%s: StatData of the root directory must exists", __FUNCTION__);
-	
-	bh = get_bh (&path);
-	ih = get_ih (&path);
-	sd = get_item(&path);
-	
-	get_sd_size (ih, sd, &sd_size);
-	sd_size += item_len;
-	set_sd_size (ih, sd, &sd_size);
-	sd_blocks = dir_size2st_blocks (sd_size);
-	set_sd_blocks (ih, sd, &sd_blocks);
-	mark_buffer_dirty (bh);
-	pathrelse (&path);
-    }
-			
-    return;
-}
-
-/* Result of the rebuild pass will be saved in the state file which is needed to start 
- * fsck again from the next pass. */
-static void save_rebuild_semantic_result (reiserfs_filsys_t * fs) {
-    FILE * file;
-    int retval;
-
-    file = open_file ("temp_fsck_file.deleteme", "w+");
-    if (!file)
-	return;
-
-    reiserfs_begin_stage_info_save (file, SEMANTIC_DONE);
-    /*  Method not implemented yet.
-    reiserfs_objectid_map_save (file, semantic_id_map (fs));
-    */
-    reiserfs_end_stage_info_save (file);
-    close_file (file);
-    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
-    if (retval != 0)
-	fsck_progress ("%s: Could not rename the temporary file temp_fsck_file.deleteme to %s",
-	    __FUNCTION__, state_dump_file (fs));
-}
-
-/* we have nothing to load from a state file, but we have to fetch
-   on-disk bitmap, copy it to allocable bitmap, and fetch objectid
-   map */
-void load_semantic_result (FILE * file, reiserfs_filsys_t * fs)
-{
-    fsck_new_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
-
-    fsck_allocable_bitmap (fs) = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
-
-    fs->block_allocator = reiserfsck_reiserfs_new_blocknrs;
-    fs->block_deallocator = reiserfsck_reiserfs_free_block;
-
-    /* we need objectid map on semantic pass to be able to relocate files */
-    proper_id_map (fs) = id_map_init();
-    /* Not implemented yet.    
-    fetch_objectid_map (proper_id_map (fs), fs);
-    semantic_id_map (fs) = reiserfs_objectid_map_load (file);
-    */
-}
-
-static void before_pass_3 (reiserfs_filsys_t * fs)
-{
-    semantic_id_map (fs) = id_map_init();
-}
-
-static void after_pass_3 (reiserfs_filsys_t * fs)
-{
-    /* update super block: objectid map, fsck state */
-    set_sb_fs_state (fs->fs_ondisk_sb, SEMANTIC_DONE);
-    mark_buffer_dirty (fs->fs_super_bh);
-
-    /* write all dirty blocks */
-    fsck_progress ("Flushing..");
-    id_map_flush(proper_id_map (fs), fs);
-    fs->fs_dirt = 1;
-    reiserfs_flush_to_ondisk_bitmap (fsck_new_bitmap(fs), fs);
-    reiserfs_flush (fs);
-    fsck_progress ("finished\n");
-
-    stage_report (3, fs);
-
-    if (!fsck_run_one_step (fs)) {
-	if (fsck_user_confirmed (fs, "Continue? (Yes):", "Yes\n", 1))
-	    /* reiserfsck continues */
-	    return;
-    }
-
-    save_rebuild_semantic_result (fs);
-
-    id_map_free(proper_id_map (fs));
-    proper_id_map (fs) = 0;
-
-    fs->fs_dirt = 1;
-    reiserfs_close (fs);
-    exit(0);
-}
-
-/* this is part of rebuild tree */
-void pass_3_semantic (reiserfs_filsys_t * fs)
-{
-    before_pass_3 (fs);
-
-    fsck_progress ("Pass 3 (semantic):\n");
-
-    /* when warnings go not to stderr - separate them in the log */
-    if (fsck_log_file (fs) != stderr)
-	fsck_log ("####### Pass 3 #########\n");
-
-
-    if (!fs->fs_hash_function)
-	reiserfs_panic ("Hash function should be selected already");
-
-    make_sure_root_dir_exists (fs, modify_item, 1 << IH_Unreachable);
-    make_sure_lost_found_exists (fs);
-
-    id_map_mark(proper_id_map(fs), get_key_objectid(&root_dir_key));
-    id_map_mark(proper_id_map(fs), get_key_objectid(&lost_found_dir_key));
-    
-    /* link all relocated files into /lost+found directory */
-    link_relocated_files ();
-
-    rebuild_semantic_pass (&root_dir_key, &parent_root_dir_key, 0/*!dot_dot*/, 0/*reloc_ih*/);
-
-    add_badblock_list(fs, 1);
-
-    after_pass_3 (fs);
-}
diff --git a/fsck/super.c b/fsck/super.c
deleted file mode 100644
index 86ffd90..0000000
--- a/fsck/super.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/*
- * Copyright 2001-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
-#    include <uuid/uuid.h>
-#endif
-
-#define fsck_conditional_log(sb_found, fmt, list...) {	\
-    if (sb_found)					\
-    	fsck_log(fmt, ## list);				\
-}
-
-int what_fs_version ()
-{
-    size_t n = 0;
-    char * answer = 0;
-    int version;
-    printf("\nwhat the version of ReiserFS do you use[1-4]\n"
-        "\t(1)   3.6.x\n"
-        "\t(2) >=3.5.9 (introduced in the middle of 1999) (if you use linux 2.2, choose this one)\n"
-        "\t(3) < 3.5.9 converted to new format (don't choose if unsure)\n"
-        "\t(4) < 3.5.9 (this is very old format, don't choose if unsure)\n"
-        "\t(X)   exit\n");
-    getline (&answer, &n, stdin);
-    version = atoi (answer);
-    if (version < 1 || version > 4)
-        die ("rebuild_sb: wrong version");
-    return version;
-}
-
-/*
-#define super_error(exit_code, text) {	\
-    fsck_log(text);			\
-    return exit_code;			\
-}
-    
-int check_sb (reiserfs_filsys_t * fs) {
-    int magic = 0, version = 0;
-    
-    if (!is_blocksize_correct (fs->fs_blocksize)) 
-	super_error(-1, "Wrong blocksize found in the super block\n");
-
-    if (is_reiserfs_3_6_magic_string (sb))
-	magic = 2;
-    else if (is_reiserfs_3_5_magic_string (sb))
-	magic = 1;
-    else if (is_reiserfs_jr_magic_string (sb))
-	magic = 3;
-    else 
-	super_error(-1, "Invalid magic found in the super block.\n");
-    
-    if (magic == 1 || magic == 2) {
-	if (fsck_data (fs)->journal_dev_name)
-            fsck_log("Reiserfs with standard journal found, but there was specified a "
-		"journal dev\n");
-	
-	standard_journal = 1;
-    } else {
-	if (!fsck_data (fs)->journal_dev_name) 
-            super_error(-1, "Reiserfs with non standard journal found, but there was not "
-		"specified any journal dev\n");
-	
-	standard_journal = 0;
-    }
-    
-    if (get_sb_version (sb) != REISERFS_FORMAT_3_6 && get_sb_version (sb) != REISERFS_FORMAT_3_5) 
-	super_error(-1, "Invalid format found in the super block.\n");
-	
-    if (is_new_sb_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) 
-    {
-	if (magic == 3) 
-	    version = get_sb_version (sb) == REISERFS_FORMAT_3_6 ? 1 : 2;
-	else
-	    version = magic == 2 ? 1 : 2;	
-    } else if (is_old_sb_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) {
-	if (magic == 3) 
-	    version = get_sb_version (sb) == REISERFS_FORMAT_3_6 ? 3 : 4;
-	else 
-	    version = magic == 2 ? 3 : 4;	
-    } else 
-	die("Super block in the wong block(%d).\n", fs->fs_super_bh->b_blocknr);
-    
-    if (version == 0) 
-	die ("FS format must be figured out here.\n");
-
-    if (get_sb_block_count (sb) > count_blocks (filename, fs->fs_blocksize)) 
-	super_error(-1, "Invalid block count found in the super block.\n");
-
-    if (get_sb_block_size (sb) != fs->fs_blocksize) 
-        super_error(-1, "Invalid block size found in the super block (%lu).\n", 
-	    get_sb_block_size (sb));
-
-//Non needed from here
-    p_oid_maxsize = (fs->fs_blocksize - reiserfs_super_block_size (sb)) / sizeof(__u32) / 2 * 2;    
-    if (get_sb_oid_maxsize (sb) != p_oid_maxsize) 
-	super_error(-1, "Invalid objectid map max size found in the super block (%lu).\n", 
-	    get_sb_oid_maxsize (sb));
-
-    if (get_sb_oid_cursize (sb) == 1 || get_sb_oid_cursize (sb) > get_sb_oid_maxsize (sb))
-        super_error(-1, "Invalid objectid map found in the super block (%lu).\n", 
-	    get_sb_oid_cursize (sb));
-
-    if (get_sb_root_block (sb) > block_count && get_sb_root_block (sb) != ~0) 
-	fsck_log("Invalid root block found in the super block (%lu).\n", 
-	    get_sb_root_block (sb));
-
-    if (get_sb_free_blocks (sb) > block_count) 
-	fsck_log ("Invalid free block count found in the super block (%lu).\n", 
-	    get_sb_free_blocks (sb));
-
-    if (get_sb_tree_height (sb) && ((get_sb_tree_height (sb) < DISK_LEAF_NODE_LEVEL + 1) ||
-	(get_sb_tree_height (sb) > MAX_HEIGHT) && (get_sb_tree_height (sb) != ~0))) 
-	super_error(-1, "Invalid tree height found in the super block (%lu).\n", 
-	    get_sb_tree_height (sb));
-
-    if (get_sb_hash_code (sb) && code2name (get_sb_hash_code (sb)) == 0) 
-	super_error(-1, "Invalid hash found in the super block (%lu).\n", 
-	    get_sb_hash_code (sb));
-
-    if (version == 1 || version == 3) {
-        if (!uuid_is_correct(sb->s_uuid)) 
-	    fsck_log ("Invalid uuid found, you should generate a new one.\n");
-
-	if (sb->s_flags & 0xfffffffe)
-	    fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n", sb->s_flags);
-    }
-
-//Not needed till here.
-
-    p_bmap_nr = (block_count + (fs->fs_blocksize * 8 - 1)) / (fs->fs_blocksize * 8);
-    if (get_sb_bmap_nr (sb) != p_bmap_nr) 
-	super_error(-1, "Invalid bitmap number found in the super block (%lu).\n", 
-	    get_sb_bmap_nr (sb));
-
-    if (!fsck_skip_journal (fs) && standard_journal == 1) {
-        if (get_jp_journal_dev (sb_jp(sb)) != 0)
- 	    super_error(-1, "Invalid journal device found (%lu).\n", get_jp_journal_dev (sb_jp(sb)));
-
-        if (get_jp_journal_1st_block (sb_jp(sb)) != get_journal_start_must (fs)) 
-            super_error(-1, "Invalid journal first block found (%lu).\n", get_jp_journal_1st_block (sb_jp(sb)));
-
-        if (get_jp_journal_size (sb_jp(sb)) != journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) 
-	    super_error(-1, "Invalid journal size found (%lu).\n", get_jp_journal_size (sb_jp(sb)) + 1);
-        
-        
-	
-	if (get_jp_journal_max_batch (sb_jp(sb)) != advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb)))) {
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max batch size occured (%lu), fixed (%d)\n",
- 	        get_jp_journal_max_batch (sb_jp(sb)), advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));
- 	    set_jp_journal_max_batch (sb_jp(sb), advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));
-        }
-        if (get_jp_journal_max_commit_age (sb_jp(sb)) != advise_journal_max_commit_age()) {
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal  max commit age occured (%lu), fixed (%d)\n",
- 	        get_jp_journal_max_commit_age (sb_jp(sb)), advise_journal_max_commit_age());
- 	    set_jp_journal_max_commit_age (sb_jp(sb), advise_journal_max_commit_age());
-        }
-        if (get_jp_journal_max_trans_age (sb_jp(sb)) != advise_journal_max_trans_age()) {
- 	    fsck_log ("rebuild-sb: wrong journal  max commit age occured (%lu), fixed (0)\n",
- 	        get_jp_journal_max_trans_age (sb_jp(sb)), advise_journal_max_trans_age());
- 	    set_jp_journal_max_trans_age (sb_jp(sb), advise_journal_max_trans_age());
-        }
-
-        
-}
-*/
-
-void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * data)
-{
-    int version = 0;
-    struct reiserfs_super_block * ondisk_sb = 0;
-    struct reiserfs_super_block * sb = 0;
-    struct reiserfs_journal_header *j_head;
-
-    int magic_was_found = 0;
-    unsigned long block_count = 0;
-    __u16 p_oid_maxsize;
-    __u16 p_bmap_nr;
-    __u32 p_jp_journal_1st_block = 0;
-    __u32 p_jp_dev_size = 0;
-    int standard_journal = -1;
-    char * journal_dev_name = 0;
-    char * tmp;
-    int sb_size;
-
-    char * answer = 0;
-    size_t n = 0;
-    struct stat stat_buf;
-    int retval, exit_code = EXIT_OK;
-
-#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
-    char uuid[37];
-    
-    uuid[36] = '\0';
-#endif
-
-    if (!no_reiserfs_found (fs)) {
-        sb = getmem (sizeof (*sb));
-        if (!is_opened_rw (fs)) {
-            close (fs->fs_dev);
-            fs->fs_dev = open (fs->fs_file_name, O_RDWR | O_LARGEFILE);
-        }
-
-	if (!is_blocksize_correct (fs->fs_blocksize)) {
-	    printf("\nCannot find a proper blocksize, enter block size [4096]: \n");
-	    getline (&answer, &n, stdin);
-	    if (strcmp(answer, "\n")) {
-		retval = (int) strtol (answer, &tmp, 0);
-		if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
-		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified\n");
-		if (!is_blocksize_correct (retval))
-		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified, "
-			"only power of 2 from 512-8192 interval are supported.\n");
-	    } else
-		retval = 4096;
-	
-	    fs->fs_blocksize = retval;
-	}
-
-        if (!(block_count = count_blocks (filename, fs->fs_blocksize)))
-		exit(EXIT_OPER);
-
-        /* save ondisk_sb somewhere and work in temp area */
-        ondisk_sb = fs->fs_ondisk_sb;
-        memcpy (sb, fs->fs_ondisk_sb, sizeof (*sb));
-        fs->fs_ondisk_sb = sb;
-
-        if (is_reiserfs_3_6_magic_string (sb)) {
-            /* 3_6 magic */
-            if (fsck_data (fs)->journal_dev_name)
-                /* journal dev must not be specified with standard journal */
-                reiserfs_exit (EXIT_USER, "ReiserFS with default journal "
-		    "is found, but there was specified a journal device.");
-
-            if (fs->fs_super_bh->b_blocknr ==
-		REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                version = 1;
-	    else if (fs->fs_super_bh->b_blocknr ==
-		REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                version = 3;
-	    
-            magic_was_found = 2;
-        } else if (is_reiserfs_3_5_magic_string (sb)) {
-            if (fsck_data (fs)->journal_dev_name)
-                /* journal dev must not be specified with standard journal */
-                reiserfs_exit (EXIT_USER, "ReiserFS with default journal "
-		    "is found, but there was specified a journal device.");
-
-            /* 3_5 magic */
-            if (fs->fs_super_bh->b_blocknr ==
-		REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                version = 2;
-	    else if (fs->fs_super_bh->b_blocknr ==
-		REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                version = 4;
-	    
-	    magic_was_found = 1;
-        } else if (is_reiserfs_jr_magic_string (sb)) {
-            if (!fsck_data (fs)->journal_dev_name && !fsck_skip_journal(fs))
-                /* journal dev must be specified with non standard journal */
-                reiserfs_exit (EXIT_USER, "ReiserFS with non default journal "
-		    "is found, but there was not specified any journal device.");
-
-            if (get_sb_version (sb) == REISERFS_FORMAT_3_6) {
-                /*non-standard magic + sb_format == 3_6*/
-		if (fs->fs_super_bh->b_blocknr ==
-		    REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                    version = 1;
-		else if (fs->fs_super_bh->b_blocknr == 
-		    REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                    version = 3;
-		
-                magic_was_found = 3;
-            } else if (get_sb_version (sb) == REISERFS_FORMAT_3_5) {
-                /* non-standard magic + sb_format == 3_5 */
-                if (fs->fs_super_bh->b_blocknr ==
-		    REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                    version = 2;
-		else if (fs->fs_super_bh->b_blocknr ==
-		    REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
-                    version = 4;
-		
-                magic_was_found = 3;
-            } else {
-                /* non-standard magic + bad sb_format */
-                version = 0;
-                magic_was_found = 3;
-            }
-        } else
-            reiserfs_exit (EXIT_USER, "We opened device but there is no magic "
-		"and there is no correct superblock format found.");
-
-        if (magic_was_found == 1 || magic_was_found == 2)
-            standard_journal = 1;
-        else
-            standard_journal = 0;
-
-        if (version == 0)
-            version = what_fs_version ();
-
-        if (get_sb_block_count (sb) != block_count) {
-            do {
-                printf("\nDid you use resizer(y/n)[n]: ");
-                getline (&answer, &n, stdin);
-            } while(strcmp ("y\n", answer) && 
-		    strcmp ("n\n", answer) && 
-		    strcmp ("\n", answer));
-
-            if (!strcmp ("y\n", answer)) {
-                printf("\nEnter partition size [%lu]: ", block_count);
-                getline (&answer, &n, stdin);
-                if (strcmp ("\n", answer))
-                    block_count = atoi (answer);
-            } else {
-                fsck_conditional_log (magic_was_found, "rebuild-sb: wrong block count "
-		    "occured (%lu), fixed (%lu)\n", get_sb_block_count(sb), block_count);
-            }
-
-	    set_sb_block_count (sb, block_count);
-        }
-
-        if (get_sb_block_size (sb) != fs->fs_blocksize) {
-            fsck_log("rebuild-sb: wrong block size occured (%lu), fixed (%lu)\n", 
-		    get_sb_block_size (sb), fs->fs_blocksize);
-  	    set_sb_block_size (sb, fs->fs_blocksize);
-        }
-    }
-
-    /* if no reiserfs_found or bad data found in that SB, what was checked in previous 
-     * clause */
-    if (no_reiserfs_found (fs)) {
-        int fd;
-
-        fd = open (filename, O_RDWR | O_LARGEFILE);
-
-        if (fd == -1) {
-            reiserfs_exit (EXIT_OPER, "rebuils_sb: cannot open device %s", 
-		filename);
-	}
-
-        version = what_fs_version ();
-
-        if (version == 3 || version == 4) {
-            retval = 4096;
-        } else {
-	    printf("\nEnter block size [4096]: \n");
-	    getline (&answer, &n, stdin);
-	    if (strcmp(answer, "\n")) {
-		retval = (int) strtol (answer, &tmp, 0);
-		if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
-		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified\n");
-		if (!is_blocksize_correct (retval))
-		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified, "
-			"only divisible by 1024 are supported currently\n");
-	    } else
-		retval = 4096;
-	}
-
-        if (!(block_count = count_blocks (filename, retval)))
-		exit(EXIT_OPER);
-
-        switch(version){
-        case 1:
-            fs = reiserfs_create (filename, REISERFS_FORMAT_3_6, block_count, retval, 1, 1);
-            break;
-        case 2:
-            fs = reiserfs_create (filename, REISERFS_FORMAT_3_5, block_count, retval, 1, 1);
-            break;
-        case 3:
-            fs = reiserfs_create (filename, REISERFS_FORMAT_3_6, block_count, retval, 1, 0);
-            break;
-        case 4:
-            fs = reiserfs_create (filename, REISERFS_FORMAT_3_5, block_count, retval, 1, 0);
-            break;
-        }
-
-	if (fs == NULL)
-	    return;
-	
-        sb = fs->fs_ondisk_sb;
-        fs->fs_vp = data;
-
-        if (!fsck_skip_journal (fs)) {
-            if (!fsck_data (fs)->journal_dev_name) {
-                do {
-                    printf("\nNo journal device was specified. (If journal is not "
-			"available, re-run with --no-journal-available option specified).\n"
-                        "Is journal default? (y/n)[y]: ");
-		    
-                    getline (&answer, &n, stdin);
-                } while(strcmp ("y\n", answer) && 
-			strcmp ("n\n", answer) && 
-			strcmp ("\n", answer));
-		
-                if (!strcmp ("n\n", answer)) {
-                    printf("\nSpecify journal device with -j option.\n");
-                    exit(EXIT_USER);
-                }
-                standard_journal = 1;
-            } else {
-                standard_journal = 0;
-                memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING,
-                    strlen (REISERFS_JR_SUPER_MAGIC_STRING));
-            }
-        }
-
-        do {
-            printf("\nDid you use resizer(y/n)[n]: ");
-            getline (&answer, &n, stdin);
-        } while (strcmp ("y\n", answer) && strcmp ("n\n", answer) && strcmp ("\n", answer));
-        if (!strcmp ("y\n", answer)) {
-            printf("\nEnter partition size [%lu]: ", block_count);
-            getline (&answer, &n, stdin);
-            if (strcmp ("\n", answer))
-                block_count = atoi (answer);
-            set_sb_block_count (sb, block_count);
-        }
-	
-	set_sb_fs_state (sb, FS_ERROR);
-    }
-
-
-    if (version == 1 || version == 3) {
-        if (get_reiserfs_format (sb) != REISERFS_FORMAT_3_6) {
-            fsck_log("rebuild-sb: wrong reiserfs version occured (%lu), fixed (%lu)\n", 
-		    get_reiserfs_format (sb), REISERFS_FORMAT_3_6);
-            set_sb_version (sb, REISERFS_FORMAT_3_6);
-        }
-    } else if (version == 2 || version == 4) {
-        if (get_reiserfs_format (sb) != REISERFS_FORMAT_3_5) {
-            fsck_log("rebuild-sb: wrong reiserfs version occured (%lu), fixed (%lu)\n", 
-		    get_reiserfs_format (sb), REISERFS_FORMAT_3_5);
-            set_sb_version (sb, REISERFS_FORMAT_3_5);
-        }
-    }
-
-    p_oid_maxsize = (fs->fs_blocksize - reiserfs_super_block_size (sb)) / 
-	sizeof(__u32) / 2 * 2;
-    
-    if (get_sb_oid_maxsize (sb) != p_oid_maxsize) {
-	fsck_log("rebuild-sb: wrong objectid map max size occured (%lu), fixed (%lu)\n", 
-		get_sb_oid_maxsize (sb), p_oid_maxsize);
-	set_sb_oid_maxsize (sb, p_oid_maxsize);
-    }
-
-    p_bmap_nr = (block_count + (fs->fs_blocksize * 8 - 1)) / (fs->fs_blocksize * 8);
-    if (get_sb_bmap_nr (sb) != p_bmap_nr) {
-	fsck_log("rebuild-sb: wrong bitmap number occured (%lu), fixed (%lu)\n", 
-		get_sb_bmap_nr (sb), p_bmap_nr);
-	set_sb_bmap_nr (sb, 
-		(block_count + (fs->fs_blocksize * 8 - 1)) / (fs->fs_blocksize * 8));
-    }
-
-    if (get_sb_root_block (sb) > block_count) {
-	fsck_log("rebuild-sb: wrong root block occured (%lu), zeroed\n", 
-		get_sb_root_block (sb));
-	set_sb_root_block (sb, 0);
-    }
-
-    if (get_sb_free_blocks (sb) > block_count) {
-	fsck_log ("rebuild-sb: wrong free block count occured (%lu), zeroed\n", 
-		get_sb_free_blocks (sb));
-        set_sb_free_blocks (sb, 0);
-    }
-
-    if (get_sb_umount_state (sb) != FS_CLEANLY_UMOUNTED && 
-	get_sb_umount_state (sb) != FS_NOT_CLEANLY_UMOUNTED) 
-    {
-	fsck_conditional_log (magic_was_found, "rebuild-sb: wrong umount state (%u), "
-	    "fixed to (FS_NOT_CLEANLY_UMOUNTED)\n", get_sb_umount_state (sb));
-        set_sb_umount_state (sb, FS_NOT_CLEANLY_UMOUNTED);
-    }
-
-    if (get_sb_oid_cursize (sb) == 1 || 
-	get_sb_oid_cursize (sb) > get_sb_oid_maxsize (sb)) 
-    {
-        fsck_log("rebuild-sb: wrong objectid map occured (%lu), zeroed\n", 
-	    get_sb_oid_cursize (sb));
-	
-        set_sb_oid_cursize (sb, 0);
-    }
-
-    if ( get_sb_tree_height (sb) &&
-        ((get_sb_tree_height (sb) < DISK_LEAF_NODE_LEVEL + 1) ||
-	(get_sb_tree_height (sb) > MAX_HEIGHT)) ) {
-	fsck_log("rebuild-sb: wrong tree height occured (%u), zeroed\n", 
-	    get_sb_tree_height (sb));
-
-	set_sb_tree_height (sb, 0);
-    }
-
-    if (get_sb_hash_code (sb) && code2name (get_sb_hash_code (sb)) == 0) {
-	fsck_log("rebuild-sb: wrong hash occured (%lu), zeroed\n", 
-	    get_sb_hash_code (sb));
-	
-	set_sb_hash_code (sb, 0);
-    }
-
-    if (version == 1 || version == 3) {
-#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
-        if (uuid_is_null(sb->s_uuid)) {
-	    uuid_generate(sb->s_uuid);
-	    fsck_log ("rebuild-sb: no uuid found, a new uuid was "
-		      "generated (%U)\n", sb->s_uuid);
-        }
-#endif
-	if (sb->s_flags != 0 && sb->s_flags != 1) {
-	    fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n",
-                  sb->s_flags);
-	    sb->s_flags = 0;
-	}
-    }
-
-
-    /*
-    if we have a standard journal
-        reserved = 0
-        dev - same
-        size = journal_default_size(fs->fs_super_bh->b_blocknr, fs)
-        offset = journal_default_size(fs)
-    if we have a non standard journal
-        if we found magic string
-            try to find a jhead and comare dev, size, offset there
-            if params are not equal move to "if we did not find a magic string" clause
-        if we did not find a magic string
-            ask user about his journal
-            try to find a jhead and comare dev, size, offset there
-            if params are not equal exit with error
-    */
-
-
-    p_jp_journal_1st_block = get_journal_start_must (fs);
-
-    if (standard_journal == 1) {
-	if (get_jp_journal_dev (sb_jp(sb)) != 0) {
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal device "
-		"occured (%lu), fixed (0)\n", get_jp_journal_dev (sb_jp(sb)));
- 	    set_jp_journal_dev (sb_jp(sb), 0);
-        }
-        if (get_sb_reserved_for_journal (sb) != 0) {
- 	    fsck_log ("rebuild-sb: wrong size reserved for default journal occured "
-		"(%lu), fixed (0)\n", get_sb_reserved_for_journal (sb));
-            set_sb_reserved_for_journal (sb, 0);
-        }
-        if (get_jp_journal_1st_block (sb_jp(sb)) != p_jp_journal_1st_block) {
-            fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal first "
-		"block occured (%lu), fixed (%lu)\n", get_jp_journal_1st_block (sb_jp(sb)),
-		p_jp_journal_1st_block);
-	    
-            set_jp_journal_1st_block (sb_jp(sb) , p_jp_journal_1st_block);
-        }
-        if (get_jp_journal_size (sb_jp(sb)) != 
-	    journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) 
-	{
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal size "
-		"occured (%lu), fixed (%lu)\n", get_jp_journal_size (sb_jp(sb)) + 1,
- 	        journal_default_size (fs->fs_super_bh->b_blocknr, 
-		fs->fs_blocksize) + 1);
-	    
-            set_jp_journal_size (sb_jp(sb), 
-		journal_default_size (fs->fs_super_bh->b_blocknr, fs->fs_blocksize));
-        }
-
-	if ((retval = reiserfs_open_journal(fs, filename, O_RDWR | O_LARGEFILE))) {
-	    fsck_log("\nrebuild-sb: Failed to open the journal device (%s).\n", 
-		filename);
-
-	    exit(retval < 0 ? EXIT_OPER : EXIT_USER);
-	}	
-    } else if (!fsck_skip_journal(fs)) {
-	/* Check that specified non-standard journal device exists. */
-	    
-	journal_dev_name = fsck_data (fs)->journal_dev_name;	    
-	retval = stat(journal_dev_name, &stat_buf);
-	    
-	if (retval == -1)
-	    reiserfs_exit (EXIT_USER, "rebuild_sb: error while detecting the "
-		"specified journal device (%s): %s\n", journal_dev_name,
-		strerror(errno));
-	
-	retval = 0;
-	if (magic_was_found) {
-	    /* Super block was found. Try to open the journal on the base of its 
-	     * journal parameters. */
-	    
-	    retval = reiserfs_open_journal(fs, journal_dev_name, 
-		O_RDWR | O_LARGEFILE);
-	    
-	    if (retval == 0) {
-		j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
-		retval = memcmp(&j_head->jh_journal, sb_jp(sb), 
-		    sizeof(struct journal_params));
-	    
-		if (retval) {
-		    /* journal parameters from the SB and from the J_Header does not 
-		     * match. Close the jouranl, ask the user about correct journal 
-		     * parameters. */
-		    reiserfs_close_journal(fs);
-		}
-	    }
-
-	    if (!reiserfs_journal_opened(fs)) {
-		fsck_log ("Journal cannot be opened, assuming specified "
-			  "journal device is correct\n");
-	    }
-	}
-	
-	if (!reiserfs_journal_opened(fs)) {
-	    __u64 default_value;
-
-	    /* journal was not found or SB and J_Header parameters does not match. */
-	    if (magic_was_found == 0)
-                default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ? 
-		    p_jp_journal_1st_block : 0;
-            else
-                default_value = get_jp_journal_1st_block (sb_jp(sb));
-
-            printf("\nEnter journal offset on %s in blocks [%Lu]: \n",
-            		journal_dev_name, (unsigned long long)default_value);
-
-            getline (&answer, &n, stdin);
-            if (strcmp(answer, "\n")) {
-                retval = (int) strtol (answer, &tmp, 0);
-                if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
-                    reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n");
-
-                set_jp_journal_1st_block (sb_jp(sb), retval);
-            } else
-                set_jp_journal_1st_block (sb_jp(sb), default_value);
-
-            if (!(p_jp_dev_size = count_blocks (journal_dev_name, fs->fs_blocksize)))
-		    exit(EXIT_OPER);
-
-            /* some checks for journal offset */
-            if (strcmp(fs->fs_file_name, journal_dev_name) != 0) {
-                if (p_jp_dev_size < get_jp_journal_1st_block (sb_jp(sb)) + 1)
-        	    reiserfs_exit(EXIT_USER, "rebuild_sb: offset is much than device size\n");
-            }
-
-            /* default size if magic was not found is device size - journal_1st_block;
-               default size if magic was found is found value + 1 block for journal 
-	       header */
-            if (magic_was_found == 0)
-                default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ?
-                    journal_default_size (fs->fs_super_bh->b_blocknr,
-					  fs->fs_blocksize) + 1 :
-                    p_jp_dev_size - get_jp_journal_1st_block (sb_jp(sb));
-            else
-                default_value = get_jp_journal_size (sb_jp(sb)) + 1;
-		
-
-            printf("\nEnter journal size (including 1 block for journal header) on "
-		"%s in blocks [%Lu]: \n", journal_dev_name, 
-		(unsigned long long)default_value);
-
-            getline (&answer, &n, stdin);
-            if (strcmp(answer, "\n")) {
-                retval = (int) strtol (answer, &tmp, 0);
-                if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
-        	    reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n");
-
-                set_jp_journal_size (sb_jp(sb), retval - 1);
-            } else {
-                set_jp_journal_size (sb_jp(sb), default_value - 1);
-            }
-
-            /* some checks for journal size */
-            if (get_jp_journal_size (sb_jp(sb)) +
-                get_jp_journal_1st_block (sb_jp(sb)) + 1 > p_jp_dev_size)
-        	    reiserfs_exit(EXIT_USER, "rebuild_sb: journal offset + journal size is "
-			"greater than device size\n");
-            
-	    /* some checks for journal size */
-            if (get_jp_journal_size (sb_jp(sb)) < JOURNAL_MIN_SIZE)
-        	    reiserfs_exit(EXIT_USER, "rebuild_sb: journal size cannot be less than "
-			"%lu blocks.\n", JOURNAL_MIN_SIZE + 1);
-
-	    if ((retval = reiserfs_open_journal(fs, journal_dev_name, 
-		O_RDWR | O_LARGEFILE)))
-	    {
-		fsck_log("\nrebuild-sb: Failed to open a journal device (%s).", 
-		    journal_dev_name);
-		
-		exit(retval < 0 ? EXIT_OPER : EXIT_USER);
-	    }
-	
-	    /* SB was found, but journal params were broken and have been recovered. 
-	     * Futher work goes as SB would not be found. */
-	    magic_was_found = 0;
-	}
-	
-	if (strcmp (fs->fs_file_name, journal_dev_name))
-	    set_jp_journal_dev (sb_jp(sb), stat_buf.st_rdev);
-	else
-	    set_jp_journal_dev (sb_jp(sb), 0);
-
-    } else {
-	fsck_log ("\nJournal was specified as not available. reiserfstune is "
-	    "needed.\n\n");
-	
-	set_jp_journal_magic (sb_jp(sb), NEED_TUNE);
-    }
-
-    if (reiserfs_journal_opened(fs)) {
-	/* Journal was openned. Check/fix journal parameters and copy it the journal 
-	 * header. */
-	
-        if (get_jp_journal_max_trans_len (sb_jp(sb)) !=
-	    advise_journal_max_trans_len(   get_jp_journal_max_trans_len (sb_jp(sb)),
-					    get_jp_journal_size (sb_jp(sb)), 
-					    fs->fs_blocksize, 0))
-	{
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max "
-		"transaction length occured (%lu), fixed (%d)\n",
-		get_jp_journal_max_trans_len (sb_jp(sb)),
-		advise_journal_max_trans_len (	get_jp_journal_max_trans_len (sb_jp(sb)),
-        					get_jp_journal_size (sb_jp(sb)),
-        					fs->fs_blocksize, 0));
-	    
- 	    set_jp_journal_max_trans_len (sb_jp(sb),
- 	    	advise_journal_max_trans_len (	get_jp_journal_max_trans_len (sb_jp(sb)),
-						get_jp_journal_size (sb_jp(sb)),
- 	    					fs->fs_blocksize, 0));
-        }
-	
-        if (get_jp_journal_max_batch (sb_jp(sb)) != 
-	    advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb)))) 
-	{
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max "
-		"batch size occured (%lu), fixed (%d)\n", 
-		get_jp_journal_max_batch (sb_jp(sb)), 
-		advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));
-	    
- 	    set_jp_journal_max_batch (sb_jp(sb), 
-		advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));
-        }
-
-        if (get_jp_journal_max_commit_age (sb_jp(sb)) != 
-	    advise_journal_max_commit_age()) 
-	{
- 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal "
-		"max commit age occured (%lu), fixed (%d)\n", 
- 	        get_jp_journal_max_commit_age (sb_jp(sb)), advise_journal_max_commit_age());
-	    
- 	    set_jp_journal_max_commit_age (sb_jp(sb), advise_journal_max_commit_age());
-        }
-	
-        if (get_jp_journal_max_trans_age (sb_jp(sb)) != advise_journal_max_trans_age()) {
- 	    fsck_log ("rebuild-sb: wrong journal  max commit age occured (%u), "
-		"fixed (%u)\n", get_jp_journal_max_trans_age (sb_jp(sb)), 
-		advise_journal_max_trans_age());
-	    
- 	    set_jp_journal_max_trans_age (sb_jp(sb), advise_journal_max_trans_age());
-        }
-		
-	j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
-
-	if (standard_journal == 0) {
-	    if (get_jp_journal_magic (sb_jp(sb)) == 0 || 
-		get_jp_journal_magic (sb_jp(sb)) == NEED_TUNE) 
-	    {
-		int magic;
-		
-		magic = random();
-		fsck_log ("rebuild-sb: genarate the new journal magic (%d)\n", magic);
-		set_jp_journal_magic (sb_jp(sb), magic);
-		set_jp_journal_magic (&j_head->jh_journal, magic);
-
-	    }
-	}
-	
-	retval = memcmp(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params));
-	
-	if (retval) {
-	    if (standard_journal == 1) {
-		fsck_log("\nrebuild-sb: You either have a corrupted journal or have just "
-		    "changed\nthe start of the partition with some partition table editor. "
-		    "If you are\nsure that the start of the partition is ok, rebuild the "
-		    "journal header.\n");
-	    } else if (!magic_was_found) {
-		fsck_log("\nrebuild-sb: journal header is not found. You either have "
-		    "a corrupted,\nbad configured(device/offset/size), not available "
-		    "journal or have just changed\nthe start of the journal partition "
-		    "with some partition table editor. In the \ncase of corrupted "
-		    "journal you need to use --no-journal-available. If you are\n"
-		    "sure that the start of the partition is ok and journal is "
-		    "available, rebuild\nthe journal header.\n");
-	    }
-	    
-	    if (standard_journal || !magic_was_found) {
-		if (!user_confirmed (stdout, "Do you want to rebuild the journal header? "
-		    "(y/n)[n]: ", "y\n"))
-		{
-		    exit(EXIT_USER);
-		} else 
-		    exit_code = EXIT_FIXED;
-	    }
-	    
-	    memcpy(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params));
-	    mark_buffer_dirty(fs->fs_jh_bh);
-	    bwrite (fs->fs_jh_bh);
-	}
-    }
-    
-    /*  whether journal header contains params with the same dev, offset, size will be 
-	checked in open_journal */
-
-    if (version == 1 || version == 3)
-        sb_size = SB_SIZE;
-    else
-        sb_size = SB_SIZE_V1;
-
-    if (ondisk_sb == NULL || 
-	memcmp(ondisk_sb, sb, sb_size - ((sb_size == SB_SIZE) ? 
-	    sizeof(fs->fs_ondisk_sb->s_unused) : 0))) 
-    {
-        /* smth was changed in SB or a new one has been built */
-	set_sb_fs_state (sb, get_sb_fs_state (sb) | FS_ERROR);
-	
-	if (ondisk_sb) {
-	    /* if super_block was found, we keep sb in ondisk_sb */
-	    fs->fs_ondisk_sb = ondisk_sb;
-	    memcpy (ondisk_sb, sb, sb_size);
-	    freemem(sb);
-	}
-
-	fflush(stdout); 
-	print_block (stderr, fs, fs->fs_super_bh);
-	
-	if (user_confirmed (stderr, "Is this ok ? (y/n)[n]: ", "y\n")) {
-	    mark_buffer_uptodate (fs->fs_super_bh, 1);
-	    mark_buffer_dirty (fs->fs_super_bh);
-	    bwrite (fs->fs_super_bh);
-	    fsck_progress ("The fs may still be unconsistent. Run reiserfsck --check.\n\n");
-	    exit_code = EXIT_FIXED;
-	} else {
-	    mark_buffer_clean (fs->fs_super_bh);
-	    fsck_progress ("Super block was not written\n");
-	}
-    } else {
-	print_block (stderr, fs, fs->fs_super_bh);
-	
-	mark_buffer_clean (fs->fs_super_bh);
-	fsck_progress ("\nSuper block seems to be correct\n\n");
-    }
-
-    exit(exit_code);
-}
-
-/*	if (version == 0) {
-	    brelse (fs->fs_super_bh);
-            freemem (fs);
-            close (fs->fs_dev);
-            fs = NULL;
-	}
-*/
diff --git a/fsck/ubitmap.c b/fsck/ubitmap.c
deleted file mode 100644
index 5d1e70a..0000000
--- a/fsck/ubitmap.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-/* g_disk_bitmap initially contains copy of disk bitmaps
-   (cautious version of it);
-
-   g_new_bitmap initially has marked only super block, bitmap blocks
-   and bits after the end of bitmap
-
-   in pass 1 we go through g_disk_bitmap. 
-
-   If block does not look like formatted node, we skip it.
-
-   If block contains internal node, put 0 in g_disk_bitmap if block is
-   not used in new tree yet.
-
-   If block contains leaf and is used already (by an indirect item
-   handled already to this time) save all items. They will be inserted
-   into tree after pass 1.
-
-   If block looking like leaf is not used in the new tree, try to
-   insert in into tree. If it is not possible, mark block in
-   g_uninsertable_leaf_bitmap. Blocks marked in this bitmap will be inserted into tree in pass 2. They can not be
-
-  This means, that in pass 1 when we have
-   found block containing the internal nodes we mark it in
-   g_disk_bitmap as free (reiserfs_free_internal_block). When block
-   gets into new tree it is marked in g_new_bitmap (mark_block_used)
-   When collecting resources for do_balance, we mark new blocks with
-   mark_block_used. After do_balance we unmark unused new blocks in
-   g_new_bitmap (bitmap.c:/reiserfs_free_block)
-
-   Allocating of new blocks: look for 0 bit in g_disk_bitmap
-   (find_zero_bit_in_bitmap), make sure, that g_new_bitmap contains 0
-   at the corresponding bit (is_block_used).
-      
- */
-
-
-
-/* is blocks used (marked by 1 in new bitmap) in the tree which is being built
-   (as leaf, internal, bitmap, or unformatted node) */
-int is_block_used (unsigned long block)
-{
-    return reiserfs_bitmap_test_bit (fsck_new_bitmap (fs), block);
-}
-
-void mark_block_used (unsigned long block, int check_hardware)
-{
-    if (!block)
-	return;
-    if (is_block_used (block)) {
-	if (check_hardware)
-	    check_memory_msg();
-	die ("mark_block_used: (%lu) used already", block);
-    }
-
-    reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), block);
-}
-
-
-void mark_block_free (unsigned long block)
-{
-    if (!is_block_used (block))
-	die ("mark_block_free: (%lu) is free already", block);
-
-    reiserfs_bitmap_clear_bit (fsck_new_bitmap (fs), block);
-}
-
-
-int is_block_uninsertable (unsigned long block)
-{
-    return !reiserfs_bitmap_test_bit (fsck_uninsertables (fs), block);
-}
-
-
-/* uninsertable block is marked by bit clearing */
-void mark_block_uninsertable (unsigned long block)
-{
-    if (is_block_uninsertable (block))
-	die ("mark_block_uninsertable: (%lu) is uninsertable already", block);
-
-    reiserfs_bitmap_clear_bit (fsck_uninsertables (fs), block);
-    /* we do not need thsi actually */
-    pass_1_stat (fs)->uninsertable_leaves ++;
-}
-
-
-/* FIXME: should be able to work around no disk space */
-int reiserfsck_reiserfs_new_blocknrs (reiserfs_filsys_t * fs,
-				      unsigned long * free_blocknrs,
-				      unsigned long start, int amount_needed)
-{
-    int i;
-
-    if (!are_there_allocable_blocks (amount_needed))
-	die ("out of disk space");
-    for (i = 0; i < amount_needed; i ++) {
-	free_blocknrs[i] = alloc_block ();
-	if (!free_blocknrs[i])
-	    die ("reiserfs_new_blocknrs: 0 is allocated");
-	mark_block_used (free_blocknrs[i], 0);
-    }
-    return CARRY_ON;
-}
-
-
-// FIXME: do you check readability of a block? If f_read fails - you
-// free block in bitmap or if you mark bad blocks used to avoid their
-// allocation in future you should have bad block counter in a super
-// block. Another minor issue: users of _get_new_buffer expect buffer
-// to be filled with 0s
-struct buffer_head * reiserfsck_get_new_buffer (unsigned long start)
-{
-    unsigned long blocknr = 0;
-    struct buffer_head * bh = NULL;
-
-    reiserfs_new_blocknrs (fs, &blocknr, start, 1);
-    bh = getblk (fs->fs_dev, blocknr, fs->fs_blocksize);
-    return bh;
-}
-
-
-/* free block in new bitmap */
-int reiserfsck_reiserfs_free_block (reiserfs_filsys_t * fs, unsigned long block)
-{
-    mark_block_free (block);
-
-    /* put it back to pool of blocks for allocation */
-    make_allocable (block);
-    return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/fsck/ufile.c b/fsck/ufile.c
deleted file mode 100644
index 65a8533..0000000
--- a/fsck/ufile.c
+++ /dev/null
@@ -1,1222 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-static int do_items_have_the_same_type (struct item_head * ih, struct key * key)
-{
-    return (get_type (&ih->ih_key) == get_type (key)) ? 1 : 0;
-}
-
-static int are_items_in_the_same_node (struct path * path)
-{
-  return (PATH_LAST_POSITION (path) < B_NR_ITEMS (PATH_PLAST_BUFFER (path)) - 1) ? 1 : 0;
-}
-
-static void cut_last_unfm_pointer (struct path * path, struct item_head * ih)
-{
-    set_ih_free_space(ih, 0);
-    if (I_UNFM_NUM (ih) == 1)
-	reiserfsck_delete_item (path, 0);
-    else
-	reiserfsck_cut_from_item (path, -((int)UNFM_P_SIZE));
-}
-
-/*
-    if this is not a symlink - make it of_this_size;
-    otherwise find a size and return it in symlink_size;
-*/
-static unsigned long indirect_to_direct (struct path * path, __u64 len, int symlink)
-{
-    struct buffer_head * bh = PATH_PLAST_BUFFER (path);
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-    __u32 unfm_ptr;
-    struct buffer_head * unfm_bh = 0;
-    struct item_head ins_ih;
-    char * buf;
-    char bad_drct[fs->fs_blocksize];
-
-    /* direct item to insert */
-    memset (&ins_ih, 0, sizeof (ins_ih));
-    if (symlink) {
-	set_ih_key_format (&ins_ih, KEY_FORMAT_1);
-    } else {
-	set_ih_key_format (&ins_ih, get_ih_key_format (ih));
-    }
-    set_key_dirid (&ins_ih.ih_key, get_key_dirid (&ih->ih_key));
-    set_key_objectid (&ins_ih.ih_key, get_key_objectid (&ih->ih_key));
-    set_type_and_offset (get_ih_key_format (&ins_ih), &ins_ih.ih_key,
-			 get_offset (&ih->ih_key) + (I_UNFM_NUM (ih) - 1) * bh->b_size, 
-			 TYPE_DIRECT);
-
-    // we do not know what length this item should be
-    unfm_ptr = d32_get ((__u32 *)get_item (path), I_UNFM_NUM (ih) - 1);
-    if (unfm_ptr && (unfm_bh = bread (bh->b_dev, unfm_ptr, bh->b_size))) {
-        /* we can read the block */
-	buf = unfm_bh->b_data;
-	
-    } else {
-        /* we cannot read the block */
- 	if (unfm_ptr)
-	    fsck_log ("indirect_to_direct: Reading of the block (%lu), pointed to by the file %K, failed\n", 
-		unfm_ptr, &ih->ih_key);
-	memset (bad_drct, 0, fs->fs_blocksize);
-	buf = bad_drct;
-    }
-/*
-    if (len > MAX_DIRECT_ITEM_LEN (fs->fs_blocksize)) {
-	fsck_log ("indirect_to_direct: canot create such a long item %d (%K), "
-	    "Cutting it down to %d byte\n", len,  &ih->ih_key, MAX_DIRECT_ITEM_LEN (fs->fs_blocksize) - 8);
-	len = MAX_DIRECT_ITEM_LEN (fs->fs_blocksize) - 8;
-    }
-    
-    if (!len) {
-	buf = bad_link;
-	len = strlen (bad_link);
-    }
-*/
-    set_ih_item_len (&ins_ih, (get_ih_key_format (ih) == KEY_FORMAT_2) ? ROUND_UP(len) : len);
-    set_ih_free_space (&ins_ih, MAX_US_INT);
-
-    mark_ih_become_tail(ih);
-    mark_buffer_dirty(bh);
-    // last last unformatted node pointer
-    path->pos_in_item = I_UNFM_NUM (ih) - 1;
-    cut_last_unfm_pointer (path, ih);
-
-    /* insert direct item */
-    if (reiserfs_search_by_key_4 (fs, &(ins_ih.ih_key), path) == ITEM_FOUND)
-	reiserfs_panic ("indirect_to_direct: The direct item %k should not exist yet.", &(ins_ih.ih_key));
-    reiserfsck_insert_item (path, &ins_ih, (const char *)(buf));
-
-    brelse (unfm_bh);
-
-    /* put to stat data offset of first byte in direct item */
-    return get_offset (&ins_ih.ih_key); //offset;
-}
-
-/*  start_key is the key after which N items need to be deleted
-    save_here is a pointer where deleted items need to be saved if save is set.
-    start_key is the first undeleted item.
-    return whether we are sure there is nothing else of this file
- */
-int delete_N_items_after_key(struct key * start_key, struct si ** save_here, int skip_dir_items, int n_to_delete) {
-    struct path path;
-//    struct key key = *start_key;
-    struct key * rkey;
-    int count = 0;
-
-    while (1) {
-	reiserfs_search_by_key_4 (fs, start_key, &path);
-	
-	if (get_item_pos (&path) == B_NR_ITEMS (get_bh (&path))) {
-	    rkey = uget_rkey (&path);
-	    if (rkey && !not_of_one_file (start_key, rkey)) {
-		/* file continues in the right neighbor */
-		copy_key (start_key, rkey);
-		pathrelse (&path);
-		continue;
-	    }
-	    /* there is no more items with this key */
-	    pathrelse (&path);
-	    return 1;
-	}
-
-	if (is_stat_data_ih (get_ih(&path)))
-	    fix_obviously_wrong_sd_mode (&path);
-	    	
-	rkey = &(get_ih (&path))->ih_key;
-	if (not_of_one_file (start_key, rkey)) {
-	    /* there are no more item with this key */
-	    pathrelse (&path);
-	    return 1;
-	}
-
-	copy_key (start_key, rkey);
-	/* ok, item found, but make sure that it is not a directory one */
-	if ((is_stat_data_key (rkey) && !not_a_directory (get_item (&path))) ||
-	    (is_direntry_key (rkey)))
-	{
-	    if (skip_dir_items) {
-	    	/* item of directory found. Leave it in the tree */
-	    	set_offset (KEY_FORMAT_1, start_key, get_offset (start_key) + 1);
-	    	pathrelse (&path);
-	    	continue;
-	    } else {
-	    	reiserfs_panic ("delete_N_items_after_key: No directory item of %K are "
-		    "expected", start_key);
-	    }
-	}
-	if (save_here != NULL)
-	    *save_here = save_and_delete_file_item (*save_here, &path);
-	else
-	    reiserfsck_delete_item (&path, 0);
-
-     	count++;
-
-    	if (count == n_to_delete)
-	    break;
-
-	pathrelse (&path);
-    }
-
-    return 0;
-}
-
-/* returns 1 when file looks correct, -1 if directory items appeared
-   there, 0 - only holes in the file found */
-/* when it returns, key->k_offset is offset of the last item of file */
-/* sd_size is zero if we do not need to convert any indirect to direct */
-int are_file_items_correct (struct item_head * sd_ih, void * sd, __u64 * size, __u32 * blocks,
-				int mark_passed_items, int * symlink)
-{
-    struct path path;
-    struct item_head * ih;
-    struct key * next_key, * key;
-    __u32 sd_first_direct_byte = 0;
-    __u64 sd_size;
-    unsigned int i;
-    int retval, was_tail = 0;
-    int had_direct = 0;
-    int key_version = get_ih_key_format (sd_ih);
-    int next_is_another_object = 0;
-    __u64 last_unfm_offset = 0;
-    int will_convert = 0;
-    int should_convert;
-
-    should_convert = (fsck_mode (fs) != FSCK_REBUILD) || mark_passed_items;
-    key = &sd_ih->ih_key;
-    get_sd_size (sd_ih, sd, &sd_size);
-
-    if (key_version == KEY_FORMAT_1)
-    	get_sd_first_direct_byte (sd_ih, sd, &sd_first_direct_byte);
-
-    set_offset (key_version, key, 1);
-    set_type (key_version, key, TYPE_DIRECT);
-
-    /* correct size and st_blocks */
-    *size = 0;
-    *blocks = 0;
-
-    path.path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-
-    do {
-	retval = usearch_by_position (fs, key, key_version, &path);
-	if (retval == POSITION_FOUND && path.pos_in_item != 0)
-	    die ("are_file_items_correct: All bytes we look for must be first items byte (position 0).");
-
-	switch (retval) {
-	case POSITION_FOUND:/**/
-
-	    ih = PATH_PITEM_HEAD (&path);
-
-	    if (ih_was_tail (ih)) {
-	    	was_tail = 1;
-	    }
-	
-	    set_type (key_version, key, get_type (&ih->ih_key));
-	
-	    if (mark_passed_items == 1) {
-		mark_item_reachable (ih, PATH_PLAST_BUFFER (&path));
-	    }
-	
-	    // does not change path
-	    next_key = reiserfs_next_key(&path);
-
-	    if (next_key == 0 || not_of_one_file (key, next_key) || 
-		(!is_indirect_key (next_key) && !is_direct_key(next_key))) 
-	    {
-		next_is_another_object = 1;
-		will_convert = (is_indirect_ih (ih) && sd_size && (I_UNFM_NUM (ih) > 0));
-		if (will_convert) {
-		    last_unfm_offset = get_offset (key) + fs->fs_blocksize * (I_UNFM_NUM (ih) - 1);
-		    /* if symlink or
-		       [ 1. sd_size points somewhere into last unfm block
-		         2. one item of the file was direct before for 3_6 || FDB points to the tail correctly for 3_5
-		         3. we can have a tail in the file of a such size ] */
-		    will_convert = will_convert && (sd_size >= last_unfm_offset) && 
-			(sd_size < last_unfm_offset + fs->fs_blocksize) && 
-			!STORE_TAIL_IN_UNFM (sd_size, sd_size - last_unfm_offset + 1, fs->fs_blocksize);
-		    
-		    will_convert = will_convert && (*symlink || ((key_version == KEY_FORMAT_1) && 
-			(sd_first_direct_byte == last_unfm_offset)) || ((key_version == KEY_FORMAT_2) && was_tail));
-		}
-	    }
-
-	    if (should_convert) {
-		*symlink = *symlink && (will_convert || is_direct_key(&ih->ih_key));
-	    
-		if (!(*symlink) && key_version != get_ih_key_format (ih)) {
-		    if (fsck_mode(fs) == FSCK_CHECK) {
-			fsck_log("are_file_items_correct: vpf-10250: block %lu, item (%d): The item format (%H)"\
-			    " is not equal to SD format (%d)\n",
-			    get_bh(&path)->b_blocknr, PATH_LAST_POSITION(&path), ih, key_version);
-			one_more_corruption (fs, FIXABLE);
-		    } else {
-			fsck_log("are_file_items_correct: vpf-10280: block %lu, item (%d): The item format (%H)"\
-			    " is not equal to SD format (%d) - fixed.\n",
-			    get_bh(&path)->b_blocknr, PATH_LAST_POSITION(&path), ih, key_version);
-		
-
-			set_type_and_offset (key_version, &ih->ih_key, get_offset (&ih->ih_key), get_type (&ih->ih_key));
-			set_ih_key_format(ih, key_version);
-			mark_buffer_dirty(get_bh(&path));
-		    }
-		}
-
-		if (*symlink && is_direct_key(&ih->ih_key)) {
-		    /* symlink. Check that it is of KEY_FORMAT_1 */
-		    if (fsck_mode(fs) == FSCK_CHECK) {
-			if ((get_ih_key_format(ih) != KEY_FORMAT_1) || (key_format(&ih->ih_key) != KEY_FORMAT_1)) {
-			    fsck_log("are_file_items_correct: vpf-10732: block %lu, item (%d): The symlink format (%H)"\
-				" is not equal to 3.5 format (%d)\n", get_bh(&path)->b_blocknr, PATH_LAST_POSITION(&path), 
-				ih, KEY_FORMAT_1);
-			    one_more_corruption (fs, FIXABLE);
-			}
-		    } else {
-			if ((get_ih_key_format(ih) != KEY_FORMAT_1) || (key_format(&ih->ih_key) != KEY_FORMAT_1)) {
-			    fsck_log("are_file_items_correct: vpf-10732: block %lu, item (%d): The symlink format (%H)"\
-				" is not equal to 3.5 format (%d)\n", get_bh(&path)->b_blocknr, PATH_LAST_POSITION(&path), 
-				ih, KEY_FORMAT_1);
-			    set_type_and_offset(KEY_FORMAT_1, &ih->ih_key, get_offset(&ih->ih_key), get_type(&ih->ih_key));
-			    set_ih_key_format(ih, KEY_FORMAT_1);
-			    mark_buffer_dirty(get_bh(&path));
-			}
-			
-		    }
-		}
-		
-		if (will_convert)
-		    *size = sd_size;
-		else
-		    *size = get_offset (&ih->ih_key) + get_bytes_number (ih, fs->fs_blocksize) - 1;
-	    
-		if (get_type (&ih->ih_key) == TYPE_INDIRECT) {
-		    if (*symlink) /* symlinks must be calculated as dirs */
-			*blocks = dir_size2st_blocks (*size);
-		    else
-			for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-			    __u32 * ind = (__u32 *)get_item(&path);
-
-			    if (d32_get(ind, i) != 0)
-				*blocks += (fs->fs_blocksize >> 9);
-			}
-		} else if (get_type (&ih->ih_key) == TYPE_DIRECT) {
-		    if (*symlink) /* symlinks must be calculated as dirs */
-			*blocks = dir_size2st_blocks (*size);
-		    else if (!had_direct)
-			*blocks += (fs->fs_blocksize >> 9);
-
-		    /* calculate only the first direct byte */
-		    had_direct++;
-		}
-	    }
-
-	    if (next_is_another_object) 
-            {
-		/* next item does not exists or is of another object,
-                   therefore all items of file are correct */
-		if (will_convert) {
-		    if (fsck_mode (fs) == FSCK_CHECK) {
-			/* here it can be symlink only */
-			fsck_log ("are_file_items_correct: The indirect item should be converted back"
-			    " to direct %K\n", &ih->ih_key);
-			one_more_corruption (fs, FIXABLE);
-			pathrelse (&path);
-		    } else {
-			__u32 * ind = (__u32 *)get_item(&path);
-			/*   DEBUG message.
-			fsck_log ("are_file_items_correct: The indirect item is converted back to direct %K\n", &ih->ih_key);
-			*/
-			if (d32_get(ind, I_UNFM_NUM (ih) - 1) == 0)
-			    *blocks += (fs->fs_blocksize >> 9);
-
-			/* path is released here. */
-			sd_first_direct_byte = indirect_to_direct (&path, sd_size - last_unfm_offset + 1, *symlink);
-			/* last item of the file is direct item */
-			set_offset (key_version, key, sd_first_direct_byte);
-			set_type (key_version, key, TYPE_DIRECT);
-		    }
-		} else 
-		    pathrelse (&path);
-		
-		return 1;
-	    }
-
-	    /* next item is item of this file */
-	    if (get_offset (&ih->ih_key) + get_bytes_number(ih, fs->fs_blocksize) != get_offset (next_key))
-	    {		
-		/* next item has incorrect offset (hole or overlapping) */
-		pathrelse (&path);
-		return 0;
-	    }
-	    if (do_items_have_the_same_type (ih, next_key) == 1 && are_items_in_the_same_node (&path) == 1) 
-	    {
-		/* two indirect items or two direct items in the same leaf. FIXME: Second will be deleted */
-		pathrelse (&path);
-		return 0;
-	    }
-
-	    /* items are of different types or are in different nodes */
-/*
-	    if (get_offset (&ih->ih_key) + get_bytes_number (ih, fs->fs_blocksize) != get_offset (next_key))
-            {
-		// indirect item free space is not set properly 
-		if (!is_indirect_ih (ih) ) //|| get_ih_free_space(ih) == 0)
-		    fsck_log ("are_file_items_correct: "
-			      "item must be indirect and must have invalid free space (%H)", ih);
-	
-                if (fsck_mode (fs) == FSCK_REBUILD)
-                {		
-                    set_ih_free_space(ih, 0);
-                    mark_buffer_dirty (PATH_PLAST_BUFFER (&path));
-        	}
-	    }
-*/
-	    /* next item exists */
-	    set_type_and_offset(key_version, key, get_offset (next_key), get_type(next_key));
-	
-	    if (comp_keys (key, next_key))
-		reiserfs_panic ("are_file_items_correct: Internal tree is in inconsistent state, "
-		    "the current item key %K and the next key %K must match", key, next_key);
-	    pathrelse (&path);
-	    break;
-
-	case POSITION_NOT_FOUND:
-	    /* We always must have next key found. Exception is first byte. It does not have to exist */
-	    if (get_offset (key) != 1)
-		reiserfs_panic ("are_file_items_correct: Position (offset == %llu) in the middle of"
-		    "the file %K was not found.", get_offset(key), key);
-	    pathrelse (&path);
-	    return 0;
-      
-	case FILE_NOT_FOUND:
-	    if (get_offset (key) != 1)
-		reiserfs_panic ("are_file_items_correct: File %K must be found as we found its StatData.", key);
-	    pathrelse (&path);
-	    return 1;
-
-	case DIRECTORY_FOUND:
-	    pathrelse (&path);
-	    return -1;
-	}
-    } while (1);
-
-    die ("are_file_items_correct: Cannot reach here");
-    return 0;
-}
-
-
-/* delete all items and put them back (after that file should have
-   correct sequence of items.
-   if should_relocate is specified then it relocates items to a new id.
-   if should_change_ih is specified then the key in ih is changed also. */
-void rewrite_file (struct item_head * ih, int should_relocate, int should_change_ih)
-{
-    struct key key;
-    struct si * si;
-    __u32 new_objectid = 0;
-    int moved_items;
-    struct key old, new;
-    int nothing_else = 0;
-
-    /* starting with the leftmost one - look for all items of file,
-       store and delete and  */
-    key = ih->ih_key;
-    set_type_and_offset (KEY_FORMAT_1, &key, SD_OFFSET, TYPE_STAT_DATA);
-
-    si = 0;
-    nothing_else = 0;
-
-    nothing_else = delete_N_items_after_key (&key, &si, should_relocate /* do not skip dir items */, 10);
-
-    if (should_relocate && (si || should_change_ih)) {
-	/* get new objectid for relocation or get objectid with which file
-	   was relocated already */
-	new_objectid = objectid_for_relocation (&ih->ih_key);
-	if (should_change_ih)
-	    set_key_objectid (&ih->ih_key, new_objectid);
-	
-	if (si) {
-	   old = si->si_ih.ih_key;
-	   set_key_objectid (&(si->si_ih.ih_key), new_objectid);
-	   new = si->si_ih.ih_key;
-	}
-    }
-
-    moved_items = 0;
-
-    while (si) {
-        while (si && (nothing_else || si->si_next)) {
-            if (should_relocate) {
-	    	set_key_objectid (&(si->si_ih.ih_key), new_objectid);
-	    	moved_items ++;
-	    }
-
-	    insert_item_separately (&(si->si_ih), si->si_dnm_data, 1/*was in tree*/);
-	    si = remove_saved_item (si);
-	}
-	if (!nothing_else)
-	    nothing_else = delete_N_items_after_key (&key, &si, should_relocate /* do not skip dir items */, 10);
-    }
-
-    if (moved_items)
-	fsck_log ("rewrite_file: %d items of file %K moved to %K\n",
-	      moved_items, &old, &new);
-
-}
-
-/* file must have correct sequence of items and tail must be stored in
-   unformatted pointer;
-   pos in bh is a position of SD */
-static int make_file_writeable (struct buffer_head * bh, int pos)
-/* struct item_head * sd_ih, void * sd */
-{
-    struct item_head *sd_ih = B_N_PITEM_HEAD (bh, pos);
-    struct item_head  sd_ih_copy;
-    struct stat_data *sd = (struct stat_data *)B_N_PITEM (bh, pos);
-    struct stat_data  sd_copy;
-    __u64 size;
-    __u32 blocks;
-    __u16 mode;
-    int   retval, symlink;
-
-    sd_ih_copy = *sd_ih;
-    memcpy (&sd_copy, sd, get_ih_item_len (sd_ih));
-    get_sd_mode (sd_ih, sd, &mode);
-    symlink = S_ISLNK(mode);
-
-    if (ih_writable(sd_ih))
-	return 1;
-    else {
-    	mark_ih_writable(sd_ih);
-	mark_buffer_dirty (bh);
-    }
-
-    retval = are_file_items_correct (&sd_ih_copy, &sd_copy, &size, &blocks, 0/*do not mark accessed*/, &symlink);
-    if (retval == 1)
-	/* file looks correct */
-	return 1;
-
-    rewrite_file (sd_ih, 0, 0);
-    /*fsck_data (fs)->rebuild.rewritten ++;*/
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-    size = 0;
-
-    if (are_file_items_correct (&sd_ih_copy, &sd_copy, &size, &blocks, 0/*do not mark accessed*/, &symlink) == 0) {
-	fsck_log("WARNING: file was rewritten but still is not correct %K\n", &sd_ih->ih_key);
-	return -1;
-    }
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-    return 1;
-}
-
-
-/* this inserts __first__ indirect item (having k_offset == 1 and only
-   one unfm pointer) into tree */
-static int create_first_item_of_file (struct item_head * ih, char * item, struct path * path, int was_in_tree)
-{
-    __u32 unfm_ptr;
-    __u32 * ni = 0;
-    struct buffer_head * unbh;
-    struct item_head indih;
-    unsigned int i;
-    int retval;
-
-    mark_item_unreachable (&indih);
-
-    copy_key (&(indih.ih_key), &(ih->ih_key));
-    set_ih_item_len (&indih, UNFM_P_SIZE);
-
-    set_ih_free_space (&indih, 0);
-    if (get_offset (&ih->ih_key) > fs->fs_blocksize) {
-	/* insert indirect item containing 0 unfm pointer */
-	unfm_ptr = 0;
-	retval = 0;
-    } else {
-	if (is_direct_ih (ih)) {
-	    /* copy direct item to new unformatted node. Save information about it */
-	    int len = get_bytes_number (ih, fs->fs_blocksize);
-
-	    unbh = reiserfsck_get_new_buffer (PATH_PLAST_BUFFER (path)->b_blocknr);
-	    memset (unbh->b_data, 0, unbh->b_size);
-	    unfm_ptr = cpu_to_le32 (unbh->b_blocknr);
-	    memcpy (unbh->b_data + get_offset (&ih->ih_key) - 1, item, len);
-
-	    set_ih_free_space (&indih, fs->fs_blocksize - 
-			       len - (get_offset (&ih->ih_key) - 1));
-	    
-	    mark_ih_was_tail (&indih);
-	    mark_buffer_dirty (unbh);
-	    mark_buffer_uptodate (unbh, 1);
-	    brelse (unbh);
-
-	    retval = len;
-	} else {
-	    /* take first unformatted pointer from an indirect item */
-	    //free_sp = ih_get_free_space(0, ih, item);
-
-	    set_ih_item_len (&indih, get_ih_item_len (ih));
-	    ni = getmem (get_ih_item_len (ih));
-	    memcpy (ni, (item), get_ih_item_len (ih));
-
-	    if (!was_in_tree) {
-		for (i = 0; i < I_UNFM_NUM (ih); i++) {
-		    if (still_bad_unfm_ptr_2 (d32_get(ni, i)))
-			reiserfs_panic ("create_first_item_of_file: The file %K has a pointer to the bad block (%u)", 
-			    &ih->ih_key, d32_get(ni, i));
-		    mark_block_used (d32_get(ni, i), 0);
-		}
-	    }
-
-	    retval = fs->fs_blocksize * get_ih_item_len (ih) / UNFM_P_SIZE;
-	}
-    }
-
-    set_ih_key_format (&indih, get_ih_key_format (ih));
-    //ih_version(&indih) = ih_version(ih);
-    set_offset (key_format (&(ih->ih_key)), &indih.ih_key, 1);
-    set_type (key_format (&(ih->ih_key)), &indih.ih_key, TYPE_INDIRECT);
-
-    if (ni) {
-	reiserfsck_insert_item (path, &indih, (const char *)ni);
-	freemem (ni);
-    } else {
-	reiserfsck_insert_item (path, &indih, (const char *)&unfm_ptr);
-    }
-
-    return retval;
-}
-
-
-/* path points to first part of tail. Function copies file tail into unformatted node and returns
-   its block number. */
-/* we convert direct item that is on the path to indirect. we need a number of free block for
-   unformatted node. reiserfs_new_blocknrs will start from block number returned by this function */
-static unsigned long block_to_start (struct path * path)
-{
-  struct buffer_head * bh;
-  struct item_head * ih;
-  __u32 blk;
-
-  bh = PATH_PLAST_BUFFER (path);
-  ih = PATH_PITEM_HEAD (path);
-  if (get_offset(&ih->ih_key) == 1 || PATH_LAST_POSITION (path) == 0)
-    return bh->b_blocknr;
-
-  ih --;
-  blk = d32_get((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1);
-  return (blk ? blk : bh->b_blocknr);
-}
-
-
-static void direct2indirect2 (unsigned long unfm, struct path * path)
-{
-    struct item_head * ih;
-    struct key key;
-    struct buffer_head * unbh;
-    __u32 ni;
-    int copied = 0;
-    int file_format;
-
-    ih = PATH_PITEM_HEAD (path);
-    copy_key (&key, &(ih->ih_key));
-
-    file_format = key_format (&key);
-
-    if (get_offset (&key) % fs->fs_blocksize != 1) {
-	/* look for first part of tail */
-	pathrelse (path);
-	set_offset (file_format, &key, (get_offset (&key) & ~(fs->fs_blocksize - 1)) + 1);	
-	if (reiserfs_search_by_key_4 (fs, &key, path) != ITEM_FOUND)
-	    die ("direct2indirect: can not find first part of tail");
-    }
-
-    unbh = reiserfsck_get_new_buffer (unfm ? unfm : block_to_start (path));
-    memset (unbh->b_data, 0, unbh->b_size);
-
-    /* delete parts of tail coping their contents to new buffer */
-    do {
-	__u64 len;
-
-	ih = PATH_PITEM_HEAD (path);
-	
-	len = get_bytes_number(ih, fs->fs_blocksize);
-	
-	memcpy (unbh->b_data + copied, B_I_PITEM (PATH_PLAST_BUFFER (path), ih), len);
-
-//	save_unfm_overwriting (unbh->b_blocknr, ih);
-	copied += len;	
-	set_offset (file_format, &key, get_offset (&key) +  len);
-
-	reiserfsck_delete_item (path, 0);
-	
-    } while (reiserfs_search_by_key_4 (fs, &key, path) == ITEM_FOUND);
-
-    pathrelse (path);
-
-
-    /* paste or insert pointer to the unformatted node */
-    set_offset (file_format, &key, get_offset (&key) - copied);
-//    set_offset (ih_key_format (ih), &key, get_offset (&key) - copied);
-//  key.k_offset -= copied;
-    ni = cpu_to_le32 (unbh->b_blocknr);
-
-
-    if (usearch_by_position (fs, &key, file_format, path) == FILE_NOT_FOUND) {
-	struct item_head insih;
-
-	copy_key (&(insih.ih_key), &key);
-	set_ih_key_format (&insih, file_format);
-	set_type (get_ih_key_format (&insih), &insih.ih_key, TYPE_INDIRECT);
-	set_ih_free_space (&insih, 0);
-	mark_item_unreachable (&insih);
-	set_ih_item_len (&insih, UNFM_P_SIZE);
-	mark_ih_was_tail (&insih);
-	reiserfsck_insert_item (path, &insih, (const char *)&(ni));
-    } else {
-	ih = PATH_PITEM_HEAD (path);
-
-	if (!is_indirect_ih(ih))
-	    reiserfs_panic ("%s: The item, which is supposed to be deleted, found in the tree - %k", 
-		__FUNCTION__, &ih->ih_key);
-	if (get_bytes_number (ih, fs->fs_blocksize) + get_offset (&ih->ih_key) != get_offset (&key))	
-	    reiserfs_panic ("%s: The item %k with the wrong offset found in the block %lu block", 
-		__FUNCTION__, &ih->ih_key, PATH_PLAST_BUFFER(path)->b_blocknr);
-	
-	mark_ih_was_tail (ih);
-	mark_buffer_dirty (get_bh(path));
-	reiserfsck_paste_into_item (path, (const char *)&ni, UNFM_P_SIZE);
-    }
-
-    mark_buffer_dirty (unbh);
-    mark_buffer_uptodate (unbh, 1);
-    brelse (unbh);
-
-    if (usearch_by_position (fs, &key, file_format, path) != POSITION_FOUND ||
-	!is_indirect_ih (PATH_PITEM_HEAD (path)))
-	reiserfs_panic ("direct2indirect: The data %k, which are supposed to be converted, are not found", &key);
-    return;
-}
-
-
-
-
-static int append_to_unformatted_node (struct item_head * comingih, struct item_head * ih, char * item,
-                                        struct path * path, unsigned int coming_len)
-{
-    struct buffer_head * bh, * unbh = NULL;
-    __u64 end_of_data, free_space;
-    __u16 offset = get_offset (&comingih->ih_key) % fs->fs_blocksize - 1;
-    __u32 unfm_ptr;
-    int zero_number;
-    
-    bh = PATH_PLAST_BUFFER (path);
-    unfm_ptr = d32_get ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1);
-
-    /* append to free space of the last unformatted node of indirect item ih */
-    free_space = get_offset (&ih->ih_key) + fs->fs_blocksize * I_UNFM_NUM (ih) - get_offset (&comingih->ih_key);
-	
-    if (free_space < coming_len)
-	reiserfs_panic ("%s: block %lu: The unformatted node %u, pointed by the file %k, does not have enough free space"
-	    "for appending %llu bytes", __FUNCTION__, bh->b_blocknr, unfm_ptr, &ih->ih_key, coming_len);
-	
-    if (fs->fs_blocksize < free_space)
-	reiserfs_panic ("%s: block %lu: The unformatted node %u, pointed by the file %k, does not have enough free space"
-	    "for appending %llu bytes", __FUNCTION__, bh->b_blocknr, &ih->ih_key, unfm_ptr, &ih->ih_key, coming_len);	
-    
-    end_of_data = fs->fs_blocksize - free_space;
-    zero_number = offset - end_of_data;
-
-    if (unfm_ptr && !not_data_block (fs, unfm_ptr)) {
-	unbh = bread (fs->fs_dev, unfm_ptr, fs->fs_blocksize);
-	if (!is_block_used (unfm_ptr))
-	    reiserfs_panic ("%s: block %lu: The unformatted node %u, pointed by the file %k, is marked as unused", 
-		__FUNCTION__, bh->b_blocknr, unfm_ptr, &ih->ih_key);
-
-	if (unbh == 0)
-	    unfm_ptr = 0;
-    }
-    
-    if (!unfm_ptr || not_data_block (fs, unfm_ptr)) {
-	/* indirect item points to block which can not be pointed or to 0, in
-           any case we have to allocate new node */
-	/*if (unfm_ptr == 0 || unfm_ptr >= SB_BLOCK_COUNT (fs)) {*/
-	unbh = reiserfsck_get_new_buffer (bh->b_blocknr);
-	memset (unbh->b_data, 0, unbh->b_size);
-	d32_put ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1, unbh->b_blocknr);
-	/*mark_block_unformatted (unbh->b_blocknr);*/
-	mark_buffer_dirty (bh);
-    }
-    memset (unbh->b_data + end_of_data, 0, zero_number);
-    memcpy (unbh->b_data + offset, item, coming_len);
-
-//    save_unfm_overwriting (unbh->b_blocknr, comingih);
-
-    free_space -= (zero_number + coming_len);
-    set_ih_free_space(ih, get_ih_free_space(ih) - (zero_number + coming_len));
-    memset (unbh->b_data + offset + coming_len, 0, free_space);
-//  mark_buffer_uptodate (unbh, 0);
-    mark_buffer_uptodate (unbh, 1);
-    mark_buffer_dirty (unbh);
-    brelse (unbh);
-    pathrelse (path);
-    return coming_len;
-}
-
-/* this appends file with one unformatted node pointer (since balancing
-   algorithm limitation). This pointer can be 0, or new allocated block or
-   pointer from indirect item that is being inserted into tree */
-int reiserfsck_append_file (struct item_head * comingih, char * item, int pos, struct path * path,
-			    int was_in_tree)
-{
-    __u32 * ni;
-    struct buffer_head * unbh;
-    int retval;
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-    __u32 bytes_number;
-    int i, count = 0;
-
-    if (!is_indirect_ih (ih))
-	reiserfs_panic ("reiserfsck_append_file: Operation is not allowed for non-indirect item %k", &ih->ih_key);
-
-    if (is_direct_ih (comingih)) {
-	unsigned int coming_len = get_bytes_number (comingih, fs->fs_blocksize);
-
-	if (get_offset (&comingih->ih_key) < get_offset (&ih->ih_key) + fs->fs_blocksize * I_UNFM_NUM (ih)) {
-	    /* direct item fits to free space of indirect item */
-	    return append_to_unformatted_node (comingih, ih, item, path, coming_len);
-	}
-
-	unbh = reiserfsck_get_new_buffer (PATH_PLAST_BUFFER (path)->b_blocknr);
-	memset (unbh->b_data, 0, unbh->b_size);
-	memcpy (unbh->b_data + get_offset (&comingih->ih_key) % unbh->b_size - 1, item, coming_len);
-
-
-	mark_buffer_dirty (unbh);
-	mark_buffer_uptodate (unbh, 1);
-
-	ni = getmem (UNFM_P_SIZE);
-	d32_put (ni, 0, unbh->b_blocknr);
-	count = 1;
-	
-	brelse (unbh);
-	retval = coming_len;
-    } else {
-	/* coming item is indirect item */
-
-	bytes_number = get_bytes_number (ih, fs->fs_blocksize);
-	if (get_offset (&comingih->ih_key) + pos * fs->fs_blocksize != get_offset (&ih->ih_key) + bytes_number)
-	    reiserfs_panic ("reiserfsck_append_file: file %K: Cannot append indirect pointers of the offset "
-		"(%LLu) at the position %LLu\n", &comingih->ih_key, get_offset (&comingih->ih_key) + pos * fs->fs_blocksize, 
-		get_offset (&ih->ih_key) + bytes_number);
-
-	/* take unformatted pointer from an indirect item */
-	count = I_UNFM_NUM(comingih) - pos;
-	ni = getmem (count * UNFM_P_SIZE);
-	memcpy (ni, (item + pos * UNFM_P_SIZE), count * UNFM_P_SIZE);
-	
-	if (!was_in_tree) {
-	    for (i = 0; i < count; i++ ) {
-		if (still_bad_unfm_ptr_2 (d32_get (ni, i)))
-		    die ("reiserfsck_append_file: Trying to insert a pointer to illegal block (%u)", d32_get (ni, i));
-		mark_block_used (d32_get (ni, i), 0);
-	    }
-	}
-
-	retval = fs->fs_blocksize * count;
-    }
-
-    reiserfsck_paste_into_item (path, (const char *)ni, count * UNFM_P_SIZE);
-    freemem (ni);
-    return retval;
-}
-
-long long int must_there_be_a_hole (struct item_head * comingih, struct path * path)
-{
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-
-    if (is_direct_ih (ih)) {
-	direct2indirect2 (0, path);
-	ih = PATH_PITEM_HEAD (path);
-    }
-
-    path->pos_in_item = I_UNFM_NUM (ih);
-
-    return (get_offset (&comingih->ih_key) - get_offset (&ih->ih_key)) / fs->fs_blocksize - I_UNFM_NUM (ih);
-/*
-    if (get_offset (&ih->ih_key) + (I_UNFM_NUM (ih) + 1) * fs->fs_blocksize <= get_offset (&comingih->ih_key))
-	return 1;
-
-    return 0;*/
-}
-
-
-int reiserfs_append_zero_unfm_ptr (struct path * path, long long int p_count)
-{
-    __u32 * ni;
-    long long int count;
-
-    if (is_direct_ih (PATH_PITEM_HEAD (path)))
-	/* convert direct item to indirect */
-	direct2indirect2 (0, path);
-	
-    count = MAX_INDIRECT_ITEM_LEN (fs->fs_blocksize) / UNFM_P_SIZE;
-    	
-    if (p_count <= count)
-       count = p_count;
-
-    ni = getmem (count * UNFM_P_SIZE);
-    memset (ni, 0, count * UNFM_P_SIZE);
-
-    reiserfsck_paste_into_item (path, (const char *)ni, count * UNFM_P_SIZE);
-    freemem(ni);
-    return 0;
-}
-
-
-/* write direct item to unformatted node */
-/* coming item is direct */
-static int overwrite_by_direct_item (struct item_head * comingih, char * item, struct path * path)
-{
-    __u32 unfm_ptr;
-    struct buffer_head * unbh, * bh;
-    struct item_head * ih;
-    int offset;
-    __u64 coming_len = get_bytes_number (comingih, fs->fs_blocksize);
-
-
-    bh = PATH_PLAST_BUFFER (path);
-    ih = PATH_PITEM_HEAD (path);
-
-    unfm_ptr = d32_get ((__u32 *)B_I_PITEM(bh, ih), path->pos_in_item);
-    unbh = 0;
-
-    if (unfm_ptr != 0 && unfm_ptr < get_sb_block_count (fs->fs_ondisk_sb)) {
-	/**/
-	unbh = bread (fs->fs_dev, unfm_ptr, bh->b_size);
-	if (!is_block_used (unfm_ptr))
-	    die ("overwrite_by_direct_item: block %lu, item %d, pointer %d: The pointed block"
-		"(%u) being overwritten is marked as unused.", bh->b_blocknr, PATH_LAST_POSITION(path), 
-		path->pos_in_item, unfm_ptr);
-	if (unbh == 0)
-	    unfm_ptr = 0;
-    }
-    if (unfm_ptr == 0 || unfm_ptr >= get_sb_block_count (fs->fs_ondisk_sb)) {
-	if ((unbh = reiserfsck_get_new_buffer (bh->b_blocknr)) != NULL) {
-	    memset (unbh->b_data, 0, unbh->b_size);
-	    d32_put ((__u32 *)B_I_PITEM(bh, ih), path->pos_in_item,  unbh->b_blocknr);
-	    mark_buffer_dirty (bh);
-	} else {
-	    die ("overwrite_by_direct_item: Could not allocate a new block for new data");
-	}
-    }
-
-    offset = (get_offset (&comingih->ih_key) % bh->b_size) - 1;
-    if (offset + coming_len > bh->b_size)
-    	die ("overwrite_by_direct_item: The length of the file after insertion (offset=%lu, length=%u)"
-	    "will exceed the maximal possible length.", ( long unsigned ) get_offset (&comingih->ih_key), 
-	     ( unsigned ) coming_len);
-
-    memcpy (unbh->b_data + offset, item, coming_len);
-
-//    save_unfm_overwriting (unbh->b_blocknr, comingih);
-
-    if ((path->pos_in_item == (I_UNFM_NUM (ih) - 1)) && 
-	(bh->b_size - 0/*ih_free_space (ih)*/) < (offset + coming_len)) {
-	set_ih_free_space (ih, bh->b_size - (offset + coming_len)) ;
-	mark_buffer_dirty (bh);
-    }
-    mark_buffer_dirty (unbh);
-//  mark_buffer_uptodate (unbh, 0);
-    mark_buffer_uptodate (unbh, 1);
-    brelse (unbh);
-    return coming_len;
-}
-
-
-#if 0
-
-void overwrite_unfm_by_unfm (unsigned long unfm_in_tree, unsigned long coming_unfm, int bytes_in_unfm)
-{
-    struct overwritten_unfm_segment * unfm_os_list;/* list of overwritten segments of the unformatted node */
-    struct overwritten_unfm_segment unoverwritten_segment;
-    struct buffer_head * bh_in_tree, * coming_bh;
-
-
-    if (!test_bit (coming_unfm % (fs->fs_blocksize * 8), SB_AP_BITMAP (fs)[coming_unfm / (fs->fs_blocksize * 8)]->b_data))
-	/* block (pointed by indirect item) is free, we do not have to keep its contents */
-	return;
-    
-    /* coming block is marked as used in disk bitmap. Put its contents to
-       block in tree preserving everything, what has been overwritten there by
-       direct items */
-    unfm_os_list = find_overwritten_unfm (unfm_in_tree, bytes_in_unfm, &unoverwritten_segment);
-    if (unfm_os_list) {
-	/*    add_event (UNFM_OVERWRITING_UNFM);*/
-	bh_in_tree = bread (fs->fs_dev, unfm_in_tree, fs->fs_blocksize);
-	coming_bh = bread (fs->fs_dev, coming_unfm, fs->fs_blocksize);
-	if (bh_in_tree == 0 || coming_bh == 0)
-	    return;
-	
-	while (get_unoverwritten_segment (unfm_os_list, &unoverwritten_segment)) {
-	    if (unoverwritten_segment.ous_begin < 0 || unoverwritten_segment.ous_end > bytes_in_unfm - 1 ||
-		unoverwritten_segment.ous_begin > unoverwritten_segment.ous_end)
-		die ("overwrite_unfm_by_unfm: invalid segment found (%d %d)", unoverwritten_segment.ous_begin, unoverwritten_segment.ous_end);
-	    
-	    memcpy (bh_in_tree->b_data + unoverwritten_segment.ous_begin, coming_bh->b_data + unoverwritten_segment.ous_begin,
-		    unoverwritten_segment.ous_end - unoverwritten_segment.ous_begin + 1);
-	    mark_buffer_dirty (bh_in_tree);
-	}
-	
-	brelse (bh_in_tree);
-	brelse (coming_bh);
-    }
-}
-#endif
-
-
-/* put unformatted node pointers from incoming item over the in-tree ones */
-static int overwrite_by_indirect_item (struct item_head * comingih, __u32 * coming_item,
-				       struct path * path, int * pos_in_coming_item)
-{
-    struct buffer_head * bh = PATH_PLAST_BUFFER (path);
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-    int written;
-    __u32 * item_in_tree;
-    int src_unfm_ptrs, dest_unfm_ptrs, to_copy, i, dirty = 0;
-
-    item_in_tree = (__u32 *)B_I_PITEM (bh, ih) + path->pos_in_item;
-    coming_item += *pos_in_coming_item;
-
-    dest_unfm_ptrs = I_UNFM_NUM (ih) - path->pos_in_item;
-    src_unfm_ptrs = I_UNFM_NUM (comingih) - *pos_in_coming_item;
-  
-    if (dest_unfm_ptrs >= src_unfm_ptrs) {
-	/* whole coming item (comingih) fits into item in tree (ih) starting with path->pos_in_item */
-
-	//free_sp = ih_get_free_space(0, comingih, (char *)coming_item);
-
-	written = get_bytes_number (comingih, fs->fs_blocksize) -
-	    /* free_sp - */ *pos_in_coming_item * fs->fs_blocksize;
-	*pos_in_coming_item = I_UNFM_NUM (comingih);
-	to_copy = src_unfm_ptrs;
-	if (dest_unfm_ptrs == src_unfm_ptrs)
-	    set_ih_free_space(ih, 0 /* free_sp */ );
-    } else {
-	/* only part of coming item overlaps item in the tree */
-	*pos_in_coming_item += dest_unfm_ptrs;
-	written = dest_unfm_ptrs * fs->fs_blocksize;
-	to_copy = dest_unfm_ptrs;
-	set_ih_free_space(ih, 0);
-    }
-  
-    for (i = 0; i < to_copy; i ++) {
-	if (d32_get (coming_item, i) != 0 && d32_get (item_in_tree, i) == 0) {
-	    /* overwrite holes only by correct a pointer in the coming item
-               which must be correct */
-	    d32_put (item_in_tree, i, d32_get (coming_item, i));
-	    mark_block_used (d32_get (coming_item, i), 0);
-	    dirty ++;
-	}
-    }
-    if (dirty)
-	mark_buffer_dirty (bh);
-    return written;
-}
-
-
-static int reiserfsck_overwrite_file (struct item_head * comingih, char * item,
-				      struct path * path, int * pos_in_coming_item,
-				      int was_in_tree)
-{
-    __u32 unfm_ptr;
-    int written = 0;
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-
-
-    if (not_of_one_file (ih, &(comingih->ih_key)))
-	    reiserfs_panic ("reiserfsck_overwrite_file: The file to be overwritten %K must be of"
-		" the same as the new data %K", &ih->ih_key, &comingih->ih_key);
-
-    if (is_direct_ih (ih)) {
-	unfm_ptr = 0;
-	if (is_indirect_ih (comingih)) {
-	    if (get_offset (&ih->ih_key) % fs->fs_blocksize != 1)
-		reiserfs_panic ("reiserfsck_overwrite_file: The second part of the tail %k can not"
-		    " be overwritten by indirect item %k", &ih->ih_key, &comingih->ih_key);
-	    /* use pointer from coming indirect item */
-	    unfm_ptr = d32_get ((__u32 *)item, *pos_in_coming_item);
-	    if (!was_in_tree) {
-		if (still_bad_unfm_ptr_2 (unfm_ptr))
-		    die ("reiserfsck_overwrite_file: The pointer to the unformatted block (%u)"
-			" points to the bad area.", unfm_ptr);
-	    }
-	}
-	/* */
-	direct2indirect2 (unfm_ptr, path);
-    }
-    if (is_direct_ih (comingih))
-    {
-	written = overwrite_by_direct_item (comingih, item, path);
-    } else {
-	if (was_in_tree)
-	    reiserfs_panic ("reiserfsck_overwrite_file: Item %k we are going to overwrite with"
-		" %k cannot not be in the tree yet", &ih->ih_key, &comingih->ih_key);
-	written = overwrite_by_indirect_item (comingih, (__u32 *)item, path, pos_in_coming_item);
-    }
-
-    return written;
-}
-
-
-/*
- */
-int reiserfsck_file_write (struct item_head * ih, char * item, int was_in_tree) {
-    struct path path;
-    int count, pos_in_coming_item;
-    long long int retval, written;
-    struct key key;
-    int file_format = KEY_FORMAT_UNDEFINED;
-    int relocated = 0;
-
-    if (!was_in_tree) {
-	__u16 mode;
-
-        /* We already inserted all SD items. If we cannot find SD of this item - skip it */
-	memset (&key, 0, sizeof (key));
-
-check_again:
-        copy_short_key (&key, &(ih->ih_key));
-	
-        if (reiserfs_search_by_key_4 (fs, &key, &path) != ITEM_FOUND) {
-            fsck_log ("vpf-10260: The file we are inserting the new item (%H) into has no"
-		" StatData, insertion was skipped\n", ih);
-            pathrelse (&path);
-            return 0;
-        }
-
-        /*SD found*/
-        file_format = get_ih_key_format (get_ih(&path));
-        get_sd_mode (get_ih(&path), get_item(&path), &mode);
-
-        if (file_format != get_ih_key_format (ih)) {
-	    /* Not for symlinks and not for items which should be relocted. */
-	    if (((S_ISDIR(mode) && is_direntry_ih(ih)) || 
-		(!S_ISDIR(mode) && !is_direntry_ih(ih))) && 
-		!S_ISLNK(mode))
-	    {
-		set_type_and_offset (file_format, &ih->ih_key, get_offset (&ih->ih_key), get_type (&ih->ih_key));
-		set_ih_key_format(ih, file_format);		
-	    }
-        }
-
-	if (!relocated && should_relocate (ih)) {
-	    rewrite_file (ih, 1, 1/*change new_ih*/);
-	    pathrelse(&path);
-	    relocated = 1;
-	    
-	    /* object has been relocated but we should not mark it as used in semantic map,
-	       as it does not exist at pass2 and we do not get here for relocation as 
-	       was_in_tree == 1 */
-	    
-	    goto check_again;
-	}
-	
-	if (make_file_writeable (get_bh(&path), get_item_pos (&path)) == -1) {
-	    /* write was not completed. Skip that item. Maybe it should be saved to lost_found */
-	    fsck_log ("reiserfsck_file_write: WARNING: The file we are inserting the new item %k into was"
-		" not recovered and is still in inconsistent state, insertion was skipped\n", &ih->ih_key);
-	    pathrelse(&path);
-	    return 0;
-	}
-
-        pathrelse (&path);
-    }
-
-    count = get_bytes_number (ih, fs->fs_blocksize);
-    pos_in_coming_item = 0;
-
-    copy_key (&key, &(ih->ih_key));
-
-    while (count) {
-
-	retval = usearch_by_position (fs, &key, key_format (&key), &path);
-
-	/*  if there are items of bigger offset than we are looking for and
-	    there is no item between wamted offset and SD, insert first item */
-	if (retval == POSITION_NOT_FOUND &&
-	    (	PATH_LAST_POSITION (&path) >= B_NR_ITEMS (get_bh(&path)) ||
-		get_offset (&get_ih(&path)->ih_key) > get_offset (&key)))
-            retval = FILE_NOT_FOUND;	
-	
-	if (retval == DIRECTORY_FOUND)
-	    reiserfs_panic ("The directory was found at the place of the file we are going to insert"
-		" the item %k into", key);
-
-	if (retval == POSITION_FOUND) {
-	    written = reiserfsck_overwrite_file (ih, item, &path, &pos_in_coming_item, was_in_tree);
-            count -= written;
-	    set_offset (key_format (&key), &key, get_offset (&key) + written);
-	}
-	if (retval == FILE_NOT_FOUND) {
-	    written = create_first_item_of_file (ih, item, &path, was_in_tree);
-	    count -= written;
-
-	    set_offset (key_format (&key), &key, get_offset (&key) + written );
-	}
-	if (retval == POSITION_NOT_FOUND) {
-	
-	    if (is_direct_ih (ih)) {
-	        mark_ih_was_tail (get_ih(&path));
-	        mark_buffer_dirty (get_bh(&path));
-	    }
-	
-	    if ((written = must_there_be_a_hole (ih, &path)) > 0)
-	    {
-		reiserfs_append_zero_unfm_ptr (&path, written);
-	    }else {
-		written = reiserfsck_append_file (ih, item, pos_in_coming_item, &path, was_in_tree);
-		count -= written;
-		set_offset (key_format (&key), &key, get_offset (&key) + written);
-		pos_in_coming_item += written / fs->fs_blocksize;
-	    }
-	}
-	if (count < 0)
-	    reiserfs_panic ("reiserfsck_file_write: We wrote into the file %K more bytes than needed - count (%d) < 0.",
-			    &key, count);
-	pathrelse (&path);
-    }
-
-
-    /* This is a test for writing into the file. If not sure that file data are consistent after
-       reiserfsck_file_write - uncomment this clause: */
-
-/*    if (!was_in_tree && are_file_items_correct (&ih->ih_key,
-    	(file_format == KEY_FORMAT_UNDEFINED) ?	get_ih_key_format (ih) : file_format,
-    	&size, &blocks, 0, symlink, 0) == 0)
-        reiserfs_panic ("reiserfsck_file_write: item was not inserted properly\n");*/
-
-    return get_bytes_number (ih, fs->fs_blocksize);
-}
-
-
-void one_more_corruption(reiserfs_filsys_t *fs, int kind) {
-    if (kind == FATAL)
-	fsck_check_stat (fs)->fatal_corruptions++;
-    else if (kind == FIXABLE)
-	fsck_check_stat (fs)->fixable_corruptions++;
-}
-
-void one_less_corruption(reiserfs_filsys_t *fs, int kind) {
-    if (kind == FATAL)
-	fsck_check_stat (fs)->fatal_corruptions--;
-    else if (kind == FIXABLE)
-	fsck_check_stat (fs)->fixable_corruptions--;
-}
diff --git a/fsck/ustree.c b/fsck/ustree.c
deleted file mode 100644
index 7204a07..0000000
--- a/fsck/ustree.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "fsck.h"
-
-struct tree_balance * cur_tb = 0;
-
-void reiserfsck_paste_into_item (struct path * path, const char * body, int size)
-{
-    struct tree_balance tb;
-  
-    init_tb_struct (&tb, fs, path, size);
-    if (fix_nodes (/*tb.transaction_handle,*/ M_PASTE, &tb, 0/*ih*/) != CARRY_ON)
-	//fix_nodes(options, tree_balance, ih_to_option, body_to_option)
-	
-	die ("reiserfsck_paste_into_item: fix_nodes failed");
-    
-    do_balance (/*tb.transaction_handle,*/ &tb, 0, body, M_PASTE, 0/*zero num*/);
-}
-
-
-void reiserfsck_insert_item (struct path * path, struct item_head * ih, const char * body)
-{
-    struct tree_balance tb;
-    
-    init_tb_struct (&tb, fs, path, IH_SIZE + get_ih_item_len(ih));
-    if (fix_nodes (/*tb.transaction_handle,*/ M_INSERT, &tb, ih/*, body*/) != CARRY_ON)
-	die ("reiserfsck_insert_item: fix_nodes failed");
-    do_balance (/*tb.transaction_handle,*/ &tb, ih, body, M_INSERT, 0/*zero num*/);
-}
-
-
-static void free_unformatted_nodes (struct item_head * ih, struct buffer_head * bh)
-{
-    __u32 * punfm = (__u32 *)B_I_PITEM (bh, ih);
-    unsigned int i;
-
-    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-        __u32 unfm = d32_get (punfm, i);
-	if (unfm != 0) {
-	    struct buffer_head * to_be_forgotten;
-
-	    to_be_forgotten = find_buffer (fs->fs_dev, unfm, fs->fs_blocksize);
-	    if (to_be_forgotten) {
-		//atomic_inc(&to_be_forgotten->b_count);
-		to_be_forgotten->b_count ++;
-		bforget (to_be_forgotten);
-	    }
-
-	    reiserfs_free_block (fs, unfm);
-	}
-    }
-}
-
-void reiserfsck_delete_item (struct path * path, int temporary)
-{
-    struct tree_balance tb;
-    struct item_head * ih = PATH_PITEM_HEAD (path);
-    
-    if (is_indirect_ih (ih) && !temporary)
-	free_unformatted_nodes (ih, PATH_PLAST_BUFFER (path));
-
-    init_tb_struct (&tb, fs, path, -(IH_SIZE + get_ih_item_len(ih)));
-
-    if (fix_nodes (/*tb.transaction_handle,*/ M_DELETE, &tb, 0/*ih*/) != CARRY_ON)
-	die ("reiserfsck_delete_item: fix_nodes failed");
-    
-    do_balance (/*tb.transaction_handle,*/ &tb, 0, 0, M_DELETE, 0/*zero num*/);
-}
-
-
-void reiserfsck_cut_from_item (struct path * path, int cut_size)
-{
-    struct tree_balance tb;
-    struct item_head * ih;
-
-    if (cut_size >= 0)
-	die ("reiserfsck_cut_from_item: cut size == %d", cut_size);
-
-    if (is_indirect_ih (ih = PATH_PITEM_HEAD (path))) {
-	struct buffer_head *bh = PATH_PLAST_BUFFER (path);
-	__u32 unfm_ptr = d32_get ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1);
-	if (unfm_ptr != 0) {
-	    struct buffer_head * to_be_forgotten;
-
-	    to_be_forgotten = find_buffer (fs->fs_dev, unfm_ptr, fs->fs_blocksize);
-	    if (to_be_forgotten) {
-		//atomic_inc(&to_be_forgotten->b_count);
-		to_be_forgotten->b_count ++;
-		bforget (to_be_forgotten);
-	    }
-	    reiserfs_free_block (fs, unfm_ptr);
-	}
-    }
-
-
-    init_tb_struct (&tb, fs, path, cut_size);
-
-    if (fix_nodes (/*tb.transaction_handle,*/ M_CUT, &tb, 0) != CARRY_ON)
-	die ("reiserfsck_cut_from_item: fix_nodes failed");
-
-    do_balance (/*tb.transaction_handle,*/ &tb, 0, 0, M_CUT, 0/*zero num*/);
-}
-
-
-/* uget_rkey is utils clone of stree.c/get_rkey */
-/*
-struct key * uget_rkey (struct path * path)
-{
-    int pos, offset = path->path_length;
-    struct buffer_head * bh;
-
-    if (offset < FIRST_PATH_ELEMENT_OFFSET)
-	die ("uget_rkey: illegal offset in the path (%d)", offset);
-
-    while (offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-	if (! buffer_uptodate (PATH_OFFSET_PBUFFER (path, offset)))
-	    die ("uget_rkey: parent is not uptodate");
-
-	// Parent at the path is not in the tree now.
-	if (! B_IS_IN_TREE (bh = PATH_OFFSET_PBUFFER (path, offset)))
-	    die ("uget_rkey: buffer on the path is not in tree");
-
-	// Check whether position in the parrent is correct.
-	if ((pos = PATH_OFFSET_POSITION (path, offset)) > B_NR_ITEMS (bh))
-	    die ("uget_rkey: invalid position (%d) in the path", pos);
-
-	// Check whether parent at the path really points to the child.
-	if (get_dc_child_blocknr (B_N_CHILD (bh, pos)) != PATH_OFFSET_PBUFFER (path, offset + 1)->b_blocknr)
-	    die ("uget_rkey: invalid block number (%d). Must be %ld",
-		 get_dc_child_blocknr (B_N_CHILD (bh, pos)), PATH_OFFSET_PBUFFER (path, offset + 1)->b_blocknr);
-	
-	// Return delimiting key if position in the parent is not the last one.
-	if (pos != B_NR_ITEMS (bh))
-	    return B_N_PDELIM_KEY(bh, pos);
-    }
-
-    // there is no right delimiting key
-    return 0;
-}
-*/
-
-
-static unsigned long first_child (struct buffer_head * bh)
-{
-    return get_dc_child_blocknr (B_N_CHILD (bh, 0));
-}
-
-#if 0
-static unsigned long last_child (struct buffer_head * bh)
-{
-    return child_block_number (bh, node_item_number (bh));
-}
-#endif
-
-
-static unsigned long get_child (int pos, struct buffer_head * parent)
-{
-    if (pos == -1)
-        return -1;
-
-    if (pos > B_NR_ITEMS (parent))
-        die ("get_child: no child found, should not happen: %d of %d", pos, B_NR_ITEMS (parent));
-    return get_dc_child_blocknr (B_N_CHILD (parent, pos));
-
-}
-
-
-static void print (int cur, int total)
-{
-    if (fsck_quiet (fs))
-	return;
-    printf ("/%3d (of %3d)", cur, total);fflush (stdout);
-}
-
-
-/* erase /XXX(of XXX) */
-static void erase (void)
-{
-    if (fsck_quiet (fs))
-	return;
-    printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b");
-    printf ("             ");
-    printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b");
-    fflush (stdout);
-}
-
-void pass_through_tree (reiserfs_filsys_t * fs, do_after_read_t action1,
-			do_on_full_path_t action2, int depth)
-{
-    struct buffer_head * path[MAX_HEIGHT] = {0,};
-    int total[MAX_HEIGHT] = {0,};
-    int cur[MAX_HEIGHT] = {0,};
-    int h = 0;
-    unsigned long block = get_sb_root_block (fs->fs_ondisk_sb);
-    int problem;
-
-
-    if (block >= get_sb_block_count (fs->fs_ondisk_sb) || not_data_block (fs, block)) {
-	die ("\nBad root block %lu. (--rebuild-tree did not complete)\n", block);
-    }
-
-    while ( 1 ) {
-	problem = 0;
-
-        if (path[h])
-            die ("pass_through_tree: empty slot expected");
-        if (h)
-            print (cur[h - 1], total[h - 1]);
-
-	if (fs->fs_badblocks_bm && reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, block)) {
-	    fsck_log ("%s: block %lu specified in badblock list found in tree, whole subtree skipped\n",
-		__FUNCTION__, block);
-	    fsck_data (fs)->check.bad_nodes++;
-	    one_more_corruption (fs, FATAL);
-
-	    if (h == 0) {
-		brelse (path[h]);
-		path[h] = 0;
-		break;
-	    }
-	    problem = 1;		
-	} else {
-	    path[h] = bread (fs->fs_dev, block, fs->fs_blocksize);
-	    if (path[h] == 0)
-		/* FIXME: handle case when read failed */
-		die ("pass_through_tree: unable to read %lu block on device 0x%x\n",
-			block, fs->fs_dev);
-
-	    if (action1)
-		if ((problem = action1 (fs, path, h))) {
-		    fsck_log (" the problem in the internal node occured (%lu), whole subtree is skipped\n", 
-			path[h]->b_blocknr);
-		    fsck_data (fs)->check.bad_nodes++;
- 
-		    if (h == 0) {
-			brelse (path[h]);
-			path[h] = 0;
-			break;
-		    }
-		}
-	}
-
-	/* Time to stop. */
-	if (h == depth)
-	    problem ++;
-
-        if (problem || is_leaf_node (path[h])) {
-            if (!problem && action2)
-                action2 (fs, path, h);
-
-	    brelse (path[h]);
-            if (h)
-		erase ();
-
-            while (h && (cur[h-1] == total[h-1] || problem)) {
-                problem = 0;
-                path[h] = 0;
-                h --;
-                brelse (path[h]);
-                if (h)
-                    erase ();
-	    }
-
-    	    if (h == 0) {
-    	    	path[h] = 0;
-		break;
-    	    }
-
-            block = get_child (cur[h - 1], path[h-1]);
-            cur[h - 1] ++;
-            path[h] = 0;
-            continue;
-	}
-        total[h] = B_NR_ITEMS (path[h]) + 1;
-        cur[h] = 1;
-        block = first_child (path[h]);
-        h ++;
-    }
-}
diff --git a/include/Makefile.am b/include/Makefile.am
index 96c1615..1d173ff 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -1 +1 @@
-noinst_HEADERS = io.h  misc.h  reiserfs_fs.h  reiserfs_lib.h swab.h
+SUBDIRS = misc reiserfs util
diff --git a/include/Makefile.in b/include/Makefile.in
index cdcccba..7c22234 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -13,7 +13,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
 VPATH = @srcdir@
@@ -21,7 +20,6 @@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 top_builddir = ..
-
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
@@ -35,7 +33,29 @@
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
+build_triplet = @build@
 host_triplet = @host@
+subdir = include
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMDEP_FALSE = @AMDEP_FALSE@
 AMDEP_TRUE = @AMDEP_TRUE@
@@ -78,6 +98,7 @@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
 RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -92,6 +113,8 @@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
 bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
@@ -112,6 +135,7 @@
 libexecdir = @libexecdir@
 localstatedir = @localstatedir@
 mandir = @mandir@
+mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
@@ -119,51 +143,111 @@
 sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
-noinst_HEADERS = io.h  misc.h  reiserfs_fs.h  reiserfs_lib.h swab.h
-subdir = include
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in config.h.in
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
+SUBDIRS = misc reiserfs util
+all: all-recursive
 
 .SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  include/Makefile'; \
 	cd $(top_srcdir) && \
 	  $(AUTOMAKE) --gnu  include/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
 
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) stamp-h1; \
-	else :; fi
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status include/config.h
-
-$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOHEADER)
-	touch $(srcdir)/config.h.in
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 uninstall-info-am:
 
-ETAGS = etags
-ETAGSFLAGS =
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
 
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -173,27 +257,42 @@
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
 	mkid -fID $$unique
+tags: TAGS
 
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
 	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
 ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
 	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
@@ -210,10 +309,6 @@
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
@@ -227,7 +322,7 @@
 	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
 	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
 	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
 	  else \
 	    dir=''; \
 	  fi; \
@@ -242,23 +337,38 @@
 	    || exit 1; \
 	  fi; \
 	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
 check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS) config.h
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 	  `test -z '$(STRIP)' || \
 	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 mostlyclean-generic:
@@ -266,24 +376,26 @@
 clean-generic:
 
 distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+clean: clean-recursive
 
 clean-am: clean-generic mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
 
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
-
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
-info: info-am
+html: html-recursive
+
+info: info-recursive
 
 info-am:
 
@@ -291,38 +403,43 @@
 
 install-exec-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-man:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
-
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-generic
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am: uninstall-info-am
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic ctags \
-	distclean distclean-generic distclean-hdr distclean-tags \
-	distdir dvi dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
-	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-recursive ctags ctags-recursive \
+	distclean distclean-generic distclean-recursive distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/include/io.h b/include/io.h
deleted file mode 100644
index ae9af4c..0000000
--- a/include/io.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#ifndef REISERFSPROGS_IO_H
-#define REISERFSPROGS_IO_H
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include "misc.h"
-
-struct buffer_head {
-    unsigned long b_blocknr;
-    int b_dev;
-    unsigned long b_size;
-    char * b_data;
-    unsigned long b_state;
-    unsigned int b_count;
-    unsigned int b_list ;
-    void (*b_start_io) (unsigned long);
-    void (*b_end_io)(struct buffer_head *bh, int uptodate);
-    
-    struct buffer_head * b_next;
-    struct buffer_head * b_prev;
-    struct buffer_head * b_hash_next;
-    struct buffer_head * b_hash_prev;
-};
-
-#define BH_Uptodate	0
-#define BH_Dirty	1
-#define BH_Lock		2
-#define BH_Do_not_flush 3
-
-
-#define buffer_uptodate(bh) misc_test_bit(BH_Uptodate, &(bh)->b_state)
-#define buffer_dirty(bh) misc_test_bit(BH_Dirty, &(bh)->b_state)
-#define buffer_locked(bh) misc_test_bit(BH_Lock, &(bh)->b_state)
-#define buffer_clean(bh) !misc_test_bit(BH_Dirty, &(bh)->b_state)
-#define buffer_do_not_flush(bh) misc_test_bit(BH_Do_not_flush, &(bh)->b_state)
-#define mark_buffer_dirty(bh) misc_set_bit(BH_Dirty, &(bh)->b_state)
-#define mark_buffer_uptodate(bh,i) misc_set_bit(BH_Uptodate, &(bh)->b_state)
-#define mark_buffer_clean(bh) misc_clear_bit(BH_Dirty, &(bh)->b_state)
-#define mark_buffer_do_not_flush(bh) misc_set_bit(BH_Do_not_flush, &(bh)->b_state)
-#define clear_buffer_do_not_flush(bh) misc_clear_bit(BH_Do_not_flush, &(bh)->b_state)
-
-/*
-printf ("%s:%s:%u %p %p %p\n", 
-__FILE__, __FUNCTION__, __LINE__,
-	__builtin_return_address (0),
-	__builtin_return_address (1),
-	__builtin_return_address (2));
-*/
-
-
-
-void __wait_on_buffer (struct buffer_head * bh);
-struct buffer_head * getblk (int dev, unsigned long block, int size);
-struct buffer_head * reiserfs_getblk (int dev, unsigned long block, int size, int *repeat);
-
-struct buffer_head * find_buffer (int dev, unsigned long block, unsigned long size);
-struct buffer_head * get_hash_table(dev_t dev, unsigned long block, int size);
-struct buffer_head * bread (int dev, unsigned long block, size_t size);
-struct buffer_head * reiserfs_bread (int dev, unsigned long block, int size, int *repeat);
-int bwrite (struct buffer_head * bh);
-void brelse (struct buffer_head * bh);
-void bforget (struct buffer_head * bh);
-void init_rollback_file (char * rollback_file, int *bloksize, FILE * log);
-int open_rollback_file (char * rollback_file, FILE * log);
-void close_rollback_file ();
-void do_fsck_rollback (int fd_device, int fd_journal_device, FILE * log); 
-
-void flush_buffers (int);
-void free_buffers (void);
-void invalidate_buffers (int);
-
-#endif
diff --git a/include/misc.h b/include/misc.h
deleted file mode 100644
index 6891b59..0000000
--- a/include/misc.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-/* nothing abount reiserfs here */
-
-#ifndef REISERFSPROGS_MISC_H
-#define REISERFSPROGS_MISC_H
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-#include <linux/major.h>
-
-#if MAJOR_IN_MKDEV
-#   include <sys/mkdev.h>
-#elif MAJOR_IN_SYSMACROS
-#   include <sys/sysmacros.h>
-#endif
-
-#include "swab.h"
-
-#define POSITION_FOUND          8
-#define POSITION_NOT_FOUND      9
-
-#define INVAL_PTR	(void *)-1
-
-void check_memory_msg(void);
-void die (char * fmt, ...) __attribute__ ((format (printf, 1, 2)));
-void * getmem (int size);
-void *mem_alloc(int size);
-void freemem (void * p);
-void checkmem (char * p, int size);
-void * expandmem (void * p, int size, int by);
-unsigned int get_mem_size (char * p);
-void check_and_free_mem (void);
-char * kdevname (int dev);
-
-typedef enum mount_flags {
-	MF_NOT_MOUNTED  = 0x0,
-	MF_RO		= 0x1,
-	MF_RW		= 0x2
-} mount_flags_t;
-
-typedef struct mount_hint {
-    char *point;	/* Mount point. */
-    __u32 psize;	/* Mount point buffer size. */
-    __u32 flags;	/* Mount flags. */
-} mount_hint_t;
-
-struct mntent *misc_mntent(char *device);
-int misc_device_mounted(char *device);
-	
-void misc_print_credit(FILE *out);
-
-typedef struct dma_info {
-    int fd;
-    struct stat st;
-    int support_type;
-    int dma;
-    __u64 speed;
-} dma_info_t;
-
-int prepare_dma_check(dma_info_t *dma_info);
-int get_dma_info(dma_info_t *dma_info);
-void clean_after_dma_check(int fd, dma_info_t *dma_info);
-
-int valid_offset( int fd, loff_t offset);
-unsigned long count_blocks (char * filename, int blocksize);
-
-void print_how_far (FILE * fp, unsigned long *passed, unsigned long total, unsigned int inc, int quiet);
-void print_how_fast (unsigned long total, 
-		     unsigned long passed, int cursor_pos, int reset_time);
-__u32 get_random (void);
-
-int user_confirmed (FILE * fp, char * q, char * yes);
-
-extern inline int misc_set_bit (unsigned long long nr, void * addr);
-extern inline int misc_clear_bit (unsigned long long nr, void * addr);
-extern inline int misc_test_bit(unsigned long long nr, const void * addr);
-extern inline unsigned long long misc_find_first_zero_bit (const void *vaddr, unsigned long long size);
-extern inline unsigned long long misc_find_next_zero_bit (const void *vaddr, unsigned long long size, unsigned long long offset);
-extern inline unsigned long long misc_find_next_set_bit(const void *vaddr, unsigned long long size, unsigned long long offset);
-extern inline unsigned long long misc_find_first_set_bit (const void *vaddr, unsigned long long size);
-
-#define STAT_FIELD_H(Field, Type)	\
-inline Type misc_device_##Field(char *device);
-
-STAT_FIELD_H(mode, mode_t);
-STAT_FIELD_H(rdev, dev_t);
-STAT_FIELD_H(size, off_t);
-STAT_FIELD_H(blocks, blkcnt_t);
-
-__u16 mask16 (int from, int count);
-__u32 mask32 (int from, int count);
-__u64 mask64 (int from, int count);
-
-int reiserfs_bin_search (void * key, void * base, __u32 num, int width,
-			 __u32 *ppos, __compar_fn_t comp_func);
-
-struct block_handler {
-    __u32 blocknr;
-    dev_t device;
-};
-
-int  blocklist__is_block_saved (struct block_handler ** base, __u32 * count, __u32 blocknr, 
-    dev_t device, __u32 * position);
-void blocklist__insert_in_position (void * block_h, void ** base, __u32 * count, 
-    int elem_size, __u32 * position);
-int blockdev_list_compare (const void * block1, const void * block2);
-			
-			 
-#define set_bit_field_XX(XX,vp,val,from,count) \
-{\
-    __u##XX * p, tmp;\
-\
-    /* make sure that given value can be put in 'count' bits */\
-    if (val > (1 << count))\
-	die ("set_bit_field: val %d is too big for %d bits", val, count);\
-\
-    p = (__u##XX *)vp;\
-    tmp = le##XX##_to_cpu (*p);\
-\
-    /* clear 'count' bits starting from 'from'-th one */\
-    tmp &= ~mask##XX (from, count);\
-\
-    /* put given value in proper bits */\
-    tmp |= (val << from);\
-\
-    *p = cpu_to_le##XX (tmp);\
-}
-
-
-#define get_bit_field_XX(XX,vp,from,count) \
-\
-    __u##XX * p, tmp;\
-\
-    p = (__u##XX *)vp;\
-    tmp = le##XX##_to_cpu (*p);\
-\
-    /* clear all bits but 'count' bits starting from 'from'-th one */\
-    tmp &= mask##XX (from, count);\
-\
-    /* get value written in specified bits */\
-    tmp >>= from;\
-    return tmp;
-
-
-#ifndef major
-#define major(rdev)      ((rdev)>>8)
-#define minor(rdev)      ((rdev) & 0xff)
-#endif /* major */
-
-
-
-#ifndef SCSI_DISK_MAJOR
-#define SCSI_DISK_MAJOR(maj) ((maj) == SCSI_DISK0_MAJOR || \
-			     ((maj) >= SCSI_DISK1_MAJOR && (maj) <= SCSI_DISK7_MAJOR))
-#endif /* SCSI_DISK_MAJOR */
-    
-#ifndef SCSI_BLK_MAJOR
-#define SCSI_BLK_MAJOR(maj)  (SCSI_DISK_MAJOR(maj) || (maj) == SCSI_CDROM_MAJOR)
-#endif /* SCSI_BLK_MAJOR */
-
-#ifndef IDE_DISK_MAJOR
-#ifdef IDE9_MAJOR
-#define IDE_DISK_MAJOR(maj) ((maj) == IDE0_MAJOR || (maj) == IDE1_MAJOR || \
-			     (maj) == IDE2_MAJOR || (maj) == IDE3_MAJOR || \
-			     (maj) == IDE4_MAJOR || (maj) == IDE5_MAJOR || \
-			     (maj) == IDE6_MAJOR || (maj) == IDE7_MAJOR || \
-			     (maj) == IDE8_MAJOR || (maj) == IDE9_MAJOR)
-#else
-#define IDE_DISK_MAJOR(maj) ((maj) == IDE0_MAJOR || (maj) == IDE1_MAJOR || \
-			     (maj) == IDE2_MAJOR || (maj) == IDE3_MAJOR || \
-			     (maj) == IDE4_MAJOR || (maj) == IDE5_MAJOR)
-#endif /* IDE9_MAJOR */
-#endif /* IDE_DISK_MAJOR */
-
-
-#endif /* REISERFS_MISC_H */
diff --git a/include/misc/Makefile.am b/include/misc/Makefile.am
new file mode 100644
index 0000000..2ab1624
--- /dev/null
+++ b/include/misc/Makefile.am
@@ -0,0 +1 @@
+noinst_HEADERS = types.h bitops.h malloc.h swab.h device.h misc.h unaligned.h
diff --git a/lib/Makefile.in b/include/misc/Makefile.in
similarity index 61%
copy from lib/Makefile.in
copy to include/misc/Makefile.in
index 675222a..15d93ea 100644
--- a/lib/Makefile.in
+++ b/include/misc/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -20,8 +20,7 @@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
+top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
@@ -35,7 +34,24 @@
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
+build_triplet = @build@
 host_triplet = @host@
+subdir = include/misc
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMDEP_FALSE = @AMDEP_FALSE@
 AMDEP_TRUE = @AMDEP_TRUE@
@@ -78,6 +94,7 @@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
 RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -92,6 +109,8 @@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
 bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
@@ -112,6 +131,7 @@
 libexecdir = @libexecdir@
 localstatedir = @localstatedir@
 mandir = @mandir@
+mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
@@ -119,95 +139,41 @@
 sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
-noinst_LIBRARIES = libmisc.a
-
-libmisc_a_SOURCES = io.c misc.c 
-subdir = lib
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-
-libmisc_a_AR = $(AR) cru
-libmisc_a_LIBADD =
-am_libmisc_a_OBJECTS = io.$(OBJEXT) misc.$(OBJEXT)
-libmisc_a_OBJECTS = $(am_libmisc_a_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/io.Po ./$(DEPDIR)/misc.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(libmisc_a_SOURCES)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(libmisc_a_SOURCES)
-
+noinst_HEADERS = types.h bitops.h malloc.h swab.h device.h misc.h unaligned.h
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  include/misc/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  lib/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+	  $(AUTOMAKE) --gnu  include/misc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
 
-AR = ar
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-clean-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES) 
-	-rm -f libmisc.a
-	$(libmisc_a_AR) libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD)
-	$(RANLIB) libmisc.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 uninstall-info-am:
 
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -216,6 +182,7 @@
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
 	mkid -fID $$unique
+tags: TAGS
 
 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
@@ -227,10 +194,11 @@
 	  done | \
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
 ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
@@ -253,10 +221,6 @@
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
@@ -270,7 +234,7 @@
 	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
 	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
 	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
 	  else \
 	    dir=''; \
 	  fi; \
@@ -287,8 +251,7 @@
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LIBRARIES)
-
+all-am: Makefile $(HEADERS)
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -301,7 +264,7 @@
 installcheck: installcheck-am
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 	  `test -z '$(STRIP)' || \
 	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 mostlyclean-generic:
@@ -309,24 +272,25 @@
 clean-generic:
 
 distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+clean-am: clean-generic mostlyclean-am
 
 distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
 
 dvi: dvi-am
 
 dvi-am:
 
+html: html-am
+
 info: info-am
 
 info-am:
@@ -342,12 +306,12 @@
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-
+	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-generic
 
 pdf: pdf-am
 
@@ -360,15 +324,13 @@
 uninstall-am: uninstall-info-am
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-noinstLIBRARIES ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-info-am
+	ctags distclean distclean-generic distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/include/misc/bitops.h b/include/misc/bitops.h
new file mode 100644
index 0000000..16653f5
--- /dev/null
+++ b/include/misc/bitops.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef MISC_BITOPS_H
+#define MISC_BITOPS_H
+
+#include "misc/types.h"
+#include "misc/misc.h"
+
+extern __u16 mask16 (int from, int count);
+extern __u32 mask32 (int from, int count);
+extern __u64 mask64 (int from, int count);
+
+#define misc_set_bitfield_XX(XX,vp,val,from,count)				\
+({										\
+    __u##XX * p, tmp;								\
+										\
+    /* make sure that given value can be put in 'count' bits */			\
+    if (val > (1 << count))							\
+	misc_die ("misc_set_bitfield: val %d is too big for %d bits", val, count);	\
+										\
+    p = (__u##XX *)vp;								\
+    tmp = le##XX##_to_cpu (*p);							\
+										\
+    /* clear 'count' bits starting from 'from'-th one */			\
+    tmp &= ~mask##XX (from, count);						\
+										\
+    /* put given value in proper bits */					\
+    tmp |= (val << from);							\
+										\
+    *p = cpu_to_le##XX (tmp);							\
+})
+
+
+#define misc_get_bitfield_XX(XX,vp,from,count)					\
+({										\
+    __u##XX * p, tmp;								\
+										\
+    p = (__u##XX *)vp;								\
+    tmp = le##XX##_to_cpu (*p);							\
+										\
+    /* clear all bits but 'count' bits starting from 'from'-th one */		\
+    tmp &= mask##XX (from, count);						\
+										\
+    /* get value written in specified bits */					\
+    tmp >>= from;								\
+    tmp;									\
+})
+
+extern inline int misc_set_bit (unsigned long long nr, 
+				void * addr);
+
+extern inline int misc_clear_bit (unsigned long long nr, 
+				  void * addr);
+
+extern inline int misc_test_bit(unsigned long long nr, 
+				const void * addr);
+
+extern inline unsigned long long 
+misc_find_first_zero_bit (const void *vaddr, 
+			  unsigned long long size);
+
+extern inline unsigned long long 
+misc_find_next_zero_bit (const void *vaddr, 
+			 unsigned long long size, 
+			 unsigned long long offset);
+
+extern inline unsigned long long 
+misc_find_next_set_bit(const void *vaddr, 
+		       unsigned long long size, 
+		       unsigned long long offset);
+
+extern inline unsigned long long 
+misc_find_first_set_bit (const void *vaddr, 
+			 unsigned long long size);
+
+#endif
diff --git a/include/misc/device.h b/include/misc/device.h
new file mode 100644
index 0000000..73e7a2c
--- /dev/null
+++ b/include/misc/device.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef MISC_DEVICE_H
+#define MISC_DEVICE_H
+
+#include <sys/types.h>
+
+extern int misc_device_valid_offset(int fd, long long int offset);
+
+extern unsigned long misc_device_count_blocks (char * filename, 
+					       int blocksize);
+
+extern char misc_device_typec (unsigned short mode);
+
+#define STAT_FIELD_H(Field, Type)			\
+Type misc_device_##Field(char *device);
+
+STAT_FIELD_H(mode, mode_t);
+STAT_FIELD_H(rdev, dev_t);
+
+#endif
diff --git a/include/misc/malloc.h b/include/misc/malloc.h
new file mode 100644
index 0000000..cfc62a7
--- /dev/null
+++ b/include/misc/malloc.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef MISC_MALLOC_H
+#define MISC_MALLOC_H
+
+extern void *misc_getmem (int size);
+
+extern void *misc_malloc(int size);
+
+extern void misc_freemem (void * p);
+
+extern void misc_checkmem (char * p, int size);
+
+extern void *misc_expandmem (void * p, int size, int by);
+
+extern unsigned int misc_memsize (char * p);
+
+#endif
diff --git a/include/misc/misc.h b/include/misc/misc.h
new file mode 100644
index 0000000..20c5f54
--- /dev/null
+++ b/include/misc/misc.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+/* nothing abount reiserfs here */
+
+#ifndef MISC_H
+#define MISC_H
+
+#include "misc/types.h"
+
+/* n must be power of 2 */
+#define MISC_UP(x,n)   (((x)+(n)-1u) / (n) * (n))
+#define MISC_DOWN(x,n) ((x) / (n) * (n))
+
+/* to be ok for alpha etc we have to align structures to 8 byte boundary. */
+#define MISC_ROUND_UP(x) MISC_UP(x,8LL)
+
+extern void misc_die (char * fmt, ...) __attribute__ ((format (printf, 1, 2)));
+
+typedef int (*dir_walk_func_t) (char *path, void *data);
+extern int misc_dir_walk(char *path, dir_walk_func_t func, void *data);
+
+extern __u32 misc_random (void);
+
+typedef int (*misc_comp_func_t) (const void *, const void *);
+
+extern int misc_device_rdev_match(char *path, void *data);
+
+extern int misc_bin_search (const void * key, void * base, 
+			    __u32 num, int width, int *ppos, 
+			    misc_comp_func_t comp_func);
+
+extern void blocklist__insert_in_position (void * block_h, void ** base, 
+					   __u32 * count, int elem_size, 
+					   int * position);
+
+extern int blockdev_list_compare (const void * block1, const void * block2);
+
+#endif
diff --git a/include/swab.h b/include/misc/swab.h
similarity index 77%
rename from include/swab.h
rename to include/misc/swab.h
index 06ebceb..e31a658 100644
--- a/include/swab.h
+++ b/include/misc/swab.h
@@ -3,11 +3,8 @@
  *  reiserfsprogs/README
  */
 
-#ifndef REISERFSPROGS_SWAB_H
-#define REISERFSPROGS_SWAB_H
-
-#include <endian.h>
-#include <asm/types.h>
+#ifndef MISC_SWAB_H
+#define MISC_SWAB_H
 
 #define __swab16(x) \
 ({ \
@@ -42,7 +39,7 @@
 })
 
 
-#if __BYTE_ORDER == __LITTLE_ENDIAN
+#ifndef WORDS_BIGENDIAN
 
 # define cpu_to_le16(val)                 (val)
 # define le16_to_cpu(val)                 (val)
@@ -51,7 +48,7 @@
 # define cpu_to_le64(val)                 (val)
 # define le64_to_cpu(val)                 (val)
 
-#elif __BYTE_ORDER == __BIG_ENDIAN
+#elif defined(WORDS_BIGENDIAN)
 
 # define cpu_to_le16(val)                 __swab16(val)
 # define le16_to_cpu(val)                 __swab16(val)
@@ -64,4 +61,16 @@
 # error "nuxi/pdp-endian archs are not supported"
 #endif
 
-#endif /* REISERFS_SWAB_H */
+#define get_leXX(xx,p,field)	(le##xx##_to_cpu ((p)->field))
+#define set_leXX(xx,p,field,val) do { (p)->field = cpu_to_le##xx(val); } while (0)
+
+#define get_le16(p,field)	get_leXX (16, p, field)
+#define set_le16(p,field,val)	set_leXX (16, p, field, val)
+
+#define get_le32(p,field)	get_leXX (32, p, field)
+#define set_le32(p,field,val)	set_leXX (32, p, field, val)
+
+#define get_le64(p,field)	get_leXX (64, p, field)
+#define set_le64(p,field,val)	set_leXX (64, p, field, val)
+
+#endif /* MISC_SWAB_H */
diff --git a/include/misc/types.h b/include/misc/types.h
new file mode 100644
index 0000000..d3da70e
--- /dev/null
+++ b/include/misc/types.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef MISC_TYPES_H
+#define MISC_TYPES_H
+
+#include <string.h>
+
+typedef unsigned char           __u8;
+typedef unsigned short int      __u16;
+typedef unsigned int            __u32;
+typedef unsigned long long int  __u64;
+
+#define INVAL_PTR	(void *)-1
+#define MAX_INT		2147483647
+#define LONG_LONG_MAX	9223372036854775807LL
+#define LONG_LONG_MIN	(-LONG_LONG_MAX - 1LL)
+
+#endif
diff --git a/include/misc/unaligned.h b/include/misc/unaligned.h
new file mode 100644
index 0000000..f61c5a3
--- /dev/null
+++ b/include/misc/unaligned.h
@@ -0,0 +1,40 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef MISC_UNALIGNED_H
+#define MISC_UNALIGNED_H
+
+#ifdef HAVE_ASM_UNALIGNED_H
+#  include <asm/unaligned.h>
+#endif
+
+#ifndef get_unaligned
+#define get_unaligned(ptr)                              \
+({                                                      \
+        __typeof__(*(ptr)) __tmp;                       \
+        memcpy(&__tmp, (ptr), sizeof(*(ptr)));      \
+        __tmp;                                          \
+})
+#endif
+
+#ifndef put_unaligned
+#define put_unaligned(val, ptr)                         \
+({                                                      \
+        __typeof__(*(ptr)) __tmp = (val);               \
+        memcpy((ptr), &__tmp, sizeof(*(ptr)));      \
+        (void)0;                                        \
+})
+#endif
+
+/* these operate on extent items, where you've got an array of ints
+** at a possibly unaligned location.  These are a noop on ia32
+**
+** p is the array of __u32, i is the index into the array, v is the value
+** to store there.
+*/
+#define d32_get(p, i)	 le32_to_cpu(get_unaligned((__u32 *)(p) + (i)))
+#define d32_put(p, i, v) put_unaligned(cpu_to_le32(v), (__u32 *)(p) + (i))
+
+#endif
diff --git a/include/reiserfs/Makefile.am b/include/reiserfs/Makefile.am
new file mode 100644
index 0000000..b3cddcf
--- /dev/null
+++ b/include/reiserfs/Makefile.am
@@ -0,0 +1,6 @@
+noinst_HEADERS	= badblock.h bitmap.h buffer.h	direntry.h extent.h \
+		  filesystem.h fix_node.h hash.h internal.h \
+		  internal_balance.h journal.h key.h leaf.h \
+		  leaf_balance.h node.h objmap.h policy.h print.h \
+		  stat.h super.h tree.h tree_balance.h libreiserfs.h \
+		  types.h
diff --git a/lib/Makefile.in b/include/reiserfs/Makefile.in
similarity index 61%
rename from lib/Makefile.in
rename to include/reiserfs/Makefile.in
index 675222a..c99707f 100644
--- a/lib/Makefile.in
+++ b/include/reiserfs/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -20,8 +20,7 @@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
+top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
@@ -35,7 +34,24 @@
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
+build_triplet = @build@
 host_triplet = @host@
+subdir = include/reiserfs
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMDEP_FALSE = @AMDEP_FALSE@
 AMDEP_TRUE = @AMDEP_TRUE@
@@ -78,6 +94,7 @@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
 RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -92,6 +109,8 @@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
 bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
@@ -112,6 +131,7 @@
 libexecdir = @libexecdir@
 localstatedir = @localstatedir@
 mandir = @mandir@
+mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
@@ -119,95 +139,47 @@
 sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
-noinst_LIBRARIES = libmisc.a
-
-libmisc_a_SOURCES = io.c misc.c 
-subdir = lib
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-
-libmisc_a_AR = $(AR) cru
-libmisc_a_LIBADD =
-am_libmisc_a_OBJECTS = io.$(OBJEXT) misc.$(OBJEXT)
-libmisc_a_OBJECTS = $(am_libmisc_a_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/io.Po ./$(DEPDIR)/misc.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(libmisc_a_SOURCES)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(libmisc_a_SOURCES)
+noinst_HEADERS = badblock.h bitmap.h buffer.h	direntry.h extent.h \
+		  filesystem.h fix_node.h hash.h internal.h \
+		  internal_balance.h journal.h key.h leaf.h \
+		  leaf_balance.h node.h objmap.h policy.h print.h \
+		  stat.h super.h tree.h tree_balance.h libreiserfs.h \
+		  types.h
 
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  include/reiserfs/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  lib/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+	  $(AUTOMAKE) --gnu  include/reiserfs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
 
-AR = ar
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-clean-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES) 
-	-rm -f libmisc.a
-	$(libmisc_a_AR) libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD)
-	$(RANLIB) libmisc.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 uninstall-info-am:
 
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -216,6 +188,7 @@
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
 	mkid -fID $$unique
+tags: TAGS
 
 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
@@ -227,10 +200,11 @@
 	  done | \
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
 ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
@@ -253,10 +227,6 @@
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
@@ -270,7 +240,7 @@
 	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
 	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
 	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
 	  else \
 	    dir=''; \
 	  fi; \
@@ -287,8 +257,7 @@
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LIBRARIES)
-
+all-am: Makefile $(HEADERS)
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -301,7 +270,7 @@
 installcheck: installcheck-am
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 	  `test -z '$(STRIP)' || \
 	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 mostlyclean-generic:
@@ -309,24 +278,25 @@
 clean-generic:
 
 distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+clean-am: clean-generic mostlyclean-am
 
 distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
 
 dvi: dvi-am
 
 dvi-am:
 
+html: html-am
+
 info: info-am
 
 info-am:
@@ -342,12 +312,12 @@
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-
+	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-generic
 
 pdf: pdf-am
 
@@ -360,15 +330,13 @@
 uninstall-am: uninstall-info-am
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-noinstLIBRARIES ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-info-am
+	ctags distclean distclean-generic distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/include/reiserfs/badblock.h b/include/reiserfs/badblock.h
new file mode 100644
index 0000000..23e7fe6
--- /dev/null
+++ b/include/reiserfs/badblock.h
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_BADBLOCK_H
+#define REISERFS_BADBLOCK_H
+
+#include "reiserfs/types.h"
+
+#define REISERFS_BAD_DID	1
+#define REISERFS_BAD_OID  (__u32)-1
+
+typedef void (*badblock_func_t) (reiserfs_filsys_t *fs, 
+				 reiserfs_path_t *badblock_path, 
+				 void *data);
+
+extern void reiserfs_badblock_extract(reiserfs_filsys_t *fs, 
+				   reiserfs_path_t *badblock_path, 
+				   void *data);
+
+extern void reiserfs_badblock_flush (reiserfs_filsys_t * fs, 
+				     int no_badblock_in_tree_yet);
+
+extern void reiserfs_badblock_traverse(reiserfs_filsys_t * fs, 
+				       badblock_func_t action, 
+				       void *data);
+
+#endif
diff --git a/include/reiserfs/bitmap.h b/include/reiserfs/bitmap.h
new file mode 100644
index 0000000..5fbbbb2
--- /dev/null
+++ b/include/reiserfs/bitmap.h
@@ -0,0 +1,89 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_BITMAP_H
+#define REISERFS_BITMAP_H
+
+#include "reiserfs/types.h"
+#include <stdio.h>
+
+#define reiserfs_bmap_nr(count, blk_size) \
+	((count - 1) / (blk_size * 8) + 1)
+
+#define reiserfs_bmap_over(nr) (nr > ((1ll << 16) - 1))
+
+extern reiserfs_bitmap_t *reiserfs_bitmap_create (unsigned int bit_count);
+
+extern int reiserfs_bitmap_open(reiserfs_filsys_t *);
+
+extern void reiserfs_bitmap_delete (reiserfs_bitmap_t * bm);
+
+extern void reiserfs_bitmap_free (reiserfs_filsys_t *);
+
+extern void reiserfs_bitmap_close (reiserfs_filsys_t *);
+
+extern int reiserfs_bitmap_flush (reiserfs_bitmap_t * bm, 
+				  reiserfs_filsys_t * fs);
+
+extern int reiserfs_bitmap_expand (reiserfs_bitmap_t * bm, 
+				   unsigned int bit_count);
+
+extern void reiserfs_bitmap_shrink (reiserfs_bitmap_t * bm, 
+				    unsigned int bit_count);
+
+extern void reiserfs_bitmap_copy (reiserfs_bitmap_t * to, 
+				  reiserfs_bitmap_t * from);
+
+extern int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1, 
+				    reiserfs_bitmap_t * bm2);
+
+extern void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * disk, 
+					 reiserfs_bitmap_t * cont);
+
+extern void reiserfs_bitmap_delta (reiserfs_bitmap_t * base, 
+				   reiserfs_bitmap_t * exclude);
+
+extern void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm, 
+				     unsigned int bit_number);
+
+extern void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm, 
+				       unsigned int bit_number);
+
+extern int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm, 
+				     unsigned int bit_number);
+
+extern int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm, 
+					  unsigned long * start);
+
+extern void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm);
+
+extern void reiserfs_bitmap_fill (reiserfs_bitmap_t * bm);
+
+extern void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm);
+
+extern unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm);
+
+extern unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm);
+
+extern int reiserfs_bitmap_spread (reiserfs_filsys_t *);
+
+extern int reiserfs_bitmap_block (reiserfs_filsys_t *, 
+				  unsigned long block);
+
+/* Backup copies. */
+extern void reiserfs_bitmap_save (FILE * fp, 
+				  reiserfs_bitmap_t *bm);
+
+extern reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp);
+
+extern void reiserfs_bitmap_print (FILE * fp, reiserfs_filsys_t * fs, 
+				   int silent);
+
+extern void reiserfs_print_bmap_block (FILE * fp, int i, 
+				       unsigned long block, 
+				       char * map, int blocks, 
+				       int silent, int blocksize);
+
+#endif
diff --git a/include/reiserfs/buffer.h b/include/reiserfs/buffer.h
new file mode 100644
index 0000000..5b5a67c
--- /dev/null
+++ b/include/reiserfs/buffer.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef REISERFS_BUFFER_H
+#define REISERFS_BUFFER_H
+
+#include "reiserfs/types.h"
+
+#define BH_Uptodate	0
+#define BH_Dirty	1
+#define BH_Lock		2
+#define BH_Do_not_flush 3
+
+#define reiserfs_buffer_uptodate(bh)	 misc_test_bit(BH_Uptodate, &(bh)->b_state)
+#define reiserfs_buffer_mkuptodate(bh,i) misc_set_bit(BH_Uptodate, &(bh)->b_state)
+
+#define reiserfs_buffer_isdirty(bh)	 misc_test_bit(BH_Dirty, &(bh)->b_state)
+#define reiserfs_buffer_isclean(bh)	 !misc_test_bit(BH_Dirty, &(bh)->b_state)
+#define reiserfs_buffer_mkdirty(bh)	 misc_set_bit(BH_Dirty, &(bh)->b_state)
+#define reiserfs_buffer_mkclean(bh)	 misc_clear_bit(BH_Dirty, &(bh)->b_state)
+
+#define reiserfs_buffer_noflush(bh)	 misc_test_bit(BH_Do_not_flush, &(bh)->b_state)
+#define reiserfs_buffer_mknoflush(bh)	 misc_set_bit(BH_Do_not_flush, &(bh)->b_state)
+#define reiserfs_buffer_clnoflush(bh)	 misc_clear_bit(BH_Do_not_flush, &(bh)->b_state)
+
+extern reiserfs_bh_t * reiserfs_buffer_open (int, unsigned long, unsigned long);
+extern reiserfs_bh_t * reiserfs_buffer_find (int, unsigned long, unsigned long);
+extern reiserfs_bh_t * reiserfs_buffer_read (int, unsigned long, unsigned long);
+
+extern int reiserfs_buffer_write (reiserfs_bh_t *);
+
+extern void reiserfs_buffer_close (reiserfs_bh_t *);
+
+extern void reiserfs_buffer_forget (reiserfs_bh_t *);
+
+extern void reiserfs_buffer_flush_all(int);
+
+extern void reiserfs_buffer_free_all (void);
+
+extern void reiserfs_buffer_invalidate_all (int);
+
+#endif
diff --git a/include/reiserfs/direntry.h b/include/reiserfs/direntry.h
new file mode 100644
index 0000000..5fe22fa
--- /dev/null
+++ b/include/reiserfs/direntry.h
@@ -0,0 +1,158 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_DIRENTRY_H
+#define REISERFS_DIRENTRY_H
+
+#include "reiserfs/types.h"
+
+/***************************************************************************/
+/*                      DIRECTORY STRUCTURE                                */
+/***************************************************************************/
+/* 
+   Picture represents the structure of directory items
+   ________________________________________________
+   |  Array of     |   |     |        |       |   |
+   | directory     |N-1| N-2 | ....   |   1st |0th|
+   | entry headers |   |     |        |       |   |
+   |_______________|___|_____|________|_______|___|
+                    <----   directory entries         ------>
+
+ First directory item has k_offset component 1. We store "." and ".."
+ in one item, always, we never split "." and ".." into differing
+ items.  This makes, among other things, the code for removing
+ directories simpler. */
+
+/* Each directory entry has its header. This header has deh_dir_id and
+   deh_objectid fields, those are key of object, entry points to */
+
+/* NOT IMPLEMENTED:   
+   Directory will someday contain stat data of object */
+struct reiserfs_de_head
+{
+    __u32 deh2_offset;  /* third component of the directory entry key */
+    __u32 deh2_dir_id;  /* objectid of the parent directory of the object,
+			   that is referenced by directory entry */
+    __u32 deh2_objectid;/* objectid of the object, that is referenced by
+			   directory entry */
+    __u16 deh2_location;/* offset of name in the whole item */
+    __u16 deh2_state;   /* whether 1) entry contains stat data (for future),
+			   and 2) whether entry is hidden (unlinked) */
+} __attribute__ ((__packed__));
+
+typedef struct reiserfs_de_head reiserfs_deh_t;
+
+#define REISERFS_DEH_SIZE sizeof(reiserfs_deh_t)
+
+/* set/get fields of dir entry head these defines */
+#define reiserfs_deh_get_off(deh)	get_le32 (deh, deh2_offset)
+#define reiserfs_deh_set_off(deh,val)	set_le32 (deh, deh2_offset, val)
+
+#define reiserfs_deh_get_did(deh)	get_le32 (deh, deh2_dir_id)
+#define reiserfs_deh_set_did(deh,val)	set_le32 (deh, deh2_dir_id, val)
+
+#define reiserfs_deh_get_obid(deh)	get_le32 (deh, deh2_objectid)
+#define reiserfs_deh_set_obid(deh,val)	set_le32 (deh, deh2_objectid, val)
+
+#define reiserfs_deh_get_loc(deh)	get_le16 (deh, deh2_location)
+#define reiserfs_deh_set_loc(deh,val)	set_le16 (deh, deh2_location, val)
+
+#define reiserfs_deh_get_state(deh)	get_le16 (deh, deh2_state)
+#define reiserfs_deh_set_state(deh,val)	set_le16 (deh, deh2_state, val)
+
+#define reiserfs_deh_name(deh, pos)				\
+	((char *)(deh - pos) + reiserfs_deh_get_loc(deh))
+
+/* empty directory contains two entries "." and ".." and their headers */
+#define REISERFS_DIR_MIN					\
+	(REISERFS_DEH_SIZE * 2 +				\
+	 MISC_ROUND_UP (strlen (".")) +				\
+	 MISC_ROUND_UP (strlen ("..")))
+
+/* old format directories have this size when empty */
+#define REISERFS_DIR_MIN_V1 (REISERFS_DEH_SIZE * 2 + 3)
+
+#define DEH_Statdata 0			/* not used now */
+#define DEH_Visible2 2
+
+#define DEH_Bad_offset 4 /* fsck marks entries to be deleted with this flag */
+#define DEH_Bad_location 5
+
+#define reiserfs_deh_state_bit(deh,bit)				\
+	(reiserfs_deh_get_state (deh) & (1 << bit))
+
+#define reiserfs_deh_state_set_bit(deh,bit)			\
+{								\
+	__u16 state;						\
+	state = reiserfs_deh_get_state (deh);			\
+	state |= (1 << bit);					\
+	reiserfs_deh_set_state(deh, state);			\
+}
+
+#define reiserfs_deh_state_clear_bit(deh,bit)			\
+{								\
+	__u16 state;						\
+	state = reiserfs_deh_get_state (deh);			\
+	state &= ~(1 << bit);					\
+	reiserfs_deh_set_state(deh, state);			\
+}
+
+/* Bad means "hashed unproperly or/and invalid location" */
+#define reiserfs_deh_locbad(deh)				\
+	reiserfs_deh_state_bit (deh, DEH_Bad_location)
+#define reiserfs_deh_set_locbad(deh)				\
+	reiserfs_deh_state_set_bit (deh, DEH_Bad_location)
+#define reiserfs_deh_set_locok(deh)				\
+	reiserfs_deh_state_clear_bit (deh, DEH_Bad_location)
+
+#define reiserfs_deh_offbad(deh)				\
+	reiserfs_deh_state_bit (deh, DEH_Bad_offset)
+#define reiserfs_deh_set_offbad(deh)				\
+	reiserfs_deh_state_set_bit (deh, DEH_Bad_offset)
+
+#define reiserfs_deh_bad(deh)					\
+	(reiserfs_deh_locbad(deh) || reiserfs_deh_offbad(deh))
+
+
+/* for directories st_blocks is number of 512 byte units which fit into dir
+   size round up to blocksize */
+#define REISERFS_DIR_BLOCKS(size) ((size + 511) / 512)
+
+/* array of the entry headers */
+#define reiserfs_deh(bh,ih) ((reiserfs_deh_t *)(reiserfs_item_by_ih(bh,ih)))
+
+#define REISERFS_NAME_MAX	256
+/* #define REISERFS_NAME_MAX(block_size)				\
+	(block_size - REISERFS_NODEH_SIZE -			\
+	 REISERFS_IH_SIZE - REISERFS_DEH_SIZE)
+*/
+
+/* -REISERFS_SD_SIZE when entry will contain stat data */
+
+extern int reiserfs_direntry_loc_check (reiserfs_deh_t * deh, 
+					reiserfs_ih_t * ih, 
+					int first);
+
+extern int reiserfs_direntry_entry_len (reiserfs_ih_t * ih, 
+					reiserfs_deh_t * deh,
+					int pos_in_item);
+
+extern int reiserfs_direntry_name_len (reiserfs_ih_t * ih,
+				       reiserfs_deh_t * deh, 
+				       int pos_in_item);
+
+extern int reiserfs_direntry_entry_estimate (char * name, 
+					     int key_format);
+
+extern int reiserfs_direntry_check (reiserfs_filsys_t * fs, 
+				    reiserfs_ih_t * ih, 
+				    char * item, 
+				    int bad_dir);
+
+extern void reiserfs_direntry_print (FILE * fp, 
+				     reiserfs_filsys_t * fs,
+				     reiserfs_bh_t * bh, 
+				     reiserfs_ih_t * ih);
+#endif
diff --git a/include/reiserfs/extent.h b/include/reiserfs/extent.h
new file mode 100644
index 0000000..fc4f142
--- /dev/null
+++ b/include/reiserfs/extent.h
@@ -0,0 +1,26 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_EXTENT_H
+#define REISERFS_EXTENT_H
+
+#include "reiserfs/types.h"
+
+/* Size of pointer to the unformatted node. */
+#define REISERFS_EXT_SIZE (sizeof(__u32))
+
+/* number of blocks pointed to by the extent item */
+#define reiserfs_ext_count(p_s_ih) \
+	(reiserfs_ih_get_len(p_s_ih) / REISERFS_EXT_SIZE)
+	
+extern int reiserfs_ext_check (reiserfs_filsys_t * fs, 
+			       reiserfs_ih_t * ih, char * item,
+			       unfm_func_t func);
+
+extern void reiserfs_ext_print(FILE * fp, 
+			       reiserfs_bh_t * bh, 
+			       int item_num);
+
+#endif
diff --git a/include/reiserfs/filesystem.h b/include/reiserfs/filesystem.h
new file mode 100644
index 0000000..b556344
--- /dev/null
+++ b/include/reiserfs/filesystem.h
@@ -0,0 +1,73 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_FS_H
+#define REISERFS_FS_H
+
+#include <reiserfs/types.h>
+
+/* ReiserFS leaves the first 64k unused, so that partition labels have enough
+   space.  If someone wants to write a fancy bootloader that needs more than
+   64k, let us know, and this will be increased in size.  This number must be
+   larger than than the largest block size on any platform, or code will
+   break.  -Hans */
+#define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)
+
+/*#define MD_RAID_SUPERBLOCKS_IN_BYTES (128 * 1024)*/
+
+/* the spot for the super in versions 3.5 - 3.5.11 (inclusive) */
+#define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)
+
+#define reiserfs_ondisk_offset(block_of_super_block, block_size)	\
+	(block_of_super_block * block_size)
+
+#define reiserfs_new_location(block_of_super_block, block_size)		\
+    ((reiserfs_ondisk_offset(block_of_super_block, block_size) ==	\
+      REISERFS_DISK_OFFSET_IN_BYTES) ? 1 : 0)
+	
+/*only 4k blocks for old location*/
+#define reiserfs_old_location(block_of_super_block, block_size)		\
+    ((reiserfs_ondisk_offset(block_of_super_block, 4096) ==		\
+      REISERFS_OLD_DISK_OFFSET_IN_BYTES) ? 1 : 0)
+
+enum reiserfs_blktype {
+    BT_INVAL	= 0x1,
+    BT_SUPER	= 0x2,
+    BT_JOURNAL	= 0x3,
+    BT_BITMAP	= 0x4,
+    BT_UNKNOWN
+};
+
+typedef enum reiserfs_blktype reiserfs_blktype_t;
+
+extern reiserfs_filsys_t * reiserfs_fs_open (char * filename, 
+					     int flags, 
+					     int * error, 
+					     void * vp, 
+					     int skip_check);
+
+extern reiserfs_filsys_t * reiserfs_fs_create (char * filename, 
+					       int version, 
+					       unsigned long block_count,
+					       int block_size, 
+					       int default_journal, 
+					       int new_format);
+
+extern void reiserfs_fs_flush (reiserfs_filsys_t *);
+
+extern void reiserfs_fs_free (reiserfs_filsys_t *);
+
+extern void reiserfs_fs_close (reiserfs_filsys_t *);
+
+extern void reiserfs_fs_reopen (reiserfs_filsys_t *, int flags);
+
+extern int reiserfs_fs_rw (reiserfs_filsys_t * fs);
+
+extern int reiserfs_fs_blksize_check (unsigned int blocksize);
+
+extern reiserfs_blktype_t reiserfs_fs_block(reiserfs_filsys_t *fs, 
+					    unsigned long block);
+
+#endif
diff --git a/include/reiserfs/fix_node.h b/include/reiserfs/fix_node.h
new file mode 100644
index 0000000..62cd005
--- /dev/null
+++ b/include/reiserfs/fix_node.h
@@ -0,0 +1,76 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_FIX_NODE_H
+#define REISERFS_FIX_NODE_H
+
+#include <reiserfs/types.h>
+#include <reiserfs/tree_balance.h>
+
+/* maximum number of FEB blocknrs on a single level */
+#define FN_AMOUNT_MAX 2
+
+/* To make any changes in the tree we always first find node, that contains
+   item to be changed/deleted or place to insert a new item. We call this node
+   S. To do balancing we need to decide what we will shift to left/right
+   neighbor, or to a new node, where new item will be etc. To make this
+   analysis simpler we build virtual node. Virtual node is an array of items,
+   that will replace items of node S. (For instance if we are going to delete
+   an item, virtual node does not contain it). Virtual node keeps information
+   about item sizes and types, mergeability of first and last items, sizes of
+   all entries in directory item. We use this array of items when calculating
+   what we can shift to neighbors and how many nodes we have to have if we do
+   not any shiftings, if we shift to left/right neighbor or to both. */
+struct reiserfs_virtual_item
+{
+    /* item type, mergeability */
+    unsigned short vi_type;	
+    /* length of item that it will have after balancing */
+    unsigned short vi_item_len; 
+    /* offset of item that it have before balancing */
+    __u64 vi_item_offset; 
+
+    /* number of entries in directory item (including the new one if any, 
+       or excluding entry if it must be cut) */
+    short vi_entry_count;	
+    /* array of entry lengths for directory item */
+    unsigned short * vi_entry_sizes; 
+};
+
+struct reiserfs_virtual_node
+{
+    /* this is a pointer to the free space in the buffer */
+    char * vn_free_ptr;	 
+    /* number of items in virtual node */
+    unsigned short vn_nr_item;	
+    /* size of node , that node would have if it has unlimited size and no 
+       balancing is performed */
+    short vn_size; 
+    /* mode of balancing (paste, insert, delete, cut) */
+    short vn_mode;		
+    short vn_affected_item_num; 
+    short vn_pos_in_item;
+    /* item header of inserted item, 0 for other modes */
+    reiserfs_ih_t * vn_ins_ih;	
+    /* array of items (including a new one, excluding item to be deleted) */
+    struct reiserfs_virtual_item * vn_vi;	
+};
+
+extern int reiserfs_fix_nodes (int n_op_mode, 
+			       reiserfs_tb_t * p_s_tb,
+			       reiserfs_ih_t * p_s_ins_ih);
+
+extern void reiserfs_unfix_nodes (reiserfs_tb_t *);
+
+/* FIXME: move these 2 into tree.h when get rid of search_by_key */
+extern reiserfs_bh_t * reiserfs_tree_right_neighbor (reiserfs_filsys_t * s, 
+							  reiserfs_path_t * path);
+
+extern reiserfs_bh_t * reiserfs_tree_left_neighbor (reiserfs_filsys_t * s, 
+							 reiserfs_path_t * path);
+
+extern void reiserfs_fix_node_print(struct reiserfs_virtual_node * vn);
+
+#endif
diff --git a/include/reiserfs/hash.h b/include/reiserfs/hash.h
new file mode 100644
index 0000000..8d9d28c
--- /dev/null
+++ b/include/reiserfs/hash.h
@@ -0,0 +1,52 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_HASH_H
+#define REISERFS_HASH_H
+
+#include "misc/types.h"
+
+#define UNSET_HASH 0 // read_super will guess about, what hash names
+                     // in directories were sorted with
+
+enum {
+    REISERFS_HASH_TEA	= 0x1,
+    REISERFS_HASH_YURA	= 0x2,
+    REISERFS_HASH_R5	= 0x3,
+    REISERFS_HASH_LAST
+};
+
+#define DEFAULT_HASH REISERFS_HASH_R5
+
+/* hashes.c */
+extern __u32 reiserfs_hash_keyed (const char *msg, int len);
+
+extern __u32 reiserfs_hash_yura (const char *msg, int len);
+
+extern __u32 reiserfs_hash_r5 (const char *msg, int len);
+
+extern int reiserfs_hash_count (void);
+
+extern int reiserfs_hash_correct (hashf_t *func, 
+				  char * name, 
+				  int namelen, 
+				  __u32 offset);
+
+extern int reiserfs_hash_find (char * name, 
+			       int namelen, 
+			       __u32 deh_offset, 
+			       unsigned int code_to_try_first);
+
+extern char *reiserfs_hash_name (unsigned int code);
+
+extern int reiserfs_hash_code (hashf_t func);
+
+extern hashf_t reiserfs_hash_func (unsigned int code);
+
+extern hashf_t reiserfs_hash_get (char * hash);
+
+extern __u32 reiserfs_hash_value (hashf_t func, char * name, int namelen);
+
+#endif
diff --git a/include/reiserfs/internal.h b/include/reiserfs/internal.h
new file mode 100644
index 0000000..79d7748
--- /dev/null
+++ b/include/reiserfs/internal.h
@@ -0,0 +1,78 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_INTERNAL_H
+#define REISERFS_INTERNAL_H
+
+/*
+ * Picture represents an internal node of the reiserfs tree
+ *  ______________________________________________________
+ * |      |  Array of     |  Array of         |  Free     |
+ * |block |    keys       |  pointers         | space     |
+ * | head |      N        |      N+1          |           |
+ * |______|_______________|___________________|___________|
+ */
+
+
+/* Disk child pointer: The pointer from an internal node of the tree
+   to a node that is on disk. */
+struct reiserfs_dc {
+    __u32 dc2_block_number;              /* Disk child's block number. */
+    __u16 dc2_size;		            /* Disk child's used space.   */
+    __u16 dc2_reserved;
+} __attribute__ ((__packed__));
+
+typedef struct reiserfs_dc reiserfs_dc_t;
+
+#define REISERFS_DC_SIZE (sizeof(reiserfs_dc_t))
+
+/* set/get fields of disk_child with these defines */
+#define reiserfs_dc_get_nr(dc)		get_le32 (dc, dc2_block_number)
+#define reiserfs_dc_set_nr(dc,val)	set_le32 (dc, dc2_block_number, val)
+
+#define reiserfs_dc_get_size(dc)	get_le16 (dc, dc2_size)
+#define reiserfs_dc_set_size(dc,val)	set_le16 (dc, dc2_size, val)
+
+#define reiserfs_dc_init(dc, size, blocknr)				\
+({									\
+    reiserfs_dc_set_nr(dc, blocknr);					\
+    reiserfs_dc_set_size(dc, size);					\
+    set_le16(dc, dc2_reserved, 0);					\
+})
+
+/* max and min number of keys in internal node */
+#define REISERFS_INT_MAX(bh)	\
+	((REISERFS_NODE_SPACE(bh->b_size) - REISERFS_DC_SIZE) /		\
+	 (REISERFS_KEY_SIZE+REISERFS_DC_SIZE))
+
+#define REISERFS_INT_MIN(bh)	(REISERFS_INT_MAX(bh) / 2)
+
+/* get key */
+#define reiserfs_int_key_at(bh,item_num)				\
+	((reiserfs_key_t * )((bh)->b_data + REISERFS_NODEH_SIZE) +	\
+	 (item_num) )
+
+/* Get disk child by buffer header and position in the tree node. */
+#define reiserfs_int_at(p_s_bh,n_pos)					\
+	((reiserfs_dc_t *) ((p_s_bh)->b_data + REISERFS_NODEH_SIZE +	\
+			    reiserfs_node_items(p_s_bh) * REISERFS_KEY_SIZE +\
+			    REISERFS_DC_SIZE * (n_pos)))
+
+#define reiserfs_int_head(bh)						\
+	((reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) >	\
+	  LEAF_LEVEL) &&						\
+	 (reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) <=	\
+	  REISERFS_TREE_HEIGHT_MAX))
+
+extern int reiserfs_internal_correct (reiserfs_bh_t *bh);
+
+extern int reiserfs_internal_print (FILE * fp, 
+				    reiserfs_bh_t * bh, 
+				    int first, int last);
+
+extern int reiserfs_internal_get_pos (reiserfs_bh_t * bh, 
+				      unsigned long block);
+
+#endif
diff --git a/include/reiserfs/internal_balance.h b/include/reiserfs/internal_balance.h
new file mode 100644
index 0000000..fd60c7b
--- /dev/null
+++ b/include/reiserfs/internal_balance.h
@@ -0,0 +1,14 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_IB_H
+#define REISERFS_IB_H
+
+extern int reiserfs_ib_balance (reiserfs_tb_t * tb,
+				int h, int child_pos,
+				reiserfs_ih_t * insert_key,
+				reiserfs_bh_t ** insert_ptr);
+
+#endif
diff --git a/include/reiserfs/journal.h b/include/reiserfs/journal.h
new file mode 100644
index 0000000..c995bc9
--- /dev/null
+++ b/include/reiserfs/journal.h
@@ -0,0 +1,211 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_JOURNAL_H
+#define REISERFS_JOURNAL_H
+
+#define reiserfs_jp_get_start(jp)	   get_le32(jp, jp_start)
+#define reiserfs_jp_set_start(jp,val)	   set_le32(jp, jp_start, val)
+
+#define reiserfs_jp_get_dev(jp)		   get_le32 (jp, jp_dev)
+#define reiserfs_jp_set_dev(jp,val)	   set_le32 (jp, jp_dev, val)
+
+#define reiserfs_jp_get_size(jp)	   get_le32 (jp, jp_size)
+#define reiserfs_jp_set_size(jp,val)	   set_le32 (jp, jp_size, val)
+
+#define reiserfs_jp_get_tlen(jp)	   get_le32 (jp, jp_tlen)
+#define reiserfs_jp_set_tlen(jp,val)	   set_le32 (jp, jp_tlen, val)
+
+#define reiserfs_jp_get_magic(jp)	   get_le32 (jp, jp_magic)
+#define reiserfs_jp_set_magic(jp,val)	   set_le32 (jp, jp_magic, val)
+
+#define NEED_TUNE 0xffffffff
+
+#define reiserfs_jp_get_max_batch(jp)	   get_le32 (jp, jp_max_batch)
+#define reiserfs_jp_set_max_batch(jp,val)  set_le32 (jp, jp_max_batch, val)
+
+#define reiserfs_jp_get_commit_age(jp)     get_le32 (jp, jp_commit_age)
+#define reiserfs_jp_set_commit_age(jp,val) set_le32 (jp, jp_commit_age, val)
+
+#define reiserfs_jp_get_trans_age(jp)	   get_le32 (jp, jp_trans_age)
+#define reiserfs_jp_set_trans_age(jp,val)  set_le32 (jp, jp_trans_age, val)
+
+/* must be correct to keep the desc and commit structs at 4k */
+/* first block written in a commit.  BUG, not 64bit safe */
+struct reiserfs_journal_desc {
+    /* id of commit */
+    __u32 j2_trans_id ;	
+    /* length of commit. len +1 is the commit block */
+    __u32 j2_len ;	
+    /* mount id of this trans*/
+    __u32 j2_mount_id ;	
+    /* real locations for each block */    
+    __u32 j2_realblock[1] ; 
+};
+
+#define reiserfs_jd_magic(bh) (bh->b_data + bh->b_size - 12)
+
+#define reiserfs_jd_head(bh)		((struct reiserfs_journal_desc *)bh->b_data)
+
+#define reiserfs_jd_get_trans(bh)	get_le32 (reiserfs_jd_head (bh), j2_trans_id)
+#define reiserfs_jd_set_trans(bh,val)	set_le32 (reiserfs_jd_head (bh), j2_trans_id, val)
+
+#define reiserfs_jd_get_len(bh)		get_le32 (reiserfs_jd_head (bh), j2_len)
+#define reiserfs_jd_set_len(bh,val)	set_le32 (reiserfs_jd_head (bh), j2_len, val)
+
+#define reiserfs_jd_get_mount(bh)	get_le32 (reiserfs_jd_head (bh), j2_mount_id)
+#define reiserfs_jd_set_mount(bh,val)	set_le32 (reiserfs_jd_head (bh), j2_mount_id, val)
+    
+
+/* last block written in a commit BUG, not 64bit safe */
+struct reiserfs_journal_commit {
+    __u32 j3_trans_id ;	 /* must match j_trans_id from the desc block */
+    __u32 j3_len ;	 /* ditto */
+    __u32 j3_realblock[1] ; /* real locations for each block */
+} ;
+
+#define reiserfs_jc_head(bh) ((struct reiserfs_journal_commit *)bh->b_data)
+
+#define reiserfs_jc_get_trans(bh)	 get_le32 (reiserfs_jc_head(bh), j3_trans_id)
+#define reiserfs_jc_set_trans(bh,val)	 set_le32 (reiserfs_jc_head(bh), j3_trans_id, val)
+
+#define reiserfs_jc_get_len(bh)	get_le32 (reiserfs_jc_head(bh), j3_len)
+#define reiserfs_jc_set_len(bh,val)	 set_le32 (reiserfs_jc_head(bh), j3_len, val)
+
+
+/* set/get fields of journal header with these defines */
+#define reiserfs_jh_get_mount(jh)	get_le32 (jh, jh_mount_id)
+#define reiserfs_jh_set_mount(jh,val)	set_le32 (jh, jh_mount_id, val)
+
+#define reiserfs_jh_get_flushed(jh)	get_le32 (jh, jh_last_flush_trans_id)
+#define reiserfs_jh_set_flushed(jh,val)	set_le32 (jh, jh_last_flush_trans_id, val)
+
+#define reiserfs_jh_get_start(jh)	get_le32 (jh, jh_flush_offset)
+#define reiserfs_jh_set_start(jh,val)	set_le32 (jh, jh_flush_offset, val)
+
+
+/* Journal Transaction Half */
+#define reiserfs_jt_half(blocksize)				\
+	((blocksize - sizeof (struct reiserfs_journal_desc) +	\
+	  sizeof (__u32) - 12) / sizeof (__u32))
+
+
+/* journal default settings */
+#define JOURNAL_MIN_SIZE 	512
+
+/* biggest possible single transaction, don't change for now (8/3/99) */
+#define JOURNAL_TRANS_MAX 	1024
+
+/* need to check whether it works */
+#define JOURNAL_TRANS_MIN 	256
+/* default journal size / max trans length */
+#define JOURNAL_DEFAULT_RATIO 	8
+#define JOURNAL_MIN_RATIO 	2
+/* max blocks to batch into one transaction, don't make this 
+   any bigger than 900 */
+#define JOURNAL_MAX_BATCH   	900
+
+#define JOURNAL_MAX_COMMIT_AGE 	30
+#define JOURNAL_MAX_TRANS_AGE 	30
+
+/* journal max size is a maximum number of blocks pointed by first bitmap -
+   REISERFS_DISK_OFFSET - superblock - first bitmap - journal herader */
+#define reiserfs_journal_max(sb_nr,blocksize)			\
+	blocksize * 8 - (sb_nr + 1 + 1 + 1)
+
+#define reiserfs_journal_default(sb_nr,blocksize)		\
+	(unsigned long long)					\
+	((8192 > reiserfs_journal_max (sb_nr,blocksize)) ?	\
+	 reiserfs_journal_max (sb_nr,blocksize) : 8192)
+
+struct reiserfs_trans {
+    unsigned long mount_id;
+    unsigned long trans_id;
+    unsigned long desc_blocknr;
+    unsigned long trans_len;
+    unsigned long commit_blocknr;
+    unsigned long next_trans_offset;
+};
+
+typedef struct reiserfs_trans reiserfs_trans_t;
+
+extern unsigned long reiserfs_journal_hostsize (reiserfs_sb_t *sb);
+
+extern int reiserfs_journal_block (reiserfs_filsys_t *, 
+				   unsigned long block);
+
+extern int reiserfs_journal_desc_valid (reiserfs_bh_t *);
+
+extern int reiserfs_journal_get_transactions (reiserfs_filsys_t *, 
+					      reiserfs_trans_t *,
+					      reiserfs_trans_t *);
+
+typedef void (*action_on_trans_t) (reiserfs_filsys_t *, 
+				   reiserfs_trans_t *);
+
+extern void reiserfs_journal_by_transaction (reiserfs_filsys_t *, 
+					     action_on_trans_t);
+
+typedef void (*action_on_block_t) (reiserfs_filsys_t *, 
+				   reiserfs_trans_t *,
+				   unsigned int index,
+				   unsigned long in_journal,
+				   unsigned long in_place);
+
+extern void reiserfs_journal_foreach (reiserfs_filsys_t * fs, 
+				      reiserfs_trans_t * trans,
+				      action_on_block_t action);
+
+extern int reiserfs_journal_open (reiserfs_filsys_t *, 
+				  char *, int flags);
+
+extern int reiserfs_journal_params_check(reiserfs_filsys_t *fs);
+
+extern int reiserfs_journal_create (reiserfs_filsys_t * fs, 
+				    char * j_filename,
+				    unsigned long offset, 
+				    unsigned long len, 
+				    int transaction_max_size);
+
+extern int reiserfs_journal_opened (reiserfs_filsys_t *);
+
+extern void reiserfs_journal_flush (reiserfs_filsys_t * fs);
+
+extern void reiserfs_journal_free (reiserfs_filsys_t * fs);
+
+extern void reiserfs_journal_close (reiserfs_filsys_t *);
+
+extern void reiserfs_journal_reopen (reiserfs_filsys_t * fs, int flag);
+
+extern int reiserfs_journal_replay (reiserfs_filsys_t * fs);
+
+extern __u32 reiserfs_journal_trans_age (void);
+
+extern __u32 reiserfs_journal_commit_age (void);
+
+extern __u32 reiserfs_journal_batch (unsigned long journal_trans_max);
+
+extern __u32 reiserfs_journal_tlen (__u32 desired, 
+				    __u32 journal_size, 
+				    int blocksize, 
+				    int verbose);
+
+extern unsigned int reiserfs_journal_start_must (reiserfs_filsys_t * fs);
+
+extern int reiserfs_journal_fits (unsigned long sb_nr, 
+				  unsigned int block_size,
+				  unsigned long block_count, 
+				  unsigned long journal_size);
+
+extern void reiserfs_journal_print_params (FILE * fp, 
+					   reiserfs_journal_param_t * jp);
+
+extern void reiserfs_journal_print_header (reiserfs_filsys_t * fs);
+
+extern void reiserfs_journal_print (reiserfs_filsys_t *);
+
+extern int reiserfs_print_jdesc (FILE * fp, reiserfs_bh_t * bh);
+
+#endif
diff --git a/include/reiserfs/key.h b/include/reiserfs/key.h
new file mode 100644
index 0000000..55081c9
--- /dev/null
+++ b/include/reiserfs/key.h
@@ -0,0 +1,126 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_KEY_H
+#define REISERFS_KEY_H
+
+/* set/get fields of keys on disk with these defines */
+#define reiserfs_key_get_did(k)		get_le32 (k, k2_dir_id)
+#define reiserfs_key_set_did(k,val)	set_le32 (k, k2_dir_id, val)
+
+#define reiserfs_key_get_oid(k)		get_le32 (k, k2_objectid)
+#define reiserfs_key_set_oid(k,val)	set_le32 (k, k2_objectid, val)
+
+#define reiserfs_key_get_off1(k)	get_le32 (k, u.k2_offset_v1.k_offset)
+#define reiserfs_key_set_off1(k,val)	set_le32 (k, u.k2_offset_v1.k_offset, val)
+
+#define reiserfs_key_get_uni(k)		get_le32 (k, u.k2_offset_v1.k_uniqueness)
+#define reiserfs_key_set_uni(k,val)	set_le32 (k, u.k2_offset_v1.k_uniqueness, val)
+
+#define REISERFS_KEY_SIZE		(sizeof(reiserfs_key_t))
+#define REISERFS_KEY_SHSIZE		8
+
+
+// values for k_uniqueness field of the reiserfs_key_t
+#define UNI_SD		0
+#define UNI_DE		500
+#define UNI_DE		500
+#define UNI_DIRECT	0xffffffff
+#define UNI_EXT		0xfffffffe
+#define UNI_UNKN	555
+
+/* values for k_type field of the reiserfs_key_t */
+#define TYPE_STAT_DATA 0x0
+#define TYPE_EXTENT    0x1
+#define TYPE_DIRECT    0X2
+#define TYPE_DIRENTRY  0X3
+#define TYPE_LAST      0x4
+#define TYPE_UNKNOWN   0xf
+
+#define KEY_FORMAT_1 0
+#define KEY_FORMAT_2 1
+#define KEY_FORMAT_UNDEFINED 15
+
+ /* Our function for comparing keys can compare keys of different lengths.
+    It takes as a parameter the length of the keys it is to compare. These
+    defines are used in determining what is to be passed to it as that
+    parameter. */
+#define REISERFS_KEY_LEN     4
+#define REISERFS_KEY_SHORT_LEN    2
+
+/* there are 4 types of items: stat data, directory item, extent, direct.
+   FIXME: This table does not describe new key format
++-------------------+------------+--------------+------------+
+|	            |  k_offset  | k_uniqueness | mergeable? |
++-------------------+------------+--------------+------------+
+|     stat data     |	0        |      0       |   no       |
++-------------------+------------+--------------+------------+
+| 1st directory item| OFFSET_DOT |DIRENTRY_UNIQU|   no       | 
+| non 1st directory | hash value |              |   yes      |
+|     item          |            |              |            |
++-------------------+------------+--------------+------------+
+| extent item     | offset + 1 |TYPE_EXTENT | if not the first object EXT item
++-------------------+------------+--------------+------------+
+| direct item       | offset + 1 |TYPE_DIRECT   | if not the first object direct item 
++-------------------+------------+--------------+------------+
+*/
+
+#define reiserfs_key_stat(p_s_key) 	\
+	(reiserfs_key_get_type (p_s_key) == TYPE_STAT_DATA )
+#define reiserfs_key_dir(p_s_key)	\
+	(reiserfs_key_get_type (p_s_key) == TYPE_DIRENTRY )
+#define reiserfs_key_direct(p_s_key) 	\
+	(reiserfs_key_get_type (p_s_key) == TYPE_DIRECT )
+#define reiserfs_key_ext(p_s_key)	\
+	(reiserfs_key_get_type (p_s_key) == TYPE_EXTENT )
+#define reiserfs_key_unkn(p_s_key)	\
+	(reiserfs_key_get_type (p_s_key) >= TYPE_LAST)
+
+#define MAX_KEY1_OFFSET	 0xffffffff
+#define MAX_KEY2_OFFSET  0xfffffffffffffffLL
+
+/* hash value occupies 24 bits starting from 7 up to 30 */
+#define OFFSET_HASH(offset) ((offset) & 0x7fffff80)
+/* generation number occupies 7 bits starting from 0 up to 6 */
+#define OFFSET_GEN(offset) ((offset) & 0x0000007f)
+
+#define OFFSET_SD  0
+#define OFFSET_DOT 1
+#define OFFSET_DOT_DOT 2
+
+extern const reiserfs_key_t MIN_KEY;
+extern const reiserfs_key_t MAX_KEY;
+extern const reiserfs_key_t root_dir_key;
+extern const reiserfs_key_t parent_root_dir_key;
+extern reiserfs_key_t lost_found_dir_key;
+
+extern void reiserfs_key_copy (reiserfs_key_t * to, const reiserfs_key_t * from);
+extern void reiserfs_key_copy2 (reiserfs_key_t * to, const reiserfs_key_t * from);
+extern int  reiserfs_key_comp (const void * k1, const void * k2);
+extern int  reiserfs_key_comp3 (const void * k1, const void * k2);
+extern int  reiserfs_key_comp2 (const void * p_s_key1, const void * p_s_key2);
+
+extern int reiserfs_key_format (const reiserfs_key_t * key);
+
+extern unsigned long long reiserfs_key_get_off (const reiserfs_key_t * key);
+
+extern int reiserfs_key_get_type (const reiserfs_key_t * key);
+
+extern char * reiserfs_key_name (const reiserfs_key_t * key);
+
+extern void reiserfs_key_set_type (int format, 
+				   reiserfs_key_t * key, 
+				   int type);
+
+extern void reiserfs_key_set_off (int format, 
+				  reiserfs_key_t * key, 
+				  unsigned long long offset);
+
+extern void reiserfs_key_set_sec (int format, 
+				  reiserfs_key_t * key, 
+				  unsigned long long offset, 
+				  int type);
+
+#endif
diff --git a/include/reiserfs/leaf.h b/include/reiserfs/leaf.h
new file mode 100644
index 0000000..fda829f
--- /dev/null
+++ b/include/reiserfs/leaf.h
@@ -0,0 +1,197 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ *
+ * Leaf balancing method declarations.
+ *
+ */
+
+#ifndef REISERFS_LEAF_H
+#define REISERFS_LEAF_H
+
+#include <reiserfs/types.h>
+#include <misc/bitops.h>
+
+/* size of item header     */
+#define REISERFS_IH_SIZE (sizeof(reiserfs_ih_t))
+
+/* set/get fields of item head on disk with these defines */
+#define reiserfs_ih_get_entries(ih)	get_le16 (ih, u.ih2_entry_count)
+#define reiserfs_ih_set_entries(ih,val)	set_le16 (ih, u.ih2_entry_count, val)
+
+#define reiserfs_ih_get_free(ih)	get_le16 (ih, u.ih2_free_space)
+#define reiserfs_ih_set_free(ih,val)	set_le16 (ih, u.ih2_free_space, 0)
+
+#define reiserfs_ih_get_len(ih)		get_le16 (ih, ih2_item_len)
+#define reiserfs_ih_set_len(ih,val)	set_le16 (ih, ih2_item_len, val)
+
+#define reiserfs_ih_get_loc(ih)		get_le16 (ih, ih2_item_location)
+#define reiserfs_ih_set_loc(ih,val)	set_le16 (ih, ih2_item_location, val)
+
+#define reiserfs_ih_format_v1(ih) (reiserfs_ih_get_format (ih) == KEY_FORMAT_1)
+
+#define IH_Unreachable 0
+#define IH_Was_Tail    1
+#define IH_Checked     2
+#define IH_Writable    3
+
+/* Unreachable bit is set on tree rebuilding and is cleared in semantic pass */
+#define reiserfs_ih_clflags(ih)	reiserfs_ih_set_flags (ih, 0)
+
+#define reiserfs_ih_isreach(ih)						\
+	(!(reiserfs_ih_get_flags (ih) & (1 << IH_Unreachable)))
+	
+#define reiserfs_ih_clunreach(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) & ~(1 << IH_Unreachable))
+
+#define reiserfs_ih_mkunreach(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) |	(1 << IH_Unreachable))
+
+#define reiserfs_ih_wastail(ih)						\
+	(reiserfs_ih_get_flags (ih) & (1 << IH_Was_Tail))
+	
+#define reiserfs_ih_mktail(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) | (1 << IH_Was_Tail))
+
+#define reiserfs_ih_cltail(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) & ~(1 << IH_Was_Tail))
+
+#define reiserfs_ih_ischeck(ih)						\
+	(reiserfs_ih_get_flags (ih) & (1 << IH_Checked))
+	
+#define reiserfs_ih_mkcheck(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) | (1 << IH_Checked))
+
+#define reiserfs_ih_clcheck(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) & ~(1 << IH_Checked))
+
+#define reiserfs_ih_iswrite(ih)						\
+	(reiserfs_ih_get_flags (ih) & (1 << IH_Writable))
+	
+#define reiserfs_ih_mkwrite(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) | (1 << IH_Writable))
+	
+#define reiserfs_ih_clwrite(ih) reiserfs_ih_set_flags (ih,		\
+	reiserfs_ih_get_flags (ih) & ~(1 << IH_Writable))
+
+
+#define reiserfs_ih_stat(p_s_ih) 	reiserfs_key_stat(&((p_s_ih)->ih_key))
+#define reiserfs_ih_dir(p_s_ih)		reiserfs_key_dir(&((p_s_ih)->ih_key))
+#define reiserfs_ih_direct(p_s_ih) 	reiserfs_key_direct(&((p_s_ih)->ih_key))
+#define reiserfs_ih_ext(p_s_ih) 	reiserfs_key_ext(&((p_s_ih)->ih_key))
+
+
+/* maximal length of item */
+#define REISERFS_ITEM_MAX(block_size)					\
+	(block_size - REISERFS_NODEH_SIZE - REISERFS_IH_SIZE)
+
+#define REISERFS_ITEM_MIN	1
+
+#define REISERFS_DIRECT_MAX(size)					\
+	((size) - REISERFS_NODEH_SIZE - 2 * REISERFS_IH_SIZE -		\
+	 REISERFS_SD_SIZE - REISERFS_EXT_SIZE)
+
+/* get the item header */ 
+#define reiserfs_ih_at(bh,item_num)					\
+	((reiserfs_ih_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + (item_num))
+
+/* get the key */
+#define reiserfs_ih_key_at(bh,item_num)					\
+	(&(reiserfs_ih_at(bh,item_num)->ih_key))
+
+/* get item body */
+#define reiserfs_item_at(bh,item_num)					\
+	( (bh)->b_data + reiserfs_ih_get_loc (reiserfs_ih_at((bh),(item_num))))
+
+ /* following defines use reiserfs buffer header and item header */
+ /* get item body */
+#define reiserfs_item_by_ih(bh,ih) ((bh)->b_data + reiserfs_ih_get_loc(ih))
+
+#define reiserfs_leaf_head(bh)						\
+	(reiserfs_nh_get_level ((reiserfs_node_head_t *)((bh)->b_data))	\
+	 == LEAF_LEVEL)
+
+/* check whether byte number 'offset' is in this item */
+#define reiserfs_item_has_off(p_s_ih, n_offset, n_blocksize)		\
+	(reiserfs_key_get_off(&(p_s_ih)->ih_key) <= (n_offset) &&	\
+	 reiserfs_key_get_off(&(p_s_ih)->ih_key) +			\
+	 reiserfs_leaf_ibytes(p_s_ih,n_blocksize) > (n_offset) )
+
+#define reiserfs_item_has_key(p_s_ih, p_s_key, n_blocksize)		\
+	(!reiserfs_key_comp2(p_s_ih, p_s_key) &&			\
+	 reiserfs_item_has_off(p_s_ih, reiserfs_key_get_off (p_s_key),	\
+			       n_blocksize))
+
+#define reiserfs_item_off_at(ih, pos, bs)				\
+	(reiserfs_key_get_off (&(ih)->ih_key) +				\
+	 (pos) * (reiserfs_ih_direct(ih) ? 1 : (bs)))
+
+#define reiserfs_dir(ih, item)						\
+	((reiserfs_ih_stat(ih) && !not_a_directory(item)) ||		\
+	 reiserfs_ih_dir(ih))
+
+#define reiserfs_item_count(ih)						\
+	(reiserfs_ih_ext(ih) ? reiserfs_ext_count(ih) :                 \
+	 reiserfs_ih_direct(ih) ? reiserfs_ih_get_len(ih) :              \
+	 reiserfs_ih_dir(ih) ? reiserfs_ih_get_entries(ih) :            \
+	 reiserfs_ih_stat(ih) ? 1 : 0)
+
+extern void reiserfs_leaf_mkempty (reiserfs_bh_t *bh);
+
+extern int reiserfs_leaf_mergeable (reiserfs_ih_t *left, 
+				    reiserfs_ih_t *right, 
+				    int bsize);
+
+extern int reiserfs_leaf_count_items(reiserfs_bh_t *bh);
+
+extern int reiserfs_leaf_free_count(reiserfs_bh_t *bh);
+
+extern int reiserfs_leaf_estimate_items(reiserfs_bh_t * bh);
+
+extern int reiserfs_leaf_valid(reiserfs_bh_t *bh);
+
+typedef void (*ih_func_t) (reiserfs_ih_t * ih);
+typedef void (*item_func_t) (reiserfs_bh_t * bh, 
+			     reiserfs_ih_t * ih);
+
+extern void reiserfs_leaf_traverse(reiserfs_bh_t * bh, 
+				   ih_func_t action,
+				   item_func_t * actions);
+
+extern void reiserfs_leaf_delete_item (reiserfs_filsys_t *, 
+				       reiserfs_bh_t * bh, 
+				       int item_num);
+
+extern void reiserfs_leaf_delete_entry (reiserfs_filsys_t *, 
+					reiserfs_bh_t * bh,
+					int item_num, 
+					int entry_num, 
+					int del_count);
+
+extern int reiserfs_leaf_correct_at (reiserfs_filsys_t *, 
+				     reiserfs_ih_t *, char *,
+				     unfm_func_t, int);
+
+extern __u32 reiserfs_leaf_ibytes (const reiserfs_ih_t * ih, 
+				   int blocksize);
+
+extern int reiserfs_leaf_print(FILE * fp, 
+			       reiserfs_filsys_t * fs, 
+			       reiserfs_bh_t * bh,
+			       int print_mode, 
+			       int first, 
+			       int last);
+
+/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
+extern __u16 reiserfs_ih_get_format(const reiserfs_ih_t *ih);
+extern void reiserfs_ih_set_format(reiserfs_ih_t *ih, __u16 val);
+extern __u16 reiserfs_ih_get_flags(const reiserfs_ih_t *ih);
+extern void reiserfs_ih_set_flags(reiserfs_ih_t *ih, __u16 val);
+
+enum leaf_print {
+	LP_LEAF_DETAILS = 0x1,
+	LP_DIRECT_ITEMS = 0x2,
+	LP_LAST
+};
+
+#endif
diff --git a/include/reiserfs/leaf_balance.h b/include/reiserfs/leaf_balance.h
new file mode 100644
index 0000000..8eda71e
--- /dev/null
+++ b/include/reiserfs/leaf_balance.h
@@ -0,0 +1,42 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_LB_H
+#define REISERFS_LB_H
+
+extern void reiserfs_lb_delete_item (reiserfs_filsys_t * fs,
+				     reiserfs_bufinfo_t * bi,
+				     int first, 
+				     int del_num);
+
+extern void reiserfs_lb_delete_unit (reiserfs_filsys_t * fs,
+				     reiserfs_bufinfo_t * bi, 
+				     int cut_item_num,
+				     int pos_in_item, 
+				     int cut_size);
+
+extern void reiserfs_lb_delete (reiserfs_filsys_t * fs,
+				reiserfs_bufinfo_t * cur_bi,
+				int last_first, 
+				int first, 
+				int del_num, 
+				int del_bytes);
+
+extern int reiserfs_lb_balance (reiserfs_tb_t * tb,
+				reiserfs_ih_t * ih,
+				const char * body,
+				int flag,
+				int zeros_number,
+				reiserfs_ih_t * insert_key,
+				reiserfs_bh_t ** insert_ptr);
+
+extern int reiserfs_lb_copy (reiserfs_filsys_t * fs,
+			     reiserfs_bufinfo_t * dest_bi, 
+			     reiserfs_bh_t * src,
+			     int last_first, 
+			     int cpy_num,
+			     int cpy_bytes);
+
+#endif
diff --git a/include/reiserfs/libreiserfs.h b/include/reiserfs/libreiserfs.h
new file mode 100644
index 0000000..48469ea
--- /dev/null
+++ b/include/reiserfs/libreiserfs.h
@@ -0,0 +1,46 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_LIBREISER4_H
+#define REISERFS_LIBREISER4_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <reiserfs/types.h>
+#include <reiserfs/bitmap.h>
+#include <reiserfs/buffer.h>
+#include <reiserfs/filesystem.h>
+#include <reiserfs/journal.h>
+#include <reiserfs/super.h>
+#include <reiserfs/tree.h>
+#include <reiserfs/key.h>
+#include <reiserfs/node.h>
+#include <reiserfs/leaf.h>
+#include <reiserfs/direntry.h>
+#include <reiserfs/internal.h>
+#include <reiserfs/extent.h>
+#include <reiserfs/stat.h>
+#include <reiserfs/fix_node.h>
+#include <reiserfs/tree_balance.h>
+#include <reiserfs/internal_balance.h>
+#include <reiserfs/leaf_balance.h>
+#include <reiserfs/badblock.h>
+#include <reiserfs/objmap.h>
+#include <reiserfs/policy.h>
+#include <reiserfs/print.h>
+#include <reiserfs/hash.h>
+
+#ifdef LIBREISERFS_READY
+extern const char *libreiserfs_version(void);
+extern int libreiserfs_max_interface_version(void);
+extern int libreiserfs_min_interface_version(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/include/reiserfs/node.h b/include/reiserfs/node.h
new file mode 100644
index 0000000..87f6d34
--- /dev/null
+++ b/include/reiserfs/node.h
@@ -0,0 +1,92 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_NODE_H
+#define REISERFS_NODE_H
+
+/* 
+ * Picture represents a leaf of internal tree
+ *  ______________________________________________________
+ * |      |  Array of     |                   |           |
+ * |Block |  Object-Item  |      F r e e      |  Objects- |
+ * | head |  Headers      |     S p a c e     |   Items   |
+ * |______|_______________|___________________|___________|
+ */
+
+/* Header of a disk block.  More precisely, header of a formatted leaf
+   or internal node, and not the header of an unformatted node. */
+struct reiserfs_node_head {       
+    __u16 blk2_level;        /* Level of a block in the tree. */
+    __u16 blk2_nr_item;      /* Number of keys/items in a block. */
+    __u16 blk2_free_space;   /* Block free space in bytes. */
+    __u16 blk_reserved;
+    __u32 reserved [4];
+};
+
+typedef struct reiserfs_node_head reiserfs_node_head_t;
+
+#define REISERFS_NODEH_SIZE (sizeof(reiserfs_node_head_t))
+
+/* set/get fields of block head on disk with these defines */
+#define reiserfs_nh_get_level(blkh)	get_le16 (blkh, blk2_level)
+#define reiserfs_nh_set_level(blkh,val)	set_le16 (blkh, blk2_level, val)
+
+#define reiserfs_nh_get_items(blkh)	get_le16 (blkh, blk2_nr_item)
+#define reiserfs_nh_set_items(blkh,val)	set_le16 (blkh, blk2_nr_item, val)
+
+#define reiserfs_nh_get_free(blkh)	get_le16 (blkh, blk2_free_space)
+#define reiserfs_nh_set_free(blkh,val)	set_le16 (blkh, blk2_free_space, val)
+
+/*
+ * values for blk_type field
+ */
+
+#define FREE_LEVEL  0 /* Node of this level is out of the tree. */
+#define LEAF_LEVEL  1 /* Leaf node level.                       */
+
+/* Given the buffer head of a formatted node, resolve to the block head of that node. */
+#define NODE_HEAD(p_s_bh)  ((reiserfs_node_head_t *)((p_s_bh)->b_data))
+
+#define reiserfs_node_items(bh)	reiserfs_nh_get_items (NODE_HEAD(bh))
+#define reiserfs_node_level(bh)	reiserfs_nh_get_level (NODE_HEAD(bh))
+#define reiserfs_node_free(bh)	reiserfs_nh_get_free (NODE_HEAD(bh))
+
+/* Does the buffer contain a disk block which is in the tree. */
+#define REISERFS_NODE_INTREE(p_s_bh) \
+	(reiserfs_nh_get_level(NODE_HEAD (p_s_bh)) != FREE_LEVEL)
+
+#define REISERFS_NODE_SPACE(blocksize)	((blocksize) - REISERFS_NODEH_SIZE)
+
+/* amount of used space in buffer (not including block head) */
+#define reiserfs_node_used(cur) (REISERFS_NODE_SPACE(cur->b_size) -	\
+				 (reiserfs_node_free(cur)))
+
+enum node_type {
+    NT_LEAF	= 0x1,
+    NT_INTERNAL = 0x2,
+    NT_SUPER	= 0x3,
+    NT_JDESC	= 0x4,
+    NT_IH_ARRAY = 0x5,
+    NT_UNKNOWN
+};
+
+typedef enum node_type node_type_t;
+
+extern void reiserfs_node_replace_key (reiserfs_bh_t * dest, int n_dest,
+				       reiserfs_bh_t * src, int n_src);
+
+extern void reiserfs_node_forget(reiserfs_filsys_t *fs, 
+				 unsigned long blk);
+
+
+extern int reiserfs_node_formatted (reiserfs_bh_t * bh, int level);
+extern int reiserfs_node_type (reiserfs_bh_t *bh);
+extern char *reiserfs_node_type_name(int code);
+
+extern void reiserfs_node_print (FILE * fp, 
+				 reiserfs_filsys_t *, 
+				 reiserfs_bh_t * bh, ...);
+
+#endif
diff --git a/include/reiserfs/objmap.h b/include/reiserfs/objmap.h
new file mode 100644
index 0000000..d40375d
--- /dev/null
+++ b/include/reiserfs/objmap.h
@@ -0,0 +1,19 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_OBJMAP_H
+#define REISERFS_OBJMAP_H
+
+/* object identifier for root dir */
+#define REISERFS_ROOT_OBJECTID 2
+#define REISERFS_ROOT_PARENT_OBJECTID 1
+
+extern int reiserfs_objmap_test (reiserfs_filsys_t * fs, __u32 objectid);
+
+extern void reiserfs_objmap_set (reiserfs_filsys_t * fs, __u32 objectid);
+
+extern void reiserfs_objmap_print (FILE * fp, reiserfs_filsys_t * fs);
+
+#endif
diff --git a/include/reiserfs/policy.h b/include/reiserfs/policy.h
new file mode 100644
index 0000000..6af3284
--- /dev/null
+++ b/include/reiserfs/policy.h
@@ -0,0 +1,25 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_POLICY_H
+#define REISERFS_POLICY_H
+
+/* this is aggressive tail suppression policy taken from the kernel */
+/* It should be REISERFS_DIRECT_MAX used here, but sometimes it is not enough,
+ * and items got deleted. */
+#define reiserfs_policy_ext(n_file_size,n_tail_size,n_block_size)	\
+(									\
+  (!(n_tail_size)) ||							\
+  (((n_tail_size) > REISERFS_ITEM_MAX(n_block_size)) ||			\
+   ( (n_file_size) >= (n_block_size) * 4 ) ||				\
+   ( ( (n_file_size) >= (n_block_size) * 3 ) &&				\
+     ( (n_tail_size) >=   (REISERFS_ITEM_MAX(n_block_size))/4) ) ||	\
+   ( ( (n_file_size) >= (n_block_size) * 2 ) &&				\
+     ( (n_tail_size) >=   (REISERFS_ITEM_MAX(n_block_size))/2) ) ||	\
+   ( ( (n_file_size) >= (n_block_size) ) &&				\
+     ( (n_tail_size) >=   (REISERFS_ITEM_MAX(n_block_size) * 3)/4) ) )	\
+)
+
+#endif
diff --git a/include/reiserfs/print.h b/include/reiserfs/print.h
new file mode 100644
index 0000000..6875c6f
--- /dev/null
+++ b/include/reiserfs/print.h
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_PRINT_H
+#define REISERFS_PRINT_H
+
+#include <stdlib.h>
+
+extern void reiserfs_warning (FILE * fp, const char * fmt, ...);
+
+#define reiserfs_panic(fmt, list...) \
+{\
+	fflush (stdout);\
+	fprintf (stderr, "%s %d %s\n", __FILE__, __LINE__, __FUNCTION__);\
+	reiserfs_warning (stderr, (const char *)fmt, ## list);\
+        reiserfs_warning (stderr, "\n" );\
+        abort ();\
+}
+#define reiserfs_exit(val, fmt, list...) \
+{\
+	fflush (stdout);\
+	reiserfs_warning (stderr, (const char *)fmt, ## list);\
+        reiserfs_warning (stderr, "\n" );\
+        exit (val);\
+}
+
+#endif
diff --git a/include/reiserfs/stat.h b/include/reiserfs/stat.h
new file mode 100644
index 0000000..5c80d3d
--- /dev/null
+++ b/include/reiserfs/stat.h
@@ -0,0 +1,192 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_STAT_H
+#define REISERFS_STAT_H
+
+/* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */
+
+/* The sense of adding union to stat data is to keep a value of real number of
+   blocks used by file.  The necessity of adding such information is caused by
+   existing of files with holes.  Reiserfs should keep number of used blocks
+   for file, but not calculate it from file size (that is not correct for
+   holed files). Thus we have to add additional information to stat data.
+   When we have a device special file, there is no need to get number of used
+   blocks for them, and, accordingly, we doesn't need to keep major and minor
+   numbers for regular files, which might have holes. So this field is being
+   overloaded.  */
+
+struct reiserfs_sd_v1 {
+    __u16 sd_mode;	/* file type, permissions */
+    __u16 sd_nlink;	/* number of hard links */
+    __u16 sd_uid;		/* owner */
+    __u16 sd_gid;		/* group */
+    __u32 sd_size;	/* file size */
+    __u32 sd_atime;	/* time of last access */
+    __u32 sd_mtime;	/* time file was last modified  */
+    __u32 sd_ctime;	/* time inode (stat data) was last changed (except
+                           changes to sd_atime and sd_mtime) */
+    union {
+	__u32 sd_rdev;
+	__u32 sd_blocks;	/* number of blocks file uses */
+    } __attribute__ ((__packed__)) u;
+    __u32 sd_fdb; /* first byte of file which is stored
+				   in a direct item: except that if it
+				   equals 1 it is a symlink and if it
+				   equals MAX_KEY_OFFSET there is no
+				   direct item.  The existence of this
+				   field really grates on me. Let's
+				   replace it with a macro based on
+				   sd_size and our tail suppression
+				   policy.  Someday.  -Hans */
+} __attribute__ ((__packed__));
+
+typedef struct reiserfs_sd_v1 reiserfs_sd_v1_t;
+
+#define REISERFS_SD_SIZE_V1 (sizeof(reiserfs_sd_v1_t))
+
+/* this is used to check sd_size of stat data v1 */
+#define REISERFS_SD_SIZE_MAX_V1 0x7fffffff
+
+// sd_fdb is set to this when there are no direct items in a file
+#define REISERFS_SD_NODIRECT 0xffffffff
+
+/* Stat Data on disk (reiserfs version of UFS disk inode minus the
+   address blocks) */
+struct reiserfs_sd {
+    __u16 sd_mode;	/* file type, permissions */
+    __u16 sd_attrs;
+    __u32 sd_nlink;	/* 32 bit nlink! */
+    __u64 sd_size;	/* 64 bit size!*/
+    __u32 sd_uid;	/* 32 bit uid! */
+    __u32 sd_gid;	/* 32 bit gid! */
+    __u32 sd_atime;	/* time of last access */
+    __u32 sd_mtime;	/* time file was last modified  */
+    __u32 sd_ctime;	/* time inode (stat data) was last changed (except
+                           changes to sd_atime and sd_mtime) */
+    __u32 sd_blocks;
+    union {
+	__u32 sd_rdev;
+	__u32 sd_generation;
+      //__u32 sd_fdb; 
+      /* first byte of file which is stored in a direct item: except that if
+	 it equals 1 it is a symlink and if it equals ~(__u32)0 there is no
+	 direct item.  The existence of this field really grates on me. Let's
+	 replace it with a macro based on sd_size and our tail suppression
+	 policy? */
+  } __attribute__ ((__packed__)) u;
+} __attribute__ ((__packed__));
+//
+// this is 44 bytes long
+//
+
+typedef struct reiserfs_sd reiserfs_sd_t;
+
+#define REISERFS_SD_SIZE (sizeof(reiserfs_sd_t))
+
+/* this is used to check sd_size of stat data v2: max offset which can
+   be reached with a key of format 2 is 60 bits */
+#define REISERFS_SD_SIZE_MAX_V2 0xfffffffffffffffLL
+
+/* reiserfs_sd_v1_t* access macros */
+#define reiserfs_sd_v1_mode(sd)                 (le16_to_cpu((sd)->sd_mode))
+#define reiserfs_set_sd_v1_mode(sd,n)           ((sd)->sd_mode = cpu_to_le16((n)))
+#define reiserfs_sd_v1_nlink(sd)                (le16_to_cpu((sd)->sd_nlink))
+#define reiserfs_set_sd_v1_nlink(sd,n)          ((sd)->sd_nlink = cpu_to_le16((n))) 
+#define reiserfs_sd_v1_uid(sd)                  (le16_to_cpu((sd)->sd_uid))
+#define reiserfs_set_sd_v1_uid(sd,n)            ((sd)->sd_uid = cpu_to_le16((n)))
+#define reiserfs_sd_v1_gid(sd)                  (le16_to_cpu((sd)->sd_gid))
+#define reiserfs_set_sd_v1_gid(sd,n)            ((sd)->sd_gid = cpu_to_le16((n)))
+#define reiserfs_sd_v1_size(sd)                 (le32_to_cpu((sd)->sd_size))
+#define reiserfs_set_sd_v1_size(sd,n)           ((sd)->sd_size = cpu_to_le32((n)))
+#define reiserfs_sd_v1_atime(sd)                (le32_to_cpu((sd)->sd_atime))
+#define reiserfs_set_sd_v1_atime(sd,n)          ((sd)->sd_atime = cpu_to_le32((n)))
+#define reiserfs_sd_v1_mtime(sd)                (le32_to_cpu((sd)->sd_mtime))
+#define reiserfs_set_sd_v1_mtime(sd,n)          ((sd)->sd_mtime = cpu_to_le32((n)))
+#define reiserfs_sd_v1_ctime(sd)                (le32_to_cpu((sd)->sd_ctime))
+#define reiserfs_set_sd_v1_ctime(sd,n)          ((sd)->sd_ctime = cpu_to_le32((n)))
+#define reiserfs_sd_v1_blocks(sd)               (le32_to_cpu((sd)->u.sd_blocks))
+#define reiserfs_set_sd_v1_blocks(sd,n)         ((sd)->u.sd_blocks = cpu_to_le32((n)))
+#define reiserfs_sd_v1_rdev(sd)                 (le32_to_cpu((sd)->u.sd_rdev))
+#define reiserfs_set_sd_v1_rdev(sd,n)           ((sd)->u.sd_rdev = cpu_to_le32((n)))
+#define reiserfs_sd_v1_fdb(sd)			(le32_to_cpu((sd)->sd_fdb))
+#define reiserfs_set_sd_v1_fdb(sd,n)		((sd)->sd_fdb = cpu_to_le32((n)))
+
+/* reiserfs_sd_t */
+#define reiserfs_sd_v2_mode(sd)                 (le16_to_cpu((sd)->sd_mode))
+#define reiserfs_set_sd_v2_mode(sd,n)           ((sd)->sd_mode = cpu_to_le16((n)))
+#define reiserfs_sd_v2_attrs(sd)		(le16_to_cpu((sd)->sd_attrs))
+#define reiserfs_set_sd_v2_attrs(sd,n)		((sd)->sd_attrs = cpu_to_le16((n)))
+#define reiserfs_sd_v2_nlink(sd)                (le32_to_cpu((sd)->sd_nlink))
+#define reiserfs_set_sd_v2_nlink(sd,n)          ((sd)->sd_nlink = cpu_to_le32((n))) 
+#define reiserfs_sd_v2_size(sd)                 (le64_to_cpu((sd)->sd_size))
+#define reiserfs_set_sd_v2_size(sd,n)           ((sd)->sd_size = cpu_to_le64((n)))
+#define reiserfs_sd_v2_uid(sd)                  (le32_to_cpu((sd)->sd_uid))
+#define reiserfs_set_sd_v2_uid(sd,n)            ((sd)->sd_uid = cpu_to_le32((n)))
+#define reiserfs_sd_v2_gid(sd)                  (le32_to_cpu((sd)->sd_gid))
+#define reiserfs_set_sd_v2_gid(sd,n)            ((sd)->sd_gid = cpu_to_le32((n)))
+#define reiserfs_sd_v2_atime(sd)                (le32_to_cpu((sd)->sd_atime))
+#define reiserfs_set_sd_v2_atime(sd,n)          ((sd)->sd_atime = cpu_to_le32((n)))
+#define reiserfs_sd_v2_mtime(sd)                (le32_to_cpu((sd)->sd_mtime))
+#define reiserfs_set_sd_v2_mtime(sd,n)          ((sd)->sd_mtime = cpu_to_le32((n)))
+#define reiserfs_sd_v2_ctime(sd)                (le32_to_cpu((sd)->sd_ctime))
+#define reiserfs_set_sd_v2_ctime(sd,n)          ((sd)->sd_ctime = cpu_to_le32((n)))
+#define reiserfs_sd_v2_blocks(sd)               (le32_to_cpu((sd)->sd_blocks))
+#define reiserfs_set_sd_v2_blocks(sd,n)         ((sd)->sd_blocks = cpu_to_le32((n)))
+#define reiserfs_sd_v2_rdev(sd)                 (le32_to_cpu((sd)->u.sd_rdev))
+#define reiserfs_set_sd_v2_rdev(sd,n)           ((sd)->u.sd_rdev = cpu_to_le32((n)))
+
+extern void reiserfs_stat_init (int blocksize, int key_format, 
+				__u32 dirid, __u32 objectid, 
+				reiserfs_ih_t * ih, void * sd);
+
+extern void reiserfs_stat_set (int field, reiserfs_ih_t * ih, 
+			       void * sd, void * value);
+
+extern void reiserfs_stat_get (int field, reiserfs_ih_t * ih, 
+			       void * sd, void * value);
+
+/*  access to stat data fields */
+#define STAT_MODE	0
+#define STAT_SIZE	1
+#define STAT_NLINK	2
+#define STAT_BLOCKS	3
+#define STAT_FDB	4
+
+#define reiserfs_stat_get_mode(ih, sd, pmode)		\
+	reiserfs_stat_get(STAT_MODE, ih, sd, pmode)
+#define reiserfs_stat_set_mode(ih, sd, pmode)		\
+	reiserfs_stat_set(STAT_MODE, ih, sd, pmode)
+
+#define reiserfs_stat_get_size(ih, sd, psize)		\
+	reiserfs_stat_get(STAT_SIZE, ih, sd, psize)
+#define reiserfs_stat_set_size(ih, sd, psize)		\
+	reiserfs_stat_set(STAT_SIZE, ih, sd, psize)
+
+#define reiserfs_stat_get_blocks(ih, sd, pblocks)	\
+	reiserfs_stat_get(STAT_BLOCKS, ih, sd, pblocks)
+	
+#define reiserfs_stat_set_blocks(ih, sd, pblocks)	\
+	reiserfs_stat_set(STAT_BLOCKS, ih, sd, pblocks)
+
+#define reiserfs_stat_get_nlink(ih, sd, pnlink)		\
+	reiserfs_stat_get(STAT_NLINK, ih, sd, pnlink)
+	
+#define reiserfs_stat_set_nlink(ih, sd, pnlink)		\
+	reiserfs_stat_set(STAT_NLINK, ih, sd, pnlink)
+
+#define reiserfs_stat_get_fdb(ih, sd, pfdb)		\
+	reiserfs_stat_get(STAT_FDB, ih, sd, pfdb)
+	
+#define reiserfs_stat_set_fdb(ih, sd, pfdb)		\
+	reiserfs_stat_set(STAT_FDB, ih, sd, pfdb)
+
+
+extern int reiserfs_print_stat_data (FILE * fp, 
+				     reiserfs_bh_t * bh, 
+				     reiserfs_ih_t * ih, 
+				     int alltimes);
+
+#endif
diff --git a/include/reiserfs/super.h b/include/reiserfs/super.h
new file mode 100644
index 0000000..3598031
--- /dev/null
+++ b/include/reiserfs/super.h
@@ -0,0 +1,156 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_SUPER_H
+#define REISERFS_SUPER_H
+
+#define REISERFS_SB_SIZE_V1 (sizeof(reiserfs_sb_v1_t)) /* 76 bytes */
+
+#define reiserfs_sb_jp(sb) (&((sb)->s_v1.sb_journal))
+
+/* values for sb_version field of struct reiserfs_super_block. sb_version is
+   only reliable on filesystem with non-standard journal */
+#define REISERFS_FORMAT_3_5 0
+#define REISERFS_FORMAT_3_6 2
+#define REISERFS_FORMAT_UNKNOWN -1
+                                   
+
+/* values for sb_mount_state field */
+#define FS_CLEANLY_UMOUNTED    1 /* this was REISERFS_VALID_FS */
+#define FS_NOT_CLEANLY_UMOUNTED    2 /* this was REISERFS_ERROR. It
+                                              means that filesystem was not
+                                              cleanly unmounted */
+
+typedef enum {
+  reiserfs_attrs_cleared       = 0x00000001,
+} reiserfs_super_block_flags;
+
+#define REISERFS_SB_SIZE (sizeof(reiserfs_sb_t)) /* 204 bytes */
+
+/* set/get fields of super block with these defines */
+#define reiserfs_sb_get_blocks(sb)	get_le32 (sb, s_v1.sb_block_count)
+#define reiserfs_sb_set_blocks(sb,val)	set_le32 (sb, s_v1.sb_block_count, val)
+
+#define reiserfs_sb_get_free(sb)	get_le32 (sb, s_v1.sb_free_blocks)
+#define reiserfs_sb_set_free(sb,val)	set_le32 (sb, s_v1.sb_free_blocks, val)
+
+#define reiserfs_sb_get_root(sb)	get_le32 (sb,s_v1.sb_root_block)
+#define reiserfs_sb_set_root(sb,val)	set_le32 (sb, s_v1.sb_root_block, val)
+
+#if 0
+#define get_sb_mount_id(sb)		get_le32 (sb,s_v1.sb_mountid)
+#define set_sb_mount_id(sb,val)		set_le32 (sb, s_v1.sb_mountid, val)
+
+#define get_sb_journal_magic(sb)	get_le32 (sb, s_v1.sb_journal_magic)
+#define set_sb_journal_magic(sb,val)	set_le32 (sb, s_v1.sb_journal_magic, val)
+#endif
+
+#define reiserfs_sb_get_blksize(sb)	get_le16 (sb, s_v1.sb_blocksize)
+#define reiserfs_sb_set_blksize(sb,val)	set_le16 (sb, s_v1.sb_blocksize, val)
+
+#define reiserfs_sb_get_mapmax(sb)	get_le16 (sb, s_v1.sb_oid_maxsize)
+#define reiserfs_sb_set_mapmax(sb,val)	set_le16 (sb, s_v1.sb_oid_maxsize, val)
+
+#define reiserfs_sb_get_mapcur(sb)	get_le16 (sb, s_v1.sb_oid_cursize)
+#define reiserfs_sb_set_mapcur(sb,val)	set_le16 (sb, s_v1.sb_oid_cursize, val)
+
+#define reiserfs_sb_get_umount(sb)	get_le16 (sb, s_v1.sb_umount_state)
+#define reiserfs_sb_set_umount(sb,val)	set_le16 (sb, s_v1.sb_umount_state, val)
+
+#define reiserfs_sb_get_state(sb)	get_le16 (sb, s_v1.sb_fs_state)
+#define reiserfs_sb_set_state(sb,flag)	set_le16 (sb, s_v1.sb_fs_state, flag)
+
+#define reiserfs_sb_get_hash(sb)	get_le32 (sb, s_v1.sb_hash_function_code)
+#define reiserfs_sb_set_hash(sb,val)	set_le32 (sb, s_v1.sb_hash_function_code, val)
+
+#define reiserfs_sb_get_height(sb)	get_le16 (sb, s_v1.sb_tree_height)
+#define reiserfs_sb_set_height(sb,val)	set_le16 (sb, s_v1.sb_tree_height, val)
+
+#define reiserfs_sb_get_bmaps(sb)	get_le16 (sb, s_v1.sb_bmap_nr)
+#define reiserfs_sb_set_bmaps(sb,val)	set_le16 (sb, s_v1.sb_bmap_nr, val)
+
+#define reiserfs_sb_get_version(sb)	get_le16 (sb, s_v1.sb_version)
+#define reiserfs_sb_set_version(sb,val)	set_le16 (sb, s_v1.sb_version, val)
+
+#define reiserfs_sb_get_reserved(sb)				\
+	get_le16 (sb, s_v1.sb_reserved_for_journal)
+#define reiserfs_sb_set_reserved(sb,val)			\
+	set_le16 (sb, s_v1.sb_reserved_for_journal, val)
+
+#define reiserfs_sb_get_gen(sb)		get_le32 (sb, sb_inode_generation)
+#define reiserfs_sb_set_gen(sb,val)	set_le32 (sb, sb_inode_generation, val)
+
+#define reiserfs_sb_get_flags(sb)	get_le32 (sb, s_flags)
+#define reiserfs_sb_set_flags(sb, val)	set_le32 (sb, s_flags, val)
+
+#define reiserfs_sb_isflag(sb, flag)				\
+	(get_le32 (sb, s_flags) & flag)
+#define reiserfs_sb_mkflag(sb, flag)				\
+	set_le32 (sb, s_flags, get_le32 (sb, s_flags) | flag)
+#define reiserfs_sb_clflag(sb, flag)				\
+	set_le32 (sb, s_flags, get_le32 (sb, s_flags) & ~(flag))
+
+/* 0 does not guarantee that fs is consistent */
+#define reiserfs_sb_state_ok(fs) \
+	((reiserfs_sb_get_umount (fs->fs_ondisk_sb) == FS_CLEANLY_UMOUNTED) && \
+	 (reiserfs_sb_get_state (fs->fs_ondisk_sb) == FS_CONSISTENT))
+
+
+/* prejournalled reiserfs had signature in the other place in super block */
+#define REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ 20
+
+/* f_type of struct statfs will be set at this value by statfs(2) */
+#define REISERFS_SUPER_MAGIC 0x52654973
+
+/* various reiserfs signatures. We have 3 so far. ReIsErFs for 3.5 format with
+   standard journal, ReIsEr2Fs for 3.6 (or converted 3.5) and ReIsEr3Fs for
+   filesystem with non-standard journal (formats are distinguished by
+   sb_version in that case). Those signatures should be looked for at the
+   64-th and at the 8-th 1k block of the device */
+#define REISERFS_3_5_SUPER_MAGIC_STRING "ReIsErFs"
+#define REISERFS_3_6_SUPER_MAGIC_STRING "ReIsEr2Fs"
+#define REISERFS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" /* JR stands for Journal
+						      Relocation */
+
+/* these are possible values for sb_fs_state */
+enum reiserfs_state_flags {
+	/* this is set by mkreiserfs and by reiserfsck */
+	FS_CONSISTENT   = 0x0,
+	/* this is set by the kernel when fsck is wanted. */
+	FS_ERROR	= 0x1,
+	/* this is set by fsck when fatal corruption is found */
+	FS_FATAL	= 0x2,
+	/* this is set by kernel when io error occures */
+	/* IO_ERROR	= 0x4, */
+	
+	FS_STATE_LAST   = 0x5
+};
+
+extern int reiserfs_super_35_magic (reiserfs_sb_t * rs);
+
+extern int reiserfs_super_36_magic (reiserfs_sb_t * rs);
+
+extern int reiserfs_super_jr_magic (reiserfs_sb_t * rs);
+
+extern int reiserfs_super_magic (reiserfs_sb_t * rs);
+
+extern int reiserfs_super_format (reiserfs_sb_t * sb);
+
+extern int reiserfs_super_size (reiserfs_sb_t * rs);
+
+extern int reiserfs_super_prejournaled (reiserfs_sb_t * rs);
+
+extern void reiserfs_super_print_state (FILE * fp, 
+					reiserfs_filsys_t * fs);
+
+extern int reiserfs_super_print (FILE * fp, 
+				 reiserfs_filsys_t *, 
+				 char * file_name, 
+				 reiserfs_bh_t * bh, 
+				 int short_print);
+
+extern int reiserfs_super_valid(reiserfs_bh_t *bh);
+
+#endif
diff --git a/include/reiserfs/tree.h b/include/reiserfs/tree.h
new file mode 100644
index 0000000..c868cf1
--- /dev/null
+++ b/include/reiserfs/tree.h
@@ -0,0 +1,160 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_TREE_H
+#define REISERFS_TREE_H
+
+#include <reiserfs/types.h>
+
+/* Search_by_key fills up the path from the root to the leaf as it
+   descends the tree looking for the key.  It uses reiserfs_buffer_read to
+   try to find buffers in the cache given their block number.  If it
+   does not find them in the cache it reads them from disk.  For each
+   node reiserfs_tree_search_item finds using reiserfs_buffer_read it then uses
+   bin_search to look through that node.  bin_search will find the
+   position of the block_number of the next node if it is looking
+   through an internal node.  If it is looking through a leaf node
+   bin_search will find the position of the item which has key either
+   equal to given key, or which is the maximal key less than the given
+   key. */
+
+
+#define REISERFS_PATH_INIT(var)						\
+	reiserfs_path_t var = {REISERFS_PATH_OFFILL, }
+
+/* Get path element by path and path position. */
+#define REISERFS_PATH_ELEM(p_s_path,nr_elem)				\
+	((p_s_path)->path_elements + (nr_elem))
+
+/* Get buffer header at the path by path and path position. */
+#define REISERFS_PATH_BUFFER(p_s_path,nr_elem)				\
+	(REISERFS_PATH_ELEM(p_s_path, nr_elem)->pe_buffer)
+
+/* Get position in the element at the path by path and path position. */
+#define REISERFS_PATH_POS(p_s_path,nr_elem)				\
+	(REISERFS_PATH_ELEM(p_s_path, nr_elem)->pe_position)
+
+#define REISERFS_PATH_LEAF(p_s_path)					\
+	(REISERFS_PATH_BUFFER((p_s_path), (p_s_path)->path_length))
+
+#define REISERFS_PATH_LEAF_POS(p_s_path)				\
+	(REISERFS_PATH_POS((p_s_path), (p_s_path)->path_length))
+
+#define REISERFS_PATH_IH(p_s_path)					\
+	reiserfs_ih_at(REISERFS_PATH_LEAF(p_s_path),			\
+		       REISERFS_PATH_LEAF_POS(p_s_path))
+
+/* in reiserfs_tb_balance leaf has h == 0 in contrast with path structure,
+   where root has level == 0. That is why we need these defines */
+#define REISERFS_PATH_UPBUFFER(p_s_path, h)				\
+	(REISERFS_PATH_BUFFER (p_s_path, p_s_path->path_length - (h)))
+
+/* tb->F[h] or tb->S[0]->b_parent */
+#define REISERFS_PATH_UPPARENT(path, h)					\
+	REISERFS_PATH_UPBUFFER (path, (h) + 1)
+
+#define REISERFS_PATH_UPPOS(path, h)					\
+	REISERFS_PATH_POS (path, path->path_length - (h))	
+
+/* tb->S[h]->b_item_order */
+#define REISERFS_PATH_UPPARENT_POS(path, h)				\
+	REISERFS_PATH_UPPOS(path, h + 1)
+
+#define REISERFS_PATH_LEVEL(p_s_path, n_h)				\
+	((p_s_path)->path_length - (n_h))
+
+#define REISERFS_PATH_ITEM(path)					\
+	((void *) reiserfs_item_at(REISERFS_PATH_LEAF(path),		\
+				   REISERFS_PATH_LEAF_POS (path)))
+
+extern int reiserfs_tree_search_entry (reiserfs_filsys_t *fs, 
+				       const reiserfs_key_t * key, 
+				       reiserfs_path_t * path);
+
+extern int reiserfs_tree_search_position (reiserfs_filsys_t *fs, 
+					  const reiserfs_key_t * key, 
+					  reiserfs_path_t * path);
+
+extern const reiserfs_key_t * reiserfs_tree_lkey (reiserfs_path_t * path,
+						  reiserfs_filsys_t *fs);
+
+extern const reiserfs_key_t * reiserfs_tree_rkey (reiserfs_path_t * path, 
+						  reiserfs_filsys_t *fs);
+
+extern const reiserfs_key_t *reiserfs_tree_next_key (reiserfs_path_t * path,
+						     reiserfs_filsys_t *fs);
+
+extern int reiserfs_tree_delete_entry (reiserfs_filsys_t *, 
+				       reiserfs_key_t *);
+
+extern void reiserfs_tree_delete (reiserfs_filsys_t *, 
+				  reiserfs_path_t *, int);
+
+extern void reiserfs_tree_delete_unit (reiserfs_filsys_t *, 
+				       reiserfs_path_t *, int);
+
+extern void reiserfs_tree_insert_unit (reiserfs_filsys_t *, 
+				       reiserfs_path_t * path,
+				       const void * body, 
+				       int size);
+
+extern void reiserfs_tree_insert (reiserfs_filsys_t *, 
+				  reiserfs_path_t * ,
+				  reiserfs_ih_t *, 
+				  const void *);
+
+extern int reiserfs_tree_search_name (reiserfs_filsys_t *, 
+				      const reiserfs_key_t * dir, 
+				      char * name,
+				      unsigned int * min_gen_counter, 
+				      reiserfs_key_t * key);
+
+extern int reiserfs_tree_search_body (reiserfs_filsys_t * fs, 
+				      const reiserfs_key_t * key,
+				      reiserfs_path_t * path);
+
+extern int reiserfs_tree_search_item (reiserfs_filsys_t * fs, 
+				      const reiserfs_key_t * key,
+				      reiserfs_path_t * path);
+
+extern int reiserfs_tree_scan_name (reiserfs_filsys_t *, 
+				    reiserfs_key_t * dir, 
+				    char * name,
+				    reiserfs_path_t * path);
+
+extern int reiserfs_tree_insert_entry (reiserfs_filsys_t *, 
+				       const reiserfs_key_t * dir, 
+				       char * name, 
+				       int name_len,
+				       const reiserfs_key_t * key, 
+				       __u16 fsck_need);
+
+typedef void (*item_modify_t) (reiserfs_ih_t *, void *item);
+
+extern __u16 reiserfs_tree_root (reiserfs_filsys_t * fs,
+				 item_modify_t modify,
+				 __u16 ih_flags);
+
+extern int reiserfs_tree_create_stat (reiserfs_filsys_t * fs,
+				      reiserfs_path_t * path, 
+				      const reiserfs_key_t * key,
+				      item_modify_t modify);
+
+extern void reiserfs_tree_pathrelse (reiserfs_path_t * p_s_search_path);
+
+extern int reiserfs_tree_left_mergeable (reiserfs_filsys_t * s, 
+					 reiserfs_path_t * path);
+
+extern int reiserfs_tree_right_mergeable (reiserfs_filsys_t * s, 
+					  reiserfs_path_t * path);
+
+extern int reiserfs_tree_node_mergeable (reiserfs_bh_t *left, 
+					 reiserfs_bh_t *right);
+
+extern int reiserfs_tree_merge(reiserfs_filsys_t *fs, 
+			       reiserfs_path_t *dst_path, 
+			       reiserfs_path_t *src_path);
+
+#endif
diff --git a/include/reiserfs/tree_balance.h b/include/reiserfs/tree_balance.h
new file mode 100644
index 0000000..6b052b5
--- /dev/null
+++ b/include/reiserfs/tree_balance.h
@@ -0,0 +1,202 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_TB_H
+#define REISERFS_TB_H
+
+/* This temporary structure is used in tree balance algorithms, and
+   constructed as we go to the extent that its various parts are needed.  It
+   contains arrays of nodes that can potentially be involved in the balancing
+   of node S, and parameters that define how each of the nodes must be
+   balanced.  Note that in these algorithms for balancing the worst case is to
+   need to balance the current node S and the left and right neighbors and all
+   of their parents plus create a new node.  We implement S1 balancing for the
+   leaf nodes and S0 balancing for the internal nodes (S1 and S0 are defined
+   in our papers.)*/
+
+/* size of the array of buffers to free at end of reiserfs_tb_balance */
+#define TB_2FREE_MAX 7	
+
+#define TB_FEB_MAX (REISERFS_TREE_HEIGHT_MAX + 1)
+
+/* someday somebody will prefix every field in this struct with tb_ */
+struct reiserfs_tb {
+    reiserfs_filsys_t * tb_fs;
+    
+    reiserfs_path_t * tb_path;
+
+    /* array of left neighbors of nodes in the path */
+    reiserfs_bh_t * L[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* array of right neighbors of nodes in the path*/
+    reiserfs_bh_t * R[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* array of fathers of the left  neighbors      */
+    reiserfs_bh_t * FL[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* array of fathers of the right neighbors      */
+    reiserfs_bh_t * FR[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* array of common parents of center node and its left neighbor  */
+    reiserfs_bh_t * CFL[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* array of common parents of center node and its right neighbor */
+    reiserfs_bh_t * CFR[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* array of blocknr's that are free and are the nearest to the left 
+       node that are usable for writing dirty formatted leaves, using 
+       the write_next_to algorithm. */
+    
+    /*unsigned long free_and_near[MAX_DIRTIABLE];*/
+    
+    /* array of empty buffers. Number of buffers in array equals cur_blknum. */
+    reiserfs_bh_t * FEB[TB_FEB_MAX]; 
+    
+    reiserfs_bh_t * used[TB_FEB_MAX];
+    
+    /* array of number of items which must be shifted to the left in order to 
+       balance the current node; for leaves includes item that will be partially
+       shifted; for internal nodes, it is the number of child pointers rather 
+       than items. It includes the new item being created. For preserve_shifted
+       purposes the code sometimes subtracts one from this number to get the
+       number of currently existing items being shifted, and even more often 
+       for leaves it subtracts one to get the number of wholly shifted items 
+       for other purposes. */
+    short int lnum[REISERFS_TREE_HEIGHT_MAX];	
+
+    /* substitute right for left in comment above */
+    short int rnum[REISERFS_TREE_HEIGHT_MAX];	
+    
+    /* array indexed by height h mapping the key delimiting L[h] and
+       S[h] to its item number within the node CFL[h] */
+    short int lkey[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* substitute r for l in comment above */
+    short int rkey[REISERFS_TREE_HEIGHT_MAX];
+    
+    /* the number of bytes by we are trying to add or remove from S[h]. 
+       A negative value means removing.  */
+    short int insert_size[REISERFS_TREE_HEIGHT_MAX];
+     
+    /* number of nodes that will replace node S[h] after balancing on the level 
+       h of the tree.  If 0 then S is being deleted, if 1 then S is remaining 
+       and no new nodes are being created, if 2 or 3 then 1 or 2 new nodes is
+       being created */
+    short int blknum[REISERFS_TREE_HEIGHT_MAX];
+
+    /* fields that are used only for balancing leaves of the tree */
+    
+    /* number of empty blocks having been already allocated */
+    short int cur_blknum;
+    
+    /* number of items that fall into left most  node when S[0] splits	*/
+    short int s0num;
+    
+    /* number of items that fall into first  new node when S[0] splits	*/
+    short int s1num;
+    
+    /* number of items that fall into second new node when S[0] splits	*/
+    short int s2num;
+    
+    /* number of bytes which can flow to the left neighbor from the left */
+    short int lbytes;
+    
+    /* most liquid item that cannot be shifted from S[0] entirely
+       if -1 then nothing will be partially shifted */
+    
+    /* number of bytes which will flow to the right neighbor from the right */
+    short int rbytes;            
+    
+    /* number of bytes which flow to the first  new node when S[0] splits
+       note: if S[0] splits into 3 nodes, then items do not need to be cut */
+    short int s1bytes;
+    short int s2bytes;
+    
+    /* buffers which are to be freed after reiserfs_tb_balance finishes 
+       by reiserfs_unfix_nodes */
+    reiserfs_bh_t * buf_to_free[TB_2FREE_MAX]; 
+    
+    /* kmalloced memory. Used to create virtual node and keep map of dirtied 
+       bitmap blocks */
+    char * vn_buf;
+
+    /* size of the vn_buf */
+    int vn_buf_size;		
+    
+    /* VN starts after bitmap of bitmap blocks */
+    struct reiserfs_virtual_node * tb_vn;	
+};
+
+typedef struct reiserfs_tb reiserfs_tb_t;
+
+enum tb_return {
+	CARRY_ON		= 0x0,
+	NO_DISK_SPACE		= 0x3,
+	IO_ERROR		= 0x4,
+	NO_BALANCING_NEEDED	= 0x5,
+	ITEM_FOUND		= 0x6,
+	ITEM_NOT_FOUND		= 0x7,
+	POSITION_FOUND          = 0x8,
+	POSITION_NOT_FOUND      = 0x9,
+	GOTO_PREVIOUS_ITEM	= 0xa,
+	POSITION_FOUND_INVISIBLE= 0xb,
+	FILE_NOT_FOUND		= 0xc,
+	DIRECTORY_NOT_FOUND	= 0xd, 
+	DIRECTORY_FOUND		= 0xf,
+	LAST_SEARCH
+};
+
+/* These are modes of balancing */
+
+/* When inserting an item. */
+#define M_INSERT	'i'
+/* When inserting into (directories only) or appending onto an already
+   existant item. */
+#define M_PASTE		'p'
+/* When deleting an item. */
+#define M_DELETE	'd'
+/* When truncating an item or removing an entry from a (directory) item. */
+#define M_CUT 		'c'
+
+/* used when balancing on leaf level skipped (in reiserfsck) */
+#define M_INTERNAL	'n'
+
+#define FIRST_TO_LAST 0
+#define LAST_TO_FIRST 1
+
+/* used in reiserfs_tb_balance for passing parent of node information that 
+   has been gotten from tb struct */
+struct reiserfs_bufinfo {
+    reiserfs_bh_t * bi_bh;
+    reiserfs_bh_t * bi_parent;
+    int bi_position;
+};
+
+typedef struct reiserfs_bufinfo reiserfs_bufinfo_t;
+
+
+extern void reiserfs_tb_attach_new (reiserfs_bufinfo_t * bi);
+
+extern reiserfs_bh_t * reiserfs_tb_FEB (reiserfs_tb_t *tb);
+
+extern int reiserfs_tb_lpos (reiserfs_tb_t * tb, int h);
+
+extern int reiserfs_tb_rpos (reiserfs_tb_t * tb, int h);
+
+extern void reiserfs_tb_balance (reiserfs_tb_t * tb,
+				 reiserfs_ih_t * ih, 
+				 const char * body, 
+				 int flag, 
+				 int zeros_num);
+
+extern void reiserfs_tb_init (reiserfs_tb_t * tb, 
+			      reiserfs_filsys_t *, 
+			      reiserfs_path_t * path, 
+			      int size);
+
+extern void reiserfs_tb_print_path (reiserfs_tb_t * tb, 
+				    reiserfs_path_t * path);
+
+#endif
diff --git a/include/reiserfs/types.h b/include/reiserfs/types.h
new file mode 100644
index 0000000..bf41c5b
--- /dev/null
+++ b/include/reiserfs/types.h
@@ -0,0 +1,297 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef REISERFS_TYPES_H
+#define REISERFS_TYPES_H
+
+#include "misc/types.h"
+#include "misc/swab.h"
+
+struct reiserfs_bitmap {
+    unsigned long bm_byte_size;
+    unsigned long bm_bit_size;
+    char * bm_map;
+    unsigned long bm_set_bits;
+    int bm_dirty;  /* used for fetched bitmap */
+    unsigned long bm_first_zero;
+};
+
+typedef struct reiserfs_bitmap reiserfs_bitmap_t;
+
+
+typedef struct reiserfs_bh reiserfs_bh_t;
+
+struct reiserfs_bh {
+    unsigned long b_blocknr;
+    int b_dev;
+    unsigned long b_size;
+    char * b_data;
+    unsigned long b_state;
+    unsigned int b_count;
+    unsigned int b_list ;
+    void (*b_start_io) (unsigned long);
+    void (*b_end_io)(reiserfs_bh_t *bh, int uptodate);
+    
+    reiserfs_bh_t * b_next;
+    reiserfs_bh_t * b_prev;
+    reiserfs_bh_t * b_hash_next;
+    reiserfs_bh_t * b_hash_prev;
+};
+
+
+/* magic string to find desc blocks in the journal */
+#define JOURNAL_DESC_MAGIC "ReIsErLB" 
+
+struct reiserfs_journal_param {
+    /* where does journal start from on its device */
+    __u32 jp_start;
+    /* journal device st_rdev */
+    __u32 jp_dev;
+    /* size of the journal on FS creation. used to make sure 
+       they don't overflow it */
+    __u32 jp_size;
+    /* max number of blocks in a transaction.  */
+    __u32 jp_tlen;
+    /* random value made on fs creation (this was sb_journal_block_count) */
+    __u32 jp_magic;
+    /* max number of blocks to batch into a trans */
+    __u32 jp_max_batch;
+    /* in seconds, how old can an async commit be */
+    __u32 jp_commit_age;
+    /* in seconds, how old can a transaction be */
+    __u32 jp_trans_age;
+};
+
+typedef struct reiserfs_journal_param reiserfs_journal_param_t;
+
+/* this header block gets written whenever a transaction is considered fully
+** flushed, and is more recent than the last fully flushed transaction.  fully
+** flushed means all the log blocks and all the real blocks are on disk, and
+** this transaction does not need to be replayed.  */
+struct reiserfs_journal_header {    
+    /* id of last fully flushed transaction */
+    __u32 jh_last_flush_trans_id ;    
+    /* offset in the log of where to start replay after a crash */
+    __u32 jh_flush_offset ; 
+    
+    __u32 jh_mount_id ;
+
+    reiserfs_journal_param_t jh_journal;
+
+    /* the mount id of the fs during the last reiserfsck --check. */
+    __u32 jh_last_check_mount_id;	
+};
+
+/* this is the super from 3.5.X */
+struct reiserfs_super_block_v1
+{
+    __u32 sb_block_count; 	/* 0 number of block on data device */
+    __u32 sb_free_blocks; 	/* 4 free blocks count */
+    __u32 sb_root_block;        /* 8 root of the tree */
+
+    reiserfs_journal_param_t sb_journal; /* 12 */
+
+    __u16 sb_blocksize;         /* 44 */
+    __u16 sb_oid_maxsize;	/* 46 max size of object id array, see
+				   get_objectid() commentary */
+    __u16 sb_oid_cursize; 	/* 48 current size of object id array */
+    __u16 sb_umount_state;	/* 50 this is set to 1 when filesystem was
+				   umounted, to 2 - when not */
+    
+    char s_magic[10]; 		/* 52 reiserfs magic string indicates that
+				   file system is reiserfs: "ReIsErFs" or
+				   "ReIsEr2Fs" or "ReIsEr3Fs" */
+    __u16 sb_fs_state; 		/* 62 it is set to used by fsck to mark which phase of
+				   rebuilding is done (used for fsck debugging) */
+    __u32 sb_hash_function_code;/* 64 code of fuction which was/is/will be
+				   used to sort names in a directory. See
+				   codes in above */
+    __u16 sb_tree_height;	/* 68 height of filesytem tree. Tree
+				   consisting of only one root block has 2
+				   here */
+    __u16 sb_bmap_nr;     	/* 70 amount of bitmap blocks needed to
+				   address each block of file system */
+    __u16 sb_version; 		/* 72 this field is only reliable on
+				   filesystem with non-standard journal */
+    __u16 sb_reserved_for_journal;  /* 74 size in blocks of journal area on
+				       main device, we need to keep after
+				       non-standard journal relocation */
+};
+
+typedef struct reiserfs_super_block_v1 reiserfs_sb_v1_t;
+
+/* Structure of super block on disk */
+struct reiserfs_super_block {
+/*  0 */    reiserfs_sb_v1_t s_v1;
+/* 76 */     __u32 sb_inode_generation; 
+/* Right now used only by inode-attributes, if enabled */
+/* 80 */     __u32 s_flags;
+/* filesystem unique identifier */
+/* 84 */    unsigned char s_uuid[16];
+/* filesystem volume label */
+/*100 */    unsigned char s_label[16];
+/* zero filled by mkreiserfs and reiserfs_convert_objectid_map_v1()
+ * so any additions must be updated there as well. */ 
+/*116 */    char s_unused[88];
+/*204*/
+} __attribute__ ((__packed__));;
+
+typedef struct reiserfs_super_block reiserfs_sb_t;
+
+typedef __u32 (*hashf_t) (const char *, int);
+
+typedef struct reiserfs_filsys reiserfs_filsys_t;
+
+struct reiserfs_filsys {
+    unsigned int fs_blocksize;
+    int fs_format;	      /* on-disk format version */
+    hashf_t hash;	      /* pointer to function which is used to sort
+				 names in directory. It is set by
+				 reiserfs_fs_open if it is set in the super
+				 block, otherwise it is set by first
+				 reiserfs_hash_correct */
+    
+    char fs_file_name[4096];       /* file name of underlying device */
+    int fs_dev; /* descriptor of opened block device file */
+    reiserfs_bh_t * fs_super_bh;  /* buffer containing super block */
+    reiserfs_sb_t * fs_ondisk_sb; /* pointer to its b_data */
+
+
+    reiserfs_bitmap_t * fs_bitmap2; /* ondisk bitmap after
+				       reiserfs_bitmap_open */
+
+
+    /* opened journal fields */
+    char fs_j_file_name[4096];  /* file name of relocated journal device */
+    int fs_journal_dev;		/* descriptor of opened journal device */
+    reiserfs_bh_t * fs_jh_bh;	/* buffer containing journal header */
+
+    /* badblocks */
+    reiserfs_bitmap_t * fs_badblocks_bm;
+
+    int fs_dirt;
+    int fs_flags;
+    void * fs_vp;
+    int (*block_allocator) (reiserfs_filsys_t * fs, 
+			    unsigned long * free_blocknrs,
+			    unsigned long start, int amount_needed);
+    int (*block_deallocator) (reiserfs_filsys_t * fs, unsigned long block);
+
+    __u16 lost_format;
+};
+
+
+#define REISERFS_TREE_HEIGHT_MAX	6
+#define REISERFS_PATH_OFFINIT		2
+#define REISERFS_PATH_OFFILL		1
+#define REISERFS_PATH_MAX		(REISERFS_TREE_HEIGHT_MAX +	\
+					 REISERFS_PATH_OFFINIT)
+
+struct reiserfs_path_element  {
+    /* Pointer to the buffer at the path in the tree. */
+    reiserfs_bh_t * pe_buffer; 
+
+    /* Position in the tree node which is placed in the buffer above. */
+    int pe_position;  
+};
+
+typedef struct reiserfs_path_element reiserfs_path_element_t;
+
+
+/* We need to keep track of who the ancestors of nodes are.  When we
+   perform a search we record which nodes were visited while
+   descending the tree looking for the node we searched for. This list
+   of nodes is called the path.  This information is used while
+   performing balancing.  Note that this path information may become
+   invalid, and this means we must check it when using it to see if it
+   is still valid. You'll need to read reiserfs_tree_search_item and the 
+   comments in it, especially about decrement_counters_in_path(), 
+   to understand this structure. */
+struct reiserfs_path {
+    /* Length of the array above.   */
+    unsigned int path_length;
+    
+    /* Array of the path elements.  */
+    reiserfs_path_element_t path_elements[REISERFS_PATH_MAX];	
+    
+    int pos_in_item;
+};
+
+typedef struct reiserfs_path reiserfs_path_t;
+
+struct reiserfs_koff_v1 {
+    __u32 k_offset;
+    __u32 k_uniqueness;
+} __attribute__ ((__packed__));
+
+struct reiserfs_koff_v2 {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    __u64 k_offset:60;
+    __u64 k_type: 4;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+    __u64 k_type: 4;
+    __u64 k_offset:60;
+#else
+# error "nuxi/pdp-endian archs are not supported"
+#endif
+} __attribute__ ((__packed__));
+
+/* Key of the object determines object's location in the tree, 
+   composed of 4 components */
+struct reiserfs_key {
+    /* packing locality: by default parent directory object id */
+    __u32 k2_dir_id;
+    
+    /* object identifier */
+    __u32 k2_objectid;
+    
+    union {
+	struct reiserfs_koff_v1 k2_offset_v1;
+	struct reiserfs_koff_v2 k2_offset_v2;
+    } __attribute__ ((__packed__)) u;
+} __attribute__ ((__packed__));
+
+typedef struct reiserfs_key reiserfs_key_t;
+
+/* Everything in the filesystem is stored as a set of items.  The item head
+   contains the key of the item, its free space (for extent items) and
+   specifies the location of the item itself within the block.  */
+
+struct reiserfs_ih {
+    reiserfs_key_t ih_key; 	/* Everything in the tree is found by searching for it
+                           based on its key.*/
+
+    union {
+	__u16 ih2_free_space; /* The free space in the last unformatted node
+				of an extent item if this is an extent
+				item.  This equals 0xFFFF iff this is a direct
+				item or stat data item. Note that the key, not
+				this field, is used to determine the item
+				type, and thus which field this union
+				contains. */
+	__u16 ih2_entry_count; /* Iff this is a directory item, this field
+				  equals the number of directory entries in
+				  the directory item. */
+    } __attribute__ ((__packed__)) u;
+    __u16 ih2_item_len;           /* total size of the item body */
+    __u16 ih2_item_location;      /* an offset to the item body within the
+                                    block */
+
+    __u16 ih_format;	/* key format is stored in bits 0-11 of this item
+			   flags are stored in bits 12-15 */
+#if 0
+    struct {
+	__u16 key_format : 12; /* KEY_FORMAT_1 or KEY_FORMAT_2. This is not
+				  necessary, but we have space, let use it */
+	__u16 flags : 4;   /* fsck set here its flag (reachable/unreachable) */
+    } __attribute__ ((__packed__)) ih2_format;
+#endif
+} __attribute__ ((__packed__));
+
+typedef struct reiserfs_ih reiserfs_ih_t;
+
+typedef int (*unfm_func_t) (reiserfs_filsys_t *, __u32);
+
+#endif 
diff --git a/include/reiserfs_fs.h b/include/reiserfs_fs.h
deleted file mode 100644
index 41046df..0000000
--- a/include/reiserfs_fs.h
+++ /dev/null
@@ -1,1588 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-/*
- *  Reiser File System constants and structures
- */
-
-/* in reading the #defines, it may help to understand that they employ the
-   following abbreviations:
-
-   B = Buffer
-   I = Item header
-   H = Height within the tree (should be changed to LEV)
-   N = Number of the item in the node
-   STAT = stat data
-   DEH = Directory Entry Header
-   EC = Entry Count
-   E = Entry number
-   UL = Unsigned Long
-   BLKH = BLocK Header
-   UNFM = UNForMatted node
-   DC = Disk Child
-   P = Path
-
-   These #defines are named by concatenating these abbreviations, where first
-   comes the arguments, and last comes the return value, of the macro.
-
-*/
-
-#ifndef REISERFSPROGS_FS_H
-#define REISERFSPRIGS_FS_H 
-
-#ifndef NO_EXTERN_INLINE
-# define extern_inline extern inline
-#else
-# define extern_inline
-#endif
-
-#include <asm/unaligned.h>
-
-#ifndef get_unaligned
-#if defined(__ppc__) || defined(ppc) || defined(__ppc) || \
-    defined(__PPC) || defined(powerpc) || defined(__powerpc__)
-#	define get_unaligned(ptr)	(*(ptr))
-#	define put_unaligned(val,ptr)	((void)(*(ptr) = (val)))
-#endif
-#endif
-
-#define get_leXX(xx,p,field)	(le##xx##_to_cpu ((p)->field))
-#define set_leXX(xx,p,field,val) do { (p)->field = cpu_to_le##xx(val); } while (0)
-
-#define get_le16(p,field)	get_leXX (16, p, field)
-#define set_le16(p,field,val)	set_leXX (16, p, field, val)
-
-#define get_le32(p,field)	get_leXX (32, p, field)
-#define set_le32(p,field,val)	set_leXX (32, p, field, val)
-
-#define get_le64(p,field)	get_leXX (64, p, field)
-#define set_le64(p,field,val)	set_leXX (64, p, field, val)
-
-
-
-/***************************************************************************/
-/*                             SUPER BLOCK                                 */
-/***************************************************************************/
-
-#define UNSET_HASH 0 // read_super will guess about, what hash names
-                     // in directories were sorted with
-#define TEA_HASH  1
-#define YURA_HASH 2
-#define R5_HASH   3
-#define DEFAULT_HASH R5_HASH
-
-
-/* super block of prejournalled version */
-struct reiserfs_super_block_v0
-{
-    __u32 s_block_count;
-    __u32 s_free_blocks;
-    __u32 s_root_block;
-    __u16 s_blocksize;
-    __u16 s_oid_maxsize;
-    __u16 s_oid_cursize;
-    __u16 s_state;
-    char s_magic[16];
-    __u16 s_tree_height;
-    __u16 s_bmap_nr;
-    __u16 s_reserved;
-};
-
-
-struct journal_params {
-    __u32 jp_journal_1st_block;	/* where does journal start from on its
-                                   device */
-    __u32 jp_journal_dev;	/* journal device st_rdev */
-    __u32 jp_journal_size;	/* size of the journal on FS creation. used to
-				   make sure they don't overflow it */
-    __u32 jp_journal_trans_max;	/* max number of blocks in a transaction.  */
-    __u32 jp_journal_magic; 	/* random value made on fs creation (this was
-				   sb_journal_block_count) */
-    __u32 jp_journal_max_batch;	/* max number of blocks to batch into a trans */
-    __u32 jp_journal_max_commit_age;      /* in seconds, how old can an async commit be */
-    __u32 jp_journal_max_trans_age;       /* in seconds, how old can a transaction be */
-};
-
-
-#define get_jp_journal_1st_block(jp)	 get_le32 (jp, jp_journal_1st_block)
-#define set_jp_journal_1st_block(jp,val) set_le32 (jp, jp_journal_1st_block, val)
-
-#define get_jp_journal_dev(jp)		get_le32 (jp, jp_journal_dev)
-#define set_jp_journal_dev(jp,val)	set_le32 (jp, jp_journal_dev, val)
-
-#define get_jp_journal_size(jp)		get_le32 (jp, jp_journal_size)
-#define set_jp_journal_size(jp,val)	set_le32 (jp, jp_journal_size, val)
-
-#define get_jp_journal_max_trans_len(jp)	get_le32 (jp, jp_journal_trans_max)
-#define set_jp_journal_max_trans_len(jp,val)	set_le32 (jp, jp_journal_trans_max, val)
-
-#define get_jp_journal_magic(jp)	get_le32 (jp, jp_journal_magic)
-#define set_jp_journal_magic(jp,val)	set_le32 (jp, jp_journal_magic, val)
-
-#define NEED_TUNE 0xffffffff
-
-#define get_jp_journal_max_batch(jp)	get_le32 (jp, jp_journal_max_batch)
-#define set_jp_journal_max_batch(jp,val)	set_le32 (jp, jp_journal_max_batch, val)
-
-#define get_jp_journal_max_commit_age(jp)	get_le32 (jp, jp_journal_max_commit_age)
-#define set_jp_journal_max_commit_age(jp,val)	set_le32 (jp, jp_journal_max_commit_age, val)
-
-#define get_jp_journal_max_trans_age(jp)	get_le32 (jp, jp_journal_max_commit_age)
-#define set_jp_journal_max_trans_age(jp,val)	set_le32 (jp, jp_journal_max_commit_age, val)
-
-
-/* this is the super from 3.5.X */
-struct reiserfs_super_block_v1
-{
-    __u32 sb_block_count; 	/* 0 number of block on data device */
-    __u32 sb_free_blocks; 	/* 4 free blocks count */
-    __u32 sb_root_block;        /* 8 root of the tree */
-
-    struct journal_params sb_journal; /* 12 */
-
-    __u16 sb_blocksize;         /* 44 */
-    __u16 sb_oid_maxsize;	/* 46 max size of object id array, see
-				   get_objectid() commentary */
-    __u16 sb_oid_cursize; 	/* 48 current size of object id array */
-    __u16 sb_umount_state;	/* 50 this is set to 1 when filesystem was
-				   umounted, to 2 - when not */
-    
-    char s_magic[10]; 		/* 52 reiserfs magic string indicates that
-				   file system is reiserfs: "ReIsErFs" or
-				   "ReIsEr2Fs" or "ReIsEr3Fs" */
-    __u16 sb_fs_state; 		/* 62 it is set to used by fsck to mark which phase of
-				   rebuilding is done (used for fsck debugging) */
-    __u32 sb_hash_function_code;/* 64 code of fuction which was/is/will be
-				   used to sort names in a directory. See
-				   codes in above */
-    __u16 sb_tree_height;	/* 68 height of filesytem tree. Tree
-				   consisting of only one root block has 2
-				   here */
-    __u16 sb_bmap_nr;     	/* 70 amount of bitmap blocks needed to
-				   address each block of file system */
-    __u16 sb_version; 		/* 72 this field is only reliable on
-				   filesystem with non-standard journal */
-    __u16 sb_reserved_for_journal;  /* 74 size in blocks of journal area on
-				       main device, we need to keep after
-				       non-standard journal relocation */
-};
-
-#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1)) /* 76 bytes */
-
-#define sb_jp(sb) (&((sb)->s_v1.sb_journal))
-
-/* values for sb_version field of struct reiserfs_super_block. sb_version is
-   only reliable on filesystem with non-standard journal */
-#define REISERFS_FORMAT_3_5 0
-#define REISERFS_FORMAT_3_6 2
-#define REISERFS_FORMAT_UNKNOWN -1
-                                   
-
-/* values for sb_mount_state field */
-#define FS_CLEANLY_UMOUNTED    1 /* this was REISERFS_VALID_FS */
-#define FS_NOT_CLEANLY_UMOUNTED    2 /* this was REISERFS_ERROR. It
-                                              means that filesystem was not
-                                              cleanly unmounted */
-
-/* Structure of super block on disk */
-struct reiserfs_super_block
-{
-/*  0 */    struct reiserfs_super_block_v1 s_v1;
-/* 76 */     __u32 sb_inode_generation; 
-/* 80 */     __u32 s_flags;                /* Right now used only by inode-attributes, if enabled */
-/* 84 */    unsigned char s_uuid[16];      /* filesystem unique identifier */
-/*100 */    unsigned char s_label[16];     /* filesystem volume label */
-/*116 */    char s_unused[88] ;            /* zero filled by mkreiserfs and reiserfs_convert_objectid_map_v1()
-                                            * so any additions must be updated there as well. */ 
-/*204*/
-} __attribute__ ((__packed__));;
-
-typedef enum {
-  reiserfs_attrs_cleared       = 0x00000001,
-} reiserfs_super_block_flags;
-
-
-
-#define SB_SIZE (sizeof(struct reiserfs_super_block)) /* 204 bytes */
-
-/* set/get fields of super block with these defines */
-#define get_sb_block_count(sb)		get_le32 (sb, s_v1.sb_block_count)
-#define set_sb_block_count(sb,val)	set_le32 (sb, s_v1.sb_block_count, val)
-
-#define get_sb_free_blocks(sb)		get_le32 (sb, s_v1.sb_free_blocks)
-#define set_sb_free_blocks(sb,val)	set_le32 (sb, s_v1.sb_free_blocks, val)
-
-#define get_sb_root_block(sb)		get_le32 (sb,s_v1.sb_root_block)
-#define set_sb_root_block(sb,val)	set_le32 (sb, s_v1.sb_root_block, val)
-
-#if 0
-#define get_sb_mount_id(sb)		get_le32 (sb,s_v1.sb_mountid)
-#define set_sb_mount_id(sb,val)		set_le32 (sb, s_v1.sb_mountid, val)
-
-#define get_sb_journal_magic(sb)	get_le32 (sb, s_v1.sb_journal_magic)
-#define set_sb_journal_magic(sb,val)	set_le32 (sb, s_v1.sb_journal_magic, val)
-#endif
-
-#define get_sb_block_size(sb)		get_le16 (sb, s_v1.sb_blocksize)
-#define set_sb_block_size(sb,val)	set_le16 (sb, s_v1.sb_blocksize, val)
-
-#define get_sb_oid_maxsize(sb)		get_le16 (sb, s_v1.sb_oid_maxsize)
-#define set_sb_oid_maxsize(sb,val)	set_le16 (sb, s_v1.sb_oid_maxsize, val)
-
-#define get_sb_oid_cursize(sb)		get_le16 (sb, s_v1.sb_oid_cursize)
-#define set_sb_oid_cursize(sb,val)	set_le16 (sb, s_v1.sb_oid_cursize, val)
-
-#define get_sb_umount_state(sb)		get_le16 (sb, s_v1.sb_umount_state)
-#define set_sb_umount_state(sb,val)	set_le16 (sb, s_v1.sb_umount_state, val)
-
-#define get_sb_fs_state(sb)		get_le16 (sb, s_v1.sb_fs_state)
-#define set_sb_fs_state(sb,flag)	set_le16 (sb, s_v1.sb_fs_state, flag)
-
-#define get_sb_hash_code(sb)		get_le32 (sb, s_v1.sb_hash_function_code)
-#define set_sb_hash_code(sb,val)	set_le32 (sb, s_v1.sb_hash_function_code, val)
-
-#define get_sb_tree_height(sb)		get_le16 (sb, s_v1.sb_tree_height)
-#define set_sb_tree_height(sb,val)	set_le16 (sb, s_v1.sb_tree_height, val)
-
-#define get_sb_bmap_nr(sb)		get_le16 (sb, s_v1.sb_bmap_nr)
-#define set_sb_bmap_nr(sb,val)		set_le16 (sb, s_v1.sb_bmap_nr, val)
-
-#define get_sb_version(sb)		get_le16 (sb, s_v1.sb_version)
-#define set_sb_version(sb,val)		set_le16 (sb, s_v1.sb_version, val)
-
-#define get_sb_reserved_for_journal(sb)		get_le16 (sb, s_v1.sb_reserved_for_journal)
-#define set_sb_reserved_for_journal(sb,val)	set_le16 (sb, s_v1.sb_reserved_for_journal, val)
-
-#define get_sb_v2_inode_generation(sb)		get_le32 (sb, sb_inode_generation)
-#define set_sb_v2_inode_generation(sb,val)	set_le32 (sb, sb_inode_generation, val)
-
-#define get_sb_v2_flags(sb)		get_le32 (sb, s_flags)
-#define set_sb_v2_flags(sb, val)	set_le32 (sb, s_flags, val)
-
-#define get_sb_v2_flag(sb, flag)       (get_le32 (sb, s_flags) & flag)
-#define set_sb_v2_flag(sb, flag)	set_le32 (sb, s_flags, get_le32 (sb, s_flags) | flag)
-#define clear_sb_v2_flag(sb, flag)	set_le32 (sb, s_flags, get_le32 (sb, s_flags) & ~(flag))
-
-/*
-#define journal_is_relocated(sb)        get_jp_journal_dev(sb_jp (sb))
-*/
-
-/* these are possible values for sb_fs_state */
-#define FS_CONSISTENT   0x0	    /* this is set by mkreiserfs and by reiserfsck */
-#define FS_ERROR	0x1	    /* this is set by the kernel when fsck is wanted. */
-#define FS_FATAL	0x2	    /* this is set by fsck when fatal corruption is found */
-#define IO_ERROR	0x4	    /* this is set by kernel when io error occures */
-#define PASS_0_DONE     0xfa02	    /* set by fsck when pass-by-pass (-d),
-				       FS_FATAL flag included */
-#define PASS_1_DONE     0xfb02	    /* set by fsck when pass-by-pass (-d),
-                                       FS_FATAL flag included */
-#define TREE_IS_BUILT   0xfc02	    /* set by fsck when pass-by-pass (-d),
-                                       FS_FATAL flag included */
-#define SEMANTIC_DONE   0xfd02	    /* set by fsck when pass-by-pass (-d),
-                                       FS_FATAL flag included */
-#define LOST_FOUND_DONE 0xfe02	    /* set by fsck when pass-by-pass (-d),
-                                       FS_FATAL flag included */
-
-/* struct stat_data* access macros */
-/* v1 */
-#define sd_v1_mode(sd)                 (le16_to_cpu((sd)->sd_mode))
-#define set_sd_v1_mode(sd,n)           ((sd)->sd_mode = cpu_to_le16((n)))
-#define sd_v1_nlink(sd)                (le16_to_cpu((sd)->sd_nlink))
-#define set_sd_v1_nlink(sd,n)          ((sd)->sd_nlink = cpu_to_le16((n))) 
-#define sd_v1_uid(sd)                  (le16_to_cpu((sd)->sd_uid))
-#define set_sd_v1_uid(sd,n)            ((sd)->sd_uid = cpu_to_le16((n)))
-#define sd_v1_gid(sd)                  (le16_to_cpu((sd)->sd_gid))
-#define set_sd_v1_gid(sd,n)            ((sd)->sd_gid = cpu_to_le16((n)))
-#define sd_v1_size(sd)                 (le32_to_cpu((sd)->sd_size))
-#define set_sd_v1_size(sd,n)           ((sd)->sd_size = cpu_to_le32((n)))
-#define sd_v1_atime(sd)                (le32_to_cpu((sd)->sd_atime))
-#define set_sd_v1_atime(sd,n)          ((sd)->sd_atime = cpu_to_le32((n)))
-#define sd_v1_mtime(sd)                (le32_to_cpu((sd)->sd_mtime))
-#define set_sd_v1_mtime(sd,n)          ((sd)->sd_mtime = cpu_to_le32((n)))
-#define sd_v1_ctime(sd)                (le32_to_cpu((sd)->sd_ctime))
-#define set_sd_v1_ctime(sd,n)          ((sd)->sd_ctime = cpu_to_le32((n)))
-#define sd_v1_blocks(sd)               (le32_to_cpu((sd)->u.sd_blocks))
-#define set_sd_v1_blocks(sd,n)         ((sd)->u.sd_blocks = cpu_to_le32((n)))
-#define sd_v1_rdev(sd)                 (le32_to_cpu((sd)->u.sd_rdev))
-#define set_sd_v1_rdev(sd,n)           ((sd)->u.sd_rdev = cpu_to_le32((n)))
-#define sd_v1_first_direct_byte(sd)    (le32_to_cpu((sd)->sd_first_direct_byte))
-#define set_sd_v1_first_direct_byte(sd,n) \
-                                 ((sd)->sd_first_direct_byte = cpu_to_le32((n)))
-/* v2 */
-#define sd_v2_mode(sd)                 (le16_to_cpu((sd)->sd_mode))
-#define set_sd_v2_mode(sd,n)           ((sd)->sd_mode = cpu_to_le16((n)))
-#define sd_v2_sd_attrs(sd)             (le16_to_cpu((sd)->sd_attrs))
-#define set_sd_v2_sd_attrs(sd,n)       ((sd)->sd_attrs = cpu_to_le16((n)))
-#define sd_v2_nlink(sd)                (le32_to_cpu((sd)->sd_nlink))
-#define set_sd_v2_nlink(sd,n)          ((sd)->sd_nlink = cpu_to_le32((n))) 
-#define sd_v2_size(sd)                 (le64_to_cpu((sd)->sd_size))
-#define set_sd_v2_size(sd,n)           ((sd)->sd_size = cpu_to_le64((n)))
-#define sd_v2_uid(sd)                  (le32_to_cpu((sd)->sd_uid))
-#define set_sd_v2_uid(sd,n)            ((sd)->sd_uid = cpu_to_le32((n)))
-#define sd_v2_gid(sd)                  (le32_to_cpu((sd)->sd_gid))
-#define set_sd_v2_gid(sd,n)            ((sd)->sd_gid = cpu_to_le32((n)))
-#define sd_v2_atime(sd)                (le32_to_cpu((sd)->sd_atime))
-#define set_sd_v2_atime(sd,n)          ((sd)->sd_atime = cpu_to_le32((n)))
-#define sd_v2_mtime(sd)                (le32_to_cpu((sd)->sd_mtime))
-#define set_sd_v2_mtime(sd,n)          ((sd)->sd_mtime = cpu_to_le32((n)))
-#define sd_v2_ctime(sd)                (le32_to_cpu((sd)->sd_ctime))
-#define set_sd_v2_ctime(sd,n)          ((sd)->sd_ctime = cpu_to_le32((n)))
-#define sd_v2_blocks(sd)               (le32_to_cpu((sd)->sd_blocks))
-#define set_sd_v2_blocks(sd,n)         ((sd)->sd_blocks = cpu_to_le32((n)))
-#define sd_v2_rdev(sd)                 (le32_to_cpu((sd)->u.sd_rdev))
-#define set_sd_v2_rdev(sd,n)           ((sd)->u.sd_rdev = cpu_to_le32((n)))
-
-
-/* ReiserFS leaves the first 64k unused, so that partition labels have enough
-   space.  If someone wants to write a fancy bootloader that needs more than
-   64k, let us know, and this will be increased in size.  This number must be
-   larger than than the largest block size on any platform, or code will
-   break.  -Hans */
-#define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)
-
-/*#define MD_RAID_SUPERBLOCKS_IN_BYTES (128 * 1024)*/
-
-/* the spot for the super in versions 3.5 - 3.5.11 (inclusive) */
-#define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)
-
-/* prejournalled reiserfs had signature in the other place in super block */
-#define REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ 20
-
-/* f_type of struct statfs will be set at this value by statfs(2) */
-#define REISERFS_SUPER_MAGIC 0x52654973
-
-/* various reiserfs signatures. We have 3 so far. ReIsErFs for 3.5 format with
-   standard journal, ReIsEr2Fs for 3.6 (or converted 3.5) and ReIsEr3Fs for
-   filesystem with non-standard journal (formats are distinguished by
-   sb_version in that case). Those signatures should be looked for at the
-   64-th and at the 8-th 1k block of the device */
-#define REISERFS_3_5_SUPER_MAGIC_STRING "ReIsErFs"
-#define REISERFS_3_6_SUPER_MAGIC_STRING "ReIsEr2Fs"
-#define REISERFS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" /* JR stands for Journal
-						      Relocation */
-
-#define get_reiserfs_ondisk_offset(block_of_super_block, block_size) \
-    (block_of_super_block * block_size)
-
-#define is_new_sb_location(block_of_super_block, block_size) \
-    ((get_reiserfs_ondisk_offset(block_of_super_block, block_size) == REISERFS_DISK_OFFSET_IN_BYTES) \
-	? 1 : 0)
-	
-/*only 4k blocks for old location*/
-#define is_old_sb_location(block_of_super_block, block_size) \
-    ((get_reiserfs_ondisk_offset(block_of_super_block, 4096) == REISERFS_OLD_DISK_OFFSET_IN_BYTES) \
-	? 1 : 0)
-
-/***************************************************************************/
-/*                             JOURNAL                                     */
-/***************************************************************************/
-
-#define JOURNAL_DESC_MAGIC "ReIsErLB" /* ick.  magic string to find desc
-                                         blocks in the journal */
-
-/* journal.c see journal.c for all the comments here */
-
-//#define JOURNAL_TRANS_HALF 1018   /* must be correct to keep the desc and commit structs at 4k */
-
-/* first block written in a commit.  BUG, not 64bit safe */
-struct reiserfs_journal_desc {
-    __u32 j2_trans_id ;	/* id of commit */
-    __u32 j2_len ;	/* length of commit. len +1 is the commit block */
-    __u32 j2_mount_id ;	/* mount id of this trans*/
-    __u32 j2_realblock[1] ; /* real locations for each block */    
-};
-
-#define get_jd_magic(bh) (bh->b_data + bh->b_size - 12)
-
-
-
-#define journal_trans_half(blocksize) \
-((blocksize - sizeof (struct reiserfs_journal_desc) + sizeof (__u32) - 12) / sizeof (__u32))
-
-#define jdesc_header(bh) ((struct reiserfs_journal_desc *)bh->b_data)
-
-#define get_desc_trans_id(bh)	  get_le32 (jdesc_header (bh), j2_trans_id)
-#define set_desc_trans_id(bh,val)	  set_le32 (jdesc_header (bh), j2_trans_id, val)
-
-#define get_desc_trans_len(bh)	          get_le32 (jdesc_header (bh), j2_len)
-#define set_desc_trans_len(bh,val)	  set_le32 (jdesc_header (bh), j2_len, val)
-
-#define get_desc_mount_id(bh)	  get_le32 (jdesc_header (bh), j2_mount_id)
-#define set_desc_mount_id(bh,val)	  set_le32 (jdesc_header (bh), j2_mount_id, val)
-    
-
-/* last block written in a commit BUG, not 64bit safe */
-struct reiserfs_journal_commit {
-    __u32 j3_trans_id ;	 /* must match j_trans_id from the desc block */
-    __u32 j3_len ;	 /* ditto */
-    __u32 j3_realblock[1] ; /* real locations for each block */
-} ;
-
-#define jcommit_header(bh) ((struct reiserfs_journal_commit *)bh->b_data)
-
-#define get_commit_trans_id(bh)		get_le32 (jcommit_header(bh), j3_trans_id)
-#define set_commit_trans_id(bh,val)	set_le32 (jcommit_header(bh), j3_trans_id, val)
-
-#define get_commit_trans_len(bh)	get_le32 (jcommit_header(bh), j3_len)
-#define set_comm_trans_len(bh,val)	set_le32 (jcommit_header(bh), j3_len, val)
-
-
-/* this header block gets written whenever a transaction is considered fully
-** flushed, and is more recent than the last fully flushed transaction.  fully
-** flushed means all the log blocks and all the real blocks are on disk, and
-** this transaction does not need to be replayed.  */
-struct reiserfs_journal_header {    
-    __u32 jh_last_flush_trans_id ;    /* id of last fully flushed transaction */
-    __u32 jh_first_unflushed_offset ; /* offset in the log of where to start replay after a crash */
-    __u32 jh_mount_id ;
-
-    struct journal_params jh_journal;
-
-    __u32 jh_last_check_mount_id;	/* the mount id of the fs during the last reiserfsck --check. */
-};
-
-
-/* set/get fields of journal header with these defines */
-#define get_jh_mount_id(jh)	get_le32 (jh, jh_mount_id)
-#define set_jh_mount_id(jh,val)	set_le32 (jh, jh_mount_id, val)
-
-#define get_jh_last_flushed(jh)		get_le32 (jh, jh_last_flush_trans_id)
-#define set_jh_last_flushed(jh,val)	set_le32 (jh, jh_last_flush_trans_id, val)
-
-#define get_jh_replay_start_offset(jh)		get_le32 (jh, jh_first_unflushed_offset)
-#define set_jh_replay_start_offset(jh,val)	set_le32 (jh, jh_first_unflushed_offset, val)
-
-
-
-/* journal default settings */
-
-#define JOURNAL_MIN_SIZE 	512
-#define JOURNAL_TRANS_MAX 	1024   	/* biggest possible single transaction, don't
-                                    	change for now (8/3/99) */
-#define JOURNAL_TRANS_MIN 	256    	/* need to check whether it works */
-#define JOURNAL_DEFAULT_RATIO 	8  	/* default journal size / max trans length */
-#define JOURNAL_MIN_RATIO 	2
-#define JOURNAL_MAX_BATCH   	900 	/* max blocks to batch into one transaction,
-                                   	don't make this any bigger than 900 */
-#define JOURNAL_MAX_COMMIT_AGE 	30
-#define JOURNAL_MAX_TRANS_AGE 	30
-
-/* journal max size is a maximum number of blocks pointed by first bitmap -
-   REISERFS_DISK_OFFSET - superblock - first bitmap - journal herader */
-#define journal_max_size(block_of_super_block,blocksize) \
-	blocksize * 8 - (block_of_super_block + 1 + 1 + 1)
-
-#define journal_default_size(block_of_super_block,blocksize) \
-	(unsigned long long)((8192 > journal_max_size (block_of_super_block,blocksize)) ? \
-		journal_max_size (block_of_super_block,blocksize) : 8192)
-
-//#define JOURNAL_DEFAULT_SIZE 8192  number of blocks in the journal
-//#define JOURNAL_DEFAULT_SIZE_FOR_BS_1024 8125  number of blocks in the journal for block size 1KB
-
-#define bh_desc(bh) ((struct reiserfs_journal_desc *)((bh)->b_data))
-#define bh_commit(bh) ((struct reiserfs_journal_commit *)((bh)->b_data))
-
-
-/***************************************************************************/
-/*                       KEY & ITEM HEAD                                   */
-/***************************************************************************/
-
-struct offset_v1 {
-    __u32 k_offset;
-    __u32 k_uniqueness;
-} __attribute__ ((__packed__));
-
-struct offset_v2 {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-    __u64 k_offset:60;
-    __u64 k_type: 4; // TYPE_STAT_DATA | TYPE_INDIRECT | TYPE_DIRECT | TYPE_DIRENTRY
-#elif __BYTE_ORDER == __BIG_ENDIAN
-    __u64 k_type: 4; // TYPE_STAT_DATA | TYPE_INDIRECT | TYPE_DIRECT | TYPE_DIRENTRY
-    __u64 k_offset:60;
-#else
-# error "nuxi/pdp-endian archs are not supported"
-#endif
-} __attribute__ ((__packed__));
-
-
-/* Key of the object determines object's location in the tree, composed of 4 components */
-struct key {
-    __u32 k2_dir_id;    /* packing locality: by default parent directory object id */
-    __u32 k2_objectid;  /* object identifier */
-    union {
-	struct offset_v1 k2_offset_v1;
-	struct offset_v2 k2_offset_v2;
-    } __attribute__ ((__packed__)) u;
-} __attribute__ ((__packed__));
-
-
-/* set/get fields of keys on disk with these defines */
-#define get_key_dirid(k)		get_le32 (k, k2_dir_id)
-#define set_key_dirid(k,val)		set_le32 (k, k2_dir_id, val)
-
-#define get_key_objectid(k)		get_le32 (k, k2_objectid)
-#define set_key_objectid(k,val)		set_le32 (k, k2_objectid, val)
-
-#define get_key_offset_v1(k)		get_le32 (k, u.k2_offset_v1.k_offset)
-#define set_key_offset_v1(k,val)	set_le32 (k, u.k2_offset_v1.k_offset, val)
-
-#define get_key_uniqueness(k)		get_le32 (k, u.k2_offset_v1.k_uniqueness)
-#define set_key_uniqueness(k,val)	set_le32 (k, u.k2_offset_v1.k_uniqueness, val)
-
-
-/*
-#define get_key_offset_v2(k)		get_le64 (k, u.k2_offset_v2.k_offset)
-#define set_key_offset_v2(k,val)	set_le64 (k, u.k2_offset_v2.k_offset, val)
-*/
-/* ??? */
-/*
-#define get_key_type(k)			get_le16 (k, u.k2_offset_v2.k_type)
-#define set_key_type(k,val)		set_le16 (k, u.k2_offset_v2.k_type, val)
-*/
-/*
-#define key_dir_id(key)                 (le32_to_cpu((key)->k_dir_id))
-#define set_key_dir_id(key,n)           ((key)->k_dir_id = cpu_to_le32((n)))
-#define key_objectid(key)               (le32_to_cpu((key)->k_objectid))
-#define set_key_objectid(key,n)         ((key)->k_objectid = cpu_to_le32((n)))
-*/
-
-#define KEY_SIZE (sizeof(struct key))
-#define SHORT_KEY_SIZE 8
-
-
-// values for k_uniqueness field of the struct key
-#define V1_SD_UNIQUENESS 0
-#define V1_DIRENTRY_UNIQUENESS 500
-#define DIRENTRY_UNIQUENESS 500
-#define V1_DIRECT_UNIQUENESS 0xffffffff
-#define V1_INDIRECT_UNIQUENESS 0xfffffffe
-#define V1_UNKNOWN_UNIQUENESS 555
-
-// values for k_type field of the struct key
-#define TYPE_STAT_DATA 0
-#define TYPE_INDIRECT 1
-#define TYPE_DIRECT 2
-#define TYPE_DIRENTRY 3 
-
-#define TYPE_UNKNOWN 15
-
-/* special type for symlink not conflicting to any of item types. */
-#define TYPE_SYMLINK	4
-
-#define KEY_FORMAT_1 0
-#define KEY_FORMAT_2 1
-#define KEY_FORMAT_UNDEFINED 15
-
- /* Our function for comparing keys can compare keys of different lengths.  It
-    takes as a parameter the length of the keys it is to compare.  These
-    defines are used in determining what is to be passed to it as that
-    parameter. */
-#define REISERFS_FULL_KEY_LEN     4
-
-#define REISERFS_SHORT_KEY_LEN    2
-
-
-/* Everything in the filesystem is stored as a set of items.  The item head
-   contains the key of the item, its free space (for indirect items) and
-   specifies the location of the item itself within the block.  */
-
-struct item_head
-{
-    struct key ih_key; 	/* Everything in the tree is found by searching for it
-                           based on its key.*/
-
-    union {
-	__u16 ih2_free_space; /* The free space in the last unformatted node
-				of an indirect item if this is an indirect
-				item.  This equals 0xFFFF iff this is a direct
-				item or stat data item. Note that the key, not
-				this field, is used to determine the item
-				type, and thus which field this union
-				contains. */
-	__u16 ih2_entry_count; /* Iff this is a directory item, this field
-				  equals the number of directory entries in
-				  the directory item. */
-    } __attribute__ ((__packed__)) u;
-    __u16 ih2_item_len;           /* total size of the item body */
-    __u16 ih2_item_location;      /* an offset to the item body within the
-                                    block */
-
-    __u16 ih_format;	/* key format is stored in bits 0-11 of this item
-			   flags are stored in bits 12-15 */
-#if 0
-    struct {
-	__u16 key_format : 12; /* KEY_FORMAT_1 or KEY_FORMAT_2. This is not
-				  necessary, but we have space, let use it */
-	__u16 flags : 4;   /* fsck set here its flag (reachable/unreachable) */
-    } __attribute__ ((__packed__)) ih2_format;
-#endif
-} __attribute__ ((__packed__));
-
-
-/* size of item header     */
-#define IH_SIZE (sizeof(struct item_head))
-
-/* set/get fields of item head on disk with these defines */
-#define get_ih_entry_count(ih)		get_le16 (ih, u.ih2_entry_count)
-#define set_ih_entry_count(ih,val)	set_le16 (ih, u.ih2_entry_count, val)
-
-#define get_ih_free_space(ih)		get_le16 (ih, u.ih2_free_space)
-#define set_ih_free_space(ih,val)	set_le16 (ih, u.ih2_free_space, 0)
-
-#define get_ih_item_len(ih)		get_le16 (ih, ih2_item_len)
-#define set_ih_item_len(ih,val)		set_le16 (ih, ih2_item_len, val)
-
-#define get_ih_location(ih)		get_le16 (ih, ih2_item_location)
-#define set_ih_location(ih,val)		set_le16 (ih, ih2_item_location, val)
-
-__u16 get_ih_flags (const struct item_head * ih);
-__u16 get_ih_key_format (const struct item_head * ih);
-void set_ih_flags (struct item_head * ih, __u16 val);
-void set_ih_key_format (struct item_head * ih, __u16 val);
-
-
-/*
-#define get_ih_key_format(ih)		get_le16 (ih, ih2_format.key_format)
-#define set_ih_key_format(ih,val)	set_le16 (ih, ih2_format.key_format, val)
-
-#define get_ih_flags(ih)		get_le16 (ih, ih2_format.flags)
-#define set_ih_flags(ih,val)		set_le16 (ih, ih2_format.flags, val)
-*/
-
-#define I_K_KEY_IN_ITEM(p_s_ih, p_s_key, n_blocksize) \
-    ( ! not_of_one_file(p_s_ih, p_s_key) && \
-          I_OFF_BYTE_IN_ITEM(p_s_ih, get_offset (p_s_key), n_blocksize) )
-
-#define IH_Unreachable 0
-#define IH_Was_Tail    1
-#define IH_Checked     2
-#define IH_Writable    3
-
-
-/* Bad item flag is set temporary by recover_leaf */
-/*
-extern_inline __u16 mark_ih_bad( struct item_head *ih )
-{
-    set_ih_flags(ih, get_ih_flags(ih) | IH_Bad );
-    return get_ih_flags(ih);
-}
-
-extern_inline __u16 ih_bad( struct item_head *ih )
-{
-    __u16 tmp = get_ih_flags(ih);
-    return test_bit(IH_Bad, &tmp );
-}
-
-extern_inline __u16 unmark_item_bad( struct item_head *ih )
-{
-    __u16 tmp = get_ih_flags(ih);
-    clear_bit( IH_Bad, &tmp );
-    set_ih_flags( ih, tmp );
-    return tmp;
-}
-*/
-
-/* Unreachable bit is set on tree rebuilding and is cleared in semantic pass */
-#define clean_ih_flags(ih) set_ih_flags (ih, 0)
-
-#define ih_reachable(ih)        (!(get_ih_flags (ih) & (1 << IH_Unreachable)))
-#define mark_ih_reachable(ih)   set_ih_flags (ih, get_ih_flags (ih) & ~(1 << IH_Unreachable))
-#define mark_ih_unreachable(ih) set_ih_flags (ih, get_ih_flags (ih) | (1 << IH_Unreachable))
-
-#define ih_was_tail(ih)         (get_ih_flags (ih) & (1 << IH_Was_Tail))
-#define mark_ih_was_tail(ih)    set_ih_flags (ih, get_ih_flags (ih) | (1 << IH_Was_Tail))
-#define mark_ih_become_tail(ih) set_ih_flags (ih, get_ih_flags (ih) & ~(1 << IH_Was_Tail))
-
-#define ih_checked(ih)          (get_ih_flags (ih) & (1 << IH_Checked))
-#define mark_ih_checked(ih)     set_ih_flags (ih, get_ih_flags (ih) | (1 << IH_Checked))
-#define clear_ih_checked(ih)    set_ih_flags (ih, get_ih_flags (ih) & ~(1 << IH_Checked))
-
-#define ih_writable(ih)         (get_ih_flags (ih) & (1 << IH_Writable))
-#define mark_ih_writable(ih)    set_ih_flags (ih, get_ih_flags (ih) | (1 << IH_Writable))
-#define clear_ih_writable(ih)   set_ih_flags (ih, get_ih_flags (ih) & ~(1 << IH_Writable))
-
-/* maximal length of item */
-#define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)
-#define MIN_ITEM_LEN 1
-
-
-/* object identifier for root dir */
-#define REISERFS_ROOT_OBJECTID 2
-#define REISERFS_ROOT_PARENT_OBJECTID 1
-
-
-/* 
- * Picture represents a leaf of internal tree
- *  ______________________________________________________
- * |      |  Array of     |                   |           |
- * |Block |  Object-Item  |      F r e e      |  Objects- |
- * | head |  Headers      |     S p a c e     |   Items   |
- * |______|_______________|___________________|___________|
- */
-
-/* Header of a disk block.  More precisely, header of a formatted leaf
-   or internal node, and not the header of an unformatted node. */
-struct block_head {       
-    __u16 blk2_level;        /* Level of a block in the tree. */
-    __u16 blk2_nr_item;      /* Number of keys/items in a block. */
-    __u16 blk2_free_space;   /* Block free space in bytes. */
-    __u16 blk_reserved;
-    __u32 reserved [4];
-};
-
-#define BLKH_SIZE (sizeof(struct block_head))
-
-/* set/get fields of block head on disk with these defines */
-#define get_blkh_level(blkh)		get_le16 (blkh, blk2_level)
-#define set_blkh_level(blkh,val)	set_le16 (blkh, blk2_level, val)
-
-#define get_blkh_nr_items(blkh)		get_le16 (blkh, blk2_nr_item)
-#define set_blkh_nr_items(blkh,val)	set_le16 (blkh, blk2_nr_item, val)
-
-#define get_blkh_free_space(blkh)	get_le16 (blkh, blk2_free_space)
-#define set_blkh_free_space(blkh,val)	set_le16 (blkh, blk2_free_space, val)
-
-
-
-
-
-/*
- * values for blk_type field
- */
-
-#define FREE_LEVEL        0 /* Node of this level is out of the tree. */
-#define DISK_LEAF_NODE_LEVEL  1 /* Leaf node level.                       */
-
-
-#define is_leaf_block_head(buf) (get_blkh_level ((struct block_head *)(buf)) == DISK_LEAF_NODE_LEVEL)
-#define is_internal_block_head(buf) \
-((get_blkh_level (((struct block_head *)(buf))) > DISK_LEAF_NODE_LEVEL) &&\
- (get_blkh_level (((struct block_head *)(buf))) <= MAX_HEIGHT))
-
-
-/* Given the buffer head of a formatted node, resolve to the block head of that node. */
-#define B_BLK_HEAD(p_s_bh)  ((struct block_head *)((p_s_bh)->b_data))
-
-
-#define B_NR_ITEMS(bh)		get_blkh_nr_items (B_BLK_HEAD(bh))
-#define B_LEVEL(bh)		get_blkh_level (B_BLK_HEAD(bh))
-#define B_FREE_SPACE(bh)	get_blkh_free_space (B_BLK_HEAD(bh))
-
-
-#define is_leaf_node(bh) is_leaf_block_head ((bh)->b_data)
-#define is_internal_node(bh) is_internal_block_head ((bh)->b_data)
-
-
-
-
-
-
-/***************************************************************************/
-/*                             STAT DATA                                   */
-/***************************************************************************/
-
-/* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */
-
-/* The sense of adding union to stat data is to keep a value of real number of
-   blocks used by file.  The necessity of adding such information is caused by
-   existing of files with holes.  Reiserfs should keep number of used blocks
-   for file, but not calculate it from file size (that is not correct for
-   holed files). Thus we have to add additional information to stat data.
-   When we have a device special file, there is no need to get number of used
-   blocks for them, and, accordingly, we doesn't need to keep major and minor
-   numbers for regular files, which might have holes. So this field is being
-   overloaded.  */
-
-struct stat_data_v1 {
-    __u16 sd_mode;	/* file type, permissions */
-    __u16 sd_nlink;	/* number of hard links */
-    __u16 sd_uid;		/* owner */
-    __u16 sd_gid;		/* group */
-    __u32 sd_size;	/* file size */
-    __u32 sd_atime;	/* time of last access */
-    __u32 sd_mtime;	/* time file was last modified  */
-    __u32 sd_ctime;	/* time inode (stat data) was last changed (except
-                           changes to sd_atime and sd_mtime) */
-    union {
-	__u32 sd_rdev;
-	__u32 sd_blocks;	/* number of blocks file uses */
-    } __attribute__ ((__packed__)) u;
-    __u32 sd_first_direct_byte; /* first byte of file which is stored
-				   in a direct item: except that if it
-				   equals 1 it is a symlink and if it
-				   equals MAX_KEY_OFFSET there is no
-				   direct item.  The existence of this
-				   field really grates on me. Let's
-				   replace it with a macro based on
-				   sd_size and our tail suppression
-				   policy.  Someday.  -Hans */
-} __attribute__ ((__packed__));
-#define SD_V1_SIZE (sizeof(struct stat_data_v1))
-
-
-/* this is used to check sd_size of stat data v1 */
-#define MAX_FILE_SIZE_V1 0x7fffffff
-
-
-// sd_first_direct_byte is set to this when there are no direct items in a
-// file
-#define NO_BYTES_IN_DIRECT_ITEM 0xffffffff
-
-
-/* Stat Data on disk (reiserfs version of UFS disk inode minus the
-   address blocks) */
-struct stat_data {
-    __u16 sd_mode;	/* file type, permissions */
-    __u16 sd_attrs;
-    __u32 sd_nlink;	/* 32 bit nlink! */
-    __u64 sd_size;	/* 64 bit size!*/
-    __u32 sd_uid;	/* 32 bit uid! */
-    __u32 sd_gid;	/* 32 bit gid! */
-    __u32 sd_atime;	/* time of last access */
-    __u32 sd_mtime;	/* time file was last modified  */
-    __u32 sd_ctime;	/* time inode (stat data) was last changed (except
-                           changes to sd_atime and sd_mtime) */
-    __u32 sd_blocks;
-    union {
-	__u32 sd_rdev;
-	__u32 sd_generation;
-      //__u32 sd_first_direct_byte; 
-      /* first byte of file which is stored in a direct item: except that if
-	 it equals 1 it is a symlink and if it equals ~(__u32)0 there is no
-	 direct item.  The existence of this field really grates on me. Let's
-	 replace it with a macro based on sd_size and our tail suppression
-	 policy? */
-  } __attribute__ ((__packed__)) u;
-} __attribute__ ((__packed__));
-//
-// this is 44 bytes long
-//
-#define SD_SIZE (sizeof(struct stat_data))
-
-// there are two ways: to check length of item or ih_format field
-// (for old stat data it is set to 0 (KEY_FORMAT_1))
-#define stat_data_v1(ih) (get_ih_key_format (ih) == KEY_FORMAT_1)
-
-/* this is used to check sd_size of stat data v2: max offset which can
-   be reached with a key of format 2 is 60 bits */
-#define MAX_FILE_SIZE_V2 0xfffffffffffffffLL
-
-
-/***************************************************************************/
-/*                      DIRECTORY STRUCTURE                                */
-/***************************************************************************/
-/* 
-   Picture represents the structure of directory items
-   ________________________________________________
-   |  Array of     |   |     |        |       |   |
-   | directory     |N-1| N-2 | ....   |   1st |0th|
-   | entry headers |   |     |        |       |   |
-   |_______________|___|_____|________|_______|___|
-                    <----   directory entries         ------>
-
- First directory item has k_offset component 1. We store "." and ".."
- in one item, always, we never split "." and ".." into differing
- items.  This makes, among other things, the code for removing
- directories simpler. */
-#define SD_OFFSET  0
-#define DOT_OFFSET 1
-#define DOT_DOT_OFFSET 2
-
-
-/* Each directory entry has its header. This header has deh_dir_id and
-   deh_objectid fields, those are key of object, entry points to */
-
-/* NOT IMPLEMENTED:   
-   Directory will someday contain stat data of object */
-struct reiserfs_de_head
-{
-    __u32 deh2_offset;  /* third component of the directory entry key */
-    __u32 deh2_dir_id;  /* objectid of the parent directory of the object,
-			   that is referenced by directory entry */
-    __u32 deh2_objectid;/* objectid of the object, that is referenced by
-			   directory entry */
-    __u16 deh2_location;/* offset of name in the whole item */
-    __u16 deh2_state;   /* whether 1) entry contains stat data (for future),
-			   and 2) whether entry is hidden (unlinked) */
-} __attribute__ ((__packed__));
-
-#define DEH_SIZE sizeof(struct reiserfs_de_head)
-
-/* set/get fields of dir entry head these defines */
-#define get_deh_offset(deh)	get_le32 (deh, deh2_offset)
-#define set_deh_offset(deh,val)	set_le32 (deh, deh2_offset, val)
-
-#define get_deh_dirid(deh)	get_le32 (deh, deh2_dir_id)
-#define set_deh_dirid(deh,val)	set_le32 (deh, deh2_dir_id, val)
-
-#define get_deh_objectid(deh)		get_le32 (deh, deh2_objectid)
-#define set_deh_objectid(deh,val)	set_le32 (deh, deh2_objectid, val)
-
-#define get_deh_location(deh)		get_le16 (deh, deh2_location)
-#define set_deh_location(deh,val)	set_le16 (deh, deh2_location, val)
-
-#define get_deh_state(deh)	get_le16 (deh, deh2_state)
-#define set_deh_state(deh,val)	set_le16 (deh, deh2_state, val)
-
-
-
-#define deh_offset(deh) (le32_to_cpu ((deh)->deh_offset))
-#define deh_dir_id(deh) (le32_to_cpu ((deh)->deh_dir_id))
-#define deh_objectid(deh) (le32_to_cpu ((deh)->deh_objectid))
-#define deh_location(deh) (le16_to_cpu ((deh)->deh_location))
-#define deh_state(deh) (le16_to_cpu ((deh)->deh_state))
-
-
-/* empty directory contains two entries "." and ".." and their headers */
-#define EMPTY_DIR_SIZE \
-(DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen ("..")))
-
-/* old format directories have this size when empty */
-#define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3)
-
-#define DEH_Statdata 0			/* not used now */
-#define DEH_Visible2 2
-
-#define DEH_Bad_offset 4 /* fsck marks entries to be deleted with this flag */
-#define DEH_Bad_location 5
-
-
-#define test_deh_state_le_bit(deh,bit) (get_deh_state (deh) & (1 << bit))
-
-#define set_deh_state_le_bit(deh,bit) \
-{\
-	__u16 state;\
-	state = get_deh_state (deh);\
-	state |= (1 << bit);\
-	set_deh_state(deh, state);\
-}
-
-#define clear_deh_state_le_bit(deh,bit) \
-{\
-	__u16 state;\
-	state = get_deh_state (deh);\
-	state &= ~(1 << bit);\
-	set_deh_state(deh, state);\
-}
-
-
-#define mark_de_without_sd(deh)	clear_deh_state_le_bit (deh, DEH_Statdata)
-#define mark_de_visible(deh)	set_deh_state_le_bit (deh, DEH_Visible2)
-#define mark_de_hidden(deh)	clear_deh_state_le_bit (deh, DEH_Visible)
-
-#define de_with_sd(deh)		test_deh_state_le_bit (deh, DEH_Statdata)
-#define de_visible(deh)	    	test_deh_state_le_bit (deh, DEH_Visible2)
-#define de_hidden(deh)	    	!test_deh_state_le_bit (deh, DEH_Visible2)
-
-/* Bad means "hashed unproperly or/and invalid location" */
-#define de_bad_location(deh)	test_deh_state_le_bit (deh, DEH_Bad_location)
-#define mark_de_bad_location(deh) set_deh_state_le_bit (deh, DEH_Bad_location)
-#define mark_de_good_location(deh) clear_deh_state_le_bit (deh, DEH_Bad_location)
-
-#define de_bad_offset(deh)	test_deh_state_le_bit (deh, DEH_Bad_offset)
-#define mark_de_bad_offset(deh)	set_deh_state_le_bit (deh, DEH_Bad_offset)
-
-#define de_bad(deh) (de_bad_location(deh) || de_bad_offset(deh))
-
-
-/* for directories st_blocks is number of 512 byte units which fit into dir
-   size round up to blocksize */
-#define dir_size2st_blocks(size) ((size + 511) / 512)
-
-/* array of the entry headers */
-#define B_I_DEH(bh,ih) ((struct reiserfs_de_head *)(B_I_PITEM(bh,ih)))
-
-#define REISERFS_MAX_NAME_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE - DEH_SIZE)
-	/* -SD_SIZE when entry will contain stat data */
-
-
-/* hash value occupies 24 bits starting from 7 up to 30 */
-#define GET_HASH_VALUE(offset) ((offset) & 0x7fffff80)
-/* generation number occupies 7 bits starting from 0 up to 6 */
-#define GET_GENERATION_NUMBER(offset) ((offset) & 0x0000007f)
-
-
-/*
- * Picture represents an internal node of the reiserfs tree
- *  ______________________________________________________
- * |      |  Array of     |  Array of         |  Free     |
- * |block |    keys       |  pointers         | space     |
- * | head |      N        |      N+1          |           |
- * |______|_______________|___________________|___________|
- */
-
-/***************************************************************************/
-/*                      DISK CHILD                                         */
-/***************************************************************************/
-/* Disk child pointer: The pointer from an internal node of the tree
-   to a node that is on disk. */
-struct disk_child {
-    __u32 dc2_block_number;              /* Disk child's block number. */
-    __u16 dc2_size;		            /* Disk child's used space.   */
-    __u16 dc2_reserved;
-} __attribute__ ((__packed__));
-
-#define DC_SIZE (sizeof(struct disk_child))
-
-/* set/get fields of disk_child with these defines */
-#define get_dc_child_blocknr(dc)	get_le32 (dc, dc2_block_number)
-#define set_dc_child_blocknr(dc,val)	set_le32 (dc, dc2_block_number, val)
-
-#define get_dc_child_size(dc)		get_le16 (dc, dc2_size)
-#define set_dc_child_size(dc,val)	set_le16 (dc, dc2_size, val)
-
-#define set_dc(dc, size, blocknr)	\
-({					\
-    set_dc_child_blocknr(dc, blocknr);	\
-    set_dc_child_size(dc, size);	\
-    set_le16(dc, dc2_reserved, 0);	\
-})
-
-/* Get disk child by buffer header and position in the tree node. */
-#define B_N_CHILD(p_s_bh,n_pos)  ((struct disk_child *)\
-            ((p_s_bh)->b_data + BLKH_SIZE + B_NR_ITEMS(p_s_bh) \
-            * KEY_SIZE + DC_SIZE * (n_pos)))
-
-
- /* maximal value of field child_size in structure disk_child */ 
- /* child size is the combined size of all items and their headers */
-#define MAX_CHILD_SIZE(blocksize) ((blocksize) - BLKH_SIZE)
-#define MAX_FREE_SPACE(blocksize) MAX_CHILD_SIZE(blocksize)
-
-/* amount of used space in buffer (not including block head) */
-#define B_CHILD_SIZE(cur) (MAX_CHILD_SIZE(cur->b_size)-(B_FREE_SPACE(cur)))
-
-/* max and min number of keys in internal node */
-#define MAX_NR_KEY(bh) ( (MAX_CHILD_SIZE(bh->b_size)-DC_SIZE)/(KEY_SIZE+DC_SIZE) )
-#define MIN_NR_KEY(bh)    (MAX_NR_KEY(bh)/2)
-
-
-/***************************************************************************/
-/*                      PATH STRUCTURES AND DEFINES                        */
-/***************************************************************************/
-
-/* Search_by_key fills up the path from the root to the leaf as it
-   descends the tree looking for the key.  It uses reiserfs_bread to
-   try to find buffers in the cache given their block number.  If it
-   does not find them in the cache it reads them from disk.  For each
-   node search_by_key finds using reiserfs_bread it then uses
-   bin_search to look through that node.  bin_search will find the
-   position of the block_number of the next node if it is looking
-   through an internal node.  If it is looking through a leaf node
-   bin_search will find the position of the item which has key either
-   equal to given key, or which is the maximal key less than the given
-   key. */
-
-struct path_element  {
-    struct buffer_head * pe_buffer; /* Pointer to the buffer at the path in
-				       the tree. */
-    int pe_position;  /* Position in the tree node which is placed in the
-			 buffer above. */
-};
-
-
-#define MAX_HEIGHT 6
-#define FIRST_PATH_ELEMENT_OFFSET   2
-#define EXTENDED_MAX_HEIGHT         (MAX_HEIGHT + FIRST_PATH_ELEMENT_OFFSET)
-
-#define ILLEGAL_PATH_ELEMENT_OFFSET 1
-#define MAX_FEB_SIZE (MAX_HEIGHT + 1)
-
-
-
-/* We need to keep track of who the ancestors of nodes are.  When we
-   perform a search we record which nodes were visited while
-   descending the tree looking for the node we searched for. This list
-   of nodes is called the path.  This information is used while
-   performing balancing.  Note that this path information may become
-   invalid, and this means we must check it when using it to see if it
-   is still valid. You'll need to read search_by_key and the comments
-   in it, especially about decrement_counters_in_path(), to understand
-   this structure. */
-struct path {
-  unsigned int          path_length;                      	/* Length of the array above.   */
-  struct  path_element  path_elements[EXTENDED_MAX_HEIGHT];	/* Array of the path elements.  */
-  unsigned int		pos_in_item;
-};
-
-#define INITIALIZE_PATH(var) \
-struct path var = {ILLEGAL_PATH_ELEMENT_OFFSET, }
-
-/* Get path element by path and path position. */
-#define PATH_OFFSET_PELEMENT(p_s_path,n_offset)  ((p_s_path)->path_elements +(n_offset))
-
-/* Get buffer header at the path by path and path position. */
-#define PATH_OFFSET_PBUFFER(p_s_path,n_offset)   (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_buffer)
-
-/* Get position in the element at the path by path and path position. */
-#define PATH_OFFSET_POSITION(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_position)
-
-
-#define PATH_PLAST_BUFFER(p_s_path) (PATH_OFFSET_PBUFFER((p_s_path), (p_s_path)->path_length))
-#define PATH_LAST_POSITION(p_s_path) (PATH_OFFSET_POSITION((p_s_path), (p_s_path)->path_length))
-
-
-#define PATH_PITEM_HEAD(p_s_path)    B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_path),PATH_LAST_POSITION(p_s_path))
-
-/* in do_balance leaf has h == 0 in contrast with path structure,
-   where root has level == 0. That is why we need these defines */
-#define PATH_H_PBUFFER(p_s_path, h) PATH_OFFSET_PBUFFER (p_s_path, p_s_path->path_length - (h))	/* tb->S[h] */
-#define PATH_H_PPARENT(path, h) PATH_H_PBUFFER (path, (h) + 1)			/* tb->F[h] or tb->S[0]->b_parent */
-#define PATH_H_POSITION(path, h) PATH_OFFSET_POSITION (path, path->path_length - (h))	
-#define PATH_H_B_ITEM_ORDER(path, h) PATH_H_POSITION(path, h + 1)		/* tb->S[h]->b_item_order */
-
-#define PATH_H_PATH_OFFSET(p_s_path, n_h) ((p_s_path)->path_length - (n_h))
-
-#define get_bh(path) PATH_PLAST_BUFFER(path)
-#define get_ih(path) PATH_PITEM_HEAD(path)
-#define get_item_pos(path) PATH_LAST_POSITION(path)
-#define get_item(path) ((void *)B_N_PITEM(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION (path)))
-#define item_moved(ih,path) comp_items(ih, path)
-#define path_changed(ih,path) comp_items (ih, path)
-
-
-/***************************************************************************/
-/*                       MISC                                              */
-/***************************************************************************/
-
-/* n must be power of 2 */
-#define _ROUND_UP(x,n) (((x)+(n)-1u) & ~((n)-1u))
-
-// to be ok for alpha and others we have to align structures to 8 byte
-// boundary.
-// FIXME: do not change 4 by anything else: there is code which relies on that
-#define ROUND_UP(x) _ROUND_UP(x,8LL)
-
-
-// search_by_key (and clones) and fix_nodes error code
-#define CARRY_ON		    0
-
-#define NO_DISK_SPACE		    3
-/* #define IO_ERROR		    0x4 - defined above as 0x4 */
-#define NO_BALANCING_NEEDED	    5
-#define ITEM_FOUND		    6
-#define ITEM_NOT_FOUND		    7
-#define GOTO_PREVIOUS_ITEM	    10
-#define POSITION_FOUND_INVISIBLE    11
-#define FILE_NOT_FOUND		    12
-
-// used by fsck
-#define DIRECTORY_NOT_FOUND	    13 
-#define REGULAR_FILE_FOUND	    14
-#define DIRECTORY_FOUND		    15
-
-
-struct unfm_nodeinfo {
-    __u32	 unfm_nodenum;
-    __u16 unfm_freespace;
-};
-
-
-/* Size of pointer to the unformatted node. */
-#define UNFM_P_SIZE (sizeof(__u32))
-
-
-#define MAX_KEY1_OFFSET	 0xffffffff
-#define MAX_KEY2_OFFSET  0xfffffffffffffffLL
-
-/* this is aggressive tail suppression policy taken from the kernel */
-/* It should be MAX_DIRECT_ITEM_LEN used here, but sometimes it is not enough,
- * and items got deleted. */
-#define STORE_TAIL_IN_UNFM(n_file_size,n_tail_size,n_block_size) \
-(\
-  (!(n_tail_size)) || \
-  (((n_tail_size) > MAX_ITEM_LEN(n_block_size)) || \
-   ( (n_file_size) >= (n_block_size) * 4 ) || \
-   ( ( (n_file_size) >= (n_block_size) * 3 ) && \
-     ( (n_tail_size) >=   (MAX_ITEM_LEN(n_block_size))/4) ) || \
-   ( ( (n_file_size) >= (n_block_size) * 2 ) && \
-     ( (n_tail_size) >=   (MAX_ITEM_LEN(n_block_size))/2) ) || \
-   ( ( (n_file_size) >= (n_block_size) ) && \
-     ( (n_tail_size) >=   (MAX_ITEM_LEN(n_block_size) * 3)/4) ) ) \
-)
-
-
-/***************************************************************************/
-/*                  FIXATE NODES                                           */
-/***************************************************************************/
-
-#define VI_TYPE_STAT_DATA 1
-#define VI_TYPE_DIRECT 2
-#define VI_TYPE_INDIRECT 4
-#define VI_TYPE_DIRECTORY 8
-#define VI_TYPE_FIRST_DIRECTORY_ITEM 16
-#define VI_TYPE_INSERTED_DIRECTORY_ITEM 32
-
-#define VI_TYPE_LEFT_MERGEABLE 64
-#define VI_TYPE_RIGHT_MERGEABLE 128
-
-/* To make any changes in the tree we always first find node, that contains
-   item to be changed/deleted or place to insert a new item. We call this node
-   S. To do balancing we need to decide what we will shift to left/right
-   neighbor, or to a new node, where new item will be etc. To make this
-   analysis simpler we build virtual node. Virtual node is an array of items,
-   that will replace items of node S. (For instance if we are going to delete
-   an item, virtual node does not contain it). Virtual node keeps information
-   about item sizes and types, mergeability of first and last items, sizes of
-   all entries in directory item. We use this array of items when calculating
-   what we can shift to neighbors and how many nodes we have to have if we do
-   not any shiftings, if we shift to left/right neighbor or to both. */
-struct virtual_item
-{
-    unsigned short vi_type;	/* item type, mergeability */
-    unsigned short vi_item_len; /* length of item that it will have after balancing */
-    __u64 vi_item_offset; /* offset of item that it have before balancing */
-
-    short vi_entry_count;	/* number of entries in directory item
-				   (including the new one if any, or excluding
-				   entry if it must be cut) */
-    unsigned short * vi_entry_sizes; /* array of entry lengths for directory item */
-};
-
-struct virtual_node
-{
-    char * vn_free_ptr;	 /* this is a pointer to the free space in the buffer */
-    unsigned short vn_nr_item;	/* number of items in virtual node */
-    short vn_size; /* size of node , that node would have if it has unlimited
-		      size and no balancing is performed */
-    short vn_mode;		/* mode of balancing (paste, insert, delete, cut) */
-    short vn_affected_item_num; 
-    short vn_pos_in_item;
-    struct item_head * vn_ins_ih;	/* item header of inserted item, 0 for other modes */
-    struct virtual_item * vn_vi;	/* array of items (including a new one, excluding item to be deleted) */
-};
-
-
-/***************************************************************************/
-/*                  TREE BALANCE                                           */
-/***************************************************************************/
-
-/* This temporary structure is used in tree balance algorithms, and
-   constructed as we go to the extent that its various parts are needed.  It
-   contains arrays of nodes that can potentially be involved in the balancing
-   of node S, and parameters that define how each of the nodes must be
-   balanced.  Note that in these algorithms for balancing the worst case is to
-   need to balance the current node S and the left and right neighbors and all
-   of their parents plus create a new node.  We implement S1 balancing for the
-   leaf nodes and S0 balancing for the internal nodes (S1 and S0 are defined
-   in our papers.)*/
-
-#define MAX_FREE_BLOCK 7	/* size of the array of buffers to free at end of do_balance */
-
-/* maximum number of FEB blocknrs on a single level */
-#define MAX_AMOUNT_NEEDED 2
-
-/* someday somebody will prefix every field in this struct with tb_ */
-struct tree_balance
-{
-    struct reiserfs_transaction_handle *transaction_handle ;
-    reiserfs_filsys_t * tb_fs;
-    struct path * tb_path;
-    struct buffer_head * L[MAX_HEIGHT];        /* array of left neighbors of nodes in the path */
-    struct buffer_head * R[MAX_HEIGHT];        /* array of right neighbors of nodes in the path*/
-    struct buffer_head * FL[MAX_HEIGHT];       /* array of fathers of the left  neighbors      */
-    struct buffer_head * FR[MAX_HEIGHT];       /* array of fathers of the right neighbors      */
-    struct buffer_head * CFL[MAX_HEIGHT];      /* array of common parents of center node and its left neighbor  */
-    struct buffer_head * CFR[MAX_HEIGHT];      /* array of common parents of center node and its right neighbor */
-    
-    /* array of blocknr's that are free and are the nearest to the left node that are usable
-       for writing dirty formatted leaves, using the write_next_to algorithm. */
-    /*unsigned long free_and_near[MAX_DIRTIABLE];*/
-    
-    struct buffer_head * FEB[MAX_FEB_SIZE]; /* array of empty buffers. Number of buffers in array equals
-					       cur_blknum. */
-    struct buffer_head * used[MAX_FEB_SIZE];
-    short int lnum[MAX_HEIGHT];	/* array of number of items which must be shifted to the left in
-				   order to balance the current node; for leaves includes item
-				   that will be partially shifted; for internal nodes, it is
-				   the number of child pointers rather than items. It includes
-				   the new item being created.  For preserve_shifted() purposes
-				   the code sometimes subtracts one from this number to get the
-				   number of currently existing items being shifted, and even
-				   more often for leaves it subtracts one to get the number of
-				   wholly shifted items for other purposes. */
-    short int rnum[MAX_HEIGHT];	/* substitute right for left in comment above */
-    short int lkey[MAX_HEIGHT];               /* array indexed by height h mapping the key delimiting L[h] and
-					       S[h] to its item number within the node CFL[h] */
-    short int rkey[MAX_HEIGHT];               /* substitute r for l in comment above */
-    short int insert_size[MAX_HEIGHT];        /* the number of bytes by we are trying to add or remove from
-						 S[h]. A negative value means removing.  */
-    short int blknum[MAX_HEIGHT];             /* number of nodes that will replace node S[h] after
-						 balancing on the level h of the tree.  If 0 then S is
-						 being deleted, if 1 then S is remaining and no new nodes
-						 are being created, if 2 or 3 then 1 or 2 new nodes is
-						 being created */
-    
-    /* fields that are used only for balancing leaves of the tree */
-    short int cur_blknum;	/* number of empty blocks having been already allocated			*/
-    short int s0num;             /* number of items that fall into left most  node when S[0] splits	*/
-    short int s1num;             /* number of items that fall into first  new node when S[0] splits	*/
-    short int s2num;             /* number of items that fall into second new node when S[0] splits	*/
-    short int lbytes;            /* number of bytes which can flow to the left neighbor from the	left	*/
-    /* most liquid item that cannot be shifted from S[0] entirely		*/
-    /* if -1 then nothing will be partially shifted */
-    short int rbytes;            /* number of bytes which will flow to the right neighbor from the right	*/
-    /* most liquid item that cannot be shifted from S[0] entirely		*/
-    /* if -1 then nothing will be partially shifted                           */
-    short int s1bytes;		/* number of bytes which flow to the first  new node when S[0] splits	*/
-            			/* note: if S[0] splits into 3 nodes, then items do not need to be cut	*/
-    short int s2bytes;
-    struct buffer_head * buf_to_free[MAX_FREE_BLOCK]; /* buffers which are to be freed after do_balance finishes by unfix_nodes */
-    char * vn_buf;		/* kmalloced memory. Used to create
-				   virtual node and keep map of
-				   dirtied bitmap blocks */
-    int vn_buf_size;		/* size of the vn_buf */
-    struct virtual_node * tb_vn;	/* VN starts after bitmap of bitmap blocks */
-} ;
-
-
-
-/* These are modes of balancing */
-
-/* When inserting an item. */
-#define M_INSERT	'i'
-/* When inserting into (directories only) or appending onto an already
-   existant item. */
-#define M_PASTE		'p'
-/* When deleting an item. */
-#define M_DELETE	'd'
-/* When truncating an item or removing an entry from a (directory) item. */
-#define M_CUT 		'c'
-
-/* used when balancing on leaf level skipped (in reiserfsck) */
-#define M_INTERNAL	'n'
-
-/* When further balancing is not needed, then do_balance does not need
-   to be called. */
-#define M_SKIP_BALANCING 		's'
-#define M_CONVERT	'v'
-
-/* modes of leaf_move_items */
-#define LEAF_FROM_S_TO_L 0
-#define LEAF_FROM_S_TO_R 1
-#define LEAF_FROM_R_TO_L 2
-#define LEAF_FROM_L_TO_R 3
-#define LEAF_FROM_S_TO_SNEW 4
-
-#define FIRST_TO_LAST 0
-#define LAST_TO_FIRST 1
-
-/* used in do_balance for passing parent of node information that has been
-   gotten from tb struct */
-struct buffer_info {
-    struct buffer_head * bi_bh;
-    struct buffer_head * bi_parent;
-    int bi_position;
-};
-
-
-/* there are 4 types of items: stat data, directory item, indirect, direct.
-   FIXME: This table does not describe new key format
-+-------------------+------------+--------------+------------+
-|	            |  k_offset  | k_uniqueness | mergeable? |
-+-------------------+------------+--------------+------------+
-|     stat data     |	0        |      0       |   no       |
-+-------------------+------------+--------------+------------+
-| 1st directory item| DOT_OFFSET |DIRENTRY_UNIQUENESS|   no       | 
-| non 1st directory | hash value |              |   yes      |
-|     item          |            |              |            |
-+-------------------+------------+--------------+------------+
-| indirect item     | offset + 1 |TYPE_INDIRECT |   if this is not the first indirect item of the object
-+-------------------+------------+--------------+------------+
-| direct item       | offset + 1 |TYPE_DIRECT   | if not this is not the first direct item of the object
-+-------------------+------------+--------------+------------+
-*/
-
-
-
-#define KEY_IS_STAT_DATA_KEY(p_s_key) 	( get_type (p_s_key) == TYPE_STAT_DATA )
-#define KEY_IS_DIRECTORY_KEY(p_s_key)	( get_type (p_s_key) == TYPE_DIRENTRY )
-#define KEY_IS_DIRECT_KEY(p_s_key) 	( get_type (p_s_key) == TYPE_DIRECT )
-#define KEY_IS_INDIRECT_KEY(p_s_key)	( get_type (p_s_key) == TYPE_INDIRECT )
-
-#define I_IS_STAT_DATA_ITEM(p_s_ih) 	KEY_IS_STAT_DATA_KEY(&((p_s_ih)->ih_key))
-#define I_IS_DIRECTORY_ITEM(p_s_ih) 	KEY_IS_DIRECTORY_KEY(&((p_s_ih)->ih_key))
-#define I_IS_DIRECT_ITEM(p_s_ih) 	KEY_IS_DIRECT_KEY(&((p_s_ih)->ih_key))
-#define I_IS_INDIRECT_ITEM(p_s_ih) 	KEY_IS_INDIRECT_KEY(&((p_s_ih)->ih_key))
-
-#define is_indirect_ih(ih) I_IS_INDIRECT_ITEM(ih)
-#define is_direct_ih(ih) I_IS_DIRECT_ITEM(ih)
-#define is_direntry_ih(ih) I_IS_DIRECTORY_ITEM(ih)
-#define is_stat_data_ih(ih) I_IS_STAT_DATA_ITEM(ih)
-
-#define is_indirect_key(key) KEY_IS_INDIRECT_KEY(key)
-#define is_direct_key(key) KEY_IS_DIRECT_KEY(key)
-#define is_direntry_key(key) KEY_IS_DIRECTORY_KEY(key)
-#define is_stat_data_key(key) KEY_IS_STAT_DATA_KEY(key)
-
-#define COMP_KEYS comp_keys
-
-//#define COMP_SHORT_KEYS comp_short_keys
-#define not_of_one_file comp_short_keys
-
-/* number of blocks pointed to by the indirect item */
-#define I_UNFM_NUM(p_s_ih)	( get_ih_item_len(p_s_ih) / UNFM_P_SIZE )
-
-/* the used space within the unformatted node corresponding to pos within the item pointed to by ih */
-#define I_POS_UNFM_SIZE(ih,pos,size) (((pos) == I_UNFM_NUM(ih) - 1 ) ? (size) - ih_free_space (ih) : (size))
-
-/* check whether byte number 'offset' is in this item */
-#define I_OFF_BYTE_IN_ITEM(p_s_ih, n_offset, n_blocksize) \
-                  ( get_offset(&(p_s_ih)->ih_key) <= (n_offset) && \
-                    get_offset(&(p_s_ih)->ih_key) + get_bytes_number(p_s_ih,n_blocksize) > (n_offset) )
-
-/* these operate on indirect items, where you've got an array of ints
-** at a possibly unaligned location.  These are a noop on ia32
-**
-** p is the array of __u32, i is the index into the array, v is the value
-** to store there.
-*/
-#define d32_get(p, i) le32_to_cpu(get_unaligned((p) + (i)))
-#define d32_put(p, i, v) put_unaligned(cpu_to_le32(v), (p) + (i))
-
-
-/* get the item header */ 
-#define B_N_PITEM_HEAD(bh,item_num) ( (struct item_head * )((bh)->b_data + BLKH_SIZE) + (item_num) )
-
-/* get key */
-#define B_N_PDELIM_KEY(bh,item_num) ( (struct key * )((bh)->b_data + BLKH_SIZE) + (item_num) )
-
-/* get the key */
-#define B_N_PKEY(bh,item_num) ( &(B_N_PITEM_HEAD(bh,item_num)->ih_key) )
-
-/* get item body */
-#define B_N_PITEM(bh,item_num) ( (bh)->b_data + get_ih_location (B_N_PITEM_HEAD((bh),(item_num))))
-
-/* get the stat data by the buffer header and the item order */
-#define B_N_STAT_DATA(bh,nr) \
-( (struct stat_data *)((bh)->b_data+get_ih_location(B_N_PITEM_HEAD((bh),(nr))) ) )
-
- /* following defines use reiserfs buffer header and item header */
- /* get item body */
-#define B_I_PITEM(bh,ih) ( (bh)->b_data + get_ih_location(ih))
-
-/* get stat-data */
-#define B_I_STAT_DATA(bh, ih) ( (struct stat_data * )B_I_PITEM(bh,ih) )
-
-#define MAX_DIRECT_ITEM_LEN(size) ((size) - BLKH_SIZE - 2*IH_SIZE - SD_SIZE - UNFM_P_SIZE)
-#define MAX_INDIRECT_ITEM_LEN(size) MAX_ITEM_LEN(size)
-
-/***************************************************************************/
-/*                    FUNCTION DECLARATIONS                                */
-/***************************************************************************/
-
-
-
-/* stree.c */
-void padd_item (char * item, int total_length, int length);
-int B_IS_IN_TREE(struct buffer_head *);
-struct key * get_rkey (struct path * p_s_chk_path, reiserfs_filsys_t *);
-int bin_search (void * p_v_key, void * p_v_base, int p_n_num, int p_n_width, int * p_n_pos);
-int search_by_key (reiserfs_filsys_t *, struct key *, struct path *, int);
-int search_by_entry_key (reiserfs_filsys_t *, struct key *, struct path *);
-int search_for_position_by_key (reiserfs_filsys_t *, struct key *, struct path *);
-int search_by_objectid (reiserfs_filsys_t *, struct key *, struct path *, int *);
-void decrement_counters_in_path (struct path * p_s_search_path);
-void pathrelse (struct path * p_s_search_path);
-
-
-int is_left_mergeable (reiserfs_filsys_t * s, struct path * path);
-int is_right_mergeable (reiserfs_filsys_t * s, struct path * path);
-int are_items_mergeable (struct item_head * left, struct item_head * right, int bsize);
-
-
-/* fix_nodes.c */
-void * reiserfs_kmalloc (size_t size, int flags, reiserfs_filsys_t * s);
-void reiserfs_kfree (/*const*/ void * vp, size_t size, reiserfs_filsys_t * s);
-int fix_nodes (/*struct reiserfs_transaction_handle *th,*/ int n_op_mode, struct tree_balance * p_s_tb, 
-               /*int n_pos_in_item,*/ struct item_head * p_s_ins_ih);
-void unfix_nodes (/*struct reiserfs_transaction_handle *th,*/ struct tree_balance *);
-void free_buffers_in_tb (struct tree_balance * p_s_tb);
-void init_path (struct path *);
-
-/* prints.c */
-/* options */
-#define PRINT_TREE_DETAILS 	0x1	/* print all items from internal tree */
-#define PRINT_DETAILS 		0x2       /* print all items from bitmap */
-#define PRINT_ITEM_DETAILS 	0x4 	/* print contents of directory items and stat
-                                	   data items and indirect items */
-#define PRINT_DIRECT_ITEMS 	0x8 	/* print contents of direct items */
-
-void print_tb (int mode, int item_pos, int pos_in_item, struct tree_balance * tb, char * mes);
-
-
-void print_bmap (FILE * fp, reiserfs_filsys_t * fs, int silent);
-void print_objectid_map (FILE * fp, reiserfs_filsys_t * fs);
-
-
-
-/* lbalance.c */
-int leaf_move_items (int shift_mode, struct tree_balance * tb, 
-                     int mov_num, int mov_bytes, struct buffer_head * Snew);
-int leaf_shift_left (struct tree_balance * tb, int shift_num, int shift_bytes);
-int leaf_shift_right (struct tree_balance * tb, int shift_num, int shift_bytes);
-void leaf_delete_items (reiserfs_filsys_t *, struct buffer_info * cur_bi, 
-                        int last_first, int first, int del_num, int del_bytes);
-void leaf_insert_into_buf (reiserfs_filsys_t *, struct buffer_info * bi, 
-			   int before, struct item_head * inserted_item_ih, const char * inserted_item_body, 
-			   int zeros_number);
-void leaf_paste_in_buffer (reiserfs_filsys_t *, struct buffer_info * bi, int pasted_item_num, 
-			   int pos_in_item, int paste_size, const char * body, int zeros_number);
-void leaf_cut_from_buffer (reiserfs_filsys_t *, struct buffer_info * bi, int cut_item_num, 
-                           int pos_in_item, int cut_size);
-void leaf_paste_entries (struct buffer_head * bh, int item_num, int before, int new_entry_count,
-			 struct reiserfs_de_head * new_dehs, const char * records,
-			 int paste_size);
-void delete_item (reiserfs_filsys_t *, struct buffer_head * bh, int item_num);
-void cut_entry (reiserfs_filsys_t *, struct buffer_head * bh,
-		int item_num, int entry_num, int del_count);
-
-
-/* ibalance.c */
-int balance_internal (struct tree_balance * , int, int, struct item_head * , 
-                      struct buffer_head **);
-
-/* do_balance.c */
-void do_balance (struct tree_balance * tb,
-                 struct item_head * ih, const char * body, int flag, int zeros_num);
-void reiserfs_invalidate_buffer (struct tree_balance * tb, struct buffer_head * bh, int);
-int get_left_neighbor_position (struct tree_balance * tb, int h);
-int get_right_neighbor_position (struct tree_balance * tb, int h);
-void replace_key (reiserfs_filsys_t *, struct buffer_head *, int, struct buffer_head *, int);
-void replace_lkey (struct tree_balance *, int, struct item_head *);
-void replace_rkey (struct tree_balance *, int, struct item_head *);
-void make_empty_node (struct buffer_info *);
-void make_empty_leaf (struct buffer_head *);
-struct buffer_head * get_FEB (struct tree_balance *);
-
-
-__u32 get_bytes_number (struct item_head * ih, int blocksize);
-
-
-
-
-/* hashes.c */
-__u32 keyed_hash (const char *msg, int len);
-__u32 yura_hash (const char *msg, int len);
-__u32 r5_hash (const char *msg, int len);
-
-
-
-/* node_format.c */
-extern unsigned int get_journal_old_start_must (reiserfs_filsys_t * fs);
-extern unsigned int get_journal_new_start_must (reiserfs_filsys_t * fs);
-extern unsigned int get_journal_start_must (reiserfs_filsys_t * fs);
-/*extern hashf_t hashes [];*/
-
-#endif
-
-/*
- * Local variables:
- * c-indentation-style: "bsd"
- * c-basic-offset: 4
- * tab-width: 8
- * fill-column: 78
- * End:
- */
diff --git a/include/reiserfs_lib.h b/include/reiserfs_lib.h
deleted file mode 100644
index 2ad8034..0000000
--- a/include/reiserfs_lib.h
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
- *  reiserfsprogs/README
- */
-
-#ifndef REISERFSPROGS_LIB_H
-#define REISERFSPROGS_LIB_H
-
-#define BADBLOCK_DIRID	1
-#define BADBLOCK_OBJID  (__u32)-1
-
-typedef struct reiserfs_filsys reiserfs_filsys_t;
-
-#include "reiserfs_fs.h"
-
-struct _bitmap {
-    unsigned long bm_byte_size;
-    unsigned long bm_bit_size;
-    char * bm_map;
-    unsigned long bm_set_bits;
-    int bm_dirty;  /* used for fetched bitmap */
-};
-
-typedef struct _bitmap reiserfs_bitmap_t;
-
-typedef __u32 (*hashf_t) (const char *, int);
-
-struct reiserfs_filsys {
-    unsigned int fs_blocksize;
-    int fs_format;	      /* on-disk format version */
-    hashf_t fs_hash_function; /* pointer to function which is used to sort
-				 names in directory. It is set by
-				 reiserfs_open if it is set in the super
-				 block, otherwise it is set by first
-				 is_properly_hashed */
-    
-    char * fs_file_name;       /* file name of underlying device */
-    int fs_dev; /* descriptor of opened block device file */
-    struct buffer_head * fs_super_bh;  /* buffer containing super block */
-    struct reiserfs_super_block * fs_ondisk_sb; /* pointer to its b_data */
-
-
-    reiserfs_bitmap_t * fs_bitmap2; /* ondisk bitmap after
-				       reiserfs_open_ondisk_bitmap */
-
-
-    /* opened journal fields */
-    char * fs_j_file_name;  /* file name of relocated journal device */
-    int fs_journal_dev;		/* descriptor of opened journal device */
-    struct buffer_head * fs_jh_bh;	/* buffer containing journal header */
-
-    /* badblocks */
-    reiserfs_bitmap_t * fs_badblocks_bm;
-
-    int fs_dirt;
-    int fs_flags;
-    void * fs_vp;
-    int (*block_allocator) (reiserfs_filsys_t * fs, 
-			    unsigned long * free_blocknrs,
-			    unsigned long start, int amount_needed);
-    int (*block_deallocator) (reiserfs_filsys_t * fs, unsigned long block);
-};
-
-
-struct _transaction {
-    unsigned long mount_id;
-    unsigned long trans_id;
-    unsigned long desc_blocknr;
-    unsigned long trans_len;
-    unsigned long commit_blocknr;
-    unsigned long next_trans_offset;
-};
-
-typedef struct _transaction reiserfs_trans_t;
-
-
-/* reiserfslib.c */
-
-void init_tb_struct (struct tree_balance * tb, reiserfs_filsys_t *, struct path * path, int size);
-
-reiserfs_filsys_t * reiserfs_open (char * filename, int flags, int * error, void * vp, int skip_check);
-reiserfs_filsys_t * reiserfs_create (char * filename, int version, unsigned long block_count,
-				     int block_size, int default_journal, int new_format);
-void reiserfs_flush (reiserfs_filsys_t *);
-void reiserfs_free (reiserfs_filsys_t *);
-void reiserfs_close (reiserfs_filsys_t *);
-void reiserfs_reopen (reiserfs_filsys_t *, int flags);
-int is_opened_rw (reiserfs_filsys_t * fs);
-
-/*
-void reiserfs_read_bitmap_blocks (reiserfs_filsys_t *);
-void reiserfs_free_bitmap_blocks (reiserfs_filsys_t *);
-*/
-int no_reiserfs_found (reiserfs_filsys_t *);
-int is_block_count_correct (unsigned long block_of_super_block, unsigned int block_size,
-	unsigned long block_count, unsigned long journal_size);
-//unsigned long min_block_amount (int block_size, unsigned long journal_size);
-unsigned long get_size_of_journal_or_reserved_area (struct reiserfs_super_block * sb);
-
-int reiserfs_new_blocknrs (reiserfs_filsys_t *, 
-			   unsigned long * free_blocknrs, unsigned long start,
-			   int amount_needed);
-int reiserfs_free_block (reiserfs_filsys_t *, unsigned long block);
-int spread_bitmaps (reiserfs_filsys_t *);
-int filesystem_dirty (reiserfs_filsys_t *);
-void mark_filesystem_dirty (reiserfs_filsys_t *);
-
-void reiserfs_paste_into_item (reiserfs_filsys_t *, struct path * path,
-			       const void * body, int size);
-void reiserfs_insert_item (reiserfs_filsys_t *, struct path * path,
-			   struct item_head * ih, const void * body);
-
-int reiserfs_locate_entry (reiserfs_filsys_t *, struct key * dir, char * name,
-			   struct path * path);
-int reiserfs_find_entry (reiserfs_filsys_t *, struct key * dir, char * name,
-			 unsigned int * min_gen_counter, struct key * key);
-int reiserfs_add_entry (reiserfs_filsys_t *, struct key * dir, char * name, int name_len,
-			struct key * key, __u16 fsck_need);
-
-struct key * uget_lkey (struct path * path);
-struct key * uget_rkey (struct path * path);
-int reiserfs_search_by_key_3 (reiserfs_filsys_t *, struct key * key,
-			    struct path * path);
-int reiserfs_search_by_key_4 (reiserfs_filsys_t *, struct key * key, 
-			    struct path * path);
-int reiserfs_search_by_entry_key (reiserfs_filsys_t *, struct key * key, 
-				  struct path * path);
-int usearch_by_position (reiserfs_filsys_t *, struct key * key, int version, struct path * path);
-struct key * reiserfs_next_key (struct path * path);
-void copy_key (void * to, void * from);
-void copy_short_key (void * to, void * from);
-void copy_item_head(void * p_v_to, void * p_v_from);
-int comp_keys (const void * k1, const void * k2);
-int comp_keys_3 (const void * k1, const void * k2);
-int  comp_short_keys (const void * p_s_key1, const void * p_s_key2);
-int comp_items (struct item_head  * p_s_ih, struct path * p_s_path);
-
-__u32 hash_value (hashf_t func, char * name, int namelen);
-
-int create_dir_sd (reiserfs_filsys_t * fs,
-		    struct path * path, struct key * key,
-		    void (*modify_item)(struct item_head *, void *));
-void make_sure_root_dir_exists (reiserfs_filsys_t * fs,
-				void (*modyfy_item)(struct item_head *, void *),
-				int ih_flags);
-
-typedef void (*badblock_func_t) (reiserfs_filsys_t *fs, 
-				 struct path *badblock_path, 
-				 void *data);
-
-void mark_badblock(reiserfs_filsys_t *fs, struct path *badblock_path, void *data);
-int create_badblock_bitmap (reiserfs_filsys_t * fs, char * badblocks_file);
-void add_badblock_list (reiserfs_filsys_t * fs, int no_badblock_in_tree_yet);
-void badblock_list(reiserfs_filsys_t * fs, badblock_func_t action, void *data);
-
-extern struct key root_dir_key;
-extern struct key parent_root_dir_key;
-extern struct key lost_found_dir_key;
-extern __u16 root_dir_format;
-extern __u16 lost_found_dir_format;
-
-
-/* bitmap.c */
-int reiserfs_open_ondisk_bitmap (reiserfs_filsys_t *);
-int reiserfs_create_ondisk_bitmap (reiserfs_filsys_t *);
-void reiserfs_free_ondisk_bitmap (reiserfs_filsys_t *);
-void reiserfs_close_ondisk_bitmap (reiserfs_filsys_t *);
-int reiserfs_flush_to_ondisk_bitmap (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs);
-
-reiserfs_bitmap_t * reiserfs_create_bitmap (unsigned int bit_count);
-int reiserfs_expand_bitmap (reiserfs_bitmap_t * bm, unsigned int bit_count);
-void reiserfs_shrink_bitmap (reiserfs_bitmap_t * bm, unsigned int bit_count);
-void reiserfs_delete_bitmap (reiserfs_bitmap_t * bm);
-void reiserfs_bitmap_copy (reiserfs_bitmap_t * to, reiserfs_bitmap_t * from);
-int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1, reiserfs_bitmap_t * bm2);
-void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * disk, reiserfs_bitmap_t * cont);
-void reiserfs_bitmap_delta (reiserfs_bitmap_t * base, reiserfs_bitmap_t * exclude);
-void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm, unsigned int bit_number);
-void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm, unsigned int bit_number);
-
-int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm, unsigned int bit_number);
-int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm, unsigned long * start);
-/*int reiserfs_fetch_ondisk_bitmap (reiserfs_bitmap_t * bm, reiserfs_filsys_t *);*/
-/*int reiserfs_flush_bitmap (reiserfs_bitmap_t * bm, reiserfs_filsys_t *);*/
-void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm);
-void reiserfs_bitmap_fill (reiserfs_bitmap_t * bm);
-unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm);
-unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm);
-
-FILE * open_file(char * filename, char * option);
-void close_file(FILE * fp);
-void reiserfs_bitmap_save (FILE * fp, reiserfs_bitmap_t * bm);
-
-/* this probably should be in fsck */
-void reiserfs_begin_stage_info_save(FILE * file, unsigned long stage);
-void reiserfs_end_stage_info_save(FILE * file);
-int is_stage_magic_correct (FILE * fp);
-//void reiserfs_stage_info_save(struct fsck_data *, FILE * file);
-
-reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp);
-void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm);
-
-
-int reiserfs_remove_entry (reiserfs_filsys_t *, struct key * key);
-
-
-
-/* node_formats.c */
-
-#define THE_LEAF 1
-#define THE_INTERNAL 2
-#define THE_SUPER 3
-#define THE_JDESC 4
-#define HAS_IH_ARRAY 5
-#define THE_UNKNOWN 6
-
-int is_blocksize_correct (unsigned int blocksize);
-int is_reiserfs_3_5_magic_string (struct reiserfs_super_block * rs);
-int is_reiserfs_3_6_magic_string (struct reiserfs_super_block * rs);
-int is_reiserfs_jr_magic_string (struct reiserfs_super_block * rs);
-int does_look_like_super_block (struct reiserfs_super_block * rs);
-int is_any_reiserfs_magic_string (struct reiserfs_super_block * rs);
-int get_reiserfs_format (struct reiserfs_super_block * sb);
-int reiserfs_super_block_size (struct reiserfs_super_block * rs);
-/*int magic_2_version (struct reiserfs_super_block * rs);*/
-int is_prejournaled_reiserfs (struct reiserfs_super_block * rs);
-int who_is_this (char * buf, int blocksize);
-
-int leaf_count_ih(char * buf, int blocksize);
-int leaf_free_space_estimate(char * buf, int blocksize);
-int is_a_leaf(char * buf, int blocksize);
-int leaf_item_number_estimate(struct buffer_head * bh);
-
-char * which_block (int code);
-int get_journal_size (reiserfs_filsys_t *);
-int not_data_block (reiserfs_filsys_t *, unsigned long block);
-int not_journalable (reiserfs_filsys_t *, unsigned long block);
-int block_of_bitmap (reiserfs_filsys_t *, unsigned long block);
-int block_of_journal (reiserfs_filsys_t *, unsigned long block);
-int is_tree_node (struct buffer_head * bh, int level);
-int is_properly_hashed (reiserfs_filsys_t *,
-			char * name, int namelen, __u32 offset);
-int dir_entry_bad_location (struct reiserfs_de_head * deh, 
-			    struct item_head * ih, int first);
-void make_dir_stat_data (int blocksize, int key_format, 
-			 __u32 dirid, __u32 objectid, 
-			 struct item_head * ih, void * sd);
-void make_empty_dir_item_v1 (char * body, __u32 dirid, __u32 objid,
-			     __u32 par_dirid, __u32 par_objid);
-void make_empty_dir_item (char * body, __u32 dirid, __u32 objid,
-			  __u32 par_dirid, __u32 par_objid);
-int reiserfs_is_fs_consistent (reiserfs_filsys_t * fs);
-
-
-typedef void (*item_action_t) (struct buffer_head * bh, struct item_head * ih);
-typedef void (*item_head_action_t) (struct item_head * ih);
-
-void for_every_item (struct buffer_head * bh, item_head_action_t action,
-		     item_action_t * actions);
-int key_format (const struct key * key);
-unsigned long long get_offset (const struct key * key);
-int uniqueness2type (__u32 uniqueness);
-__u32 type2uniqueness (int type);
-int get_type (const struct key * key);
-char * key_of_what (const struct key * key);
-int type_unknown (struct key * key);
-void set_type (int format, struct key * key, int type);
-void set_offset (int format, struct key * key, loff_t offset);
-void set_type_and_offset (int format, struct key * key, loff_t offset, int type);
-
-
-typedef int (*check_unfm_func_t) (reiserfs_filsys_t *, __u32);
-int is_it_bad_item (reiserfs_filsys_t *, struct item_head *, char *,
-		    check_unfm_func_t, int bad_dir);
-
-#define hash_func_is_unknown(fs) ((fs)->fs_hash_function == 0)
-#define reiserfs_hash(fs) ((fs)->fs_hash_function)
-
-int known_hashes (void);
-char *code2name (unsigned int code);
-int func2code (hashf_t func);
-hashf_t code2func (unsigned int code);
-hashf_t name2func (char * hash);
-int find_hash_in_use (char * name, int namelen, __u32 deh_offset, unsigned int code_to_try_first);
-
-int entry_length (struct item_head * ih, struct reiserfs_de_head * deh,
-		  int pos_in_item);
-char * name_in_entry (struct reiserfs_de_head * deh, int pos_in_item);
-int name_in_entry_length (struct item_head * ih,
-		 struct reiserfs_de_head * deh, int pos_in_item);
-int name_length (char * name, int key_format);
-
-/*  access to stat data fields */
-void get_set_sd_field (int field, struct item_head * ih, void * sd,
-		       void * value, int set);
-#define GET_SD_MODE 0
-#define GET_SD_SIZE 1
-#define GET_SD_NLINK 2
-#define GET_SD_BLOCKS 3
-#define GET_SD_FIRST_DIRECT_BYTE 4
-
-#define get_sd_mode(ih,sd,pmode) get_set_sd_field (GET_SD_MODE, ih, sd, pmode, 0/*get*/)
-#define set_sd_mode(ih,sd,pmode) get_set_sd_field (GET_SD_MODE, ih, sd, pmode, 1/*set*/)
-
-#define get_sd_size(ih,sd,psize) get_set_sd_field (GET_SD_SIZE, ih, sd, psize, 0/*get*/)
-#define set_sd_size(ih,sd,psize) get_set_sd_field (GET_SD_SIZE, ih, sd, psize, 1/*set*/)
-
-#define get_sd_blocks(ih,sd,pblocks) get_set_sd_field (GET_SD_BLOCKS, ih, sd, pblocks, 0/*get*/)
-#define set_sd_blocks(ih,sd,pblocks) get_set_sd_field (GET_SD_BLOCKS, ih, sd, pblocks, 1/*set*/)
-
-//#define get_sd_rdev(ih,sd,pblocks) get_set_sd_field (GET_SD_RDEV, ih, sd, pblocks, 0/*get*/)
-//#define set_sd_rdev(ih,sd,pblocks) get_set_sd_field (GET_SD_RDEV, ih, sd, pblocks, 1/*set*/)
-
-//#define get_sd_generation(ih,sd,pblocks) get_set_sd_field (GET_SD_GENER, ih, sd, pblocks, 0/*get*/)
-//#define set_sd_generation(ih,sd,pblocks) get_set_sd_field (GET_SD_GENER, ih, sd, pblocks, 1/*set*/)
-
-#define get_sd_nlink(ih,sd,pnlink) get_set_sd_field (GET_SD_NLINK, ih, sd, pnlink, 0/*get*/)
-#define set_sd_nlink(ih,sd,pnlink) get_set_sd_field (GET_SD_NLINK, ih, sd, pnlink, 1/*set*/)
-
-#define get_sd_first_direct_byte(ih,sd,pfdb) get_set_sd_field (GET_SD_FIRST_DIRECT_BYTE, ih, sd, pfdb, 0/*get*/)
-#define set_sd_first_direct_byte(ih,sd,pfdb) get_set_sd_field (GET_SD_FIRST_DIRECT_BYTE, ih, sd, pfdb, 1/*set*/)
-
-int is_objectid_used (reiserfs_filsys_t * fs, __u32 objectid);
-void mark_objectid_used (reiserfs_filsys_t * fs, __u32 objectid);
-
-
-
-/* journal.c */
-int get_boundary_transactions (reiserfs_filsys_t *, reiserfs_trans_t *,
-			       reiserfs_trans_t *);
-int next_transaction (reiserfs_filsys_t *, reiserfs_trans_t *, reiserfs_trans_t);
-
-int replay_one_transaction (reiserfs_filsys_t *, reiserfs_trans_t *);
-
-typedef void (*action_on_trans_t) (reiserfs_filsys_t *, reiserfs_trans_t *);
-void for_each_transaction (reiserfs_filsys_t *, action_on_trans_t);
-
-typedef void (*action_on_block_t) (reiserfs_filsys_t *, reiserfs_trans_t *,
-				   unsigned int index,
-				   unsigned long in_journal,
-				   unsigned long in_place);
-void for_each_block (reiserfs_filsys_t * fs, reiserfs_trans_t * trans,
-		     action_on_block_t action);
-
-int reiserfs_open_journal (reiserfs_filsys_t *, char *, int flags);
-int reiserfs_journal_params_check(reiserfs_filsys_t *fs);
-int reiserfs_create_journal (reiserfs_filsys_t * fs, char * j_filename,
-			     unsigned long offset, unsigned long len, 
-			     int transaction_max_size);
-int reiserfs_journal_opened (reiserfs_filsys_t *);
-void reiserfs_flush_journal (reiserfs_filsys_t * fs);
-void reiserfs_free_journal (reiserfs_filsys_t * fs);
-void reiserfs_close_journal (reiserfs_filsys_t *);
-void reiserfs_reopen_journal (reiserfs_filsys_t * fs, int flag);
-__u32 advise_journal_max_trans_age (void);
-__u32 advise_journal_max_commit_age (void);
-__u32 advise_journal_max_batch (unsigned long journal_trans_max);
-__u32 advise_journal_max_trans_len (__u32 desired, __u32 journal_size, int blocksize, int verbose);
-
-
-
-/* prints.c */
-void print_indirect_item (FILE * fp, struct buffer_head * bh, int item_num);
-void print_block (FILE * fp, reiserfs_filsys_t *, struct buffer_head * bh, ...);//int print_mode, int first, int last);
-int print_super_block (FILE * fp, reiserfs_filsys_t *, char * file_name, struct buffer_head * bh, int short_print);
-void print_journal (reiserfs_filsys_t *);
-void print_journal_header (reiserfs_filsys_t * fs);
-void reiserfs_warning (FILE * fp, const char * fmt, ...);
-char ftypelet (mode_t mode);
-void reiserfs_print_item (FILE * fp, struct buffer_head * bh,
-			  struct item_head * ih);
-void print_filesystem_state (FILE * fp, reiserfs_filsys_t * fs);
-void print_one_transaction (reiserfs_filsys_t * fs, reiserfs_trans_t * trans);
-void print_journal_params (FILE * fp, struct journal_params * jp);
-char * get_reiserfs_version (__u16 version);
-int can_we_format_it (char * device_name, int force);
-
-
-#define reiserfs_panic(fmt, list...) \
-{\
-	fflush (stdout);\
-	fprintf (stderr, "%s %d %s\n", __FILE__, __LINE__, __FUNCTION__);\
-	reiserfs_warning (stderr, (const char *)fmt, ## list);\
-        reiserfs_warning (stderr, "\n" );\
-        abort ();\
-}
-#define reiserfs_exit(val, fmt, list...) \
-{\
-	fflush (stdout);\
-	reiserfs_warning (stderr, (const char *)fmt, ## list);\
-        reiserfs_warning (stderr, "\n" );\
-        exit (val);\
-}
-
-#define check_forcing_ask_confirmation(force) \
-	if (force < 1) {\
-	    /* avoid formatting it without being forced */\
-	    reiserfs_warning (stderr, "Use -f to force over\n");\
-	    return 0;\
-	}\
-	if (force < 2) {\
-	    if (!user_confirmed (stderr, "Continue (y/n):", "y\n"))\
-		return 0;\
-	}\
-
-
-#endif /* REISERFSPROGS_LIB_H */
diff --git a/include/util/Makefile.am b/include/util/Makefile.am
new file mode 100644
index 0000000..c9def40
--- /dev/null
+++ b/include/util/Makefile.am
@@ -0,0 +1 @@
+noinst_HEADERS = badblock.h misc.h print.h device.h mntent.h
diff --git a/lib/Makefile.in b/include/util/Makefile.in
similarity index 61%
copy from lib/Makefile.in
copy to include/util/Makefile.in
index 675222a..7f1b63a 100644
--- a/lib/Makefile.in
+++ b/include/util/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -20,8 +20,7 @@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
+top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
@@ -35,7 +34,24 @@
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
+build_triplet = @build@
 host_triplet = @host@
+subdir = include/util
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMDEP_FALSE = @AMDEP_FALSE@
 AMDEP_TRUE = @AMDEP_TRUE@
@@ -78,6 +94,7 @@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
 RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -92,6 +109,8 @@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
 bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
@@ -112,6 +131,7 @@
 libexecdir = @libexecdir@
 localstatedir = @localstatedir@
 mandir = @mandir@
+mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
@@ -119,95 +139,41 @@
 sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
-noinst_LIBRARIES = libmisc.a
-
-libmisc_a_SOURCES = io.c misc.c 
-subdir = lib
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-
-libmisc_a_AR = $(AR) cru
-libmisc_a_LIBADD =
-am_libmisc_a_OBJECTS = io.$(OBJEXT) misc.$(OBJEXT)
-libmisc_a_OBJECTS = $(am_libmisc_a_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/io.Po ./$(DEPDIR)/misc.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(libmisc_a_SOURCES)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(libmisc_a_SOURCES)
-
+noinst_HEADERS = badblock.h misc.h print.h device.h mntent.h
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  include/util/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  lib/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+	  $(AUTOMAKE) --gnu  include/util/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
 
-AR = ar
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-clean-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES) 
-	-rm -f libmisc.a
-	$(libmisc_a_AR) libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD)
-	$(RANLIB) libmisc.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 uninstall-info-am:
 
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -216,6 +182,7 @@
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
 	mkid -fID $$unique
+tags: TAGS
 
 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
@@ -227,10 +194,11 @@
 	  done | \
 	  $(AWK) '    { files[$$0] = 1; } \
 	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
 ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
@@ -253,10 +221,6 @@
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
@@ -270,7 +234,7 @@
 	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
 	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
 	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
 	  else \
 	    dir=''; \
 	  fi; \
@@ -287,8 +251,7 @@
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LIBRARIES)
-
+all-am: Makefile $(HEADERS)
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -301,7 +264,7 @@
 installcheck: installcheck-am
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 	  `test -z '$(STRIP)' || \
 	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 mostlyclean-generic:
@@ -309,24 +272,25 @@
 clean-generic:
 
 distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+clean-am: clean-generic mostlyclean-am
 
 distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
 
 dvi: dvi-am
 
 dvi-am:
 
+html: html-am
+
 info: info-am
 
 info-am:
@@ -342,12 +306,12 @@
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-
+	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-generic
 
 pdf: pdf-am
 
@@ -360,15 +324,13 @@
 uninstall-am: uninstall-info-am
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-noinstLIBRARIES ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-info-am
+	ctags distclean distclean-generic distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/include/util/badblock.h b/include/util/badblock.h
new file mode 100644
index 0000000..d2be8cf
--- /dev/null
+++ b/include/util/badblock.h
@@ -0,0 +1,14 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef UTIL_BADBLOCK_H
+#define UTIL_BADBLOCK_H
+
+#include "reiserfs/libreiserfs.h"
+
+extern int util_badblock_load (reiserfs_filsys_t * fs, 
+			       char * badblocks_file);
+
+#endif
diff --git a/include/util/device.h b/include/util/device.h
new file mode 100644
index 0000000..9661070
--- /dev/null
+++ b/include/util/device.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef UTIL_DEVICE_H
+#define UTIL_DEVICE_H
+
+#include "misc/types.h"
+#include <linux/major.h>
+#include <sys/types.h>
+#include <stdio.h>
+
+#ifndef major
+#define major(rdev)      ((rdev)>>8)
+#define minor(rdev)      ((rdev) & 0xff)
+#endif /* major */
+
+#ifndef SCSI_DISK_MAJOR
+#define SCSI_DISK_MAJOR(maj) ((maj) == SCSI_DISK0_MAJOR || \
+			     ((maj) >= SCSI_DISK1_MAJOR && (maj) <= SCSI_DISK7_MAJOR))
+#endif /* SCSI_DISK_MAJOR */
+    
+#ifndef SCSI_BLK_MAJOR
+#define SCSI_BLK_MAJOR(maj)  (SCSI_DISK_MAJOR(maj) || (maj) == SCSI_CDROM_MAJOR)
+#endif /* SCSI_BLK_MAJOR */
+
+#ifndef IDE_DISK_MAJOR
+#ifdef IDE9_MAJOR
+#define IDE_DISK_MAJOR(maj) ((maj) == IDE0_MAJOR || (maj) == IDE1_MAJOR || \
+			     (maj) == IDE2_MAJOR || (maj) == IDE3_MAJOR || \
+			     (maj) == IDE4_MAJOR || (maj) == IDE5_MAJOR || \
+			     (maj) == IDE6_MAJOR || (maj) == IDE7_MAJOR || \
+			     (maj) == IDE8_MAJOR || (maj) == IDE9_MAJOR)
+#else
+#define IDE_DISK_MAJOR(maj) ((maj) == IDE0_MAJOR || (maj) == IDE1_MAJOR || \
+			     (maj) == IDE2_MAJOR || (maj) == IDE3_MAJOR || \
+			     (maj) == IDE4_MAJOR || (maj) == IDE5_MAJOR)
+#endif /* IDE9_MAJOR */
+#endif /* IDE_DISK_MAJOR */
+
+typedef enum mount_flags {
+	MF_NOT_MOUNTED  = 0x0,
+	MF_RO		= 0x1,
+	MF_RW		= 0x2
+} mount_flags_t;
+
+extern FILE * util_file_open (char * filename, char * option);
+
+typedef struct util_device_dma {
+    int fd;
+    int support_type;
+    int dma;
+    __u64 speed;
+    dev_t st_rdev;
+} util_device_dma_t;
+
+extern int util_device_dma_prep(util_device_dma_t *dma_info);
+
+extern int util_device_get_dma(util_device_dma_t *dma_info);
+
+extern void util_device_dma_fini(int fd, util_device_dma_t *dma_info);
+
+extern int util_device_formatable (char * device_name, int force);
+
+extern int util_root_mounted(char *device);
+
+extern int util_device_mounted(char *device);
+
+extern int util_file_ro(char *file);
+
+#endif
diff --git a/include/util/misc.h b/include/util/misc.h
new file mode 100644
index 0000000..7f49c1a
--- /dev/null
+++ b/include/util/misc.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef UTIL_MISC_H
+#define UTIL_MISC_H
+
+#include <stdio.h>
+
+extern void util_misc_progress (FILE * fp, 
+				unsigned long *passed, 
+				unsigned long total, 
+				unsigned int inc, 
+				int forward);
+
+extern void util_misc_speed (FILE *fp, 
+			     unsigned long total, 
+			     unsigned long passed, 
+			     int cursor_pos, 
+			     int reset_time);
+
+
+extern void util_misc_print_name (FILE * fp, char * name, int len);
+
+extern void util_misc_erase_name (FILE * fp, int len);
+
+extern void util_misc_fini_name (FILE *fp);
+
+#endif
diff --git a/include/util/mntent.h b/include/util/mntent.h
new file mode 100644
index 0000000..8ccad06
--- /dev/null
+++ b/include/util/mntent.h
@@ -0,0 +1,11 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifndef UTIL_MNTENT_H
+#define UTIL_MNTENT_H
+
+extern struct mntent *util_mntent(char *device);
+
+#endif
diff --git a/include/util/print.h b/include/util/print.h
new file mode 100644
index 0000000..62ee70f
--- /dev/null
+++ b/include/util/print.h
@@ -0,0 +1,15 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifndef UTIL_PRINT_H
+#define UTIL_PRINT_H
+
+#include <stdio.h>
+
+extern int util_user_confirmed(FILE * fp, char * q, char * yes);
+
+extern void util_print_banner(char *name);
+
+#endif
diff --git a/install-sh b/install-sh
index e9de238..1a83534 100755
--- a/install-sh
+++ b/install-sh
@@ -1,19 +1,38 @@
 #!/bin/sh
-#
 # install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
+
+scriptversion=2005-02-02.21
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
 #
-# Copyright 1991 by the Massachusetts Institute of Technology
+# Copyright (C) 1994 X Consortium
 #
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
 # `make' implicit rules from creating a file called install from it
@@ -23,13 +42,11 @@
 # from scratch.  It can only install one file at a time, a restriction
 # shared with many OS's install programs.
 
-
 # set DOITPROG to echo to test this script
 
 # Don't use :- since 4.3BSD and earlier shells don't like it.
 doit="${DOITPROG-}"
 
-
 # put in absolute paths if you don't have them in your path; or use env. vars.
 
 mvprog="${MVPROG-mv}"
@@ -41,211 +58,266 @@
 rmprog="${RMPROG-rm}"
 mkdirprog="${MKDIRPROG-mkdir}"
 
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
 chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
+chowncmd=
+chgrpcmd=
+stripcmd=
 rmcmd="$rmprog -f"
 mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
 
-while [ x"$1" != x ]; do
-    case $1 in
-	-c) instcmd="$cpprog"
-	    shift
-	    continue;;
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
 
-	-d) dir_arg=true
-	    shift
-	    continue;;
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
 
-	-m) chmodcmd="$chmodprog $2"
-	    shift
-	    shift
-	    continue;;
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
 
-	-o) chowncmd="$chownprog $2"
-	    shift
-	    shift
-	    continue;;
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
 
-	-g) chgrpcmd="$chgrpprog $2"
-	    shift
-	    shift
-	    continue;;
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
 
-	-s) stripcmd="$stripprog"
-	    shift
-	    continue;;
+    -d) dir_arg=true
+        shift
+        continue;;
 
-	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
-	    shift
-	    continue;;
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
 
-	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-	    shift
-	    continue;;
+    --help) echo "$usage"; exit $?;;
 
-	*)  if [ x"$src" = x ]
-	    then
-		src=$1
-	    else
-		# this colon is to work around a 386BSD /bin/sh bug
-		:
-		dst=$1
-	    fi
-	    shift
-	    continue;;
-    esac
-done
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
 
-if [ x"$src" = x ]
-then
-	echo "install:	no input file specified"
-	exit 1
-else
-	true
-fi
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
 
-if [ x"$dir_arg" != x ]; then
-	dst=$src
-	src=""
-	
-	if [ -d $dst ]; then
-		instcmd=:
-		chmodcmd=""
-	else
-		instcmd=mkdir
-	fi
-else
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
 
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-	if [ -f $src -o -d $src ]
-	then
-		true
-	else
-		echo "install:  $src does not exist"
-		exit 1
-	fi
-	
-	if [ x"$dst" = x ]
-	then
-		echo "install:	no destination specified"
-		exit 1
-	else
-		true
-	fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-	if [ -d $dst ]
-	then
-		dst="$dst"/`basename $src`
-	else
-		true
-	fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='	
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-	pathcomp="${pathcomp}${1}"
+    -t) dstarg=$2
 	shift
+	shift
+	continue;;
 
-	if [ ! -d "${pathcomp}" ] ;
-        then
-		$mkdirprog "${pathcomp}"
-	else
-		true
-	fi
+    -T) no_target_directory=true
+	shift
+	continue;;
 
-	pathcomp="${pathcomp}/"
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
 done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
 fi
 
-if [ x"$dir_arg" != x ]
-then
-	$doit $instcmd $dst &&
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
 
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
 
-# If we're going to rename the final executable, determine the name now.
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
 
-	if [ x"$transformarg" = x ] 
-	then
-		dstfile=`basename $dst`
-	else
-		dstfile=`basename $dst $transformbasename | 
-			sed $transformarg`$transformbasename
-	fi
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
 
-# don't allow the sed command to completely eliminate the filename
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
 
-	if [ x"$dstfile" = x ] 
-	then
-		dstfile=`basename $dst`
-	else
-		true
-	fi
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
 
-# Make a temp file name in the proper directory.
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
 
-	dsttmp=$dstdir/#inst.$$#
+  # Make sure that the destination directory exists.
 
-# Move or copy the file name to the temp name
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
 
-	$doit $instcmd $src $dsttmp &&
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
 
-	trap "rm -f ${dsttmp}" 0 &&
+    pathcomp=
 
-# and set any options; do chmod last to preserve setuid bits
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
 
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
 
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+  else
+    dstfile=`basename "$dst"`
 
-# Now rename the file to the real destination.
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
 
-	$doit $rmcmd -f $dstdir/$dstfile &&
-	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
 
-fi &&
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
 
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
 
-exit 0
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/lib/Makefile.am b/lib/Makefile.am
deleted file mode 100644
index 3858b2d..0000000
--- a/lib/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-noinst_LIBRARIES = libmisc.a
-
-libmisc_a_SOURCES = io.c misc.c 
-##reiserfs.c
-
diff --git a/lib/io.c b/lib/io.c
deleted file mode 100644
index 54b764d..0000000
--- a/lib/io.c
+++ /dev/null
@@ -1,960 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "io.h"
-
-#include <string.h>
-#include <errno.h>
-#include <asm/types.h>
-
-void check_memory_msg (void) {
-    fprintf(stderr, 
-	"\nThe problem has occurred looks like a hardware problem (perhaps\n"
-        "memory). Send us the bug report only if the second run dies at\n"
-	"the same place with the same block number.\n");
-}
-
-void check_hd_msg (void) {
-    fprintf(stderr, 
-	"\nThe problem has occurred looks like a hardware problem. If you have\n"
-	"bad blocks, we advise you to get a new hard drive, because once you\n"
-	"get one bad block  that the disk  drive internals  cannot hide from\n"
-        "your sight,the chances of getting more are generally said to become\n"
-        "much higher  (precise statistics are unknown to us), and  this disk\n"
-        "drive is probably not expensive enough  for you to you to risk your\n"
-        "time and  data on it.  If you don't want to follow that follow that\n"
-        "advice then  if you have just a few bad blocks,  try writing to the\n"
-	"bad blocks  and see if the drive remaps  the bad blocks (that means\n"
-	"it takes a block  it has  in reserve  and allocates  it for use for\n"
-	"of that block number).  If it cannot remap the block,  use badblock\n"
-	"option (-B) with  reiserfs utils to handle this block correctly.\n");
-}
-
-static int is_bad_block (unsigned long block)
-{
-#ifdef IO_FAILURE_EMULATION
-    
-    /* this array similates bad blocks on the device */
-    unsigned long bad_blocks [] =
-	{
-	    8208, 8209, 8210
-/*, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19*/
-	};
-    int i;
-    
-    for (i = 0; i < sizeof (bad_blocks) / sizeof (bad_blocks[0]); i ++)
-	if (bad_blocks [i] == block)
-	    return 1;
-
-#endif
-
-    return 0;
-}
-
-
-
-/* All buffers are in double linked cycled list.  If getblk found buffer with
-   wanted block number in hash queue it moves buffer to the end of list. */
-
-static int g_nr_buffers;
-
-
-static unsigned long buffers_memory;
-
-/* create buffers until we spend this fraction of system memory, this
-** is a hard limit on the amount of buffer ram used
-*/
-#define BUFFER_MEMORY_FRACTION 10
-
-/* number of bytes in local buffer cache before we start forcing syncs
-** of dirty data and reusing unused buffers instead of allocating new
-** ones.  If a flush doesn't find reusable buffers, new ones are
-** still allocated up to the BUFFER_MEMORY_FRACTION percentage
-**
-*/
-#define BUFFER_SOFT_LIMIT (500 * 1024)
-static unsigned long buffer_soft_limit = BUFFER_SOFT_LIMIT;
-
-
-#define NR_HASH_QUEUES 4096
-static struct buffer_head * g_a_hash_queues [NR_HASH_QUEUES];
-static struct buffer_head * Buffer_list_head;
-static struct buffer_head * g_free_buffers = NULL ;
-static struct buffer_head * g_buffer_heads;
-static int buffer_hits = 0 ;
-static int buffer_misses = 0 ;
-static int buffer_reads = 0 ;
-static int buffer_writes = 0 ;
-
-
-
-static void _show_buffers(struct buffer_head **list, int dev, unsigned long size) {
-    int all = 0;
-    int dirty = 0;
-    int in_use = 0; /* count != 0 */
-    int free = 0;
-    struct buffer_head * next;
-
-    next = *list;
-    if (!next)
-        return ;
-
-    for (;;) {
-	if (next->b_dev == dev && next->b_size == size) {
-	    all ++;
-	    if (next->b_count != 0) {
-		in_use ++;
-	    }
-	    if (buffer_dirty (next)) {
-		dirty ++;
-	    }
-	    if (buffer_clean (next) && next->b_count == 0) {
-		free ++;
-	    }
-	}
-	next = next->b_next;
-	if (next == *list)
-	    break;
-    }
-
-    printf("show_buffers (dev %d, size %lu): free %d, count != 0 %d, dirty %d, "
-	"all %d\n", dev, size, free, in_use, dirty, all);
-}
-
-
-static void show_buffers (int dev, int size)
-{
-    _show_buffers(&Buffer_list_head, dev, size) ;
-    _show_buffers(&g_free_buffers, dev, size) ;
-}
-
-
-static void insert_into_hash_queue (struct buffer_head * bh)
-{
-    int index = bh->b_blocknr % NR_HASH_QUEUES;
-
-    if (bh->b_hash_prev || bh->b_hash_next)
-	die ("insert_into_hash_queue: hash queue corrupted");
-
-    if (g_a_hash_queues[index]) {
-	g_a_hash_queues[index]->b_hash_prev = bh;
-	bh->b_hash_next = g_a_hash_queues[index];
-    }
-    g_a_hash_queues[index] = bh;
-}
-
-
-static void remove_from_hash_queue (struct buffer_head * bh)
-{
-    if (bh->b_hash_next == 0 && bh->b_hash_prev == 0 && bh != g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES])
-	/* (b_dev == -1) ? */
-	return;
-
-    if (bh == g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES]) {
-	if (bh->b_hash_prev != 0)
-	    die ("remove_from_hash_queue: hash queue corrupted");
-	g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES] = bh->b_hash_next;
-    }
-    if (bh->b_hash_next)
-	bh->b_hash_next->b_hash_prev = bh->b_hash_prev;
-
-    if (bh->b_hash_prev)
-	bh->b_hash_prev->b_hash_next = bh->b_hash_next;
-
-    bh->b_hash_prev = bh->b_hash_next = 0;
-}
-
-
-static void put_buffer_list_end (struct buffer_head **list,
-                                 struct buffer_head * bh)
-{
-    struct buffer_head * last = 0;
-
-    if (bh->b_prev || bh->b_next)
-	die ("put_buffer_list_end: buffer list corrupted");
-
-    if (*list == 0) {
-	bh->b_next = bh;
-	bh->b_prev = bh;
-	*list = bh;
-    } else {
-	last = (*list)->b_prev;
-
-	bh->b_next = last->b_next;
-	bh->b_prev = last;
-	last->b_next->b_prev = bh;
-	last->b_next = bh;
-    }
-}
-
-
-static void remove_from_buffer_list (struct buffer_head **list,
-                                     struct buffer_head * bh)
-{
-    if (bh == bh->b_next) {
-	*list = 0;
-    } else {
-	bh->b_prev->b_next = bh->b_next;
-	bh->b_next->b_prev = bh->b_prev;
-	if (bh == *list)
-	    *list = bh->b_next;
-    }
-
-    bh->b_next = bh->b_prev = 0;
-}
-
-
-static void put_buffer_list_head (struct buffer_head **list,
-                                  struct buffer_head * bh)
-{
-    put_buffer_list_end (list, bh);
-    *list = bh;
-}
-
-/*
-#include <sys/mman.h>
-
-static size_t estimate_memory_amount (void)
-{
-    size_t len = 1;
-    size_t max = 0;
-    void * addr;
-
-    while (len > 0) {
-	addr = mmap (0, len, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-	if (addr == MAP_FAILED) {
-	    if (errno != ENOMEM)
-		die ("mmap failed: %s\n", strerror(errno));
-	    break;
-	}
-	if (mlock (addr, len) != 0) {
-	    if (errno == EPERM)
-		die ("No permission to run mlock");
-	    break;
-	}
-
-	munlock (addr, len);
-	munmap (addr, len);
-	max = len;
-	len *= 2;
-    }
-
-    // * If we've looped, we don't want to return 0, we want to return the
-    // * last successful len before we looped. In the event that mmap/mlock
-    // * failed for len = 1, max will still be 0, so we don't get an invalid
-    // * result
-    return max;
-}
-*/
-
-#define GROW_BUFFERS__NEW_BUFERS_PER_CALL 10
-
-/* creates number of new buffers and insert them into head of buffer list */
-static int grow_buffers (int size)
-{
-    int i;
-    struct buffer_head * bh, * tmp;
-
-
-    /* get memory for array of buffer heads */
-    bh = (struct buffer_head *)getmem (GROW_BUFFERS__NEW_BUFERS_PER_CALL * 
-				       sizeof (struct buffer_head) + sizeof (struct buffer_head *));
-    if (g_buffer_heads == 0)
-	g_buffer_heads = bh;
-    else {
-	/* link new array to the end of array list */
-	tmp = g_buffer_heads;
-	while (*(struct buffer_head **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL) != 0)
-	    tmp = *(struct buffer_head **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL);
-	*(struct buffer_head **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL) = bh;
-    }
-
-    for (i = 0; i < GROW_BUFFERS__NEW_BUFERS_PER_CALL; i ++) {
-
-	tmp = bh + i;
-	memset (tmp, 0, sizeof (struct buffer_head));
-	tmp->b_data = getmem (size);
-	if (tmp->b_data == 0)
-	    die ("grow_buffers: no memory for new buffer data");
-	tmp->b_dev = -1;
-	tmp->b_size = size;
-	put_buffer_list_head (&g_free_buffers, tmp);
-    }
-    buffers_memory += GROW_BUFFERS__NEW_BUFERS_PER_CALL * size;
-    g_nr_buffers += GROW_BUFFERS__NEW_BUFERS_PER_CALL;
-    return GROW_BUFFERS__NEW_BUFERS_PER_CALL;
-}
-
-
-struct buffer_head *find_buffer(int dev, unsigned long block, unsigned long size)
-{		
-    struct buffer_head * next;
-
-    next = g_a_hash_queues[block % NR_HASH_QUEUES];
-    for (;;) {
-	struct buffer_head *tmp = next;
-	if (!next)
-	    break;
-	next = tmp->b_hash_next;
-	if (tmp->b_blocknr != block || tmp->b_size != size || tmp->b_dev != dev)
-	    continue;
-	next = tmp;
-	break;
-    }
-    return next;
-}
-
-
-static struct buffer_head * get_free_buffer (struct buffer_head **list,
-                                             unsigned long size)
-{
-    struct buffer_head * next;
-
-    next = *list;
-    if (!next)
-	return 0;
-
-    for (;;) {
-	if (!next)
-	    die ("get_free_buffer: buffer list is corrupted");
-	if (next->b_count == 0 && buffer_clean (next) && next->b_size == size) {
-	    remove_from_hash_queue (next);
-	    remove_from_buffer_list (list, next);
-	    return next;
-	}
-	next = next->b_next;
-	if (next == *list)
-	    break;
-    }
-    return 0;
-}
-
-
-/* to_write == 0 when all blocks have to be flushed. Otherwise - write only
-   buffers with b_count == 0 */
-static int sync_buffers (struct buffer_head **list, int dev, int to_write) {
-    struct buffer_head * next;
-    int written = 0;
-
-
-restart:
-    next = *list;
-    if (!next)
-	return 0;
-    for (;;) {
-	if (!next)
-	    die ("sync_buffers: buffer list is corrupted");
- 
-	if (next->b_dev == dev && buffer_dirty (next) && buffer_uptodate (next)) {
-	    if ((to_write == 0 || next->b_count == 0) && !buffer_do_not_flush (next)) {
-		bwrite (next);
-	    }
-	}
-    
-	/* if this buffer is reusable, put it onto the end of the free list */
-	if (next->b_count == 0 && buffer_clean(next)) {
-	    remove_from_hash_queue (next);
-	    remove_from_buffer_list (list, next);
-	    put_buffer_list_end (&g_free_buffers, next);
-	    written++ ;
-	    if (written == to_write)
-		return written;
-	    goto restart;
-	}
-	if (to_write && written >= to_write)
-	    return written;
-
-	next = next->b_next;
-	if (next == *list)
-	    break;
-    }
-
-    return written;
-}
-
-
-void flush_buffers (int dev)
-{
-    if (dev == -1)
-	die ("flush_buffers: device is not specified");
-
-    sync_buffers (&Buffer_list_head, dev, 0/*all*/);
-    buffer_soft_limit = BUFFER_SOFT_LIMIT;
-}
-
-
-struct buffer_head * getblk (int dev, unsigned long block, int size)
-{
-    struct buffer_head * bh;
-
-    bh = find_buffer (dev, block, size);
-    if (bh) {
-	/* move the buffer to the end of list */
-
-	/*checkmem (bh->b_data, bh->b_size);*/
-
-	remove_from_buffer_list (&Buffer_list_head, bh);
-	put_buffer_list_end (&Buffer_list_head, bh);
-	bh->b_count ++;
-	buffer_hits++ ;
-	return bh;
-    }
-    buffer_misses++ ;
-
-    bh = get_free_buffer (&g_free_buffers, size);
-    if (bh == NULL) {
-	if (buffers_memory >= buffer_soft_limit) {
-	    if (sync_buffers (&Buffer_list_head, dev, 32) == 0) {
-		grow_buffers(size);
-		buffer_soft_limit = buffers_memory + 
-			GROW_BUFFERS__NEW_BUFERS_PER_CALL * size;
-	    }
-	} else {
-	    if (grow_buffers(size) == 0)
-		sync_buffers (&Buffer_list_head, dev, 32);
-	}
-
-	bh = get_free_buffer (&g_free_buffers, size);
-	if (bh == NULL) {
-	    show_buffers (dev, size);
-	    die ("getblk: no free buffers after grow_buffers "
-		 "and refill (%d)", g_nr_buffers);
-	}
-    }
-
-    bh->b_count = 1;
-    bh->b_dev = dev;
-    bh->b_size = size;
-    bh->b_blocknr = block;
-    bh->b_end_io = NULL ;
-    memset (bh->b_data, 0, size);
-    misc_clear_bit(BH_Dirty, &bh->b_state);
-    misc_clear_bit(BH_Uptodate, &bh->b_state);
-
-    put_buffer_list_end (&Buffer_list_head, bh);
-    insert_into_hash_queue (bh);
-    /*checkmem (bh->b_data, bh->b_size);*/
-
-    return bh;
-}
-
-
-void brelse (struct buffer_head * bh)
-{
-    if (bh == 0)
-	return;
-    
-    if (bh->b_count == 0)
-	die ("brelse: can not free a free buffer %lu", bh->b_blocknr);
-    
-    /*checkmem (bh->b_data, get_mem_size (bh->b_data));*/
-    
-    bh->b_count --;
-}
-
-
-void bforget (struct buffer_head * bh)
-{
-    if (bh) {
-	bh->b_state = 0;
-	brelse (bh);
-	remove_from_hash_queue (bh);
-	remove_from_buffer_list(&Buffer_list_head, bh);
-	put_buffer_list_head(&Buffer_list_head, bh);
-    }
-}
-
-/* Returns 0 on success; 1 - end of file; 0 - OK. */
-static int f_read(struct buffer_head * bh)
-{
-    unsigned long long offset;
-    ssize_t bytes;
-
-    buffer_reads++ ;
-
-    offset = (unsigned long long)bh->b_size * bh->b_blocknr;
-    if (lseek (bh->b_dev, offset, SEEK_SET) < 0)
-	return -1;
-
-    bytes = read (bh->b_dev, bh->b_data, bh->b_size);
-    
-    return bytes < 0 ? -1 : (bytes != (ssize_t)bh->b_size ? 1 : 0);
-}
-
-
-struct buffer_head * bread (int dev, unsigned long block, size_t size)
-{
-    struct buffer_head * bh;
-    int ret;
-
-    if (is_bad_block (block))
-	return 0;
-
-    bh = getblk (dev, block, size);
-    
-    /*checkmem (bh->b_data, get_mem_size(bh->b_data));*/
-    
-    if (buffer_uptodate (bh))
-	return bh;
-
-    ret = f_read(bh);
-    
-    if (ret > 0) {
-	die ("%s: End of file, cannot read the block (%lu).\n", 
-	     __FUNCTION__, block);
-    } else if (ret < 0) {
-	/* BAD BLOCK LIST SUPPORT
-	 * die ("%s: Cannot read a block # %lu. Specify list of badblocks\n",*/
-
-	if (errno == EIO) {
-	    check_hd_msg();
-	    die ("%s: Cannot read the block (%lu): (%s).\n", 
-		 __FUNCTION__, block, strerror(errno));
-	} else	{
-	    fprintf (stderr, "%s: Cannot read the block (%lu): (%s).\n", 
-		     __FUNCTION__, block, strerror(errno));
-	    return NULL;
-	}
-    }
-       
-    mark_buffer_uptodate (bh, 0);
-    return bh;
-}
-
-#define ROLLBACK_FILE_START_MAGIC       "_RollBackFileForReiserfsFSCK"
-
-static struct block_handler * rollback_blocks_array;
-static __u32 rollback_blocks_number = 0;
-static FILE * s_rollback_file = 0;
-static FILE * log_file;
-static int do_rollback = 0;
-
-static char * rollback_data;
-static int rollback_blocksize;
-
-void init_rollback_file (char * rollback_file, int *blocksize, FILE * log) {
-    char * string;
-    struct stat buf;
-    
-    if (rollback_file == NULL)
-        return;
-        
-    stat(rollback_file, &buf);
-    
-    s_rollback_file = fopen (rollback_file, "w+");    
-    if (s_rollback_file == NULL) {
-	fprintf (stderr, "Cannot create file %s, work without a rollback file\n", rollback_file);
-        return;
-    }
-
-    rollback_blocksize = *blocksize;
-
-    string = ROLLBACK_FILE_START_MAGIC;
-    fwrite (string, 28, 1, s_rollback_file);
-    fwrite (&rollback_blocksize, sizeof (rollback_blocksize), 1, s_rollback_file);
-    fwrite (&rollback_blocks_number, sizeof (rollback_blocks_number), 1, s_rollback_file);
-    fflush(s_rollback_file);
-        
-    rollback_data = getmem(rollback_blocksize);
-    
-//    printf("\ncheckmem1");
-//    fflush (stdout);
-//    checkmem (rollback_data, get_mem_size((char *)rollback_data));
-//    printf(" OK");
-    
-    log_file = log;
-    if (log_file)
-        fprintf (log_file, "rollback: file (%s) initialize\n", rollback_file);
-
-    do_rollback = 0;
-}
-
-#if 0
-static void erase_rollback_file (char * rollback_file) {
-    close_rollback_file ();
-    unlink (rollback_file);    
-}
-#endif
-
-int open_rollback_file (char * rollback_file, FILE * log) {
-    char string [28];
-    struct stat buf;
-    
-    if (rollback_file == NULL)
-        return -1;
-    
-    if (stat(rollback_file, &buf)) {
-	fprintf (stderr, "Cannot stat rollback file (%s)\n", rollback_file);
-	return -1;
-    }
-        
-    s_rollback_file = fopen (rollback_file, "r+");
-    if (s_rollback_file == NULL) {
-	fprintf (stderr, "Cannot open file (%s)\n", rollback_file);
-	return -1;
-    }
-    
-    fread (string, 28, 1, s_rollback_file);
-    if (!strcmp (string, ROLLBACK_FILE_START_MAGIC)) {
-        fprintf (stderr, "Specified file (%s) does not look like a rollback file\n", rollback_file);
-        fclose (s_rollback_file);
-        s_rollback_file = 0;
-        return -1;
-    }
-    
-    fread (&rollback_blocksize, sizeof (rollback_blocksize), 1, s_rollback_file);
-    
-    if (rollback_blocksize <= 0) {
-        fprintf(stderr, "rollback: wrong rollback blocksize, exit\n");
-        return -1;
-    }
-    
-    log_file = log;
-    if (log_file)
-        fprintf (log_file, "rollback: file (%s) opened\n", rollback_file);
-    
-    do_rollback = 1;
-    return 0;
-}
-
-void close_rollback_file () {
-    if (s_rollback_file == 0)
-        return;   
-
-    if (!do_rollback) {
-        if (fseek (s_rollback_file, 28 + sizeof(int), SEEK_SET) == (loff_t)-1)
-            return;
-        fwrite (&rollback_blocks_number, sizeof (rollback_blocksize), 1, s_rollback_file);
-        if (log_file != 0) 
-            fprintf (log_file, "rollback: %d blocks backed up\n", rollback_blocks_number);
-    }
-        
-    fclose (s_rollback_file);
-
-    freemem (rollback_data);
-    freemem (rollback_blocks_array);
-
-//    fprintf (stdout, "rollback: (%u) blocks saved, \n", rollback_blocks_number);
-    
-/*    for (i = 0; i < rollback_blocks_number; i++) 
-        fprintf(stdout, "device (%Lu), block number (%u)\n", 
-                rollback_blocks_array [i].device, 
-                rollback_blocks_array [i].blocknr);
-    fprintf(stdout, "\n");
-    */
-}
-
-void do_fsck_rollback (int fd_device, int fd_journal_device, FILE * progress) {
-    long long int offset;
-    
-    struct stat buf;
-    int descriptor;
-    ssize_t retval;
-    int count_failed = 0;
-    int count_rollbacked = 0;
-    
-    int b_dev;
-    int n_dev = 0;
-    int n_journal_dev = 0;
-    unsigned long total, done = 0;
-
-    if (fd_device == 0) {
-        fprintf(stderr, "rollback: unspecified device, exit\n");
-        return;
-    }
-        
-    if (fd_journal_device) {
-        if (!fstat (fd_journal_device, &buf)) {
-            n_journal_dev = buf.st_rdev;
-        } else {
-            fprintf(stderr, "rollback: specified journal device cannot be stated\n");
-        }
-    }
-    
-    if (!fstat (fd_device, &buf)) {
-        n_dev = buf.st_rdev;
-    } else {
-        fprintf(stderr, "rollback: specified device cannot be stated, exit\n");
-        return;
-    }
-    
-    rollback_data = getmem (rollback_blocksize);
-//    printf("\ncheckmem2");
-//    fflush (stdout);
-//    checkmem (rollback_data, get_mem_size((char *)rollback_data));
-//   printf(" OK");
-    
-    fread (&rollback_blocks_number, sizeof (rollback_blocks_number), 1, s_rollback_file);
-
-    total = rollback_blocks_number;
-    
-    while (1) {
-        print_how_far (progress, &done, rollback_blocks_number, 1, 0/*not quiet*/);
-	
-        descriptor = 0;
-        if ((retval = fread (&b_dev, sizeof (b_dev), 1, s_rollback_file)) <= 0) {
-            if (retval) 
-                fprintf (stderr, "rollback: fread: %s\n", strerror (errno));
-            break;            
-        }
-        if ((retval = fread (&offset, sizeof (offset), 1, s_rollback_file)) <= 0) {
-            if (retval) 
-                fprintf (stderr, "rollback: fread: %s\n", strerror (errno));
-            break;
-        }
-
-        if ((retval = fread (rollback_data, rollback_blocksize, 1, s_rollback_file)) <= 0) {
-            if (retval) 
-                fprintf (stderr, "rollback: fread: %s\n", strerror (errno));
-            break;
-        }
-                
-        if (n_dev == b_dev)
-            descriptor = fd_device;
-        if ((n_journal_dev) && (n_journal_dev == b_dev))
-            descriptor = fd_journal_device;
-        
-        if (descriptor == 0) {
-            fprintf(stderr, "rollback: block from unknown device, skip block\n");
-            count_failed ++;
-            continue;
-        }
-        
-        if (lseek (descriptor, offset, SEEK_SET) == (loff_t)-1) {
-            fprintf(stderr, "device cannot be lseeked, skip block\n");
-            count_failed ++;
-            continue;
-        }
-        
-        if (write (descriptor, rollback_data, rollback_blocksize) == -1) {
-            fprintf (stderr, "rollback: write %d bytes returned error "
-		"(block=%lld, dev=%d): %s\n", rollback_blocksize, 
-		offset/rollback_blocksize, b_dev, strerror (errno));
-            count_failed ++;
-        } else {
-            count_rollbacked ++;
-              /*if you want to know what gets rollbacked, uncomment it*/
-/*            if (log_file != 0 && log_file != stdout) 
-                fprintf (log_file, "rollback: block %Lu of device %Lu was restored\n", 
-                        (loff_t)offset/rollback_blocksize, b_dev);
-*/
-//            fprintf (stdout, "rollback: block (%Ld) written\n", (loff_t)offset/rollback_blocksize);
-        }
-    }
-    
-    printf ("\n");
-    if (log_file != 0) 
-        fprintf (log_file, "rollback: (%u) blocks restored\n", count_rollbacked);
-}
-
-/*
-static void rollback__mark_block_saved (struct block_handler * rb_e) {
-    if (rollback_blocks_array == NULL)
-        rollback_blocks_array = getmem (ROLLBACK__INCREASE_BLOCK_NUMBER * sizeof (*rb_e));
-    
-    if (rollback_blocks_number == get_mem_size ((void *)rollback_blocks_array) / sizeof (*rb_e))
-        rollback_blocks_array = expandmem (rollback_blocks_array, get_mem_size((void *)rollback_blocks_array), 
-                        ROLLBACK__INCREASE_BLOCK_NUMBER * sizeof (*rb_e));
-
-//    checkmem ((char *)rollback_blocks_array, get_mem_size((char *)rollback_blocks_array));
-
-    rollback_blocks_array[rollback_blocks_number] = *rb_e;
-    rollback_blocks_number ++;
-    qsort (rollback_blocks_array, rollback_blocks_number, sizeof (*rb_e), rollback_compare);
-    
-//    printf("\ncheckmem3");
-//    fflush (stdout);
-//   checkmem ((char *)rollback_blocks_array, get_mem_size((char *)rollback_blocks_array));
-//    printf(" OK");
-}
-*/
-/* for now - just make sure that bad blocks did not get here */
-int bwrite (struct buffer_head * bh)
-{
-    unsigned long long offset;
-    long long bytes, size;
-
-    if (is_bad_block (bh->b_blocknr)) {
-	fprintf (stderr, "bwrite: bad block is going to be written: %lu\n",
-		 bh->b_blocknr);
-	exit(8);
-    }
-
-    if (!buffer_dirty (bh) || !buffer_uptodate (bh))
-	return 0;
-
-    buffer_writes++ ;
-    if (bh->b_start_io)
-	/* this is used by undo feature of reiserfsck */
-	bh->b_start_io (bh->b_blocknr);
-
-    size = bh->b_size;
-    offset = (loff_t)size * (loff_t)bh->b_blocknr;
-
-    if (lseek (bh->b_dev, offset, SEEK_SET) == (loff_t)-1){
-	fprintf (stderr, "bwrite: lseek to position %llu (block=%lu, dev=%d): %s\n",
-	    offset, bh->b_blocknr, bh->b_dev, strerror(errno));
-	exit(8); /* File system errors left uncorrected */
-    }
-
-    if (s_rollback_file != NULL && bh->b_size == (unsigned long)rollback_blocksize) {
-        struct stat buf;
-        __u32 position;
-	struct block_handler block_h;
-        
-        /*log previous content into the log*/
-        if (!fstat (bh->b_dev, &buf)) {
-	    block_h.blocknr = bh->b_blocknr;
-	    block_h.device = buf.st_rdev;
-	    if (reiserfs_bin_search(&block_h, rollback_blocks_array, 
-				    rollback_blocks_number, sizeof (block_h), 
-				    &position, blockdev_list_compare)
-		!= POSITION_FOUND)
-	    {
-                /*read initial data from the disk*/
-                if (read(bh->b_dev, rollback_data, bh->b_size) == (long long)bh->b_size) {
-                    fwrite(&buf.st_rdev, sizeof (buf.st_rdev), 1, s_rollback_file);
-                    fwrite(&offset, sizeof (offset), 1, s_rollback_file);
-                    fwrite(rollback_data, rollback_blocksize, 1, s_rollback_file);
-                    fflush(s_rollback_file);
-                    blocklist__insert_in_position(&block_h, (void *)(&rollback_blocks_array),
-			&rollback_blocks_number, sizeof(block_h), &position);
-		    
-                    /*if you want to know what gets saved, uncomment it*/
-/*                    if (log_file != 0 && log_file != stdout) {
-                        fprintf (log_file, "rollback: block %lu of device %Lu was "
-			    "backed up\n", bh->b_blocknr, buf.st_rdev);
-                    }
-*/
-                    
-                } else {
-                    fprintf (stderr, "bwrite: read (block=%lu, dev=%d): %s\n", 
-			bh->b_blocknr, bh->b_dev, strerror (errno));
-                    exit(8);
-                }
-		
-                if (lseek (bh->b_dev, offset, SEEK_SET) == (loff_t)-1) {
-                    fprintf (stderr, "bwrite: lseek to position %llu (block=%lu, "
-			"dev=%d): %s\n", offset, bh->b_blocknr, bh->b_dev, 
-			strerror(errno));
-                    exit(8);
-                }
-            }
-        } else {
-            fprintf (stderr, "bwrite: fstat of (%d) returned -1: %s\n", 
-		bh->b_dev, strerror(errno));
-        }
-    } else if (s_rollback_file != NULL) {
-	fprintf (stderr, "rollback: block (%lu) has the size different from "
-	    "the fs uses, block skipped\n", bh->b_blocknr);
-    }
-    
-    bytes = write(bh->b_dev, bh->b_data, size);
-    if (bytes != size) {
-	fprintf (stderr, "bwrite: write %lld bytes returned %lld (block=%ld, "
-	    "dev=%d): %s\n", size, bytes, bh->b_blocknr, bh->b_dev, 
-	    strerror(errno));
-	exit(8);
-    }
-
-    mark_buffer_clean (bh);
-
-    if (bh->b_end_io) {
-	bh->b_end_io(bh, 1) ;
-    }
-
-    return 0;
-}
-
-
-static int _check_and_free_buffer_list(struct buffer_head *list) {
-    struct buffer_head *next = list ;
-    int count = 0 ;
-    if (!list)
-	return 0 ;
-
-    for(;;) {
-	if (next->b_count != 0)
-	    fprintf (stderr, "check_and_free_buffer_mem: not free buffer "
-		"(%d, %ld, %ld, %d)\n", next->b_dev, next->b_blocknr, 
-		next->b_size, next->b_count);
-
-	if (buffer_dirty (next) && buffer_uptodate (next))
-	    fprintf (stderr, "check_and_free_buffer_mem: dirty buffer "
-		"(%d %lu) found\n", next->b_dev, next->b_blocknr);
-
-	freemem (next->b_data);
-	count++;
-	next = next->b_next;
-	if (next == list)
-            break;
-    }
-    return count;
-}
-
-static void check_and_free_buffer_mem (void)
-{
-    int count = 0;
-    struct buffer_head * next ;
-
-//    printf("check and free buffer mem, hits %d misses %d reads %d writes %d\n", 
-//	    buffer_hits, buffer_misses, buffer_reads, buffer_writes) ;
-    /*sync_buffers (0, 0);*/
-
-    count = _check_and_free_buffer_list(Buffer_list_head);
-    count += _check_and_free_buffer_list(g_free_buffers);
-
-    if (count != g_nr_buffers)
-       die ("check_and_free_buffer_mem: found %d buffers, must be %d", 
-	    count, g_nr_buffers);
-
-    /* free buffer heads */
-    while ((next = g_buffer_heads)) {
-	g_buffer_heads = *(struct buffer_head **)
-		(next + GROW_BUFFERS__NEW_BUFERS_PER_CALL);
-
-	freemem (next);
-    }
-  
-    return;
-}
-
-
-/* */
-void free_buffers (void)
-{
-    check_and_free_buffer_mem ();
-}
-
-
-static void _invalidate_buffer_list(struct buffer_head *list, int dev)
-{
-    struct buffer_head * next;
-
-    if (!list)
-	return;
-
-    next = list;
-
-    for (;;) {
-	if (next->b_dev == dev) {
-	    if (buffer_dirty (next) || next->b_count)
-		fprintf (stderr, "invalidate_buffers: dirty buffer or used buffer (%d %lu) found\n",
-			 next->b_count, next->b_blocknr);
-	    next->b_state = 0;
-	    remove_from_hash_queue (next);
-	}
-	next = next->b_next;
-	if (next == list)
-	    break;
-    }
-}
-
-/* forget all buffers of the given device */
-void invalidate_buffers (int dev)
-{
-    _invalidate_buffer_list(Buffer_list_head, dev) ;
-    _invalidate_buffer_list(g_free_buffers, dev) ;
-}
diff --git a/lib/misc.c b/lib/misc.c
deleted file mode 100644
index 04a4d88..0000000
--- a/lib/misc.c
+++ /dev/null
@@ -1,986 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#define _GNU_SOURCE
-
-#include "misc.h"
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <mntent.h>
-#include <sys/vfs.h>
-#include <time.h>
-#include <utime.h>
-#include <ctype.h>
-#include <linux/hdreg.h>
-#include <dirent.h>
-#include <assert.h>
-
-#include <sys/ioctl.h>
-#include <signal.h>
-
-
-/* Debian modifications by Ed Boraas <ed@debian.org> */
-#include <sys/mount.h>
-/* End Debian mods */
-
-#define STAT_FIELD(Field, Type)						\
-inline Type misc_device_##Field(char *device) {				\
-	struct stat st;							\
-									\
-	if (stat(device, &st) == 0)					\
-		return st.st_##Field;					\
-									\
-	fprintf(stderr, "Stat of the device '%s' failed.", device);	\
-	exit(8);							\
-}
-
-STAT_FIELD(mode, mode_t);
-STAT_FIELD(rdev, dev_t);
-STAT_FIELD(size, off_t);
-STAT_FIELD(blocks, blkcnt_t);
-
-void die (char * fmt, ...)
-{
-    static char buf[1024];
-    va_list args;
-
-    va_start (args, fmt);
-    vsprintf (buf, fmt, args);
-    va_end (args);
-
-    fprintf (stderr, "\n%s\n", buf);
-    abort ();
-}
-
-
-#define MEM_BEGIN "_mem_begin_"
-#define MEM_END "mem_end"
-#define MEM_FREED "__free_"
-#define CONTROL_SIZE (strlen (MEM_BEGIN) + 1 + sizeof (int) + strlen (MEM_END) + 1)
-
-
-unsigned int get_mem_size(char *p) {
-    char *begin;
-    
-    begin = p - strlen (MEM_BEGIN) - 1 - sizeof(int);
-    return *(int *)(begin + strlen (MEM_BEGIN) + 1);
-}
-
-
-void checkmem (char * p, int size)
-{
-    char * begin;
-    char * end;
-  
-    begin = p - strlen (MEM_BEGIN) - 1 - sizeof (int);
-    if (strcmp (begin, MEM_BEGIN))
-	die ("checkmem: memory corrupted - invalid head sign");
-
-    if (*(int *)(begin + strlen (MEM_BEGIN) + 1) != size)
-	die ("checkmem: memory corrupted - invalid size");
-
-    end = begin + size + CONTROL_SIZE - strlen (MEM_END) - 1;
-    if (strcmp (end, MEM_END))
-	die ("checkmem: memory corrupted - invalid end sign");
-}
-
-
-void *getmem (int size)
-{
-    char * mem;
-
-    if ((mem = mem_alloc(size)) == NULL)
-	die ("getmem: no more memory (%d)", size);
-    
-    memset (mem, 0, size);
-//    checkmem (mem, size);
-
-    return mem;
-}
-
-void *mem_alloc(int size) {
-    char * p;
-    char * mem;
-
-    p = (char *)malloc (CONTROL_SIZE + size);
-    if (!p)
-	die ("getmem: no more memory (%d)", size);
-
-    /* Write the MEM_BEGIN magic in the beginning of allocated memory. */
-    strcpy (p, MEM_BEGIN);
-    p += strlen (MEM_BEGIN) + 1;
-    /* Write the size after the magic. */
-    *(int *)p = size;
-    p += sizeof (int);
-    mem = p;
-    p += size;
-    strcpy (p, MEM_END);
-
-    return mem;
-}
-
-void * expandmem (void * vp, int size, int by)
-{
-    int allocated;
-    char * mem, * p = vp;
-    int expand_by = by;
-
-    if (p) {
-	checkmem (p, size);
-	allocated = CONTROL_SIZE + size;
-	p -= (strlen (MEM_BEGIN) + 1 + sizeof (int));
-    } else {
-	allocated = 0;
-	/* add control bytes to the new allocated area */
-	expand_by += CONTROL_SIZE;
-    }
-    p = realloc (p, allocated + expand_by);
-    if (!p)
-	die ("expandmem: no more memory (%d)", size);
-    if (!vp) {
-	strcpy (p, MEM_BEGIN);
-    }
-    mem = p + strlen (MEM_BEGIN) + 1 + sizeof (int);
-
-    *(int *)(p + strlen (MEM_BEGIN) + 1) = size + by;
-    /* fill new allocated area by 0s */
-    if(by > 0)
-        memset (mem + size, 0, by);
-    strcpy (mem + size + by, MEM_END);
-//    checkmem (mem, size + by);
-
-    return mem;
-}
-
-
-void freemem (void * vp)
-{
-    char * p = vp;
-    int size;
-  
-    if (!p)
-	return;
-    size = get_mem_size (vp);
-    checkmem (p, size);
-
-    p -= (strlen (MEM_BEGIN) + 1 + sizeof (int));
-    strcpy (p, MEM_FREED);
-    strcpy (p + size + CONTROL_SIZE - strlen (MEM_END) - 1, MEM_FREED);
-    free (p);
-}
-
-
-typedef int (*func_t) (char *);
-
-/* Lookup the @file in the @mntfile. @file is mntent.mnt_fsname if @fsname 
-   is set; mntent.mnt_dir otherwise. Return the mnt entry from the @mntfile.
-   
-   Warning: if the root fs is mounted RO, the content of /etc/mtab may be 
-   not correct. */
-static struct mntent *misc_mntent_lookup(char *mntfile, 
-					 char *file, 
-					 int path) 
-{
-	struct mntent *mnt;
-	int name_match = 0;
-	struct stat st;
-	dev_t rdev = 0;
-	dev_t dev = 0;
-	ino_t ino = 0;
-	char *name;
-	FILE *fp;
-	
-	assert(mntfile != NULL);
-	assert(file != NULL);
-
-	if (stat(file, &st) == 0) {
-		/* Devices is stated. */
-		if (S_ISBLK(st.st_mode)) {
-			rdev = st.st_rdev;
-		} else {
-			dev = st.st_dev;
-			ino = st.st_ino;
-		}
-	}
-
-	if ((fp = setmntent(mntfile, "r")) == NULL)
-		return INVAL_PTR;
-
-	while ((mnt = getmntent(fp)) != NULL) {
-		/* Check if names match. */
-		name = path ? mnt->mnt_dir : mnt->mnt_fsname;
-		
-		if (strcmp(file, name) == 0)
-			name_match = 1;
-
-		if (stat(name, &st))
-			continue;
-		
-		/* If names do not match, check if stats match. */
-		if (!name_match) {
-			if (rdev && S_ISBLK(st.st_mode)) {
-				if (rdev != st.st_rdev)
-					continue;
-			} else if (dev && !S_ISBLK(st.st_mode)) {
-				if (dev != st.st_dev ||
-				    ino != st.st_ino)
-					continue;
-			} else {
-				continue;
-			}
-		}
-
-		/* If not path and not block device do not check anything more. */
-		if (!path && !rdev) 
-			break;
-
-		if (path) {
-			/* Either names or stats match. Make sure the st_dev of 
-			   the path is same as @mnt_fsname device rdev. */
-			if (stat(mnt->mnt_fsname, &st) == 0 && 
-			    dev == st.st_rdev)
-				break;
-		} else {
-			/* Either names or stats match. Make sure the st_dev of 
-			   the mount entry is same as the given device rdev. */
-			if (stat(mnt->mnt_dir, &st) == 0 && 
-			    rdev == st.st_dev)
-				break;
-		}
-	}
-
-	endmntent (fp);
-        return mnt;
-}
-
-static int misc_root_mounted(char *device) {
-	struct stat rootst, devst;
-	
-	assert(device != NULL);
-
-	if (stat("/", &rootst) != 0) 
-		return -1;
-
-	if (stat(device, &devst) != 0)
-		return -1;
-
-	if (!S_ISBLK(devst.st_mode) || 
-	    devst.st_rdev != rootst.st_dev)
-		return 0;
-
-	return 1;
-}
-
-static int misc_file_ro(char *file) {
-	if (utime(file, 0) == -1) {
-		if (errno == EROFS)
-			return 1;
-	}
-
-	return 0;
-}
-
-struct mntent *misc_mntent(char *device) {
-	int proc = 0, path = 0, root = 0;
-	
-	struct mntent *mnt;
-	struct statfs stfs;
-
-	assert(device != NULL);
-	
-	/* Check if the root. */
-	if (misc_root_mounted(device) == 1)
-		root = 1;
-	
-#ifdef __linux__
-	/* Check if /proc is procfs. */
-	if (statfs("/proc", &stfs) == 0 && stfs.f_type == 0x9fa0) {
-		proc = 1;
-		
-		if (root) {
-			/* Lookup the "/" entry in /proc/mounts. Special 
-			   case as root entry can present as:
-				rootfs / rootfs rw 0 0
-			   Look up the mount point in this case. */
-			mnt = misc_mntent_lookup("/proc/mounts", "/", 1);
-		} else {
-			/* Lookup the @device /proc/mounts */
-			mnt = misc_mntent_lookup("/proc/mounts", device, 0);
-		}
-		
-		if (mnt == INVAL_PTR) 
-			proc = 0;
-		else if (mnt)
-			return mnt;
-	}
-#endif /* __linux__ */
-
-#if defined(MOUNTED) || defined(_PATH_MOUNTED)
-
-#ifndef MOUNTED
-    #define MOUNTED _PATH_MOUNTED
-#endif
-	/* Check in MOUNTED (/etc/mtab) if RW. */
-	if (!misc_file_ro(MOUNTED)) {
-		path = 1;
-
-		if (root) {
-			mnt = misc_mntent_lookup(MOUNTED, "/", 1);
-		} else {
-			mnt = misc_mntent_lookup(MOUNTED, device, 0);
-		}
-
-		if (mnt == INVAL_PTR) 
-			path = 0;
-		else if (mnt)
-			return mnt;
-	}
-#endif /* defined(MOUNTED) || defined(_PATH_MOUNTED) */
-	
-	/* If has not been checked in neither /proc/mounts nor /etc/mtab (or 
-	   errors have occured), return INVAL_PTR, NULL otherwise. */
-	return (!proc && !path) ? INVAL_PTR : NULL;
-}
-
-int misc_device_mounted(char *device) {
-	struct mntent *mnt;
-	
-	/* Check for the "/" first to avoid any possible problem with 
-	   reflecting the root fs info in mtab files. */
-	if (misc_root_mounted(device) == 1) {
-		return misc_file_ro("/") ? MF_RO : MF_RW;
-	}
-	
-	/* Lookup the mount entry. */
-	if ((mnt = misc_mntent(device)) == NULL) {
-		return MF_NOT_MOUNTED;
-	} else if (mnt == INVAL_PTR) {
-		return 0;
-	}
-
-	return hasmntopt(mnt, MNTOPT_RO) ? MF_RO : MF_RW;
-}
-
-char buf1 [100];
-char buf2 [100];
-
-void print_how_fast (unsigned long passed, unsigned long total,
-		     int cursor_pos, int reset_time)
-{
-    static time_t t0 = 0, t1 = 0, t2 = 0;
-    int speed;
-    int indent;
-
-    if (reset_time)
-	time (&t0);
-
-    time (&t1);
-    if (t1 != t0) {
-	speed = passed / (t1 - t0);
-	if (total - passed) {
-	    if (t1 - t2 < 1)
-	        return;
-	    t2 = t1;
-	}	
-    } else
-	speed = 0;
-
-    /* what has to be written */
-    if (total)
-      sprintf (buf1, "left %lu, %d /sec", total - passed, speed);
-    else {
-	/*(*passed) ++;*/
-	sprintf (buf1, "done %lu, %d /sec", passed, speed);
-    }
-    
-    /* make indent */
-    indent = 79 - cursor_pos - strlen (buf1);
-    memset (buf2, ' ', indent);
-    buf2[indent] = 0;
-    fprintf (stderr, "%s%s", buf2, buf1);
-
-    memset (buf2, '\b', indent + strlen (buf1));
-    buf2 [indent + strlen (buf1)] = 0;
-    fprintf (stderr, "%s", buf2);
-    fflush (stderr);
-}
-
-
-static char * strs[] =
-{"0%",".",".",".",".","20%",".",".",".",".","40%",".",".",".",".","60%",".",".",".",".","80%",".",".",".",".","100%"};
-
-static char progress_to_be[1024];
-static char current_progress[1024];
-
-static void str_to_be (char * buf, int prosents)
-{
-    int i;
-    prosents -= prosents % 4;
-    buf[0] = 0;
-    for (i = 0; i <= prosents / 4; i ++)
-	strcat (buf, strs[i]);
-}
-
-
-void print_how_far (FILE * fp,
-		    unsigned long * passed, unsigned long total,
-		    unsigned int inc, int quiet)
-{
-    int percent;
-
-    if (*passed == 0)
-	current_progress[0] = 0;
-
-    (*passed) += inc;
-    if (*passed > total) {
-/*	fprintf (fp, "\nprint_how_far: total %lu has been reached already. cur=%lu\n",
-	total, *passed);*/
-	return;
-    }
-
-    percent = ((*passed) * 100) / total;
-
-    str_to_be (progress_to_be, percent);
-
-    if (strlen (current_progress) != strlen (progress_to_be)) {
-	fprintf (fp, "%s", progress_to_be + strlen (current_progress));
-    }
-
-    strcat (current_progress, progress_to_be + strlen (current_progress));
-
-    if (!quiet) {
-	print_how_fast(*passed /* - inc*/, total, strlen (progress_to_be),
-	    (*passed == inc) ? 1 : 0);
-    }
-
-    fflush (fp);
-}
-
-#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
-/* Note! Despite this call being called with *64, it must be encoded to
- * return only sizeof(size_t), since in earlier kernel versions it was
- * declared _IOR(0x12, 114, sizeof(u64)), making it use sizeof(sizeof(u64)).
- *
- * However, the call itself does always return 64bit!
- */
-#   define BLKGETSIZE64 _IOR(0x12, 114, size_t)
-#endif
-
-/* To not have problem with last sectors on the block device when switching 
-   to smaller one. */
-#define MAX_BS (64 * 1024)
-
-int valid_offset( int fd, loff_t offset) {
-    char ch;
-    loff_t res;
-
-    /*res = reiserfs_llseek (fd, offset, 0);*/
-    res = lseek (fd, offset, SEEK_SET);
-    if (res < 0)
-	return 0;
-
-    /* if (read (fd, &ch, 1) < 0) does not wirk on files */
-    if (read (fd, &ch, 1) < 1)
-	return 0;
-
-
-    return 1;
-}
-
-/* calculates number of blocks in a file. Returns 0 for "sparse"
-   regular files and files other than regular files and block devices */
-unsigned long count_blocks (char * filename, int blocksize)
-{
-    loff_t high, low;
-    unsigned long sz;
-    __u64 size;
-    int fd;
-
-    if (!S_ISBLK(misc_device_mode(filename)) && 
-	!S_ISREG(misc_device_mode(filename)))
-	return 0;
-
-    fd = open (filename, O_RDONLY);
-    if (fd == -1) {
-	fprintf(stderr, "Failed to open '%s': %s.\n", filename, strerror(errno));
-	return 0;
-    }
-
-#ifdef BLKGETSIZE64
-    {
-	if (ioctl (fd, BLKGETSIZE64, &size) >= 0) {
-	    size = (size / MAX_BS) * MAX_BS / blocksize;
-	    sz = size;
-	    if ((__u64)sz != size)
-		    die ("count_blocks: block device too large");
-
-	    close(fd);
-	    return sz;
-	}
-    }
-#endif
-
-
-#ifdef BLKGETSIZE
-    {
-	if (ioctl (fd, BLKGETSIZE, &sz) >= 0) {
-	    size = sz;
-
-	    close(fd);
-	    return (size * 512 / MAX_BS) * MAX_BS / blocksize;
-	}
-    }
-#endif
-
-    low = 0;
-    for( high = 1; valid_offset (fd, high); high *= 2 )
-	low = high;
-    while (low < high - 1) {
-	const loff_t mid = ( low + high ) / 2;
-
-	if (valid_offset (fd, mid))
-	    low = mid;
-	else
-	    high = mid;
-    }
-    
-    valid_offset (fd, 0);
-
-    close (fd);
-    return (low + 1) * MAX_BS / MAX_BS / blocksize;
-}
-
-/* there are masks for certain bits  */
-__u16 mask16 (int from, int count)
-{
-    __u16 mask;
-
-
-    mask = (0xffff >> from);
-    mask <<= from;
-    mask <<= (16 - from - count);
-    mask >>= (16 - from - count);
-    return mask;
-}
-
-
-__u32 mask32 (int from, int count)
-{
-    __u32 mask;
-
-
-    mask = (0xffffffff >> from);
-    mask <<= from;
-    mask <<= (32 - from - count);
-    mask >>= (32 - from - count);
-    return mask;
-}
-
-
-__u64 mask64 (int from, int count)
-{
-    __u64 mask;
-
-
-    mask = (0xffffffffffffffffLL >> from);
-    mask <<= from;
-    mask <<= (64 - from - count);
-    mask >>= (64 - from - count);
-    return mask;
-}
-
-
-__u32 get_random (void)
-{
-    srandom (time (0));
-    return random ();
-}
-
-/* this implements binary search in the array 'base' among 'num' elements each
-   of those is 'width' bytes long. 'comp_func' is used to compare keys */
-int reiserfs_bin_search (void * key, void * base, __u32 num, int width,
-			 __u32 * ppos, comparison_fn_t comp_func)
-{
-    __u32 rbound, lbound, j;
-    int ret;
-
-    if (num == 0 || base == NULL) {
-	/* objectid map may be 0 elements long */
-	*ppos = 0;
-	return POSITION_NOT_FOUND;
-    }
-
-    lbound = 0;
-    rbound = num - 1;
-
-    for (j = (rbound + lbound) / 2; lbound <= rbound; j = (rbound + lbound) / 2) {
-	ret =  comp_func ((void *)((char *)base + j * width), key ) ;
-	if (ret < 0) { /* second is greater */
-	    lbound = j + 1;
-	    continue;
-
-	} else if (ret > 0) { /* first is greater */
-	    if (j == 0)
-	    	break;
-	    rbound = j - 1;
-	    continue;
-	} else { /* equal */
-	    *ppos = j;
-	    return POSITION_FOUND;
-	}
-    }
-
-    *ppos = lbound;
-    return POSITION_NOT_FOUND;
-}
-
-
-#define BLOCKLIST__ELEMENT_NUMBER 10
-
-/*element is block number and device*/
-int blockdev_list_compare (const void * block1, const void * block2) {
-    if (*(__u32 *)block1 < *(__u32 *)block2)
-        return -1;
-    if (*(__u32 *)block1 > *(__u32 *)block2)
-        return 1;
-        
-    if (*((__u32 *)block1 + 1) < *((__u32 *)block2 + 1))
-        return -1;        
-    if (*((__u32 *)block1 + 1) > *((__u32 *)block2 + 1))
-        return 1;
-        
-    return 0;
-}
-
-void blocklist__insert_in_position (void *elem, void **base, __u32 *count, 
-    int elem_size, __u32 *position) 
-{
-    if (elem_size == 0)
-    	return;
-    	
-    if (*base == NULL)
-        *base = getmem (BLOCKLIST__ELEMENT_NUMBER * elem_size);
-    
-    if (*count == get_mem_size((void *)*base) / elem_size)
-        *base = expandmem (*base, get_mem_size((void *)*base), 
-                        BLOCKLIST__ELEMENT_NUMBER * elem_size);
-    
-    if (*position < *count) {
-        memmove (*base + (*position + 1), 
-                 *base + (*position),
-                 (*count - *position) * elem_size);
-    }
-
-    memcpy (*base + (char) *position * elem_size, elem, elem_size);
-    *count+=1;
-}
-
-/* 0 - dma is not supported, scsi or regular file */
-/* 1 - xt drive                                   */
-/* 2 - ide drive */
-static void get_dma_support(dma_info_t *dma_info){
-    if (S_ISREG(dma_info->st.st_mode))
-	dma_info->st.st_rdev = dma_info->st.st_dev;
-
-    if (IDE_DISK_MAJOR(major(dma_info->st.st_rdev))) {
-        dma_info->support_type = 2;
-	return;
-    }
-    
-#ifdef XT_DISK_MAJOR
-    if (major(dma_info->st.st_rdev) == XT_DISK_MAJOR) {
-	dma_info->support_type = 1;
-	return;
-    }
-#endif    
-    dma_info->support_type = 0;
-}
-
-/* 
- * Return values: 
- * 0 - ok;
- * 1 - preparation cannot be done 
- * -1 - preparation failed
- */
-
-int prepare_dma_check(dma_info_t *dma_info) {
-    DIR *dir;
-    struct dirent *dirent;
-    struct stat st;
-    dev_t rdev;
-    int rem;
-    char buf[256];
-
-#ifndef HDIO_GET_DMA
-        return -1;
-#endif
-	
-    if (fstat(dma_info->fd, &dma_info->st))
-	die("stat on device failed\n");
-   
-    get_dma_support(dma_info);
-   
-    /* dma should be supported */
-    if (dma_info->support_type == 0)
-	return 1;
-    
-    if (dma_info->support_type == 2) {
-	rdev = dma_info->st.st_rdev;
-
-	if ((rem = (minor(rdev) % 64)) != 0) {
-	    rdev -= rem;
-	    if(!(dir = opendir("/dev/"))) {
-		dma_info->support_type = 1;
-		return 0;
-	    }
-	    
-	    while ((dirent = readdir(dir)) != NULL) {
-		if (strncmp(dirent->d_name, ".", 1) == 0 || strncmp(dirent->d_name, "..", 2) == 0)
-		    continue;
-		memset(buf, 0, 256);
-		strncat(buf, "/dev/", 5);
-		strncat(buf, dirent->d_name, strlen(dirent->d_name));
-		
-		if (stat(buf, &st))
-		    break;
-		
-		if (S_ISBLK(st.st_mode) && st.st_rdev == rdev) 
-		{
-		    dma_info->st = st;
-		    dma_info->fd = open(buf, O_RDONLY
-#if defined(O_LARGEFILE)
-					| O_LARGEFILE
-#endif
-					);
-		    closedir(dir);
-		    return 0;
-		}
-	    }
-	    closedir(dir);
-	    dma_info->support_type = 1;
-	    return 1;
-	}
-    }
-    
-    return 0;
-}
-
-static int is_dma_on (int fd) {
-#ifdef HDIO_GET_DMA    
-    static long parm;
-    if (ioctl(fd, HDIO_GET_DMA, &parm))
-	return -1;
-    else 
-	return parm;
-#endif
-    return 0;
-}
-
-
-static __u64 dma_speed(int fd, int support_type) {
-    static struct hd_driveid id;
-    __u64 speed = 0;
-            
-    if (support_type != 2) 
-	return 0;
-
-#ifdef HDIO_OBSOLETE_IDENTITY
-    if (!ioctl(fd, HDIO_GET_IDENTITY, &id) || 
-	!ioctl(fd, HDIO_OBSOLETE_IDENTITY)) {
-#else
-    if (!ioctl(fd, HDIO_GET_IDENTITY, &id)) {
-#endif
-	speed |= (__u64)id.dma_1word &  ~(__u64)0xff;
-	speed |= ((__u64)id.dma_mword & ~(__u64)0xff) << 16;
-	speed |= ((__u64)id.dma_ultra & ~(__u64)0xff) << 32;
-    } else if (errno == -ENOMSG)
-	return -1;
-    else 
-	return -1;
-    
-    return speed;
-}
-
-int get_dma_info(dma_info_t *dma_info) {
-    if ((dma_info->dma = is_dma_on(dma_info->fd)) == -1)
-	return -1;
-    if ((dma_info->speed = dma_speed(dma_info->fd, dma_info->support_type)) == (__u64)-1) 
-	return -1;
-    return 0;
-}
-
-void clean_after_dma_check(int fd, dma_info_t *dma_info) {
-    signal(SIGALRM, SIG_IGN);
-    if (dma_info->fd && fd != dma_info->fd)
-	close(dma_info->fd);
-}
-
-/* Only le bitops operations are used. */
-
-inline int misc_set_bit (unsigned long long nr, void * addr) {
-    __u8 * p, mask;
-    int retval;
-
-    p = (__u8 *)addr;
-    p += nr >> 3;
-    mask = 1 << (nr & 0x7);
-    /*cli();*/
-    retval = (mask & *p) != 0;
-    *p |= mask;
-    /*sti();*/
-    return retval;
-}
-
-
-inline int misc_clear_bit (unsigned long long nr, void * addr) {
-    __u8 * p, mask;
-    int retval;
-
-    p = (__u8 *)addr;
-    p += nr >> 3;
-    mask = 1 << (nr & 0x7);
-    /*cli();*/
-    retval = (mask & *p) != 0;
-    *p &= ~mask;
-    /*sti();*/
-    return retval;
-}
-
-inline int misc_test_bit(unsigned long long nr, const void * addr) {
-    __u8 * p, mask;
-
-    p = (__u8 *)addr;
-    p += nr >> 3;
-    mask = 1 << (nr & 0x7);
-    return ((mask & *p) != 0);
-}
-
-inline unsigned long long misc_find_first_zero_bit (const void *vaddr, 
-    unsigned long long size) 
-{
-    const __u8 *p = vaddr, *addr = vaddr;
-    unsigned long long res;
-
-    if (!size)
-        return 0;
-
-    size = (size >> 3) + ((size & 0x7) > 0);
-    while (*p++ == 255) {
-        if (--size == 0)
-            return (unsigned long long)(p - addr) << 3;
-    }
-
-    --p;
-    for (res = 0; res < 8; res++)
-        if (!misc_test_bit (res, p))
-            break;
-    return res + (p - addr) * 8;
-}
-
-
-inline unsigned long long misc_find_next_zero_bit (const void *vaddr, 
-    unsigned long long size, unsigned long long offset) 
-{
-    const __u8 *addr = vaddr;
-    const __u8 *p = addr + (offset >> 3);
-    int bit = offset & 7;
-    unsigned long long res;
-
-    if (offset >= size)
-        return size;
-
-    if (bit) {
-        /* Look for zero in first char */
-        for (res = bit; res < 8; res++)
-            if (!misc_test_bit (res, p))
-                return res + (p - addr) * 8;
-        p++;
-    }
-    /* No zero yet, search remaining full bytes for a zero */
-    res = misc_find_first_zero_bit (p, size - 8 * (p - addr));
-    return res + (p - addr) * 8;
-}
-
-inline unsigned long long misc_find_first_set_bit (const void *vaddr, 
-    unsigned long long size) 
-{
-    const __u8 *p = vaddr, *addr = vaddr;
-    unsigned long long res;
-
-    if (!size)
-        return 0;
-
-    size = (size >> 3) + ((size & 0x7) > 0);
-    while (*p++ == 0) {
-        if (--size == 0)
-            return (unsigned long long)(p - addr) << 3;
-    }
-
-    --p;
-    for (res = 0; res < 8; res++)
-        if (misc_test_bit (res, p))
-            break;
-
-    return res + (p - addr) * 8;
-}
-
-inline unsigned long long misc_find_next_set_bit(const void *vaddr, 
-    unsigned long long size, unsigned long long offset)
-{
-    const __u8 *addr = vaddr;
-    const __u8 *p = addr + (offset >> 3);
-    int bit = offset & 7;
-    unsigned long long res;
-
-    if (offset >= size)
-        return size;
-
-    if (bit) {
-        /* Look for zero in first char */
-        for (res = bit; res < 8; res++)
-            if (misc_test_bit (res, p))
-                return res + (p - addr) * 8;
-        p++;
-    }
-    /* No set bit yet, search remaining full bytes for a 1 */
-    res = misc_find_first_set_bit (p, size - 8 * (p - addr));
-    return res + (p - addr) * 8;
-}
-
-#include "credits.h"
-
-/* Reads the "CREDITS" file and prints one paragraph from it. */
-void misc_print_credit(FILE *out) {
-    char *line;
-    __u32 num1, num2;
-    
-    fprintf(out, "A pair of credits:\n");
-    
-    srandom (time (0));
-    
-    num1 = random() % CREDITS_COUNT;
-    line = credits[num1];
-    fprintf(out, "%s\n", line);
-    
-    while ((num1 == (num2 = random() % CREDITS_COUNT))) {}
-    
-    line = credits[num2];
-    
-    fprintf(out, "%s\n", line);
-}
-
-int user_confirmed (FILE * fp, char * q, char * yes) {
-    char * answer = 0;
-    size_t n = 0;
-
-    fprintf (fp, "%s", q);
-    if (getline (&answer, &n, stdin) != (ssize_t)strlen (yes) || strcmp (yes, answer))
-	return 0;
-
-    return 1;
-}
diff --git a/libmisc/Makefile.am b/libmisc/Makefile.am
new file mode 100644
index 0000000..1af1535
--- /dev/null
+++ b/libmisc/Makefile.am
@@ -0,0 +1,6 @@
+noinst_LIBRARIES		= libmisc-static.a
+
+libmisc_static_a_SOURCES	= bitops.c device.c malloc.c misc.c
+libmisc_static_a_CFLAGS		= @CFLAGS@
+
+INCLUDES			= -I$(top_srcdir)/include
diff --git a/libmisc/Makefile.in b/libmisc/Makefile.in
new file mode 100644
index 0000000..9614f14
--- /dev/null
+++ b/libmisc/Makefile.in
@@ -0,0 +1,451 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(libmisc_static_a_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = libmisc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libmisc_static_a_AR = $(AR) $(ARFLAGS)
+libmisc_static_a_LIBADD =
+am_libmisc_static_a_OBJECTS = libmisc_static_a-bitops.$(OBJEXT) \
+	libmisc_static_a-device.$(OBJEXT) \
+	libmisc_static_a-malloc.$(OBJEXT) \
+	libmisc_static_a-misc.$(OBJEXT)
+libmisc_static_a_OBJECTS = $(am_libmisc_static_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libmisc_static_a_SOURCES)
+DIST_SOURCES = $(libmisc_static_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LIBRARIES = libmisc-static.a
+libmisc_static_a_SOURCES = bitops.c device.c malloc.c misc.c
+libmisc_static_a_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  libmisc/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  libmisc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libmisc-static.a: $(libmisc_static_a_OBJECTS) $(libmisc_static_a_DEPENDENCIES) 
+	-rm -f libmisc-static.a
+	$(libmisc_static_a_AR) libmisc-static.a $(libmisc_static_a_OBJECTS) $(libmisc_static_a_LIBADD)
+	$(RANLIB) libmisc-static.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-bitops.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-device.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-malloc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmisc_static_a-misc.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+libmisc_static_a-bitops.o: bitops.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-bitops.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-bitops.Tpo" -c -o libmisc_static_a-bitops.o `test -f 'bitops.c' || echo '$(srcdir)/'`bitops.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo" "$(DEPDIR)/libmisc_static_a-bitops.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bitops.c' object='libmisc_static_a-bitops.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-bitops.o `test -f 'bitops.c' || echo '$(srcdir)/'`bitops.c
+
+libmisc_static_a-bitops.obj: bitops.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-bitops.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-bitops.Tpo" -c -o libmisc_static_a-bitops.obj `if test -f 'bitops.c'; then $(CYGPATH_W) 'bitops.c'; else $(CYGPATH_W) '$(srcdir)/bitops.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo" "$(DEPDIR)/libmisc_static_a-bitops.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-bitops.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bitops.c' object='libmisc_static_a-bitops.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-bitops.obj `if test -f 'bitops.c'; then $(CYGPATH_W) 'bitops.c'; else $(CYGPATH_W) '$(srcdir)/bitops.c'; fi`
+
+libmisc_static_a-device.o: device.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-device.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-device.Tpo" -c -o libmisc_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-device.Tpo" "$(DEPDIR)/libmisc_static_a-device.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-device.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='device.c' object='libmisc_static_a-device.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c
+
+libmisc_static_a-device.obj: device.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-device.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-device.Tpo" -c -o libmisc_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-device.Tpo" "$(DEPDIR)/libmisc_static_a-device.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-device.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='device.c' object='libmisc_static_a-device.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`
+
+libmisc_static_a-malloc.o: malloc.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-malloc.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-malloc.Tpo" -c -o libmisc_static_a-malloc.o `test -f 'malloc.c' || echo '$(srcdir)/'`malloc.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo" "$(DEPDIR)/libmisc_static_a-malloc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='malloc.c' object='libmisc_static_a-malloc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-malloc.o `test -f 'malloc.c' || echo '$(srcdir)/'`malloc.c
+
+libmisc_static_a-malloc.obj: malloc.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-malloc.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-malloc.Tpo" -c -o libmisc_static_a-malloc.obj `if test -f 'malloc.c'; then $(CYGPATH_W) 'malloc.c'; else $(CYGPATH_W) '$(srcdir)/malloc.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo" "$(DEPDIR)/libmisc_static_a-malloc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-malloc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='malloc.c' object='libmisc_static_a-malloc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-malloc.obj `if test -f 'malloc.c'; then $(CYGPATH_W) 'malloc.c'; else $(CYGPATH_W) '$(srcdir)/malloc.c'; fi`
+
+libmisc_static_a-misc.o: misc.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-misc.o -MD -MP -MF "$(DEPDIR)/libmisc_static_a-misc.Tpo" -c -o libmisc_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-misc.Tpo" "$(DEPDIR)/libmisc_static_a-misc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-misc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='misc.c' object='libmisc_static_a-misc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c
+
+libmisc_static_a-misc.obj: misc.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -MT libmisc_static_a-misc.obj -MD -MP -MF "$(DEPDIR)/libmisc_static_a-misc.Tpo" -c -o libmisc_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libmisc_static_a-misc.Tpo" "$(DEPDIR)/libmisc_static_a-misc.Po"; else rm -f "$(DEPDIR)/libmisc_static_a-misc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='misc.c' object='libmisc_static_a-misc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmisc_static_a_CFLAGS) $(CFLAGS) -c -o libmisc_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-noinstLIBRARIES ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libmisc/bitops.c b/libmisc/bitops.c
new file mode 100644
index 0000000..d70a73b
--- /dev/null
+++ b/libmisc/bitops.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "misc/bitops.h"
+#include "misc/types.h"
+
+/* Only le bitops operations are used. */
+inline int misc_set_bit (unsigned long long nr, void * addr) {
+    __u8 * p, mask;
+    int retval;
+
+    p = (__u8 *)addr;
+    p += nr >> 3;
+    mask = 1 << (nr & 0x7);
+    /*cli();*/
+    retval = (mask & *p) != 0;
+    *p |= mask;
+    /*sti();*/
+    return retval;
+}
+
+
+inline int misc_clear_bit (unsigned long long nr, void * addr) {
+    __u8 * p, mask;
+    int retval;
+
+    p = (__u8 *)addr;
+    p += nr >> 3;
+    mask = 1 << (nr & 0x7);
+    /*cli();*/
+    retval = (mask & *p) != 0;
+    *p &= ~mask;
+    /*sti();*/
+    return retval;
+}
+
+inline int misc_test_bit(unsigned long long nr, const void * addr) {
+    __u8 * p, mask;
+
+    p = (__u8 *)addr;
+    p += nr >> 3;
+    mask = 1 << (nr & 0x7);
+    return ((mask & *p) != 0);
+}
+
+inline unsigned long long misc_find_first_zero_bit (const void *vaddr, 
+    unsigned long long size) 
+{
+    const __u8 *p = vaddr, *addr = vaddr;
+    unsigned long long res;
+
+    if (!size)
+        return 0;
+
+    size = (size >> 3) + ((size & 0x7) > 0);
+    while (*p++ == 255) {
+        if (--size == 0)
+            return (unsigned long long)(p - addr) << 3;
+    }
+
+    --p;
+    for (res = 0; res < 8; res++)
+        if (!misc_test_bit (res, p))
+            break;
+    return res + (p - addr) * 8;
+}
+
+
+inline unsigned long long misc_find_next_zero_bit (const void *vaddr, 
+    unsigned long long size, unsigned long long offset) 
+{
+    const __u8 *addr = vaddr;
+    const __u8 *p = addr + (offset >> 3);
+    int bit = offset & 7;
+    unsigned long long res;
+
+    if (offset >= size)
+        return size;
+
+    if (bit) {
+        /* Look for zero in first char */
+        for (res = bit; res < 8; res++)
+            if (!misc_test_bit (res, p))
+                return res + (p - addr) * 8;
+        p++;
+    }
+    /* No zero yet, search remaining full bytes for a zero */
+    res = misc_find_first_zero_bit (p, size - 8 * (p - addr));
+    return res + (p - addr) * 8;
+}
+
+inline unsigned long long misc_find_first_set_bit (const void *vaddr, 
+    unsigned long long size) 
+{
+    const __u8 *p = vaddr, *addr = vaddr;
+    unsigned long long res;
+
+    if (!size)
+        return 0;
+
+    size = (size >> 3) + ((size & 0x7) > 0);
+    while (*p++ == 0) {
+        if (--size == 0)
+            return (unsigned long long)(p - addr) << 3;
+    }
+
+    --p;
+    for (res = 0; res < 8; res++)
+        if (misc_test_bit (res, p))
+            break;
+
+    return res + (p - addr) * 8;
+}
+
+inline unsigned long long misc_find_next_set_bit(const void *vaddr, 
+    unsigned long long size, unsigned long long offset)
+{
+    const __u8 *addr = vaddr;
+    const __u8 *p = addr + (offset >> 3);
+    int bit = offset & 7;
+    unsigned long long res;
+
+    if (offset >= size)
+        return size;
+
+    if (bit) {
+        /* Look for zero in first char */
+        for (res = bit; res < 8; res++)
+            if (misc_test_bit (res, p))
+                return res + (p - addr) * 8;
+        p++;
+    }
+    /* No set bit yet, search remaining full bytes for a 1 */
+    res = misc_find_first_set_bit (p, size - 8 * (p - addr));
+    return res + (p - addr) * 8;
+}
+
+/* there are masks for certain bits  */
+__u16 mask16 (int from, int count)
+{
+    __u16 mask;
+
+
+    mask = (0xffff >> from);
+    mask <<= from;
+    mask <<= (16 - from - count);
+    mask >>= (16 - from - count);
+    return mask;
+}
+
+
+__u32 mask32 (int from, int count)
+{
+    __u32 mask;
+
+
+    mask = (0xffffffff >> from);
+    mask <<= from;
+    mask <<= (32 - from - count);
+    mask >>= (32 - from - count);
+    return mask;
+}
+
+
+__u64 mask64 (int from, int count)
+{
+    __u64 mask;
+
+
+    mask = (0xffffffffffffffffLL >> from);
+    mask <<= from;
+    mask <<= (64 - from - count);
+    mask >>= (64 - from - count);
+    return mask;
+}
diff --git a/libmisc/device.c b/libmisc/device.c
new file mode 100644
index 0000000..0b37fb8
--- /dev/null
+++ b/libmisc/device.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "misc/device.h"
+#include "misc/misc.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#define MISC_DEVICE_STAT(Field, Type)					\
+Type misc_device_##Field(char *device) {				\
+	struct stat st;							\
+									\
+	if (stat(device, &st) == 0)					\
+		return st.st_##Field;					\
+									\
+	fprintf(stderr, "Stat of the device '%s' failed.\n", device);	\
+	return (Type)-1;						\
+}
+
+MISC_DEVICE_STAT(mode, mode_t);
+MISC_DEVICE_STAT(rdev, dev_t);
+
+int misc_device_valid_offset(int fd, long long int offset) {
+    long long int res;
+    char ch;
+
+    /*res = reiserfs_llseek (fd, offset, 0);*/
+    res = lseek (fd, (off_t)offset, SEEK_SET);
+    if (res < 0)
+	return 0;
+
+    /* if (read (fd, &ch, 1) < 0) does not wirk on files */
+    if (read (fd, &ch, 1) < 1)
+	return 0;
+
+
+    return 1;
+}
+
+/* To not have problem with last sectors on the block device when switching 
+   to smaller one. */
+#define MAX_BS (64 * 1024)
+
+/* calculates number of blocks in a file. Returns 0 for "sparse"
+   regular files and files other than regular files and block devices */
+unsigned long misc_device_count_blocks (char * filename, int blocksize)
+{
+    long long int high, low;
+    int fd;
+
+    fd = open (filename, O_RDONLY);
+    if (fd == -1) {
+	fprintf(stderr, "Failed to open '%s': %s.\n", filename, strerror(errno));
+	return 0;
+    }
+
+    if (!S_ISBLK(misc_device_mode(filename)) && 
+	!S_ISREG(misc_device_mode(filename))) 
+    {
+	close(fd);
+	return 0;
+    }
+
+#ifdef BLKGETSIZE64
+    {
+	unsigned long long size;
+	unsigned long sz;
+	
+	if (ioctl (fd, BLKGETSIZE64, &size) >= 0) {
+	    size = (size / MAX_BS) * MAX_BS / blocksize;
+	    sz = size;
+	    if ((unsigned long long)sz != size)
+		    misc_die ("misc_device_count_blocks: block device too large");
+
+	    close(fd);
+	    return sz;
+	}
+    }
+#endif
+
+
+#ifdef BLKGETSIZE
+    {
+	unsigned long long size;
+	unsigned long sz;
+	
+	if (ioctl (fd, BLKGETSIZE, &sz) >= 0) {
+	    size = sz;
+
+	    close(fd);
+	    return (size * 512 / MAX_BS) * MAX_BS / blocksize;
+	}
+    }
+#endif
+
+    low = 0;
+    for( high = 1; misc_device_valid_offset (fd, high); high *= 2 )
+	low = high;
+    while (low < high - 1) {
+	const long long int mid = ( low + high ) / 2;
+
+	if (misc_device_valid_offset (fd, mid))
+	    low = mid;
+	else
+	    high = mid;
+    }
+    
+    misc_device_valid_offset (fd, 0);
+
+    close (fd);
+    return (low + 1) * MAX_BS / MAX_BS / blocksize;
+}
+
+char misc_device_typec (unsigned short mode)
+{
+    if (S_ISBLK ((mode_t)mode))
+	return 'b';
+    if (S_ISCHR (mode))
+	return 'c';
+    if (S_ISDIR (mode))
+	return 'd';
+    if (S_ISREG (mode))
+	return '-';
+    if (S_ISFIFO (mode))
+	return 'p';
+    if (S_ISLNK (mode))
+	return 'l';
+    if (S_ISSOCK (mode))
+	return 's';
+    return '?';
+}
+
diff --git a/libmisc/malloc.c b/libmisc/malloc.c
new file mode 100644
index 0000000..8ed3679
--- /dev/null
+++ b/libmisc/malloc.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "misc/malloc.h"
+#include "misc/misc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#define MEM_BEGIN "_mem_begin_"
+#define MEM_END "mem_end"
+#define MEM_FREED "__free_"
+#define CONTROL_SIZE (strlen (MEM_BEGIN) + 1 + sizeof (int) + strlen (MEM_END) + 1)
+
+
+unsigned int misc_memsize(char *p) {
+    char *begin;
+    
+    begin = p - strlen (MEM_BEGIN) - 1 - sizeof(int);
+    return *(int *)(begin + strlen (MEM_BEGIN) + 1);
+}
+
+
+void misc_checkmem (char * p, int size)
+{
+    char * begin;
+    char * end;
+  
+    begin = p - strlen (MEM_BEGIN) - 1 - sizeof (int);
+    if (strcmp (begin, MEM_BEGIN))
+	misc_die ("misc_checkmem: memory corrupted - invalid head sign");
+
+    if (*(int *)(begin + strlen (MEM_BEGIN) + 1) != size)
+	misc_die ("misc_checkmem: memory corrupted - invalid size");
+
+    end = begin + size + CONTROL_SIZE - strlen (MEM_END) - 1;
+    if (strcmp (end, MEM_END))
+	misc_die ("misc_checkmem: memory corrupted - invalid end sign");
+}
+
+
+void *misc_getmem (int size)
+{
+    char * mem;
+
+    if ((mem = misc_malloc(size)) == NULL)
+	misc_die ("misc_getmem: no more memory (%d)", size);
+    
+    memset (mem, 0, size);
+//    misc_checkmem (mem, size);
+
+    return mem;
+}
+
+void *misc_malloc(int size) {
+    char * p;
+    char * mem;
+
+    p = (char *)malloc (CONTROL_SIZE + size);
+    if (!p)
+	misc_die ("misc_getmem: no more memory (%d)", size);
+
+    /* Write the MEM_BEGIN magic in the beginning of allocated memory. */
+    strcpy (p, MEM_BEGIN);
+    p += strlen (MEM_BEGIN) + 1;
+    /* Write the size after the magic. */
+    *(int *)p = size;
+    p += sizeof (int);
+    mem = p;
+    p += size;
+    strcpy (p, MEM_END);
+
+    return mem;
+}
+
+void * misc_expandmem (void * vp, int size, int by)
+{
+    int allocated;
+    char * mem, * p = vp;
+    int expand_by = by;
+
+    if (p) {
+	misc_checkmem (p, size);
+	allocated = CONTROL_SIZE + size;
+	p -= (strlen (MEM_BEGIN) + 1 + sizeof (int));
+    } else {
+	allocated = 0;
+	/* add control bytes to the new allocated area */
+	expand_by += CONTROL_SIZE;
+    }
+    p = realloc (p, allocated + expand_by);
+    if (!p)
+	misc_die ("misc_expandmem: no more memory (%d)", size);
+    if (!vp) {
+	strcpy (p, MEM_BEGIN);
+    }
+    mem = p + strlen (MEM_BEGIN) + 1 + sizeof (int);
+
+    *(int *)(p + strlen (MEM_BEGIN) + 1) = size + by;
+    /* fill new allocated area by 0s */
+    if(by > 0)
+        memset (mem + size, 0, by);
+    strcpy (mem + size + by, MEM_END);
+//    misc_checkmem (mem, size + by);
+
+    return mem;
+}
+
+
+void misc_freemem (void * vp)
+{
+    char * p = vp;
+    int size;
+  
+    if (!p)
+	return;
+    size = misc_memsize (vp);
+    misc_checkmem (p, size);
+
+    p -= (strlen (MEM_BEGIN) + 1 + sizeof (int));
+    strcpy (p, MEM_FREED);
+    strcpy (p + size + CONTROL_SIZE - strlen (MEM_END) - 1, MEM_FREED);
+    free (p);
+}
+
+
diff --git a/libmisc/misc.c b/libmisc/misc.c
new file mode 100644
index 0000000..b5f50d3
--- /dev/null
+++ b/libmisc/misc.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "misc/malloc.h"
+#include "misc/misc.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <string.h>
+
+void misc_die (char * fmt, ...)
+{
+    static char buf[4096];
+    va_list args;
+
+    va_start (args, fmt);
+    vsprintf (buf, fmt, args);
+    va_end (args);
+
+    fprintf (stderr, "\n%s\n", buf);
+    abort ();
+}
+
+
+__u32 misc_random (void)
+{
+    srandom (time (0));
+    return random ();
+}
+
+/* this implements binary search in the array 'base' among 'num' elements each
+   of those is 'width' bytes long. 'comp_func' is used to compare keys */
+int misc_bin_search (const void * key, void * base, __u32 num, int width,
+		     int * ppos, misc_comp_func_t comp_func)
+{
+    __u32 rbound, lbound, j;
+    int ret;
+
+    if (num == 0 || base == NULL) {
+	/* objectid map may be 0 elements long */
+	*ppos = 0;
+	return 0;
+    }
+
+    lbound = 0;
+    rbound = num - 1;
+
+    for (j = (rbound + lbound) / 2; lbound <= rbound; j = (rbound + lbound) / 2) {
+	ret =  comp_func ((void *)((char *)base + j * width), key ) ;
+	if (ret < 0) { /* second is greater */
+	    lbound = j + 1;
+	    continue;
+
+	} else if (ret > 0) { /* first is greater */
+	    if (j == 0)
+	    	break;
+	    rbound = j - 1;
+	    continue;
+	} else { /* equal */
+	    *ppos = j;
+	    return 1;
+	}
+    }
+
+    *ppos = lbound;
+    return 0;
+}
+
+
+#define BLOCKLIST__ELEMENT_NUMBER 10
+
+/*element is block number and device*/
+int blockdev_list_compare (const void * block1, const void * block2) {
+    if (*(__u32 *)block1 < *(__u32 *)block2)
+        return -1;
+    if (*(__u32 *)block1 > *(__u32 *)block2)
+        return 1;
+        
+    if (*((__u32 *)block1 + 1) < *((__u32 *)block2 + 1))
+        return -1;        
+    if (*((__u32 *)block1 + 1) > *((__u32 *)block2 + 1))
+        return 1;
+        
+    return 0;
+}
+
+void blocklist__insert_in_position (void *elem, void **base, __u32 *count, 
+    int elem_size, int *position) 
+{
+    if (elem_size == 0)
+    	return;
+    	
+    if (*base == NULL)
+        *base = misc_getmem (BLOCKLIST__ELEMENT_NUMBER * elem_size);
+    
+    if (*count == misc_memsize((void *)*base) / elem_size)
+        *base = misc_expandmem (*base, misc_memsize((void *)*base), 
+                        BLOCKLIST__ELEMENT_NUMBER * elem_size);
+    
+    if (*position < *count) {
+        memmove (*base + (*position + 1), 
+                 *base + (*position),
+                 (*count - *position) * elem_size);
+    }
+
+    memcpy (*base + (char) *position * elem_size, elem, elem_size);
+    *count+=1;
+}
+
+int misc_device_rdev_match(char *path, void *data) {
+    dev_t *rdev = (dev_t *)data;
+    struct stat st;
+
+    /* If stat fails just continue walking. */
+    if (stat(path, &st))
+	return 0;
+
+    /* Only block files are interesting. */
+    if (!S_ISBLK(st.st_mode))
+	return 0;
+
+    /* Matched rdev wanted. */
+    if (st.st_rdev != *rdev)
+	return 0;
+
+    /* Stop walking. */
+    return 1;
+}
+
+
+/* The method walks through all subtree of the path, 
+   open all directories and walk through them recursevely.
+
+   Return values:
+   positive: stop walking;
+   negative: error occured.
+ */
+int misc_dir_walk(char *path, dir_walk_func_t func, void *data) {
+	struct dirent *dirent;
+	struct stat st;
+	off_t pos;
+	DIR *dir;
+	int len;
+	int res;
+
+	strcat(path, "/");
+
+	if (!(dir = opendir(path)))
+		return 0;
+	
+	len = strlen(path);
+	
+	while ((dirent = readdir(dir)) != NULL) {
+		path[len] = 0;
+
+		if (strcmp(dirent->d_name, ".") == 0 || 
+		    strcmp(dirent->d_name, "..") == 0)
+		{
+			continue;
+		}
+
+		strcat(path, dirent->d_name);
+
+		if ((res = func(path, data))) {
+			closedir(dir);
+			return res;
+		}
+
+		if (stat(path, &st) != 0)
+			continue;
+
+		if ((S_ISDIR(st.st_mode))) {
+			pos = telldir(dir);
+			closedir(dir);
+			
+			if ((res = misc_dir_walk(path, func, data)))
+				return res;
+
+			path[len] = 0;
+			if (!(dir = opendir(path)))
+				return -1;
+
+			seekdir(dir, pos);
+		}
+	}
+
+	closedir(dir);
+	return 0;
+}
+
diff --git a/libreiserfs/Makefile.am b/libreiserfs/Makefile.am
new file mode 100644
index 0000000..1db9362
--- /dev/null
+++ b/libreiserfs/Makefile.am
@@ -0,0 +1,22 @@
+libreiserfs_sources		= badblock.c    fix_node.c     leaf.c               stat.c	 \
+				  bitmap.c      hash.c         leaf_balance.c       buffer.c     \
+				  internal.c    libreiserfs.c  internal_balance.c   super.c	 \
+				  direntry.c    node.c         tree.c	            extent.c	 \
+				  journal.c     objmap.c       tree_balance.c       filesystem.c \
+				  key.c         prints.c
+
+#lib_LIBRARIES			= libreiserfs.la
+noinst_LIBRARIES		= libreiserfs-static.a
+
+#libreiserfs_la_LIBADD		= $(top_builddir)/libmisc/libmisc-static.la
+#libreiserfs_la_SOURCES		= $(libreiserfs_sources)
+# libreiserfs_la_LDFLAGS	= -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
+#				  -release $(LT_RELEASE)
+#libreiserfs_la_CFLAGS		= @CFLAGS@
+
+libreiserfs_static_a_LIBADD	= $(top_builddir)/libmisc/libmisc-static.a 
+libreiserfs_static_a_SOURCES	= $(libreiserfs_sources)
+#libreiserfs_static_a_LDFLAGS	= -static
+libreiserfs_static_a_CFLAGS	= @CFLAGS@
+
+INCLUDES			= -I$(top_srcdir)/include
diff --git a/libreiserfs/Makefile.in b/libreiserfs/Makefile.in
new file mode 100644
index 0000000..eb6b189
--- /dev/null
+++ b/libreiserfs/Makefile.in
@@ -0,0 +1,758 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(libreiserfs_static_a_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = libreiserfs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libreiserfs_static_a_AR = $(AR) $(ARFLAGS)
+libreiserfs_static_a_DEPENDENCIES =  \
+	$(top_builddir)/libmisc/libmisc-static.a
+am__objects_1 = libreiserfs_static_a-badblock.$(OBJEXT) \
+	libreiserfs_static_a-fix_node.$(OBJEXT) \
+	libreiserfs_static_a-leaf.$(OBJEXT) \
+	libreiserfs_static_a-stat.$(OBJEXT) \
+	libreiserfs_static_a-bitmap.$(OBJEXT) \
+	libreiserfs_static_a-hash.$(OBJEXT) \
+	libreiserfs_static_a-leaf_balance.$(OBJEXT) \
+	libreiserfs_static_a-buffer.$(OBJEXT) \
+	libreiserfs_static_a-internal.$(OBJEXT) \
+	libreiserfs_static_a-libreiserfs.$(OBJEXT) \
+	libreiserfs_static_a-internal_balance.$(OBJEXT) \
+	libreiserfs_static_a-super.$(OBJEXT) \
+	libreiserfs_static_a-direntry.$(OBJEXT) \
+	libreiserfs_static_a-node.$(OBJEXT) \
+	libreiserfs_static_a-tree.$(OBJEXT) \
+	libreiserfs_static_a-extent.$(OBJEXT) \
+	libreiserfs_static_a-journal.$(OBJEXT) \
+	libreiserfs_static_a-objmap.$(OBJEXT) \
+	libreiserfs_static_a-tree_balance.$(OBJEXT) \
+	libreiserfs_static_a-filesystem.$(OBJEXT) \
+	libreiserfs_static_a-key.$(OBJEXT) \
+	libreiserfs_static_a-prints.$(OBJEXT)
+am_libreiserfs_static_a_OBJECTS = $(am__objects_1)
+libreiserfs_static_a_OBJECTS = $(am_libreiserfs_static_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libreiserfs_static_a_SOURCES)
+DIST_SOURCES = $(libreiserfs_static_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+libreiserfs_sources = badblock.c    fix_node.c     leaf.c               stat.c	 \
+				  bitmap.c      hash.c         leaf_balance.c       buffer.c     \
+				  internal.c    libreiserfs.c  internal_balance.c   super.c	 \
+				  direntry.c    node.c         tree.c	            extent.c	 \
+				  journal.c     objmap.c       tree_balance.c       filesystem.c \
+				  key.c         prints.c
+
+
+#lib_LIBRARIES			= libreiserfs.la
+noinst_LIBRARIES = libreiserfs-static.a
+
+#libreiserfs_la_LIBADD		= $(top_builddir)/libmisc/libmisc-static.la
+#libreiserfs_la_SOURCES		= $(libreiserfs_sources)
+# libreiserfs_la_LDFLAGS	= -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
+#				  -release $(LT_RELEASE)
+#libreiserfs_la_CFLAGS		= @CFLAGS@
+libreiserfs_static_a_LIBADD = $(top_builddir)/libmisc/libmisc-static.a 
+libreiserfs_static_a_SOURCES = $(libreiserfs_sources)
+#libreiserfs_static_a_LDFLAGS	= -static
+libreiserfs_static_a_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  libreiserfs/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  libreiserfs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libreiserfs-static.a: $(libreiserfs_static_a_OBJECTS) $(libreiserfs_static_a_DEPENDENCIES) 
+	-rm -f libreiserfs-static.a
+	$(libreiserfs_static_a_AR) libreiserfs-static.a $(libreiserfs_static_a_OBJECTS) $(libreiserfs_static_a_LIBADD)
+	$(RANLIB) libreiserfs-static.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-badblock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-bitmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-buffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-direntry.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-extent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-filesystem.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-fix_node.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-hash.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-internal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-internal_balance.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-journal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-key.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-leaf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-leaf_balance.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-libreiserfs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-node.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-objmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-prints.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-stat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-super.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-tree.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libreiserfs_static_a-tree_balance.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+libreiserfs_static_a-badblock.o: badblock.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-badblock.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" -c -o libreiserfs_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" "$(DEPDIR)/libreiserfs_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='badblock.c' object='libreiserfs_static_a-badblock.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c
+
+libreiserfs_static_a-badblock.obj: badblock.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-badblock.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" -c -o libreiserfs_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo" "$(DEPDIR)/libreiserfs_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-badblock.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='badblock.c' object='libreiserfs_static_a-badblock.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi`
+
+libreiserfs_static_a-fix_node.o: fix_node.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-fix_node.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" -c -o libreiserfs_static_a-fix_node.o `test -f 'fix_node.c' || echo '$(srcdir)/'`fix_node.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" "$(DEPDIR)/libreiserfs_static_a-fix_node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='fix_node.c' object='libreiserfs_static_a-fix_node.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-fix_node.o `test -f 'fix_node.c' || echo '$(srcdir)/'`fix_node.c
+
+libreiserfs_static_a-fix_node.obj: fix_node.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-fix_node.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" -c -o libreiserfs_static_a-fix_node.obj `if test -f 'fix_node.c'; then $(CYGPATH_W) 'fix_node.c'; else $(CYGPATH_W) '$(srcdir)/fix_node.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo" "$(DEPDIR)/libreiserfs_static_a-fix_node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-fix_node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='fix_node.c' object='libreiserfs_static_a-fix_node.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-fix_node.obj `if test -f 'fix_node.c'; then $(CYGPATH_W) 'fix_node.c'; else $(CYGPATH_W) '$(srcdir)/fix_node.c'; fi`
+
+libreiserfs_static_a-leaf.o: leaf.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" -c -o libreiserfs_static_a-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='leaf.c' object='libreiserfs_static_a-leaf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c
+
+libreiserfs_static_a-leaf.obj: leaf.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" -c -o libreiserfs_static_a-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='leaf.c' object='libreiserfs_static_a-leaf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi`
+
+libreiserfs_static_a-stat.o: stat.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-stat.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" -c -o libreiserfs_static_a-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" "$(DEPDIR)/libreiserfs_static_a-stat.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='stat.c' object='libreiserfs_static_a-stat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c
+
+libreiserfs_static_a-stat.obj: stat.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-stat.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" -c -o libreiserfs_static_a-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo" "$(DEPDIR)/libreiserfs_static_a-stat.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-stat.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='stat.c' object='libreiserfs_static_a-stat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi`
+
+libreiserfs_static_a-bitmap.o: bitmap.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-bitmap.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" -c -o libreiserfs_static_a-bitmap.o `test -f 'bitmap.c' || echo '$(srcdir)/'`bitmap.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-bitmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bitmap.c' object='libreiserfs_static_a-bitmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-bitmap.o `test -f 'bitmap.c' || echo '$(srcdir)/'`bitmap.c
+
+libreiserfs_static_a-bitmap.obj: bitmap.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-bitmap.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" -c -o libreiserfs_static_a-bitmap.obj `if test -f 'bitmap.c'; then $(CYGPATH_W) 'bitmap.c'; else $(CYGPATH_W) '$(srcdir)/bitmap.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-bitmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-bitmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bitmap.c' object='libreiserfs_static_a-bitmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-bitmap.obj `if test -f 'bitmap.c'; then $(CYGPATH_W) 'bitmap.c'; else $(CYGPATH_W) '$(srcdir)/bitmap.c'; fi`
+
+libreiserfs_static_a-hash.o: hash.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-hash.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" -c -o libreiserfs_static_a-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" "$(DEPDIR)/libreiserfs_static_a-hash.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hash.c' object='libreiserfs_static_a-hash.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c
+
+libreiserfs_static_a-hash.obj: hash.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-hash.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" -c -o libreiserfs_static_a-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo" "$(DEPDIR)/libreiserfs_static_a-hash.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-hash.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hash.c' object='libreiserfs_static_a-hash.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`
+
+libreiserfs_static_a-leaf_balance.o: leaf_balance.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf_balance.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" -c -o libreiserfs_static_a-leaf_balance.o `test -f 'leaf_balance.c' || echo '$(srcdir)/'`leaf_balance.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='leaf_balance.c' object='libreiserfs_static_a-leaf_balance.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf_balance.o `test -f 'leaf_balance.c' || echo '$(srcdir)/'`leaf_balance.c
+
+libreiserfs_static_a-leaf_balance.obj: leaf_balance.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-leaf_balance.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" -c -o libreiserfs_static_a-leaf_balance.obj `if test -f 'leaf_balance.c'; then $(CYGPATH_W) 'leaf_balance.c'; else $(CYGPATH_W) '$(srcdir)/leaf_balance.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-leaf_balance.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='leaf_balance.c' object='libreiserfs_static_a-leaf_balance.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-leaf_balance.obj `if test -f 'leaf_balance.c'; then $(CYGPATH_W) 'leaf_balance.c'; else $(CYGPATH_W) '$(srcdir)/leaf_balance.c'; fi`
+
+libreiserfs_static_a-buffer.o: buffer.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-buffer.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" -c -o libreiserfs_static_a-buffer.o `test -f 'buffer.c' || echo '$(srcdir)/'`buffer.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" "$(DEPDIR)/libreiserfs_static_a-buffer.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='buffer.c' object='libreiserfs_static_a-buffer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-buffer.o `test -f 'buffer.c' || echo '$(srcdir)/'`buffer.c
+
+libreiserfs_static_a-buffer.obj: buffer.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-buffer.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" -c -o libreiserfs_static_a-buffer.obj `if test -f 'buffer.c'; then $(CYGPATH_W) 'buffer.c'; else $(CYGPATH_W) '$(srcdir)/buffer.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo" "$(DEPDIR)/libreiserfs_static_a-buffer.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-buffer.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='buffer.c' object='libreiserfs_static_a-buffer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-buffer.obj `if test -f 'buffer.c'; then $(CYGPATH_W) 'buffer.c'; else $(CYGPATH_W) '$(srcdir)/buffer.c'; fi`
+
+libreiserfs_static_a-internal.o: internal.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" -c -o libreiserfs_static_a-internal.o `test -f 'internal.c' || echo '$(srcdir)/'`internal.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='internal.c' object='libreiserfs_static_a-internal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal.o `test -f 'internal.c' || echo '$(srcdir)/'`internal.c
+
+libreiserfs_static_a-internal.obj: internal.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" -c -o libreiserfs_static_a-internal.obj `if test -f 'internal.c'; then $(CYGPATH_W) 'internal.c'; else $(CYGPATH_W) '$(srcdir)/internal.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='internal.c' object='libreiserfs_static_a-internal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal.obj `if test -f 'internal.c'; then $(CYGPATH_W) 'internal.c'; else $(CYGPATH_W) '$(srcdir)/internal.c'; fi`
+
+libreiserfs_static_a-libreiserfs.o: libreiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-libreiserfs.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" -c -o libreiserfs_static_a-libreiserfs.o `test -f 'libreiserfs.c' || echo '$(srcdir)/'`libreiserfs.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='libreiserfs.c' object='libreiserfs_static_a-libreiserfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-libreiserfs.o `test -f 'libreiserfs.c' || echo '$(srcdir)/'`libreiserfs.c
+
+libreiserfs_static_a-libreiserfs.obj: libreiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-libreiserfs.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" -c -o libreiserfs_static_a-libreiserfs.obj `if test -f 'libreiserfs.c'; then $(CYGPATH_W) 'libreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/libreiserfs.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo" "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-libreiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='libreiserfs.c' object='libreiserfs_static_a-libreiserfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-libreiserfs.obj `if test -f 'libreiserfs.c'; then $(CYGPATH_W) 'libreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/libreiserfs.c'; fi`
+
+libreiserfs_static_a-internal_balance.o: internal_balance.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal_balance.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" -c -o libreiserfs_static_a-internal_balance.o `test -f 'internal_balance.c' || echo '$(srcdir)/'`internal_balance.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='internal_balance.c' object='libreiserfs_static_a-internal_balance.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal_balance.o `test -f 'internal_balance.c' || echo '$(srcdir)/'`internal_balance.c
+
+libreiserfs_static_a-internal_balance.obj: internal_balance.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-internal_balance.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" -c -o libreiserfs_static_a-internal_balance.obj `if test -f 'internal_balance.c'; then $(CYGPATH_W) 'internal_balance.c'; else $(CYGPATH_W) '$(srcdir)/internal_balance.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-internal_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-internal_balance.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='internal_balance.c' object='libreiserfs_static_a-internal_balance.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-internal_balance.obj `if test -f 'internal_balance.c'; then $(CYGPATH_W) 'internal_balance.c'; else $(CYGPATH_W) '$(srcdir)/internal_balance.c'; fi`
+
+libreiserfs_static_a-super.o: super.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-super.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-super.Tpo" -c -o libreiserfs_static_a-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo" "$(DEPDIR)/libreiserfs_static_a-super.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='super.c' object='libreiserfs_static_a-super.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c
+
+libreiserfs_static_a-super.obj: super.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-super.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-super.Tpo" -c -o libreiserfs_static_a-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo" "$(DEPDIR)/libreiserfs_static_a-super.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-super.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='super.c' object='libreiserfs_static_a-super.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi`
+
+libreiserfs_static_a-direntry.o: direntry.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-direntry.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" -c -o libreiserfs_static_a-direntry.o `test -f 'direntry.c' || echo '$(srcdir)/'`direntry.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" "$(DEPDIR)/libreiserfs_static_a-direntry.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='direntry.c' object='libreiserfs_static_a-direntry.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-direntry.o `test -f 'direntry.c' || echo '$(srcdir)/'`direntry.c
+
+libreiserfs_static_a-direntry.obj: direntry.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-direntry.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" -c -o libreiserfs_static_a-direntry.obj `if test -f 'direntry.c'; then $(CYGPATH_W) 'direntry.c'; else $(CYGPATH_W) '$(srcdir)/direntry.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo" "$(DEPDIR)/libreiserfs_static_a-direntry.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-direntry.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='direntry.c' object='libreiserfs_static_a-direntry.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-direntry.obj `if test -f 'direntry.c'; then $(CYGPATH_W) 'direntry.c'; else $(CYGPATH_W) '$(srcdir)/direntry.c'; fi`
+
+libreiserfs_static_a-node.o: node.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-node.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-node.Tpo" -c -o libreiserfs_static_a-node.o `test -f 'node.c' || echo '$(srcdir)/'`node.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo" "$(DEPDIR)/libreiserfs_static_a-node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='node.c' object='libreiserfs_static_a-node.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-node.o `test -f 'node.c' || echo '$(srcdir)/'`node.c
+
+libreiserfs_static_a-node.obj: node.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-node.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-node.Tpo" -c -o libreiserfs_static_a-node.obj `if test -f 'node.c'; then $(CYGPATH_W) 'node.c'; else $(CYGPATH_W) '$(srcdir)/node.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo" "$(DEPDIR)/libreiserfs_static_a-node.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='node.c' object='libreiserfs_static_a-node.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-node.obj `if test -f 'node.c'; then $(CYGPATH_W) 'node.c'; else $(CYGPATH_W) '$(srcdir)/node.c'; fi`
+
+libreiserfs_static_a-tree.o: tree.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" -c -o libreiserfs_static_a-tree.o `test -f 'tree.c' || echo '$(srcdir)/'`tree.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tree.c' object='libreiserfs_static_a-tree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree.o `test -f 'tree.c' || echo '$(srcdir)/'`tree.c
+
+libreiserfs_static_a-tree.obj: tree.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" -c -o libreiserfs_static_a-tree.obj `if test -f 'tree.c'; then $(CYGPATH_W) 'tree.c'; else $(CYGPATH_W) '$(srcdir)/tree.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tree.c' object='libreiserfs_static_a-tree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree.obj `if test -f 'tree.c'; then $(CYGPATH_W) 'tree.c'; else $(CYGPATH_W) '$(srcdir)/tree.c'; fi`
+
+libreiserfs_static_a-extent.o: extent.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-extent.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" -c -o libreiserfs_static_a-extent.o `test -f 'extent.c' || echo '$(srcdir)/'`extent.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" "$(DEPDIR)/libreiserfs_static_a-extent.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extent.c' object='libreiserfs_static_a-extent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-extent.o `test -f 'extent.c' || echo '$(srcdir)/'`extent.c
+
+libreiserfs_static_a-extent.obj: extent.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-extent.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" -c -o libreiserfs_static_a-extent.obj `if test -f 'extent.c'; then $(CYGPATH_W) 'extent.c'; else $(CYGPATH_W) '$(srcdir)/extent.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo" "$(DEPDIR)/libreiserfs_static_a-extent.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-extent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extent.c' object='libreiserfs_static_a-extent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-extent.obj `if test -f 'extent.c'; then $(CYGPATH_W) 'extent.c'; else $(CYGPATH_W) '$(srcdir)/extent.c'; fi`
+
+libreiserfs_static_a-journal.o: journal.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-journal.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" -c -o libreiserfs_static_a-journal.o `test -f 'journal.c' || echo '$(srcdir)/'`journal.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" "$(DEPDIR)/libreiserfs_static_a-journal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='journal.c' object='libreiserfs_static_a-journal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-journal.o `test -f 'journal.c' || echo '$(srcdir)/'`journal.c
+
+libreiserfs_static_a-journal.obj: journal.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-journal.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" -c -o libreiserfs_static_a-journal.obj `if test -f 'journal.c'; then $(CYGPATH_W) 'journal.c'; else $(CYGPATH_W) '$(srcdir)/journal.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo" "$(DEPDIR)/libreiserfs_static_a-journal.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-journal.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='journal.c' object='libreiserfs_static_a-journal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-journal.obj `if test -f 'journal.c'; then $(CYGPATH_W) 'journal.c'; else $(CYGPATH_W) '$(srcdir)/journal.c'; fi`
+
+libreiserfs_static_a-objmap.o: objmap.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-objmap.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" -c -o libreiserfs_static_a-objmap.o `test -f 'objmap.c' || echo '$(srcdir)/'`objmap.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-objmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='objmap.c' object='libreiserfs_static_a-objmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-objmap.o `test -f 'objmap.c' || echo '$(srcdir)/'`objmap.c
+
+libreiserfs_static_a-objmap.obj: objmap.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-objmap.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" -c -o libreiserfs_static_a-objmap.obj `if test -f 'objmap.c'; then $(CYGPATH_W) 'objmap.c'; else $(CYGPATH_W) '$(srcdir)/objmap.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo" "$(DEPDIR)/libreiserfs_static_a-objmap.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-objmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='objmap.c' object='libreiserfs_static_a-objmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-objmap.obj `if test -f 'objmap.c'; then $(CYGPATH_W) 'objmap.c'; else $(CYGPATH_W) '$(srcdir)/objmap.c'; fi`
+
+libreiserfs_static_a-tree_balance.o: tree_balance.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree_balance.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" -c -o libreiserfs_static_a-tree_balance.o `test -f 'tree_balance.c' || echo '$(srcdir)/'`tree_balance.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tree_balance.c' object='libreiserfs_static_a-tree_balance.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree_balance.o `test -f 'tree_balance.c' || echo '$(srcdir)/'`tree_balance.c
+
+libreiserfs_static_a-tree_balance.obj: tree_balance.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-tree_balance.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" -c -o libreiserfs_static_a-tree_balance.obj `if test -f 'tree_balance.c'; then $(CYGPATH_W) 'tree_balance.c'; else $(CYGPATH_W) '$(srcdir)/tree_balance.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo" "$(DEPDIR)/libreiserfs_static_a-tree_balance.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-tree_balance.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tree_balance.c' object='libreiserfs_static_a-tree_balance.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-tree_balance.obj `if test -f 'tree_balance.c'; then $(CYGPATH_W) 'tree_balance.c'; else $(CYGPATH_W) '$(srcdir)/tree_balance.c'; fi`
+
+libreiserfs_static_a-filesystem.o: filesystem.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-filesystem.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" -c -o libreiserfs_static_a-filesystem.o `test -f 'filesystem.c' || echo '$(srcdir)/'`filesystem.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" "$(DEPDIR)/libreiserfs_static_a-filesystem.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='filesystem.c' object='libreiserfs_static_a-filesystem.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-filesystem.o `test -f 'filesystem.c' || echo '$(srcdir)/'`filesystem.c
+
+libreiserfs_static_a-filesystem.obj: filesystem.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-filesystem.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" -c -o libreiserfs_static_a-filesystem.obj `if test -f 'filesystem.c'; then $(CYGPATH_W) 'filesystem.c'; else $(CYGPATH_W) '$(srcdir)/filesystem.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo" "$(DEPDIR)/libreiserfs_static_a-filesystem.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-filesystem.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='filesystem.c' object='libreiserfs_static_a-filesystem.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-filesystem.obj `if test -f 'filesystem.c'; then $(CYGPATH_W) 'filesystem.c'; else $(CYGPATH_W) '$(srcdir)/filesystem.c'; fi`
+
+libreiserfs_static_a-key.o: key.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-key.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-key.Tpo" -c -o libreiserfs_static_a-key.o `test -f 'key.c' || echo '$(srcdir)/'`key.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo" "$(DEPDIR)/libreiserfs_static_a-key.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='key.c' object='libreiserfs_static_a-key.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-key.o `test -f 'key.c' || echo '$(srcdir)/'`key.c
+
+libreiserfs_static_a-key.obj: key.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-key.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-key.Tpo" -c -o libreiserfs_static_a-key.obj `if test -f 'key.c'; then $(CYGPATH_W) 'key.c'; else $(CYGPATH_W) '$(srcdir)/key.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo" "$(DEPDIR)/libreiserfs_static_a-key.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-key.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='key.c' object='libreiserfs_static_a-key.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-key.obj `if test -f 'key.c'; then $(CYGPATH_W) 'key.c'; else $(CYGPATH_W) '$(srcdir)/key.c'; fi`
+
+libreiserfs_static_a-prints.o: prints.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-prints.o -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" -c -o libreiserfs_static_a-prints.o `test -f 'prints.c' || echo '$(srcdir)/'`prints.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" "$(DEPDIR)/libreiserfs_static_a-prints.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='prints.c' object='libreiserfs_static_a-prints.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-prints.o `test -f 'prints.c' || echo '$(srcdir)/'`prints.c
+
+libreiserfs_static_a-prints.obj: prints.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -MT libreiserfs_static_a-prints.obj -MD -MP -MF "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" -c -o libreiserfs_static_a-prints.obj `if test -f 'prints.c'; then $(CYGPATH_W) 'prints.c'; else $(CYGPATH_W) '$(srcdir)/prints.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo" "$(DEPDIR)/libreiserfs_static_a-prints.Po"; else rm -f "$(DEPDIR)/libreiserfs_static_a-prints.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='prints.c' object='libreiserfs_static_a-prints.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libreiserfs_static_a_CFLAGS) $(CFLAGS) -c -o libreiserfs_static_a-prints.obj `if test -f 'prints.c'; then $(CYGPATH_W) 'prints.c'; else $(CYGPATH_W) '$(srcdir)/prints.c'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-noinstLIBRARIES ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libreiserfs/badblock.c b/libreiserfs/badblock.c
new file mode 100644
index 0000000..c2a8cec
--- /dev/null
+++ b/libreiserfs/badblock.c
@@ -0,0 +1,202 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/unaligned.h"
+#include "misc/misc.h"
+
+reiserfs_key_t badblock_key = {REISERFS_BAD_DID, REISERFS_BAD_OID, {{0, 0},}};
+
+void reiserfs_badblock_traverse(reiserfs_filsys_t * fs, 
+				badblock_func_t action, 
+				void *data) 
+{
+    reiserfs_path_t badblock_path;
+    reiserfs_key_t rd_key = badblock_key;
+    const reiserfs_key_t *key;
+    
+    badblock_path.path_length = REISERFS_PATH_OFFILL;
+    reiserfs_key_set_sec (KEY_FORMAT_2, &badblock_key, 1, TYPE_EXTENT);
+    
+    while (1) {
+	    if (reiserfs_tree_search_item (fs, &rd_key, &badblock_path) == IO_ERROR) {
+		fprintf (stderr, "%s: Some problems while searching by the key "
+			 "occured. Probably due to tree corruptions.\n",
+			 __FUNCTION__);
+		reiserfs_tree_pathrelse (&badblock_path);
+		break;
+	    }
+		    
+
+	    if (reiserfs_nh_get_items (NODE_HEAD (REISERFS_PATH_LEAF (&badblock_path))) <= 
+		REISERFS_PATH_LEAF_POS (&badblock_path)) 
+	    {
+		reiserfs_tree_pathrelse (&badblock_path);
+		break;
+	    }
+
+	    rd_key = REISERFS_PATH_IH(&badblock_path)->ih_key;
+
+	    if (reiserfs_key_get_did(&rd_key) != REISERFS_BAD_DID || 
+		reiserfs_key_get_oid(&rd_key) != REISERFS_BAD_OID ||
+		!reiserfs_key_ext(&rd_key)) 
+	    {
+		reiserfs_tree_pathrelse (&badblock_path);
+		break;
+	    }
+	
+	    if ((key = reiserfs_tree_next_key(&badblock_path, fs)))
+		rd_key = *key;
+	    else
+	        memset(&rd_key, 0, sizeof(rd_key));
+	    
+	    action(fs, &badblock_path, data);
+
+	    if (reiserfs_key_get_did(&rd_key) == 0)
+		break;
+    }
+}
+
+static void callback_badblock_rm(reiserfs_filsys_t *fs,
+				 reiserfs_path_t *badblock_path, 
+				 void *data) 
+{
+	reiserfs_tb_t tb;
+	reiserfs_ih_t * tmp_ih;
+
+	tmp_ih = REISERFS_PATH_IH(badblock_path);
+	memset (REISERFS_PATH_ITEM (badblock_path), 
+		0, reiserfs_ih_get_len (tmp_ih));
+
+	reiserfs_tb_init (&tb, fs, badblock_path, 
+			-(REISERFS_IH_SIZE + 
+			  reiserfs_ih_get_len(REISERFS_PATH_IH(badblock_path))));
+
+	if (reiserfs_fix_nodes (M_DELETE, &tb, 0) != CARRY_ON)
+		misc_die ("%s: reiserfs_fix_nodes failed", __FUNCTION__);
+
+	reiserfs_tb_balance (&tb, 0, 0, M_DELETE, 0/*zero num*/);
+}
+
+void reiserfs_badblock_extract(reiserfs_filsys_t *fs, 
+			       reiserfs_path_t *badblock_path, 
+			       void *data) 
+{
+	reiserfs_ih_t *tmp_ih;
+	__u32 *ind_item;
+	__u32 i;
+
+	if (!fs->fs_badblocks_bm) {
+		fs->fs_badblocks_bm = 
+			reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb));
+    
+		reiserfs_bitmap_zero (fs->fs_badblocks_bm);
+	}
+	
+	tmp_ih = REISERFS_PATH_IH(badblock_path);
+	ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path);
+
+	for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) {
+		reiserfs_bitmap_set_bit(fs->fs_badblocks_bm, 
+					d32_get(ind_item, i));
+	}
+	
+	reiserfs_tree_pathrelse (badblock_path);
+}
+
+static int reiserfs_alloc_blocks (reiserfs_filsys_t * fs,
+				  unsigned long *blknr,
+				  unsigned long start,
+				  int count)
+{
+    int i;
+    
+    for (i = 0; i < count; i ++) {
+	blknr[i] = 0;
+	if (reiserfs_bitmap_find_zero_bit(fs->fs_bitmap2, blknr + i))
+	    misc_die ("%s: failed to allocate a block.", __FUNCTION__);
+	
+	reiserfs_bitmap_set_bit(fs->fs_bitmap2, blknr[i]);
+    }
+    
+    return CARRY_ON;
+}
+
+void reiserfs_badblock_flush (reiserfs_filsys_t * fs, int replace) {
+    reiserfs_tb_t tb;
+    reiserfs_path_t badblock_path;
+    reiserfs_ih_t badblock_ih;
+    __u32 ni;
+
+    __u64 offset;
+    __u32 i, j;
+
+    if (fs->fs_badblocks_bm == NULL)
+    	return;
+
+    /* delete all items with badblock_key */
+    if (replace)
+	reiserfs_badblock_traverse(fs, callback_badblock_rm, NULL);
+
+    memset(&badblock_ih, 0, sizeof(badblock_ih));
+    reiserfs_ih_set_format (&badblock_ih, KEY_FORMAT_2);
+    reiserfs_ih_set_len (&badblock_ih, REISERFS_EXT_SIZE);
+    reiserfs_ih_set_free (&badblock_ih, 0);
+    reiserfs_ih_set_loc (&badblock_ih, 0);
+    reiserfs_key_set_did (&badblock_ih.ih_key, REISERFS_BAD_DID);
+    reiserfs_key_set_oid (&badblock_ih.ih_key, REISERFS_BAD_OID);
+    reiserfs_key_set_type (KEY_FORMAT_2, &badblock_ih.ih_key, TYPE_EXTENT);
+
+    j = 0;
+    
+    fs->block_allocator = reiserfs_alloc_blocks;
+    
+    /* insert all badblock pointers */
+    for (i = 0; i < fs->fs_badblocks_bm->bm_bit_size; i++) {
+        int retval;
+
+	if (!reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))	
+	    continue;
+	
+	offset = j * fs->fs_blocksize + 1;
+	reiserfs_key_set_off (KEY_FORMAT_2, &badblock_ih.ih_key, offset);
+	ni = cpu_to_le32 (i);
+	
+	retval = reiserfs_tree_search_position (fs, &badblock_ih.ih_key, 
+					      &badblock_path);
+
+	switch (retval) {
+	case (FILE_NOT_FOUND):
+		reiserfs_tb_init (&tb, fs, &badblock_path, 
+				  REISERFS_IH_SIZE + reiserfs_ih_get_len(&badblock_ih));
+		
+		if (reiserfs_fix_nodes (M_INSERT, &tb, &badblock_ih) != CARRY_ON)
+		    misc_die ("reiserfs_badblock_flush: reiserfs_fix_nodes failed");
+		
+		reiserfs_tb_balance (&tb, &badblock_ih, (void *)&ni , M_INSERT, 0);
+
+		break;
+	
+	case (POSITION_NOT_FOUND):
+	case (POSITION_FOUND):
+		/* Insert the new item to the found position. */
+	
+		reiserfs_tb_init (&tb, fs, &badblock_path, REISERFS_EXT_SIZE);
+		
+		if (reiserfs_fix_nodes (M_PASTE, &tb, 0) != CARRY_ON)
+		    misc_die ("reiserfs_badblock_flush: reiserfs_fix_nodes failed");
+
+		reiserfs_tb_balance (&tb, 0, (const char *)&ni, M_PASTE, 0);
+		break;
+	}
+	
+	j++;
+    }
+}
+
diff --git a/reiserfscore/bitmap.c b/libreiserfs/bitmap.c
similarity index 61%
rename from reiserfscore/bitmap.c
rename to libreiserfs/bitmap.c
index 771b037..d6cbac8 100644
--- a/reiserfscore/bitmap.c
+++ b/libreiserfs/bitmap.c
@@ -3,243 +3,48 @@
  * reiserfsprogs/README
  */
 
-/*
- * 2000/10/26 - Initial version.
- */
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
 
-#include "includes.h"
+#include "reiserfs/libreiserfs.h"
+#include "misc/malloc.h"
+
 #include <assert.h>
-
+#include <errno.h>
 
 /* create clean bitmap */
-reiserfs_bitmap_t * reiserfs_create_bitmap (unsigned int bit_count)
+reiserfs_bitmap_t * reiserfs_bitmap_create (unsigned int bit_count)
 {
     reiserfs_bitmap_t * bm;
 
-    bm = getmem (sizeof (*bm));
+    bm = misc_getmem (sizeof (*bm));
     if (!bm)
 	return 0;
     bm->bm_bit_size = bit_count;
     bm->bm_byte_size = ((unsigned long long)bit_count + 7) / 8;
-    bm->bm_set_bits = 0;
-    bm->bm_map = getmem (bm->bm_byte_size);
+    bm->bm_map = misc_getmem (bm->bm_byte_size);
     if (!bm->bm_map) {
-	freemem (bm);
+	misc_freemem (bm);
 	return 0;
     }
 
     return bm;
 }
 
-/* Expand existing bitmap.  Return non-zero if can't. FIXME: it is
-   assumed that bit_count is new number of blocks to be addressed */
-int reiserfs_expand_bitmap (reiserfs_bitmap_t * bm, unsigned int bit_count)
-{
-    unsigned int byte_count = ((bit_count + 7) / 8);
-    char * new_map;
-
-    new_map = expandmem (bm->bm_map, bm->bm_byte_size,
-			 byte_count - bm->bm_byte_size);
-
-    if (!new_map) {
-	return 1;
-    }
-    
-    bm->bm_map = new_map;
-    bm->bm_byte_size = byte_count;
-    bm->bm_bit_size = bit_count;
-
-    bm->bm_dirty = 1;
-
-    return 0;
-}
-
-void reiserfs_shrink_bitmap (reiserfs_bitmap_t * bm, unsigned int bit_count)
-{
-    unsigned long i;
-    
-    assert (bm->bm_bit_size >= bit_count);
-
-    bm->bm_byte_size = (bit_count + 7) / 8;
-    bm->bm_bit_size = bit_count;
-    bm->bm_set_bits = 0;
-    
-    bm->bm_dirty = 1;
-    
-    for (i = 0; i < bm->bm_bit_size; i++) {
-	if (reiserfs_bitmap_test_bit(bm, i))
-	    bm->bm_set_bits++;
-    }
-}
-
-/* bitmap destructor */
-void reiserfs_delete_bitmap (reiserfs_bitmap_t * bm)
-{
-    freemem(bm->bm_map);
-    bm->bm_map = NULL;		/* to not reuse bitmap handle */
-    bm->bm_bit_size = 0;
-    bm->bm_byte_size = 0;
-    freemem(bm);
-}
-
-
-void reiserfs_bitmap_copy (reiserfs_bitmap_t * to, reiserfs_bitmap_t * from)
-{
-    assert (to->bm_byte_size == from->bm_byte_size);
-    memcpy (to->bm_map, from->bm_map, from->bm_byte_size);
-    to->bm_bit_size = from->bm_bit_size;
-    to->bm_set_bits = from->bm_set_bits;
-    to->bm_dirty = 1;
-}
-
-int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1, reiserfs_bitmap_t * bm2)
-{
-    unsigned long i, diff;
-    unsigned long int bytes, bits;
-
-    assert (bm1->bm_byte_size == bm2->bm_byte_size &&
-	    bm1->bm_bit_size == bm2->bm_bit_size);
-
-    diff = 0;
-
-    /* compare full bytes */
-    bytes = bm1->bm_bit_size / 8;
-    bits = bytes * 8;
-    if (memcmp (bm1->bm_map, bm2->bm_map, bytes)) {
-	for (i = 0; i < bits; i ++)
-	    if (reiserfs_bitmap_test_bit(bm1, i) != reiserfs_bitmap_test_bit(bm2, i))
-		diff ++;
-    }
-    
-    /* compare last byte of bitmap which can be used partially */
-    bits = bm1->bm_bit_size % 8;
-    for (i = bm1->bm_bit_size / 8 * 8; i < bm1->bm_bit_size / 8 * 8 + bits; i ++)
-	if (reiserfs_bitmap_test_bit(bm1, i) != reiserfs_bitmap_test_bit(bm2, i))
-            diff ++;
-
-/*	int mask;
-
-	mask = 255 >> (8 - bits);
-	if ((bm1->bm_map [bytes] & mask) != (bm2->bm_map [bytes] & mask)) {
-	    diff ++;
-	}
-    }*/
-    return diff;
-}
-
-/* 
-    Does X | Y for every bit of the bitmap `to`, where 
-    X - bit of the `to` bitmap, 
-    Y - `from` bitmap. 
-    Save result in the `to` bitmap.
-*/
-void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * to, 
-    reiserfs_bitmap_t * from) 
-{
-    unsigned int i;
-
-    assert (to->bm_byte_size == from->bm_byte_size &&
-	    to->bm_bit_size == from->bm_bit_size);
-
-    for (i = 0; i < to->bm_bit_size; i++) {
-	if (misc_test_bit(i, from->bm_map) && !misc_test_bit(i, to->bm_map)) {
-	    misc_set_bit(i, to->bm_map);
-	    to->bm_set_bits ++;
-	    to->bm_dirty = 1;	
-	}
-    }
-}
-
-/* 
-    Does X & !Y for every bit of the bitmap `base`, where 
-    X - bit of the `base` bitmap, 
-    Y - `exclude` bitmap. 
-    Save result in the `base` bitmap.
-*/
-void reiserfs_bitmap_delta (reiserfs_bitmap_t * base, reiserfs_bitmap_t * exclude) {
-   unsigned int i;
-
-    assert (base->bm_byte_size == exclude->bm_byte_size &&
-	    base->bm_bit_size == exclude->bm_bit_size);
-
-    for (i = 0; i < base->bm_bit_size; i++) {
-	if (misc_test_bit(i, exclude->bm_map) && misc_test_bit(i, base->bm_map)) {
-	    misc_clear_bit(i, base->bm_map);
-	    base->bm_set_bits --;
-	    base->bm_dirty = 1;
-	}
-    }
-}
-
-void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm, unsigned int bit_number)
-{
-    assert(bit_number < bm->bm_bit_size);
-    if (misc_test_bit (bit_number, bm->bm_map))
-	return;
-    misc_set_bit(bit_number, bm->bm_map);
-    bm->bm_set_bits ++;
-    bm->bm_dirty = 1;
-}
-
-
-void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm, unsigned int bit_number)
-{
-    assert(bit_number < bm->bm_bit_size);
-    if (!misc_test_bit (bit_number, bm->bm_map))
-	return;
-    misc_clear_bit (bit_number, bm->bm_map);
-    bm->bm_set_bits --;
-    bm->bm_dirty = 1;
-}
-
-
-int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm, unsigned int bit_number)
-{
-    if (bit_number >= bm->bm_bit_size)
-	printf ("bit %u, bitsize %lu\n", bit_number, bm->bm_bit_size);
-    assert(bit_number < bm->bm_bit_size);
-    return misc_test_bit(bit_number, bm->bm_map);
-}
-
-
-unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm) {
-    return bm->bm_bit_size - bm->bm_set_bits;
-}
-
-
-unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm) {
-    return bm->bm_set_bits;
-}
-
-
-int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm, unsigned long * first)
-{
-    unsigned long bit_nr = *first;
-    assert(*first < bm->bm_bit_size);
-
-    bit_nr = misc_find_next_zero_bit(bm->bm_map, bm->bm_bit_size, *first);
-
-    if (bit_nr >= bm->bm_bit_size) { /* search failed */	
-	return 1;
-    }
-
-    *first = bit_nr;
-    return 0;
-}
-
-
 /* read every bitmap block and copy their content into bitmap 'bm' */
-static int reiserfs_fetch_ondisk_bitmap (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs)
+static int reiserfs_bitmap_fetch (reiserfs_bitmap_t * bm, 
+				  reiserfs_filsys_t * fs)
 {
     unsigned int last_byte_unused_bits;
     unsigned long block, to_copy;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     unsigned int i;
     int copied;
     int ret = 0;
     char * p;
 
-    to_copy = (get_sb_block_count (fs->fs_ondisk_sb) + 7) / 8;
+    to_copy = (reiserfs_sb_get_blocks (fs->fs_ondisk_sb) + 7) / 8;
 
     /*reiserfs_warning (stderr, "Fetching on-disk bitmap..");*/
     assert (bm->bm_byte_size == to_copy);
@@ -249,19 +54,20 @@
     block = fs->fs_super_bh->b_blocknr + 1;
 
     while (to_copy) {
-	bh = bread (fs->fs_dev, block, fs->fs_blocksize);
+	bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
 	if (!bh) {
-	    reiserfs_warning (stderr, "reiserfs_fetch_ondisk_bitmap: "
-			      "bread failed reading bitmap (%lu)\n", block);
+	    reiserfs_warning (stderr, "reiserfs_bitmap_fetch: "
+			      "reiserfs_buffer_read failed reading bitmap "
+			      "(%lu)\n", block);
 	    
-	    bh = getblk (fs->fs_dev, block, fs->fs_blocksize); 
+	    bh = reiserfs_buffer_open (fs->fs_dev, block, fs->fs_blocksize); 
 	    if (!bh) {
-		reiserfs_exit (1, "reiserfs_fetch_ondisk_bitmap: "
-			       "getblk failed");
+		reiserfs_exit (1, "reiserfs_bitmap_fetch: "
+			       "reiserfs_buffer_open failed");
 	    }
 
 	    memset (bh->b_data, 0xff, bh->b_size);
-	    mark_buffer_uptodate (bh, 1);
+	    reiserfs_buffer_mkuptodate (bh, 1);
 	}
 
 	if (to_copy < fs->fs_blocksize) {
@@ -275,13 +81,14 @@
 	    copied = to_copy;
 	}
 	memcpy (p, bh->b_data, copied); 
-	brelse (bh);
+	reiserfs_buffer_close (bh);
 	p += copied;
 	to_copy -= copied;
 
 	/* next bitmap block */
-	if (spread_bitmaps (fs))
-	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);
+	if (reiserfs_bitmap_spread (fs))
+	    block = (block / (fs->fs_blocksize * 8) + 1) * 
+		    (fs->fs_blocksize * 8);
 	else
 	    block ++;
     }
@@ -308,30 +115,85 @@
     return ret;
 }
 
+/* read bitmap blocks */
+int reiserfs_bitmap_open (reiserfs_filsys_t * fs) {
+    unsigned int bmap_nr, count;
+    
+    if (fs->fs_bitmap2)
+	reiserfs_panic ("bitmap is initiaized already");
+
+    count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb);
+    
+    fs->fs_bitmap2 = reiserfs_bitmap_create (count);
+    
+    if (!fs->fs_bitmap2)
+	return -1;
+
+    bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize);
+    bmap_nr = reiserfs_bmap_over(bmap_nr) ? 0 : bmap_nr;
+    
+    if (bmap_nr != reiserfs_sb_get_bmaps (fs->fs_ondisk_sb)) {
+	reiserfs_warning (stderr, "%s: wrong either bitmaps number,\n", 
+			  __FUNCTION__);
+	
+	reiserfs_warning (stderr, "count of blocks or blocksize, run "
+			  "with --rebuild-sb to fix it\n");
+	return -1;
+    }    	
+
+    return reiserfs_bitmap_fetch (fs->fs_bitmap2, fs);
+}
+
+/* bitmap destructor */
+void reiserfs_bitmap_delete (reiserfs_bitmap_t * bm)
+{
+    misc_freemem(bm->bm_map);
+    bm->bm_map = NULL;		/* to not reuse bitmap handle */
+    bm->bm_bit_size = 0;
+    bm->bm_byte_size = 0;
+    misc_freemem(bm);
+}
+
+void reiserfs_bitmap_free (reiserfs_filsys_t * fs)
+{
+    if (fs->fs_bitmap2) {
+	reiserfs_bitmap_delete (fs->fs_bitmap2);
+	fs->fs_bitmap2 = 0;
+    }
+}
+
+void reiserfs_bitmap_close (reiserfs_filsys_t * fs)
+{
+    if (!fs->fs_bitmap2)
+	return;
+    reiserfs_bitmap_flush (fs->fs_bitmap2, fs);
+    reiserfs_bitmap_free (fs);
+}
 
 /* copy bitmap 'bm' to buffers which hold on-disk bitmap if bitmap was ever
    changed and return 1. Otherwise - return 0 */
-int reiserfs_flush_to_ondisk_bitmap (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs)
+int reiserfs_bitmap_flush (reiserfs_bitmap_t * bm, reiserfs_filsys_t * fs)
 {
     unsigned int last_byte_unused_bits, i;
     unsigned long to_copy, copied, block;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     char * p;
 
     /* make sure that the device is big enough */
-    bh = bread (fs->fs_dev, bm->bm_bit_size - 1, fs->fs_blocksize);
+    bh = reiserfs_buffer_read (fs->fs_dev, bm->bm_bit_size - 1, fs->fs_blocksize);
     if (!bh) {
-	reiserfs_warning (stderr, "reiserfs_flush_to_ondisk_bitmap: bread failed for block %lu\n",
-			  bm->bm_bit_size - 1);
+	reiserfs_warning (stderr, "reiserfs_bitmap_flush: reiserfs_buffer_read "
+			  "failed for block %lu\n", bm->bm_bit_size - 1);
 /*
-	bh = getblk (fs->fs_dev, bm->bm_bit_size - 1, fs->fs_blocksize);
+	bh = reiserfs_buffer_open (fs->fs_dev, bm->bm_bit_size - 1, 
+			     fs->fs_blocksize);
 	if (!bh)
-	    reiserfs_panic ("reiserfs_flush_to_ondisk_bitmap: getblk failed");
-	mark_buffer_uptodate (bh, 1);
-	mark_buffer_dirty (bh);
-	bwrite (bh);*/
+	    reiserfs_panic ("reiserfs_bitmap_flush: reiserfs_buffer_open failed");
+	reiserfs_buffer_mkuptodate (bh, 1);
+	reiserfs_buffer_mkdirty (bh);
+	reiserfs_buffer_write (bh);*/
     }
-    brelse (bh);
+    reiserfs_buffer_close (bh);
 
     if (!bm->bm_dirty)
 	return 0;
@@ -343,14 +205,15 @@
     block = fs->fs_super_bh->b_blocknr + 1;
 
     while (to_copy) {
-	/* we bread to make sure that filesystem contains enough blocks */
-	bh = getblk (fs->fs_dev, block, fs->fs_blocksize);
+	/* we reiserfs_buffer_read to make sure that filesystem contains 
+	   enough blocks */
+	bh = reiserfs_buffer_open (fs->fs_dev, block, fs->fs_blocksize);
 	if (!bh) {
 	    reiserfs_exit (1, "Getblk failed for (%lu)\n", block);
 	}
 	
 	memset (bh->b_data, 0xff, bh->b_size);
-	mark_buffer_uptodate (bh, 1);
+	reiserfs_buffer_mkuptodate (bh, 1);
 
 	if (to_copy < fs->fs_blocksize)
 	    copied = to_copy;
@@ -360,16 +223,19 @@
 	    last_byte_unused_bits = bm->bm_byte_size * 8 - bm->bm_bit_size;
 
 	    for (i = 0; i < last_byte_unused_bits; i ++)
-		misc_set_bit ((bm->bm_bit_size % (fs->fs_blocksize * 8)) + i, bh->b_data);
+		misc_set_bit ((bm->bm_bit_size % (fs->fs_blocksize * 8)) + i,
+			      bh->b_data);
 	}
-	mark_buffer_dirty (bh);
-	brelse (bh);
+	
+	reiserfs_buffer_mkdirty (bh);
+	reiserfs_buffer_close (bh);
 	p += copied;
 	to_copy -= copied;
 
 	/* next bitmap block */
-	if (spread_bitmaps (fs))
-	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);
+	if (reiserfs_bitmap_spread (fs))
+	    block = (block / (fs->fs_blocksize * 8) + 1) * 
+		    (fs->fs_blocksize * 8);
 	else
 	    block ++;
     }
@@ -378,12 +244,223 @@
     return 1;
 }
 
+/* Expand existing bitmap.  Return non-zero if can't. FIXME: it is
+   assumed that bit_count is new number of blocks to be addressed */
+int reiserfs_bitmap_expand (reiserfs_bitmap_t * bm, 
+			    unsigned int bit_count)
+{
+    unsigned int byte_count = ((bit_count + 7) / 8);
+    char * new_map;
+
+    new_map = misc_expandmem (bm->bm_map, bm->bm_byte_size,
+			 byte_count - bm->bm_byte_size);
+
+    if (!new_map) {
+	return 1;
+    }
+    
+    bm->bm_map = new_map;
+    bm->bm_byte_size = byte_count;
+    bm->bm_bit_size = bit_count;
+
+    bm->bm_dirty = 1;
+
+    return 0;
+}
+
+void reiserfs_bitmap_shrink (reiserfs_bitmap_t * bm, 
+			     unsigned int bit_count)
+{
+    unsigned long i;
+    
+    assert (bm->bm_bit_size >= bit_count);
+
+    bm->bm_byte_size = (bit_count + 7) / 8;
+    bm->bm_bit_size = bit_count;
+    bm->bm_set_bits = 0;
+    if (bm->bm_first_zero > bm->bm_bit_size)
+	bm->bm_first_zero = bm->bm_bit_size;
+    
+    bm->bm_dirty = 1;
+    
+    for (i = 0; i < bm->bm_bit_size; i++) {
+	if (reiserfs_bitmap_test_bit(bm, i))
+	    bm->bm_set_bits++;
+    }
+}
+
+void reiserfs_bitmap_copy (reiserfs_bitmap_t * to, 
+			   reiserfs_bitmap_t * from)
+{
+    assert (to->bm_byte_size == from->bm_byte_size);
+    memcpy (to->bm_map, from->bm_map, from->bm_byte_size);
+    to->bm_bit_size = from->bm_bit_size;
+    to->bm_set_bits = from->bm_set_bits;
+    to->bm_first_zero = from->bm_first_zero;
+    to->bm_dirty = 1;
+}
+
+int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1, 
+			     reiserfs_bitmap_t * bm2)
+{
+    unsigned long i, diff;
+    unsigned long int bytes, bits;
+
+    assert (bm1->bm_byte_size == bm2->bm_byte_size &&
+	    bm1->bm_bit_size == bm2->bm_bit_size);
+
+    diff = 0;
+
+    /* compare full bytes */
+    bytes = bm1->bm_bit_size / 8;
+    bits = bytes * 8;
+    if (memcmp (bm1->bm_map, bm2->bm_map, bytes)) {
+	for (i = 0; i < bits; i ++)
+	    if (reiserfs_bitmap_test_bit(bm1, i) != 
+		reiserfs_bitmap_test_bit(bm2, i))
+	    {
+		diff ++;
+	    }
+    }
+    
+    /* compare last byte of bitmap which can be used partially */
+    bits = bm1->bm_bit_size % 8;
+    for (i = bm1->bm_bit_size / 8 * 8; 
+	 i < bm1->bm_bit_size / 8 * 8 + bits; 
+	 i ++)
+    {
+	if (reiserfs_bitmap_test_bit(bm1, i) != 
+	    reiserfs_bitmap_test_bit(bm2, i))
+	{
+            diff ++;
+	}
+
+/*	int mask;
+
+	mask = 255 >> (8 - bits);
+	if ((bm1->bm_map [bytes] & mask) != (bm2->bm_map [bytes] & mask)) {
+	    diff ++;
+	} */
+    }
+
+    return diff;
+}
+
+/* 
+    Does X | Y for every bit of the bitmap `to`, where 
+    X - bit of the `to` bitmap, 
+    Y - `from` bitmap. 
+    Save result in the `to` bitmap.
+*/
+void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * to, 
+    reiserfs_bitmap_t * from) 
+{
+    unsigned int i;
+
+    assert (to->bm_byte_size == from->bm_byte_size &&
+	    to->bm_bit_size == from->bm_bit_size);
+
+    for (i = 0; i < to->bm_bit_size; i++) {
+	if (misc_test_bit(i, from->bm_map) && 
+	    !misc_test_bit(i, to->bm_map)) 
+	{
+	    misc_set_bit(i, to->bm_map);
+	    to->bm_set_bits ++;
+	    to->bm_dirty = 1;	
+	}
+    }
+}
+
+/* 
+    Does X & !Y for every bit of the bitmap `base`, where 
+    X - bit of the `base` bitmap, 
+    Y - `exclude` bitmap. 
+    Save result in the `base` bitmap.
+*/
+void reiserfs_bitmap_delta (reiserfs_bitmap_t * base, 
+			    reiserfs_bitmap_t * exclude) 
+{
+   unsigned int i;
+
+    assert (base->bm_byte_size == exclude->bm_byte_size &&
+	    base->bm_bit_size == exclude->bm_bit_size);
+
+    for (i = 0; i < base->bm_bit_size; i++) {
+	if (misc_test_bit(i, exclude->bm_map) && 
+	    misc_test_bit(i, base->bm_map)) 
+	{
+	    misc_clear_bit(i, base->bm_map);
+	    base->bm_set_bits --;
+	    base->bm_dirty = 1;
+	}
+    }
+}
+
+void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm, 
+			      unsigned int bit_number)
+{
+    assert(bit_number < bm->bm_bit_size);
+    if (misc_test_bit (bit_number, bm->bm_map))
+	return;
+    misc_set_bit(bit_number, bm->bm_map);
+    bm->bm_set_bits ++;
+    bm->bm_dirty = 1;
+}
+
+
+void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm, 
+				unsigned int bit_number)
+{
+    assert(bit_number < bm->bm_bit_size);
+    if (!misc_test_bit (bit_number, bm->bm_map))
+	return;
+    misc_clear_bit (bit_number, bm->bm_map);
+    bm->bm_set_bits --;
+    bm->bm_dirty = 1;
+    if (bm->bm_first_zero > bit_number)
+	bm->bm_first_zero = bit_number;
+}
+
+
+int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm, 
+			      unsigned int bit_number)
+{
+    if (bit_number >= bm->bm_bit_size)
+	printf ("bit %u, bitsize %lu\n", bit_number, bm->bm_bit_size);
+    assert(bit_number < bm->bm_bit_size);
+    return misc_test_bit(bit_number, bm->bm_map);
+}
+
+
+int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm, 
+				   unsigned long * first)
+{
+    unsigned long bit_nr;
+    int upd;
+    
+    assert(*first < bm->bm_bit_size);
+    
+    upd = (bm->bm_first_zero >= *first) ? 1 : 0;
+    bit_nr = misc_find_next_zero_bit(bm->bm_map, bm->bm_bit_size, 
+				     upd ? bm->bm_first_zero : *first);
+
+    if (upd)
+	bm->bm_first_zero = bit_nr;
+    
+    if (bit_nr >= bm->bm_bit_size) 
+	/* search failed */	
+	return 1;
+
+    *first = bit_nr;
+    return 0;
+}
 
 void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm)
 {
     memset (bm->bm_map, 0, bm->bm_byte_size);
     bm->bm_set_bits = 0;
     bm->bm_dirty = 1;
+    bm->bm_first_zero = 0;
 }
 
 
@@ -392,8 +469,36 @@
     memset (bm->bm_map, 0xff, bm->bm_byte_size);
     bm->bm_set_bits = bm->bm_bit_size;
     bm->bm_dirty = 1;
+    bm->bm_first_zero = bm->bm_set_bits;
 }
 
+void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm)
+{
+    unsigned int i;
+
+    /*reiserfs_warning (stderr, "Bitmap inverting..");fflush (stderr);*/
+    for (i = 0; i < bm->bm_bit_size; i ++) {
+	if (reiserfs_bitmap_test_bit (bm, i))
+	    reiserfs_bitmap_clear_bit (bm, i);
+	else
+	    reiserfs_bitmap_set_bit (bm, i);
+    }
+
+    /*reiserfs_warning (stderr, "done\n");*/
+}
+
+unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm) {
+    return bm->bm_bit_size - bm->bm_set_bits;
+}
+
+
+unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm) {
+    return bm->bm_set_bits;
+}
+
+int reiserfs_bitmap_spread (reiserfs_filsys_t * fs) {
+    return fs->fs_super_bh->b_blocknr != 2;
+}
 
 /* format of bitmap saved in a file:
    magic number (32 bits)
@@ -405,26 +510,6 @@
 #define BITMAP_START_MAGIC 374031
 #define BITMAP_END_MAGIC 7786472
 
-
-FILE * open_file (char * filename, char * option)
-{
-    FILE * fp = fopen (filename, option);
-    if (!fp) {
-	reiserfs_warning (stderr, "open_file: could not open file %s\n", filename);
-	return 0;
-    }
-    reiserfs_warning (stderr, "Temp file opened by fsck: \"%s\" .. \n", filename);
-    return fp;
-}
-
-
-void close_file (FILE * fp)
-{
-    fclose (fp);
-    /*reiserfs_warning (stderr, "done\n"); fflush (stderr);*/
-}
-
-
 void reiserfs_bitmap_save (FILE * fp, reiserfs_bitmap_t * bm)
 {
 //    FILE * fp;
@@ -437,15 +522,14 @@
 
   /*  fp = fopen (filename, "w+");
     if (!fp) {
-	reiserfs_warning (stderr, "reiserfs_bitmap_save: could not save bitmap in %s: %s",
-			  filename, strerror(errno));
+	reiserfs_warning (stderr, "reiserfs_bitmap_save: could not save "
+			  "bitmap in %s: %s", filename, strerror(errno));
 	return;
     }*/
 
 
-//    reiserfs_warning (stderr, "Saving bitmap in \"%s\" .. ", filename); fflush (stderr);
-
-	
+/*  reiserfs_warning (stderr, "Saving bitmap in \"%s\" .. ", filename); 
+    fflush (stderr);*/	
 
     v = BITMAP_START_MAGIC;
     fwrite (&v, 4, 1, fp);
@@ -458,7 +542,8 @@
     position = ftell(fp);
 
     if (fseek (fp, 4, SEEK_CUR)) {
-	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s\n", strerror(errno));
+	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s\n", 
+			  strerror(errno));
 //	fclose (fp);
 	return;
     }
@@ -509,14 +594,16 @@
     fwrite (&v, 4, 1, fp);
 
     if (fseek (fp, position, SEEK_SET)) {
-	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", strerror(errno));
+	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", 
+			  strerror(errno));
 	return;
     }
 
     fwrite (&extents, 4, 1, fp);
 
     if (fseek (fp, 0, SEEK_END)) {
-	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", strerror(errno));
+	reiserfs_warning (stderr, "reiserfs_bitmap_save: fseek failed: %s", 
+			  strerror(errno));
 	return;
     }
 }
@@ -531,62 +618,6 @@
    bitmap of bad_unfm
    magic number                 (32 bits) */
 
-#define FSCK_DUMP_START_MAGIC 374033
-#define FSCK_DUMP_END_MAGIC 7786470
-
-
-void reiserfs_begin_stage_info_save(FILE * file, unsigned long stage)
-{
-    __u32 v = FSCK_DUMP_START_MAGIC;
-    fwrite (&v, 4, 1, file);
-    fwrite (&stage, 4, 1, file);
-}
-
-
-void reiserfs_end_stage_info_save(FILE * file)
-{
-    __u32 v = FSCK_DUMP_END_MAGIC;
-    fwrite (&v, 4, 1, file);
-}
-
-
-/*return last passed stage*/
-int is_stage_magic_correct (FILE * fp)
-{
-    __u32 v;
-
-    if (fseek (fp, -4, SEEK_END)) {
-	reiserfs_warning (stderr, "is_stage_magic_correct: fseek failed: %s\n", 
-	    strerror(errno));
-	return -1;
-    }
-
-    fread (&v, 4, 1, fp);
-    if (v != FSCK_DUMP_END_MAGIC) {
-	reiserfs_warning (stderr, "is_stage_magic_correct: no magic found\n");	
-	return -1;
-    }
-
-    if (fseek (fp, 0, SEEK_SET)) {
-	reiserfs_warning (stderr, "is_stage_magic_correct: fseek failed: %s\n", 
-	    strerror(errno));
-	return -1;
-    }
-
-    fread (&v, 4, 1, fp);
-    if (v != FSCK_DUMP_START_MAGIC) {
-	reiserfs_warning (stderr, "is_stage_magic_correct: no magic found\n");	
-	return -1;
-    }
-
-    fread (&v, 4, 1, fp);
-    if (v != PASS_0_DONE && v != PASS_1_DONE && v != TREE_IS_BUILT && v != SEMANTIC_DONE && v != LOST_FOUND_DONE) {
-	reiserfs_warning (stderr, "is_stage_magic_correct: wrong pass found");	
-	return -1;
-    }
-
-    return (__u16)v;
-}
 
 
 reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp)
@@ -601,7 +632,8 @@
     
 /*    fp = fopen (filename, "r");
     if (!fp) {
-	reiserfs_warning (stderr, "reiserfs_bitmap_load: fopen failed: %s\n", strerror(errno));
+	reiserfs_warning (stderr, "reiserfs_bitmap_load: fopen failed: %s\n", 
+			  strerror(errno));
 	return 0;
     }*/
 
@@ -616,7 +648,7 @@
     /* read bit size of bitmap */
     fread (&v, 4, 1, fp);
 
-    bm = reiserfs_create_bitmap (v);
+    bm = reiserfs_bitmap_create (v);
     if (!bm) {
 	reiserfs_warning (stderr, "reiserfs_bitmap_load: creation failed");	
 //	fclose (fp);
@@ -655,76 +687,73 @@
 	return 0;
     }
 
-    /*    reiserfs_warning (stderr, "%d bits set - done\n", reiserfs_bitmap_ones (bm));*/
+/*    reiserfs_warning (stderr, "%d bits set - done\n", 
+			reiserfs_bitmap_ones (bm));*/
     fflush (stderr);
     return bm;
 }
 
 
-void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm)
-{
-    unsigned int i;
-
-    /*reiserfs_warning (stderr, "Bitmap inverting..");fflush (stderr);*/
-    for (i = 0; i < bm->bm_bit_size; i ++) {
-	if (reiserfs_bitmap_test_bit (bm, i))
-	    reiserfs_bitmap_clear_bit (bm, i);
-	else
-	    reiserfs_bitmap_set_bit (bm, i);
+int reiserfs_bitmap_block (reiserfs_filsys_t * fs, unsigned long block) {
+    unsigned int bmap_nr;
+    
+    if (reiserfs_bitmap_spread (fs)) {
+	if (!(block % (fs->fs_blocksize * 8)))
+	    /* bitmap block */
+	    return 1;
+	return ((REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize + 1) 
+		== block);
+    } else {
+	bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks(fs->fs_ondisk_sb),
+				   fs->fs_blocksize);
+	
+	/* bitmap in */
+	return (block > 2ul && block < 3ul + bmap_nr) ? 1 : 0;
     }
-
-    /*reiserfs_warning (stderr, "done\n");*/
+    
+    return 0;
 }
 
-
-void reiserfs_free_ondisk_bitmap (reiserfs_filsys_t * fs)
+/* read bitmap of disk and print details */
+void reiserfs_bitmap_print (FILE * fp, reiserfs_filsys_t * fs, int silent)
 {
-    if (fs->fs_bitmap2) {
-	reiserfs_delete_bitmap (fs->fs_bitmap2);
-	fs->fs_bitmap2 = 0;
+    reiserfs_sb_t * sb;
+    int bmap_nr;
+    int i;
+    int bits_per_block;
+    int blocks;
+    unsigned long block;
+    reiserfs_bh_t * bh;
+
+
+    sb = fs->fs_ondisk_sb;
+    bits_per_block = fs->fs_blocksize * 8;
+    blocks = bits_per_block;
+    bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks(fs->fs_ondisk_sb),
+			       fs->fs_blocksize);
+
+    reiserfs_warning (fp, "Bitmap blocks are:\n");
+    block = fs->fs_super_bh->b_blocknr + 1;
+    for (i = 0; i < bmap_nr; i ++) {
+	bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
+	if (!bh) {
+	    reiserfs_warning (stderr, "reiserfs_bitmap_print: reiserfs_buffer_read "
+			      "failed for %d: %lu\n", i, block);
+	    continue;
+	}
+	if (i == bmap_nr - 1)
+	    if (reiserfs_sb_get_blocks (sb) % bits_per_block)
+		blocks = reiserfs_sb_get_blocks (sb) % bits_per_block;
+	reiserfs_print_bmap_block (fp, i, block, bh->b_data, blocks, 
+				   silent, fs->fs_blocksize);
+	
+	reiserfs_buffer_close (bh);
+
+	if (reiserfs_bitmap_spread (fs))
+	    block = (block / (fs->fs_blocksize * 8) + 1) * 
+		    (fs->fs_blocksize * 8);
+	else {
+	    block ++;
+	}
     }
 }
-
-
-/* read bitmap blocks */
-int reiserfs_open_ondisk_bitmap (reiserfs_filsys_t * fs)
-{
-    if (fs->fs_bitmap2)
-	reiserfs_panic ("bitmap is initiaized already");
-
-    fs->fs_bitmap2 = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    if (!fs->fs_bitmap2)
-	return -1;
-
-    if ((get_sb_block_count (fs->fs_ondisk_sb) + fs->fs_blocksize * 8 - 1) / 
-	(fs->fs_blocksize * 8) != get_sb_bmap_nr (fs->fs_ondisk_sb)) 
-    {
-	reiserfs_warning (stderr, "%s: wrong either bitmaps number,\n", __FUNCTION__);
-	reiserfs_warning (stderr, "count of blocks or blocksize, run with --rebuild-sb "
-	    "to fix it\n");
-	return -1;
-    }    	
-
-    return reiserfs_fetch_ondisk_bitmap (fs->fs_bitmap2, fs);
-}
-
-int reiserfs_create_ondisk_bitmap (reiserfs_filsys_t * fs)
-{
-    if (fs->fs_bitmap2)
-	reiserfs_panic ("bitmap is initiaized already");
-
-    fs->fs_bitmap2 = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
-    if (!fs->fs_bitmap2)
-	return 0;
-
-    return 1;
-}
-
-
-void reiserfs_close_ondisk_bitmap (reiserfs_filsys_t * fs)
-{
-    if (!fs->fs_bitmap2)
-	return;
-    reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);
-    reiserfs_free_ondisk_bitmap (fs);
-}
diff --git a/libreiserfs/buffer.c b/libreiserfs/buffer.c
new file mode 100644
index 0000000..b2762ac
--- /dev/null
+++ b/libreiserfs/buffer.c
@@ -0,0 +1,707 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/malloc.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+
+static int is_bad_block (unsigned long block)
+{
+#ifdef IO_FAILURE_EMULATION
+    
+    /* this array similates bad blocks on the device */
+    unsigned long bad_blocks [] =
+	{
+	    8208, 8209, 8210
+/*, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19*/
+	};
+    int i;
+    
+    for (i = 0; i < sizeof (bad_blocks) / sizeof (bad_blocks[0]); i ++)
+	if (bad_blocks [i] == block)
+	    return 1;
+
+#endif
+
+    return 0;
+}
+
+
+
+/* All buffers are in double linked cycled list.  If reiserfs_buffer_open found buffer with
+   wanted block number in hash queue it moves buffer to the end of list. */
+
+static int g_nr_buffers;
+
+
+static unsigned long buffers_memory;
+
+/* create buffers until we spend this fraction of system memory, this
+** is a hard limit on the amount of buffer ram used
+*/
+#define BUFFER_MEMORY_FRACTION 10
+
+/* number of bytes in local buffer cache before we start forcing syncs
+** of dirty data and reusing unused buffers instead of allocating new
+** ones.  If a flush doesn't find reusable buffers, new ones are
+** still allocated up to the BUFFER_MEMORY_FRACTION percentage
+**
+*/
+#define BUFFER_SOFT_LIMIT (500 * 1024)
+static unsigned long buffer_soft_limit = BUFFER_SOFT_LIMIT;
+
+
+#define NR_HASH_QUEUES 4096
+static reiserfs_bh_t * g_a_hash_queues [NR_HASH_QUEUES];
+static reiserfs_bh_t * Buffer_list_head;
+static reiserfs_bh_t * g_free_buffers = NULL ;
+static reiserfs_bh_t * g_buffer_heads;
+static int buffer_hits = 0 ;
+static int buffer_misses = 0 ;
+static int buffer_reads = 0 ;
+static int buffer_writes = 0 ;
+
+
+
+static void _show_buffers(reiserfs_bh_t **list, int dev, unsigned long size) {
+    int all = 0;
+    int dirty = 0;
+    int in_use = 0; /* count != 0 */
+    int free = 0;
+    reiserfs_bh_t * next;
+
+    next = *list;
+    if (!next)
+        return ;
+
+    for (;;) {
+	if (next->b_dev == dev && next->b_size == size) {
+	    all ++;
+	    if (next->b_count != 0) {
+		in_use ++;
+	    }
+	    if (reiserfs_buffer_isdirty (next)) {
+		dirty ++;
+	    }
+	    if (reiserfs_buffer_isclean (next) && next->b_count == 0) {
+		free ++;
+	    }
+	}
+	next = next->b_next;
+	if (next == *list)
+	    break;
+    }
+
+    printf("show_buffers (dev %d, size %lu): free %d, count != 0 %d, dirty %d, "
+	"all %d\n", dev, size, free, in_use, dirty, all);
+}
+
+
+static void show_buffers (int dev, int size)
+{
+    _show_buffers(&Buffer_list_head, dev, size) ;
+    _show_buffers(&g_free_buffers, dev, size) ;
+}
+
+
+static void insert_into_hash_queue (reiserfs_bh_t * bh)
+{
+    int index = bh->b_blocknr % NR_HASH_QUEUES;
+
+    if (bh->b_hash_prev || bh->b_hash_next)
+	misc_die ("insert_into_hash_queue: hash queue corrupted");
+
+    if (g_a_hash_queues[index]) {
+	g_a_hash_queues[index]->b_hash_prev = bh;
+	bh->b_hash_next = g_a_hash_queues[index];
+    }
+    g_a_hash_queues[index] = bh;
+}
+
+
+static void remove_from_hash_queue (reiserfs_bh_t * bh)
+{
+    if (bh->b_hash_next == 0 && 
+	bh->b_hash_prev == 0 && 
+	bh != g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES])
+    {
+	/* (b_dev == -1) ? */
+	return;
+    }
+
+    if (bh == g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES]) {
+	if (bh->b_hash_prev != 0)
+	    misc_die ("remove_from_hash_queue: hash queue corrupted");
+	g_a_hash_queues[bh->b_blocknr % NR_HASH_QUEUES] = bh->b_hash_next;
+    }
+    if (bh->b_hash_next)
+	bh->b_hash_next->b_hash_prev = bh->b_hash_prev;
+
+    if (bh->b_hash_prev)
+	bh->b_hash_prev->b_hash_next = bh->b_hash_next;
+
+    bh->b_hash_prev = bh->b_hash_next = 0;
+}
+
+
+static void put_buffer_list_end (reiserfs_bh_t **list,
+                                 reiserfs_bh_t * bh)
+{
+    reiserfs_bh_t * last = 0;
+
+    if (bh->b_prev || bh->b_next)
+	misc_die ("put_buffer_list_end: buffer list corrupted");
+
+    if (*list == 0) {
+	bh->b_next = bh;
+	bh->b_prev = bh;
+	*list = bh;
+    } else {
+	last = (*list)->b_prev;
+
+	bh->b_next = last->b_next;
+	bh->b_prev = last;
+	last->b_next->b_prev = bh;
+	last->b_next = bh;
+    }
+}
+
+
+static void remove_from_buffer_list (reiserfs_bh_t **list,
+                                     reiserfs_bh_t * bh)
+{
+    if (bh == bh->b_next) {
+	*list = 0;
+    } else {
+	bh->b_prev->b_next = bh->b_next;
+	bh->b_next->b_prev = bh->b_prev;
+	if (bh == *list)
+	    *list = bh->b_next;
+    }
+
+    bh->b_next = bh->b_prev = 0;
+}
+
+
+static void put_buffer_list_head (reiserfs_bh_t **list,
+                                  reiserfs_bh_t * bh)
+{
+    put_buffer_list_end (list, bh);
+    *list = bh;
+}
+
+/*
+#include <sys/mman.h>
+
+static size_t estimate_memory_amount (void)
+{
+    size_t len = 1;
+    size_t max = 0;
+    void * addr;
+
+    while (len > 0) {
+	addr = mmap (0, len, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+	if (addr == MAP_FAILED) {
+	    if (errno != ENOMEM)
+		misc_die ("mmap failed: %s\n", strerror(errno));
+	    break;
+	}
+	if (mlock (addr, len) != 0) {
+	    if (errno == EPERM)
+		misc_die ("No permission to run mlock");
+	    break;
+	}
+
+	munlock (addr, len);
+	munmap (addr, len);
+	max = len;
+	len *= 2;
+    }
+
+    // * If we've looped, we don't want to return 0, we want to return the
+    // * last successful len before we looped. In the event that mmap/mlock
+    // * failed for len = 1, max will still be 0, so we don't get an invalid
+    // * result
+    return max;
+}
+*/
+
+#define GROW_BUFFERS__NEW_BUFERS_PER_CALL 10
+
+/* creates number of new buffers and insert them into head of buffer list */
+static int grow_buffers (int size)
+{
+    int i;
+    reiserfs_bh_t * bh, * tmp;
+
+
+    /* get memory for array of buffer heads */
+    bh = (reiserfs_bh_t *)misc_getmem (GROW_BUFFERS__NEW_BUFERS_PER_CALL * 
+				       sizeof (reiserfs_bh_t) + sizeof (reiserfs_bh_t *));
+    if (g_buffer_heads == 0)
+	g_buffer_heads = bh;
+    else {
+	/* link new array to the end of array list */
+	tmp = g_buffer_heads;
+	while (*(reiserfs_bh_t **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL) != 0)
+	    tmp = *(reiserfs_bh_t **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL);
+	*(reiserfs_bh_t **)(tmp + GROW_BUFFERS__NEW_BUFERS_PER_CALL) = bh;
+    }
+
+    for (i = 0; i < GROW_BUFFERS__NEW_BUFERS_PER_CALL; i ++) {
+
+	tmp = bh + i;
+	memset (tmp, 0, sizeof (reiserfs_bh_t));
+	tmp->b_data = misc_getmem (size);
+	if (tmp->b_data == 0)
+	    misc_die ("grow_buffers: no memory for new buffer data");
+	tmp->b_dev = -1;
+	tmp->b_size = size;
+	put_buffer_list_head (&g_free_buffers, tmp);
+    }
+    buffers_memory += GROW_BUFFERS__NEW_BUFERS_PER_CALL * size;
+    g_nr_buffers += GROW_BUFFERS__NEW_BUFERS_PER_CALL;
+    return GROW_BUFFERS__NEW_BUFERS_PER_CALL;
+}
+
+
+reiserfs_bh_t *reiserfs_buffer_find (int dev, 
+				     unsigned long block, 
+				     unsigned long size)
+{
+    reiserfs_bh_t * next;
+
+    next = g_a_hash_queues[block % NR_HASH_QUEUES];
+    for (;;) {
+	reiserfs_bh_t *tmp = next;
+	if (!next)
+	    break;
+	next = tmp->b_hash_next;
+	if (tmp->b_blocknr != block || tmp->b_size != size || tmp->b_dev != dev)
+	    continue;
+	next = tmp;
+	break;
+    }
+    return next;
+}
+
+
+static reiserfs_bh_t * get_free_buffer (reiserfs_bh_t **list,
+					unsigned long size)
+{
+    reiserfs_bh_t * next;
+
+    next = *list;
+    if (!next)
+	return 0;
+
+    for (;;) {
+	if (!next)
+	    misc_die ("get_free_buffer: buffer list is corrupted");
+	if (next->b_count == 0 && reiserfs_buffer_isclean (next) && next->b_size == size) {
+	    remove_from_hash_queue (next);
+	    remove_from_buffer_list (list, next);
+	    return next;
+	}
+	next = next->b_next;
+	if (next == *list)
+	    break;
+    }
+    return 0;
+}
+
+
+/* to_write == 0 when all blocks have to be flushed. Otherwise - write only
+   buffers with b_count == 0 */
+static int sync_buffers (reiserfs_bh_t **list, int dev, int to_write) {
+    reiserfs_bh_t * next;
+    int written = 0;
+
+
+restart:
+    next = *list;
+    if (!next)
+	return 0;
+    for (;;) {
+	if (!next)
+	    misc_die ("sync_buffers: buffer list is corrupted");
+ 
+	if (next->b_dev == dev && reiserfs_buffer_isdirty (next) && reiserfs_buffer_uptodate (next)) {
+	    if ((to_write == 0 || next->b_count == 0) && !reiserfs_buffer_noflush (next)) {
+		reiserfs_buffer_write (next);
+	    }
+	}
+    
+	/* if this buffer is reusable, put it onto the end of the free list */
+	if (next->b_count == 0 && reiserfs_buffer_isclean(next)) {
+	    remove_from_hash_queue (next);
+	    remove_from_buffer_list (list, next);
+	    put_buffer_list_end (&g_free_buffers, next);
+	    written++ ;
+	    if (written == to_write)
+		return written;
+	    goto restart;
+	}
+	if (to_write && written >= to_write)
+	    return written;
+
+	next = next->b_next;
+	if (next == *list)
+	    break;
+    }
+
+    return written;
+}
+
+void reiserfs_buffer_flush_all (int dev) {
+    if (dev == -1)
+	misc_die ("reiserfs_buffer_flush_all: device is not specified");
+
+    sync_buffers (&Buffer_list_head, dev, 0/*all*/);
+    buffer_soft_limit = BUFFER_SOFT_LIMIT;
+}
+
+
+reiserfs_bh_t * reiserfs_buffer_open (int dev, unsigned long block, 
+				      unsigned long size)
+{
+    reiserfs_bh_t * bh;
+
+    bh = reiserfs_buffer_find (dev, block, size);
+    if (bh) {
+	/* move the buffer to the end of list */
+
+	/*checkmem (bh->b_data, bh->b_size);*/
+
+	remove_from_buffer_list (&Buffer_list_head, bh);
+	put_buffer_list_end (&Buffer_list_head, bh);
+	bh->b_count ++;
+	buffer_hits++ ;
+	return bh;
+    }
+    buffer_misses++ ;
+
+    bh = get_free_buffer (&g_free_buffers, size);
+    if (bh == NULL) {
+	if (buffers_memory >= buffer_soft_limit) {
+	    if (sync_buffers (&Buffer_list_head, dev, 32) == 0) {
+		grow_buffers(size);
+		buffer_soft_limit = buffers_memory + 
+			GROW_BUFFERS__NEW_BUFERS_PER_CALL * size;
+	    }
+	} else {
+	    if (grow_buffers(size) == 0)
+		sync_buffers (&Buffer_list_head, dev, 32);
+	}
+
+	bh = get_free_buffer (&g_free_buffers, size);
+	if (bh == NULL) {
+	    show_buffers (dev, size);
+	    misc_die ("reiserfs_buffer_open: no free buffers after grow_buffers "
+		 "and refill (%d)", g_nr_buffers);
+	}
+    }
+
+    bh->b_count = 1;
+    bh->b_dev = dev;
+    bh->b_size = size;
+    bh->b_blocknr = block;
+    bh->b_end_io = NULL ;
+    memset (bh->b_data, 0, size);
+    misc_clear_bit(BH_Dirty, &bh->b_state);
+    misc_clear_bit(BH_Uptodate, &bh->b_state);
+
+    put_buffer_list_end (&Buffer_list_head, bh);
+    insert_into_hash_queue (bh);
+    /*checkmem (bh->b_data, bh->b_size);*/
+
+    return bh;
+}
+
+
+void reiserfs_buffer_close (reiserfs_bh_t * bh)
+{
+    if (bh == 0)
+	return;
+    
+    if (bh->b_count == 0)
+	misc_die ("reiserfs_buffer_close: can not free a free buffer %lu", bh->b_blocknr);
+    
+    /*checkmem (bh->b_data, misc_memsize (bh->b_data));*/
+    
+    bh->b_count --;
+}
+
+
+void reiserfs_buffer_forget (reiserfs_bh_t * bh) {
+    if (bh) {
+	bh->b_state = 0;
+	reiserfs_buffer_close (bh);
+	remove_from_hash_queue (bh);
+	remove_from_buffer_list(&Buffer_list_head, bh);
+	put_buffer_list_head(&Buffer_list_head, bh);
+    }
+}
+
+/* Returns 0 on success; 1 - end of file; 0 - OK. */
+static int f_read(reiserfs_bh_t * bh)
+{
+    unsigned long long offset;
+    ssize_t bytes;
+
+    buffer_reads++ ;
+
+    offset = (unsigned long long)bh->b_size * bh->b_blocknr;
+    if (lseek (bh->b_dev, offset, SEEK_SET) < 0)
+	return -1;
+
+    bytes = read (bh->b_dev, bh->b_data, bh->b_size);
+    
+    return bytes < 0 ? -1 : (bytes != (ssize_t)bh->b_size ? 1 : 0);
+}
+
+#define check_hd_msg								\
+"\nThe problem has occurred looks like a hardware problem. If you have\n"	\
+"bad blocks, we advise you to get a new hard drive, because once you\n"		\
+"get one bad block  that the disk  drive internals  cannot hide from\n"		\
+"your sight,the chances of getting more are generally said to become\n"		\
+"much higher  (precise statistics are unknown to us), and  this disk\n"		\
+"drive is probably not expensive enough  for you to you to risk your\n"		\
+"time and  data on it.  If you don't want to follow that follow that\n"		\
+"advice then  if you have just a few bad blocks,  try writing to the\n"		\
+"bad blocks  and see if the drive remaps  the bad blocks (that means\n"		\
+"it takes a block  it has  in reserve  and allocates  it for use for\n"		\
+"of that block number).  If it cannot remap the block,  use badblock\n"		\
+"option (-B) with  reiserfs utils to handle this block correctly.\n"		\
+
+reiserfs_bh_t *reiserfs_buffer_read (int dev, unsigned long block, 
+				     unsigned long size)
+{
+    reiserfs_bh_t * bh;
+    int ret;
+
+    if (is_bad_block (block))
+	return 0;
+
+    bh = reiserfs_buffer_open (dev, block, size);
+    
+    /*checkmem (bh->b_data, misc_memsize(bh->b_data));*/
+    
+    if (reiserfs_buffer_uptodate (bh))
+	return bh;
+
+    ret = f_read(bh);
+    
+    if (ret > 0) {
+	misc_die ("%s: End of file, cannot read the block (%lu).\n", 
+	     __FUNCTION__, block);
+    } else if (ret < 0) {
+	/* BAD BLOCK LIST SUPPORT
+	 * misc_die ("%s: Cannot read a block # %lu. Specify list of badblocks\n",*/
+
+	if (errno == EIO) {
+	    fprintf(stderr, check_hd_msg);
+	    misc_die ("%s: Cannot read the block (%lu): (%s).\n", 
+		 __FUNCTION__, block, strerror(errno));
+	} else	{
+	    fprintf (stderr, "%s: Cannot read the block (%lu): (%s).\n", 
+		     __FUNCTION__, block, strerror(errno));
+	    return NULL;
+	}
+    }
+       
+    reiserfs_buffer_mkuptodate (bh, 0);
+    return bh;
+}
+
+/* for now - just make sure that bad blocks did not get here */
+int reiserfs_buffer_write (reiserfs_bh_t * bh)
+{
+    off_t offset;
+    long long bytes, size;
+
+    if (is_bad_block (bh->b_blocknr)) {
+	fprintf (stderr, "reiserfs_buffer_write: bad block is going to be written: %lu\n",
+		 bh->b_blocknr);
+	exit(8);
+    }
+
+    if (!reiserfs_buffer_isdirty (bh) || !reiserfs_buffer_uptodate (bh))
+	return 0;
+
+    buffer_writes++ ;
+    if (bh->b_start_io)
+	/* this is used by undo feature of reiserfsck */
+	bh->b_start_io (bh->b_blocknr);
+
+    size = bh->b_size;
+    offset = (off_t)size * bh->b_blocknr;
+
+    if (lseek (bh->b_dev, offset, SEEK_SET) == (long long int)-1){
+	fprintf (stderr, "reiserfs_buffer_write: lseek to position %llu (block=%lu, dev=%d): %s\n",
+	    offset, bh->b_blocknr, bh->b_dev, strerror(errno));
+	exit(8); /* File system errors left uncorrected */
+    }
+
+#ifdef ROLLBACK_READY
+    if (s_rollback_file != NULL && bh->b_size == (unsigned long)rollback_blocksize) {
+        struct stat buf;
+        int position;
+	struct block_handler block_h;
+        
+        /*log previous content into the log*/
+        if (!fstat (bh->b_dev, &buf)) {
+	    block_h.blocknr = bh->b_blocknr;
+	    block_h.device = buf.st_rdev;
+	    if (misc_bin_search(&block_h, rollback_blocks_array, 
+				rollback_blocks_number, sizeof (block_h), 
+				&position, blockdev_list_compare) != 1)
+	    {
+                /*read initial data from the disk*/
+                if (read(bh->b_dev, rollback_data, bh->b_size) == (long long)bh->b_size) {
+                    fwrite(&buf.st_rdev, sizeof (buf.st_rdev), 1, s_rollback_file);
+                    fwrite(&offset, sizeof (offset), 1, s_rollback_file);
+                    fwrite(rollback_data, rollback_blocksize, 1, s_rollback_file);
+                    fflush(s_rollback_file);
+                    blocklist__insert_in_position(&block_h, (void *)(&rollback_blocks_array),
+			&rollback_blocks_number, sizeof(block_h), &position);
+		    
+                    /*if you want to know what gets saved, uncomment it*/
+/*                    if (log_file != 0 && log_file != stdout) {
+                        fprintf (log_file, "rollback: block %lu of device %Lu was "
+			    "backed up\n", bh->b_blocknr, buf.st_rdev);
+                    }
+*/
+                    
+                } else {
+                    fprintf (stderr, "reiserfs_buffer_write: read (block=%lu, dev=%d): %s\n", 
+			bh->b_blocknr, bh->b_dev, strerror (errno));
+                    exit(8);
+                }
+		
+                if (lseek (bh->b_dev, offset, SEEK_SET) == (long long int)-1) {
+                    fprintf (stderr, "reiserfs_buffer_write: lseek to position %llu (block=%lu, "
+			"dev=%d): %s\n", offset, bh->b_blocknr, bh->b_dev, 
+			strerror(errno));
+                    exit(8);
+                }
+            }
+        } else {
+            fprintf (stderr, "reiserfs_buffer_write: fstat of (%d) returned -1: %s\n", 
+		bh->b_dev, strerror(errno));
+        }
+    } else if (s_rollback_file != NULL) {
+	fprintf (stderr, "rollback: block (%lu) has the size different from "
+	    "the fs uses, block skipped\n", bh->b_blocknr);
+    }
+#endif
+
+    bytes = write(bh->b_dev, bh->b_data, size);
+    if (bytes != size) {
+	fprintf (stderr, "reiserfs_buffer_write: write %lld bytes returned %lld (block=%ld, "
+	    "dev=%d): %s\n", size, bytes, bh->b_blocknr, bh->b_dev, 
+	    strerror(errno));
+	exit(8);
+    }
+
+    reiserfs_buffer_mkclean (bh);
+
+    if (bh->b_end_io) {
+	bh->b_end_io(bh, 1) ;
+    }
+
+    return 0;
+}
+
+
+static int _check_and_free_buffer_list(reiserfs_bh_t *list) {
+    reiserfs_bh_t *next = list ;
+    int count = 0 ;
+    if (!list)
+	return 0 ;
+
+    for(;;) {
+	if (next->b_count != 0)
+	    fprintf (stderr, "check_and_free_buffer_mem: not free buffer "
+		"(%d, %ld, %ld, %d)\n", next->b_dev, next->b_blocknr, 
+		next->b_size, next->b_count);
+
+	if (reiserfs_buffer_isdirty (next) && reiserfs_buffer_uptodate (next))
+	    fprintf (stderr, "check_and_free_buffer_mem: dirty buffer "
+		"(%d %lu) found\n", next->b_dev, next->b_blocknr);
+
+	misc_freemem (next->b_data);
+	count++;
+	next = next->b_next;
+	if (next == list)
+            break;
+    }
+    return count;
+}
+
+void reiserfs_buffer_free_all (void) {
+    int count = 0;
+    reiserfs_bh_t * next ;
+
+//    printf("check and free buffer mem, hits %d misses %d reads %d writes %d\n", 
+//	    buffer_hits, buffer_misses, buffer_reads, buffer_writes) ;
+    /*sync_buffers (0, 0);*/
+
+    count = _check_and_free_buffer_list(Buffer_list_head);
+    count += _check_and_free_buffer_list(g_free_buffers);
+
+    if (count != g_nr_buffers)
+       misc_die ("check_and_free_buffer_mem: found %d buffers, must be %d", 
+	    count, g_nr_buffers);
+
+    /* free buffer heads */
+    while ((next = g_buffer_heads)) {
+	g_buffer_heads = *(reiserfs_bh_t **)
+		(next + GROW_BUFFERS__NEW_BUFERS_PER_CALL);
+
+	misc_freemem (next);
+    }
+  
+    return;
+}
+
+static void _invalidate_buffer_list(reiserfs_bh_t *list, int dev)
+{
+    reiserfs_bh_t * next;
+
+    if (!list)
+	return;
+
+    next = list;
+
+    for (;;) {
+	if (next->b_dev == dev) {
+	    if (reiserfs_buffer_isdirty (next) || next->b_count)
+		fprintf (stderr, "invalidate_buffer_list: dirty "
+			 "buffer or used buffer (%d %lu) found\n", 
+			 next->b_count, next->b_blocknr);
+	    
+	    next->b_state = 0;
+	    remove_from_hash_queue (next);
+	}
+	
+	next = next->b_next;
+	if (next == list)
+	    break;
+    }
+}
+
+/* forget all buffers of the given device */
+void reiserfs_buffer_invalidate_all (int dev) {
+    _invalidate_buffer_list(Buffer_list_head, dev) ;
+    _invalidate_buffer_list(g_free_buffers, dev) ;
+}
diff --git a/libreiserfs/direntry.c b/libreiserfs/direntry.c
new file mode 100644
index 0000000..b6c4092
--- /dev/null
+++ b/libreiserfs/direntry.c
@@ -0,0 +1,166 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+/* length of the directory entry in directory item. This define calculates
+   length of i-th directory entry using directory entry locations from dir
+   entry head. When it calculates length of 0-th directory entry, it uses
+   length of whole item in place of entry location of the non-existent
+   following entry in the calculation.  See picture above.*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+// NOTE: this is not name length. This is length of whole entry
+int reiserfs_direntry_entry_len (reiserfs_ih_t * ih, 
+				 reiserfs_deh_t * deh, 
+				 int pos_in_item)
+{
+    if (pos_in_item)
+	return (reiserfs_deh_get_loc (deh - 1) - reiserfs_deh_get_loc (deh));
+    return (reiserfs_ih_get_len (ih) - reiserfs_deh_get_loc (deh));
+}
+
+
+int reiserfs_direntry_name_len (reiserfs_ih_t * ih,
+				reiserfs_deh_t * deh, 
+				int pos_in_item)
+{
+    int len, i;
+    char * name;
+
+    len = reiserfs_direntry_entry_len (ih, deh, pos_in_item);
+    name = reiserfs_deh_name (deh, pos_in_item);
+
+    // name might be padded with 0s
+    i = 0;
+    while (name[i] && i < len)
+	i++;
+
+    return i;
+}
+
+int reiserfs_direntry_entry_estimate (char * name, int key_format) {
+    if (key_format == KEY_FORMAT_2)
+    	return MISC_ROUND_UP (strlen(name));
+    else if (key_format == KEY_FORMAT_1)
+    	return strlen(name);
+
+    return -1;
+}
+
+/* the only corruption which is not considered fatal - is hash mismatching. If
+   bad_dir is set - directory item having such names is considered bad */
+int reiserfs_direntry_check (reiserfs_filsys_t * fs, 
+			     reiserfs_ih_t * ih, 
+			     char * item, 
+			     int bad_dir)
+{
+    int i;
+    int namelen;
+    reiserfs_deh_t * deh = (reiserfs_deh_t *)item;
+    __u32 prev_offset = 0;
+    __u16 prev_location = reiserfs_ih_get_len (ih);
+    
+    for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	if (reiserfs_deh_get_loc (deh) >= prev_location)
+	    return 1;
+	prev_location = reiserfs_deh_get_loc (deh);
+	    
+	namelen = reiserfs_direntry_name_len (ih, deh, i);
+	if (namelen > REISERFS_NAME_MAX)
+	    return 1;
+	
+	if (reiserfs_deh_get_off (deh) <= prev_offset)
+	    return 1;
+	prev_offset = reiserfs_deh_get_off (deh);
+	
+	/* check hash value */
+	if (!reiserfs_hash_correct (&fs->hash, 
+				    item + prev_location, 
+				    namelen, prev_offset)) 
+	{
+	    if (bad_dir)
+		/* make is_bad_leaf to not insert whole leaf. Node will be
+		   marked not-insertable and put into tree item by item in
+		   pass 2 */
+		return 1;
+	}
+    }
+
+    return 0;
+}
+
+int reiserfs_direntry_loc_check (reiserfs_deh_t * deh, 
+				 reiserfs_ih_t * ih, 
+				 int first)
+{
+    if (reiserfs_deh_get_loc (deh) < 
+	REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih))
+    {
+	return 1;
+    }
+    
+    if (reiserfs_deh_get_loc (deh) >= reiserfs_ih_get_len (ih))
+	return 1;
+
+    if (!first) {
+	if (reiserfs_deh_get_loc (deh) >= reiserfs_deh_get_loc (deh - 1))
+	    return 1;
+    }
+
+    return 0;
+}
+
+void reiserfs_direntry_print (FILE * fp, reiserfs_filsys_t * fs,
+			      reiserfs_bh_t * bh, reiserfs_ih_t * ih)
+{
+    int i;
+    int namelen;
+    reiserfs_deh_t * deh;
+    char * name;
+/*    static char namebuf [80];*/
+
+    if (!reiserfs_ih_dir (ih))
+	return;
+
+    /*printk ("\n%2%-25s%-30s%-15s%-15s%-15s\n", "    Name", "length", 
+		"Object key", "Hash", "Gen number", "Status"); */
+    
+    reiserfs_warning (fp, "%3s: %-25s%s%-22s%-12s%s\n", "###", "Name", 
+		      "length", "    Object key", "   Hash", "Gen number");
+    
+    deh = reiserfs_deh (bh, ih);
+    for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	if (reiserfs_direntry_loc_check (deh, ih, i == 0 ? 1 : 0)) {
+	    reiserfs_warning (fp, "%3d: wrong entry location %u, deh_offset %u\n",
+			      i, reiserfs_deh_get_loc (deh), reiserfs_deh_get_off (deh));
+	    continue;
+	}
+	if (i && reiserfs_direntry_loc_check (deh - 1, ih, ((i - 1) == 0) ? 1 : 0))
+	    /* previous entry has bad location so we can not calculate entry
+               length */
+	    namelen = 25;
+	else
+	    namelen = reiserfs_direntry_name_len (ih, deh, i);
+
+	name = reiserfs_deh_name (deh, i);
+	reiserfs_warning (fp, "%3d: \"%-25.*s\"(%3d)%20K%12d%5d, loc %u, "
+			  "state %x %s\n", i, namelen, name, namelen,
+			  (reiserfs_key_t *)&(deh->deh2_dir_id),
+			  OFFSET_HASH (reiserfs_deh_get_off (deh)),
+			  OFFSET_GEN (reiserfs_deh_get_off (deh)),
+			  reiserfs_deh_get_loc (deh), reiserfs_deh_get_state (deh),
+			  reiserfs_hash_name (reiserfs_hash_find (
+				name, namelen, reiserfs_deh_get_off (deh), 
+				fs ? reiserfs_sb_get_hash (fs->fs_ondisk_sb) : 
+				UNSET_HASH)));
+	
+	/*fs ? (reiserfs_hash_correct (&fs->hash, name, 
+		namelen, deh_offset (deh)) ? "" : "(BROKEN)") : "??");*/
+    }
+}
diff --git a/libreiserfs/extent.c b/libreiserfs/extent.c
new file mode 100644
index 0000000..a52ea38
--- /dev/null
+++ b/libreiserfs/extent.c
@@ -0,0 +1,103 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/unaligned.h"
+
+/* check item length, ih_free_space for pure 3.5 format, unformatted node
+   pointers */
+int reiserfs_ext_check (reiserfs_filsys_t * fs, 
+			     reiserfs_ih_t * ih, 
+			     char * item,
+			     unfm_func_t func)
+{
+    unsigned int i;
+    __u32 * ind = (__u32 *)item;
+
+    if (reiserfs_ih_get_len (ih) % REISERFS_EXT_SIZE)
+	return 1;
+
+    for (i = 0; i < reiserfs_ext_count (ih); i ++) {
+	if (!ind [i])
+	    continue;
+	if (func && func (fs, d32_get (ind, i)))
+	    return 1;
+    }
+
+    if (fs->fs_format == REISERFS_FORMAT_3_5) {
+	/* check ih_free_space for 3.5 format only */
+	if (reiserfs_ih_get_free (ih) > fs->fs_blocksize - 1)
+	    return 1;
+    }
+    
+    return 0;
+}
+
+//
+// printing of extent item
+//
+static void start_new_sequence (__u32 * start, int * len, __u32 new)
+{
+    *start = new;
+    *len = 1;
+}
+
+static int sequence_finished (__u32 start, int * len, __u32 new)
+{
+    if (le32_to_cpu (start) == MAX_INT)
+	return 1;
+
+    if (start == 0 && new == 0) {
+	(*len) ++;
+	return 0;
+    }
+    if (start != 0 && (le32_to_cpu (start) + *len) == le32_to_cpu (new)) {
+	(*len) ++;
+	return 0;
+    }
+    return 1;
+}
+
+static void print_sequence (FILE * fp, __u32 start, int len)
+{
+    if (start == MAX_INT)
+	return;
+
+    if (len == 1)
+	reiserfs_warning (fp, " %d", le32_to_cpu (start));
+    else
+	reiserfs_warning (fp, " %d(%d)", le32_to_cpu (start), len);
+}
+
+void reiserfs_ext_print(FILE * fp, 
+			     reiserfs_bh_t * bh, 
+			     int item_num)
+{
+    reiserfs_ih_t * ih;
+    unsigned int j;
+    __u32 * unp, prev = MAX_INT;
+    int num = 0;
+
+    ih = reiserfs_ih_at (bh, item_num);
+    unp = (__u32 *)reiserfs_item_by_ih (bh, ih);
+
+    if (reiserfs_ih_get_len (ih) % REISERFS_EXT_SIZE)
+	reiserfs_warning (fp, "reiserfs_ext_print: invalid item len");  
+
+    reiserfs_warning (fp, "%d pointer%s\n[", reiserfs_ext_count (ih),
+                      reiserfs_ext_count (ih) != 1 ? "s" : "" );
+    for (j = 0; j < reiserfs_ext_count (ih); j ++) {
+	if (sequence_finished (prev, &num, d32_get(unp, j))) {
+	    print_sequence (fp, prev, num);
+	    start_new_sequence (&prev, &num, d32_get(unp, j));
+	}
+    }
+    print_sequence (fp, prev, num);
+    reiserfs_warning (fp, "]\n");
+}
diff --git a/libreiserfs/filesystem.c b/libreiserfs/filesystem.c
new file mode 100644
index 0000000..960c0d6
--- /dev/null
+++ b/libreiserfs/filesystem.c
@@ -0,0 +1,480 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/malloc.h"
+#include "misc/device.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int reiserfs_fs_blksize_check (unsigned int blocksize)
+{
+    return ((((blocksize & -blocksize) == blocksize) 
+	&& (blocksize >= 512) && (blocksize <= 8192)));
+}
+
+reiserfs_blktype_t reiserfs_fs_block(reiserfs_filsys_t *fs, 
+				     unsigned long block) 
+{
+    if (block < fs->fs_super_bh->b_blocknr ||
+	block >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb))
+    {
+	return BT_INVAL;
+    }
+
+    if (block == fs->fs_super_bh->b_blocknr)
+	return BT_SUPER;
+
+    if (reiserfs_journal_block (fs, block))
+	return BT_JOURNAL;
+
+    if (reiserfs_bitmap_block(fs, block))
+	return BT_BITMAP;
+
+    return BT_UNKNOWN;
+}
+
+
+/* read super block. fixme: only 4k blocks, pre-journaled format
+   is refused. Journal and bitmap are to be opened separately.
+   skip_check is set to 1 if checks of openned SB should be omitted.*/
+reiserfs_filsys_t * reiserfs_fs_open (char * filename, int flags, 
+				      int *error, void * vp, int check)
+{
+    reiserfs_filsys_t * fs;
+    reiserfs_bh_t * bh;
+    reiserfs_sb_t * sb;
+    int fd, i;
+
+    if (error) 
+	*error = 0;
+
+    fd = open (filename, flags 
+#if defined(O_LARGEFILE)
+	       | O_LARGEFILE
+#endif
+	       );
+    if (fd == -1) {
+	if (error)
+	    *error = errno;
+	return 0;
+    }
+
+    fs = misc_getmem (sizeof (*fs));
+    fs->fs_dev = fd;
+    fs->fs_vp = vp;
+    strncpy(fs->fs_file_name, filename, sizeof(fs->fs_file_name));
+    
+    /* reiserfs super block is either in 16-th or in 2-nd 4k block of the
+       device */
+    for (i = 2; i < 17; i += 14) {
+	bh = reiserfs_buffer_read (fd, i, 4096);
+	if (!bh) {
+	    reiserfs_warning (stderr, "reiserfs_fs_open: reiserfs_buffer_read "
+			      "failed reading block %d\n", i);
+	} else {
+	    sb = (reiserfs_sb_t *)bh->b_data;
+	    
+	    if (reiserfs_super_magic(sb))
+		goto found;
+
+	    /* reiserfs signature is not found at the i-th 4k block */
+	    reiserfs_buffer_close (bh);
+	}
+    }
+
+    reiserfs_warning(stderr, "\nreiserfs_fs_open: the reiserfs superblock "
+		     "cannot be found on %s.\n", filename);
+    
+    misc_freemem (fs);
+    close (fd);
+    fs = NULL;
+    return fs;
+
+ found:
+
+    if (!reiserfs_fs_blksize_check(reiserfs_sb_get_blksize(sb))) {
+	reiserfs_warning(stderr, "reiserfs_fs_open: a superblock with "
+			 "wrong parameters was found in the block (%d).\n", i);
+	misc_freemem (fs);
+	close (fd);
+	reiserfs_buffer_close(bh);
+	return NULL;
+    }
+
+    if (check) {
+	/* A few checks of found super block. */
+	reiserfs_bh_t *tmp_bh;
+	
+	tmp_bh = reiserfs_buffer_read (fd, reiserfs_sb_get_blocks(sb) - 1, 
+				 reiserfs_sb_get_blksize(sb));
+	
+	if (!tmp_bh) {
+	    reiserfs_warning (stderr, "\n%s: Your partition is not big enough "
+			      "to contain the \nfilesystem of (%lu) blocks as "
+			      "was specified in the found super block.\n", 
+			      __FUNCTION__,  reiserfs_sb_get_blocks(sb) - 1);
+	    
+	    misc_freemem (fs);
+	    close (fd);
+	    reiserfs_buffer_close(bh);
+	    return NULL;
+	}
+	
+	reiserfs_buffer_close(tmp_bh);
+    }
+   
+    fs->fs_blocksize = reiserfs_sb_get_blksize (sb);
+    
+    /* check block size on the filesystem */
+    if (fs->fs_blocksize != 4096) {
+	i = bh->b_blocknr * 4096 / fs->fs_blocksize;
+	reiserfs_buffer_close (bh);
+	bh = reiserfs_buffer_read (fd, i, fs->fs_blocksize);
+	if (!bh) {
+	    reiserfs_warning (stderr, "reiserfs_fs_open: reiserfs_buffer_read "
+			      "failed reading block %d, size %d\n",
+			      i, fs->fs_blocksize);
+	    misc_freemem (fs);
+	    return 0;
+	}
+	sb = (reiserfs_sb_t *)bh->b_data;
+    }
+
+    fs->hash = reiserfs_hash_func (reiserfs_sb_get_hash (sb));
+    fs->fs_super_bh = bh;
+    fs->fs_ondisk_sb = sb;
+    fs->fs_flags = flags; /* O_RDONLY or O_RDWR */
+
+    fs->fs_format = reiserfs_super_format (sb);
+    
+    /*reiserfs_read_bitmap_blocks(fs);*/
+    if (flags & O_RDWR)
+	fs->fs_dirt  = 1;
+    else
+	fs->fs_dirt = 0;
+
+    return fs;
+}
+
+
+/* creates buffer for super block and fills it up with fields which are
+   constant for given size and version of a filesystem */
+reiserfs_filsys_t * reiserfs_fs_create (char * filename,
+					int version,
+					unsigned long block_count, 
+					int block_size, 
+					int default_journal, 
+					int new_format)
+{
+    reiserfs_filsys_t * fs;
+    unsigned long bmap_nr;
+
+    if (misc_device_count_blocks (filename, block_size) < block_count) {
+	reiserfs_warning (stderr, "reiserfs_fs_create: no enough "
+			  "blocks on device\n");
+	return 0;
+    }
+
+    if (!reiserfs_journal_fits (REISERFS_DISK_OFFSET_IN_BYTES / block_size, 
+				block_size, block_count, 0))
+    {
+	reiserfs_warning (stderr, "reiserfs_fs_create: can not create that "
+			  "small (%d blocks) filesystem\n", block_count);
+	return 0;
+    }
+
+    fs = misc_getmem (sizeof (*fs));
+    if (!fs) {
+	reiserfs_warning (stderr, "reiserfs_fs_create: misc_getmem failed\n");
+	return 0;
+    }
+
+    fs->fs_dev = open (filename, O_RDWR 
+#if defined(O_LARGEFILE)
+		       | O_LARGEFILE
+#endif
+		       );
+    if (fs->fs_dev == -1) {
+	reiserfs_warning (stderr, "reiserfs_fs_create: could not open %s: %s\n",
+			  filename, strerror(errno));
+	
+	misc_freemem (fs);
+	return 0;
+    }
+
+    fs->fs_blocksize = block_size;
+    sprintf(fs->fs_file_name, filename);
+    fs->fs_format = version;
+
+    if (new_format)
+        fs->fs_super_bh = reiserfs_buffer_open (fs->fs_dev, 
+	    REISERFS_DISK_OFFSET_IN_BYTES / block_size, block_size);
+    else 
+        fs->fs_super_bh = reiserfs_buffer_open (fs->fs_dev, 
+	    REISERFS_OLD_DISK_OFFSET_IN_BYTES / block_size, block_size);
+    
+    if (!fs->fs_super_bh) {
+	reiserfs_warning (stderr, "reiserfs_fs_create: "
+			  "reiserfs_buffer_open failed\n");
+	return 0;
+    }
+
+    reiserfs_buffer_mkuptodate (fs->fs_super_bh, 1);
+    
+    fs->fs_ondisk_sb = (reiserfs_sb_t *)fs->fs_super_bh->b_data;
+    memset (fs->fs_ondisk_sb, 0, block_size);
+    
+    /* fill super block fields which are constant for given version 
+       and block count */
+    reiserfs_sb_set_blocks (fs->fs_ondisk_sb, block_count);
+    /* sb_free_blocks */
+    /* sb_root_block */
+    /* sb_journal_1st_block */
+    /* sb_journal_dev */
+    /* sb_orig_journal_size */
+    /* sb_joural_magic */
+    /* sb_journal magic_F */
+    /* sb_mount_id */
+    /* sb_not_used0 */
+    /* sb_generation_number */    
+    reiserfs_sb_set_blksize (fs->fs_ondisk_sb, block_size);
+    switch (version) {
+    case REISERFS_FORMAT_3_5:
+	reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, 
+	    (block_size - REISERFS_SB_SIZE_V1) / sizeof(__u32) / 2 * 2);
+	/* sb_oid_cursize */
+	/* sb_state */
+	memcpy (fs->fs_ondisk_sb->s_v1.s_magic, 
+		REISERFS_3_5_SUPER_MAGIC_STRING,
+		strlen (REISERFS_3_5_SUPER_MAGIC_STRING));
+	break;
+
+    case REISERFS_FORMAT_3_6:
+	reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, 
+	    (block_size - REISERFS_SB_SIZE) / sizeof(__u32) / 2 * 2);
+	/* sb_oid_cursize */
+	/* sb_state */
+        memcpy (fs->fs_ondisk_sb->s_v1.s_magic, 
+		REISERFS_3_6_SUPER_MAGIC_STRING,
+                strlen (REISERFS_3_6_SUPER_MAGIC_STRING));
+	break;
+    }
+    if (!default_journal)
+        memcpy (fs->fs_ondisk_sb->s_v1.s_magic, 
+		REISERFS_JR_SUPER_MAGIC_STRING,
+                strlen (REISERFS_JR_SUPER_MAGIC_STRING));
+
+    /* sb_fsck_state */
+    /* sb_hash_function_code */
+    /* sb_tree_height */
+    bmap_nr = reiserfs_bmap_nr(block_count, block_size);
+
+    reiserfs_sb_set_version (fs->fs_ondisk_sb, version);
+    reiserfs_sb_set_bmaps (fs->fs_ondisk_sb, 
+			   reiserfs_bmap_over(bmap_nr) ? 0 : bmap_nr);
+    
+    /* sb_not_used1 */
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+    fs->fs_dirt = 1;
+
+    return fs;
+}
+
+/* flush bitmap, reiserfs_buffer_close super block, flush all dirty buffers, 
+   close and open again the device, read super block */
+static void reiserfs_only_reopen (reiserfs_filsys_t * fs, int flag)
+{
+    unsigned long super_block;
+
+
+    /*  reiserfs_bitmap_flush (fs->fs_bitmap2, fs);*/
+    super_block = fs->fs_super_bh->b_blocknr;                
+    reiserfs_buffer_close (fs->fs_super_bh);
+    reiserfs_buffer_flush_all(fs->fs_dev);
+    
+    reiserfs_buffer_invalidate_all (fs->fs_dev);
+    if (close (fs->fs_dev))
+	misc_die ("reiserfs_fs_reopen: closed failed: %s", strerror(errno));
+    
+    fs->fs_dev = open (fs->fs_file_name, flag 
+#if defined(O_LARGEFILE)
+		       | O_LARGEFILE
+#endif
+		       );
+    if (fs->fs_dev == -1)
+	misc_die ("reiserfs_fs_reopen: could not reopen device: %s", 
+	     strerror(errno));
+
+    fs->fs_super_bh = reiserfs_buffer_read (fs->fs_dev, super_block, 
+				      fs->fs_blocksize);
+    
+    if (!fs->fs_super_bh)
+	misc_die ("reiserfs_fs_reopen: reading super block failed");
+    
+    fs->fs_ondisk_sb = (reiserfs_sb_t *)fs->fs_super_bh->b_data;
+    fs->fs_flags = flag; /* O_RDONLY or O_RDWR */
+    
+    if (flag & O_RDWR)
+	fs->fs_dirt  = 1;
+    else
+	fs->fs_dirt = 0;
+}
+
+void reiserfs_fs_reopen (reiserfs_filsys_t * fs, int flag)
+{
+    reiserfs_only_reopen (fs, flag);
+    reiserfs_journal_reopen (fs, flag);
+}
+
+int reiserfs_fs_rw (reiserfs_filsys_t * fs)
+{
+    if ((fs->fs_flags) & O_RDWR)
+	return 1;
+    return 0;
+}
+
+
+/* flush all changes made on a filesystem */
+void reiserfs_fs_flush (reiserfs_filsys_t * fs)
+{
+    if (fs->fs_dirt) {
+	reiserfs_journal_flush (fs);
+	reiserfs_buffer_flush_all(fs->fs_dev);
+    }
+    fs->fs_dirt = 0;
+}
+
+
+/* free all memory involved into manipulating with filesystem */
+void reiserfs_fs_free (reiserfs_filsys_t * fs)
+{
+    reiserfs_journal_free (fs);
+    reiserfs_bitmap_free (fs);
+
+    /* release super block and memory used by filesystem handler */
+    reiserfs_buffer_close (fs->fs_super_bh);
+    fs->fs_super_bh = 0;
+
+    reiserfs_buffer_free_all ();
+    misc_freemem (fs);
+}
+
+
+/* this closes everything: journal. bitmap and the fs itself */
+void reiserfs_fs_close (reiserfs_filsys_t * fs)
+{
+    reiserfs_journal_close (fs);
+    reiserfs_bitmap_close (fs);
+
+    reiserfs_fs_flush (fs);
+    fsync(fs->fs_dev);
+    reiserfs_fs_free (fs);
+}
+
+void reiserfs_print_bmap_block (FILE * fp, int i, unsigned long block, 
+				char * map, int blocks, int silent, 
+				int blocksize)
+{
+    int j, k;
+    int bits = blocksize * 8;
+    int zeros = 0, ones = 0;
+  
+
+    reiserfs_warning (fp, "#%d: block %lu: ", i, block);
+
+    blocks = blocksize * 8;
+
+    if (misc_test_bit (0, map)) {
+	/* first block addressed by this bitmap block is used */
+	ones ++;
+	if (!silent)
+	    reiserfs_warning (fp, "Busy (%d-", i * bits);
+	for (j = 1; j < blocks; j ++) {
+	    while (misc_test_bit (j, map)) {
+		ones ++;
+		if (j == blocks - 1) {
+		    if (!silent)
+			reiserfs_warning (fp, "%d)\n", j + i * bits);
+		    goto end;
+		}
+		j++;
+	    }
+	    if (!silent)
+		reiserfs_warning (fp, "%d) Free(%d-", 
+				  j - 1 + i * bits, j + i * bits);
+
+	    while (!misc_test_bit (j, map)) {
+		zeros ++;
+		if (j == blocks - 1) {
+		    if (!silent)
+			reiserfs_warning (fp, "%d)\n", j + i * bits);
+		    goto end;
+		}
+		j++;
+	    }
+	    if (!silent)
+		reiserfs_warning (fp, "%d) Busy(%d-", 
+				  j - 1 + i * bits, j + i * bits);
+
+	    j --;
+	end:
+	    /* to make gcc 3.2 do not sware here */;
+	}
+    } else {
+	/* first block addressed by this bitmap is free */
+	zeros ++;
+	if (!silent)
+	    reiserfs_warning (fp, "Free (%d-", i * bits);
+	for (j = 1; j < blocks; j ++) {
+	    k = 0;
+	    while (!misc_test_bit (j, map)) {
+		k ++;
+		if (j == blocks - 1) {
+		    if (!silent)
+			reiserfs_warning (fp, "%d)\n", j + i * bits);
+		    zeros += k;
+		    goto end2;
+		}
+		j++;
+	    }
+	    zeros += k;
+	    if (!silent)
+		reiserfs_warning (fp, "%d) Busy(%d-", 
+				  j - 1 + i * bits, j + i * bits);
+	    
+	    k = 0;
+	    while (misc_test_bit (j, map)) {
+		ones ++;
+		if (j == blocks - 1) {
+		    if (!silent)
+			reiserfs_warning (fp, "%d)\n", j + i * bits);
+		    ones += k;
+		    goto end2;
+		}
+		j++;
+	    }
+	    ones += k;
+	    if (!silent)
+		reiserfs_warning (fp, "%d) Free(%d-", 
+				  j - 1 + i * bits, j + i * bits);
+	
+	    j --;
+	end2:
+	    /* to make gcc 3.2 do not sware here */;
+	}
+    }
+
+    reiserfs_warning (fp, "used %d, free %d\n", ones, zeros);
+}
+
diff --git a/reiserfscore/fix_node.c b/libreiserfs/fix_node.c
similarity index 68%
rename from reiserfscore/fix_node.c
rename to libreiserfs/fix_node.c
index 92ef814..b3a08da 100644
--- a/reiserfscore/fix_node.c
+++ b/libreiserfs/fix_node.c
@@ -3,41 +3,161 @@
  * reiserfsprogs/README
  */
 
-/**
- ** old_item_num
- ** old_entry_num
- ** set_entry_sizes
- ** create_virtual_node
- ** check_left
- ** check_right
- ** directory_part_size
- ** get_num_ver
- ** item_length
- ** set_parameters
- ** is_leaf_removable
- ** are_leaves_removable
- ** get_empty_nodes
- ** get_lfree
- ** get_rfree
- ** is_left_neighbor_in_cache
- ** decrement_key
- ** get_far_parent
- ** get_parents
- ** can_node_be_removed
- ** ip_check_balance
- ** dc_check_balance_internal
- ** dc_check_balance_leaf
- ** dc_check_balance
- ** check_balance
- ** get_direct_parent
- ** get_neighbors
- ** fix_nodes
- ** 
- ** 
- **/
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/misc.h"
+#include "misc/malloc.h"
+
+#include <assert.h>
+
+#define VI_TYPE_STAT_DATA 1
+#define VI_TYPE_DIRECT 2
+#define VI_TYPE_EXTENT 4
+#define VI_TYPE_DIRECTORY 8
+#define VI_TYPE_FIRST_DIRECTORY_ITEM 16
+#define VI_TYPE_INSERTED_DIRECTORY_ITEM 32
+
+#define VI_TYPE_LEFT_MERGEABLE 64
+#define VI_TYPE_RIGHT_MERGEABLE 128
+
+/* Check whether a key is contained in the tree rooted from a buffer at a
+   path.  This works by looking at the left and right delimiting keys for the
+   buffer in the last path_element in the path.  These delimiting keys are
+   stored at least one level above that buffer in the tree. If the buffer is
+   the first or last node in the tree order then one of the delimiting keys
+   may be absent, and in this case get_lkey and get_rkey return a special key
+   which is MIN_KEY or MAX_KEY. */
+static inline int key_in_buffer (
+    reiserfs_path_t         * p_s_chk_path, /* Path which should be checked.  */
+    reiserfs_key_t          * p_s_key,      /* Key which should be checked.   */
+    reiserfs_filsys_t  * fs        /* Super block pointer.           */
+    ) {
+
+    if (reiserfs_key_comp(reiserfs_tree_lkey(p_s_chk_path, fs), p_s_key) == 1)
+	return 0;
+    
+    if (reiserfs_key_comp(p_s_key, reiserfs_tree_rkey(p_s_chk_path, fs)) != -1)
+	return 0;
+    
+    return 1;
+}
+
+/**************************************************************************
+ * Algorithm   SearchByKey                                                *
+ *             look for item in internal tree on the disk by its key      *
+ * Input:  p_s_sb   -  super block                                        *
+ *         p_s_key  - pointer to the key to search                        *
+ * Output: true value -  1 - found,  0 - not found                        *
+ *         p_s_search_path - path from the root to the needed leaf        *
+ **************************************************************************/
+
+/* This function fills up the path from the root to the leaf as it
+   descends the tree looking for the key.  It uses reiserfs_reiserfs_buffer_read to
+   try to find buffers in the cache given their block number.  If it
+   does not find them in the cache it reads them from disk.  For each
+   node search_by_key finds using reiserfs_reiserfs_buffer_read it then uses
+   bin_search to look through that node.  bin_search will find the
+   position of the block_number of the next node if it is looking
+   through an internal node.  If it is looking through a leaf node
+   bin_search will find the position of the item which has key either
+   equal to given key, or which is the maximal key less than the given
+   key.  search_by_key returns a path that must be checked for the
+   correctness of the top of the path but need not be checked for the
+   correctness of the bottom of the path */
+static int search_by_key (reiserfs_filsys_t * fs,
+			  reiserfs_key_t * p_s_key,        /* Key to search */
+			  reiserfs_path_t * p_s_search_path,/* This structure was
+							   allocated and
+							   initialized by the
+							   calling
+							   function. It is
+							   filled up by this
+							   function.  */
+		   int  n_stop_level)   /* How far down the tree to search.*/
+{
+    reiserfs_sb_t * sb;
+    int n_block_number,
+	expected_level,
+	n_block_size    = fs->fs_blocksize;
+    reiserfs_bh_t  *       p_s_bh;
+    reiserfs_path_element_t *   p_s_last_element;
+    int				n_retval;
 
 
-#include "includes.h"
+    sb = fs->fs_ondisk_sb;
+    n_block_number = reiserfs_sb_get_root (sb);
+    expected_level = reiserfs_sb_get_height (sb);
+    
+    /* As we add each node to a path we increase its count.  This
+       means that we must be careful to release all nodes in a path
+       before we either discard the path struct or re-use the path
+       struct, as we do here. */
+    reiserfs_tree_pathrelse (p_s_search_path);
+
+
+    /* With each iteration of this loop we search through the items in
+       the current node, and calculate the next current node(next path
+       element) for the next iteration of this loop.. */
+    while ( 1 ) {
+
+	/* prep path to have another element added to it. */
+	p_s_last_element = REISERFS_PATH_ELEM(p_s_search_path, ++p_s_search_path->path_length);
+	expected_level --;
+
+	/* Read the next tree node, and set the last element in the
+           path to have a pointer to it. */
+	if ( ! (p_s_bh = p_s_last_element->pe_buffer =
+		reiserfs_buffer_read (fs->fs_dev, n_block_number, n_block_size)) ) {
+	    p_s_search_path->path_length --;
+	    reiserfs_tree_pathrelse(p_s_search_path);
+	    return IO_ERROR;
+	}
+
+	/* It is possible that schedule occured. We must check whether
+	   the key to search is still in the tree rooted from the
+	   current buffer. If not then repeat search from the root. */
+	if (!REISERFS_NODE_INTREE (p_s_bh) || 
+	    ! key_in_buffer(p_s_search_path, p_s_key, fs))
+	    reiserfs_panic ("search_by_key: something wrong with the tree");
+
+	/* make sure, that the node contents look like a node of
+           certain level */
+	if (!reiserfs_node_formatted (p_s_bh, expected_level)) {
+	    reiserfs_node_print (stderr, 0, p_s_bh, 3, -1, -1);
+	    reiserfs_panic ("search_by_key: expected level %d", expected_level);
+	}
+
+	/* ok, we have acquired next formatted node in the tree */
+	n_retval = misc_bin_search (p_s_key, reiserfs_ih_at(p_s_bh, 0), 
+				    reiserfs_node_items(p_s_bh), 
+				    reiserfs_leaf_head (p_s_bh) 
+				    ? REISERFS_IH_SIZE : REISERFS_KEY_SIZE, 
+				    &(p_s_last_element->pe_position),
+				    reiserfs_key_comp);
+	if (reiserfs_nh_get_level (NODE_HEAD (p_s_bh)) == n_stop_level)
+	    return n_retval == 1 ? POSITION_FOUND : POSITION_NOT_FOUND;
+
+	/* we are not in the stop level */
+	if (n_retval == 1)
+	    /* item has been found, so we choose the pointer which is
+               to the right of the found one */
+	    p_s_last_element->pe_position++;
+
+	/* if item was not found we choose the position which is to
+	   the left of the found item. This requires no code,
+	   bin_search did it already.*/
+
+	/* So we have chosen a position in the current node which is
+	   an internal node.  Now we calculate child block number by
+	   position in the node. */
+	n_block_number = reiserfs_dc_get_nr (
+		reiserfs_int_at (p_s_bh, p_s_last_element->pe_position));
+    }
+}
+
 
 
 /* To make any changes in the tree we find a node, that contains item to be
@@ -95,23 +215,23 @@
 /*
  * Create an array of sizes of directory entries for virtual item
  */
-static void set_entry_sizes (struct tree_balance * tb,
+static void set_entry_sizes (reiserfs_tb_t * tb,
 			     int old_num, int new_num,
-			     struct buffer_head * bh,
-			     struct item_head * ih)
+			     reiserfs_bh_t * bh,
+			     reiserfs_ih_t * ih)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int i;
-    struct reiserfs_de_head * deh;
-    struct virtual_item * vi;
+    reiserfs_deh_t * deh;
+    struct reiserfs_virtual_item * vi;
   
-    deh = B_I_DEH (bh, ih);
+    deh = reiserfs_deh (bh, ih);
 
     /* seek to given virtual item in array of virtual items */
     vi = vn->vn_vi + new_num;
 
     /* virtual directory item have this amount of entry after */
-    vi->vi_entry_count = get_ih_entry_count (ih) + 
+    vi->vi_entry_count = reiserfs_ih_get_entries (ih) + 
 	((old_num == vn->vn_affected_item_num) ? ((vn->vn_mode == M_CUT) ? -1 :
 						  (vn->vn_mode == M_PASTE ? 1 : 0)) : 0);
     vi->vi_entry_sizes = (__u16 *)vn->vn_free_ptr;
@@ -122,7 +242,8 @@
 	int j;
     
 	j = old_entry_num (old_num, vn->vn_affected_item_num, i, vn->vn_pos_in_item, vn->vn_mode);
-	vi->vi_entry_sizes[i] = entry_length (ih, &(deh[j]), j) + DEH_SIZE;
+	vi->vi_entry_sizes[i] = 
+		reiserfs_direntry_entry_len (ih, &(deh[j]), j) + REISERFS_DEH_SIZE;
     }
   
     /* set size of pasted entry */
@@ -131,39 +252,47 @@
 }
 
 
-static void create_virtual_node (struct tree_balance * tb, int h)
+static void create_reiserfs_virtual_node (reiserfs_tb_t * tb, int h)
 {
-    struct item_head * ih;
-    struct virtual_node * vn = tb->tb_vn;
+    reiserfs_ih_t * ih;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int new_num;
-    struct buffer_head * Sh;	/* this comes from tb->S[h] */
+    reiserfs_bh_t * Sh;	/* this comes from tb->S[h] */
 
-    Sh = PATH_H_PBUFFER (tb->tb_path, h);
+    Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
 
     /* size of changed node */
-    vn->vn_size = MAX_CHILD_SIZE (Sh->b_size) - get_blkh_free_space (B_BLK_HEAD (Sh)) + tb->insert_size[h];
+    vn->vn_size = REISERFS_NODE_SPACE (Sh->b_size) - 
+	    reiserfs_nh_get_free (NODE_HEAD (Sh)) + tb->insert_size[h];
 
     /* for internal nodes array if virtual items is not created */
     if (h) {
-	vn->vn_nr_item = (vn->vn_size - DC_SIZE) / (DC_SIZE + KEY_SIZE);
+	vn->vn_nr_item = (vn->vn_size - REISERFS_DC_SIZE) / 
+		(REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
+	
 	return;
     }
 
     /* number of items in virtual node  */
-    vn->vn_nr_item = B_NR_ITEMS (Sh) + ((vn->vn_mode == M_INSERT)? 1 : 0) - ((vn->vn_mode == M_DELETE)? 1 : 0);
+    vn->vn_nr_item = reiserfs_node_items (Sh) + 
+	    ((vn->vn_mode == M_INSERT)? 1 : 0) - 
+	    ((vn->vn_mode == M_DELETE)? 1 : 0);
 
     /* first virtual item */
-    vn->vn_vi = (struct virtual_item *)(tb->tb_vn + 1);
-    memset (vn->vn_vi, 0, vn->vn_nr_item * sizeof (struct virtual_item));
-    vn->vn_free_ptr += vn->vn_nr_item * sizeof (struct virtual_item);
+    vn->vn_vi = (struct reiserfs_virtual_item *)(tb->tb_vn + 1);
+    memset (vn->vn_vi, 0, vn->vn_nr_item * sizeof (struct reiserfs_virtual_item));
+    vn->vn_free_ptr += vn->vn_nr_item * sizeof (struct reiserfs_virtual_item);
 
 
     /* first item in the node */
-    ih = B_N_PITEM_HEAD (Sh, 0);
+    ih = reiserfs_ih_at (Sh, 0);
 
     /* define the mergeability for 0-th item (if it is not being deleted) */
-    if (is_left_mergeable (tb->tb_fs, tb->tb_path) == 1 && (vn->vn_mode != M_DELETE || vn->vn_affected_item_num))
+    if (reiserfs_tree_left_mergeable (tb->tb_fs, tb->tb_path) == 1 && 
+	(vn->vn_mode != M_DELETE || vn->vn_affected_item_num))
+    {
 	vn->vn_vi[0].vi_type |= VI_TYPE_LEFT_MERGEABLE;
+    }
 
     /* go through all items those remain in the virtual node (except for the new (inserted) one) */
     for (new_num = 0; new_num < vn->vn_nr_item; new_num ++) {
@@ -175,28 +304,29 @@
 	/* get item number in source node */
 	j = old_item_num (new_num, vn->vn_affected_item_num, vn->vn_mode);
     
-	vn->vn_vi[new_num].vi_item_len += get_ih_item_len (&ih[j]) + IH_SIZE;
+	vn->vn_vi[new_num].vi_item_len += reiserfs_ih_get_len (&ih[j]) + REISERFS_IH_SIZE;
     
-	if (I_IS_STAT_DATA_ITEM (ih + j)) {
+	if (reiserfs_ih_stat (ih + j)) {
 	    vn->vn_vi[new_num].vi_type |= VI_TYPE_STAT_DATA;
 	    continue;
 	}
 
 	/* set type of item */
-	if (I_IS_DIRECT_ITEM (ih + j))
+	if (reiserfs_ih_direct (ih + j))
 	    vn->vn_vi[new_num].vi_type |= VI_TYPE_DIRECT;
     
-	if (I_IS_INDIRECT_ITEM (ih + j))
-	    vn->vn_vi[new_num].vi_type |= VI_TYPE_INDIRECT;
+	if (reiserfs_ih_ext (ih + j))
+	    vn->vn_vi[new_num].vi_type |= VI_TYPE_EXTENT;
 
-	if (I_IS_DIRECTORY_ITEM (ih + j)) {
+	if (reiserfs_ih_dir (ih + j)) {
 	    set_entry_sizes (tb, j, new_num, Sh, ih + j);
 	    vn->vn_vi[new_num].vi_type |= VI_TYPE_DIRECTORY;
-	    if (get_key_offset_v1 (&ih[j].ih_key) == DOT_OFFSET)
+	    if (reiserfs_key_get_off1 (&ih[j].ih_key) == OFFSET_DOT)
 		vn->vn_vi[new_num].vi_type |= VI_TYPE_FIRST_DIRECTORY_ITEM;
 	}
     
-	vn->vn_vi[new_num].vi_item_offset = get_offset (&(ih + j)->ih_key);
+	vn->vn_vi[new_num].vi_item_offset = 
+		reiserfs_key_get_off (&(ih + j)->ih_key);
 	
 	if (new_num != vn->vn_affected_item_num)
 	    /* this is not being changed */
@@ -210,17 +340,18 @@
     /* virtual inserted item is not defined yet */
     if (vn->vn_mode == M_INSERT) {
 	vn->vn_vi[vn->vn_affected_item_num].vi_item_len = tb->insert_size[0];
-	vn->vn_vi[vn->vn_affected_item_num].vi_item_offset = get_offset (&vn->vn_ins_ih->ih_key);
+	vn->vn_vi[vn->vn_affected_item_num].vi_item_offset = 
+		reiserfs_key_get_off (&vn->vn_ins_ih->ih_key);
 
-	switch (get_type (&vn->vn_ins_ih->ih_key)) {
+	switch (reiserfs_key_get_type (&vn->vn_ins_ih->ih_key)) {
 	case TYPE_STAT_DATA:
 	    vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_STAT_DATA;
 	    break;
 	case TYPE_DIRECT:
 	    vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_DIRECT;
 	    break;
-	case TYPE_INDIRECT:
-	    vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_INDIRECT;
+	case TYPE_EXTENT:
+	    vn->vn_vi[vn->vn_affected_item_num].vi_type |= VI_TYPE_EXTENT;
 	    break;
 	default:
 	    /* inseted item is directory (it must be item with "." and "..") */
@@ -234,9 +365,9 @@
   
     /* set right merge flag we take right delimiting key and check whether it is a mergeable item */
     if (tb->CFR[0]) {
-	ih = (struct item_head *)B_N_PDELIM_KEY (tb->CFR[0], tb->rkey[0]);
-	if (is_right_mergeable (tb->tb_fs, tb->tb_path) == 1 &&
-		(vn->vn_mode != M_DELETE || vn->vn_affected_item_num != B_NR_ITEMS (Sh) - 1))
+	ih = (reiserfs_ih_t *)reiserfs_int_key_at (tb->CFR[0], tb->rkey[0]);
+	if (reiserfs_tree_right_mergeable (tb->tb_fs, tb->tb_path) == 1 &&
+		(vn->vn_mode != M_DELETE || vn->vn_affected_item_num != reiserfs_node_items (Sh) - 1))
 	    vn->vn_vi[vn->vn_nr_item-1].vi_type |= VI_TYPE_RIGHT_MERGEABLE;
     }
 }
@@ -244,10 +375,10 @@
 
 /* using virtual node check, how many items can be shifted to left
    neighbor */
-static  int check_left (struct tree_balance * tb, int h, int cur_free)
+static  int check_left (reiserfs_tb_t * tb, int h, int cur_free)
 {
     int i;
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int d_size, ih_size, bytes = -1;
 
     /* internal level */
@@ -256,7 +387,7 @@
 	    tb->lnum[h] = 0; 
 	    return 0;
 	}
-	tb->lnum[h] = cur_free / (DC_SIZE + KEY_SIZE);
+	tb->lnum[h] = cur_free / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
 	return -1;
     }
 
@@ -269,21 +400,21 @@
 	return 0;
     }
 
-    if ((unsigned int)cur_free >= (vn->vn_size - ((vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE) ? IH_SIZE : 0))) {
+    if ((unsigned int)cur_free >= (vn->vn_size - ((vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE) ? REISERFS_IH_SIZE : 0))) {
 	/* all contents of S[0] fits into L[0] */
 	tb->lnum[0] = vn->vn_nr_item;
 	tb->lbytes = -1;
 	return -1;
     }
   
-    d_size = 0, ih_size = IH_SIZE;
+    d_size = 0, ih_size = REISERFS_IH_SIZE;
 
     /* first item may be merge with last item in left neighbor */
     if (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE)
-	d_size = -((int)IH_SIZE), ih_size = 0;
+	d_size = -((int)REISERFS_IH_SIZE), ih_size = 0;
 
     tb->lnum[0] = 0;
-    for (i = 0; i < vn->vn_nr_item; i ++, ih_size = IH_SIZE, d_size = 0) {
+    for (i = 0; i < vn->vn_nr_item; i ++, ih_size = REISERFS_IH_SIZE, d_size = 0) {
 	d_size += vn->vn_vi[i].vi_item_len;
 	if (cur_free >= d_size) {	
 	    /* the item can be shifted entirely */
@@ -317,9 +448,9 @@
 //	    	vn->vn_vi[i].vi_item_offset, bytes, vn->vn_vi[i].vi_item_offset + bytes);
 	}
 
-	if (vn->vn_vi[i].vi_type & VI_TYPE_INDIRECT)
-	    /* body of a indirect item can be split at unformatted pointer bound */
-	    tb->lbytes = bytes = cur_free - cur_free % UNFM_P_SIZE;
+	if (vn->vn_vi[i].vi_type & VI_TYPE_EXTENT)
+	    /* body of a extent item can be split at unformatted pointer bound */
+	    tb->lbytes = bytes = cur_free - cur_free % REISERFS_EXT_SIZE;
     
 	/* item is of directory type */     
 	if (vn->vn_vi[i].vi_type & VI_TYPE_DIRECTORY) {
@@ -329,7 +460,7 @@
 	    /* calculate number of dir entries that can be shifted, and
 	       their total size */
 	    int j;
-	    struct virtual_item * vi;
+	    struct reiserfs_virtual_item * vi;
       
 	    tb->lbytes = 0;
 	    bytes = 0;
@@ -370,10 +501,10 @@
 
 /* using virtual node check, how many items can be shifted to right
    neighbor */
-static int check_right (struct tree_balance * tb, int h, int cur_free)
+static int check_right (reiserfs_tb_t * tb, int h, int cur_free)
 {
     int i;
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int d_size, ih_size, bytes = -1;
 
     /* internal level */
@@ -382,7 +513,7 @@
 	    tb->rnum[h] = 0; 
 	    return 0;
 	}
-	tb->rnum[h] = cur_free / (DC_SIZE + KEY_SIZE);
+	tb->rnum[h] = cur_free / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
 	return -1;
     }
     
@@ -395,7 +526,7 @@
 	return 0;
     }
   
-    if ((unsigned int)cur_free >= (vn->vn_size - ((vn->vn_vi[vn->vn_nr_item-1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ? IH_SIZE : 0)))
+    if ((unsigned int)cur_free >= (vn->vn_size - ((vn->vn_vi[vn->vn_nr_item-1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ? REISERFS_IH_SIZE : 0)))
     {
 	/* all contents of S[0] fits into R[0] */
 	tb->rnum[h] = vn->vn_nr_item;
@@ -403,14 +534,14 @@
 	return -1;
     }
     
-    d_size = 0, ih_size = IH_SIZE;
+    d_size = 0, ih_size = REISERFS_IH_SIZE;
     
     /* last item may be merge with first item in right neighbor */
     if (vn->vn_vi[vn->vn_nr_item - 1].vi_type & VI_TYPE_RIGHT_MERGEABLE)
-	d_size = -(int)IH_SIZE, ih_size = 0;
+	d_size = -(int)REISERFS_IH_SIZE, ih_size = 0;
     
     tb->rnum[0] = 0;
-    for (i = vn->vn_nr_item - 1; i >= 0; i --, d_size = 0, ih_size = IH_SIZE) {
+    for (i = vn->vn_nr_item - 1; i >= 0; i --, d_size = 0, ih_size = REISERFS_IH_SIZE) {
 	d_size += vn->vn_vi[i].vi_item_len;
 	if (cur_free >= d_size)	{	
 	    /* the item can be shifted entirely */
@@ -450,16 +581,16 @@
 //	    	vn->vn_vi[i].vi_item_offset + vn->vn_vi[i].vi_item_len - bytes);
 	}
 	
-	/* item is of indirect type */
-	if (vn->vn_vi[i].vi_type & VI_TYPE_INDIRECT)
+	/* item is of extent type */
+	if (vn->vn_vi[i].vi_type & VI_TYPE_EXTENT)
 	    /* an unformatted node pointer (having size long) is a solid
                granule of the item */
-	    tb->rbytes = bytes = cur_free - cur_free % UNFM_P_SIZE;
+	    tb->rbytes = bytes = cur_free - cur_free % REISERFS_EXT_SIZE;
 	
 	/* item is of directory type */
 	if (vn->vn_vi[i].vi_type & VI_TYPE_DIRECTORY) {
 	    int j;
-	    struct virtual_item * vi;
+	    struct reiserfs_virtual_item * vi;
 	    
 	    tb->rbytes = 0;
 	    bytes = 0;
@@ -498,7 +629,7 @@
 
 
 /* sum of entry sizes between from-th and to-th entries including both edges */
-static int directory_part_size (struct virtual_item * vi, int from, int to)
+static int directory_part_size (struct reiserfs_virtual_item * vi, int from, int to)
 {
     int i, retval;
     
@@ -518,7 +649,7 @@
  * to_bytes - number of bytes of boundary item (or directory entries) which
  * are shifted to right neighbor */
 
-static int get_num_ver (int mode, struct tree_balance * tb, int h,
+static int get_num_ver (int mode, reiserfs_tb_t * tb, int h,
 			int from, int from_bytes,
 			int to,   int to_bytes,
 			short * snum012, int flow
@@ -526,8 +657,8 @@
 {
     int i;
     int bytes;
-    struct virtual_node * vn = tb->tb_vn;
-    struct virtual_item * vi;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_item * vi;
     
     int total_node_size, max_node_size, current_item_size;
     int needed_nodes;
@@ -540,7 +671,7 @@
     int splitted_item_positions[2];	/* these are positions in virtual item of items, 
 					   that are splitted between S[0] and S1new and S1new and S2new */
 
-    max_node_size = MAX_CHILD_SIZE (tb->tb_fs->fs_blocksize);
+    max_node_size = REISERFS_NODE_SPACE (tb->tb_fs->fs_blocksize);
     
     /* snum012 [0-2] - number of items, that lay to S[0], first new node and
        second new node */
@@ -550,7 +681,7 @@
 
     /* internal level */
     if (h > 0) {
-	i = ((to - from) * (KEY_SIZE + DC_SIZE) + DC_SIZE);
+	i = ((to - from) * (REISERFS_KEY_SIZE + REISERFS_DC_SIZE) + REISERFS_DC_SIZE);
 	if (i == max_node_size)
 	    return 1;
 	return (i / max_node_size + 1);
@@ -611,7 +742,7 @@
 	    continue;
 	}
 	
-	if (total_node_size + (int)IH_SIZE >= max_node_size) {
+	if (total_node_size + (int)REISERFS_IH_SIZE >= max_node_size) {
 	    /* even minimal item does not fit into current node, take new node
                and continue */
 	    needed_nodes ++, i--, total_node_size = 0;
@@ -624,7 +755,7 @@
 	}
 	
 	/*bytes is free space in filled node*/
-	bytes = max_node_size - total_node_size - IH_SIZE;
+	bytes = max_node_size - total_node_size - REISERFS_IH_SIZE;
 	
 	if (vi->vi_type & VI_TYPE_DIRECT) {
 	    /* body of a direct item can be split by 8 bytes. */
@@ -637,12 +768,12 @@
 	}
 
 
-	/* item is of indirect type */
-	if (vi->vi_type & VI_TYPE_INDIRECT)
+	/* item is of extent type */
+	if (vi->vi_type & VI_TYPE_EXTENT)
 	    /* an unformatted node pointer (having size long) is a solid
 	       granule of the item. bytes of unformatted node pointers fits
 	       into free space of filled node */
-	    bytes -= (bytes) % UNFM_P_SIZE;
+	    bytes -= (bytes) % REISERFS_EXT_SIZE;
 	
 	/* S1bytes or S2bytes. It depends from needed_nodes */
 	snum012[needed_nodes - 1 + 3] = bytes;
@@ -655,7 +786,7 @@
 	    
 	    snum012[needed_nodes - 1 + 3] = 0;
 
-	    total_node_size += IH_SIZE;
+	    total_node_size += REISERFS_IH_SIZE;
 	    if (start_bytes == -1 || i != start_item)
 		start_bytes = 0;
 	    
@@ -729,7 +860,7 @@
 	    /* item is not of directory type */
 	    int bytes_to_S2new;
 	    
-	    bytes_to_S2new = vn->vn_vi[split_item_num].vi_item_len - IH_SIZE - snum012[4] - bytes_to_r - bytes_to_l;
+	    bytes_to_S2new = vn->vn_vi[split_item_num].vi_item_len - REISERFS_IH_SIZE - snum012[4] - bytes_to_r - bytes_to_l;
 	    snum012[4] = bytes_to_S2new;
 	}
     }
@@ -748,7 +879,7 @@
 	    snum012[3] =  vn->vn_vi[split_item_num].vi_entry_count - snum012[3] - bytes_to_r - bytes_to_l;
 	} else
 	    /* bytes, who go to S1new node (not including HI_SIZE) */
-	    snum012[3] = vn->vn_vi[split_item_num].vi_item_len - IH_SIZE - snum012[3] - bytes_to_r - bytes_to_l;
+	    snum012[3] = vn->vn_vi[split_item_num].vi_item_len - REISERFS_IH_SIZE - snum012[3] - bytes_to_r - bytes_to_l;
     }
     
     return needed_nodes;
@@ -756,14 +887,14 @@
 
 /* size of item_num-th item in bytes when regular and in entries when item is
    directory */
-static int item_length (struct tree_balance * tb, int item_num)
+static int item_length (reiserfs_tb_t * tb, int item_num)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
 
     if (vn->vn_vi[item_num].vi_type & VI_TYPE_DIRECTORY)
 	return vn->vn_vi[item_num].vi_entry_count;
 
-    return vn->vn_vi[item_num].vi_item_len - IH_SIZE;
+    return vn->vn_vi[item_num].vi_item_len - REISERFS_IH_SIZE;
 }
 
 
@@ -784,7 +915,7 @@
  *	s1bytes	number of bytes which flow to the first  new node when S[0] splits (this number is contained in s012 array)
  */
 
-static void set_parameters (struct tree_balance * tb, int h, int lnum,
+static void set_parameters (reiserfs_tb_t * tb, int h, int lnum,
 			    int rnum, int blk_num, short * s012, int lb, int rb)
 {
 
@@ -807,24 +938,27 @@
     }
 }
 
-static void decrement_key (struct key * p_s_key) 
+static void decrement_key (reiserfs_key_t * p_s_key) 
 {
     int type;
 
-    type = get_type (p_s_key);
+    type = reiserfs_key_get_type (p_s_key);
     switch (type) {
     case TYPE_STAT_DATA:
-	set_key_objectid (p_s_key, get_key_objectid (p_s_key) - 1);
-	set_type_and_offset (key_format (p_s_key), p_s_key,
-			     (loff_t)MAX_FILE_SIZE_V2, TYPE_INDIRECT);
+	reiserfs_key_set_oid (p_s_key, reiserfs_key_get_oid (p_s_key) - 1);
+	reiserfs_key_set_sec (reiserfs_key_format (p_s_key), p_s_key,
+			      REISERFS_SD_SIZE_MAX_V2, TYPE_EXTENT);
 	return;
 
-    case TYPE_INDIRECT:
+    case TYPE_EXTENT:
     case TYPE_DIRECT:
     case TYPE_DIRENTRY:
-	set_offset (key_format (p_s_key), p_s_key, get_offset (p_s_key) - 1);
-	if (get_offset (p_s_key) == 0)
-	    set_type (key_format (p_s_key), p_s_key, TYPE_STAT_DATA);
+	reiserfs_key_set_off (reiserfs_key_format (p_s_key), p_s_key, 
+				 reiserfs_key_get_off (p_s_key) - 1);
+	
+	if (reiserfs_key_get_off (p_s_key) == 0)
+	    reiserfs_key_set_type (reiserfs_key_format (p_s_key), 
+				   p_s_key, TYPE_STAT_DATA);
 	return;
     }
     reiserfs_warning (stderr, "vs-8125: decrement_key: item of wrong type found %k",
@@ -832,118 +966,65 @@
 }
 
 
-int are_items_mergeable (struct item_head * left, struct item_head * right, int bsize)
-{
-    if (comp_keys (&left->ih_key, &right->ih_key) != -1) {
-	reiserfs_panic ("vs-16070: are_items_mergeable: left %k, right %k", &(left->ih_key), &(right->ih_key));
-    }
-
-    if (not_of_one_file (&left->ih_key, &right->ih_key))
-	return 0;
-
-    if (I_IS_DIRECTORY_ITEM (left)) {
-	return 1;
-    }
-
-    if ((I_IS_DIRECT_ITEM (left) && I_IS_DIRECT_ITEM (right)) || 
-	(I_IS_INDIRECT_ITEM (left) && I_IS_INDIRECT_ITEM (right)))
-	return (get_offset (&left->ih_key) + get_bytes_number (left, bsize) == get_offset (&right->ih_key)) ? 1 : 0;
-
-    return 0;
-}
-
 /* get left neighbor of the leaf node */
-static struct buffer_head * get_left_neighbor (reiserfs_filsys_t * s, struct path * path)
+/* FIXME: move this to tree.c when get rid of fix_node.c:search_by_key. */
+reiserfs_bh_t * reiserfs_tree_left_neighbor (reiserfs_filsys_t * s, 
+						  reiserfs_path_t * path)
 {
-    struct key key;
-    struct path path_to_left_neighbor;
-    struct buffer_head * bh;
+    reiserfs_key_t key;
+    reiserfs_path_t path_to_left_neighbor;
+    reiserfs_bh_t * bh;
 
-    copy_key (&key, B_N_PKEY (PATH_PLAST_BUFFER (path), 0));
+    reiserfs_key_copy (&key, reiserfs_ih_key_at (REISERFS_PATH_LEAF (path), 0));
     decrement_key (&key);
 
-    init_path (&path_to_left_neighbor);
-    search_by_key (s, &key, &path_to_left_neighbor, DISK_LEAF_NODE_LEVEL);
-    if (PATH_LAST_POSITION (&path_to_left_neighbor) == 0) {
-	pathrelse (&path_to_left_neighbor);
+    path_to_left_neighbor.path_length = REISERFS_PATH_OFFILL;
+    search_by_key (s, &key, &path_to_left_neighbor, LEAF_LEVEL);
+    if (REISERFS_PATH_LEAF_POS (&path_to_left_neighbor) == 0) {
+	reiserfs_tree_pathrelse (&path_to_left_neighbor);
 	return 0;
     }
-    bh = PATH_PLAST_BUFFER (&path_to_left_neighbor);
+    bh = REISERFS_PATH_LEAF (&path_to_left_neighbor);
     bh->b_count ++;
-    pathrelse (&path_to_left_neighbor);
+    reiserfs_tree_pathrelse (&path_to_left_neighbor);
     return bh;
 }
 
-
-extern struct key  MIN_KEY;
-static struct buffer_head * get_right_neighbor (reiserfs_filsys_t * s, struct path * path)
+/* FIXME: move this to tree.c when get rid of fix_node.c:search_by_key. */
+reiserfs_bh_t * reiserfs_tree_right_neighbor (reiserfs_filsys_t * s, 
+						   reiserfs_path_t * path)
 {
-    struct key key;
-    struct key * rkey;
-    struct path path_to_right_neighbor;
-    struct buffer_head * bh;
+    reiserfs_key_t key;
+    const reiserfs_key_t *rkey;
+    reiserfs_path_t path_to_right_neighbor;
+    reiserfs_bh_t * bh;
     
-    rkey = get_rkey (path, s);
-    if (comp_keys (rkey, &MIN_KEY) == 0)
-	reiserfs_panic ("vs-16080: get_right_neighbor: get_rkey returned min key (path has changed)");
-    copy_key (&key, rkey);
-    
-  
-    init_path (&path_to_right_neighbor);
-    search_by_key (s, &key, &path_to_right_neighbor, DISK_LEAF_NODE_LEVEL);
-    if (PATH_PLAST_BUFFER (&path_to_right_neighbor) == PATH_PLAST_BUFFER (path)) {
-	pathrelse (&path_to_right_neighbor);
+    rkey = reiserfs_tree_rkey (path, s);
+    if (reiserfs_key_comp (rkey, &MIN_KEY) == 0) {
+	reiserfs_panic ("vs-16080: reiserfs_tree_right_neighbor: "
+			"reiserfs_tree_rkey returned min key (path "
+			"has changed)");
+    }
+
+    reiserfs_key_copy (&key, rkey);
+ 
+    path_to_right_neighbor.path_length = REISERFS_PATH_OFFILL;
+    search_by_key (s, &key, &path_to_right_neighbor, LEAF_LEVEL);
+    if (REISERFS_PATH_LEAF (&path_to_right_neighbor) == REISERFS_PATH_LEAF (path)) {
+	reiserfs_tree_pathrelse (&path_to_right_neighbor);
 	return 0;
     }
-    bh = PATH_PLAST_BUFFER (&path_to_right_neighbor);
+    bh = REISERFS_PATH_LEAF (&path_to_right_neighbor);
     bh->b_count ++;
-    pathrelse (&path_to_right_neighbor);
+    reiserfs_tree_pathrelse (&path_to_right_neighbor);
     return bh;
 }
 
-
-int is_left_mergeable (reiserfs_filsys_t * s, struct path * path)
-{
-    struct item_head * right;
-    struct buffer_head * bh;
-    int retval;
-    
-    right = B_N_PITEM_HEAD (PATH_PLAST_BUFFER (path), 0);
-    
-    bh = get_left_neighbor (s, path);
-    if (bh == 0) {
-	return 0;
-    }
-    retval = are_items_mergeable (B_N_PITEM_HEAD (bh, B_NR_ITEMS (bh) - 1), right, bh->b_size);
-    brelse (bh);
-    return retval;
-}
-
-
-int is_right_mergeable (reiserfs_filsys_t * s, struct path * path)
-{
-    struct item_head * left;
-    struct buffer_head * bh;
-    int retval;
-    
-    left = B_N_PITEM_HEAD (PATH_PLAST_BUFFER (path), B_NR_ITEMS (PATH_PLAST_BUFFER (path)) - 1);
-    
-    bh = get_right_neighbor (s, path);
-    if (bh == 0) {
-	return 0;
-    }
-    retval = are_items_mergeable (left, B_N_PITEM_HEAD (bh, 0), bh->b_size);
-    brelse (bh);
-    return retval;
-}
-
-
-
 /* check, does node disappear if we shift tb->lnum[0] items to left neighbor
    and tb->rnum[0] to the right one. */
-static int is_leaf_removable (struct tree_balance * tb)
+static int is_leaf_removable (reiserfs_tb_t * tb)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int to_left, to_right;
     int size;
     int remain_items;
@@ -981,52 +1062,55 @@
 
 
 /* check whether L, S, R can be joined in one node */
-static int are_leaves_removable (struct tree_balance * tb, int lfree, int rfree)
+static int are_leaves_removable (reiserfs_tb_t * tb, int lfree, int rfree)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int ih_size;
-    struct buffer_head *S0;
+    reiserfs_bh_t *S0;
 
-    S0 = PATH_H_PBUFFER (tb->tb_path, 0);
+    S0 = REISERFS_PATH_UPBUFFER (tb->tb_path, 0);
 
     ih_size = 0;
     if (vn->vn_nr_item) {
 	if (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE)
-	    ih_size += IH_SIZE;
+	    ih_size += REISERFS_IH_SIZE;
     
 	if (vn->vn_vi[vn->vn_nr_item-1].vi_type & VI_TYPE_RIGHT_MERGEABLE)
-	    ih_size += IH_SIZE;
+	    ih_size += REISERFS_IH_SIZE;
     } else {
 	/* there was only one item and it will be deleted */
-	struct item_head * ih;
+	reiserfs_ih_t * ih;
     
-	ih = B_N_PITEM_HEAD (S0, 0);
-	if (tb->CFR[0] && !not_of_one_file (&(ih->ih_key), B_N_PDELIM_KEY (tb->CFR[0], tb->rkey[0])))
-	    if (I_IS_DIRECTORY_ITEM(ih)) {
+	ih = reiserfs_ih_at (S0, 0);
+	if (tb->CFR[0] && 
+	    !reiserfs_key_comp2 (&(ih->ih_key), 
+				 reiserfs_int_key_at (tb->CFR[0], tb->rkey[0])))
+	{
+	    if (reiserfs_ih_dir(ih)) {
 		/* we can delete any directory item in fsck (if it is unreachable) */
-		if (get_offset (&ih->ih_key) != DOT_OFFSET) {
+		if (reiserfs_key_get_off (&ih->ih_key) != OFFSET_DOT) {
 		    /* must get left neighbor here to make sure, that
                        left neighbor is of the same directory */
-		    struct buffer_head * left;
+		    reiserfs_bh_t * left;
 		    
-		    left = get_left_neighbor (tb->tb_fs, tb->tb_path);
+		    left = reiserfs_tree_left_neighbor (tb->tb_fs, tb->tb_path);
 		    if (left) {
-			struct item_head * last;
+			reiserfs_ih_t * last;
 
-			if (B_NR_ITEMS (left) == 0)
+			if (reiserfs_node_items (left) == 0)
 			    reiserfs_panic ("vs-8135: are_leaves_removable: "
 					    "empty node in the tree");
-			last = B_N_PITEM_HEAD (left, B_NR_ITEMS (left) - 1);
-			if (!comp_short_keys (&last->ih_key, &ih->ih_key))
-			    ih_size = IH_SIZE;
-			brelse (left);
+			last = reiserfs_ih_at (left, reiserfs_node_items (left) - 1);
+			if (!reiserfs_key_comp2 (&last->ih_key, &ih->ih_key))
+			    ih_size = REISERFS_IH_SIZE;
+			reiserfs_buffer_close (left);
 		    }
 		}
 	    }
-    
+	}
     }
 
-    if ((int)MAX_CHILD_SIZE(S0->b_size) + vn->vn_size <= rfree + lfree + ih_size) {
+    if ((int)REISERFS_NODE_SPACE(S0->b_size) + vn->vn_size <= rfree + lfree + ih_size) {
 	set_parameters (tb, 0, -1, -1, -1, NULL, -1, -1);
 	return 1;  
     }
@@ -1042,8 +1126,8 @@
 {\
    int to_l;\
    \
-   to_l = (MAX_NR_KEY(Sh)+1 - lpar + vn->vn_nr_item + 1) / 2 -\
-	      (MAX_NR_KEY(Sh) + 1 - lpar);\
+   to_l = (REISERFS_INT_MAX(Sh)+1 - lpar + vn->vn_nr_item + 1) / 2 -\
+	      (REISERFS_INT_MAX(Sh) + 1 - lpar);\
 	      \
 	      set_parameters (tb, h, to_l, 0, lnver, NULL, -1, -1);\
 }\
@@ -1063,7 +1147,7 @@
 {\
    int to_r;\
    \
-   to_r = (MAX_NR_KEY(Sh)+1 - rpar + vn->vn_nr_item + 1) / 2 - (MAX_NR_KEY(Sh) + 1 - rpar);\
+   to_r = (REISERFS_INT_MAX(Sh)+1 - rpar + vn->vn_nr_item + 1) / 2 - (REISERFS_INT_MAX(Sh) + 1 - rpar);\
    \
    set_parameters (tb, h, 0, to_r, rnver, NULL, -1, -1);\
 }\
@@ -1084,13 +1168,13 @@
  *	        CARRY_ON - schedule didn't occur while the function worked;
  *	        NO_DISK_SPACE - no disk space.
  */
-static int  get_empty_nodes (struct tree_balance * p_s_tb,
+static int  get_empty_nodes (reiserfs_tb_t * p_s_tb,
 			     int n_h)
 {
-    struct buffer_head  * p_s_new_bh,
-	*	p_s_Sh = PATH_H_PBUFFER (p_s_tb->tb_path, n_h);
+    reiserfs_bh_t  * p_s_new_bh,
+	*	p_s_Sh = REISERFS_PATH_UPBUFFER (p_s_tb->tb_path, n_h);
     unsigned long	      *	p_n_blocknr,
-	a_n_blocknrs[MAX_AMOUNT_NEEDED] = {0, };
+	a_n_blocknrs[FN_AMOUNT_MAX] = {0, };
     int       		n_counter,
 	n_number_of_freeblk,
 	n_amount_needed,/* number of needed empty blocks */
@@ -1130,17 +1214,20 @@
     else /* If we have enough already then there is nothing to do. */
 	return CARRY_ON;
 
-    if ( (n_repeat = reiserfs_new_blocknrs (p_s_tb->tb_fs, a_n_blocknrs,
-					    PATH_PLAST_BUFFER(p_s_tb->tb_path)->b_blocknr, n_amount_needed)) != CARRY_ON ) {
+    assert(fs->block_allocator != NULL);
+    if ( (n_repeat = fs->block_allocator (p_s_tb->tb_fs, a_n_blocknrs,
+					    REISERFS_PATH_LEAF(p_s_tb->tb_path)->b_blocknr,
+					    n_amount_needed)) != CARRY_ON ) 
+    {
 	return n_repeat; /* Out of disk space. */ 
     }
 
     /* for each blocknumber we just got, get a buffer and stick it on FEB */
     for ( p_n_blocknr = a_n_blocknrs, n_counter = 0; n_counter < n_amount_needed;
 	  p_n_blocknr++, n_counter++ ) { 
-	p_s_new_bh = getblk (fs->fs_dev, *p_n_blocknr, fs->fs_blocksize);
+	p_s_new_bh = reiserfs_buffer_open (fs->fs_dev, *p_n_blocknr, fs->fs_blocksize);
 	if (p_s_new_bh->b_count > 1) {
-	    die ("get_empty_nodes: not free empty buffer");
+	    misc_die ("get_empty_nodes: not free empty buffer");
 	}
 	
 	/* Put empty buffers into the array. */
@@ -1154,56 +1241,56 @@
 /* Get free space of the left neighbor,
  * which is stored in the parent node of the left neighbor.
  */
-static int get_lfree (struct tree_balance * tb, int h)
+static int get_lfree (reiserfs_tb_t * tb, int h)
 {
-    struct buffer_head * l, * f;
+    reiserfs_bh_t * l, * f;
     int order;
 
-    if ((f = PATH_H_PPARENT (tb->tb_path, h)) == 0 || (l = tb->FL[h]) == 0)
+    if ((f = REISERFS_PATH_UPPARENT (tb->tb_path, h)) == 0 || (l = tb->FL[h]) == 0)
 	return 0;
 
     if (f == l)
-	order = PATH_H_B_ITEM_ORDER (tb->tb_path, h) - 1;
+	order = REISERFS_PATH_UPPARENT_POS (tb->tb_path, h) - 1;
     else {
-	order = get_blkh_nr_items (B_BLK_HEAD(l));
+	order = reiserfs_nh_get_items (NODE_HEAD(l));
 	f = l;
     }
 
-    if (get_dc_child_size (B_N_CHILD(f,order)) == 0) {
+    if (reiserfs_dc_get_size (reiserfs_int_at(f,order)) == 0) {
 	reiserfs_warning (stderr, "get_lfree: block %u block_head %z has bad child pointer %y, order %d\n",
-			  l->b_blocknr, l, B_N_CHILD(f,order), order);
+			  l->b_blocknr, l, reiserfs_int_at(f,order), order);
     }
-    return (MAX_CHILD_SIZE(f->b_size) - get_dc_child_size (B_N_CHILD(f,order)));
+    return (REISERFS_NODE_SPACE(f->b_size) - reiserfs_dc_get_size (reiserfs_int_at(f,order)));
 }
 
 
 /* Get free space of the right neighbor, which is stored in the parent node of
  * the right neighbor.  */
-static int get_rfree (struct tree_balance * tb, int h)
+static int get_rfree (reiserfs_tb_t * tb, int h)
 {
-    struct buffer_head * r, * f;
+    reiserfs_bh_t * r, * f;
     int order;
 
-    if ((f = PATH_H_PPARENT (tb->tb_path, h)) == 0 || (r = tb->FR[h]) == 0)
+    if ((f = REISERFS_PATH_UPPARENT (tb->tb_path, h)) == 0 || (r = tb->FR[h]) == 0)
 	return 0;
 
     if (f == r)
-	order = PATH_H_B_ITEM_ORDER (tb->tb_path, h) + 1;
+	order = REISERFS_PATH_UPPARENT_POS (tb->tb_path, h) + 1;
     else {
 	order = 0;
 	f = r;
     }
 
-    return (MAX_CHILD_SIZE(f->b_size) - get_dc_child_size (B_N_CHILD(f,order)));
+    return (REISERFS_NODE_SPACE(f->b_size) - reiserfs_dc_get_size (reiserfs_int_at(f,order)));
 
 }
 
 
 /* Check whether left neighbor is in memory. */
-static int  is_left_neighbor_in_cache (struct tree_balance * p_s_tb,
+static int  is_left_neighbor_in_cache (reiserfs_tb_t * p_s_tb,
 				       int n_h)
 {
-    struct buffer_head  * p_s_father;
+    reiserfs_bh_t  * p_s_father;
     reiserfs_filsys_t * fs = p_s_tb->tb_fs;
     unsigned long         n_left_neighbor_blocknr;
     int                   n_left_neighbor_position;
@@ -1212,15 +1299,18 @@
 	return 0;
 
     /* Calculate father of the node to be balanced. */
-    p_s_father = PATH_H_PBUFFER(p_s_tb->tb_path, n_h + 1);
+    p_s_father = REISERFS_PATH_UPBUFFER(p_s_tb->tb_path, n_h + 1);
     /* Get position of the pointer to the left neighbor into the left father. */
     n_left_neighbor_position = ( p_s_father == p_s_tb->FL[n_h] ) ?
-	p_s_tb->lkey[n_h] : get_blkh_nr_items (B_BLK_HEAD(p_s_tb->FL[n_h]));
+	p_s_tb->lkey[n_h] : reiserfs_nh_get_items (NODE_HEAD(p_s_tb->FL[n_h]));
     /* Get left neighbor block number. */
-    n_left_neighbor_blocknr = get_dc_child_blocknr (B_N_CHILD (p_s_tb->FL[n_h], n_left_neighbor_position));
+    n_left_neighbor_blocknr = reiserfs_dc_get_nr (reiserfs_int_at (p_s_tb->FL[n_h], n_left_neighbor_position));
     /* Look for the left neighbor in the cache. */
-    if ( (p_s_father = find_buffer(fs->fs_dev, n_left_neighbor_blocknr, fs->fs_blocksize)) )
+    if ( (p_s_father = reiserfs_buffer_find(fs->fs_dev, n_left_neighbor_blocknr,
+				      fs->fs_blocksize)) )
+    {
 	return 1;
+    }
 
     return 0;
 }
@@ -1230,13 +1320,6 @@
 #define RIGHT_PARENTS 'r'
 
 
-
-void init_path (struct path * path)
-{
-    path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-}
-
-
 /* Calculate far left/right parent of the left/right neighbor of the current node, that
  * is calculate the left/right (FL[h]/FR[h]) neighbor of the parent F[h].
  * Calculate left/right common parent of the current node and L[h]/R[h].
@@ -1245,43 +1328,43 @@
  		SCHEDULE_OCCURRED - schedule occured while the function worked;
  *	        CARRY_ON         - schedule didn't occur while the function worked;
  */
-static int get_far_parent (struct tree_balance *   p_s_tb,
+static int get_far_parent (reiserfs_tb_t *   p_s_tb,
 			   int n_h,
-			   struct buffer_head  **  pp_s_father,
-			   struct buffer_head  **  pp_s_com_father,
+			   reiserfs_bh_t  **  pp_s_father,
+			   reiserfs_bh_t  **  pp_s_com_father,
 			   char c_lr_par)
 {
-    struct buffer_head  * p_s_parent;
-    struct path         	s_path_to_neighbor_father,
+    reiserfs_bh_t  * p_s_parent;
+    reiserfs_path_t         	s_path_to_neighbor_father,
 	* p_s_path = p_s_tb->tb_path;
-    struct key		s_lr_father_key;
+    reiserfs_key_t		s_lr_father_key;
     int                   n_counter,
 	n_position = -1,
 	n_first_last_position = 0,
-	n_path_offset = PATH_H_PATH_OFFSET(p_s_path, n_h);
+	n_path_offset = REISERFS_PATH_LEVEL(p_s_path, n_h);
     
     /* Starting from F[n_h] go upwards in the tree, and look for the common
        ancestor of F[n_h], and its neighbor l/r, that should be obtained. */
     
     n_counter = n_path_offset;
     
-    for ( ; n_counter > FIRST_PATH_ELEMENT_OFFSET; n_counter--  )  {
+    for ( ; n_counter > REISERFS_PATH_OFFINIT; n_counter--  )  {
 	/* Check whether parent of the current buffer in the path is really parent in the tree. */
-	if ( ! B_IS_IN_TREE(p_s_parent = PATH_OFFSET_PBUFFER(p_s_path, n_counter - 1)) )
+	if ( ! REISERFS_NODE_INTREE(p_s_parent = REISERFS_PATH_BUFFER(p_s_path, n_counter - 1)) )
 	    reiserfs_panic ("get_far_parent: buffer of path is notin the tree");
 
 	/* Check whether position in the parent is correct. */
-	if ( (n_position = PATH_OFFSET_POSITION(p_s_path, n_counter - 1)) > B_NR_ITEMS(p_s_parent) )
+	if ( (n_position = REISERFS_PATH_POS(p_s_path, n_counter - 1)) > reiserfs_node_items(p_s_parent) )
 	    reiserfs_panic ("get_far_parent: incorrect position in the parent");
 
 	/* Check whether parent at the path really points to the child. */
-	if ( get_dc_child_blocknr (B_N_CHILD (p_s_parent, n_position)) !=
-	     PATH_OFFSET_PBUFFER(p_s_path, n_counter)->b_blocknr )
+	if ( reiserfs_dc_get_nr (reiserfs_int_at (p_s_parent, n_position)) !=
+	     REISERFS_PATH_BUFFER(p_s_path, n_counter)->b_blocknr )
 	    reiserfs_panic ("get_far_parent: incorrect disk child in the parent");
 
 	/* Return delimiting key if position in the parent is not equal to first/last one. */
 	if ( c_lr_par == RIGHT_PARENTS )
-	    n_first_last_position = get_blkh_nr_items (B_BLK_HEAD(p_s_parent));
+	    n_first_last_position = reiserfs_nh_get_items (NODE_HEAD(p_s_parent));
 	if ( n_position != n_first_last_position ) {
 	    (*pp_s_com_father = p_s_parent)->b_count++;
 	    break;
@@ -1289,14 +1372,14 @@
     }
     
     /* we are in the root of the tree. */
-    if ( n_counter == FIRST_PATH_ELEMENT_OFFSET ) {
-	struct reiserfs_super_block * sb;
+    if ( n_counter == REISERFS_PATH_OFFINIT ) {
+	reiserfs_sb_t * sb;
 
 	sb = p_s_tb->tb_fs->fs_ondisk_sb;
 
 	/* Check whether first buffer in the path is the root of the tree. */
-	if ( PATH_OFFSET_PBUFFER(p_s_tb->tb_path, FIRST_PATH_ELEMENT_OFFSET)->b_blocknr ==
-	     get_sb_root_block (sb) ) {
+	if ( REISERFS_PATH_BUFFER(p_s_tb->tb_path, REISERFS_PATH_OFFINIT)->b_blocknr ==
+	     reiserfs_sb_get_root (sb) ) {
 	    *pp_s_father = *pp_s_com_father = NULL;
 	    return CARRY_ON;
 	}
@@ -1310,7 +1393,7 @@
        neighbor.  Now we are geting the parent of the left/right neighbor. */
 
     /* Form key to get parent of the left/right neighbor. */
-    copy_key(&s_lr_father_key, B_N_PDELIM_KEY(*pp_s_com_father, ( c_lr_par == LEFT_PARENTS ) ?
+    reiserfs_key_copy(&s_lr_father_key, reiserfs_int_key_at(*pp_s_com_father, ( c_lr_par == LEFT_PARENTS ) ?
 					      (p_s_tb->lkey[n_h - 1] = n_position - 1) : (p_s_tb->rkey[n_h - 1] = n_position)));
 
     if ( c_lr_par == LEFT_PARENTS ) {
@@ -1319,14 +1402,14 @@
 	//reiserfs_warning ("done: %k\n", &s_lr_father_key);
     }
 
-    init_path (&s_path_to_neighbor_father);
+    s_path_to_neighbor_father.path_length = REISERFS_PATH_OFFILL;
     
     if (search_by_key(p_s_tb->tb_fs, &s_lr_father_key, &s_path_to_neighbor_father, n_h + 1) == IO_ERROR)
 	return IO_ERROR;
     
-    *pp_s_father = PATH_PLAST_BUFFER(&s_path_to_neighbor_father);
+    *pp_s_father = REISERFS_PATH_LEAF(&s_path_to_neighbor_father);
     s_path_to_neighbor_father.path_length--;
-    pathrelse (&s_path_to_neighbor_father);
+    reiserfs_tree_pathrelse (&s_path_to_neighbor_father);
     //decrement_counters_in_path(&s_path_to_neighbor_father);
     return CARRY_ON;
 }
@@ -1339,23 +1422,23 @@
  * Returns:	SCHEDULE_OCCURRED - schedule occured while the function worked;
  *	        CARRY_ON - schedule didn't occur while the function worked;
  */
-static int  get_parents (struct tree_balance * p_s_tb, int n_h)
+static int  get_parents (reiserfs_tb_t * p_s_tb, int n_h)
 {
-    struct path         * p_s_path = p_s_tb->tb_path;
+    reiserfs_path_t         * p_s_path = p_s_tb->tb_path;
     int                   n_position,
 	n_ret_value,
-	n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h);
-    struct buffer_head  * p_s_curf,
+	n_path_offset = REISERFS_PATH_LEVEL(p_s_tb->tb_path, n_h);
+    reiserfs_bh_t  * p_s_curf,
 	* p_s_curcf;
 
     /* Current node is the root of the tree or will be root of the tree */
-    if ( n_path_offset <= FIRST_PATH_ELEMENT_OFFSET ) {
+    if ( n_path_offset <= REISERFS_PATH_OFFINIT ) {
 	/* The root can not have parents.
 	   Release nodes which previously were obtained as parents of the current node neighbors. */
-	brelse(p_s_tb->FL[n_h]);
-	brelse(p_s_tb->CFL[n_h]);
-	brelse(p_s_tb->FR[n_h]);
-	brelse(p_s_tb->CFR[n_h]);
+	reiserfs_buffer_close(p_s_tb->FL[n_h]);
+	reiserfs_buffer_close(p_s_tb->CFL[n_h]);
+	reiserfs_buffer_close(p_s_tb->FR[n_h]);
+	reiserfs_buffer_close(p_s_tb->CFR[n_h]);
 	//decrement_bcount(p_s_tb->FL[n_h]);
 	//decrement_bcount(p_s_tb->CFL[n_h]);
 	//decrement_bcount(p_s_tb->FR[n_h]);
@@ -1365,9 +1448,9 @@
     }
   
     /* Get parent FL[n_path_offset] of L[n_path_offset]. */
-    if ( (n_position = PATH_OFFSET_POSITION(p_s_path, n_path_offset - 1)) )  {
+    if ( (n_position = REISERFS_PATH_POS(p_s_path, n_path_offset - 1)) )  {
 	/* Current node is not the first child of its parent. */
-	(p_s_curf = p_s_curcf = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1))->b_count += 2;
+	(p_s_curf = p_s_curcf = REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1))->b_count += 2;
 	p_s_tb->lkey[n_h] = n_position - 1;
     }
     else  {
@@ -1380,16 +1463,16 @@
 	    return n_ret_value; /*schedule() occured or path is not correct*/
     }
 
-    brelse(p_s_tb->FL[n_h]);	
+    reiserfs_buffer_close(p_s_tb->FL[n_h]);	
     p_s_tb->FL[n_h] = p_s_curf; /* New initialization of FL[n_h]. */
  
-    brelse(p_s_tb->CFL[n_h]);
+    reiserfs_buffer_close(p_s_tb->CFL[n_h]);
     p_s_tb->CFL[n_h] = p_s_curcf; /* New initialization of CFL[n_h]. */
 
 /* Get parent FR[n_h] of R[n_h]. */
 
 /* Current node is the last child of F[n_h]. FR[n_h] != F[n_h]. */
-    if ( n_position == get_blkh_nr_items (B_BLK_HEAD(PATH_H_PBUFFER(p_s_path, n_h + 1))) ) {
+    if ( n_position == reiserfs_nh_get_items (NODE_HEAD(REISERFS_PATH_UPBUFFER(p_s_path, n_h + 1))) ) {
 /* Calculate current parent of R[n_h], which is the right neighbor of F[n_h].
    Calculate current common parent of R[n_h] and current node. Note that CFR[n_h]
    not equal FR[n_path_offset] and CFR[n_h] not equal F[n_h]. */
@@ -1398,14 +1481,14 @@
     }
     else {
 /* Current node is not the last child of its parent F[n_h]. */
-	(p_s_curf = p_s_curcf = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1))->b_count += 2;
+	(p_s_curf = p_s_curcf = REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1))->b_count += 2;
 	p_s_tb->rkey[n_h] = n_position;
     }	
 
-    brelse/*decrement_bcount*/(p_s_tb->FR[n_h]);
+    reiserfs_buffer_close/*decrement_bcount*/(p_s_tb->FR[n_h]);
     p_s_tb->FR[n_h] = p_s_curf; /* New initialization of FR[n_path_offset]. */
 
-    brelse/*decrement_bcount*/(p_s_tb->CFR[n_h]);
+    reiserfs_buffer_close/*decrement_bcount*/(p_s_tb->CFR[n_h]);
     p_s_tb->CFR[n_h] = p_s_curcf; /* New initialization of CFR[n_path_offset]. */
 
     return CARRY_ON; /* schedule not occured while get_parents() worked. */
@@ -1414,26 +1497,26 @@
 
 /* it is possible to remove node as result of shiftings to
    neighbors even when we insert or paste item. */
-static inline int can_node_be_removed (int mode, int lfree, int sfree, int rfree, struct tree_balance * tb, int h)
+static inline int can_node_be_removed (int mode, int lfree, int sfree, int rfree, reiserfs_tb_t * tb, int h)
 {
-    struct buffer_head * Sh = PATH_H_PBUFFER (tb->tb_path, h);
+    reiserfs_bh_t * Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
     int levbytes = tb->insert_size[h];
-    struct item_head * r_ih = NULL;
+    reiserfs_ih_t * r_ih = NULL;
   
     if ( tb->CFR[h] )
-	r_ih = (struct item_head *)B_N_PDELIM_KEY(tb->CFR[h],tb->rkey[h]);
+	r_ih = (reiserfs_ih_t *)reiserfs_int_key_at(tb->CFR[h],tb->rkey[h]);
   
-    if (lfree + rfree + sfree < (int)(MAX_CHILD_SIZE(Sh->b_size) + levbytes
+    if (lfree + rfree + sfree < (int)(REISERFS_NODE_SPACE(Sh->b_size) + levbytes
 	/* shifting may merge items which might save space */
-	- (( ! h && is_left_mergeable (tb->tb_fs, tb->tb_path) == 1 ) ? IH_SIZE : 0)
-	- (( ! h && r_ih && is_right_mergeable (tb->tb_fs, tb->tb_path) == 1 ) ? IH_SIZE : 0)
-	+ (( h ) ? KEY_SIZE : 0)))
+	- (( ! h && reiserfs_tree_left_mergeable (tb->tb_fs, tb->tb_path) == 1 ) ? REISERFS_IH_SIZE : 0)
+	- (( ! h && r_ih && reiserfs_tree_right_mergeable (tb->tb_fs, tb->tb_path) == 1 ) ? REISERFS_IH_SIZE : 0)
+	+ (( h ) ? REISERFS_KEY_SIZE : 0)))
     {
 	/* node can not be removed */
 	if (sfree >= levbytes ) /* new item fits into node S[h] without any shifting */
 	{
 	    if ( ! h )
-		tb->s0num = B_NR_ITEMS(Sh) + ((mode == M_INSERT ) ? 1 : 0);
+		tb->s0num = reiserfs_node_items(Sh) + ((mode == M_INSERT ) ? 1 : 0);
 	    set_parameters (tb, h, 0, 0, 1, NULL, -1, -1);
 	    return NO_BALANCING_NEEDED;
 	}
@@ -1457,9 +1540,9 @@
  *	       -2 - no disk space.
  */
 /* ip means Inserting or Pasting */
-static int ip_check_balance (/*struct reiserfs_transaction_handle *th,*/ struct tree_balance * tb, int h)
+static int ip_check_balance (reiserfs_tb_t * tb, int h)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
     int levbytes,  /* Number of bytes that must be inserted into (value is
 		      negative if bytes are deleted) buffer which contains
 		      node being balanced.  The mnemonic is that the attempted
@@ -1492,7 +1575,7 @@
 				   */
 
     /* Sh is the node whose balance is currently being checked */
-    struct buffer_head * Sh;
+    reiserfs_bh_t * Sh;
   
     /* special mode for insert pointer to the most low internal node */
     if (h == 0 && vn->vn_mode == M_INTERNAL) {
@@ -1501,7 +1584,7 @@
 	return 0;
     }
 
-    Sh = PATH_H_PBUFFER (tb->tb_path, h);
+    Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
     levbytes = tb->insert_size[h];
     
     /* Calculate balance parameters for creating new root. */
@@ -1524,7 +1607,7 @@
     if ( (n_ret_value = get_parents (tb, h)) != CARRY_ON ) /* get parents of S[h] neighbors. */
 	return n_ret_value;
     
-    sfree = get_blkh_free_space (B_BLK_HEAD(Sh));
+    sfree = reiserfs_nh_get_free (NODE_HEAD(Sh));
     
     /* get free space of neighbors */
     rfree = get_rfree (tb, h);
@@ -1534,7 +1617,7 @@
 	/* and new item fits into node S[h] without any shifting */
 	return NO_BALANCING_NEEDED;
     
-    create_virtual_node (tb, h);
+    create_reiserfs_virtual_node (tb, h);
     
      /* determine maximal number of items we can shift to the left neighbor
 	(in tb structure) and the maximal number of bytes that can flow to the
@@ -1559,8 +1642,8 @@
 	  rather than the space they consume.  In this routine we set the left
 	  node equal to the right node, allowing a difference of less than or
 	  equal to 1 child pointer. */
-	to_r = ((MAX_NR_KEY(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - 
-	    (MAX_NR_KEY(Sh) + 1 - tb->rnum[h]);
+	to_r = ((REISERFS_INT_MAX(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - 
+	    (REISERFS_INT_MAX(Sh) + 1 - tb->rnum[h]);
 	set_parameters (tb, h, vn->vn_nr_item + 1 - to_r, to_r, 0, NULL, -1, -1);
 	return CARRY_ON;
     }
@@ -1763,23 +1846,23 @@
  * Note: Items of internal nodes have fixed size, so the balance condition for
  * the internal part of internal tree is as for the B-trees.
  */
-static int dc_check_balance_internal (struct tree_balance * tb, int h)
+static int dc_check_balance_internal (reiserfs_tb_t * tb, int h)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
 
   /* Sh is the node whose balance is currently being checked,
      and Fh is its father.  */
-    struct buffer_head * Sh, * Fh;
+    reiserfs_bh_t * Sh, * Fh;
     int n_ret_value;
     int lfree, rfree /* free space in L and R */;
 
-    Sh = PATH_H_PBUFFER (tb->tb_path, h); 
-    Fh = PATH_H_PPARENT (tb->tb_path, h); 
+    Sh = REISERFS_PATH_UPBUFFER (tb->tb_path, h); 
+    Fh = REISERFS_PATH_UPPARENT (tb->tb_path, h); 
 
     /* using tb->insert_size[h], which is negative in this case,
-       create_virtual_node calculates: new_nr_item = number of items node
+       create_reiserfs_virtual_node calculates: new_nr_item = number of items node
        would have if operation is performed without balancing (new_nr_item); */
-    create_virtual_node (tb, h);
+    create_reiserfs_virtual_node (tb, h);
 
     if ( ! Fh ) {
 	/* S[h] is the root. */
@@ -1806,10 +1889,10 @@
     check_left (tb, h, lfree);
     check_right (tb, h, rfree);
     
-    if ( vn->vn_nr_item >= MIN_NR_KEY(Sh) ) {
+    if ( vn->vn_nr_item >= REISERFS_INT_MIN(Sh) ) {
 	/* Balance condition for the internal node is valid. In this case we
 	 * balance only if it leads to better packing. */
-	if ( vn->vn_nr_item == MIN_NR_KEY(Sh) ) {
+	if ( vn->vn_nr_item == REISERFS_INT_MIN(Sh) ) {
 	    /* Here we join S[h] with one of its neighbors, which is
 	     * impossible with greater values of new_nr_item. */
 	    if ( tb->lnum[h] >= vn->vn_nr_item + 1 ) {
@@ -1817,8 +1900,8 @@
 		int n;
 		int order_L;
 		
-		order_L = ((n=PATH_H_B_ITEM_ORDER(tb->tb_path, h))==0) ? B_NR_ITEMS(tb->FL[h]) : n - 1;
-		n = get_dc_child_size (B_N_CHILD(tb->FL[h],order_L)) / (DC_SIZE + KEY_SIZE);
+		order_L = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==0) ? reiserfs_node_items(tb->FL[h]) : n - 1;
+		n = reiserfs_dc_get_size (reiserfs_int_at(tb->FL[h],order_L)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
 		set_parameters (tb, h, -n-1, 0, 0, NULL, -1, -1);
 		return CARRY_ON;
 	    }
@@ -1828,8 +1911,8 @@
 		int n;
 		int order_R;
 		
-		order_R = ((n=PATH_H_B_ITEM_ORDER(tb->tb_path, h))==B_NR_ITEMS(Fh)) ? 0 : n + 1;
-		n = get_dc_child_size (B_N_CHILD(tb->FR[h],order_R)) / (DC_SIZE + KEY_SIZE);
+		order_R = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==reiserfs_node_items(Fh)) ? 0 : n + 1;
+		n = reiserfs_dc_get_size (reiserfs_int_at(tb->FR[h],order_R)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
 		set_parameters (tb, h, 0, -n-1, 0, NULL, -1, -1);
 		return CARRY_ON;   
 	    }
@@ -1840,8 +1923,8 @@
                R[h]). */
 	    int to_r;
 	    
-	    to_r = ((MAX_NR_KEY(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - 
-		(MAX_NR_KEY(Sh) + 1 - tb->rnum[h]);
+	    to_r = ((REISERFS_INT_MAX(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - 
+		(REISERFS_INT_MAX(Sh) + 1 - tb->rnum[h]);
 	    set_parameters (tb, h, vn->vn_nr_item + 1 - to_r, to_r, 0, NULL, -1, -1);
 	    return CARRY_ON;
 	}
@@ -1858,8 +1941,8 @@
 	    int n;
 	    int order_L;
 	    
-	    order_L = ((n=PATH_H_B_ITEM_ORDER(tb->tb_path, h))==0) ? B_NR_ITEMS(tb->FL[h]) : n - 1;
-	    n = get_dc_child_size (B_N_CHILD(tb->FL[h],order_L)) / (DC_SIZE + KEY_SIZE);
+	    order_L = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==0) ? reiserfs_node_items(tb->FL[h]) : n - 1;
+	    n = reiserfs_dc_get_size (reiserfs_int_at(tb->FL[h],order_L)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
 	    set_parameters (tb, h, -n-1, 0, 0, NULL, -1, -1);
 	    return CARRY_ON;
 	}
@@ -1869,8 +1952,8 @@
 	int n;
 	int order_R;
 	
-	order_R = ((n=PATH_H_B_ITEM_ORDER(tb->tb_path, h))==B_NR_ITEMS(Fh)) ? 0 : (n + 1);
-	n = get_dc_child_size (B_N_CHILD(tb->FR[h],order_R)) / (DC_SIZE + KEY_SIZE);
+	order_R = ((n=REISERFS_PATH_UPPARENT_POS(tb->tb_path, h))==reiserfs_node_items(Fh)) ? 0 : (n + 1);
+	n = reiserfs_dc_get_size (reiserfs_int_at(tb->FR[h],order_R)) / (REISERFS_DC_SIZE + REISERFS_KEY_SIZE);
 	set_parameters (tb, h, 0, -n-1, 0, NULL, -1, -1);
 	return CARRY_ON;   
     }
@@ -1879,8 +1962,8 @@
     if (tb->rnum[h] + tb->lnum[h] >= vn->vn_nr_item + 1) {
 	int to_r;
 	
-	to_r = ((MAX_NR_KEY(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - 
-	    (MAX_NR_KEY(Sh) + 1 - tb->rnum[h]);
+	to_r = ((REISERFS_INT_MAX(Sh)<<1)+2-tb->lnum[h]-tb->rnum[h]+vn->vn_nr_item+1)/2 - 
+	    (REISERFS_INT_MAX(Sh) + 1 - tb->rnum[h]);
 	set_parameters (tb, h, vn->vn_nr_item + 1 - to_r, to_r, 0, NULL, -1, -1);
 	return CARRY_ON;
     }
@@ -1890,12 +1973,12 @@
     if (is_left_neighbor_in_cache (tb,h) || !tb->FR[h]) {
 	int from_l;
 		
-	from_l = (MAX_NR_KEY(Sh) + 1 - tb->lnum[h] + vn->vn_nr_item + 1) / 2 -  (vn->vn_nr_item + 1);
+	from_l = (REISERFS_INT_MAX(Sh) + 1 - tb->lnum[h] + vn->vn_nr_item + 1) / 2 -  (vn->vn_nr_item + 1);
 	set_parameters (tb, h, -from_l, 0, 1, NULL, -1, -1);
 	return CARRY_ON;
     }
     
-    set_parameters (tb, h, 0, -((MAX_NR_KEY(Sh)+1-tb->rnum[h]+vn->vn_nr_item+1)/2-(vn->vn_nr_item+1)), 1, 
+    set_parameters (tb, h, 0, -((REISERFS_INT_MAX(Sh)+1-tb->rnum[h]+vn->vn_nr_item+1)/2-(vn->vn_nr_item+1)), 1, 
 		    NULL, -1, -1);
     return CARRY_ON;
 }
@@ -1914,9 +1997,9 @@
  *	       -1 - no balancing for higher levels needed;
  *	       -2 - no disk space.
  */
-static int dc_check_balance_leaf (struct tree_balance * tb, int h)
+static int dc_check_balance_leaf (reiserfs_tb_t * tb, int h)
 {
-    struct virtual_node * vn = tb->tb_vn;
+    struct reiserfs_virtual_node * vn = tb->tb_vn;
 
     /* Number of bytes that must be deleted from (value is negative if bytes
        are deleted) buffer which contains node being balanced.  The mnemonic
@@ -1926,10 +2009,10 @@
     /* the maximal item size */
     int n_ret_value;
     /* F0 is the parent of the node whose balance is currently being checked */
-    struct buffer_head * F0;
+    reiserfs_bh_t * F0;
     int lfree, rfree /* free space in L and R */;
     
-    F0 = PATH_H_PPARENT (tb->tb_path, 0);
+    F0 = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
 
     levbytes = tb->insert_size[h];
 
@@ -1946,7 +2029,7 @@
     rfree = get_rfree (tb, h);
     lfree = get_lfree (tb, h);		
 
-    create_virtual_node (tb, h);
+    create_reiserfs_virtual_node (tb, h);
     
     /* if 3 leaves can be merge to one, set parameters and return */
     if (are_leaves_removable (tb, lfree, rfree))
@@ -2001,7 +2084,7 @@
  *	       -1 - no balancing for higher levels needed;
  *	       -2 - no disk space.
  */
-static int dc_check_balance (struct tree_balance * tb, int h)
+static int dc_check_balance (reiserfs_tb_t * tb, int h)
 {
     if ( h )
 	return dc_check_balance_internal (tb, h);
@@ -2029,13 +2112,13 @@
  *	       -1 - no balancing for higher levels needed;
  *	       -2 - no disk space.
  */
-static int check_balance (int mode, struct tree_balance * tb,
+static int check_balance (int mode, reiserfs_tb_t * tb,
 			  int h, int inum, int pos_in_item,
-			  struct item_head * ins_ih)
+			  reiserfs_ih_t * ins_ih)
 {
-    struct virtual_node * vn;
+    struct reiserfs_virtual_node * vn;
     
-    vn = tb->tb_vn = (struct virtual_node *)(tb->vn_buf);// + ROUND_UP(SB_BMAP_NR (tb->tb_fs) * 2 / 8 + 1, 4));
+    vn = tb->tb_vn = (struct reiserfs_virtual_node *)(tb->vn_buf);// + MISC_ROUND_UP(SB_BMAP_NR (tb->tb_fs) * 2 / 8 + 1, 4));
     vn->vn_free_ptr = (char *)(tb->tb_vn + 1);
     vn->vn_mode = mode;
     vn->vn_affected_item_num = inum;
@@ -2052,38 +2135,38 @@
 
 
 /* Check whether parent at the path is the really parent of the current node.*/
-static void get_direct_parent (struct tree_balance * p_s_tb, int n_h)
+static void get_direct_parent (reiserfs_tb_t * p_s_tb, int n_h)
 {
-    struct buffer_head  * p_s_bh;
-    struct path         * p_s_path      = p_s_tb->tb_path;
+    reiserfs_bh_t  * p_s_bh;
+    reiserfs_path_t         * p_s_path      = p_s_tb->tb_path;
     int                   n_position,
-	n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h);
+	n_path_offset = REISERFS_PATH_LEVEL(p_s_tb->tb_path, n_h);
     
     /* We are in the root or in the new root. */
-    if ( n_path_offset <= FIRST_PATH_ELEMENT_OFFSET ) {
-	struct reiserfs_super_block * sb;
+    if ( n_path_offset <= REISERFS_PATH_OFFINIT ) {
+	reiserfs_sb_t * sb;
 	
-	if ( n_path_offset < FIRST_PATH_ELEMENT_OFFSET - 1 )
+	if ( n_path_offset < REISERFS_PATH_OFFINIT - 1 )
 	    reiserfs_panic ("PAP-8260: get_direct_parent: illegal offset in the path");
 
 	sb = p_s_tb->tb_fs->fs_ondisk_sb;
-	if ( PATH_OFFSET_PBUFFER(p_s_path, FIRST_PATH_ELEMENT_OFFSET)->b_blocknr ==
-	     get_sb_root_block (sb) ) {
+	if ( REISERFS_PATH_BUFFER(p_s_path, REISERFS_PATH_OFFINIT)->b_blocknr ==
+	     reiserfs_sb_get_root (sb) ) {
 	    /* Root is not changed. */
-	    PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1) = NULL;
-	    PATH_OFFSET_POSITION(p_s_path, n_path_offset - 1) = 0;
+	    REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1) = NULL;
+	    REISERFS_PATH_POS(p_s_path, n_path_offset - 1) = 0;
 	    return;
 	}
 	reiserfs_panic ("get_direct_parent: root changed");
     }
     
-    if ( ! B_IS_IN_TREE(p_s_bh = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1)) )
+    if ( ! REISERFS_NODE_INTREE(p_s_bh = REISERFS_PATH_BUFFER(p_s_path, n_path_offset - 1)) )
 	reiserfs_panic ("get_direct_parent: parent in the path is not in the tree");
     
-    if ( (n_position = PATH_OFFSET_POSITION(p_s_path, n_path_offset - 1)) > B_NR_ITEMS(p_s_bh) )
+    if ( (n_position = REISERFS_PATH_POS(p_s_path, n_path_offset - 1)) > reiserfs_node_items(p_s_bh) )
 	reiserfs_panic ("get_direct_parent: wrong position in the path");
     
-    if ( get_dc_child_blocknr (B_N_CHILD(p_s_bh, n_position)) != PATH_OFFSET_PBUFFER(p_s_path, n_path_offset)->b_blocknr )
+    if ( reiserfs_dc_get_nr (reiserfs_int_at(p_s_bh, n_position)) != REISERFS_PATH_BUFFER(p_s_path, n_path_offset)->b_blocknr )
 	reiserfs_panic ("get_direct_parent: parent in the path is not parent "
 			"of the current node in the tree");
     
@@ -2097,77 +2180,53 @@
  * Returns:	SCHEDULE_OCCURRED - schedule occured while the function worked;
  *	        CARRY_ON - schedule didn't occur while the function worked;
  */
-static int get_neighbors(struct tree_balance * p_s_tb, int n_h)
+static int get_neighbors(reiserfs_tb_t * p_s_tb, int n_h)
 {
     int		 	n_child_position,
-	n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h + 1);
+	n_path_offset = REISERFS_PATH_LEVEL(p_s_tb->tb_path, n_h + 1);
     unsigned long		n_son_number;
     reiserfs_filsys_t * fs = p_s_tb->tb_fs;
-    struct buffer_head  * p_s_bh;
-    /*struct virtual_node * vn = p_s_tb->tb_vn;*/
+    reiserfs_bh_t  * p_s_bh;
+    /*struct reiserfs_virtual_node * vn = p_s_tb->tb_vn;*/
     
     if ( p_s_tb->lnum[n_h] ) {
 	/* We need left neighbor to balance S[n_h]. */
-	p_s_bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
+	p_s_bh = REISERFS_PATH_BUFFER(p_s_tb->tb_path, n_path_offset);
 	
 	n_child_position = ( p_s_bh == p_s_tb->FL[n_h] ) ? p_s_tb->lkey[n_h] :
-	    get_blkh_nr_items (B_BLK_HEAD(p_s_tb->FL[n_h]));
-	n_son_number = get_dc_child_blocknr (B_N_CHILD (p_s_tb->FL[n_h], n_child_position));
-	p_s_bh = bread(fs->fs_dev, n_son_number, fs->fs_blocksize);
+	    reiserfs_nh_get_items (NODE_HEAD(p_s_tb->FL[n_h]));
+	n_son_number = reiserfs_dc_get_nr (reiserfs_int_at (p_s_tb->FL[n_h], n_child_position));
+	p_s_bh = reiserfs_buffer_read(fs->fs_dev, n_son_number, fs->fs_blocksize);
 	if (!p_s_bh)
 	    return IO_ERROR;
-	brelse (p_s_tb->L[n_h]);
+	reiserfs_buffer_close (p_s_tb->L[n_h]);
 	p_s_tb->L[n_h] = p_s_bh;
     }
 
     if ( p_s_tb->rnum[n_h] ) { /* We need right neighbor to balance S[n_path_offset]. */
-	p_s_bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
+	p_s_bh = REISERFS_PATH_BUFFER(p_s_tb->tb_path, n_path_offset);
 	n_child_position = ( p_s_bh == p_s_tb->FR[n_h] ) ? p_s_tb->rkey[n_h] + 1 : 0;
-	n_son_number = get_dc_child_blocknr (B_N_CHILD (p_s_tb->FR[n_h], n_child_position));
-	p_s_bh = bread(fs->fs_dev, n_son_number, fs->fs_blocksize);
+	n_son_number = reiserfs_dc_get_nr (reiserfs_int_at (p_s_tb->FR[n_h], n_child_position));
+	p_s_bh = reiserfs_buffer_read(fs->fs_dev, n_son_number, fs->fs_blocksize);
 	if (!p_s_bh)
 	    return IO_ERROR;
 
-	brelse (p_s_tb->R[n_h]);
+	reiserfs_buffer_close (p_s_tb->R[n_h]);
 	p_s_tb->R[n_h] = p_s_bh;
     }
     return CARRY_ON;
 }
 
-#if 0
-void * reiserfs_kmalloc (size_t size, int flags, struct super_block * s)
+static int get_mem_for_reiserfs_virtual_node (reiserfs_tb_t * tb)
 {
-  void * vp;
-
-  vp = getmem (size);
-  return vp;
-}
-
-void reiserfs_kfree (/*const */void * vp, size_t size, struct super_block * s)
-{
-  freemem (vp);
-
-
-  kfree (vp);
-  
-  s->u.reiserfs_sb.s_kmallocs -= size;
-  if (s->u.reiserfs_sb.s_kmallocs < 0)
-    reiserfs_warning ("vs-8302: reiserfs_kfree: allocated memory %d\n", s->u.reiserfs_sb.s_kmallocs);
-
-}
-#endif
-
-
-static int get_mem_for_virtual_node (struct tree_balance * tb)
-{
-    tb->vn_buf = getmem (tb->tb_fs->fs_blocksize);
+    tb->vn_buf = misc_getmem (tb->tb_fs->fs_blocksize);
     return CARRY_ON;
 }
 
 
-static void free_virtual_node_mem (struct tree_balance * tb)
+static void free_reiserfs_virtual_node_mem (reiserfs_tb_t * tb)
 {
-    freemem (tb->vn_buf);
+    misc_freemem (tb->vn_buf);
 }
 
 
@@ -2200,22 +2259,23 @@
  */
 
 
-int fix_nodes (int n_op_mode, struct tree_balance * p_s_tb,
-	       struct item_head * p_s_ins_ih)
+int reiserfs_fix_nodes (int n_op_mode, 
+			reiserfs_tb_t * p_s_tb,
+			reiserfs_ih_t * p_s_ins_ih)
 {
     int n_pos_in_item = p_s_tb->tb_path->pos_in_item;
     int	n_ret_value,
     	n_h,
-    	n_item_num = get_item_pos (p_s_tb->tb_path);
-    /*    struct buffer_head  * p_s_tbS0 = get_bh (p_s_tb->tb_path);*/
-    /*    struct item_head * ih = get_ih (p_s_tb->tb_path);*/
+    	n_item_num = REISERFS_PATH_LEAF_POS (p_s_tb->tb_path);
+    /*    reiserfs_bh_t  * p_s_tbS0 = REISERFS_PATH_LEAF (p_s_tb->tb_path);*/
+    /*    reiserfs_ih_t * ih = REISERFS_PATH_IH (p_s_tb->tb_path);*/
 
 
-    if (get_mem_for_virtual_node (p_s_tb) != CARRY_ON)
-	reiserfs_panic ("fix_nodes: no memory for virtual node");
+    if (get_mem_for_reiserfs_virtual_node (p_s_tb) != CARRY_ON)
+	reiserfs_panic ("reiserfs_fix_nodes: no memory for virtual node");
 
     /* Starting from the leaf level; for all levels n_h of the tree. */
-    for ( n_h = 0; n_h < MAX_HEIGHT && p_s_tb->insert_size[n_h]; n_h++ ) { 
+    for ( n_h = 0; n_h < REISERFS_TREE_HEIGHT_MAX && p_s_tb->insert_size[n_h]; n_h++ ) { 
 	get_direct_parent(p_s_tb, n_h);
 
 	if ( (n_ret_value = check_balance (/*th,*/ n_op_mode, p_s_tb, n_h, n_item_num,
@@ -2225,7 +2285,7 @@
 		if ( (n_ret_value = get_neighbors(p_s_tb, n_h)) != CARRY_ON ) {
 		    return n_ret_value;
 		}
-		if ( n_h != MAX_HEIGHT - 1 )  
+		if ( n_h != REISERFS_TREE_HEIGHT_MAX - 1 )  
 		    p_s_tb->insert_size[n_h + 1] = 0;
 		/* ok, analysis and resource gathering are complete */
 		break;
@@ -2242,72 +2302,113 @@
 	    return n_ret_value; /* No disk space */
 	}
     
-	if ( ! PATH_H_PBUFFER(p_s_tb->tb_path, n_h) ) {
+	if ( ! REISERFS_PATH_UPBUFFER(p_s_tb->tb_path, n_h) ) {
 	    /* We have a positive insert size but no nodes exist on this
 	       level, this means that we are creating a new root. */
-	    if ( n_h < MAX_HEIGHT - 1 )
+	    if ( n_h < REISERFS_TREE_HEIGHT_MAX - 1 )
 		p_s_tb->insert_size[n_h + 1] = 0;
 	}
 	else
-	    if ( ! PATH_H_PBUFFER(p_s_tb->tb_path, n_h + 1) ) {
+	    if ( ! REISERFS_PATH_UPBUFFER(p_s_tb->tb_path, n_h + 1) ) {
 		if ( p_s_tb->blknum[n_h] > 1 ) {
 		    /* The tree needs to be grown, so this node S[n_h] which
 		       is the root node is split into two nodes, and a new
 		       node (S[n_h+1]) will be created to become the root
 		       node.  */
-		    p_s_tb->insert_size[n_h + 1] = (DC_SIZE + KEY_SIZE) * (p_s_tb->blknum[n_h] - 1) + DC_SIZE;
+		    p_s_tb->insert_size[n_h + 1] = (REISERFS_DC_SIZE + REISERFS_KEY_SIZE) * 
+			    (p_s_tb->blknum[n_h] - 1) + REISERFS_DC_SIZE;
 		}
 		else
-		    if ( n_h < MAX_HEIGHT - 1 )
+		    if ( n_h < REISERFS_TREE_HEIGHT_MAX - 1 )
 			p_s_tb->insert_size[n_h + 1] = 0;
 	    }
 	    else
-		p_s_tb->insert_size[n_h + 1] = (DC_SIZE + KEY_SIZE) * (p_s_tb->blknum[n_h] - 1);
+		p_s_tb->insert_size[n_h + 1] = (REISERFS_DC_SIZE + REISERFS_KEY_SIZE) * 
+			(p_s_tb->blknum[n_h] - 1);
     }
 
     return CARRY_ON; /* go ahead and balance */
 }
 
 
-void unfix_nodes (struct tree_balance * p_s_tb)
+void reiserfs_unfix_nodes (reiserfs_tb_t * p_s_tb)
 {
-    struct path * p_s_path = p_s_tb->tb_path;
+    reiserfs_path_t * p_s_path = p_s_tb->tb_path;
     int		n_counter;
     //  int i, j;
-    //struct buffer_head * bh;
+    //reiserfs_bh_t * bh;
 
     /* Release path buffers. */
-    pathrelse(p_s_path);
+    reiserfs_tree_pathrelse(p_s_path);
 
 
-    for ( n_counter = 0; n_counter < MAX_HEIGHT; n_counter++ ) {
+    for ( n_counter = 0; n_counter < REISERFS_TREE_HEIGHT_MAX; n_counter++ ) {
 	/* Release fathers and neighbors. */
-	brelse(p_s_tb->L[n_counter]);
-	brelse(p_s_tb->R[n_counter]);
-	brelse(p_s_tb->FL[n_counter]);
-	brelse(p_s_tb->FR[n_counter]);
-	brelse(p_s_tb->CFL[n_counter]);
-	brelse(p_s_tb->CFR[n_counter]);
+	reiserfs_buffer_close(p_s_tb->L[n_counter]);
+	reiserfs_buffer_close(p_s_tb->R[n_counter]);
+	reiserfs_buffer_close(p_s_tb->FL[n_counter]);
+	reiserfs_buffer_close(p_s_tb->FR[n_counter]);
+	reiserfs_buffer_close(p_s_tb->CFL[n_counter]);
+	reiserfs_buffer_close(p_s_tb->CFR[n_counter]);
     }
 
     /* Could be optimized. Will be done by PAP someday */
-    for ( n_counter = 0; n_counter < MAX_FEB_SIZE; n_counter++ ) {
+    for ( n_counter = 0; n_counter < TB_FEB_MAX; n_counter++ ) {
 	if ( p_s_tb->FEB[n_counter] ) {
 	    /* release what was not used */
-	    reiserfs_free_block(p_s_tb->tb_fs, p_s_tb->FEB[n_counter]->b_blocknr);
+	    assert (p_s_tb->tb_fs->block_deallocator != NULL);
+	    p_s_tb->tb_fs->block_deallocator(p_s_tb->tb_fs, 
+					     p_s_tb->FEB[n_counter]->b_blocknr);
 
-	    bforget(p_s_tb->FEB[n_counter]);
+	    reiserfs_buffer_forget(p_s_tb->FEB[n_counter]);
 	    /* tree balance bitmap of bitmaps has bit set already */
 	}
 	/* release used as new nodes including a new root */
-	brelse (p_s_tb->used[n_counter]);
+	reiserfs_buffer_close (p_s_tb->used[n_counter]);
     }
 
-    free_virtual_node_mem (p_s_tb);
+    free_reiserfs_virtual_node_mem (p_s_tb);
 } 
 
+static char * vi_type (struct reiserfs_virtual_item * vi) {
+    static char *types[]={"directory", "direct", "extent", "stat data"};
 
+    if (vi->vi_type & VI_TYPE_STAT_DATA)
+	return types[3];
+    if (vi->vi_type & VI_TYPE_EXTENT)
+	return types[2];
+    if (vi->vi_type & VI_TYPE_DIRECT)
+	return types[1];
+    if (vi->vi_type & VI_TYPE_DIRECTORY)
+	return types[0];
 
+    reiserfs_panic ("vi_type: 6000: unknown type (0x%x)", vi->vi_type);
+    return NULL;
+}
 
+void reiserfs_fix_node_print(struct reiserfs_virtual_node * vn) {
+    int i, j;
+  
+    printf ("VIRTUAL NODE CONTAINS %d items, has size %d,%s,%s, ITEM_POS=%d "
+	    "POS_IN_ITEM=%d MODE=\'%c\'\n", vn->vn_nr_item, vn->vn_size,
+	    (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE )? "left mergeable" :
+	    "", (vn->vn_vi[vn->vn_nr_item - 1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ? 
+	    "right mergeable" : "", vn->vn_affected_item_num, vn->vn_pos_in_item, 
+	    vn->vn_mode);
 
+    for (i = 0; i < vn->vn_nr_item; i ++) {
+	printf ("%s %d %d", vi_type (&vn->vn_vi[i]), i, 
+		vn->vn_vi[i].vi_item_len);
+	
+	if (vn->vn_vi[i].vi_entry_sizes) {
+	    printf ("It is directory with %d entries: ", 
+		    vn->vn_vi[i].vi_entry_count);
+	    
+	    for (j = 0; j < vn->vn_vi[i].vi_entry_count; j ++)
+		printf ("%d ", vn->vn_vi[i].vi_entry_sizes[j]);
+	}
+	
+	printf ("\n");
+    }
+}
 
diff --git a/libreiserfs/hash.c b/libreiserfs/hash.c
new file mode 100644
index 0000000..fda860f
--- /dev/null
+++ b/libreiserfs/hash.c
@@ -0,0 +1,358 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+/*
+ * Keyed 32-bit hash function using TEA in a Davis-Meyer function
+ *   H0 = Key
+ *   Hi = E Mi(Hi-1) + Hi-1
+ *
+ * (see Applied Cryptography, 2nd edition, p448).
+ *
+ * Jeremy Fitzhardinge <jeremy@zip.com.au> 1998
+ * 
+ * Jeremy has agreed to the contents of reiserfs/README. -Hans
+ * Yura's function is added (04/07/2000)
+ */
+
+//
+// reiserfs_hash_keyed
+// reiserfs_hash_yura
+// r5
+//
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+#define DELTA 0x9E3779B9
+#define FULLROUNDS 10		/* 32 is overkill, 16 is strong crypto */
+#define PARTROUNDS 6		/* 6 gets complete mixing */
+
+/* a, b, c, d - data; h0, h1 - accumulated hash */
+#define TEACORE(rounds)							\
+	do {								\
+		__u32 sum = 0;						\
+		int n = rounds;						\
+		__u32 b0, b1;						\
+									\
+		b0 = h0;						\
+		b1 = h1;						\
+									\
+		do							\
+		{							\
+			sum += DELTA;					\
+			b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b);	\
+			b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d);	\
+		} while(--n);						\
+									\
+		h0 += b0;						\
+		h1 += b1;						\
+	} while(0);
+
+
+__u32 reiserfs_hash_keyed(const char *msg, int len)
+{
+	__u32 k[] = { 0x9464a485, 0x542e1a94, 0x3e846bff, 0xb75bcfc3}; 
+
+	__u32 h0 = k[0], h1 = k[1];
+	__u32 a, b, c, d;
+	__u32 pad;
+	int i;
+ 
+
+	pad = (__u32)len | ((__u32)len << 8);
+	pad |= pad << 16;
+
+	while(len >= 16)
+	{
+		a = (__u32)msg[ 0]      |
+		    (__u32)msg[ 1] << 8 |
+		    (__u32)msg[ 2] << 16|
+		    (__u32)msg[ 3] << 24;
+		b = (__u32)msg[ 4]      |
+		    (__u32)msg[ 5] << 8 |
+		    (__u32)msg[ 6] << 16|
+		    (__u32)msg[ 7] << 24;
+		c = (__u32)msg[ 8]      |
+		    (__u32)msg[ 9] << 8 |
+		    (__u32)msg[10] << 16|
+		    (__u32)msg[11] << 24;
+		d = (__u32)msg[12]      |
+		    (__u32)msg[13] << 8 |
+		    (__u32)msg[14] << 16|
+		    (__u32)msg[15] << 24;
+		
+		TEACORE(PARTROUNDS);
+
+		len -= 16;
+		msg += 16;
+	}
+
+	if (len >= 12)
+	{
+		if (len >= 16)
+		    *(int *)0 = 0;
+
+		a = (__u32)msg[ 0]      |
+		    (__u32)msg[ 1] << 8 |
+		    (__u32)msg[ 2] << 16|
+		    (__u32)msg[ 3] << 24;
+		b = (__u32)msg[ 4]      |
+		    (__u32)msg[ 5] << 8 |
+		    (__u32)msg[ 6] << 16|
+		    (__u32)msg[ 7] << 24;
+		c = (__u32)msg[ 8]      |
+		    (__u32)msg[ 9] << 8 |
+		    (__u32)msg[10] << 16|
+		    (__u32)msg[11] << 24;
+
+		d = pad;
+		for(i = 12; i < len; i++)
+		{
+			d <<= 8;
+			d |= msg[i];
+		}
+	}
+	else if (len >= 8)
+	{
+		if (len >= 12)
+		    *(int *)0 = 0;
+		a = (__u32)msg[ 0]      |
+		    (__u32)msg[ 1] << 8 |
+		    (__u32)msg[ 2] << 16|
+		    (__u32)msg[ 3] << 24;
+		b = (__u32)msg[ 4]      |
+		    (__u32)msg[ 5] << 8 |
+		    (__u32)msg[ 6] << 16|
+		    (__u32)msg[ 7] << 24;
+
+		c = d = pad;
+		for(i = 8; i < len; i++)
+		{
+			c <<= 8;
+			c |= msg[i];
+		}
+	}
+	else if (len >= 4)
+	{
+		if (len >= 8)
+		    *(int *)0 = 0;
+		a = (__u32)msg[ 0]      |
+		    (__u32)msg[ 1] << 8 |
+		    (__u32)msg[ 2] << 16|
+		    (__u32)msg[ 3] << 24;
+
+		b = c = d = pad;
+		for(i = 4; i < len; i++)
+		{
+			b <<= 8;
+			b |= msg[i];
+		}
+	}
+	else
+	{
+		if (len >= 4)
+		    *(int *)0 = 0;
+		a = b = c = d = pad;
+		for(i = 0; i < len; i++)
+		{
+			a <<= 8;
+			a |= msg[i];
+		}
+	}
+
+	TEACORE(FULLROUNDS);
+
+	return h0^h1;
+}
+
+
+__u32 reiserfs_hash_yura (const char *msg, int len)
+{
+    int j, pow;
+    __u32 a, c;
+    int i;
+    
+    for (pow=1,i=1; i < len; i++) pow = pow * 10; 
+    
+    if (len == 1) 
+	a = msg[0]-48;
+    else
+	a = (msg[0] - 48) * pow;
+    
+    for (i=1; i < len; i++) {
+	c = msg[i] - 48; 
+	for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
+	a = a + c * pow;
+    }
+    
+    for (; i < 40; i++) {
+	c = '0' - 48; 
+	for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
+	a = a + c * pow;
+    }
+    
+    for (; i < 256; i++) {
+	c = i; 
+	for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
+	a = a + c * pow;
+    }
+    
+    a = a << 7;
+    return a;
+}
+
+
+__u32 reiserfs_hash_r5 (const char *msg, int len)
+{
+    __u32 a=0;
+    int i;
+    
+    for (i = 0; i < len; i ++) {
+	a += msg[i] << 4;
+	a += msg[i] >> 4;
+	a *= 11;
+    } 
+    return a;
+}
+
+static const struct {
+    hashf_t func;
+    char * name;
+} hashes[REISERFS_HASH_LAST] = {{0, "not set"},
+				{reiserfs_hash_keyed, "\"tea\""},
+				{reiserfs_hash_yura, "\"rupasov\""},
+				{reiserfs_hash_r5, "\"r5\""}};        
+
+#define HASH_AMOUNT (sizeof (hashes) / sizeof (hashes [0]))
+
+#define good_name(hashfn,name,namelen,deh_offset) \
+	(reiserfs_hash_value (hashfn, name, namelen) == OFFSET_HASH (deh_offset))
+
+
+/* this also sets hash function */
+int reiserfs_hash_correct (hashf_t *func, char * name, 
+			   int namelen, __u32 offset)
+{
+    unsigned int i;
+
+    if (namelen == 1 && name[0] == '.') {
+	if (offset == OFFSET_DOT)
+	    return 1;
+	return 0;
+    }
+
+    if (namelen == 2 && name[0] == '.' && name[1] == '.') {
+	if (offset == OFFSET_DOT_DOT)
+	    return 1;
+	return 0;
+    }
+
+    if (*func == 0) {
+	/* try to find what hash function the name is sorted with */
+	for (i = 1; i < HASH_AMOUNT; i ++) {
+	    if (good_name (hashes [i].func, name, namelen, offset)) {
+		if (*func) {
+		    /* two or more hash functions give ok for this name */
+		    fprintf (stderr, "Detecting hash code: could not detect "
+			     "hash with name \"%.*s\"\n", namelen, name);
+		    *func = 0;
+		    return 0;
+		}
+
+		/* set hash function */
+ 		*func = hashes [i].func;
+ 	    }
+ 	}
+
+        if (*func == 0)
+            return 0;
+    }
+
+    if (good_name (*func, name, namelen, offset))
+	return 1;
+
+    return 0;
+}
+
+
+int reiserfs_hash_find (char * name, int namelen, __u32 offset, 
+			unsigned int code_to_try_first)
+{
+    unsigned int i;
+
+    if (!namelen || !name[0])
+	return UNSET_HASH;
+
+    if (code_to_try_first) {
+	if (good_name (hashes [code_to_try_first].func, name, namelen, offset))
+	    return code_to_try_first;
+    }
+    
+    for (i = 1; i < HASH_AMOUNT; i ++) {
+	if (i == code_to_try_first)
+	    continue;
+	if (good_name (hashes [i].func, name, namelen, offset))
+	    return i;
+    }
+
+    /* not matching hash found */
+    return UNSET_HASH;
+}
+
+
+char * reiserfs_hash_name(unsigned int code) {
+    if (code >= HASH_AMOUNT || code < 0)
+        return 0;
+    return hashes [code].name;
+}
+
+
+int reiserfs_hash_code (hashf_t func)
+{
+    unsigned int i;
+    
+    for (i = 0; i < HASH_AMOUNT; i ++)
+	if (func == hashes [i].func)
+	    return i;
+
+    reiserfs_panic ("reiserfs_hash_code: no hashes matches this function\n");
+    return 0;
+}
+
+
+hashf_t reiserfs_hash_func(unsigned int code) {
+    if (code >= HASH_AMOUNT) {
+	reiserfs_warning (stderr, "reiserfs_hash_func: wrong hash code %d.\n"
+			  "Using default %s hash function\n", code,
+			  reiserfs_hash_name (DEFAULT_HASH));
+	code = DEFAULT_HASH;
+    }
+    return hashes [code].func;
+}
+
+
+hashf_t reiserfs_hash_get (char * hash) {
+    unsigned int i;
+ 
+    for (i = 0; i < HASH_AMOUNT; i ++)
+	if (!strcmp (hash, hashes [i].name))
+	    return hashes [i].func;
+    return 0;
+}
+
+__u32 reiserfs_hash_value (hashf_t func, char * name, int namelen) {
+    __u32 res;
+
+    res = func (name, namelen);
+    res = OFFSET_HASH(res);
+    if (res == 0)
+	res = 128;
+
+    return res;
+}
+
diff --git a/libreiserfs/internal.c b/libreiserfs/internal.c
new file mode 100644
index 0000000..875bdbb
--- /dev/null
+++ b/libreiserfs/internal.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+/* returns 1 if buf looks like an internal node, 0 otherwise */
+int reiserfs_internal_correct (reiserfs_bh_t *bh) {
+    reiserfs_node_head_t * blkh;
+    unsigned int nr;
+    int used_space;
+
+    blkh = (reiserfs_node_head_t *)bh->b_data;
+
+    if (!reiserfs_int_head (bh))
+	return 0;
+    
+    nr = reiserfs_nh_get_items (blkh);
+    if (nr > (bh->b_size - REISERFS_NODEH_SIZE - REISERFS_DC_SIZE) / 
+	(REISERFS_KEY_SIZE + REISERFS_DC_SIZE))
+    {
+	/* for internal which is not root we might check min number of keys */
+	return 0;
+    }
+
+    used_space = REISERFS_NODEH_SIZE + REISERFS_KEY_SIZE * nr + 
+	    REISERFS_DC_SIZE * (nr + 1);
+    
+    if (used_space != bh->b_size - reiserfs_nh_get_free (blkh))
+	return 0;
+
+    // one may imagine much more checks
+    return 1;
+}
+
+/* this prints internal nodes (4 keys/items in line) (dc_number,
+   dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number,
+   dc_size)...*/
+int reiserfs_internal_print (FILE * fp, 
+			     reiserfs_bh_t * bh, 
+			     int first, int last)
+{
+    reiserfs_key_t * key;
+    reiserfs_dc_t * dc;
+    int i;
+    int from, to;
+
+    if (!reiserfs_int_head (bh))
+	return 1;
+
+    if (first == -1) {
+	from = 0;
+	to = reiserfs_node_items (bh);
+    } else {
+	from = first;
+	to = last < reiserfs_node_items (bh) ? last : reiserfs_node_items (bh);
+    }
+
+    reiserfs_warning (fp, "INTERNAL NODE (%ld) contains %b\n",  
+		      bh->b_blocknr, bh);
+
+    dc = reiserfs_int_at (bh, from);
+    reiserfs_warning (fp, "PTR %d: %y ", from, dc);
+
+    for (i = from, key = reiserfs_int_key_at (bh, from), dc ++; 
+	 i < to; i ++, key ++, dc ++) 
+    {
+	reiserfs_warning (fp, "KEY %d: %20k PTR %d: %20y ", 
+			  i, key, i + 1, dc);
+	
+	if (i && i % 4 == 0)
+	    reiserfs_warning (fp, "\n");
+    }
+
+    reiserfs_warning (fp, "\n");
+    return 0;
+}
+
+/* internal node bh must point to block */
+int reiserfs_internal_get_pos (reiserfs_bh_t * bh, 
+			       unsigned long block) 
+{
+    int i;
+
+    for (i = 0; i <= reiserfs_node_items (bh); i ++) {
+	if (reiserfs_dc_get_nr (reiserfs_int_at (bh, i)) == block)
+	    return i;
+    }
+    
+    misc_die ("An internal pointer to the block (%lu) cannot be "
+	      "found in the node (%lu)", block, bh->b_blocknr);
+    
+    return 0;
+}
diff --git a/libreiserfs/internal_balance.c b/libreiserfs/internal_balance.c
new file mode 100644
index 0000000..2dbc68e
--- /dev/null
+++ b/libreiserfs/internal_balance.c
@@ -0,0 +1,971 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+/* modes of reiserfs_ib_shift_left, reiserfs_ib_shift_right and 
+   reiserfs_ib_insert */
+#define INTERNAL_SHIFT_FROM_S_TO_L 0
+#define INTERNAL_SHIFT_FROM_R_TO_S 1
+#define INTERNAL_SHIFT_FROM_L_TO_S 2
+#define INTERNAL_SHIFT_FROM_S_TO_R 3
+#define INTERNAL_INSERT_TO_S 4
+#define INTERNAL_INSERT_TO_L 5
+#define INTERNAL_INSERT_TO_R 6
+
+static void reiserfs_ib_shift_prep (int shift_mode,
+				    reiserfs_tb_t * tb,
+				    int h,
+				    reiserfs_bufinfo_t * dest_bi,
+				    reiserfs_bufinfo_t * src_bi,
+				    int * d_key,
+				    reiserfs_bh_t ** cf)
+{
+  /* define dest, src, dest parent, dest position */
+  switch (shift_mode) {
+  case INTERNAL_SHIFT_FROM_S_TO_L:	
+    /* used in reiserfs_ib_shift_left */
+    src_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+    src_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+    dest_bi->bi_bh = tb->L[h];
+    dest_bi->bi_parent = tb->FL[h];
+    dest_bi->bi_position = reiserfs_tb_lpos (tb, h);
+    *d_key = tb->lkey[h];
+    *cf = tb->CFL[h];
+    break;
+  case INTERNAL_SHIFT_FROM_L_TO_S:
+    src_bi->bi_bh = tb->L[h];
+    src_bi->bi_parent = tb->FL[h];
+    src_bi->bi_position = reiserfs_tb_lpos (tb, h);
+    dest_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    dest_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+    /* dest position is analog of dest->b_item_order */
+    dest_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1); 
+    *d_key = tb->lkey[h];
+    *cf = tb->CFL[h];
+    break;
+
+  case INTERNAL_SHIFT_FROM_R_TO_S:	
+    /* used in reiserfs_ib_shift_left */
+    src_bi->bi_bh = tb->R[h];
+    src_bi->bi_parent = tb->FR[h];
+    src_bi->bi_position = reiserfs_tb_rpos (tb, h);
+    dest_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    dest_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+    dest_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+    *d_key = tb->rkey[h];
+    *cf = tb->CFR[h];
+    break;
+  case INTERNAL_SHIFT_FROM_S_TO_R:
+    src_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+    src_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+    dest_bi->bi_bh = tb->R[h];
+    dest_bi->bi_parent = tb->FR[h];
+    dest_bi->bi_position = reiserfs_tb_rpos (tb, h);
+    *d_key = tb->rkey[h];
+    *cf = tb->CFR[h];
+    break;
+
+  case INTERNAL_INSERT_TO_L:
+    dest_bi->bi_bh = tb->L[h];
+    dest_bi->bi_parent = tb->FL[h];
+    dest_bi->bi_position = reiserfs_tb_lpos (tb, h);
+    break;
+
+  case INTERNAL_INSERT_TO_S:
+    dest_bi->bi_bh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    dest_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+    dest_bi->bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+    break;
+
+  case INTERNAL_INSERT_TO_R:
+    dest_bi->bi_bh = tb->R[h];
+    dest_bi->bi_parent = tb->FR[h];
+    dest_bi->bi_position = reiserfs_tb_rpos (tb, h);
+    break;
+
+  default:
+      reiserfs_panic ("reiserfs_ib_shift_prep", 
+		      "shift type is unknown (%d)", shift_mode);
+  }
+}
+
+
+
+/* Insert 'count' node pointers into buffer cur before position 'to' + 1.
+ * Insert count items into buffer cur before position to.
+ * Items and node pointers are specified by inserted and bh respectively.
+ */ 
+static void reiserfs_ib_insert (reiserfs_filsys_t * fs, 
+				reiserfs_bufinfo_t * cur_bi,
+				int to, int count,
+				reiserfs_ih_t * inserted,
+				reiserfs_bh_t ** bh)
+{
+    reiserfs_bh_t * cur = cur_bi->bi_bh;
+    reiserfs_node_head_t * blkh;
+    int nr;
+    reiserfs_key_t * key;
+    reiserfs_dc_t new_dc[2];
+    reiserfs_dc_t * dc;
+    int i;
+    int from;
+    
+    if (count <= 0)
+	return;
+    
+    blkh = NODE_HEAD (cur);
+    nr = reiserfs_nh_get_items (blkh);
+    
+    /* prepare space for count disk_child */
+    dc = reiserfs_int_at (cur,to+1);
+    
+    memmove (dc + count, dc, (nr+1-(to+1)) * REISERFS_DC_SIZE);
+    
+    /* make disk child array for insertion */
+    for (i = 0; i < count; i ++) {
+	reiserfs_dc_init(new_dc + i, REISERFS_NODE_SPACE(bh[i]->b_size) - 
+	       reiserfs_nh_get_free (NODE_HEAD (bh[i])),
+	       bh[i]->b_blocknr);
+	/*
+	reiserfs_dc_set_size (new_dc + i,
+			   REISERFS_NODE_SPACE(bh[i]->b_size) - 
+			   reiserfs_nh_get_free (NODE_HEAD (bh[i])));
+	reiserfs_dc_set_nr (new_dc + i, bh[i]->b_blocknr);*/
+    }
+    memcpy (dc, new_dc, REISERFS_DC_SIZE * count);
+    
+    /* prepare space for 'count' items  */
+    from = ((to == -1) ? 0 : to);
+    key = reiserfs_int_key_at (cur, from);
+    
+    memmove (key + count, key, (nr - from/*to*/) * REISERFS_KEY_SIZE + 
+	     (nr + 1 + count) * REISERFS_DC_SIZE);
+
+    /* copy keys */
+    memcpy (key, inserted, REISERFS_KEY_SIZE);
+    if ( count > 1 )
+	memcpy (key + 1, inserted + 1, REISERFS_KEY_SIZE);
+    
+    /* sizes, item number */
+    reiserfs_nh_set_items (blkh, nr + count);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - 
+			 count * (REISERFS_DC_SIZE + REISERFS_KEY_SIZE));
+
+    reiserfs_buffer_mkdirty (cur);
+    
+    if (cur_bi->bi_parent) {
+	dc = reiserfs_int_at (cur_bi->bi_parent,cur_bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + 
+			   count * (REISERFS_DC_SIZE + REISERFS_KEY_SIZE));
+	reiserfs_buffer_mkdirty (cur_bi->bi_parent);
+    }
+    
+}
+
+/* Delete del_num items and node pointers from buffer cur starting from *
+ * the first_i'th item and first_p'th pointers respectively.		*/
+static void reiserfs_ib_delete (reiserfs_filsys_t * fs,
+				reiserfs_bufinfo_t * cur_bi,
+				int first_p, 
+				int first_i, 
+				int del_num)
+{
+    reiserfs_bh_t * cur = cur_bi->bi_bh;
+    int nr;
+    reiserfs_node_head_t * blkh;
+    reiserfs_key_t * key;
+    reiserfs_dc_t * dc;
+
+    if ( del_num == 0 )
+	return;
+
+    blkh = NODE_HEAD(cur);
+    nr = reiserfs_nh_get_items (blkh);
+
+    if ( first_p == 0 && del_num == nr + 1 ) {
+	reiserfs_tb_attach_new(cur_bi);
+	return;
+    }
+
+    /* deleting */
+    dc = reiserfs_int_at (cur, first_p);
+
+    memmove (dc, dc + del_num, (nr + 1 - first_p - del_num) * 
+	     REISERFS_DC_SIZE);
+    key = reiserfs_int_key_at (cur, first_i);
+    memmove (key, key + del_num, (nr - first_i - del_num) * REISERFS_KEY_SIZE + 
+	     (nr + 1 - del_num) * REISERFS_DC_SIZE);
+
+
+    /* sizes, item number */
+    reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) - del_num);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) +
+			 del_num * (REISERFS_KEY_SIZE +  REISERFS_DC_SIZE));
+
+    reiserfs_buffer_mkdirty (cur);
+ 
+    if (cur_bi->bi_parent) {
+	dc = reiserfs_int_at (cur_bi->bi_parent, cur_bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) - 
+			   del_num * (REISERFS_KEY_SIZE +  REISERFS_DC_SIZE));
+	reiserfs_buffer_mkdirty (cur_bi->bi_parent);
+    }
+}
+
+/* copy cpy_num node pointers and cpy_num - 1 items from buffer src to buffer 
+   dest last_first == FIRST_TO_LAST means, that we copy first items from src 
+   to tail of dest last_first == LAST_TO_FIRST means, that we copy last items 
+   from src to head of dest */
+static void reiserfs_ib_copy (reiserfs_filsys_t * fs,
+			      reiserfs_bufinfo_t * dest_bi,
+			      reiserfs_bh_t * src,
+			      int last_first, 
+			      int cpy_num)
+{
+    /* ATTENTION! Number of node pointers in DEST is equal to number of 
+       items in DEST as delimiting key have already inserted to buffer dest.*/
+    reiserfs_bh_t * dest = dest_bi->bi_bh;
+    int nr_dest, nr_src;
+    int dest_order, src_order;
+    reiserfs_node_head_t * blkh;
+    reiserfs_key_t * key;
+    reiserfs_dc_t * dc;
+
+    nr_src = reiserfs_node_items (src);
+
+    if ( cpy_num == 0 )
+	return;
+
+    /* coping */
+    blkh = NODE_HEAD (dest);
+    nr_dest = reiserfs_nh_get_items (blkh);
+
+    /*dest_order = (last_first == LAST_TO_FIRST) ? 0 : nr_dest;*/
+    /*src_order = (last_first == LAST_TO_FIRST) ? (nr_src - cpy_num + 1) : 0;*/
+    (last_first == LAST_TO_FIRST) ? 
+	    (dest_order = 0, src_order = nr_src - cpy_num + 1) :
+	    (dest_order = nr_dest, src_order = 0);
+
+    /* prepare space for cpy_num pointers */
+    dc = reiserfs_int_at (dest, dest_order);
+
+    memmove (dc + cpy_num, dc, (nr_dest - dest_order) * REISERFS_DC_SIZE);
+
+    /* insert pointers */
+    memcpy (dc, reiserfs_int_at (src, src_order), REISERFS_DC_SIZE * cpy_num);
+
+    /* prepare space for cpy_num - 1 item headers */
+    key = reiserfs_int_key_at(dest, dest_order);
+    memmove (key + cpy_num - 1, key, REISERFS_KEY_SIZE * (nr_dest - dest_order) + 
+	     REISERFS_DC_SIZE * (nr_dest + cpy_num));
+
+
+    /* insert headers */
+    memcpy (key, reiserfs_int_key_at (src, src_order), REISERFS_KEY_SIZE * (cpy_num - 1));
+
+    /* sizes, item number */
+    reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + cpy_num - 1);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) -
+			 (REISERFS_KEY_SIZE * (cpy_num - 1) + 
+			  REISERFS_DC_SIZE * cpy_num));
+
+    reiserfs_buffer_mkdirty (dest);
+    
+    if (dest_bi->bi_parent) {
+	dc = reiserfs_int_at(dest_bi->bi_parent,dest_bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + 
+			   REISERFS_KEY_SIZE * (cpy_num - 1) + 
+			   REISERFS_DC_SIZE * cpy_num);
+	reiserfs_buffer_mkdirty (dest_bi->bi_parent);
+    }
+}
+
+
+/* Copy cpy_num node pointers and cpy_num - 1 items from buffer src to 
+   buffer dest. Delete cpy_num - del_par items and node pointers from 
+   buffer src. last_first == FIRST_TO_LAST means, that we copy/delete 
+   first items from src. last_first == LAST_TO_FIRST means, that we 
+   copy/delete last items from src. */
+static void reiserfs_ib_move (reiserfs_filsys_t * fs,
+			      reiserfs_bufinfo_t * dest_bi, 
+			      reiserfs_bufinfo_t * src_bi,
+			      int last_first, 
+			      int cpy_num, 
+			      int del_par)
+{
+    int first_pointer;
+    int first_item;
+    
+    reiserfs_ib_copy (fs, dest_bi, src_bi->bi_bh, last_first, cpy_num);
+    
+    if (last_first == FIRST_TO_LAST) {	/* shift_left occurs */
+	first_pointer = 0;
+	first_item = 0;
+	/* delete cpy_num - del_par pointers and keys starting for pointers 
+	   with first_pointer, for key - with first_item */
+	reiserfs_ib_delete (fs, src_bi, first_pointer, 
+			    first_item, cpy_num - del_par);
+    } else {			
+	/* shift_right occurs */
+	int i, j;
+	
+	i = ( cpy_num - del_par == ( j = reiserfs_node_items(src_bi->bi_bh)) + 1 ) ? 
+		0 : j - cpy_num + del_par;
+	
+	reiserfs_ib_delete (fs, src_bi, j + 1 - cpy_num + del_par, 
+			    i, cpy_num - del_par);
+    }
+}
+
+/* Insert n_src'th key of buffer src before n_dest'th key of buffer dest. */
+static void reiserfs_ib_insert_key (reiserfs_filsys_t * fs,
+				    reiserfs_bufinfo_t * dest_bi, 
+				    /* insert key before key with 
+				       n_dest number */
+				    int dest_position_before,                 
+				    reiserfs_bh_t * src, 
+				    int src_position )
+{
+    reiserfs_bh_t * dest = dest_bi->bi_bh;
+    int nr;
+    reiserfs_node_head_t * blkh;
+    reiserfs_key_t * key;
+
+    blkh = NODE_HEAD(dest);
+    nr = reiserfs_nh_get_items (blkh);
+
+    /* prepare space for inserting key */
+    key = reiserfs_int_key_at (dest, dest_position_before);
+    memmove (key + 1, key, (nr - dest_position_before) * REISERFS_KEY_SIZE + 
+	     (nr + 1) * REISERFS_DC_SIZE);
+
+    /* insert key */
+    memcpy (key, reiserfs_int_key_at(src, src_position), REISERFS_KEY_SIZE);
+
+    /* Change dirt, free space, item number fields. */
+    reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + 1);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - REISERFS_KEY_SIZE);
+
+    reiserfs_buffer_mkdirty (dest);
+
+    if (dest_bi->bi_parent) {
+	reiserfs_dc_t * dc;
+	
+	dc = reiserfs_int_at(dest_bi->bi_parent,dest_bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + REISERFS_KEY_SIZE);
+	reiserfs_buffer_mkdirty (dest_bi->bi_parent);
+    }
+}
+
+/* Insert d_key'th (delimiting) key from buffer cfl to tail of dest. 
+ * Copy pointer_amount node pointers and pointer_amount - 1 items from 
+ * buffer src to buffer dest.
+ * Replace  d_key'th key in buffer cfl.
+ * Delete pointer_amount items and node pointers from buffer src. */
+/* this can be invoked both to shift from S to L and from R to S */
+static void reiserfs_ib_shift_left (/* INTERNAL_FROM_S_TO_L | 
+				       INTERNAL_FROM_R_TO_S */
+				    int mode,	
+				    reiserfs_tb_t * tb, 
+				    int h, int pointer_amount)
+{
+    reiserfs_bufinfo_t dest_bi, src_bi;
+    reiserfs_bh_t * cf;
+    int d_key_position;
+
+    reiserfs_ib_shift_prep (mode, tb, h, &dest_bi, &src_bi, 
+			    &d_key_position, &cf);
+
+    /*printk("pointer_amount = %d\n",pointer_amount);*/
+
+    if (pointer_amount) {
+	/* insert delimiting key from common father of dest and src 
+	   to node dest into position B_NR_ITEM(dest) */
+	reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, 
+				reiserfs_node_items(dest_bi.bi_bh), 
+				cf, d_key_position);
+
+	if (reiserfs_node_items(src_bi.bi_bh) == pointer_amount - 1) {
+	    if (src_bi.bi_position/*src->b_item_order*/ == 0)
+		reiserfs_node_replace_key (cf, d_key_position, 
+					   src_bi.bi_parent, 0);
+	} else {
+	    reiserfs_node_replace_key (cf, d_key_position, 
+				       src_bi.bi_bh, pointer_amount - 1);
+	}
+    }
+    
+    /* last parameter is del_parameter */
+    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+		      FIRST_TO_LAST, pointer_amount, 0);
+}
+
+/* Insert delimiting key to L[h].
+ * Copy n node pointers and n - 1 items from buffer S[h] to L[h].
+ * Delete n - 1 items and node pointers from buffer S[h].
+ */
+/* it always shifts from S[h] to L[h] */
+static void reiserfs_ib_shift1_left (reiserfs_tb_t * tb, 
+				     int h, int pointer_amount)
+{
+    reiserfs_bufinfo_t dest_bi, src_bi;
+    reiserfs_bh_t * cf;
+    int d_key_position;
+    
+    reiserfs_ib_shift_prep (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, 
+			    &dest_bi, &src_bi, &d_key_position, &cf);
+    
+    if ( pointer_amount > 0 ) 
+	    /* insert lkey[h]-th key  from CFL[h] to left neighbor L[h] */
+	reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, 
+				reiserfs_node_items(dest_bi.bi_bh), 
+				cf, d_key_position);
+    
+    /* last parameter is del_parameter */
+    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+		      FIRST_TO_LAST, pointer_amount, 1);
+}
+
+
+/* Insert d_key'th (delimiting) key from buffer cfr to head of dest. 
+ * Copy n node pointers and n - 1 items from buffer src to buffer dest.
+ * Replace  d_key'th key in buffer cfr.
+ * Delete n items and node pointers from buffer src.
+ */
+static void reiserfs_ib_shift_right (/* INTERNAL_FROM_S_TO_R | 
+					INTERNAL_FROM_L_TO_S */
+				     int mode,	
+				     reiserfs_tb_t * tb, 
+				     int h, int pointer_amount)
+{
+    reiserfs_bufinfo_t dest_bi, src_bi;
+    reiserfs_bh_t * cf;
+    int d_key_position;
+    int nr;
+
+
+    reiserfs_ib_shift_prep (mode, tb, h, &dest_bi, &src_bi, 
+			    &d_key_position, &cf);
+
+    nr = reiserfs_node_items (src_bi.bi_bh);
+
+    if (pointer_amount > 0) {
+	/* insert delimiting key from common father of dest and src 
+	   to dest node into position 0 */
+	reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, 
+				0, cf, d_key_position);
+	if (nr == pointer_amount - 1) {
+	    /* when S[h] disappers replace left delemiting key as well */
+	    if (tb->CFL[h]) {
+		reiserfs_node_replace_key(cf, d_key_position, 
+					  tb->CFL[h], tb->lkey[h]);
+	    }
+	} else {
+	    reiserfs_node_replace_key(cf, d_key_position, 
+				      src_bi.bi_bh, nr - pointer_amount);
+	}
+    }      
+
+    /* last parameter is del_parameter */
+    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+		      LAST_TO_FIRST, pointer_amount, 0);
+}
+
+/* Insert delimiting key to R[h].
+ * Copy n node pointers and n - 1 items from buffer S[h] to R[h].
+ * Delete n - 1 items and node pointers from buffer S[h].
+ */
+/* it always shift from S[h] to R[h] */
+static void reiserfs_ib_shift1_right (reiserfs_tb_t * tb, 
+				      int h, int pointer_amount)
+{
+    reiserfs_bufinfo_t dest_bi, src_bi;
+    reiserfs_bh_t * cf;
+    int d_key_position;
+
+    reiserfs_ib_shift_prep (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, 
+			    &dest_bi, &src_bi, &d_key_position, &cf);
+    
+    if (pointer_amount > 0) /* insert rkey from CFR[h] to right neighbor R[h] */
+	reiserfs_ib_insert_key (tb->tb_fs, &dest_bi, 
+				0, cf, d_key_position);
+
+    /* last parameter is del_parameter */
+    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+		      LAST_TO_FIRST, pointer_amount, 1);
+}
+
+
+/* Delete insert_num node pointers together with their left items
+ * and balance current node.*/
+static void reiserfs_ib_balance_delete (reiserfs_tb_t * tb, 
+					int h, int child_pos)
+{
+    int insert_num;
+    int n;
+    reiserfs_bh_t * tbSh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    reiserfs_bufinfo_t bi;
+
+    insert_num = tb->insert_size[h] / ((int)(REISERFS_DC_SIZE + REISERFS_KEY_SIZE));
+  
+    /* delete child-node-pointer(s) together with their left item(s) */
+    bi.bi_bh = tbSh;
+
+    bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+
+    bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+
+    reiserfs_ib_delete (tb->tb_fs, &bi, child_pos, 
+			(child_pos == 0) ? child_pos : child_pos - 1, 
+			-insert_num);
+
+    n = reiserfs_node_items(tbSh);
+
+    if ( tb->lnum[h] == 0 && tb->rnum[h] == 0 ) {
+	if ( tb->blknum[h] == 0 ) {
+	    /* node S[h] (root of the tree) is empty now */
+	    reiserfs_bh_t *new_root;
+	    reiserfs_sb_t * sb;
+
+	    /* choose a new root */
+	    if ( ! tb->L[h-1] || ! reiserfs_node_items(tb->L[h-1]) )
+		new_root = tb->R[h-1];
+	    else
+		new_root = tb->L[h-1];
+
+	    /* update super block's tree height and pointer to a root block */
+	    sb = tb->tb_fs->fs_ondisk_sb;
+	    reiserfs_sb_set_root (sb, new_root->b_blocknr);
+	    reiserfs_sb_set_height (sb, reiserfs_sb_get_height (sb) - 1);
+
+	    reiserfs_buffer_mkdirty (tb->tb_fs->fs_super_bh);
+	    tb->tb_fs->fs_dirt = 1;
+
+	    /* mark buffer S[h] not uptodate and put it in free list */
+	    reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr);
+	    return;
+	}
+	return;
+    }
+
+    if ( tb->L[h] && tb->lnum[h] == -reiserfs_node_items(tb->L[h]) - 1 ) { 
+	/* join S[h] with L[h] */
+	/*tb->L[h], tb->CFL[h], tb->lkey[h], tb->S[h], n+1);*/
+	reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, 
+				tb, h, n + 1);
+	/* preserve not needed, internal, 1 mean free block */
+	reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr);
+	return;
+    }
+
+    if ( tb->R[h] &&  tb->rnum[h] == -reiserfs_node_items(tb->R[h]) - 1 ) { 
+	/* join S[h] with R[h] */
+	reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, 
+				 tb, h, n + 1);
+	reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr);
+	return;
+    }
+
+    if ( tb->lnum[h] < 0 ) { 
+	/* borrow from left neighbor L[h] */
+	reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_L_TO_S, 
+				 tb, h, -tb->lnum[h]);
+	return;
+    }
+
+    if ( tb->rnum[h] < 0 ) { 
+	/* borrow from right neighbor R[h] */
+	/*tb->S[h], tb->CFR[h], tb->rkey[h], tb->R[h], -tb->rnum[h]);*/
+	reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_R_TO_S, 
+				tb, h, -tb->rnum[h]);
+	return;
+    }
+
+    if ( tb->lnum[h] > 0 ) { 
+	/* split S[h] into two parts and put them into neighbors */
+	/*tb->L[h], tb->CFL[h], tb->lkey[h], tb->S[h], tb->lnum[h]);*/
+	reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, 
+				tb, h, tb->lnum[h]);
+	reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, 
+				 tb, h, tb->rnum[h]);
+	reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr);
+	return;
+    }
+    
+    reiserfs_panic ("reiserfs_ib_balance_delete", "unexpected "
+		    "tb->lnum[%d]==%d or tb->rnum[%d]==%d",
+		    h, tb->lnum[h], h, tb->rnum[h]);
+}
+
+/* Replace delimiting key of buffers L[h] and S[h] by the given key.*/
+static void reiserfs_ib_set_lkey (reiserfs_tb_t * tb,
+				  int h, reiserfs_ih_t * key)
+{
+    if (reiserfs_node_items(REISERFS_PATH_UPBUFFER(tb->tb_path, h)) == 0)
+	return;
+
+    memcpy (reiserfs_int_key_at(tb->CFL[h],tb->lkey[h]), key, REISERFS_KEY_SIZE);
+    reiserfs_buffer_mkdirty (tb->CFL[h]);
+}
+
+
+/* Replace delimiting key of buffers S[h] and R[h] by the given key.*/
+static void reiserfs_ib_set_rkey (reiserfs_tb_t * tb,
+				  int h, reiserfs_ih_t * key)
+{
+    memcpy (reiserfs_int_key_at(tb->CFR[h],tb->rkey[h]), key, REISERFS_KEY_SIZE);
+    reiserfs_buffer_mkdirty (tb->CFR[h]);
+}
+
+int reiserfs_ib_balance (reiserfs_tb_t * tb,
+			 /* level of the tree */
+			 int h,
+			 int child_pos,
+			 /* key for insertion on higher level */
+			 reiserfs_ih_t * insert_key,
+			 /* node for insertion on higher level*/
+			 reiserfs_bh_t ** insert_ptr)
+  /* if inserting/pasting
+   {
+   child_pos is the position of the node-pointer in S[h] that	 *
+   pointed to S[h-1] before balancing of the h-1 level;		 *
+   this means that new pointers and items must be inserted AFTER *
+   child_pos
+   }
+   else 
+   {
+   it is the position of the leftmost pointer that must be deleted (together with
+   its corresponding key to the left of the pointer)
+   as a result of the previous level's balancing.
+   }
+*/
+{
+    reiserfs_bh_t * tbSh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+    reiserfs_bufinfo_t bi;
+    
+    /* we return this: it is 0 if there is no S[h], 
+       else it is tb->S[h]->b_item_order */
+    int order;
+    
+    int insert_num, n, k;
+    reiserfs_bh_t * S_new;
+    reiserfs_ih_t new_insert_key;
+    reiserfs_bh_t * new_insert_ptr = NULL;
+    reiserfs_ih_t * new_insert_key_addr = insert_key;
+
+    order = ( tbSh ) ? REISERFS_PATH_UPPOS (tb->tb_path, h + 1)
+	    /*tb->S[h]->b_item_order*/ : 0;
+
+  /* Using insert_size[h] calculate the number insert_num of items
+     that must be inserted to or deleted from S[h]. */
+    insert_num = tb->insert_size[h]/((int)(REISERFS_KEY_SIZE + REISERFS_DC_SIZE));
+
+    /* Check whether insert_num is proper **/
+    /* Make balance in case insert_num < 0 */
+    if ( insert_num < 0 ) {
+	reiserfs_ib_balance_delete (tb, h, child_pos);
+	return order;
+    }
+ 
+    k = 0;
+    if ( tb->lnum[h] > 0 ) {
+	/* shift lnum[h] items from S[h] to the left neighbor L[h]. check 
+	   how many of new items fall into L[h] or CFL[h] after shifting */
+	
+	/* number of items in L[h] */
+	n = reiserfs_nh_get_items (NODE_HEAD(tb->L[h])); 
+	if ( tb->lnum[h] <= child_pos ) {
+	    /* new items don't fall into L[h] or CFL[h] */
+	    reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, 
+				    tb, h, tb->lnum[h]);
+	    child_pos -= tb->lnum[h];
+	} else if ( tb->lnum[h] > child_pos + insert_num ) {
+	    /* all new items fall into L[h] */
+	    reiserfs_ib_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, 
+				    tb, h, tb->lnum[h] - insert_num);
+
+	    /* insert insert_num keys and node-pointers into L[h] */
+	    bi.bi_bh = tb->L[h];
+	    bi.bi_parent = tb->FL[h];
+	    bi.bi_position = reiserfs_tb_lpos (tb, h);
+	    reiserfs_ib_insert (tb->tb_fs, &bi,
+				/*tb->L[h], tb->S[h-1]->b_next*/ 
+				n + child_pos + 1,
+				insert_num,insert_key,insert_ptr);
+
+	    insert_num = 0; 
+	} else {
+	    reiserfs_dc_t * dc;
+
+	    /* some items fall into L[h] or CFL[h], but some don't fall */
+	    reiserfs_ib_shift1_left (tb, h, child_pos + 1);
+	    /* calculate number of new items that fall into L[h] */
+	    k = tb->lnum[h] - child_pos - 1;
+
+	    bi.bi_bh = tb->L[h];
+	    bi.bi_parent = tb->FL[h];
+	    bi.bi_position = reiserfs_tb_lpos (tb, h);
+	    reiserfs_ib_insert (tb->tb_fs, &bi,
+				/*tb->L[h], tb->S[h-1]->b_next,*/ 
+				n + child_pos + 1,k,
+				insert_key,insert_ptr);
+
+	    reiserfs_ib_set_lkey(tb, h, insert_key + k);
+
+	    /* replace the first node-ptr in S[h] by 
+	       node-ptr to insert_ptr[k] */
+	    dc = reiserfs_int_at(tbSh, 0);
+
+	    reiserfs_dc_init(dc, REISERFS_NODE_SPACE(insert_ptr[k]->b_size) - 
+		   reiserfs_nh_get_free (NODE_HEAD(insert_ptr[k])), 
+		   insert_ptr[k]->b_blocknr);
+	/*  reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE(insert_ptr[k]->b_size) -
+			       reiserfs_nh_get_free (NODE_HEAD(insert_ptr[k])));
+	    reiserfs_dc_set_nr (dc, insert_ptr[k]->b_blocknr); */
+	    reiserfs_buffer_mkdirty (tbSh);
+
+	    k++;
+	    insert_key += k;
+	    insert_ptr += k;
+	    insert_num -= k;
+	    child_pos = 0;
+	}
+    }	/* tb->lnum[h] > 0 */
+
+    if ( tb->rnum[h] > 0 ) {
+	/*shift rnum[h] items from S[h] to the right neighbor R[h]*/
+	/* check how many of new items fall into R or CFR after shifting */
+	n = reiserfs_nh_get_items (NODE_HEAD (tbSh)); /* number of items in S[h] */
+	if ( n - tb->rnum[h] >= child_pos )
+	    /* new items fall into S[h] */
+	    /*reiserfs_ib_shift_right(tb,h,tbSh,tb->CFR[h],
+			tb->rkey[h],tb->R[h], tb->rnum[h]);*/
+	    reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, 
+				     tb, h, tb->rnum[h]);
+	else
+	    if ( n + insert_num - tb->rnum[h] < child_pos ) {
+		/* all new items fall into R[h] */
+		reiserfs_ib_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, 
+					 tb, h, tb->rnum[h] - insert_num);
+
+		/* insert insert_num keys and node-pointers into R[h] */
+		bi.bi_bh = tb->R[h];
+		bi.bi_parent = tb->FR[h];
+		bi.bi_position = reiserfs_tb_rpos (tb, h);
+		reiserfs_ib_insert (tb->tb_fs, &bi, 
+				    /*tb->R[h],tb->S[h-1]->b_next*/ 
+				    child_pos - n - insert_num + 
+				    tb->rnum[h] - 1, insert_num,
+				    insert_key,insert_ptr);
+		insert_num = 0;
+	    } else {
+		reiserfs_dc_t * dc;
+
+		/* one of the items falls into CFR[h] */
+		reiserfs_ib_shift1_right(tb, h, n - child_pos + 1);
+		/* calculate number of new items that fall into R[h] */
+		k = tb->rnum[h] - n + child_pos - 1;
+
+		bi.bi_bh = tb->R[h];
+		bi.bi_parent = tb->FR[h];
+		bi.bi_position = reiserfs_tb_rpos (tb, h);
+		reiserfs_ib_insert (tb->tb_fs, &bi, 
+				    /*tb->R[h], tb->R[h]->b_child,*/ 0, 
+				    k, insert_key + 1, insert_ptr + 1);
+
+		reiserfs_ib_set_rkey(tb, h, insert_key + 
+				     insert_num - k - 1);
+
+		/* replace the first node-ptr in R[h] by node-ptr 
+		   insert_ptr[insert_num-k-1]*/
+		dc = reiserfs_int_at(tb->R[h], 0);
+		reiserfs_dc_init(dc, REISERFS_NODE_SPACE(
+			insert_ptr[insert_num-k-1]->b_size) -
+			reiserfs_nh_get_free(NODE_HEAD(insert_ptr[insert_num-k-1])),
+			insert_ptr[insert_num-k-1]->b_blocknr);
+		/*
+		reiserfs_dc_set_size (dc, 
+			REISERFS_NODE_SPACE(insert_ptr[insert_num-k-1]->b_size) -
+			reiserfs_nh_get_free (NODE_HEAD(insert_ptr[insert_num-k-1])));
+		reiserfs_dc_set_nr (dc, insert_ptr[insert_num-k-1]->b_blocknr);
+		*/
+		reiserfs_buffer_mkdirty (tb->R[h]);
+		    
+		insert_num -= (k + 1);
+	    }
+    }
+
+    /** Fill new node that appears instead of S[h] **/
+    if ( ! tb->blknum[h] )
+    { /* node S[h] is empty now */
+	/* Mark buffer as invalid and put it to head of free list. */
+	/* do not preserve, internal node*/
+	reiserfs_node_forget(tb->tb_fs, tbSh->b_blocknr);
+	return order;
+    }
+
+    if ( ! tbSh ) {
+	/* create new root */
+	reiserfs_dc_t  * dc;
+	reiserfs_bh_t * tbSh_1 = REISERFS_PATH_UPBUFFER (tb->tb_path, h - 1);
+	reiserfs_sb_t * sb;
+
+	if ( tb->blknum[h] != 1 )
+	    reiserfs_panic(0, "reiserfs_ib_balance", 
+			   "One new node required for creating the new root");
+	/* S[h] = empty buffer from the list FEB. */
+	tbSh = reiserfs_tb_FEB (tb);
+	reiserfs_nh_set_level (NODE_HEAD(tbSh), h + 1);
+	
+	/* Put the unique node-pointer to S[h] that points to S[h-1]. */
+
+	dc = reiserfs_int_at(tbSh, 0);
+
+	reiserfs_dc_init(dc, REISERFS_NODE_SPACE (tbSh_1->b_size) - 
+	       reiserfs_nh_get_free (NODE_HEAD(tbSh_1)),
+	       tbSh_1->b_blocknr);
+	/*
+	reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE (tbSh_1->b_size) - 
+		reiserfs_nh_get_free (NODE_HEAD(tbSh_1)));
+	reiserfs_dc_set_nr (dc, tbSh_1->b_blocknr); */
+	tb->insert_size[h] -= REISERFS_DC_SIZE;
+	reiserfs_nh_set_free (NODE_HEAD(tbSh),
+			     reiserfs_nh_get_free (NODE_HEAD(tbSh)) - 
+			     REISERFS_DC_SIZE);
+
+	reiserfs_buffer_mkdirty (tbSh);
+	
+	/* put new root into path structure */
+	REISERFS_PATH_BUFFER(tb->tb_path, REISERFS_PATH_OFFILL) = tbSh;
+	
+	/* Change root in structure super block. */
+	sb = tb->tb_fs->fs_ondisk_sb;
+	reiserfs_sb_set_root (sb, tbSh->b_blocknr);
+	reiserfs_sb_set_height (sb, reiserfs_sb_get_height (sb) + 1);
+	
+	reiserfs_buffer_mkdirty (tb->tb_fs->fs_super_bh);
+	tb->tb_fs->fs_dirt = 1;
+    }
+    
+    if ( tb->blknum[h] == 2 ) {
+	int snum;
+	reiserfs_bufinfo_t dest_bi, src_bi;
+
+
+	/* S_new = free buffer from list FEB */
+	S_new = reiserfs_tb_FEB(tb);
+
+	reiserfs_nh_set_level (NODE_HEAD(S_new), h + 1);
+
+	dest_bi.bi_bh = S_new;
+	dest_bi.bi_parent = 0;
+	dest_bi.bi_position = 0;
+	src_bi.bi_bh = tbSh;
+	src_bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+	src_bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+		
+	n = reiserfs_nh_get_items (NODE_HEAD(tbSh)); /* number of items in S[h] */
+	snum = (insert_num + n + 1)/2;
+	if ( n - snum >= child_pos ) {
+	    /* new items don't fall into S_new */
+	    /*	store the delimiting key for the next level */
+	    /* new_insert_key = (n - snum)'th key in S[h] */
+	    memcpy (&new_insert_key,reiserfs_int_key_at(tbSh,n - snum),
+		    REISERFS_KEY_SIZE);
+	    /* last parameter is del_par */
+	    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+			      LAST_TO_FIRST, snum, 0);
+	} else if ( n + insert_num - snum < child_pos ) {
+	    /* all new items fall into S_new */
+	    /*	store the delimiting key for the next level */
+	    /* new_insert_key = (n + insert_item - snum)'th key in S[h] */
+	    memcpy(&new_insert_key,reiserfs_int_key_at(tbSh,n + insert_num - snum),
+		   REISERFS_KEY_SIZE);
+	    /* last parameter is del_par */
+	    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+			      LAST_TO_FIRST, snum - insert_num, 0);
+	    
+	    /* reiserfs_ib_move(S_new,tbSh,1,snum - insert_num,0);*/
+
+	    /* insert insert_num keys and node-pointers into S_new */
+	    reiserfs_ib_insert (tb->tb_fs, &dest_bi, 
+				/*S_new,tb->S[h-1]->b_next,*/
+				child_pos - n - insert_num + snum - 1,
+				insert_num,insert_key,insert_ptr);
+	    insert_num = 0;
+	} else {
+	    reiserfs_dc_t * dc;
+
+	    /* some items fall into S_new, but some don't fall */
+	    /* last parameter is del_par */
+	    reiserfs_ib_move (tb->tb_fs, &dest_bi, &src_bi, 
+			      LAST_TO_FIRST, n - child_pos + 1, 1);
+	    /* reiserfs_ib_move(S_new,tbSh,1,n - child_pos + 1,1);*/
+	    /* calculate number of new items that fall into S_new */
+	    k = snum - n + child_pos - 1;
+
+	    reiserfs_ib_insert (tb->tb_fs, &dest_bi, 
+				/*S_new,*/ 0, k, insert_key + 1, 
+				insert_ptr+1);
+
+	    /* new_insert_key = insert_key[insert_num - k - 1] */
+	    memcpy(&new_insert_key,insert_key + insert_num - k - 1, REISERFS_KEY_SIZE);
+	    /* replace first node-ptr in S_new by node-ptr to 
+	       insert_ptr[insert_num-k-1] */
+
+	    dc = reiserfs_int_at(S_new,0);
+	    reiserfs_dc_init(dc, REISERFS_NODE_SPACE(
+		   insert_ptr[insert_num-k-1]->b_size) -
+		   reiserfs_nh_get_free (NODE_HEAD(insert_ptr[insert_num-k-1])),
+		   insert_ptr[insert_num-k-1]->b_blocknr);
+	    /*
+	    reiserfs_dc_set_size (dc, REISERFS_NODE_SPACE(insert_ptr[insert_num-k-1]->b_size) -
+		reiserfs_nh_get_free (NODE_HEAD(insert_ptr[insert_num-k-1])));
+	    reiserfs_dc_set_nr (dc, insert_ptr[insert_num-k-1]->b_blocknr);
+	    */
+	    reiserfs_buffer_mkdirty (S_new);
+			
+	    insert_num -= (k + 1);
+	}
+	/* new_insert_ptr = node_pointer to S_new */
+	new_insert_ptr = S_new;
+	
+	// S_new->b_count --;
+    }
+
+    n = reiserfs_nh_get_items (NODE_HEAD(tbSh)); /*number of items in S[h] */
+
+    if ( -1 <= child_pos && child_pos <= n && insert_num > 0 ) {
+	bi.bi_bh = tbSh;
+	bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+	bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+	if (child_pos == -1) {
+	    /* this is a little different from original do_balance:
+	       here we insert the minimal keys in the tree, that has never 
+	       happened when file system works */
+	    if (tb->CFL[h-1] || insert_num != 1 || h != 1)
+		misc_die ("reiserfs_ib_balance: invalid child_pos");
+	    /* insert_child (tb->S[h], tb->S[h-1], child_pos, insert_num, 
+			B_N_ITEM_HEAD(tb->S[0],0), insert_ptr);*/
+	    reiserfs_ib_insert (tb->tb_fs, &bi, child_pos, insert_num, 
+				reiserfs_ih_at(REISERFS_PATH_LEAF (tb->tb_path), 0), 
+				insert_ptr);
+	} else
+	    reiserfs_ib_insert (tb->tb_fs, &bi, child_pos,insert_num,
+				insert_key,insert_ptr);
+    }
+
+    memcpy (new_insert_key_addr,&new_insert_key,REISERFS_KEY_SIZE);
+    insert_ptr[0] = new_insert_ptr;
+
+    return order;
+}
diff --git a/libreiserfs/journal.c b/libreiserfs/journal.c
new file mode 100644
index 0000000..9474fab
--- /dev/null
+++ b/libreiserfs/journal.c
@@ -0,0 +1,1085 @@
+/*
+ * Copyright 2002-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/device.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+/* check whether 'block' can be logged */
+static int not_journalable (reiserfs_filsys_t * fs, unsigned long block)
+{
+    reiserfs_blktype_t type;
+    
+    type = reiserfs_fs_block(fs, block);
+    return (type == BT_INVAL || type == BT_JOURNAL);
+}
+
+/* compares description block with commit block. returns 0 if they differ, 1
+   if they match */
+static int does_desc_match_commit (reiserfs_bh_t *d_bh, 
+			    reiserfs_bh_t *c_bh) 
+{
+    return (reiserfs_jc_get_trans (c_bh) == reiserfs_jd_get_trans (d_bh) &&
+	    reiserfs_jc_get_len (c_bh) == reiserfs_jd_get_len (d_bh));
+}
+
+
+/* d_bh is descriptor, return number of block where commit block of this
+   transaction is to be */
+static unsigned long commit_expected (reiserfs_filsys_t * fs, 
+				      reiserfs_bh_t * d_bh)
+{
+    unsigned long offset;
+    reiserfs_journal_param_t * sb_jp;
+
+
+    sb_jp = reiserfs_sb_jp (fs->fs_ondisk_sb);
+    //desc = (struct reiserfs_journal_desc *)d_bh->b_data;
+    offset = d_bh->b_blocknr - reiserfs_jp_get_start (sb_jp);
+    return reiserfs_jp_get_start (sb_jp) + 
+	((offset + reiserfs_jd_get_len (d_bh) + 1) % reiserfs_jp_get_size (sb_jp));
+}
+
+
+/* d_bh contains journal descriptor, returns number of block where descriptor
+   block of next transaction should be */
+static unsigned long next_desc_expected (reiserfs_filsys_t * fs, 
+					 reiserfs_bh_t * d_bh)
+{
+    unsigned long offset;
+    reiserfs_journal_param_t * sb_jp;
+
+
+    sb_jp = reiserfs_sb_jp (fs->fs_ondisk_sb);
+    //desc = (struct reiserfs_journal_desc *)d_bh->b_data;
+    offset = d_bh->b_blocknr - reiserfs_jp_get_start (sb_jp);
+    return reiserfs_jp_get_start (sb_jp) + 
+	((offset + reiserfs_jd_get_len (d_bh) + 2) % reiserfs_jp_get_size (sb_jp));
+}
+
+/* common checks for validness of a transaction */
+static int transaction_check_content (reiserfs_filsys_t * fs, 
+				      reiserfs_trans_t * trans) 
+{
+    reiserfs_bh_t *d_bh, *c_bh;
+    struct reiserfs_journal_desc * desc;
+    struct reiserfs_journal_commit * commit;
+    unsigned long block;
+    unsigned int trans_half, i;
+
+    d_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize);
+
+    if (!d_bh || reiserfs_node_type (d_bh) != NT_JDESC)
+	goto error_desc_brelse;
+
+    /* read expected commit block and compare with descriptor block */
+    c_bh = reiserfs_buffer_read (fs->fs_journal_dev, 
+		  commit_expected (fs, d_bh), 
+		  fs->fs_blocksize);
+    
+    if (!c_bh)
+	goto error_desc_brelse;
+ 
+    if (!does_desc_match_commit (d_bh, c_bh)) 
+	goto error_commit_brelse;
+
+    /* Check that all target blocks are journalable */
+    desc = (struct reiserfs_journal_desc *)(d_bh->b_data);
+    commit = (struct reiserfs_journal_commit *)(c_bh->b_data);
+
+    trans_half = reiserfs_jt_half (d_bh->b_size);
+    for (i = 0; i < reiserfs_jd_get_len(d_bh); i++) {
+	if (i < trans_half)
+	    block = le32_to_cpu (desc->j2_realblock[i]);
+	else
+	    block = le32_to_cpu (commit->j3_realblock[i - trans_half]);
+
+	if (not_journalable(fs, block)) 
+	    goto error_commit_brelse;
+    }
+    
+    reiserfs_buffer_close (d_bh);
+    reiserfs_buffer_close (c_bh);
+    return 1;
+    
+error_commit_brelse:
+    reiserfs_buffer_close (c_bh);
+error_desc_brelse:
+    reiserfs_buffer_close(d_bh);
+    return 0;
+}
+
+/* common checks for validness of a transaction */
+static int transaction_check_desc(reiserfs_filsys_t * fs, 
+				  reiserfs_bh_t * d_bh) 
+{
+    reiserfs_bh_t * c_bh;
+    int ret = 1;
+
+    if (!d_bh || reiserfs_node_type (d_bh) != NT_JDESC)
+	return 0;
+
+    /* read expected commit block and compare with descriptor block */
+    c_bh = reiserfs_buffer_read (fs->fs_journal_dev, commit_expected (fs, d_bh), fs->fs_blocksize);
+    if (!c_bh)
+	return 0;
+ 
+    if (!does_desc_match_commit (d_bh, c_bh)) 
+	ret = 0;
+
+    reiserfs_buffer_close (c_bh);
+    return ret;
+}
+
+
+/* read the journal and find the oldest and newest transactions, return number
+   of transactions found */
+int reiserfs_journal_get_transactions (reiserfs_filsys_t * fs,
+				       reiserfs_trans_t * oldest,
+				       reiserfs_trans_t * newest)
+{
+    reiserfs_sb_t * sb;
+    unsigned long j_cur;
+    unsigned long j_start;
+    unsigned long j_size;
+    reiserfs_bh_t * d_bh;
+    __u32 newest_trans_id, oldest_trans_id, trans_id;
+    int trans_nr;
+
+    sb = fs->fs_ondisk_sb;
+    
+    j_start = reiserfs_jp_get_start (reiserfs_sb_jp (sb));
+    j_size = reiserfs_jp_get_size (reiserfs_sb_jp (sb));
+    
+    oldest_trans_id = 0xffffffff;
+    newest_trans_id = 0;
+
+    trans_nr = 0;
+    for (j_cur = 0; j_cur < j_size; j_cur ++) {
+	d_bh = reiserfs_buffer_read (fs->fs_journal_dev, j_start + j_cur, fs->fs_blocksize);
+	if (!transaction_check_desc (fs, d_bh)) {
+	    reiserfs_buffer_close (d_bh);
+	    continue;
+	}
+
+	trans_nr ++;
+
+	trans_id = reiserfs_jd_get_trans (d_bh);
+	if (trans_id < oldest_trans_id) {
+	    oldest_trans_id = trans_id;
+
+	    oldest->mount_id = reiserfs_jd_get_mount (d_bh);
+	    oldest->trans_id = reiserfs_jd_get_trans (d_bh);
+	    oldest->desc_blocknr = d_bh->b_blocknr;
+	    oldest->trans_len = reiserfs_jd_get_len (d_bh);
+	    oldest->commit_blocknr = commit_expected (fs, d_bh);
+	    oldest->next_trans_offset = next_desc_expected (fs, d_bh) - j_start;
+	}
+
+	if (trans_id > newest_trans_id) {
+	    newest_trans_id = trans_id;
+
+	    newest->mount_id = reiserfs_jd_get_mount (d_bh);
+	    newest->trans_id = reiserfs_jd_get_trans (d_bh);
+	    newest->desc_blocknr = d_bh->b_blocknr;
+	    newest->trans_len = reiserfs_jd_get_len (d_bh);
+	    newest->commit_blocknr = commit_expected (fs, d_bh);
+	    newest->next_trans_offset = next_desc_expected (fs, d_bh) - j_start;
+	}
+
+	j_cur += reiserfs_jd_get_len (d_bh) + 1;
+	reiserfs_buffer_close (d_bh);
+    }
+
+    return trans_nr;
+}
+
+#define TRANS_FOUND     1
+#define TRANS_NOT_FOUND 0
+
+/* trans is a valid transaction. Look for valid transaction with smallest
+   trans id which is greater than the id of the current one */
+static int next_transaction (reiserfs_filsys_t * fs, 
+			     reiserfs_trans_t * trans, 
+			     reiserfs_trans_t break_trans)
+{
+    reiserfs_bh_t * d_bh, * next_d_bh;
+    int found;
+    unsigned long j_start;
+    unsigned long j_offset;
+    unsigned long block;
+
+
+    j_start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb));
+
+    found = TRANS_NOT_FOUND;
+
+    if (trans->trans_id == break_trans.trans_id)
+	return found;
+	
+    /* make sure that 'trans' is a valid transaction */
+    d_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize);
+    if (!transaction_check_desc (fs, d_bh))
+	misc_die ("next_transaction: valid transaction is expected");
+
+    block = next_desc_expected (fs, d_bh);
+    j_offset = block - j_start;
+
+    while (1) {
+	next_d_bh = reiserfs_buffer_read (fs->fs_journal_dev, block, fs->fs_blocksize);
+	if (transaction_check_desc (fs, next_d_bh))
+	    break;
+
+	reiserfs_buffer_close (next_d_bh);
+	j_offset ++;
+	block = j_start + 
+		(j_offset % reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)));
+    }
+
+    //next_desc = (struct reiserfs_journal_desc *)next_d_bh->b_data;
+    
+    if (break_trans.trans_id >= reiserfs_jd_get_trans (next_d_bh)) {
+	/* found transaction is newer */
+	trans->mount_id = reiserfs_jd_get_mount (next_d_bh);
+	trans->trans_id = reiserfs_jd_get_trans (next_d_bh);
+	trans->desc_blocknr = next_d_bh->b_blocknr;
+	trans->trans_len = reiserfs_jd_get_len (next_d_bh);
+	trans->commit_blocknr = commit_expected (fs, next_d_bh);
+	trans->next_trans_offset = next_desc_expected (fs, next_d_bh) - j_start;
+	found = TRANS_FOUND;
+    }
+
+    reiserfs_buffer_close (d_bh);
+    reiserfs_buffer_close (next_d_bh);
+    return found;
+}
+
+static void read_journal_write_in_place (reiserfs_filsys_t * fs, 
+					 reiserfs_trans_t * trans, 
+					 unsigned int index, 
+                                         unsigned long in_journal, 
+					 unsigned long in_place)
+{
+    reiserfs_bh_t * j_bh, * bh;
+
+    j_bh = reiserfs_buffer_read (fs->fs_journal_dev, in_journal, fs->fs_blocksize);
+    if (!j_bh) {
+	fprintf (stderr, "replay_one_transaction: transaction %lu: reading "
+		 "%lu block failed\n", trans->trans_id, in_journal);
+	return;
+    }
+    if (not_journalable (fs, in_place)) {
+	fprintf (stderr, "replay_one_transaction: transaction %lu: block "
+		 "%ld should not be journalled (%lu)\n",
+		 trans->trans_id, in_journal, in_place);
+	reiserfs_buffer_close (j_bh);
+	return;
+    }
+
+    bh = reiserfs_buffer_open (fs->fs_dev, in_place, fs->fs_blocksize);
+    
+    memcpy (bh->b_data, j_bh->b_data, bh->b_size);
+    reiserfs_buffer_mkdirty (bh);
+    reiserfs_buffer_mkuptodate (bh, 1);
+    reiserfs_buffer_write (bh);
+    reiserfs_buffer_close (bh);
+    reiserfs_buffer_close (j_bh);
+    
+}
+
+
+/* go through all blocks of transaction and call 'action' each of them */
+void reiserfs_journal_foreach (reiserfs_filsys_t * fs, 
+			       reiserfs_trans_t * trans,
+			       action_on_block_t action)
+{
+    reiserfs_bh_t * d_bh, * c_bh;
+    struct reiserfs_journal_desc * desc;
+    struct reiserfs_journal_commit * commit;
+    unsigned long j_start, j_offset, j_size;
+    unsigned int i, trans_half;
+    unsigned long block;
+ 
+    d_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize);
+    if (!d_bh) {
+	reiserfs_warning (stdout, "reading descriptor block %lu failed\n", 
+			  trans->desc_blocknr);
+	return;
+    }
+
+    c_bh = reiserfs_buffer_read (fs->fs_journal_dev, trans->commit_blocknr, fs->fs_blocksize);
+    if (!c_bh) {
+	reiserfs_warning (stdout, "reading commit block %lu failed\n", 
+			  trans->commit_blocknr);
+	reiserfs_buffer_close (d_bh);
+	return;
+    }
+
+    desc = (struct reiserfs_journal_desc *)(d_bh->b_data);
+    commit = (struct reiserfs_journal_commit *)(c_bh->b_data);
+
+    /* first block of journal and size of journal */
+    j_start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb));
+    j_size = reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb));
+
+    /* offset in the journal where the transaction starts */
+    j_offset = trans->desc_blocknr - j_start + 1;
+
+    trans_half = reiserfs_jt_half (d_bh->b_size);
+    for (i = 0; i < trans->trans_len; i ++, j_offset ++) {
+	if (i < trans_half)
+	    block = le32_to_cpu (desc->j2_realblock[i]);
+	else
+	    block = le32_to_cpu (commit->j3_realblock[i - trans_half]);
+	action (fs, trans, i, j_start + (j_offset % j_size), block);
+    }
+
+    reiserfs_buffer_close (d_bh);
+    reiserfs_buffer_close (c_bh);
+}
+
+
+/* transaction is supposed to be valid */
+static int replay_one_transaction (reiserfs_filsys_t * fs,
+				   reiserfs_trans_t * trans)
+{
+    reiserfs_journal_foreach (fs, trans, read_journal_write_in_place);
+    fsync(fs->fs_dev);
+    return 0;
+}
+
+
+void reiserfs_journal_by_transaction (reiserfs_filsys_t * fs, 
+				      action_on_trans_t action)
+{
+    reiserfs_trans_t oldest, newest;
+    int ret = 0;
+
+    if (!reiserfs_journal_get_transactions (fs, &oldest, &newest))
+	return;
+
+    while (1) {
+	action (fs, &oldest);	
+	if ((ret = next_transaction (fs, &oldest, newest)) == TRANS_NOT_FOUND)
+	    break;
+    }
+}
+
+/* Get the size of the journal or reserved area. */
+unsigned long reiserfs_journal_hostsize(reiserfs_sb_t * sb)
+{
+	if (reiserfs_super_jr_magic (sb))
+		return reiserfs_sb_get_reserved (sb);
+
+	/* with standard journal */
+	return reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1;
+}
+
+
+__u32 reiserfs_journal_tlen (__u32 desired, __u32 journal_size, 
+			     int blocksize, int verbose)
+{
+    __u32 saved;
+    __u32 ratio = 1;
+
+    if (blocksize < 4096)
+	ratio = 4096/blocksize;
+	
+    saved = desired;
+    if (!desired)
+		desired = JOURNAL_TRANS_MAX/ratio;
+    
+    if (journal_size / desired < JOURNAL_MIN_RATIO)
+		desired = journal_size / JOURNAL_MIN_RATIO;
+    
+    if (desired > JOURNAL_TRANS_MAX/ratio)
+		desired = JOURNAL_TRANS_MAX/ratio;
+    
+    if (desired < JOURNAL_TRANS_MIN/ratio)
+		desired = JOURNAL_TRANS_MIN/ratio;
+
+    if (verbose) {
+	if (saved && saved != desired)
+		reiserfs_warning (stderr,
+		    "WARNING: wrong transaction max size (%u). Changed to %u\n", 
+		    saved, desired);
+    }
+
+    return desired;
+}
+#if 0
+    __u32 ret_val;
+    ret_val = 0;
+    if (!desired)                   ret_val = JOURNAL_TRANS_MAX;
+    if (desired<journal_size/8)     ret_val = journal_size/8;
+    if (desired>journal_size/2)     ret_val = journal_size/2;
+    if (desired>JOURNAL_TRANS_MAX)  ret_val = JOURNAL_TRANS_MAX;
+    if (ret_val) {
+        reiserfs_warning (stderr, "WARNING: Journal max trans length "
+			  "is wrong seting: %u, resetting to available "
+			  "possible %u\n", desired, ret_val);
+    } else {
+        ret_val = desired;
+    }
+    return ret_val;
+}
+#endif
+
+__u32 reiserfs_journal_batch (unsigned long journal_trans_max) {
+    return journal_trans_max*JOURNAL_MAX_BATCH/JOURNAL_TRANS_MAX;
+}
+
+__u32 reiserfs_journal_commit_age (void) {
+    return JOURNAL_MAX_COMMIT_AGE;
+}
+
+
+__u32 reiserfs_journal_trans_age (void) {
+    return JOURNAL_MAX_TRANS_AGE;
+}
+
+int reiserfs_journal_params_check (reiserfs_filsys_t * fs) {
+    struct reiserfs_journal_header * j_head;
+    reiserfs_sb_t * sb = fs->fs_ondisk_sb;
+    
+    j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
+	
+    /* Check the superblock's journal parameters. */
+    if (!reiserfs_super_jr_magic (sb)) {    
+	if ((reiserfs_jp_get_dev (reiserfs_sb_jp(sb)) != 0) || 
+	    (reiserfs_jp_get_start (reiserfs_sb_jp(sb)) != 
+	     reiserfs_journal_start_must (fs)) || 
+	    (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) != 
+	     reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)))
+	{
+	    reiserfs_warning (stderr, 
+		"\nreiserfs_journal_open: wrong journal parameters found in the "
+		"super block. \nYou should run reiserfsck with --rebuild-sb to "
+		"check your superblock consistency.\n\n");
+		
+	    return 1;
+	}
+    }
+	
+    if (memcmp(&j_head->jh_journal, reiserfs_sb_jp (sb), sizeof(reiserfs_journal_param_t))) {
+	if (!reiserfs_super_jr_magic (sb)) {
+	    reiserfs_warning (stderr, "\nreiserfs_journal_open: journal "
+			      "parameters from the superblock does not "
+			      "match \nto the journal headers ones. It "
+			      "looks like that you created your fs with "
+			      "old\nreiserfsprogs. Journal header is "
+			      "fixed.\n\n", fs->fs_j_file_name);
+		
+	    memcpy(&j_head->jh_journal, reiserfs_sb_jp(sb), 
+		   sizeof(reiserfs_journal_param_t));
+	    
+	    reiserfs_buffer_mkdirty(fs->fs_jh_bh);
+	    reiserfs_buffer_write(fs->fs_jh_bh);
+	} else {
+	    reiserfs_warning (stderr, "\nreiserfs_journal_open: journal "
+			      "parameters from the super block does not "
+			      "match \nto journal parameters from the "
+			      "journal. You should run  reiserfsck with "
+			      "--rebuild-sb to check your superblock "
+			      "consistency.\n\n");
+	    return 1;	
+	}
+    }
+    
+    return 0;
+}
+
+/* read journal header and make sure that it matches with the filesystem
+   opened */
+int reiserfs_journal_open (reiserfs_filsys_t * fs, char * j_filename, int flags) {
+    reiserfs_sb_t * sb;
+    char buf[4096];
+    __u64 count;
+    dev_t rdev;
+    
+    sb = fs->fs_ondisk_sb;
+
+    if (j_filename && j_filename[0] != '\0') {
+	if (!reiserfs_super_jr_magic (sb) && 
+	    strcmp (j_filename, fs->fs_file_name)) 
+	{
+	    reiserfs_warning (stderr, "Filesystem with standard journal found, "
+			      "wrong name of specified journal device %s \n", 
+			      j_filename);
+	    return 2;
+	}
+    } else {
+	if (!reiserfs_super_jr_magic (sb)) {
+	    j_filename = fs->fs_file_name;
+	} else {
+	    /* Not standard journal and no device is specified.
+	       Find the device by rdev. */
+	    strcpy(buf, "/dev");
+
+	    rdev = reiserfs_sb_jp(sb)->jp_dev;
+	    if ((misc_dir_walk(buf, misc_device_rdev_match, &rdev)) <= 0) {
+		reiserfs_warning (stderr, "Filesystem with non-standard "
+				  "journal found, failed to find a block "
+				  "device (%u:%u) in /dev.\nCreate such "
+				  "a device in /dev or specify the journal "
+				  "device with -j option.\n",
+				  major(rdev), minor(rdev));
+
+		return 2;
+	    }
+
+	    j_filename = buf;
+	}
+    }
+    
+    fs->fs_journal_dev = open (j_filename, flags 
+#if defined(O_LARGEFILE)
+			       | O_LARGEFILE
+#endif
+			       );
+    if (fs->fs_journal_dev == -1) 
+        return -1;
+    
+    strncpy(fs->fs_j_file_name, j_filename, sizeof(fs->fs_j_file_name));
+    
+    if (reiserfs_jp_get_size(reiserfs_sb_jp(sb)) < JOURNAL_MIN_SIZE) {
+	reiserfs_warning (stderr, "Journal of (%lu) block size found on "
+	    "specified journal device %s.\nMust be not less than (%lu).\n",
+	    reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1, j_filename, 
+	    JOURNAL_MIN_SIZE + 1);
+	close(fs->fs_journal_dev);
+	return 1;
+    }
+    
+    if (!(count = misc_device_count_blocks (j_filename, fs->fs_blocksize))) {
+	close(fs->fs_journal_dev);
+	return -1;
+    }
+
+    if (reiserfs_jp_get_start (reiserfs_sb_jp (sb)) + 
+	reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1 > count) 
+    {
+	reiserfs_warning (stderr, "Detected journal on specified device %s "
+			  "does not fit to the device.\nStart block (%lu) + "
+			  "size (%lu) less than device size (%lu).\n", 
+			  j_filename, reiserfs_jp_get_start(reiserfs_sb_jp (sb)), 
+			  reiserfs_jp_get_size(reiserfs_sb_jp (sb)) + 1, count);
+	close(fs->fs_journal_dev);
+	return 1;
+    }
+    
+    /* read journal header */
+    fs->fs_jh_bh = reiserfs_buffer_read (fs->fs_journal_dev, 
+			  reiserfs_jp_get_start (reiserfs_sb_jp (sb)) + 
+			  reiserfs_jp_get_size (reiserfs_sb_jp (sb)), 
+			  fs->fs_blocksize);
+
+    if (!fs->fs_jh_bh) {
+	reiserfs_warning (stderr, "reiserfs_journal_open: reiserfs_buffer_read failed "
+			  "reading journal  header.\n");
+	close(fs->fs_journal_dev);
+	return -1;
+    }
+
+    return 0;
+}
+
+/* initialize super block's journal related fields and journal header fields. 
+ * If len is 0 - make journal of default size */
+int reiserfs_journal_create(
+    reiserfs_filsys_t * fs, 
+    char * j_device,		/* journal device name */
+    unsigned long offset,	/* journal offset on the j_device */
+    unsigned long len,		/* including journal header */
+    int transaction_max_size)
+{
+    struct stat st;
+    reiserfs_bh_t * bh;
+    struct reiserfs_journal_header * jh;
+    reiserfs_sb_t * sb;
+    unsigned long blocks;
+
+    sb = fs->fs_ondisk_sb;
+    
+    if (!j_device || !strcmp (j_device, fs->fs_file_name)) {
+	/* Journal is to be on the host device, check the amount space for the 
+	 * journal on it. */
+	len = len ? len : reiserfs_journal_default(fs->fs_super_bh->b_blocknr, 
+	    fs->fs_blocksize) + 1;
+		
+	offset = offset ? offset : reiserfs_journal_start_must(fs);
+	
+	if (offset < reiserfs_journal_start_must(fs)) {
+	    reiserfs_warning (stderr, "reiserfs_journal_create: offset is "
+		"%lu, but it cannot be less then %llu on the device %s\n", 
+		offset, reiserfs_journal_start_must(fs), j_device);
+	    return 0;
+	}
+	
+	if (!reiserfs_journal_fits(offset, fs->fs_blocksize, 
+				   reiserfs_sb_get_blocks(sb), len))
+	{
+	    /* host device does not contain enough blocks */
+	    reiserfs_warning (stderr, "reiserfs_journal_create: cannot create "
+		"a journal of %lu blocks with %lu offset on %d blocks\n", 
+		len, offset, reiserfs_sb_get_blocks(sb));
+		return 0;
+	}
+	
+	j_device = fs->fs_file_name;
+	
+	
+	st.st_rdev = 0;
+    } else {
+	/* journal is to be on separate device */
+	if (!(blocks = misc_device_count_blocks (j_device, fs->fs_blocksize)))
+		return 0;
+
+	if (!len) {
+	    /* default size of a journal on a separate device is whole device */
+	    if (blocks < offset) {
+		reiserfs_warning (stderr, "reiserfs_journal_create: offset is "
+		    "%lu, blocks on device %lu\n", offset, blocks);
+		return 0;
+	    }
+	    len = blocks - offset;
+	}
+
+	if (len > reiserfs_journal_default (fs->fs_super_bh->b_blocknr, 
+	    fs->fs_blocksize) + 1) 
+	{
+	    fflush(stderr);
+	    
+	    reiserfs_warning (stdout, "NOTE: journal new size %lu is greater "
+		"than default size %lu:\nthis may slow down initializing and "
+		"mounting of the journal. Hope it is ok.\n\n", len, 
+		reiserfs_journal_default(fs->fs_super_bh->b_blocknr, 
+		fs->fs_blocksize) + 1);
+	}
+
+	if (blocks < offset + len) {
+	    reiserfs_warning (stderr, "reiserfs_journal_create: no enough "
+		"blocks on device %lu, needed %lu\n", blocks, offset + len);
+	    return 0;
+	}
+	
+	if (stat (j_device, &st) == -1) {
+	    reiserfs_warning (stderr, "reiserfs_journal_create: stat %s failed"
+		": %s\n", j_device, strerror(errno));
+	    return 0;
+	}
+/*
+	if (!S_ISBLK (st.st_mode)) {
+		reiserfs_warning (stderr, "reiserfs_journal_create: "
+		"%s is not a block device (%x)\n", j_device, st.st_rdev);
+		return 0;
+	}
+*/
+    }
+
+    fs->fs_journal_dev = open (j_device, O_RDWR 
+#if defined(O_LARGEFILE)
+			       | O_LARGEFILE
+#endif
+			       );
+    if (fs->fs_journal_dev == -1) {
+	reiserfs_warning (stderr, "reiserfs_journal_create: could not open "
+	    "%s: %s\n", j_device, strerror(errno));
+	return 0;
+    }
+
+    strncpy(fs->fs_j_file_name, j_device, sizeof(fs->fs_j_file_name));
+
+    if (len < JOURNAL_MIN_SIZE + 1) {
+	reiserfs_warning (stderr, "WARNING: Journal size (%u) is less, than "
+	    "minimal supported journal size (%u).\n", len, JOURNAL_MIN_SIZE + 1);
+        return 0;
+    }
+    /* get journal header */
+    bh = reiserfs_buffer_open (fs->fs_journal_dev, offset + len - 1, fs->fs_blocksize);
+    if (!bh) {
+	reiserfs_warning (stderr, "reiserfs_journal_create: reiserfs_buffer_open failed\n");
+	return 0;
+    }
+
+    /* fill journal header */
+    jh = (struct reiserfs_journal_header *)bh->b_data;
+    reiserfs_jp_set_start(&jh->jh_journal, offset);
+    reiserfs_jp_set_dev(&jh->jh_journal, st.st_rdev);
+    reiserfs_jp_set_magic(&jh->jh_journal, misc_random());
+
+    reiserfs_jp_set_size(&jh->jh_journal, len - 1);
+    reiserfs_jp_set_tlen(&jh->jh_journal, reiserfs_journal_tlen(
+	transaction_max_size, len - 1, fs->fs_blocksize, 1));
+    reiserfs_jp_set_max_batch(&jh->jh_journal, reiserfs_journal_batch(
+	reiserfs_jp_get_tlen(&jh->jh_journal)));
+    reiserfs_jp_set_commit_age(&jh->jh_journal, 
+	reiserfs_journal_commit_age());
+    reiserfs_jp_set_trans_age(&jh->jh_journal, 
+	reiserfs_journal_trans_age ());
+
+    reiserfs_buffer_mkuptodate (bh, 1);
+    reiserfs_buffer_mkdirty (bh);
+    
+    fs->fs_jh_bh = bh;
+    
+    /* make a copy of journal header in the super block */
+    memcpy (reiserfs_sb_jp (sb), &jh->jh_journal, sizeof (reiserfs_journal_param_t));
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+
+    return 1;
+}
+
+/* reiserfs_buffer_close journal header, flush all dirty buffers, close device, open, read
+   journal header */
+void reiserfs_journal_reopen (reiserfs_filsys_t * fs, int flag)
+{
+    unsigned long jh_block;
+
+
+    if (!reiserfs_journal_opened (fs))
+	return;
+
+    jh_block = fs->fs_jh_bh->b_blocknr;
+    reiserfs_buffer_close (fs->fs_jh_bh);
+    reiserfs_buffer_flush_all (fs->fs_journal_dev);
+    reiserfs_buffer_invalidate_all(fs->fs_journal_dev);
+    if (close (fs->fs_journal_dev))
+	misc_die ("reiserfs_journal_reopen: closed failed: %s", strerror(errno));
+
+    fs->fs_journal_dev = open (fs->fs_j_file_name, flag 
+#if defined(O_LARGEFILE)
+			       | O_LARGEFILE
+#endif
+			       );
+    if (fs->fs_journal_dev == -1)
+	misc_die ("reiserfs_journal_reopen: could not reopen journal device");
+
+    fs->fs_jh_bh = reiserfs_buffer_read (fs->fs_journal_dev, jh_block, fs->fs_blocksize);
+    if (!fs->fs_jh_bh)
+	misc_die ("reiserfs_journal_reopen: reading journal header failed");
+}
+
+
+int reiserfs_journal_opened (reiserfs_filsys_t * fs)
+{
+    return fs->fs_jh_bh ? 1 : 0;
+}
+
+
+void reiserfs_journal_flush (reiserfs_filsys_t * fs)
+{
+    if (!reiserfs_journal_opened (fs))
+		return;
+    reiserfs_buffer_flush_all(fs->fs_journal_dev);
+}
+
+
+void reiserfs_journal_free (reiserfs_filsys_t * fs)
+{
+    if (!reiserfs_journal_opened (fs))
+		return;
+    reiserfs_buffer_close (fs->fs_jh_bh);
+    fs->fs_jh_bh = 0;
+    fs->fs_j_file_name[0] = '\0';
+}
+
+
+void reiserfs_journal_close (reiserfs_filsys_t * fs)
+{
+    reiserfs_journal_flush (fs);
+    reiserfs_journal_free (fs);
+
+}
+
+/* update journal header */
+static void update_journal_header (reiserfs_filsys_t * fs, 
+				   reiserfs_bh_t * bh_jh, 
+				   reiserfs_trans_t *trans) 
+{
+    struct reiserfs_journal_header * j_head;
+	
+    j_head = (struct reiserfs_journal_header *)(bh_jh->b_data);
+
+    /* update journal header */
+    reiserfs_jh_set_flushed (j_head, trans->trans_id);
+    reiserfs_jh_set_mount (j_head, trans->mount_id);
+    reiserfs_jh_set_start (j_head, trans->next_trans_offset);
+    reiserfs_buffer_mkdirty (bh_jh);
+    reiserfs_buffer_write (bh_jh);
+    fsync(fs->fs_journal_dev);
+}
+
+/* FIXME: what should be done when not all transactions can be replayed in 
+   proper order? */
+int reiserfs_journal_replay (reiserfs_filsys_t * fs)
+{
+    reiserfs_bh_t * bh;
+    struct reiserfs_journal_header * j_head;
+    reiserfs_trans_t cur, newest, control;
+    int replayed, ret;
+
+    if (!reiserfs_journal_opened (fs))
+        reiserfs_panic ("reiserfs_journal_replay: journal is not opened");
+    
+    if (!reiserfs_fs_rw (fs)) {
+        reiserfs_panic ("reiserfs_journal_replay: fs is not opened with "
+			"write perms");
+    }
+
+    reiserfs_warning (stderr, "Replaying journal..\n");
+    bh = fs->fs_jh_bh;
+	
+    j_head = (struct reiserfs_journal_header *)(bh->b_data);
+    control.mount_id = reiserfs_jh_get_mount (j_head);
+    control.trans_id = reiserfs_jh_get_flushed (j_head);
+    control.desc_blocknr = reiserfs_jh_get_start (j_head);
+
+    if (!reiserfs_journal_get_transactions (fs, &cur, &newest)) {
+	reiserfs_warning (stderr, "No transactions found\n");
+	return 0;
+    }
+
+    /*  Smth strange with journal header or journal. We cannot say for sure 
+	what was the last replaied transaction, but relying on JH data is 
+	preferable. */
+
+    replayed = 0;
+    ret = TRANS_FOUND;
+    
+    /* Looking to the first valid not replayed transaction. */
+    while (1) {
+	if (cur.mount_id == control.mount_id && 
+	    cur.trans_id > control.trans_id)
+	    break;
+
+	if ((ret = next_transaction (fs, &cur, newest)) != TRANS_FOUND)
+	    break;
+    }
+    
+    while (ret == TRANS_FOUND) {
+	/* If not the next transaction to be replayed, break out here. */
+	if ((cur.mount_id != control.mount_id) || 
+	    (cur.trans_id != control.trans_id + 1 && control.trans_id))
+	    break;
+	
+	if (!transaction_check_content(fs, &cur)) {
+	    reiserfs_warning (stderr, "Trans broken: mountid %lu, transid %lu, "
+			      "desc %lu, len %lu, commit %lu, next trans "
+			      "offset %lu\n", cur.mount_id, cur.trans_id, 
+			      cur.desc_blocknr, cur.trans_len, 
+			      cur.commit_blocknr, cur.next_trans_offset);
+	    break;
+	}
+
+        reiserfs_warning (stderr, "Trans replayed: mountid %lu, transid %lu, "
+			  "desc %lu, len %lu, commit %lu, next trans offset "
+			  "%lu\n", cur.mount_id, cur.trans_id, 
+			  cur.desc_blocknr, cur.trans_len, 
+			  cur.commit_blocknr, cur.next_trans_offset);
+	replay_one_transaction (fs, &cur);
+	update_journal_header (fs, bh, &cur);
+	control = cur;
+        replayed ++;
+
+	ret = next_transaction (fs, &cur, newest);
+    }
+
+    reiserfs_warning (stderr, "Reiserfs journal '%s' in blocks [%u..%u]: %d "
+		      "transactions replayed\n", fs->fs_j_file_name, 
+		      reiserfs_jp_get_start(reiserfs_sb_jp(fs->fs_ondisk_sb)),
+		      reiserfs_jp_get_start(reiserfs_sb_jp(fs->fs_ondisk_sb)) + 
+		      reiserfs_jp_get_size(reiserfs_sb_jp(fs->fs_ondisk_sb)) + 1,
+		      replayed);
+	
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+    reiserfs_buffer_write (fs->fs_super_bh);
+	
+    update_journal_header (fs, bh, &newest);
+
+    return 0;
+}
+
+int reiserfs_journal_desc_valid (reiserfs_bh_t *bh) {
+    struct reiserfs_journal_desc *desc;
+    
+    desc = (struct reiserfs_journal_desc *)bh->b_data;
+    
+    if (!memcmp(bh->b_data + bh->b_size - 12, JOURNAL_DESC_MAGIC, 8) &&
+	le32_to_cpu (desc->j2_len) > 0)
+    {
+	return 1;
+    }
+
+    return 0;
+}
+
+int reiserfs_journal_block (reiserfs_filsys_t * fs, unsigned long block) {
+    unsigned long start;
+
+    start = reiserfs_journal_start_must(fs);
+    
+    if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) {
+	/* standard journal */
+	if (block >= start && 
+	    block <= start + reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)))
+	{
+	    return 1;
+	}
+	
+	return 0;
+    }
+    
+    if (reiserfs_sb_get_reserved (fs->fs_ondisk_sb)) {
+	/* there is space reserved for the journal on the host device */
+	if (block >= start && 
+	    block < start + reiserfs_sb_get_reserved (fs->fs_ondisk_sb))
+	{
+	    return 1;
+	}
+    }
+
+    return 0;
+}
+
+// in reiserfs version 0 (undistributed bitmap)
+// FIXME: what if number of bitmaps is 15?
+static unsigned int reiserfs_journal_oldstart_must (reiserfs_filsys_t * fs) {
+    unsigned int bmap_nr;
+    
+    bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks(fs->fs_ondisk_sb),
+			       fs->fs_blocksize);
+    
+    return (REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) + 1 + bmap_nr;
+}
+
+static unsigned int reiserfs_journal_newstart_must (reiserfs_filsys_t * fs) {
+    return (REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) + 2;
+}
+
+unsigned int reiserfs_journal_start_must (reiserfs_filsys_t * fs) {
+    if (reiserfs_old_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
+    	return reiserfs_journal_oldstart_must (fs);
+
+    return reiserfs_journal_newstart_must(fs);
+}
+
+
+
+void reiserfs_journal_print_params (FILE * fp, reiserfs_journal_param_t * jp)
+{
+    reiserfs_warning (fp, "\tDevice [0x%x]\n", reiserfs_jp_get_dev (jp));
+    reiserfs_warning (fp, "\tMagic [0x%x]\n", reiserfs_jp_get_magic (jp));
+
+    reiserfs_warning (fp, "\tSize %u blocks (including 1 for journal header) (first block %u)\n",
+		      reiserfs_jp_get_size (jp) + 1,
+		      reiserfs_jp_get_start (jp));
+    reiserfs_warning (fp, "\tMax transaction length %u blocks\n", reiserfs_jp_get_tlen (jp));
+    reiserfs_warning (fp, "\tMax batch size %u blocks\n", reiserfs_jp_get_max_batch (jp));
+    reiserfs_warning (fp, "\tMax commit age %u\n", reiserfs_jp_get_commit_age (jp));
+    reiserfs_warning (fp, "\tMax transaction age %u\n", reiserfs_jp_get_trans_age (jp));
+}
+
+
+
+void reiserfs_journal_print_header (reiserfs_filsys_t * fs) {
+    struct reiserfs_journal_header * j_head;
+
+
+    j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
+    reiserfs_warning (stdout, "Journal header (block #%lu of %s):\n"
+		      "\tj_last_flush_trans_id %ld\n"
+		      "\tj_first_unflushed_offset %ld\n"
+		      "\tj_mount_id %ld\n", 
+		      fs->fs_jh_bh->b_blocknr, fs->fs_j_file_name,
+		      reiserfs_jh_get_flushed (j_head),
+		      reiserfs_jh_get_start (j_head),
+		      reiserfs_jh_get_mount (j_head));
+    reiserfs_journal_print_params (stdout, &j_head->jh_journal);
+}
+
+static void print_trans_element (reiserfs_filsys_t * fs, 
+				 reiserfs_trans_t * trans,
+				 unsigned int index, 
+				 unsigned long in_journal, 
+				 unsigned long in_place)
+{
+    if (index % 8 == 0)
+	reiserfs_warning (stdout, "#%d\t", index);
+
+    reiserfs_warning (stdout, "%lu->%lu%s ",  in_journal, in_place,
+		      reiserfs_bitmap_block (fs, in_place) ? "B" : "");
+    if ((index + 1) % 8 == 0 || index == trans->trans_len - 1)
+	reiserfs_warning (stdout, "\n");
+}
+
+
+static void print_one_transaction (reiserfs_filsys_t * fs, 
+				   reiserfs_trans_t * trans)
+{
+    reiserfs_warning (stdout, "Mountid %u, transid %u, desc %lu, length %u, "
+		      "commit %lu\n", trans->mount_id, trans->trans_id,
+		      trans->desc_blocknr, trans->trans_len, 
+		      trans->commit_blocknr);
+    
+    reiserfs_journal_foreach (fs, trans, print_trans_element);
+}
+
+
+/* print all valid transactions and found dec blocks */
+void reiserfs_journal_print (reiserfs_filsys_t * fs)
+{
+    if (!reiserfs_journal_opened (fs)) {
+	reiserfs_warning (stderr, "reiserfs_journal_print: journal is not opened\n");
+	return;
+    }
+    reiserfs_journal_print_header (fs);
+
+    reiserfs_journal_by_transaction (fs, print_one_transaction);
+}
+
+int reiserfs_print_jdesc (FILE * fp, reiserfs_bh_t * bh) {
+    if (memcmp(reiserfs_jd_magic (bh), JOURNAL_DESC_MAGIC, 8))
+	return 1;
+
+    reiserfs_warning (fp, "Desc block %lu (j_trans_id %ld, j_mount_id %ld, j_len %ld)\n",
+		      bh->b_blocknr, reiserfs_jd_get_trans (bh),
+		      reiserfs_jd_get_mount (bh), reiserfs_jd_get_len (bh));
+
+    return 0;
+}
+
+/* reiserfs needs at least: enough blocks for journal, 64 k at the beginning,
+   one block for super block, bitmap block and root block. Note that first
+   bitmap block must point to all of them */
+int reiserfs_journal_fits(unsigned long journal_offset, 
+			  unsigned int block_size,
+			  unsigned long block_count, 
+			  unsigned long journal_size) 
+{
+	unsigned long blocks;
+
+    /* RESERVED, MD RAID SBs, super block, bitmap, root, journal size with journal header */
+    blocks = journal_offset + journal_size;
+
+    /* we have a limit: skipped area, super block, journal and root block
+    all have to be addressed by one first bitmap */
+    if (blocks > block_size * 8)
+    	return 0;
+    	
+    if (blocks > block_count)
+    	return 0;
+    	
+    return 1;
+}
diff --git a/libreiserfs/key.c b/libreiserfs/key.c
new file mode 100644
index 0000000..0e394d5
--- /dev/null
+++ b/libreiserfs/key.c
@@ -0,0 +1,273 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/unaligned.h"
+
+const reiserfs_key_t root_dir_key = 
+	{cpu_to_le32(REISERFS_ROOT_PARENT_OBJECTID),
+	 cpu_to_le32(REISERFS_ROOT_OBJECTID), 
+	 {{0, 0},}};
+
+const reiserfs_key_t parent_root_dir_key = {
+	0, cpu_to_le32(REISERFS_ROOT_PARENT_OBJECTID), 
+	{{0, 0},}};
+
+reiserfs_key_t lost_found_dir_key = 
+	{0, 0, {{0, 0}, }};
+
+/* Minimal possible key. It is never in the tree. */
+const reiserfs_key_t MIN_KEY = {0, 0, {{0, 0},}};
+
+/* Maximal possible key. It is never in the tree. */
+const reiserfs_key_t MAX_KEY = 
+	{0xffffffff, 0xffffffff, 
+	 {{0xffffffff, 0xffffffff},}};
+
+void reiserfs_key_copy (reiserfs_key_t * to, const reiserfs_key_t * from) {
+    memcpy (to, from, REISERFS_KEY_SIZE);
+}
+
+void reiserfs_key_copy2 (reiserfs_key_t * to, const reiserfs_key_t * from) {
+    memcpy (to, from, REISERFS_KEY_SHSIZE);
+}
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define get_key_offset_v2(key)     (__u64)((key->u.k2_offset_v2.k_offset))
+# define set_key_offset_v2(key,val) (void)(key->u.k2_offset_v2.k_offset = (val))
+# define get_key_type_v2(key)       (__u16)((key->u.k2_offset_v2.k_type))
+# define set_key_type_v2(key,val)   (void)(key->u.k2_offset_v2.k_type = (val))
+#elif __BYTE_ORDER == __BIG_ENDIAN
+typedef union {
+    struct offset_v2 offset_v2;
+    __u64 linear;
+} __attribute__ ((__packed__)) offset_v2_esafe_overlay;
+
+static inline __u64 get_key_offset_v2 (const reiserfs_key_t *key)
+{
+    offset_v2_esafe_overlay tmp =
+                        *(offset_v2_esafe_overlay *) (&(key->u.k2_offset_v2));
+    tmp.linear = le64_to_cpu( tmp.linear );
+    return tmp.offset_v2.k_offset;
+}
+
+static inline __u32 get_key_type_v2 (const reiserfs_key_t *key)
+{
+    offset_v2_esafe_overlay tmp =
+                        *(offset_v2_esafe_overlay *) (&(key->u.k2_offset_v2));
+    tmp.linear = le64_to_cpu( tmp.linear );
+    return tmp.offset_v2.k_type;
+}
+
+static inline void set_key_offset_v2 (reiserfs_key_t *key, __u64 offset)
+{
+    offset_v2_esafe_overlay *tmp =
+                        (offset_v2_esafe_overlay *)(&(key->u.k2_offset_v2));
+    tmp->linear = le64_to_cpu(tmp->linear);
+    tmp->offset_v2.k_offset = offset;
+    tmp->linear = cpu_to_le64(tmp->linear);
+}
+
+static inline void set_key_type_v2 (reiserfs_key_t *key, __u32 type)
+{
+    offset_v2_esafe_overlay *tmp =
+                        (offset_v2_esafe_overlay *)(&(key->u.k2_offset_v2));
+    if (type > 15)
+        reiserfs_panic ("set_key_type_v2: type is too big %d", type);
+
+    tmp->linear = le64_to_cpu(tmp->linear);
+    tmp->offset_v2.k_type = type;
+    tmp->linear = cpu_to_le64(tmp->linear);
+}
+#else
+# error "nuxi/pdp-endian archs are not supported"
+#endif
+
+static inline int is_key_format_1 (int type) {
+    return ( (type == 0 || type == 15) ? 1 : 0);
+}
+
+/* old keys (on i386) have k_offset_v2.k_type == 15 (direct and
+   extent) or == 0 (dir items and stat data) */
+
+/* */
+int reiserfs_key_format (const reiserfs_key_t * key)
+{
+    int type;
+
+    type = get_key_type_v2 (key);
+
+    if (is_key_format_1 (type))
+	return KEY_FORMAT_1;
+
+    return KEY_FORMAT_2;
+}
+
+
+unsigned long long reiserfs_key_get_off (const reiserfs_key_t * key) {
+    if (reiserfs_key_format (key) == KEY_FORMAT_1)
+	return reiserfs_key_get_off1 (key);
+
+    return get_key_offset_v2 (key);
+}
+
+
+static int uniqueness2type (__u32 uniqueness) {
+    switch (uniqueness) {
+    case UNI_SD: return TYPE_STAT_DATA;
+    case UNI_EXT: return TYPE_EXTENT;
+    case UNI_DIRECT: return TYPE_DIRECT;
+    case UNI_DE: return TYPE_DIRENTRY;
+    }
+    return TYPE_UNKNOWN;
+}
+
+
+static __u32 type2uniqueness (int type) {
+    switch (type) {
+    case TYPE_STAT_DATA: return UNI_SD;
+    case TYPE_EXTENT: return UNI_EXT;
+    case TYPE_DIRECT: return UNI_DIRECT;
+    case TYPE_DIRENTRY: return UNI_DE;
+    } 
+    return UNI_UNKN;
+}
+
+
+int reiserfs_key_get_type (const reiserfs_key_t * key)
+{
+    int type_v2 = get_key_type_v2 (key);
+
+    if (is_key_format_1 (type_v2))
+	return uniqueness2type (reiserfs_key_get_uni (key));
+
+    return type_v2;
+}
+
+char *key_type_name[TYPE_UNKNOWN + 1] = {
+	[TYPE_STAT_DATA] = "SD",
+	[TYPE_EXTENT] = "EXT",
+	[TYPE_DIRECT] = "DRCT",
+	[TYPE_DIRENTRY] = "DIR",
+	[TYPE_UNKNOWN] = "???"
+};
+
+char * reiserfs_key_name (const reiserfs_key_t * key)
+{
+    __u32 type = reiserfs_key_get_type (key);
+    return key_type_name[type <= TYPE_DIRENTRY ? type : TYPE_UNKNOWN];
+}
+
+/* this sets key format as well as type of item key belongs to */
+void reiserfs_key_set_type (int format, reiserfs_key_t * key, int type)
+{
+    if (format == KEY_FORMAT_1)
+	reiserfs_key_set_uni (key, type2uniqueness (type));
+    else
+	set_key_type_v2 (key, type);
+}
+
+
+void reiserfs_key_set_off (int format, reiserfs_key_t * key, 
+			   unsigned long long offset)
+{
+    if (format == KEY_FORMAT_1)
+	reiserfs_key_set_off1 (key, offset);
+    else
+	set_key_offset_v2 (key, offset);
+	
+}
+
+/* Set secondary fields. */
+void reiserfs_key_set_sec (int format, reiserfs_key_t * key, 
+			   unsigned long long offset, int type)
+{
+    reiserfs_key_set_type (format, key, type);
+    reiserfs_key_set_off (format, key, offset);
+}
+
+/*
+ Compare keys using REISERFS_KEY_SHORT_LEN fields.
+ Returns:  -1 if key1 < key2
+            0 if key1 = key2
+            1 if key1 > key2
+*/
+
+int reiserfs_key_comp2 (const void * k1, const void * k2)
+{
+    int n_key_length = REISERFS_KEY_SHORT_LEN;
+    __u32 * p_s_key1 = (__u32 *)k1;
+    __u32 * p_s_key2 = (__u32 *)k2;
+    __u32 u1, u2;
+
+    for( ; n_key_length--; ++p_s_key1, ++p_s_key2 ) {
+	u1 = d32_get(p_s_key1, 0) ;
+	u2 = d32_get(p_s_key2, 0) ;
+	if ( u1 < u2 )
+	    return -1;
+	if ( u1 > u2 )
+	    return 1;
+    }
+
+    return 0;
+}
+
+
+int reiserfs_key_comp3 (const void * p1, const void * p2)
+{
+    int retval;
+    const reiserfs_key_t * k1 = p1;
+    const reiserfs_key_t * k2 = p2;
+    unsigned long long off1, off2;
+
+    retval = reiserfs_key_comp2 (k1, k2);
+    if (retval)
+	return retval;
+    off1 = reiserfs_key_get_off(k1) ;
+    off2 = reiserfs_key_get_off(k2) ;
+    if (off1 < off2)
+	return -1;
+
+    if (off1 > off2)
+	return 1;
+
+    return 0;
+}
+
+
+/*
+ Compare keys using all 4 key fields.
+ Returns:  -1 if key1 < key2
+            0 if key1 = key2
+            1 if key1 > key2
+*/
+int reiserfs_key_comp (const void * p1, const void * p2)
+{
+    int retval;
+    const reiserfs_key_t * k1 = p1;
+    const reiserfs_key_t * k2 = p2;
+    __u32 u1, u2;
+
+    retval = reiserfs_key_comp3 (k1, k2);
+    if (retval)
+	return retval;
+
+    u1 = reiserfs_key_get_type (k1);
+    u2 = reiserfs_key_get_type (k2);
+
+    if (u1 < u2)
+        return -1;
+
+    if (u1 > u2)
+        return 1;
+
+    return 0;
+}
+
+
diff --git a/libreiserfs/leaf.c b/libreiserfs/leaf.c
new file mode 100644
index 0000000..bbfb30f
--- /dev/null
+++ b/libreiserfs/leaf.c
@@ -0,0 +1,373 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/bitops.h"
+
+void reiserfs_leaf_mkempty (reiserfs_bh_t * bh)
+{
+    reiserfs_nh_set_items (NODE_HEAD (bh), 0);
+    reiserfs_nh_set_free (NODE_HEAD (bh), REISERFS_NODE_SPACE (bh->b_size));
+    reiserfs_nh_set_level (NODE_HEAD (bh), LEAF_LEVEL);
+}
+
+__u32 reiserfs_leaf_ibytes (const reiserfs_ih_t * ih, int blocksize) {
+    switch (reiserfs_key_get_type (&ih->ih_key)) {
+    case TYPE_DIRECT:
+	return reiserfs_ih_get_len (ih);
+    case TYPE_EXTENT:
+	return reiserfs_ext_count(ih) * blocksize;// - reiserfs_ih_get_free (ih);
+    case TYPE_STAT_DATA:
+    case TYPE_DIRENTRY:
+	return 0;
+    }
+    
+    reiserfs_warning (stderr, "reiserfs_leaf_ibytes: called for wrong "
+		      "type of item %h", ih);
+    return 0;
+}
+
+int reiserfs_leaf_mergeable (reiserfs_ih_t * left, 
+			     reiserfs_ih_t * right, 
+			     int bsize)
+{
+    if (reiserfs_key_comp (&left->ih_key, &right->ih_key) != -1) {
+	reiserfs_panic ("vs-16070: reiserfs_leaf_mergeable: left %k, "
+			"right %k", &(left->ih_key), &(right->ih_key));
+    }
+
+    if (reiserfs_key_comp2 (&left->ih_key, &right->ih_key))
+	return 0;
+    
+    if (reiserfs_key_get_type (&left->ih_key) != 
+	reiserfs_key_get_type (&right->ih_key))
+    {
+	    return 0;
+    }
+
+    /* Directories are always mergeable. If fsck will need to handle dir items 
+       separaely too, move it lower. */
+    if (reiserfs_ih_dir (left))
+	return 1;
+
+    /* Merge only items with the same flags. */
+    if (reiserfs_ih_get_flags(left) != reiserfs_ih_get_flags(right))
+	return 0;
+    
+    if ((reiserfs_ih_direct (left) || reiserfs_ih_ext (left))) {
+	return (reiserfs_key_get_off (&left->ih_key) + 
+		reiserfs_leaf_ibytes (left, bsize) == 
+		reiserfs_key_get_off (&right->ih_key)) ? 1 : 0;
+    }
+    
+    return 0;
+}
+int reiserfs_leaf_count_items(reiserfs_bh_t *bh) {
+    reiserfs_ih_t * ih;
+    int prev_location;
+    int nr;
+
+    /* look at the table of item head */
+    prev_location = bh->b_size;
+    ih = reiserfs_ih_at(bh, 0);
+    nr = 0;
+    while (1) {
+	if (reiserfs_ih_get_loc (ih) + reiserfs_ih_get_len (ih) != prev_location)
+	    break;
+	
+	if (reiserfs_ih_get_loc (ih) < 
+	    REISERFS_IH_SIZE * (nr + 1) + REISERFS_NODEH_SIZE)
+	{
+	    break;
+	}
+	
+	if (reiserfs_ih_get_len (ih) > REISERFS_ITEM_MAX (bh->b_size))
+	    break;
+	
+	prev_location = reiserfs_ih_get_loc (ih);
+	ih ++;
+	nr ++;
+    }
+    
+    return nr;
+}
+
+int reiserfs_leaf_free_count(reiserfs_bh_t *bh) {
+    reiserfs_ih_t * ih;
+    int nr;
+    
+    nr = reiserfs_nh_get_items(NODE_HEAD(bh));
+    ih = reiserfs_ih_at(bh, nr - 1);
+    
+    return (nr ? reiserfs_ih_get_loc (ih) : bh->b_size) - 
+	    REISERFS_NODEH_SIZE - REISERFS_IH_SIZE * nr;
+}
+
+static int leaf_blkh_correct(reiserfs_bh_t * bh) {
+    unsigned int nr;
+
+    nr = reiserfs_nh_get_items(NODE_HEAD(bh));
+    if (nr > ((bh->b_size - REISERFS_NODEH_SIZE) / 
+	      (REISERFS_IH_SIZE + REISERFS_ITEM_MIN)))
+    {
+	/* item number is too big or too small */
+	return 0;
+    }
+
+    return reiserfs_leaf_free_count(bh) == 
+	    reiserfs_nh_get_free (NODE_HEAD(bh));
+}
+
+int reiserfs_leaf_estimate_items(reiserfs_bh_t * bh) {
+    int nr = reiserfs_leaf_count_items(bh);
+
+    return nr >= reiserfs_nh_get_items (NODE_HEAD(bh)) ? 
+	    reiserfs_nh_get_items (NODE_HEAD(bh)) : nr;
+}
+
+/* for every item call common action and an action corresponding to
+   item type */
+void reiserfs_leaf_traverse(reiserfs_bh_t * bh, 
+			    ih_func_t action,
+			    item_func_t * actions)
+{
+    int i;
+    reiserfs_ih_t * ih;
+    item_func_t iaction;
+
+    ih = reiserfs_ih_at (bh, 0);
+    for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) {
+	if (action)
+	    action (ih);
+
+	iaction = actions[reiserfs_key_get_type (&ih->ih_key)];
+	if (iaction)
+	    iaction (bh, ih);
+    }
+}
+
+/* Returns 0 if not leaf, NT_LEAF if looks correct, NT_IH_ARRAY if 
+   looks like corrupted leaf. */
+int reiserfs_leaf_valid(reiserfs_bh_t *bh) {
+    int counted;
+    int num;
+    
+    if (!reiserfs_leaf_head (bh))
+	return 0;
+
+    counted = reiserfs_leaf_count_items(bh);
+    
+    /* if leaf block header is ok, check item count also. */
+    if (leaf_blkh_correct(bh)) {
+	num = reiserfs_nh_get_items (NODE_HEAD(bh));
+	return counted >= num ? NT_LEAF : NT_IH_ARRAY;
+    }
+    
+    /* leaf block header is corrupted, it is ih_array if 
+       some items were detected.*/
+    return counted ? NT_IH_ARRAY : 0;
+}
+
+/* wrappers for operations on one separated leaf */
+void reiserfs_leaf_delete_item (reiserfs_filsys_t * fs,
+				reiserfs_bh_t * bh, 
+				int item_num)
+{
+    reiserfs_bufinfo_t bi;
+
+    bi.bi_bh = bh;
+    bi.bi_parent = 0;
+    bi.bi_position = 0;
+    reiserfs_lb_delete_item (fs, &bi, item_num, 1);
+}
+
+void reiserfs_leaf_delete_entry (reiserfs_filsys_t * fs, 
+				 reiserfs_bh_t * bh,
+				 int item_num, 
+				 int entry_num, 
+				 int del_count)
+{
+    reiserfs_bufinfo_t bi;
+
+    bi.bi_bh = bh;
+    bi.bi_parent = 0;
+    bi.bi_position = 0;
+    reiserfs_lb_delete_unit (fs, &bi, item_num, entry_num, del_count);
+}
+
+/* ih_key, ih_location and ih_item_len seem correct, check other fields */
+static int reiserfs_leaf_ih_correct (reiserfs_ih_t * ih) {
+    int ih_format;
+    int format;
+
+    /* key format from item_head */
+    ih_format = reiserfs_ih_get_format (ih);
+    if (ih_format != KEY_FORMAT_1 && ih_format != KEY_FORMAT_2)
+	return 0;
+
+    /* key format calculated on key */
+    format = reiserfs_key_format (&ih->ih_key);
+    if (reiserfs_ih_stat (ih)) {
+	/* for stat data we can not find key format from a key itself, so look at
+           the item length */
+	if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE)
+	    format = KEY_FORMAT_2;
+	else if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1)
+	    format = KEY_FORMAT_1;
+	else
+	    return 0;
+    }
+    if (format != ih_format)
+	return 0;
+
+    /* we do not check ih_format.fsck_need as fsck might change it. So,
+       debugreiserfs -p will have to dump it */
+    return 1;
+}
+
+/* used by debugreisrefs -p only yet */
+int reiserfs_leaf_correct_at (reiserfs_filsys_t * fs, 
+				reiserfs_ih_t * ih, char * item,
+				unfm_func_t func, int bad_dir)
+{
+/*
+    if (!does_key_look_correct (fs, &ih->ih_key))
+	return 1;
+
+    if (!reiserfs_leaf_ih_correct (ih))
+	return 1;
+*/
+    if (!reiserfs_leaf_ih_correct (ih))
+	return 1;
+
+    
+    if (reiserfs_ih_stat (ih) || reiserfs_ih_direct (ih))
+	return 0;
+
+    if (reiserfs_ih_dir (ih)) {
+	return reiserfs_direntry_check (fs, ih, item, bad_dir);
+    }
+    
+    if (reiserfs_ih_ext (ih)) {
+	return reiserfs_ext_check (fs, ih, item, func);
+    }
+
+    return 1;
+}
+
+
+static int is_symlink = 0;
+int reiserfs_leaf_print(FILE * fp, 
+			reiserfs_filsys_t * fs, 
+			reiserfs_bh_t * bh,
+			int print_mode, 
+			int first, 
+			int last)
+{
+    reiserfs_ih_t * ih;
+    int i;
+    int from, to;
+    int real_nr, nr;
+
+    if (!reiserfs_node_formatted (bh, LEAF_LEVEL))
+	return 1;
+    
+    ih = reiserfs_ih_at (bh,0);
+    real_nr = reiserfs_leaf_count_items(bh);
+    nr = reiserfs_nh_get_items(NODE_HEAD(bh));
+
+    reiserfs_warning (fp, "\n==========================================="
+		      "========================\n");
+    
+    reiserfs_warning (fp, "LEAF NODE (%ld) contains %b (real items %d)\n",
+		      bh->b_blocknr, bh, real_nr);
+
+    if (!(misc_test_bit(LP_LEAF_DETAILS, &print_mode))) {
+	reiserfs_warning (fp, "FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n",
+			   &(ih->ih_key), &((ih + real_nr - 1)->ih_key));
+	return 0;
+    }
+
+    if (first < 0 || first > real_nr - 1) 
+	from = 0;
+    else 
+	from = first;
+
+    if (last < 0 || last > real_nr)
+	to = real_nr;
+    else
+	to = last;
+
+
+    reiserfs_warning (fp, "---------------------------------------------"
+		      "----------------------------------\n"
+		      "|###|type|ilen|f/sp| loc|fmt|fsck|               "
+		      "    key                      |\n"
+		       "|   |    |    |e/cn|    |   |need|              "
+		       "                              |\n");
+    
+    for (i = from; i < to; i++) {
+	reiserfs_warning (fp, "-----------------------------------------"
+			  "--------------------------------------\n"
+			  "|%3d|%30H|%s\n", i, ih + i, i >= nr ? 
+			  " DELETED" : "");
+
+	if (reiserfs_ih_stat(ih+i)) {
+	    is_symlink = reiserfs_print_stat_data (fp, bh, ih + i, 0/*all times*/);
+	    continue;
+	}
+
+	if (reiserfs_ih_dir(ih+i)) {
+	    reiserfs_direntry_print (fp, fs, bh, ih+i);
+	    continue;
+	}
+
+	if (reiserfs_ih_ext(ih+i)) {
+	    reiserfs_ext_print (fp, bh, i);
+	    continue;
+	}
+
+	if (reiserfs_ih_direct(ih+i)) {
+	    int j = 0;
+	    if (is_symlink || misc_test_bit(LP_DIRECT_ITEMS, &print_mode)) {
+		reiserfs_warning (fp, "\"");
+		while (j < reiserfs_ih_get_len (&ih[i])) {
+		    if (reiserfs_item_by_ih(bh,ih+i)[j] == 10)
+			reiserfs_warning (fp, "\\n");
+		    else
+			reiserfs_warning (fp, "%c", reiserfs_item_by_ih(bh,ih+i)[j]);
+		    j ++;
+		}
+		reiserfs_warning (fp, "\"\n");
+	    }
+	    continue;
+	}
+    }
+    reiserfs_warning (fp, "============================================="
+		      "======================\n");
+    
+    return 0;
+}
+
+__u16 reiserfs_ih_get_format(const reiserfs_ih_t *ih) {
+	return misc_get_bitfield_XX (16, &ih->ih_format, 0, 12);
+}
+
+void reiserfs_ih_set_format(reiserfs_ih_t *ih, __u16 val) {
+	misc_set_bitfield_XX (16, &ih->ih_format, val, 0, 12);
+}
+
+__u16 reiserfs_ih_get_flags(const reiserfs_ih_t *ih) {
+	return misc_get_bitfield_XX (16, &ih->ih_format, 12, 4);
+}
+
+void reiserfs_ih_set_flags(reiserfs_ih_t *ih, __u16 val) {
+	misc_set_bitfield_XX (16, &ih->ih_format, val, 12, 4);
+}
+
diff --git a/libreiserfs/leaf_balance.c b/libreiserfs/leaf_balance.c
new file mode 100644
index 0000000..9bc802e
--- /dev/null
+++ b/libreiserfs/leaf_balance.c
@@ -0,0 +1,2422 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+/* Now we have all buffers that must be used in balancing of the tree 	*/
+/* Further calculations can not cause schedule(), and thus the buffer 	*/
+/* tree will be stable until the balancing will be finished 		*/
+/* balance the tree according to the analysis made before,		*/
+/* and using buffers obtained after all above.				*/
+
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+/* modes of reiserfs_lb_move */
+#define LEAF_FROM_S_TO_L 0
+#define LEAF_FROM_S_TO_R 1
+#define LEAF_FROM_R_TO_L 2
+#define LEAF_FROM_L_TO_R 3
+#define LEAF_FROM_S_TO_SNEW 4
+
+
+/* summary:
+ if deleting something ( tb->insert_size[0] < 0 )
+   return(reiserfs_lb_balance_delete()); (flag d handled here)
+ else
+   if lnum is larger than 0 we put items into the left node
+   if rnum is larger than 0 we put items into the right node
+   if snum1 is larger than 0 we put items into the new node s1
+   if snum2 is larger than 0 we put items into the new node s2 
+Note that all *num* count new items being created.
+
+It would be easier to read reiserfs_lb_balance() if each of these summary
+lines was a separate procedure rather than being inlined.  I think
+that there are many passages here and in reiserfs_lb_balance_delete() in
+which two calls to one procedure can replace two passages, and it
+might save cache space and improve software maintenance costs to do so.  
+
+Vladimir made the perceptive comment that we should offload most of
+the decision making in this function into reiserfs_fix_nodes/check_balance, 
+and then create some sort of structure in tb that says what actions should
+be performed by reiserfs_tb_balance.
+
+-Hans */
+
+static void print_tb (int mode, int item_pos, int pos_in_item, 
+		      reiserfs_tb_t * tb, char * mes);
+
+/* insert item into the leaf node in position before */
+static void reiserfs_lb_insert (reiserfs_filsys_t * s,
+				reiserfs_bufinfo_t * bi,
+				int before,
+				reiserfs_ih_t * inserted_item_ih,
+				const char * inserted_item_body,
+				int zeros_number)
+{
+    reiserfs_bh_t * bh = bi->bi_bh;
+    int nr;
+    reiserfs_node_head_t * blkh;
+    reiserfs_ih_t * ih;
+    int i;
+    int last_loc, unmoved_loc;
+    char * to;
+
+    blkh = NODE_HEAD (bh);
+    nr = reiserfs_nh_get_items (blkh);
+
+    /* get item new item must be inserted before */
+    ih = reiserfs_ih_at (bh, before);
+
+    /* prepare space for the body of new item */
+    last_loc = nr ? reiserfs_ih_get_loc (&ih[nr - before - 1]) : bh->b_size;
+    unmoved_loc = before ? reiserfs_ih_get_loc (ih-1) : bh->b_size;
+
+    memmove (bh->b_data + last_loc - reiserfs_ih_get_len (inserted_item_ih), 
+	     bh->b_data + last_loc, unmoved_loc - last_loc);
+
+    to = bh->b_data + unmoved_loc - reiserfs_ih_get_len (inserted_item_ih);
+    memset (to, 0, zeros_number);
+    to += zeros_number;
+
+    /* copy body to prepared space */
+    if (inserted_item_body)
+	/* if (mem_mode == REISERFS_USER_MEM)
+	    copy_from_user (to, inserted_item_body, 
+			    inserted_item_ih->ih_item_len - zeros_number);
+	else { */
+	memmove (to, inserted_item_body, 
+		 reiserfs_ih_get_len (inserted_item_ih) - zeros_number);
+    //}
+    else
+	memset(to, '\0', reiserfs_ih_get_len (inserted_item_ih) - zeros_number);
+  
+    /* insert item header */
+    memmove (ih + 1, ih, REISERFS_IH_SIZE * (nr - before));
+    memmove (ih, inserted_item_ih, REISERFS_IH_SIZE);
+  
+    /* change locations */
+    for (i = before; i < nr + 1; i ++) {
+	unmoved_loc -= reiserfs_ih_get_len (&ih[i-before]);
+	reiserfs_ih_set_loc (&ih[i-before], unmoved_loc);
+    }
+  
+    /* sizes, free space, item number */
+    reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + 1);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) -
+			 (REISERFS_IH_SIZE + reiserfs_ih_get_len (inserted_item_ih)));
+
+    reiserfs_buffer_mkdirty(bh) ;
+
+    if (bi->bi_parent) { 
+	reiserfs_dc_t * dc;
+
+	dc = reiserfs_int_at (bi->bi_parent, bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + REISERFS_IH_SIZE + 
+			   reiserfs_ih_get_len (inserted_item_ih));
+	reiserfs_buffer_mkdirty(bi->bi_parent) ;
+    }
+
+    if (reiserfs_leaf_valid(bh) != NT_LEAF)
+	reiserfs_panic ("reiserfs_lb_insert: bad leaf %lu: %b", 
+			bh->b_blocknr, bh);
+}
+
+
+/* paste paste_size bytes to affected_item_num-th item. 
+   When item is a directory, this only prepare space for new entries */
+static void reiserfs_lb_insert_unit (reiserfs_filsys_t * fs,
+				     reiserfs_bufinfo_t * bi,
+				     int affected_item_num,
+				     int pos_in_item,
+				     int paste_size,
+				     const char * body,
+				     int zeros_number)
+{
+    reiserfs_bh_t * bh = bi->bi_bh;
+    int nr;
+    reiserfs_node_head_t * blkh;
+    reiserfs_ih_t * ih;
+    int i;
+    int last_loc, unmoved_loc;
+
+
+    blkh = NODE_HEAD (bh);
+    nr = reiserfs_nh_get_items (blkh);
+
+    /* item to be appended */
+    ih = reiserfs_ih_at(bh, affected_item_num);
+
+    last_loc = reiserfs_ih_get_loc (&ih[nr - affected_item_num - 1]);
+    unmoved_loc = affected_item_num ? reiserfs_ih_get_loc (ih-1) : bh->b_size;  
+
+    /* prepare space */
+    memmove (bh->b_data + last_loc - paste_size, bh->b_data + last_loc,
+	     unmoved_loc - last_loc);
+
+
+    /* change locations */
+    for (i = affected_item_num; i < nr; i ++)
+	reiserfs_ih_set_loc (&ih[i-affected_item_num], 
+			 reiserfs_ih_get_loc (&ih[i-affected_item_num]) - 
+			 paste_size);
+
+    if ( body ) {
+	if (!reiserfs_ih_dir(ih)) {
+	    /*if (mem_mode == REISERFS_USER_MEM) {
+	        memset (bh->b_data + unmoved_loc - paste_size, 0, zeros_number);
+		copy_from_user (bh->b_data + unmoved_loc - paste_size + 
+				zeros_number, body, paste_size - zeros_number);
+	    } else */
+	    {
+		if (!pos_in_item) {
+		    /* shift data to right */
+		    memmove (bh->b_data + reiserfs_ih_get_loc (ih) + paste_size,
+			     bh->b_data + reiserfs_ih_get_loc (ih), 
+			     reiserfs_ih_get_len (ih));
+		    /* paste data in the head of item */
+		    memset (bh->b_data + reiserfs_ih_get_loc (ih), 0, zeros_number);
+		    memcpy (bh->b_data + reiserfs_ih_get_loc (ih) + zeros_number, 
+			    body, paste_size - zeros_number);
+		} else {
+		    memset (bh->b_data + unmoved_loc - paste_size, 
+			    0, zeros_number);
+		    memcpy (bh->b_data + unmoved_loc - paste_size + zeros_number,
+			    body, paste_size - zeros_number);
+		}
+	    }
+	}
+    }
+    else
+	memset(bh->b_data + unmoved_loc - paste_size,'\0',paste_size);
+
+    reiserfs_ih_set_len (ih, reiserfs_ih_get_len (ih) + paste_size);
+
+    /* change free space */
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - paste_size);
+
+    reiserfs_buffer_mkdirty(bh) ;
+
+    if (bi->bi_parent) { 
+	reiserfs_dc_t * dc;
+
+	dc = reiserfs_int_at (bi->bi_parent, bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + paste_size);
+	reiserfs_buffer_mkdirty(bi->bi_parent);
+    }
+    if (reiserfs_leaf_valid(bh) != NT_LEAF)
+	reiserfs_panic ("reiserfs_lb_insert_unit: bad leaf %lu: %b", 
+			bh->b_blocknr, bh);
+}
+
+/* paste new_entry_count entries (new_dehs, records) into position before 
+   to item_num-th item */
+static void reiserfs_lb_insert_entry (reiserfs_bh_t * bh,
+				      int item_num, int before, 
+				      int new_entry_count,
+				      reiserfs_deh_t * new_dehs,
+				      const char * records, 
+				      int paste_size)
+{
+    reiserfs_ih_t * ih;
+    char * item;
+    reiserfs_deh_t * deh;
+    char * insert_point;
+    int i, old_entry_num;
+
+    if (new_entry_count == 0)
+        return;
+
+    ih = reiserfs_ih_at(bh, item_num);
+
+    /* first byte of dest item */
+    item = reiserfs_item_by_ih (bh, ih);
+
+    /* entry head array */
+    deh = reiserfs_deh (bh, ih);
+
+    /* new records will be pasted at this point */
+    insert_point = item + (before ? reiserfs_deh_get_loc (&deh[before - 1]) : 
+			   (reiserfs_ih_get_len (ih) - paste_size));
+
+    /* adjust locations of records that will be AFTER new records */
+    for (i = reiserfs_ih_get_entries (ih) - 1; i >= before; i --)
+	reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) + 
+			  REISERFS_DEH_SIZE * new_entry_count);
+
+    /* adjust locations of records that will be BEFORE new records */
+    for (i = 0; i < before; i ++)
+	reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) + paste_size);
+
+    old_entry_num = reiserfs_ih_get_entries (ih);
+    //I_ENTRY_COUNT(ih) += new_entry_count;
+    reiserfs_ih_set_entries (ih, old_entry_num + new_entry_count);
+
+    /* prepare space for pasted records */
+    memmove (insert_point + paste_size, insert_point, 
+	     item + (reiserfs_ih_get_len (ih) - paste_size) - insert_point);
+
+    /* copy new records */
+    memcpy (insert_point + REISERFS_DEH_SIZE * new_entry_count, records,
+	    paste_size - REISERFS_DEH_SIZE * new_entry_count);
+  
+    /* prepare space for new entry heads */
+    deh += before;
+    memmove ((char *)(deh + new_entry_count), deh, insert_point - (char *)deh);
+
+    /* copy new entry heads */
+    memcpy (deh, new_dehs, REISERFS_DEH_SIZE * new_entry_count);
+
+    /* set locations of new records */
+    for (i = 0; i < new_entry_count; i ++)
+	reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) + 
+			  (- reiserfs_deh_get_loc (&new_dehs[new_entry_count - 1]) +
+			   insert_point + REISERFS_DEH_SIZE * new_entry_count - item));
+
+
+    /* change item key if neccessary (when we paste before 0-th entry */
+    if (!before)
+	reiserfs_key_set_off1 (&ih->ih_key, reiserfs_deh_get_off (new_dehs));
+}
+
+
+
+/* copy copy_count entries from source directory item to dest buffer 
+   (creating new item if needed) */
+static void reiserfs_lb_copy_entry (reiserfs_filsys_t * fs,
+				    reiserfs_bufinfo_t * dest_bi, 
+				    reiserfs_bh_t * source, 
+				    int last_first, int item_num, 
+				    int from, int copy_count)
+{
+    reiserfs_bh_t * dest = dest_bi->bi_bh;
+    int ditem_num;			/* either the number of target item,
+					   or if we must create a new item,
+					   the number of the item we will
+					   create it next to */
+    reiserfs_ih_t * ih;
+    reiserfs_deh_t * deh;
+    
+    /* length of all records in item to be copied */
+    int copy_records_len;	
+    char * records;
+
+    ih = reiserfs_ih_at (source, item_num);
+
+    /* length of all record to be copied and first byte of the last of them */
+    deh = reiserfs_deh (source, ih);
+    if (copy_count) {
+	copy_records_len = (from ? 
+			    reiserfs_deh_get_loc (&deh[from - 1]) : 
+			    reiserfs_ih_get_len (ih)) - 
+		reiserfs_deh_get_loc (&deh[from + copy_count - 1]);
+	
+	records = source->b_data + reiserfs_ih_get_loc (ih) + 
+		reiserfs_deh_get_loc (&deh[from + copy_count - 1]);
+    } else {
+	copy_records_len = 0;
+	records = 0;
+    }
+
+    /* when copy last to first, dest buffer can contain 0 items */
+    ditem_num = (last_first == LAST_TO_FIRST) ? 
+	    (( reiserfs_node_items(dest) ) ? 0 : -1) : (reiserfs_node_items(dest) - 1);
+
+    /* if there are no items in dest or the first/last item in dest 
+       is not item of the same directory */
+    if ( (ditem_num == - 1) ||
+	 (last_first == FIRST_TO_LAST && 
+	  reiserfs_leaf_mergeable (reiserfs_ih_at (dest, ditem_num), 
+				   ih, dest->b_size) == 0) ||
+	 (last_first == LAST_TO_FIRST && 
+	  reiserfs_leaf_mergeable (ih, reiserfs_ih_at (dest, ditem_num), 
+				   dest->b_size) == 0)) 
+    {
+	/* create new item in dest */
+	reiserfs_ih_t new_ih;
+
+	/* form item header */
+	memcpy (&new_ih.ih_key, &ih->ih_key, REISERFS_KEY_SIZE);
+
+	/* calculate item len */
+	reiserfs_ih_set_len (&new_ih, REISERFS_DEH_SIZE * copy_count + copy_records_len);
+	reiserfs_ih_set_entries (&new_ih, 0);
+    
+	if (last_first == LAST_TO_FIRST) {
+	    /* form key by the following way */
+	    if (from < reiserfs_ih_get_entries (ih)) {
+		reiserfs_key_set_off1 (&new_ih.ih_key, reiserfs_deh_get_off (&deh[from]));
+	    } else {
+		/* no entries will be copied to this item in this function */
+		reiserfs_key_set_off1 (&new_ih.ih_key, MAX_KEY1_OFFSET);
+	    }
+	    reiserfs_key_set_uni (&new_ih.ih_key, UNI_DE);
+	}
+	reiserfs_ih_set_format (&new_ih, reiserfs_ih_get_format (ih));
+	reiserfs_ih_set_flags (&new_ih, reiserfs_ih_get_flags (ih));
+    
+	/* insert item into dest buffer */
+	reiserfs_lb_insert (fs, dest_bi, (last_first == LAST_TO_FIRST)
+			    ? 0 : reiserfs_node_items(dest), &new_ih, NULL, 0);
+    } else {
+	/* prepare space for entries */
+	reiserfs_lb_insert_unit (fs, dest_bi, (last_first == FIRST_TO_LAST) ?
+				 (reiserfs_node_items(dest) - 1) : 0, 0xffff,
+				 REISERFS_DEH_SIZE * copy_count + copy_records_len, 
+				 records, 0);
+    }
+  
+    ditem_num = (last_first == FIRST_TO_LAST) ? 
+	    (reiserfs_node_items(dest)-1) : 0;
+  
+    reiserfs_lb_insert_entry (dest_bi->bi_bh, ditem_num, 
+			      (last_first == FIRST_TO_LAST) ?
+			      reiserfs_ih_get_entries (reiserfs_ih_at (dest, ditem_num))
+			      : 0, copy_count, deh + from, records, 
+			      REISERFS_DEH_SIZE * copy_count + copy_records_len);
+}
+
+
+/* Copy the first (if last_first == FIRST_TO_LAST) or last 
+   (last_first == LAST_TO_FIRST) item or part of it or nothing 
+   (see the return 0 below) from SOURCE to the end (if last_first) 
+   or beginning (!last_first) of the DEST */
+/* returns 1 if anything was copied, else 0 */
+static int reiserfs_lb_copy_boundary (reiserfs_filsys_t * fs,
+				      reiserfs_bufinfo_t * dest_bi, 
+				      reiserfs_bh_t * src, 
+				      int last_first,
+				      int bytes_or_entries)
+{
+    reiserfs_bh_t * dest = dest_bi->bi_bh;
+    
+    /* number of items in the source and destination buffers */
+    int dest_nr_item, src_nr_item; 
+    reiserfs_ih_t * ih;
+    reiserfs_ih_t * dih;
+  
+    dest_nr_item = reiserfs_node_items(dest);
+  
+    if ( last_first == FIRST_TO_LAST ) {
+	/* if ( DEST is empty or first item of SOURCE and last item of DEST 
+	   are the items of different objects or of different types ) then 
+	   there is no need to treat this item differently from the other 
+	   items that we copy, so we return */
+	ih = reiserfs_ih_at (src, 0);
+	dih = reiserfs_ih_at (dest, dest_nr_item - 1);
+	if (!dest_nr_item || 
+	    reiserfs_leaf_mergeable (dih, ih, src->b_size) == 0)
+	{
+	    /* there is nothing to merge */
+	    return 0;
+	}
+      
+	if ( reiserfs_ih_dir(ih) ) {
+	    if ( bytes_or_entries == -1 )
+		/* copy all entries to dest */
+		bytes_or_entries = reiserfs_ih_get_entries(ih);
+	    
+	    reiserfs_lb_copy_entry (fs, dest_bi, src, FIRST_TO_LAST, 
+				    0, 0, bytes_or_entries);
+	    return 1;
+	}
+      
+	/* copy part of the body of the first item of SOURCE to the end of 
+	   the body of the last item of the DEST part defined by 
+	   'bytes_or_entries'; if bytes_or_entries == -1 copy whole body; 
+	   don't create new item header */
+	if ( bytes_or_entries == -1 )
+	    bytes_or_entries = reiserfs_ih_get_len (ih);
+
+	/* merge first item (or its part) of src buffer with the last
+	   item of dest buffer. Both are of the same file */
+	reiserfs_lb_insert_unit (fs, dest_bi, dest_nr_item - 1, 
+				 reiserfs_ih_get_len (dih),
+				 bytes_or_entries, 
+				 reiserfs_item_by_ih(src,ih), 0);
+      
+	if (reiserfs_ih_ext(dih)) {
+	    if (bytes_or_entries == reiserfs_ih_get_len (ih))
+		//dih->u.ih_free_space = ih->u.ih_free_space;
+		reiserfs_ih_set_free (dih, reiserfs_ih_get_free (ih));
+	}
+    
+	return 1;
+    }
+  
+
+    /* copy boundary item to right (last_first == LAST_TO_FIRST) */
+
+    /* ( DEST is empty or last item of SOURCE and first item of DEST
+       are the items of different object or of different types )
+    */
+    src_nr_item = reiserfs_node_items (src);
+    ih = reiserfs_ih_at (src, src_nr_item - 1);
+    dih = reiserfs_ih_at (dest, 0);
+
+    if (!dest_nr_item || reiserfs_leaf_mergeable (ih, dih, src->b_size) == 0)
+	return 0;
+  
+    if ( reiserfs_ih_dir(ih)) {
+	if ( bytes_or_entries == -1 )
+	    /* bytes_or_entries = entries number in last item body of SOURCE */
+	    bytes_or_entries = reiserfs_ih_get_entries(ih);
+    
+	reiserfs_lb_copy_entry (fs, dest_bi, src, LAST_TO_FIRST, 
+				src_nr_item - 1, reiserfs_ih_get_entries(ih) - 
+				bytes_or_entries, bytes_or_entries);
+	return 1;
+    }
+
+    /* copy part of the body of the last item of SOURCE to the begin of the 
+       body of the first item of the DEST; part defined by 'bytes_or_entries';
+       if byte_or_entriess == -1 copy whole body; change first item key of the 
+       DEST; don't create new item header */
+  
+    if ( bytes_or_entries == -1 ) {
+	/* bytes_or_entries = length of last item body of SOURCE */
+	bytes_or_entries = reiserfs_ih_get_len (ih);
+
+	/* change first item key of the DEST */
+	//dih->ih_key.k_offset = ih->ih_key.k_offset;
+	reiserfs_key_set_off (reiserfs_key_format (&dih->ih_key), 
+				 &dih->ih_key, 
+				 reiserfs_key_get_off (&ih->ih_key));
+
+	/* item becomes non-mergeable */
+	/* or mergeable if left item was */
+	//dih->ih_key.k_uniqueness = ih->ih_key.k_uniqueness;
+	reiserfs_key_set_type (reiserfs_key_format (&dih->ih_key), 
+			       &dih->ih_key, 
+			       reiserfs_key_get_type (&ih->ih_key));
+    } else {
+	/* merge to right only part of item */
+	/* change first item key of the DEST */
+	if ( reiserfs_ih_direct(dih) ) {
+	    //dih->ih_key.k_offset -= bytes_or_entries;
+	    reiserfs_key_set_off (reiserfs_key_format (&dih->ih_key), 
+				     &dih->ih_key, 
+				     reiserfs_key_get_off (&dih->ih_key) -
+				     bytes_or_entries);
+	} else {
+	    //dih->ih_key.k_offset -= ((bytes_or_entries/REISERFS_EXT_SIZE)*dest->b_size);
+	    reiserfs_key_set_off (reiserfs_key_format (&dih->ih_key), 
+				     &dih->ih_key, 
+				     reiserfs_key_get_off (&dih->ih_key) - 
+				     ((bytes_or_entries/REISERFS_EXT_SIZE) * 
+				      dest->b_size));
+	}
+    }
+  
+    reiserfs_lb_insert_unit (fs, dest_bi, 0, 0, bytes_or_entries, 
+			     reiserfs_item_by_ih(src,ih) + reiserfs_ih_get_len (ih) 
+			     - bytes_or_entries, 0);
+    return 1;
+}
+
+/* This function splits the (liquid) item into two items (useful when
+   shifting part of an item into another node.) */
+static void reiserfs_lb_split (reiserfs_filsys_t * fs,
+			       reiserfs_bufinfo_t * dest_bi, 
+			       reiserfs_bh_t * src, 
+			       int last_first,
+			       int item_num, 
+			       int cpy_bytes)
+{
+    reiserfs_bh_t * dest = dest_bi->bi_bh;
+    reiserfs_ih_t * ih;
+  
+    if ( last_first == FIRST_TO_LAST ) {
+	/* if ( if item in position item_num in buffer 
+	   SOURCE is directory item ) */
+	if (reiserfs_ih_dir(ih = reiserfs_ih_at(src,item_num)))
+	    reiserfs_lb_copy_entry (fs, dest_bi, src, FIRST_TO_LAST, 
+				    item_num, 0, cpy_bytes);
+	else {
+	    reiserfs_ih_t n_ih;
+      
+	    /* copy part of the body of the item number 'item_num' of SOURCE 
+	       to the end of the DEST part defined by 'cpy_bytes'; create new 
+	       item header; change old item_header (????);
+	       n_ih = new item_header;
+	    */
+	    memcpy (&n_ih, ih, REISERFS_IH_SIZE);
+	    reiserfs_ih_set_len (&n_ih, cpy_bytes);
+	    if (reiserfs_ih_ext(ih)) {
+		//n_ih.u.ih_free_space = 0;
+		reiserfs_ih_set_free (&n_ih, 0);;
+	    }
+
+	    //n_ih.ih_version = ih->ih_version;
+	    reiserfs_ih_set_format (&n_ih, reiserfs_ih_get_format (ih));
+	    reiserfs_ih_set_flags (&n_ih, reiserfs_ih_get_flags (ih));
+	    reiserfs_lb_insert (fs, dest_bi, reiserfs_node_items(dest), &n_ih, 
+				reiserfs_item_at (src, item_num), 0);
+	}
+    } else {
+	/*  if ( if item in position item_num in buffer 
+	    SOURCE is directory item ) */
+	if (reiserfs_ih_dir(ih = reiserfs_ih_at (src, item_num)))
+	    reiserfs_lb_copy_entry (fs, dest_bi, src, LAST_TO_FIRST, 
+				    item_num, reiserfs_ih_get_entries(ih) - 
+				    cpy_bytes, cpy_bytes);
+	else {
+	    reiserfs_ih_t n_ih;
+      
+	    /* copy part of the body of the item number 'item_num' of 
+	       SOURCE to the begin of the DEST part defined by 'cpy_bytes'; 
+	       create new item header;
+	       
+	       n_ih = new item_header;
+	    */
+	    memcpy (&n_ih, ih, REISERFS_KEY_SHSIZE);
+      
+	    if (reiserfs_ih_direct(ih)) {
+		/*n_ih.ih_key.k_offset = ih->ih_key.k_offset + 
+			ih->ih_item_len - cpy_bytes; */
+		reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					 &n_ih.ih_key, 
+					 reiserfs_key_get_off (&ih->ih_key)
+					 + reiserfs_ih_get_len (ih) - cpy_bytes);
+		
+		//n_ih.ih_key.k_uniqueness = TYPE_DIRECT;
+		reiserfs_key_set_type (reiserfs_key_format (&ih->ih_key), 
+				       &n_ih.ih_key, TYPE_DIRECT);
+		//n_ih.u.ih_free_space = USHRT_MAX;
+		reiserfs_ih_set_free (&n_ih, USHRT_MAX);
+	    } else {
+		/* extent item */
+		/*n_ih.ih_key.k_offset = ih->ih_key.k_offset + 
+		    (ih->ih_item_len - cpy_bytes) / REISERFS_EXT_SIZE * dest->b_size;*/
+		reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					 &n_ih.ih_key,
+					 reiserfs_key_get_off (&ih->ih_key) 
+					 + (reiserfs_ih_get_len (ih) - cpy_bytes) / 
+					 REISERFS_EXT_SIZE * dest->b_size);
+		
+		//n_ih.ih_key.k_uniqueness = TYPE_EXTENT;
+		reiserfs_key_set_type (reiserfs_key_format (&ih->ih_key), 
+				       &n_ih.ih_key, TYPE_EXTENT);
+		//n_ih.u.ih_free_space = ih->u.ih_free_space;
+		reiserfs_ih_set_free (&n_ih, reiserfs_ih_get_free (ih));
+	    }
+      
+	    /* set item length */
+	    reiserfs_ih_set_len (&n_ih, cpy_bytes);
+	    //n_ih.ih_version = ih->ih_version;
+	    reiserfs_ih_set_format (&n_ih, reiserfs_ih_get_format (ih));
+	    reiserfs_ih_set_flags (&n_ih, reiserfs_ih_get_flags (ih));
+	    reiserfs_lb_insert (fs, dest_bi, 0, &n_ih, 
+				reiserfs_item_at(src,item_num) + 
+				reiserfs_ih_get_len (ih) - cpy_bytes, 0);
+	}
+    }
+}
+
+/* copy cpy_mun items from buffer src to buffer dest
+ * last_first == FIRST_TO_LAST means, that we copy cpy_num  
+   items beginning from first-th item in src to tail of dest
+ * last_first == LAST_TO_FIRST means, that we copy cpy_num  items 
+   beginning from first-th item in src to head of dest
+ */
+static void reiserfs_lb_copy_item (reiserfs_filsys_t * fs, 
+				   reiserfs_bufinfo_t * dest_bi, 
+				   reiserfs_bh_t * src, 
+				   int last_first, 
+				   int first, 
+				   int cpy_num)
+{
+    reiserfs_bh_t * dest;
+    int nr;
+    int dest_before;
+    int last_loc, last_inserted_loc, location;
+    int i, j;
+    reiserfs_node_head_t * blkh;
+    reiserfs_ih_t * ih;
+
+    dest = dest_bi->bi_bh;
+
+    if (cpy_num == 0)
+	return;
+
+    blkh = NODE_HEAD(dest);
+    nr = reiserfs_nh_get_items (blkh);
+  
+    /* we will insert items before 0-th or nr-th item in dest buffer. 
+       It depends of last_first parameter */
+    dest_before = (last_first == LAST_TO_FIRST) ? 0 : nr;
+
+    /* location of head of first new item */
+    ih = reiserfs_ih_at (dest, dest_before);
+
+    /* prepare space for headers */
+    memmove (ih + cpy_num, ih, (nr-dest_before) * REISERFS_IH_SIZE);
+
+    /* copy item headers */
+    memcpy (ih, reiserfs_ih_at (src, first), cpy_num * REISERFS_IH_SIZE);
+
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - REISERFS_IH_SIZE * cpy_num);
+
+    /* location of unmovable item */
+    j = location = (dest_before == 0) ? dest->b_size : reiserfs_ih_get_loc (ih-1);
+    for (i = dest_before; i < nr + cpy_num; i ++) {
+	location -= reiserfs_ih_get_len (&ih[i-dest_before]);
+	reiserfs_ih_set_loc (&ih[i-dest_before], location);
+    }
+
+    /* prepare space for items */
+    last_loc = reiserfs_ih_get_loc (&ih[nr+cpy_num-1-dest_before]);
+    last_inserted_loc = reiserfs_ih_get_loc (&ih[cpy_num-1]);
+
+    /* check free space */
+    memmove (dest->b_data + last_loc,
+	     dest->b_data + last_loc + j - last_inserted_loc,
+	     last_inserted_loc - last_loc);
+
+    /* copy items */
+    memcpy (dest->b_data + last_inserted_loc, 
+	    reiserfs_item_at(src,(first + cpy_num - 1)),
+	    j - last_inserted_loc);
+
+    /* sizes, item number */
+    reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh) + cpy_num);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) - 
+			 (j - last_inserted_loc));
+    reiserfs_buffer_mkdirty (dest);
+
+    if (dest_bi->bi_parent) {
+	reiserfs_dc_t * dc;
+	dc = reiserfs_int_at (dest_bi->bi_parent, dest_bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) + j - 
+			   last_inserted_loc + REISERFS_IH_SIZE * cpy_num);
+	reiserfs_buffer_mkdirty(dest_bi->bi_parent);
+    }
+}
+
+/* If cpy_bytes equals minus one than copy cpy_num whole items from SOURCE 
+   to DEST. If cpy_bytes not equal to minus one than copy cpy_num-1 whole 
+   items from SOURCE to DEST. From last item copy cpy_num bytes for regular 
+   item and cpy_num directory entries for directory item. */
+int reiserfs_lb_copy (reiserfs_filsys_t * fs,
+		      reiserfs_bufinfo_t * dest_bi, 
+		      reiserfs_bh_t * src,
+		      int last_first, 
+		      int cpy_num,
+		      int cpy_bytes)
+{
+    reiserfs_bh_t * dest;
+    int pos, i, src_nr_item, bytes;
+
+    dest = dest_bi->bi_bh;
+    if ( cpy_num == 0 )
+	return 0;
+ 
+    if ( last_first == FIRST_TO_LAST ) {
+	/* copy items to left */
+	pos = 0;
+	if ( cpy_num == 1 )
+	    bytes = cpy_bytes;
+	else
+	    bytes = -1;
+   
+	/* copy the first item or it part or nothing to the end of 
+	   the DEST (i = reiserfs_lb_copy_boundary(DEST,SOURCE,0,bytes)) */
+	i = reiserfs_lb_copy_boundary (fs, dest_bi, src, 
+				       FIRST_TO_LAST, bytes);
+	cpy_num -= i;
+	if ( cpy_num == 0 )
+	    return i;
+	pos += i;
+	if ( cpy_bytes == -1 )
+	    /* copy first cpy_num items starting from position 'pos' of 
+	       SOURCE to end of DEST */
+	    reiserfs_lb_copy_item(fs, dest_bi, src, FIRST_TO_LAST, 
+				  pos, cpy_num);
+	else {
+	    /* copy first cpy_num-1 items starting from position 'pos-1' 
+	       of the SOURCE to the end of the DEST */
+	    reiserfs_lb_copy_item(fs, dest_bi, src, FIRST_TO_LAST, 
+				  pos, cpy_num-1);
+	     
+	    /* copy part of the item which number is cpy_num+pos-1 
+	       to the end of the DEST */
+	    reiserfs_lb_split (fs, dest_bi, src, FIRST_TO_LAST, 
+			       cpy_num+pos-1, cpy_bytes);
+	} 
+    } else {
+	/* copy items to right */
+	src_nr_item = reiserfs_node_items (src);
+	if ( cpy_num == 1 )
+	    bytes = cpy_bytes;
+	else
+	    bytes = -1;
+   
+	/* copy the last item or it part or nothing to the begin of 
+	   the DEST (i = reiserfs_lb_copy_boundary(DEST,SOURCE,1,bytes)); */
+	i = reiserfs_lb_copy_boundary (fs, dest_bi, src, 
+				       LAST_TO_FIRST, bytes);
+   
+	cpy_num -= i;
+	if ( cpy_num == 0 )
+	    return i;
+   
+	pos = src_nr_item - cpy_num - i;
+	if ( cpy_bytes == -1 ) {
+	    /* starting from position 'pos' copy last cpy_num 
+	       items of SOURCE to begin of DEST */
+	    reiserfs_lb_copy_item(fs, dest_bi, src, 
+				  LAST_TO_FIRST, 
+				  pos, cpy_num);
+	} else {
+	    /* copy last cpy_num-1 items starting from position 'pos+1' 
+	       of the SOURCE to the begin of the DEST; */
+	    reiserfs_lb_copy_item(fs, dest_bi, src, 
+				  LAST_TO_FIRST, 
+				  pos+1, cpy_num-1);
+
+	    /* copy part of the item which number 
+	       is pos to the begin of the DEST */
+	    reiserfs_lb_split (fs, dest_bi, src, 
+			       LAST_TO_FIRST, 
+			       pos, cpy_bytes);
+	}
+    }
+    return i;
+}
+
+
+
+
+/* there are types of coping: from S[0] to L[0], from S[0] to R[0],
+   from R[0] to L[0]. for each of these we have to define parent and
+   positions of destination and source buffers */
+static void reiserfs_lb_move_prep (int shift_mode, 
+				   reiserfs_tb_t * tb, 
+				   reiserfs_bufinfo_t * dest_bi,
+				   reiserfs_bufinfo_t * src_bi, 
+				   int * first_last,
+				   reiserfs_bh_t * Snew)
+{
+    /* define dest, src, dest parent, dest position */
+    switch (shift_mode) {
+    case LEAF_FROM_S_TO_L:    /* it is used in reiserfs_lb_shift_left */
+	src_bi->bi_bh = REISERFS_PATH_LEAF (tb->tb_path);
+	src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+	/* src->b_item_order */
+	src_bi->bi_position = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0);	
+	dest_bi->bi_bh = tb->L[0];
+	dest_bi->bi_parent = tb->FL[0];
+	dest_bi->bi_position = reiserfs_tb_lpos (tb, 0);
+	*first_last = FIRST_TO_LAST;
+	break;
+
+    case LEAF_FROM_S_TO_R:  /* it is used in reiserfs_lb_shift_right */
+	src_bi->bi_bh = REISERFS_PATH_LEAF (tb->tb_path);
+	src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+	src_bi->bi_position = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0);
+	dest_bi->bi_bh = tb->R[0];
+	dest_bi->bi_parent = tb->FR[0];
+	dest_bi->bi_position = reiserfs_tb_rpos (tb, 0);
+	*first_last = LAST_TO_FIRST;
+	break;
+
+    case LEAF_FROM_R_TO_L:  /* it is used in balance_leaf_when_delete */
+	src_bi->bi_bh = tb->R[0];
+	src_bi->bi_parent = tb->FR[0];
+	src_bi->bi_position = reiserfs_tb_rpos (tb, 0);
+	dest_bi->bi_bh = tb->L[0];
+	dest_bi->bi_parent = tb->FL[0];
+	dest_bi->bi_position = reiserfs_tb_lpos (tb, 0);
+	*first_last = FIRST_TO_LAST;
+	break;
+    
+    case LEAF_FROM_L_TO_R:  /* it is used in balance_leaf_when_delete */
+	src_bi->bi_bh = tb->L[0];
+	src_bi->bi_parent = tb->FL[0];
+	src_bi->bi_position = reiserfs_tb_lpos (tb, 0);
+	dest_bi->bi_bh = tb->R[0];
+	dest_bi->bi_parent = tb->FR[0];
+	dest_bi->bi_position = reiserfs_tb_rpos (tb, 0);
+	*first_last = LAST_TO_FIRST;
+	break;
+
+    case LEAF_FROM_S_TO_SNEW:
+	src_bi->bi_bh = REISERFS_PATH_LEAF (tb->tb_path);
+	src_bi->bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+	src_bi->bi_position = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0);
+	dest_bi->bi_bh = Snew;
+	dest_bi->bi_parent = 0;
+	dest_bi->bi_position = 0;
+	*first_last = LAST_TO_FIRST;
+	break;
+    
+    default:
+	reiserfs_panic (0, "vs-10250: reiserfs_lb_move_prep: "
+			"shift type is unknown (%d)", shift_mode);
+    }
+}
+
+/* cuts DEL_COUNT entries beginning from FROM-th entry. Directory item
+   does not have free space, so it moves DEHs and remaining records as
+   necessary. Return value is size of removed part of directory item
+   in bytes. */
+static int reiserfs_lb_delete_entry (reiserfs_bh_t * bh,
+				     reiserfs_ih_t * ih, 
+				     int from, 
+				     int del_count)
+{
+    char * item;
+    reiserfs_deh_t * deh;
+    int prev_record_offset;	/* offset of record, that is (from-1)th */
+    char * prev_record;		/* */
+    int cut_records_len;		/* length of all removed records */
+    int i;
+    int entry_count;
+
+
+    /* first byte of item */
+    item = reiserfs_item_by_ih (bh, ih);
+
+    /* entry head array */
+    deh = reiserfs_deh (bh, ih);
+    entry_count = reiserfs_ih_get_entries (ih);
+
+    if (del_count == 0) {
+	int shift;
+	int last_location;
+
+	last_location = reiserfs_deh_get_loc (deh + entry_count - 1);
+	shift = last_location - REISERFS_DEH_SIZE * entry_count;
+	
+	memmove (deh + entry_count, item + last_location,
+		 reiserfs_ih_get_len (ih) - last_location);
+	for (i = 0; i < entry_count; i ++)
+	    reiserfs_deh_set_loc (&deh[i], reiserfs_deh_get_loc (&deh[i]) - shift);
+
+	return shift;
+    }
+
+    /* first byte of remaining entries, those are BEFORE cut entries
+       (prev_record) and length of all removed records (cut_records_len) */
+    prev_record_offset = (from ? reiserfs_deh_get_loc (&deh[from - 1]) : 
+			  reiserfs_ih_get_len (ih));
+    
+    if (from + del_count == entry_count) {
+	cut_records_len = prev_record_offset/*from_record*/ - 
+		REISERFS_DEH_SIZE * entry_count;
+    } else {
+	cut_records_len = prev_record_offset/*from_record*/ - 
+		reiserfs_deh_get_loc (&deh[from + del_count - 1]);
+    }
+    
+    prev_record = item + prev_record_offset;
+
+
+    /* adjust locations of remaining entries */
+    for (i = reiserfs_ih_get_entries (ih) - 1; i > from + del_count - 1; i --) {
+	reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) - 
+			  (REISERFS_DEH_SIZE * del_count));
+    }
+
+    for (i = 0; i < from; i ++) {
+	reiserfs_deh_set_loc (deh + i, reiserfs_deh_get_loc (deh + i) - 
+			  (REISERFS_DEH_SIZE * del_count + cut_records_len));
+    }
+
+    reiserfs_ih_set_entries (ih, reiserfs_ih_get_entries (ih) - del_count);
+
+    /* shift entry head array and entries those are AFTER removed entries */
+    memmove ((char *)(deh + from),
+	     deh + from + del_count, 
+	     prev_record - cut_records_len - (char *)(deh + from + del_count));
+  
+    /* shift records, those are BEFORE removed entries */
+    memmove (prev_record - cut_records_len - REISERFS_DEH_SIZE * del_count,
+	     prev_record, item + reiserfs_ih_get_len (ih) - prev_record);
+
+    return REISERFS_DEH_SIZE * del_count + cut_records_len;
+}
+
+
+/*  when cut item is part of regular file
+        pos_in_item - first byte that must be cut
+        cut_size - number of bytes to be cut beginning from pos_in_item
+ 
+   when cut item is part of directory
+        pos_in_item - number of first deleted entry
+        cut_size - count of deleted entries
+    */
+void reiserfs_lb_delete_unit (reiserfs_filsys_t * fs,
+			      reiserfs_bufinfo_t * bi, 
+			      int cut_item_num,
+			      int pos_in_item, 
+			      int cut_size)
+{
+    int nr;
+    reiserfs_bh_t * bh = bi->bi_bh;
+    reiserfs_node_head_t * blkh;
+    reiserfs_ih_t * ih;
+    int last_loc, unmoved_loc;
+    int i;
+
+    blkh = NODE_HEAD (bh);
+    nr = reiserfs_nh_get_items (blkh);
+
+    /* item head of truncated item */
+    ih = reiserfs_ih_at (bh, cut_item_num);
+
+    if (reiserfs_ih_dir (ih)) {
+        /* first cut entry ()*/
+        cut_size = reiserfs_lb_delete_entry (bh, ih, pos_in_item, cut_size);
+        if (pos_in_item == 0) {
+            /* change item key by key of first entry in the item */
+	    reiserfs_key_set_off1 (&ih->ih_key, reiserfs_deh_get_off (reiserfs_deh (bh, ih)));
+            /*memcpy (&ih->ih_key.k_offset, 
+		      &(reiserfs_deh (bh, ih)->deh_offset), 
+		      REISERFS_KEY_SHSIZE);*/
+	}
+    } else {
+        /* item is direct or extent */
+        /* shift item body to left if cut is from the head of item */
+        if (pos_in_item == 0) {
+	    memmove (bh->b_data + reiserfs_ih_get_loc (ih),
+		     bh->b_data + reiserfs_ih_get_loc (ih) + cut_size,
+		     reiserfs_ih_get_len (ih) - cut_size);
+
+            /* change key of item */
+            if (reiserfs_ih_direct(ih)) {
+                //ih->ih_key.k_offset += cut_size;
+                reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					 &ih->ih_key, 
+					 reiserfs_key_get_off (&ih->ih_key)
+					 + cut_size);
+            } else {
+                //ih->ih_key.k_offset += (cut_size / REISERFS_EXT_SIZE) * bh->b_size;
+                reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					 &ih->ih_key, 
+					 reiserfs_key_get_off (&ih->ih_key) + 
+					 (cut_size / REISERFS_EXT_SIZE) * bh->b_size);
+	    }
+	}
+    }
+  
+
+    /* location of the last item */
+    last_loc = reiserfs_ih_get_loc (&ih[nr - cut_item_num - 1]);
+
+    /* location of the item, which is remaining at the same place */
+    unmoved_loc = cut_item_num ? reiserfs_ih_get_loc (ih-1) : bh->b_size;
+
+
+    /* shift */
+    memmove (bh->b_data + last_loc + cut_size, bh->b_data + last_loc,
+	       unmoved_loc - last_loc - cut_size);
+
+    /* change item length */
+    reiserfs_ih_set_len (ih, reiserfs_ih_get_len (ih) - cut_size);
+  
+    if (reiserfs_ih_ext(ih)) {
+        if (pos_in_item)
+            //ih->u.ih_free_space = 0;
+            reiserfs_ih_set_free (ih, 0);
+    }
+
+    /* change locations */
+    for (i = cut_item_num; i < nr; i ++) {
+	reiserfs_ih_set_loc (&ih[i-cut_item_num], 
+			 reiserfs_ih_get_loc (&ih[i-cut_item_num]) + cut_size);
+    }
+
+    /* size, free space */
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) + cut_size);
+
+    reiserfs_buffer_mkdirty(bh);
+    
+    if (bi->bi_parent) {
+	reiserfs_dc_t * dc;
+
+	dc = reiserfs_int_at (bi->bi_parent, bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) - cut_size);
+	reiserfs_buffer_mkdirty(bi->bi_parent);
+    }
+    if (reiserfs_leaf_valid(bh) != NT_LEAF && 
+	reiserfs_leaf_valid(bh) != NT_IH_ARRAY)
+    {
+	reiserfs_panic ("reiserfs_lb_delete_unit: bad leaf %lu: %b",
+			bh->b_blocknr, bh);
+    }
+}
+
+
+/* delete del_num items from buffer starting from the first'th item */
+void reiserfs_lb_delete_item (reiserfs_filsys_t * fs,
+			      reiserfs_bufinfo_t * bi,
+			      int first, 
+			      int del_num)
+{
+    reiserfs_bh_t * bh = bi->bi_bh;
+    int nr;
+    int i, j;
+    int last_loc, last_removed_loc;
+    reiserfs_node_head_t * blkh;
+    reiserfs_ih_t * ih;
+
+    if (del_num == 0)
+	return;
+    
+    blkh = NODE_HEAD (bh);
+    nr = reiserfs_nh_get_items (blkh);
+
+    if (first == 0 && del_num == nr) {
+	/* this does not work */
+	reiserfs_tb_attach_new (bi);
+	
+	reiserfs_buffer_mkdirty(bh);
+	return;
+    }
+    
+    ih = reiserfs_ih_at (bh, first);
+    
+    /* location of unmovable item */
+    j = (first == 0) ? bh->b_size : reiserfs_ih_get_loc (ih-1);
+    
+    /* delete items */
+    last_loc = reiserfs_ih_get_loc (&ih[nr - 1 - first]);
+    last_removed_loc = reiserfs_ih_get_loc (&ih[del_num-1]);
+    
+    memmove (bh->b_data + last_loc + j - last_removed_loc,
+	     bh->b_data + last_loc, last_removed_loc - last_loc);
+    
+    /* delete item headers */
+    memmove (ih, ih + del_num, (nr - first - del_num) * REISERFS_IH_SIZE);
+    
+    /* change item location */
+    for (i = first; i < nr - del_num; i ++) {
+	reiserfs_ih_set_loc (&ih[i-first], 
+			 reiserfs_ih_get_loc (&ih[i-first]) + j - last_removed_loc);
+    }
+    
+    /* sizes, item number */
+    reiserfs_nh_set_items (blkh, reiserfs_nh_get_items (blkh)/*nr*/ - del_num);
+    reiserfs_nh_set_free (blkh, reiserfs_nh_get_free (blkh) + j - 
+			 last_removed_loc + REISERFS_IH_SIZE * del_num);
+    
+    reiserfs_buffer_mkdirty(bh);
+    
+    if (bi->bi_parent) {
+	reiserfs_dc_t * dc;
+
+	dc = reiserfs_int_at (bi->bi_parent, bi->bi_position);
+	reiserfs_dc_set_size (dc, reiserfs_dc_get_size (dc) - 
+	    (j - last_removed_loc + REISERFS_IH_SIZE * del_num));
+	reiserfs_buffer_mkdirty(bi->bi_parent);
+    }
+    if (reiserfs_leaf_valid(bh) != NT_LEAF && 
+	reiserfs_leaf_valid(bh) != NT_IH_ARRAY)
+    {
+	reiserfs_panic ("reiserfs_lb_delete_item: bad leaf %lu: %b", 
+			bh->b_blocknr, bh);
+    }
+}
+
+/*  If del_bytes == -1, starting from position 'first' delete del_num items in 
+    whole in buffer CUR. If not. If last_first == 0. Starting from position 
+    'first' delete del_num-1 items in whole. Delete part of body of the first 
+    item. Part defined by del_bytes. Don't delete first item header If 
+    last_first == 1. Starting from position 'first+1' delete del_num-1 items 
+    in whole. Delete part of body of the last item . Part defined by del_bytes.
+    Don't delete last item header. */
+void reiserfs_lb_delete (reiserfs_filsys_t * fs,
+			 reiserfs_bufinfo_t * cur_bi,
+			 int last_first, 
+			 int first, 
+			 int del_num, 
+			 int del_bytes)
+{
+    reiserfs_bh_t * bh;
+    int item_amount = reiserfs_node_items (bh = cur_bi->bi_bh);
+    
+    if ( del_num == 0 )
+	return;
+    
+    if ( first == 0 && del_num == item_amount && del_bytes == -1 ) {
+	reiserfs_tb_attach_new (cur_bi);
+	reiserfs_buffer_mkdirty (bh);
+	return;
+    }
+    
+    if ( del_bytes == -1 )
+	/* delete del_num items beginning from item in position first */
+	reiserfs_lb_delete_item (fs, cur_bi, first, del_num);
+    else {
+	if ( last_first == FIRST_TO_LAST ) {
+	    /* delete del_num-1 items beginning from item in position first  */
+	    reiserfs_lb_delete_item (fs, cur_bi, first, del_num-1);
+	    
+	    /* delete the part of the first item of the bh do not
+	       delete item header */
+	    reiserfs_lb_delete_unit (fs, cur_bi, 0, 0, del_bytes);
+	} else  {
+	    reiserfs_ih_t * ih;
+	    int len;
+	    
+	    /* delete del_num-1 items beginning from item in position first+1  */
+	    reiserfs_lb_delete_item (fs, cur_bi, first+1, del_num-1);
+	    
+	    /* the last item is directory  */
+	    if (reiserfs_ih_dir(ih = reiserfs_ih_at(bh, reiserfs_node_items(bh)-1))) 	
+	        /* len = numbers of directory entries in this item */
+	        len = reiserfs_ih_get_entries(ih);
+	    else
+		/* len = body len of item */
+ 	        len = reiserfs_ih_get_len (ih);
+	    
+	    /* delete the part of the last item of the bh 
+	       do not delete item header */
+	    reiserfs_lb_delete_unit (fs, cur_bi, reiserfs_node_items(bh) - 1, 
+				     len - del_bytes, del_bytes);
+	}
+    }
+}
+
+/* copy mov_num items and mov_bytes of the (mov_num-1)th item to
+   neighbor. Delete them from source */
+int reiserfs_lb_move (int shift_mode, 
+		      reiserfs_tb_t * tb, 
+		      int mov_num, 
+		      int mov_bytes, 
+		      reiserfs_bh_t * Snew)
+{
+    int ret_value;
+    reiserfs_bufinfo_t dest_bi, src_bi;
+    int first_last;
+
+    reiserfs_lb_move_prep (shift_mode, tb, &dest_bi, 
+			   &src_bi, &first_last, Snew);
+
+    ret_value = reiserfs_lb_copy (tb->tb_fs, &dest_bi, src_bi.bi_bh, 
+				  first_last, mov_num, mov_bytes);
+
+    reiserfs_lb_delete (tb->tb_fs, &src_bi, first_last, 
+			(first_last == FIRST_TO_LAST) ? 0 : 
+			(reiserfs_node_items(src_bi.bi_bh) - mov_num), 
+			mov_num, mov_bytes);
+
+    return ret_value;
+}
+
+
+/* Shift shift_num items (and shift_bytes of last shifted item if 
+   shift_bytes != -1) from S[0] to L[0] and replace the delimiting key */
+int reiserfs_lb_shift_left (reiserfs_tb_t * tb, 
+			    int shift_num, 
+			    int shift_bytes)
+{
+    reiserfs_bh_t * S0 = REISERFS_PATH_LEAF (tb->tb_path);
+    int i;
+
+    /* move shift_num (and shift_bytes bytes) items from S[0] to 
+       left neighbor L[0] */
+    i = reiserfs_lb_move (LEAF_FROM_S_TO_L, tb, shift_num, shift_bytes, 0);
+
+    if ( shift_num ) {
+	if (reiserfs_node_items (S0) == 0) { 
+	    /* everything is moved from S[0] */
+	    if (REISERFS_PATH_UPPOS (tb->tb_path, 1) == 0)
+		reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], 
+					  REISERFS_PATH_UPPARENT (tb->tb_path, 0), 0);
+	} else {
+	    /* replace lkey in CFL[0] by 0-th key from S[0]; */
+	    reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], S0, 0);
+	}
+    }
+
+    return i;
+}
+
+/* Shift shift_num (shift_bytes) items from S[0] to the right neighbor, 
+   and replace the delimiting key */
+int reiserfs_lb_shift_right (reiserfs_tb_t * tb, 
+			     int shift_num, 
+			     int shift_bytes)
+{
+    int ret_value;
+
+    /* move shift_num (and shift_bytes) items from S[0] 
+       to right neighbor R[0] */
+    ret_value = reiserfs_lb_move (LEAF_FROM_S_TO_R, tb, 
+				    shift_num, shift_bytes, 0);
+
+    /* replace rkey in CFR[0] by the 0-th key from R[0] */
+    if (shift_num) {
+	reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], tb->R[0], 0);
+    }
+
+    return ret_value;
+}
+
+/* Balance leaf node in case of delete or cut: insert_size[0] < 0
+ *
+ * lnum, rnum can have values >= -1
+ *	-1 means that the neighbor must be joined with S
+ *	 0 means that nothing should be done with the neighbor
+ *	>0 means to shift entirely or partly the specified number of 
+ *         items to the neighbor
+ */
+static int reiserfs_lb_balance_delete(reiserfs_tb_t * tb, int flag)
+{
+    reiserfs_bh_t * tbS0 = REISERFS_PATH_LEAF (tb->tb_path);
+    int item_pos = REISERFS_PATH_LEAF_POS (tb->tb_path);
+    int pos_in_item = tb->tb_path->pos_in_item;
+    reiserfs_bufinfo_t bi;
+    int n;
+    reiserfs_ih_t * ih;
+
+    ih = reiserfs_ih_at (tbS0, item_pos);
+
+    /* Delete or truncate the item */
+
+    switch (flag) {
+    case M_DELETE:   /* delete item in S[0] */
+
+	bi.bi_bh = tbS0;
+	bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+	bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1);
+	reiserfs_lb_delete (tb->tb_fs, &bi, 0, item_pos, 1, -1);
+
+	if ( ! item_pos ) {
+	    /* we have removed first item in the node - 
+		update left delimiting key */
+	    if ( reiserfs_node_items(tbS0) ) {
+		reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], tbS0, 0);
+	    } else {
+		if ( ! REISERFS_PATH_UPPOS (tb->tb_path, 1) ) {
+		    reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0],
+					      REISERFS_PATH_UPPARENT(tb->tb_path, 0),0);
+		}
+	    }
+	} 
+    
+	break;
+
+    case M_CUT: {  /* cut item in S[0] */
+	bi.bi_bh = tbS0;
+	bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+	bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1);
+	if (reiserfs_ih_dir (ih)) {
+	    /* UFS unlink semantics are such that you can only delete
+               one directory entry at a time. */
+	    /* when we cut a directory tb->insert_size[0] means number
+               of entries to be cut (always 1) */
+	    tb->insert_size[0] = -1;
+	    reiserfs_lb_delete_unit (tb->tb_fs, &bi, item_pos, 
+				     pos_in_item, -tb->insert_size[0]);
+
+	    if ( ! item_pos && ! pos_in_item ) {
+		reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0], tbS0, 0);
+	    }
+	} else {
+	    reiserfs_lb_delete_unit (tb->tb_fs, &bi, item_pos, 
+				     pos_in_item, -tb->insert_size[0]);
+	}
+	break;
+    }
+
+    default:
+	print_tb(flag, item_pos, pos_in_item, tb,"when_del");
+	reiserfs_panic ("PAP-12040: reiserfs_lb_balance_delete: "
+			"unexpectable mode: %s(%d)", 
+			(flag == M_PASTE) ? "PASTE" : 
+			((flag == M_INSERT) ? "INSERT" : "UNKNOWN"), flag);
+    }
+
+    /* the rule is that no shifting occurs unless by 
+       shifting a node can be freed */
+    n = reiserfs_node_items(tbS0);
+    if ( tb->lnum[0] )     /* L[0] takes part in balancing */
+    {
+	if ( tb->lnum[0] == -1 )    /* L[0] must be joined with S[0] */
+	{
+	    if ( tb->rnum[0] == -1 )    /* R[0] must be also joined with S[0] */
+	    {			
+		if ( tb->FR[0] == REISERFS_PATH_UPPARENT(tb->tb_path, 0) )
+		{
+		    /* all contents of all the 3 buffers will be in L[0] */
+		    if ((REISERFS_PATH_UPPOS (tb->tb_path, 1) == 0) && 
+			(1 < reiserfs_node_items(tb->FR[0])))
+		    {
+			reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0],
+						  tb->FR[0], 1);
+		    }
+
+		    reiserfs_lb_move (LEAF_FROM_S_TO_L, tb, n, -1, 0);
+		    reiserfs_lb_move (LEAF_FROM_R_TO_L, tb, 
+					reiserfs_node_items(tb->R[0]), -1, 0);
+
+		    reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr);
+		    reiserfs_node_forget (tb->tb_fs, tb->R[0]->b_blocknr);
+
+		    return 0;
+		}
+		/* all contents of all the 3 buffers will be in R[0] */
+		reiserfs_lb_move(LEAF_FROM_S_TO_R, tb, n, -1, 0);
+		reiserfs_lb_move(LEAF_FROM_L_TO_R, tb, 
+				   reiserfs_node_items(tb->L[0]), -1, 0);
+
+		/* right_delimiting_key is correct in R[0] */
+		reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], tb->R[0], 0);
+
+		reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr);
+		reiserfs_node_forget (tb->tb_fs, tb->L[0]->b_blocknr);
+
+		return -1;
+	    }
+
+	    /* all contents of L[0] and S[0] will be in L[0] */
+	    reiserfs_lb_shift_left(tb, n, -1);
+
+	    reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr);
+
+	    return 0;
+	}
+	/* a part of contents of S[0] will be in L[0] and the rest 
+	   part of S[0] will be in R[0] */
+
+	reiserfs_lb_shift_left (tb, tb->lnum[0], tb->lbytes);
+	reiserfs_lb_shift_right(tb, tb->rnum[0], tb->rbytes);
+
+	reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr);
+
+	return 0;
+    }
+
+    if ( tb->rnum[0] == -1 ) {
+	/* all contents of R[0] and S[0] will be in R[0] */
+	reiserfs_lb_shift_right(tb, n, -1);
+	reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr);
+	return 0;
+    }
+    return 0;
+}
+
+int reiserfs_lb_balance(reiserfs_tb_t * tb,
+			  /* item header of inserted item */
+			  reiserfs_ih_t * ih, 
+			  /* body  of inserted item or bytes to paste */
+			  const char * body,		
+			  /* i - insert, d - delete, c - cut, p - paste
+			     (see comment to reiserfs_tb_balance) */
+			  int flag,			
+			  /* it is always 0 */
+			  int zeros_number,
+			  /* in our processing of one level we sometimes 
+			     determine what must be inserted into the next 
+			     higher level.  This insertion consists of a 
+			     key or two keys and their corresponding
+			     pointers */
+			  reiserfs_ih_t * insert_key,  
+			  /* inserted node-ptrs for the next level */
+			  reiserfs_bh_t ** insert_ptr)
+{
+    /* position in item, in bytes for direct and
+       extent items, in entries for directories (for
+       which it is an index into the array of directory
+       entry headers.) */
+    int pos_in_item = tb->tb_path->pos_in_item; 
+    reiserfs_bh_t * tbS0 = REISERFS_PATH_LEAF (tb->tb_path);
+/*  reiserfs_bh_t * tbF0 = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+    int S0_b_item_order = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0);*/
+    /*  index into the array of item headers in S[0] 
+	of the affected item */
+    int item_pos = REISERFS_PATH_LEAF_POS (tb->tb_path);	
+    reiserfs_bufinfo_t bi;
+    /* new nodes allocated to hold what could not fit into S */
+    reiserfs_bh_t *S_new[2];  
+    /* number of items that will be placed into S_new (includes partially 
+       shifted items) */
+    int snum[2];
+    /* if an item is partially shifted into S_new then 
+       if it is a directory item 
+       it is the number of entries from the item that are shifted into S_new
+       else
+       it is the number of bytes from the item that are shifted into S_new */
+    int sbytes[2];
+    int n, i;
+    int ret_val;
+
+    /* Make balance in case insert_size[0] < 0 */
+    if ( tb->insert_size[0] < 0 )
+	return reiserfs_lb_balance_delete (/*th,*/ tb, flag);
+  
+    /* for extent item pos_in_item is measured in unformatted node
+       pointers. Recalculate to bytes */
+    if (flag != M_INSERT && reiserfs_ih_ext (reiserfs_ih_at (tbS0, item_pos)))
+	pos_in_item *= REISERFS_EXT_SIZE;
+
+    if ( tb->lnum[0] > 0 ) {
+	/* Shift lnum[0] items from S[0] to the left neighbor L[0] */
+	if ( item_pos < tb->lnum[0] ) {
+	    /* new item or it part falls to L[0], shift it too */
+	    n = reiserfs_node_items(tb->L[0]);
+
+	    switch (flag) {
+	    case M_INSERT:   /* insert item into L[0] */
+
+		if ( item_pos == tb->lnum[0] - 1 && tb->lbytes != -1 ) {
+		    /* part of new item falls into L[0] */
+		    int new_item_len;
+
+		    ret_val = reiserfs_lb_shift_left (tb, tb->lnum[0]-1, -1);
+		    /* Calculate item length to insert to S[0] */
+		    new_item_len = reiserfs_ih_get_len (ih) - tb->lbytes;
+		    /* Calculate and check item length to insert to L[0] */
+		    reiserfs_ih_set_len (ih, reiserfs_ih_get_len (ih) - new_item_len);
+		    /* Insert new item into L[0] */
+		    bi.bi_bh = tb->L[0];
+		    bi.bi_parent = tb->FL[0];
+		    bi.bi_position = reiserfs_tb_lpos (tb, 0);
+		    reiserfs_lb_insert (tb->tb_fs, &bi, n + 
+					item_pos - ret_val, ih, body,
+					zeros_number > reiserfs_ih_get_len (ih) ? 
+					reiserfs_ih_get_len (ih) : zeros_number);
+
+		    /* Calculate key component, item length and body to insert 
+		       into S[0] */
+		    //ih->ih_key.k_offset += tb->lbytes;
+		    reiserfs_key_set_off (
+			reiserfs_key_format (&ih->ih_key), &ih->ih_key, 
+			reiserfs_key_get_off (&ih->ih_key) + tb->lbytes * 
+			(reiserfs_ih_ext(ih) ? tb->tb_fs->fs_blocksize / 
+			 REISERFS_EXT_SIZE : 1) );
+		    
+		    reiserfs_ih_set_len (ih, new_item_len);
+		    if ( tb->lbytes >  zeros_number ) {
+			body += (tb->lbytes - zeros_number);
+			zeros_number = 0;
+		    }
+		    else
+			zeros_number -= tb->lbytes;
+		} else {
+		    /* new item in whole falls into L[0] */
+		    /* Shift lnum[0]-1 items to L[0] */
+		    ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0]-1, 
+						       tb->lbytes);
+
+		    /* Insert new item into L[0] */
+		    bi.bi_bh = tb->L[0];
+		    bi.bi_parent = tb->FL[0];
+		    bi.bi_position = reiserfs_tb_lpos (tb, 0);
+		    reiserfs_lb_insert (tb->tb_fs, &bi, n + item_pos - ret_val,
+					ih, body, zeros_number);
+
+		    tb->insert_size[0] = 0;
+		    zeros_number = 0;
+		}
+		break;
+
+	    case M_PASTE:   /* append item in L[0] */
+
+		if ( item_pos == tb->lnum[0] - 1 && tb->lbytes != -1 ) {
+		    /* we must shift the part of the appended item */
+		    if ( reiserfs_ih_dir (reiserfs_ih_at (tbS0, item_pos))) {
+			/* directory item */
+			if ( tb->lbytes > pos_in_item ) {
+			    /* new directory entry falls into L[0] */
+			    reiserfs_ih_t * pasted;
+			    int l_pos_in_item = pos_in_item;
+							  
+			    /* Shift lnum[0] - 1 items in whole. Shift 
+			       lbytes - 1 entries from given directory item */
+			    ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0], 
+							       tb->lbytes - 1);
+			    if ( ret_val && ! item_pos ) {
+				pasted =  reiserfs_ih_at(tb->L[0],
+						     reiserfs_node_items(tb->L[0])-1);
+				
+				l_pos_in_item += reiserfs_ih_get_entries(pasted) - 
+					(tb->lbytes-1);
+			    }
+
+			    /* Append given directory entry to directory item */
+			    bi.bi_bh = tb->L[0];
+			    bi.bi_parent = tb->FL[0];
+			    bi.bi_position = reiserfs_tb_lpos(tb, 0);
+			    reiserfs_lb_insert_unit (tb->tb_fs, &bi, n + 
+						     item_pos - ret_val, 
+						     l_pos_in_item,
+						     tb->insert_size[0], 
+						     body, zeros_number);
+
+			    /* previous string prepared space for pasting new 
+			       entry, following string pastes this entry */
+			    /* when we have merge directory item, pos_in_item 
+			       has been changed too */
+			    /* paste new directory entry. 1 is entry number */
+			    reiserfs_lb_insert_entry (bi.bi_bh, n + item_pos - 
+						      ret_val, l_pos_in_item, 1,
+						      (reiserfs_deh_t *)body,
+						      body + REISERFS_DEH_SIZE, 
+						      tb->insert_size[0]
+				);
+			    tb->insert_size[0] = 0;
+			} else {
+			    /* new directory item doesn't fall into L[0] */
+			    /* Shift lnum[0]-1 items in whole. Shift lbytes 
+			       directory entries from directory item number 
+			       lnum[0] */
+			    reiserfs_lb_shift_left (tb, tb->lnum[0], 
+						      tb->lbytes);
+			}
+			/* Calculate new position to append in item body */
+			pos_in_item -= tb->lbytes;
+		    }
+		    else {
+			/* regular object */
+			if ( tb->lbytes >= pos_in_item ) {
+			    /* appended item will be in L[0] in whole */
+			    int l_n, temp_n;
+                            reiserfs_key_t * key;
+
+			    /* this bytes number must be appended to the last 
+			       item of L[h] */
+			    l_n = tb->lbytes - pos_in_item;
+
+			    /* Calculate new insert_size[0] */
+			    tb->insert_size[0] -= l_n;
+
+			    ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0],
+					reiserfs_ih_get_len(reiserfs_ih_at(tbS0, item_pos)));
+			    
+			    /* Append to body of item in L[0] */
+			    bi.bi_bh = tb->L[0];
+			    bi.bi_parent = tb->FL[0];
+			    bi.bi_position = reiserfs_tb_lpos (tb, 0);
+			    reiserfs_lb_insert_unit(tb->tb_fs, 
+					&bi,n + item_pos - ret_val,
+					reiserfs_ih_get_len (reiserfs_ih_at(tb->L[0], 
+							n+item_pos-ret_val)),
+					l_n,body, zeros_number > l_n ? 
+					l_n : zeros_number);
+
+
+			    /* 0-th item in S0 can be only of DIRECT type 
+			       when l_n != 0*/
+			    //reiserfs_ih_key_at (tbS0, 0)->k_offset += l_n;z
+			    key = reiserfs_ih_key_at (tbS0, 0);
+                            temp_n = reiserfs_ih_ext(reiserfs_ih_at (tb->L[0], 
+					n + item_pos - ret_val)) ?
+				    (int)((l_n / REISERFS_EXT_SIZE) * 
+					  tb->tb_fs->fs_blocksize) : l_n;
+
+			    reiserfs_key_set_off (
+				reiserfs_key_format (key), key, 
+				reiserfs_key_get_off (key) + temp_n);
+
+			    /*reiserfs_int_key_at(tb->CFL[0],
+				tb->lkey[0])->k_offset += l_n; */
+			    key = reiserfs_int_key_at(tb->CFL[0],tb->lkey[0]);
+			    reiserfs_key_set_off (
+				reiserfs_key_format (key), key, 
+				reiserfs_key_get_off (key) + temp_n);
+
+			    /* Calculate new body, position in item and 
+			       insert_size[0] */
+			    if ( l_n > zeros_number ) {
+				body += (l_n - zeros_number);
+				zeros_number = 0;
+			    }
+			    else
+				zeros_number -= l_n;
+			    pos_in_item = 0;	
+			}
+			else {
+			    /* only part of the appended item will be in L[0] */
+
+			    /* Calculate position in item for append in S[0] */
+			    pos_in_item -= tb->lbytes;
+
+			    /* Shift lnum[0] - 1 items in whole. Shift 
+			       lbytes - 1 byte from item number lnum[0] */
+			    reiserfs_lb_shift_left(tb,tb->lnum[0],
+						     tb->lbytes);
+			}
+		    }
+		} else {
+		    /* appended item will be in L[0] in whole */
+		    reiserfs_ih_t * pasted;
+		
+		    if ( ! item_pos  && 
+			 reiserfs_tree_left_mergeable (tb->tb_fs, 
+						       tb->tb_path) == 1 )
+			{ /* if we paste into first item of S[0] and it 
+			     is left mergable then increment pos_in_item 
+			     by the size of the last item in L[0] */
+			    pasted = reiserfs_ih_at(tb->L[0],n-1);
+			    if ( reiserfs_ih_dir(pasted) )
+				pos_in_item += reiserfs_ih_get_entries (pasted);
+			    else
+				pos_in_item += reiserfs_ih_get_len (pasted);
+			}
+
+		    /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 
+		       byte from item number lnum[0] */
+		    ret_val = reiserfs_lb_shift_left(tb, tb->lnum[0], 
+						       tb->lbytes);
+		    /* Append to body of item in L[0] */
+		    bi.bi_bh = tb->L[0];
+		    bi.bi_parent = tb->FL[0];
+		    bi.bi_position = reiserfs_tb_lpos (tb, 0);
+		    reiserfs_lb_insert_unit (tb->tb_fs, &bi, n + item_pos - 
+					     ret_val, pos_in_item, 
+					     tb->insert_size[0],
+					     body, zeros_number);
+
+		    /* if appended item is directory, paste entry */
+		    pasted = reiserfs_ih_at (tb->L[0], n + item_pos - ret_val);
+		    if (reiserfs_ih_dir (pasted))
+			reiserfs_lb_insert_entry (bi.bi_bh, n + item_pos - 
+						  ret_val, pos_in_item, 1, 
+						  (reiserfs_deh_t *)body,
+						  body + REISERFS_DEH_SIZE, 
+						  tb->insert_size[0]);
+
+		    /* if appended item is extent item, put 
+		       unformatted node into un list */
+		    if (reiserfs_ih_ext (pasted))
+			reiserfs_ih_set_free (pasted, 0);
+
+		    tb->insert_size[0] = 0;
+		    zeros_number = 0;
+		}
+		break;
+	    default:    /* cases d and t */
+		reiserfs_panic ("PAP-12130: reiserfs_lb_balance: "
+				"lnum > 0: unexpectable mode: %s(%d)", 
+				(flag == M_DELETE) ? "DELETE" : 
+				((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag);
+	    }
+	} else { 
+	    /* new item doesn't fall into L[0] */
+	    reiserfs_lb_shift_left (tb, tb->lnum[0], tb->lbytes);
+	}
+    }	/* tb->lnum[0] > 0 */
+
+    /* Calculate new item position */
+    item_pos -= ( tb->lnum[0] - (( tb->lbytes != -1 ) ? 1 : 0));
+
+    if ( tb->rnum[0] > 0 ) {
+	/* shift rnum[0] items from S[0] to the right neighbor R[0] */
+	n = reiserfs_node_items(tbS0);
+	switch ( flag ) {
+
+	case M_INSERT:   /* insert item */
+	    if ( n - tb->rnum[0] < item_pos ) {
+		/* new item or its part falls to R[0] */
+		if ( item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1 ) {
+		    /* part of new item falls into R[0] */
+		    long long int old_key_comp, old_len, r_zeros_number;
+		    const char * r_body;
+		    long long int multiplyer;
+
+		    reiserfs_lb_shift_right(tb, tb->rnum[0] - 1, -1);
+
+		    /* Remember key component and item length */
+		    old_key_comp = reiserfs_key_get_off (&ih->ih_key);
+		    old_len = reiserfs_ih_get_len (ih);
+
+		    multiplyer = reiserfs_ih_ext(ih) ? 
+			    tb->tb_fs->fs_blocksize / REISERFS_EXT_SIZE : 1;
+		    /* Calculate key component and item length 
+		       to insert into R[0] */
+		    //ih->ih_key.k_offset += (old_len - tb->rbytes);
+		    reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					     &ih->ih_key, old_key_comp + 
+					     (old_len - tb->rbytes) * 
+					     multiplyer );
+
+		    reiserfs_ih_set_len (ih, tb->rbytes);
+		    /* Insert part of the item into R[0] */
+		    bi.bi_bh = tb->R[0];
+		    bi.bi_parent = tb->FR[0];
+		    bi.bi_position = reiserfs_tb_rpos (tb, 0);
+		    if (old_len - tb->rbytes > zeros_number ) {
+			r_zeros_number = 0;
+			r_body = body + old_len - tb->rbytes - zeros_number;
+		    }
+		    else { /* zeros_number is always 0 */
+			r_body = body;
+			r_zeros_number = zeros_number - old_len - tb->rbytes;
+			zeros_number -= r_zeros_number;
+		    }
+
+		    reiserfs_lb_insert (tb->tb_fs, &bi, 0, ih, 
+					r_body, r_zeros_number);
+
+		    /* Replace right delimiting key by first key in R[0] */
+		    reiserfs_node_replace_key(tb->CFR[0], tb->rkey[0], 
+					      tb->R[0], 0);
+
+		    /* Calculate key component and item length to 
+		       insert into S[0] */
+		    //ih->ih_key.k_offset = old_key_comp;
+		    reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					     &ih->ih_key, old_key_comp);
+
+		    reiserfs_ih_set_len (ih, old_len - tb->rbytes);
+
+		    tb->insert_size[0] -= tb->rbytes;
+
+		} else {
+		    /* whole new item falls into R[0] */
+
+		    /* Shift rnum[0]-1 items to R[0] */
+		    ret_val = reiserfs_lb_shift_right(tb, tb->rnum[0] - 1,
+							tb->rbytes);
+
+		    /* Insert new item into R[0] */
+		    bi.bi_bh = tb->R[0];
+		    bi.bi_parent = tb->FR[0];
+		    bi.bi_position = reiserfs_tb_rpos (tb, 0);
+		    reiserfs_lb_insert (tb->tb_fs, &bi, item_pos - n + 
+					tb->rnum[0] - 1, ih, body, 
+					zeros_number);
+
+		    /* If we insert new item in the begin of R[0] change 
+		       the right delimiting key */
+		    if ( item_pos - n + tb->rnum[0] - 1 == 0 ) {
+			reiserfs_node_replace_key (tb->CFR[0], 
+						   tb->rkey[0],
+						   tb->R[0], 0);
+		    }
+		    
+		    zeros_number = tb->insert_size[0] = 0;
+		}
+	    } else {
+		/* new item or part of it doesn't fall into R[0] */
+		reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes);
+	    }
+	    break;
+
+	case M_PASTE:   /* append item */
+
+	    if ( n - tb->rnum[0] <= item_pos ) { 
+		/* pasted item or part of it falls to R[0] */
+		if ( item_pos == n - tb->rnum[0] && tb->rbytes != -1 ) {
+		    /* we must shift the part of the appended item */
+		    if ( reiserfs_ih_dir (reiserfs_ih_at(tbS0, item_pos))) {
+			/* we append to directory item */
+			int entry_count;
+
+			entry_count = 
+				reiserfs_ih_get_entries(reiserfs_ih_at(tbS0, item_pos));
+			if ( entry_count - tb->rbytes < pos_in_item ) {
+			    /* new directory entry falls into R[0] */
+			    int paste_entry_position;
+
+			    /* Shift rnum[0]-1 items in whole. Shift 
+			       rbytes-1 directory entries from directory 
+			       item number rnum[0] */
+			    reiserfs_lb_shift_right (tb, tb->rnum[0], 
+						       tb->rbytes - 1);
+
+			    /* Paste given directory entry to directory item */
+			    paste_entry_position = pos_in_item - 
+				    entry_count + tb->rbytes - 1;
+
+			    bi.bi_bh = tb->R[0];
+			    bi.bi_parent = tb->FR[0];
+			    bi.bi_position = reiserfs_tb_rpos (tb, 0);
+			    reiserfs_lb_insert_unit (tb->tb_fs, &bi, 0, 
+						     paste_entry_position,
+						     tb->insert_size[0],
+						     body,zeros_number);
+			    /* paste entry */
+			    reiserfs_lb_insert_entry (
+				bi.bi_bh, 0, paste_entry_position, 1, 
+				(reiserfs_deh_t *)body, 
+				body + REISERFS_DEH_SIZE, tb->insert_size[0]);								
+						
+			    if ( paste_entry_position == 0 ) {
+				/* change delimiting keys */
+				reiserfs_node_replace_key(tb->CFR[0], 
+							  tb->rkey[0],
+							  tb->R[0], 0);
+			    }
+
+			    tb->insert_size[0] = 0;
+			    pos_in_item++;
+			} else {
+			    /* new directory entry doesn't fall into R[0] */
+			    reiserfs_lb_shift_right (tb, tb->rnum[0],
+						       tb->rbytes);
+			}
+		    }
+		    else {
+			/* regular object */
+
+			int n_shift, n_rem, r_zeros_number;
+			const char * r_body;
+			reiserfs_key_t * key;
+
+			/* Calculate number of bytes which must be shifted from 
+			   appended item */
+			if ( (n_shift = tb->rbytes - tb->insert_size[0]) < 0 )
+			    n_shift = 0;
+
+			reiserfs_lb_shift_right (tb, tb->rnum[0], n_shift);
+
+			/* Calculate number of bytes which must remain in body 
+			   after appending to R[0] */
+			if ( (n_rem = tb->insert_size[0] - tb->rbytes) < 0 )
+			    n_rem = 0;
+			{
+			    unsigned long temp_rem = n_rem;
+			
+			    if (reiserfs_key_ext(reiserfs_ih_key_at(tb->R[0],0)))
+				temp_rem = (n_rem / REISERFS_EXT_SIZE) * 
+					tb->tb_fs->fs_blocksize;
+
+			    //reiserfs_ih_key_at(tb->R[0],0)->k_offset += n_rem;
+			    key = reiserfs_ih_key_at(tb->R[0],0);
+			    reiserfs_key_set_off (
+				reiserfs_key_format (key), key, 
+				reiserfs_key_get_off (key) + temp_rem);
+
+			    /*reiserfs_int_key_at(tb->CFR[0],
+				tb->rkey[0])->k_offset += n_rem; */
+			    key = reiserfs_int_key_at(tb->CFR[0],tb->rkey[0]);
+			    reiserfs_key_set_off (
+				reiserfs_key_format (key), key, 
+				reiserfs_key_get_off (key) + temp_rem);
+                        }
+
+			reiserfs_buffer_mkdirty (tb->CFR[0]);
+
+			/* Append part of body into R[0] */
+			bi.bi_bh = tb->R[0];
+			bi.bi_parent = tb->FR[0];
+			bi.bi_position = reiserfs_tb_rpos (tb, 0);
+			if ( n_rem > zeros_number ) {
+			    r_zeros_number = 0;
+			    r_body = body + n_rem - zeros_number;
+			}
+			else {
+			    r_body = body;
+			    r_zeros_number = zeros_number - n_rem;
+			    zeros_number -= r_zeros_number;
+			}
+
+			reiserfs_lb_insert_unit(tb->tb_fs, &bi, 0, n_shift, 
+						tb->insert_size[0] - n_rem, 
+						r_body, r_zeros_number);
+
+			if (reiserfs_ih_ext(reiserfs_ih_at(tb->R[0],0))) {
+			    reiserfs_ih_set_free (reiserfs_ih_at(tb->R[0],0), 0);
+			}
+
+			tb->insert_size[0] = n_rem;
+			if ( ! n_rem )
+			    pos_in_item ++;
+		    }
+		}
+		else { 
+		    /* pasted item falls into R[0] entirely */
+
+		    reiserfs_ih_t * pasted;
+
+		    ret_val = reiserfs_lb_shift_right (tb, tb->rnum[0], 
+							 tb->rbytes);
+
+		    /* append item in R[0] */
+		    if ( pos_in_item >= 0 ) {
+			bi.bi_bh = tb->R[0];
+			bi.bi_parent = tb->FR[0];
+			bi.bi_position = reiserfs_tb_rpos (tb, 0);
+			reiserfs_lb_insert_unit(tb->tb_fs, &bi,item_pos - n + 
+						tb->rnum[0], pos_in_item,
+						tb->insert_size[0], body, 
+						zeros_number);
+		    }
+
+		    /* paste new entry, if item is directory item */
+		    pasted = reiserfs_ih_at(tb->R[0], item_pos - n + tb->rnum[0]);
+		    if (reiserfs_ih_dir (pasted) && pos_in_item >= 0 ) {
+			reiserfs_lb_insert_entry (bi.bi_bh, item_pos - n + 
+						  tb->rnum[0], pos_in_item, 1, 
+						  (reiserfs_deh_t *)body, 
+						  body + REISERFS_DEH_SIZE, 
+						  tb->insert_size[0]);
+			if ( ! pos_in_item ) {
+			    /* update delimiting keys */
+			    reiserfs_node_replace_key (tb->CFR[0], 
+						       tb->rkey[0],
+						       tb->R[0], 0);
+			}
+		    }
+
+		    if (reiserfs_ih_ext (pasted))
+			reiserfs_ih_set_free (pasted, 0);
+		    zeros_number = tb->insert_size[0] = 0;
+		}
+	    }
+	    else {
+		/* new item doesn't fall into R[0] */
+		reiserfs_lb_shift_right (tb, tb->rnum[0], tb->rbytes);
+	    }
+	    break;
+
+	default:    /* cases d and t */
+	    reiserfs_panic ("PAP-12175: reiserfs_lb_balance: "
+			    "rnum > 0: unexpectable mode: %s(%d)", 
+			    (flag == M_DELETE) ? "DELETE" : 
+			    ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag);
+	}
+    
+    }	/* tb->rnum[0] > 0 */
+
+    /* if while adding to a node we discover that it is possible to split
+       it in two, and merge the left part into the left neighbor and the
+       right part into the right neighbor, eliminating the node */
+    if ( tb->blknum[0] == 0 ) { /* node S[0] is empty now */
+        /* if insertion was done before 0-th position in R[0], right
+           delimiting key of the tb->L[0]'s and left delimiting key are
+           not set correctly */
+        if (tb->CFL[0]) {
+            if (!tb->CFR[0])
+                reiserfs_panic (tb->tb_fs, "vs-12195: reiserfs_lb_balance: "
+				"CFR not initialized");
+	    
+            reiserfs_key_copy (reiserfs_int_key_at (tb->CFL[0], tb->lkey[0]), 
+			       reiserfs_int_key_at (tb->CFR[0], tb->rkey[0]));
+            reiserfs_buffer_mkdirty (tb->CFL[0]);
+        }
+        
+	reiserfs_node_forget (tb->tb_fs, tbS0->b_blocknr);
+	return 0;
+    }
+
+
+    /* Fill new nodes that appear in place of S[0] */
+
+    /* I am told that this copying is because we need an array to enable
+       the looping code. -Hans */
+    snum[0] = tb->s1num,
+	snum[1] = tb->s2num;
+    sbytes[0] = tb->s1bytes;
+    sbytes[1] = tb->s2bytes;
+    for( i = tb->blknum[0] - 2; i >= 0; i-- ) {
+	/* here we shift from S to S_new nodes */
+	S_new[i] = reiserfs_tb_FEB(tb);
+
+	/* set block_head's level to leaf level */
+	reiserfs_nh_set_level (NODE_HEAD (S_new[i]), LEAF_LEVEL);
+
+	n = reiserfs_node_items(tbS0);
+	
+	switch (flag) {
+	case M_INSERT:   /* insert item */
+
+	    if ( n - snum[i] < item_pos ) {
+		/* new item or it's part falls to first new node S_new[i]*/
+		if ( item_pos == n - snum[i] + 1 && sbytes[i] != -1 ) {
+		    /* part of new item falls into S_new[i] */
+		    long long int old_key_comp, old_len, r_zeros_number;
+		    const char * r_body;
+		    long long int multiplyer;
+
+		    /* Move snum[i]-1 items from S[0] to S_new[i] */
+		    reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, 
+					snum[i] - 1, -1, S_new[i]);
+
+		    /* Remember key component and item length */
+		    old_key_comp = reiserfs_key_get_off (&ih->ih_key);
+		    old_len = reiserfs_ih_get_len (ih);
+		    multiplyer = reiserfs_ih_ext(ih) ? 
+			    tb->tb_fs->fs_blocksize / REISERFS_EXT_SIZE : 1;
+
+		    /* Calculate key component and item length to insert 
+		       into S_new[i] */
+		    //ih->ih_key.k_offset += (old_len - sbytes[i]);
+		    reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					     &ih->ih_key, old_key_comp + 
+					     (old_len - sbytes[i]) *multiplyer);
+
+		    reiserfs_ih_set_len (ih, sbytes[i]);
+
+		    /* Insert part of the item into S_new[i] before 0-th item */
+		    bi.bi_bh = S_new[i];
+		    bi.bi_parent = 0;
+		    bi.bi_position = 0;
+
+		    if ( old_len - sbytes[i] > zeros_number ) {
+			r_zeros_number = 0;
+			r_body = body + (old_len - sbytes[i]) - zeros_number;
+		    }
+		    else {
+			r_body = body;
+			r_zeros_number = zeros_number - (old_len - sbytes[i]);
+			zeros_number -= r_zeros_number;
+		    }
+
+		    reiserfs_lb_insert (tb->tb_fs, &bi, 0, ih, 
+					r_body, r_zeros_number);
+
+		    /* Calculate key component and item length 
+		       to insert into S[i] */
+		    //ih->ih_key.k_offset = old_key_comp;
+		    reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					     &ih->ih_key, old_key_comp);
+		    reiserfs_ih_set_len (ih, old_len - sbytes[i]);
+		    tb->insert_size[0] -= sbytes[i];
+		}
+		else /* whole new item falls into S_new[i] */
+		{
+		    /* Shift snum[0] - 1 items to S_new[i] 
+		       (sbytes[i] of split item) */
+		    reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i] - 1,
+					sbytes[i], S_new[i]);
+
+		    /* Insert new item into S_new[i] */
+		    bi.bi_bh = S_new[i];
+		    bi.bi_parent = 0;
+		    bi.bi_position = 0;
+		    reiserfs_lb_insert (tb->tb_fs, &bi, item_pos - n + 
+					snum[i] - 1, ih, body, zeros_number);
+		    zeros_number = tb->insert_size[0] = 0;
+		}
+	    }
+
+	    else /* new item or it part don't falls into S_new[i] */
+	    {
+		reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], 
+				    sbytes[i], S_new[i]);
+	    }
+	    break;
+
+	case M_PASTE:   /* append item */
+
+	    if ( n - snum[i] <= item_pos )  
+		/* pasted item or part if it falls to S_new[i] */
+	    {
+		if ( item_pos == n - snum[i] && sbytes[i] != -1 )
+		{ /* we must shift part of the appended item */
+		    reiserfs_ih_t * aux_ih;
+
+		    aux_ih = reiserfs_ih_at(tbS0,item_pos);
+		    
+		    if (reiserfs_ih_dir (aux_ih)) {
+			/* we append to directory item */
+
+			int entry_count;
+		
+			entry_count = reiserfs_ih_get_entries(aux_ih);
+
+			if ( entry_count - sbytes[i] < pos_in_item  && 
+			     pos_in_item <= entry_count ) 
+			{
+			    /* new directory entry falls into S_new[i] */
+		  
+			    /* Shift snum[i]-1 items in whole. Shift sbytes[i] 
+			       directory entries from directory item number 
+			       snum[i] */
+			    reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb,snum[i],
+						sbytes[i]-1, S_new[i]);
+
+			    /* Paste given directory entry to directory item */
+			    bi.bi_bh = S_new[i];
+			    bi.bi_parent = 0;
+			    bi.bi_position = 0;
+			    reiserfs_lb_insert_unit (tb->tb_fs, &bi, 0, 
+						     pos_in_item - entry_count +
+						     sbytes[i] - 1,
+						     tb->insert_size[0], body,
+						     zeros_number);
+			    
+			    /* paste new directory entry */
+			    reiserfs_lb_insert_entry (bi.bi_bh, 0, 
+				pos_in_item - entry_count + sbytes[i] - 1, 
+				1, (reiserfs_deh_t *)body, 
+				body + REISERFS_DEH_SIZE, tb->insert_size[0]);
+			    
+			    tb->insert_size[0] = 0;
+			    pos_in_item++;
+			} else { /* new directory entry doesn't fall 
+				    into S_new[i] */
+			    reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, 
+						snum[i], sbytes[i], S_new[i]);
+			}
+		    }
+		    else /* regular object */
+		    {
+			int n_shift, n_rem, r_zeros_number;
+			const char * r_body;
+			reiserfs_ih_t * tmp;
+
+			/* Calculate number of bytes which must be shifted from 
+			   appended item */
+			n_shift = sbytes[i] - tb->insert_size[0];
+			if ( n_shift < 0 )
+			    n_shift = 0;
+			reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], 
+					    n_shift, S_new[i]);
+
+			/* Calculate number of bytes which must remain in body 
+			   after append to S_new[i] */
+			n_rem = tb->insert_size[0] - sbytes[i];
+			if ( n_rem < 0 )
+			    n_rem = 0;
+			/* Append part of body into S_new[0] */
+			bi.bi_bh = S_new[i];
+			bi.bi_parent = 0;
+			bi.bi_position = 0;
+
+			if ( n_rem > zeros_number ) {
+			    r_zeros_number = 0;
+			    r_body = body + n_rem - zeros_number;
+			}
+			else {
+			    r_body = body;
+			    r_zeros_number = zeros_number - n_rem;
+			    zeros_number -= r_zeros_number;
+			}
+
+			reiserfs_lb_insert_unit(tb->tb_fs, &bi, 0, n_shift, 
+						tb->insert_size[0]-n_rem, 
+						r_body,r_zeros_number);
+			tmp = reiserfs_ih_at (S_new[i], 0);
+			if (reiserfs_ih_ext(tmp)) {
+/*			
+			    if (n_rem)
+				reiserfs_panic ("PAP-12230: reiserfs_lb_balance: "
+						"invalid action with extent item");
+			    reiserfs_ih_set_free (tmp, 0);
+*/
+			    reiserfs_ih_set_free (tmp, 0);
+			    reiserfs_key_set_off(
+				reiserfs_key_format (&tmp->ih_key), 
+				&tmp->ih_key,
+				reiserfs_key_get_off(&tmp->ih_key) +
+				(n_rem / REISERFS_EXT_SIZE) * 
+				tb->tb_fs->fs_blocksize);
+			} else
+			    reiserfs_key_set_off (
+				reiserfs_key_format (&tmp->ih_key), 
+				&tmp->ih_key,
+				reiserfs_key_get_off(&tmp->ih_key) + n_rem);
+
+			//reiserfs_ih_key_at(S_new[i],0)->k_offset += n_rem;
+//			
+
+			tb->insert_size[0] = n_rem;
+			if ( ! n_rem )
+			    pos_in_item++;
+		    }
+		}
+		else
+		    /* item falls wholly into S_new[i] */
+		{
+		    reiserfs_ih_t * pasted;
+		
+		    reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], 
+					sbytes[i], S_new[i]);
+		    /* paste into item */
+		    bi.bi_bh = S_new[i];
+		    bi.bi_parent = 0;
+		    bi.bi_position = 0;
+		    reiserfs_lb_insert_unit(tb->tb_fs, &bi, item_pos - 
+					    n + snum[i], pos_in_item, 
+					    tb->insert_size[0], body, 
+					    zeros_number);
+
+		    pasted = reiserfs_ih_at(S_new[i], item_pos - n + snum[i]);
+		    if (reiserfs_ih_dir (pasted)) {
+			reiserfs_lb_insert_entry (bi.bi_bh, item_pos - n + 
+						  snum[i], pos_in_item, 1, 
+						  (reiserfs_deh_t *)body,
+						  body + REISERFS_DEH_SIZE, 
+						  tb->insert_size[0]);
+		    }
+
+		    /* if we paste to extent item update ih_free_space */
+		    if (reiserfs_ih_ext (pasted))
+			reiserfs_ih_set_free (pasted, 0);
+		    zeros_number = tb->insert_size[0] = 0;
+		}
+	    } else {
+		/* pasted item doesn't fall into S_new[i] */
+		reiserfs_lb_move (LEAF_FROM_S_TO_SNEW, tb, snum[i], 
+				    sbytes[i], S_new[i]);
+	    }
+	    break;
+
+	default:    /* cases d and t */
+	    reiserfs_panic ("PAP-12245: reiserfs_lb_balance: blknum > 2: "
+			    "unexpectable mode: %s(%d)", (flag == M_DELETE) ? 
+			    "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), 
+			    flag);
+	}
+
+	memcpy (insert_key + i,reiserfs_ih_key_at(S_new[i],0),REISERFS_KEY_SIZE);
+	insert_ptr[i] = S_new[i];
+    }
+
+    /* if the affected item was not wholly shifted then we perform all
+       necessary operations on that part or whole of the affected item which
+       remains in S */
+    if ( 0 <= item_pos && item_pos < tb->s0num ) {
+	/* if we must insert or append into buffer S[0] */
+
+	switch (flag) {
+	case M_INSERT:   /* insert item into S[0] */
+	    bi.bi_bh = tbS0;
+	    bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+	    bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1);
+	    reiserfs_lb_insert (tb->tb_fs, &bi, item_pos, 
+				ih, body, zeros_number);
+
+	    /* If we insert the first key change the delimiting key */
+	    if( item_pos == 0 ) {
+		if (tb->CFL[0]) /* can be 0 in reiserfsck */
+		    reiserfs_node_replace_key (tb->CFL[0], 
+					       tb->lkey[0],
+					       tbS0, 0);
+	    }
+	    
+	    break;
+
+	case M_PASTE: {  /* append item in S[0] */
+	    reiserfs_ih_t * pasted;
+
+	    pasted = reiserfs_ih_at (tbS0, item_pos);
+	    /* when directory, may be new entry already pasted */
+	    if (reiserfs_ih_dir (pasted)) {
+		if ( pos_in_item >= 0 && 
+		     pos_in_item <= reiserfs_ih_get_entries (pasted) ) 
+		{
+		    /* prepare space */
+		    bi.bi_bh = tbS0;
+		    bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+		    bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1);
+		    reiserfs_lb_insert_unit(tb->tb_fs, &bi, item_pos, 
+					    pos_in_item, tb->insert_size[0],
+					    body, zeros_number);
+
+		    /* paste entry */
+		    reiserfs_lb_insert_entry (bi.bi_bh, item_pos, pos_in_item, 
+					      1, (reiserfs_deh_t *)body,
+					body + REISERFS_DEH_SIZE, tb->insert_size[0]);
+		    
+		    if ( ! item_pos && ! pos_in_item ) {
+			if (tb->CFL[0])  // can be 0 in reiserfsck
+			    reiserfs_node_replace_key(tb->CFL[0], tb->lkey[0],
+						      tbS0, 0);
+		    }
+		    tb->insert_size[0] = 0;
+		}
+	    } else { /* regular object */
+		if ( pos_in_item == reiserfs_ih_get_len (pasted) ) {
+		    bi.bi_bh = tbS0;
+		    bi.bi_parent = REISERFS_PATH_UPPARENT (tb->tb_path, 0);
+		    bi.bi_position = REISERFS_PATH_UPPOS (tb->tb_path, 1);
+		    reiserfs_lb_insert_unit (tb->tb_fs, &bi, item_pos, 
+					     pos_in_item, tb->insert_size[0],
+					     body, zeros_number);
+
+		    if (reiserfs_ih_ext (pasted)) {
+			reiserfs_ih_set_free (pasted, 0);
+		    }
+		    tb->insert_size[0] = 0;
+		}
+	    }
+	} /* case M_PASTE: */
+	}
+    }
+
+    return 0;
+} /* Leaf level of the tree is balanced (end of reiserfs_lb_balance) */
+
+static void print_tb (int mode, 
+		      int item_pos, 
+		      int pos_in_item, 
+		      reiserfs_tb_t * tb, 
+		      char * mes)
+{
+  unsigned int h = 0;
+  reiserfs_bh_t * tbSh, * tbFh;
+
+
+  if (!tb)
+    return;
+
+  printf ("\n********************** PRINT_TB for %s *******************\n", mes);
+  printf ("MODE=%c, ITEM_POS=%d POS_IN_ITEM=%d\n", mode, item_pos, pos_in_item);
+  printf ("*********************************************************************\n");
+
+  printf ("* h *    S    *    L    *    R    *   F   *   FL  *   FR  *  CFL  *  CFR  *\n");
+  
+  for (h = 0; h < sizeof(tb->insert_size) / sizeof (tb->insert_size[0]); h ++) {
+    if (REISERFS_PATH_LEVEL (tb->tb_path, h) <= tb->tb_path->path_length && 
+	REISERFS_PATH_LEVEL (tb->tb_path, h) > REISERFS_PATH_OFFILL) {
+      tbSh = REISERFS_PATH_UPBUFFER (tb->tb_path, h);
+      tbFh = REISERFS_PATH_UPPARENT (tb->tb_path, h);
+    } else {
+      /*      printk ("print_tb: h=%d, REISERFS_PATH_LEVEL=%d, path_length=%d\n", 
+	      h, REISERFS_PATH_LEVEL (tb->tb_path, h), tb->tb_path->path_length);*/
+      tbSh = 0;
+      tbFh = 0;
+    }
+    printf ("* %u * %3lu(%2lu) * %3lu(%2lu) * %3lu(%2lu) * %5ld * "
+	    "%5ld * %5ld * %5ld * %5ld *\n",
+	    h, 
+	    tbSh ? tbSh->b_blocknr : ~0ul,
+	    tbSh ? tbSh->b_count : ~0ul,
+	    tb->L[h] ? tb->L[h]->b_blocknr : ~0ul,
+	    tb->L[h] ? tb->L[h]->b_count : ~0ul,
+	    tb->R[h] ? tb->R[h]->b_blocknr : ~0ul,
+	    tb->R[h] ? tb->R[h]->b_count : ~0ul,
+	    tbFh ? tbFh->b_blocknr : ~0ul,
+	    tb->FL[h] ? tb->FL[h]->b_blocknr : ~0ul,
+	    tb->FR[h] ? tb->FR[h]->b_blocknr : ~0ul,
+	    tb->CFL[h] ? tb->CFL[h]->b_blocknr : ~0ul,
+	    tb->CFR[h] ? tb->CFR[h]->b_blocknr : ~0ul);
+  }
+
+  printf ("*********************************************************************\n");
+
+
+  /* print balance parameters for leaf level */
+  h = 0;
+  printf ("* h * size * ln * lb * rn * rb * blkn * s0 * "
+	  "s1 * s1b * s2 * s2b * curb * lk * rk *\n");
+  printf ("* %d * %4d * %2d * %2d * %2d * %2d * %4d * %2d "
+	  "* %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n",
+	  h, tb->insert_size[h], tb->lnum[h], tb->lbytes, 
+	  tb->rnum[h],tb->rbytes, tb->blknum[h], 
+	  tb->s0num, tb->s1num,tb->s1bytes,  tb->s2num, 
+	  tb->s2bytes, tb->cur_blknum, tb->lkey[h], tb->rkey[h]);
+
+  /* this prints balance parameters for non-leaf levels */
+  do {
+    h++;
+    printf ("* %d * %4d * %2d *    * %2d *    * %2d *\n",
+    h, tb->insert_size[h], tb->lnum[h], tb->rnum[h], tb->blknum[h]);
+  } while (tb->insert_size[h]);
+
+  printf ("*********************************************************************\n");
+
+
+  /* print FEB list (list of buffers in form (bh (b_blocknr, b_count), 
+     that will be used for new nodes) */
+  for (h = 0; h < sizeof (tb->FEB) / sizeof (tb->FEB[0]); h++)
+    printf("%s%p (%lu %d)", h == 0 ? "FEB list: " : ", ", 
+	   tb->FEB[h], tb->FEB[h] ? tb->FEB[h]->b_blocknr : 0,
+	    tb->FEB[h] ? tb->FEB[h]->b_count : 0);
+  
+  printf ("\n");
+  printf ("********************** END OF PRINT_TB *******************\n\n");
+}
+
diff --git a/libreiserfs/libreiserfs.c b/libreiserfs/libreiserfs.c
new file mode 100644
index 0000000..5f730db
--- /dev/null
+++ b/libreiserfs/libreiserfs.c
@@ -0,0 +1,24 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+#ifdef LIBREISERFS_READY
+int libreiserfs_max_interface_version(void) {
+	return LIBREISER4_MAX_INTERFACE_VERSION;
+}
+
+int libreiserfs_min_interface_version(void) {
+	return LIBREISER4_MIN_INTERFACE_VERSION;
+}
+
+const char *libreiserfs_version(void) {
+	return VERSION;
+}
+#endif
diff --git a/libreiserfs/node.c b/libreiserfs/node.c
new file mode 100644
index 0000000..abdd244
--- /dev/null
+++ b/libreiserfs/node.c
@@ -0,0 +1,130 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+#include <stdarg.h>
+
+/* Replace n_dest'th key in buffer dest by n_src'th key of buffer src.*/
+void reiserfs_node_replace_key (reiserfs_bh_t * dest, int n_dest,
+				reiserfs_bh_t * src, int n_src)
+{
+    if (dest) {
+	if (reiserfs_leaf_head (src)) {
+	    /* source buffer contains leaf node */
+	    memcpy (reiserfs_int_key_at(dest,n_dest), 
+		    reiserfs_ih_at(src,n_src), REISERFS_KEY_SIZE);
+	} else {
+	    memcpy (reiserfs_int_key_at(dest,n_dest), 
+		    reiserfs_int_key_at(src,n_src), REISERFS_KEY_SIZE);
+	}
+	
+	reiserfs_buffer_mkdirty(dest);
+    }
+}
+
+void reiserfs_node_forget(reiserfs_filsys_t *fs, unsigned long blk) {
+    reiserfs_bh_t * to_be_forgotten;
+
+    to_be_forgotten = reiserfs_buffer_find (fs->fs_dev, blk, fs->fs_blocksize);
+    
+    if (to_be_forgotten) {
+	reiserfs_nh_set_level(NODE_HEAD(to_be_forgotten), FREE_LEVEL);
+	to_be_forgotten->b_count ++;
+	reiserfs_buffer_forget (to_be_forgotten);
+    }
+
+    if (fs->block_deallocator)
+	fs->block_deallocator (fs, blk);
+}
+
+// make sure that bh contains formatted node of reiserfs tree of
+// 'level'-th level
+int reiserfs_node_formatted (reiserfs_bh_t * bh, int level)
+{
+    if (reiserfs_node_level (bh) != level)
+	return 0;
+    if (reiserfs_leaf_head (bh))
+	return reiserfs_leaf_valid(bh);
+
+    return reiserfs_internal_correct (bh);
+}
+
+/* returns code of reiserfs metadata block (leaf, internal, super
+   block, journal descriptor), unformatted */
+int reiserfs_node_type (reiserfs_bh_t *bh) {
+    int res;
+    
+    /* super block? */
+    if (reiserfs_super_valid(bh))
+	return NT_SUPER;
+
+    if ((res = reiserfs_leaf_valid(bh)))
+	/* if block head and item head array seem matching (node level, free
+           space, item number, item locations and length), then it is NT_LEAF,
+	  otherwise, it is NT_IH_ARRAY */
+	return res;
+
+    if (reiserfs_internal_correct(bh))
+	return NT_INTERNAL;
+
+
+    /* journal descriptor block? */
+    if (reiserfs_journal_desc_valid(bh))
+	return NT_JDESC;
+
+    /* contents of buf does not look like reiserfs metadata. Bitmaps
+       are possible here */
+    return NT_UNKNOWN;
+}
+
+char *node_name[NT_UNKNOWN + 1] = {
+    "",
+    "leaf", 
+    "internal", 
+    "super", 
+    "journal descriptor", 
+    "broken leaf", 
+    "unknown"
+};
+
+char * reiserfs_node_type_name(int code) {
+    return code >= NT_LEAF && code < NT_UNKNOWN ? 
+	    node_name[code] : node_name[NT_UNKNOWN];
+}
+
+void reiserfs_node_print (FILE * fp, 
+			  reiserfs_filsys_t * fs, 
+			  reiserfs_bh_t * bh, ...)
+		       /* int print_mode, 
+			  int first, 
+			  int last         */
+{
+    va_list args;
+    int mode, first, last;
+    char * file_name;
+
+    va_start (args, bh);
+
+    if ( ! bh ) {
+	reiserfs_warning (stderr, "reiserfs_node_print: buffer is NULL\n");
+	return;
+    }
+
+    mode = va_arg (args, int);
+    first = va_arg (args, int);
+    last = va_arg (args, int);
+    file_name = (fs) ? fs->fs_file_name : NULL ;
+    if (reiserfs_print_jdesc (fp, bh))
+        if (reiserfs_super_print (fp, fs, file_name, bh, 0))
+	    if (reiserfs_leaf_print (fp, fs, bh, mode, first, last))
+		if (reiserfs_internal_print (fp, bh, first, last))
+		    reiserfs_warning (fp, "Block %ld contains unformatted data\n", bh->b_blocknr);
+}
+
diff --git a/libreiserfs/objmap.c b/libreiserfs/objmap.c
new file mode 100644
index 0000000..d4e64f2
--- /dev/null
+++ b/libreiserfs/objmap.c
@@ -0,0 +1,165 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+static int comp_ids (const void * p1, const void * p2) {
+    __u32 id1 = le32_to_cpu(*(__u32 *)p1) ;
+    __u32 id2 = le32_to_cpu(*(__u32 *)p2) ;
+
+    if (id1 < id2)
+        return -1;
+    if (id1 > id2)
+        return 1 ;
+    return 0 ;
+}
+
+/* functions to manipulate with super block's objectid map */
+
+int reiserfs_objmap_test (reiserfs_filsys_t * fs, __u32 objectid)
+{
+    __u32 * objectid_map;
+    __u32 count = reiserfs_sb_get_mapcur(fs->fs_ondisk_sb);
+    int ret;
+    int pos;
+
+    objectid_map = (__u32 *)((char *)fs->fs_ondisk_sb + 
+			     reiserfs_super_size (fs->fs_ondisk_sb));
+    
+    ret = misc_bin_search(&objectid, objectid_map, count, 
+			  sizeof(__u32), &pos, comp_ids);
+
+    /* if the position returned is odd, the oid is in use */
+    if (ret == 0)
+	return ((__u32)pos & 1);
+
+    /* if the position returned is even, the oid is in use */
+    return !((__u32)pos & 1) ;
+}
+
+
+void reiserfs_objmap_set (reiserfs_filsys_t * fs, __u32 objectid)
+{
+    int i;
+    __u32 * objectid_map;
+    int cursize;
+
+
+    if (reiserfs_objmap_test (fs, objectid)) {
+	return;
+    }
+
+    objectid_map = (__u32 *)((char *)fs->fs_ondisk_sb + 
+			     reiserfs_super_size (fs->fs_ondisk_sb));
+    
+    cursize = reiserfs_sb_get_mapcur (fs->fs_ondisk_sb);
+
+    for (i = 0; i < cursize; i += 2) {
+	if (objectid >= le32_to_cpu (objectid_map [i]) &&
+	    objectid < le32_to_cpu (objectid_map [i + 1]))
+	    /* it is used */
+	    return;
+	
+	if (objectid + 1 == le32_to_cpu (objectid_map[i])) {
+	    /* size of objectid map does not change */
+	    objectid_map[i] = cpu_to_le32 (objectid);
+	    return;
+	}
+	
+	if (objectid == le32_to_cpu (objectid_map[i + 1])) {
+	    /* size of objectid map is decreased */
+	    objectid_map [i + 1] = 
+		    cpu_to_le32 (le32_to_cpu (objectid_map [i + 1]) + 1);
+
+	    if (i + 2 < cursize) {
+		if (objectid_map[i + 1] == objectid_map[i + 2]) {
+		    memmove (objectid_map + i + 1, objectid_map + i + 1 + 2, 
+			     (cursize - (i + 2 + 2 - 1)) * sizeof (__u32));
+		    reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, cursize - 2);
+		}
+	    }
+	    return;
+	}
+	
+	if (objectid < le32_to_cpu (objectid_map[i])) {
+	    /* size of objectid map must be increased */
+	    if (cursize == reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)) {
+		/* here all objectids between objectid and objectid_map[i] get
+                   used */
+		objectid_map[i] = cpu_to_le32 (objectid);
+		return;
+	    } else {
+		memmove (objectid_map + i + 2, objectid_map + i, 
+			 (cursize - i) * sizeof (__u32));
+		
+		reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, cursize + 2);
+	    }
+	    
+	    objectid_map[i] = cpu_to_le32 (objectid);
+	    objectid_map[i+1] = cpu_to_le32 (objectid + 1);
+	    return;
+	}
+	
+    }
+    
+    /* append to current objectid map, if we have space */
+    if (i < reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)) {
+	objectid_map[i] = cpu_to_le32 (objectid);
+	objectid_map[i + 1] = cpu_to_le32 (objectid + 1);
+	reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, cursize + 2);
+    } else if (i == reiserfs_sb_get_mapmax (fs->fs_ondisk_sb)) {
+	objectid_map[i - 1] = cpu_to_le32 (objectid + 1);
+    } else
+	misc_die ("mark_objectid_as_used: objectid map corrupted");
+    
+    return;
+}
+
+
+void reiserfs_objmap_print (FILE * fp, reiserfs_filsys_t * fs)
+{
+    int i;
+    reiserfs_sb_t * sb;
+    __u32 * omap;
+
+
+    sb = fs->fs_ondisk_sb;
+    if (fs->fs_format == REISERFS_FORMAT_3_6)
+	omap = (__u32 *)(sb + 1);
+    else if (fs->fs_format == REISERFS_FORMAT_3_5)
+	omap = (__u32 *)((reiserfs_sb_v1_t *)sb + 1);
+    else {
+	reiserfs_warning (fp, "reiserfs_objmap_print: proper "
+			  "signature is not found\n");
+	return;
+    }
+	
+    reiserfs_warning (fp, "Map of objectids (super block size %d)\n",
+		      (char *)omap - (char *)sb);
+      
+    for (i = 0; i < reiserfs_sb_get_mapcur (sb); i ++) {
+	if (i % 2 == 0) {
+	    reiserfs_warning(fp, "busy(%u-%u) ", le32_to_cpu (omap[i]),
+			     le32_to_cpu (omap[i+1]) - 1); 
+	} else {
+	    reiserfs_warning(fp, "free(%u-%u) ", le32_to_cpu (omap[i]),
+			    ((i+1) == reiserfs_sb_get_mapcur (sb)) ? 
+			    ~(__u32)0 : (le32_to_cpu (omap[i+1]) - 1));
+	}
+    }
+
+    reiserfs_warning (fp, "\nObject id array has size %d (max %d):", 
+		      reiserfs_sb_get_mapcur (sb), reiserfs_sb_get_mapmax (sb));
+  
+    for (i = 0; i < reiserfs_sb_get_mapcur (sb); i ++)
+	reiserfs_warning (fp, "%s%u ", i % 2 ? "" : "*", le32_to_cpu (omap[i])); 
+    reiserfs_warning (fp, "\n");
+
+}
+
diff --git a/libreiserfs/prints.c b/libreiserfs/prints.c
new file mode 100644
index 0000000..452dd34
--- /dev/null
+++ b/libreiserfs/prints.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/device.h"
+
+#include <sys/stat.h>
+#include <printf.h>
+#include <stdarg.h>
+
+#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
+#  include <uuid/uuid.h>
+#endif
+
+#define PA_KEY		(PA_LAST)
+#define PA_BUFFER_HEAD	(PA_LAST + 1)
+#define PA_ITEM_HEAD	(PA_LAST + 2)
+#define PA_DISK_CHILD	(PA_LAST + 3)
+
+static int _arginfo_b (const struct printf_info *info, size_t n, int *argtypes) {
+    if (n > 0)
+	argtypes[0] = PA_BUFFER_HEAD | PA_FLAG_PTR;
+    return 1;
+}
+
+static int _arginfo_K (const struct printf_info *info, size_t n, int *argtypes) {
+    if (n > 0)
+	argtypes[0] = PA_KEY | PA_FLAG_PTR;
+    return 1;
+}
+
+static int _arginfo_H (const struct printf_info *info, size_t n, int *argtypes) {
+    if (n > 0)
+	argtypes[0] = PA_ITEM_HEAD | PA_FLAG_PTR;
+    return 1;
+}
+
+static int _arginfo_y (const struct printf_info *info, size_t n, int *argtypes) {
+    if (n > 0)
+	argtypes[0] = PA_DISK_CHILD | PA_FLAG_PTR;
+    return 1;
+}
+
+static int _arginfo_M (const struct printf_info *info, size_t n, int *argtypes) {
+    if (n > 0)
+	argtypes[0] = PA_INT | PA_FLAG_SHORT | PA_FLAG_PTR;
+    return 1;
+}
+
+static int _arginfo_U (const struct printf_info *info, size_t n, int *argtypes) {
+    if (n > 0)
+	argtypes[0] = (PA_CHAR|PA_FLAG_PTR);
+    return 1;
+}
+
+/* %b */
+static int print_block_head (FILE * stream,
+			     const struct printf_info *info,
+			     const void *const *args)
+{
+    const reiserfs_bh_t * bh;
+
+    bh = *((const reiserfs_bh_t **)(args[0]));
+    return fprintf(stream, "level=%d, nr_items=%d, free_space=%d rdkey",
+		    reiserfs_node_level (bh), reiserfs_node_items (bh), 
+		    reiserfs_node_free (bh));
+}
+
+
+/* %K */
+static int print_short_key (FILE * stream,
+			    const struct printf_info *info,
+			    const void *const *args)
+{
+    const reiserfs_key_t * key;
+
+    key = *((const reiserfs_key_t **)(args[0]));
+    return fprintf(stream, "[%u %u]", reiserfs_key_get_did (key),
+		    reiserfs_key_get_oid (key));
+}
+
+
+/* %k */
+static int print_key (FILE * stream,
+		      const struct printf_info *info,
+		      const void *const *args)
+{
+    const reiserfs_key_t * key;
+
+    key = *((const reiserfs_key_t **)(args[0]));
+    return fprintf(stream, "[%u %u 0x%Lx %s (%d)]",  
+		    reiserfs_key_get_did (key), reiserfs_key_get_oid (key),
+		    (unsigned long long)reiserfs_key_get_off (key), 
+		    reiserfs_key_name (key), reiserfs_key_get_type (key));
+}
+
+
+/* %H */
+static int print_item_head (FILE * stream,
+			    const struct printf_info *info,
+			    const void *const *args)
+{
+    const reiserfs_ih_t * ih;
+
+    ih = *((const reiserfs_ih_t **)(args[0]));
+    return fprintf(stream, "%u %u 0x%Lx %s (%d), len %u, location "
+		   "%u entry count %u, fsck need %u, format %s",
+		   reiserfs_key_get_did (&ih->ih_key), 
+		   reiserfs_key_get_oid (&ih->ih_key),
+		    (unsigned long long)reiserfs_key_get_off (&ih->ih_key), 
+		    reiserfs_key_name (&ih->ih_key),
+		    reiserfs_key_get_type (&ih->ih_key), 
+		    reiserfs_ih_get_len (ih), reiserfs_ih_get_loc (ih),
+		    reiserfs_ih_get_entries (ih), reiserfs_ih_get_flags (ih),
+		    reiserfs_ih_get_format (ih) == KEY_FORMAT_2 ? "new" : 
+		    ((reiserfs_ih_get_format (ih) == KEY_FORMAT_1) ? "old" : "BAD"));
+}
+
+
+static int print_disk_child (FILE * stream,
+			     const struct printf_info *info,
+			     const void *const *args)
+{
+    const reiserfs_dc_t * dc;
+
+    dc = *((const reiserfs_dc_t **)(args[0]));
+    return fprintf(stream, "[dc_number=%u, dc_size=%u]", 
+		   reiserfs_dc_get_nr (dc), reiserfs_dc_get_size (dc));
+}
+
+static int rwx (FILE * stream, mode_t mode)
+{
+    return fprintf (stream, "%c%c%c",
+		    (mode & S_IRUSR) ? 'r' : '-',
+		    (mode & S_IWUSR) ? 'w' : '-',
+		    (mode & S_IXUSR) ? 'x' : '-');
+}
+
+
+/* %M */
+static int print_sd_mode (FILE * stream,
+			  const struct printf_info *info,
+			  const void *const *args)
+{
+    int len = 0;
+    __u16 mode;
+
+    mode = *(mode_t *)args[0];
+    len = fprintf (stream, "%c", misc_device_typec (mode));
+    len += rwx (stream, (mode & 0700) << 0);
+    len += rwx (stream, (mode & 0070) << 3);
+    len += rwx (stream, (mode & 0007) << 6);
+    return len;
+}
+
+/* %U */
+static int print_sd_uuid (FILE * stream,
+			  const struct printf_info *info,
+			  const void *const *args)
+{
+#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
+    const unsigned char *uuid = *((const unsigned char **)(args[0]));
+    char buf[37];
+
+    buf[36] = '\0';
+    uuid_unparse(uuid, buf);
+    return fprintf(stream, "%s", buf);
+#else
+    return fprintf(stream, "<no libuuid installed>");
+#endif
+}
+
+void reiserfs_warning (FILE * fp, const char * fmt, ...) 
+{
+    static int registered = 0;
+    va_list args;
+
+    if (!registered) {
+	registered = 1;
+	
+	register_printf_function ('K', print_short_key, _arginfo_K);
+	register_printf_function ('k', print_key, _arginfo_K);
+	register_printf_function ('H', print_item_head, _arginfo_H);
+	register_printf_function ('b', print_block_head, _arginfo_b);
+	register_printf_function ('y', print_disk_child, _arginfo_y);
+	register_printf_function ('M', print_sd_mode, _arginfo_M);
+	register_printf_function ('U', print_sd_uuid, _arginfo_U);
+    }
+
+    va_start (args, fmt);
+    vfprintf (fp, fmt, args);
+    va_end (args);
+}
+
diff --git a/libreiserfs/stat.c b/libreiserfs/stat.c
new file mode 100644
index 0000000..846b11e
--- /dev/null
+++ b/libreiserfs/stat.c
@@ -0,0 +1,219 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <time.h>
+
+/* access to fields of stat data (both v1 and v2) */
+
+static void reiserfs_stat_field (int field, 
+				 reiserfs_ih_t * ih, 
+				 void * sd,
+				 void * value, 
+				 int set)
+{
+    if (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) {
+	reiserfs_sd_v1_t * sd_v1 = sd;
+
+	switch (field) {
+	case STAT_MODE:
+	    if (set)
+		sd_v1->sd_mode = cpu_to_le16 (*(__u16 *)value);
+	    else
+		*(__u16 *)value = le16_to_cpu (sd_v1->sd_mode);
+	    break;
+
+	case STAT_SIZE:
+	    /* value must point to 64 bit int */
+	    if (set)
+		sd_v1->sd_size = cpu_to_le32 (*(__u64 *)value);
+	    else
+		*(__u64 *)value = le32_to_cpu (sd_v1->sd_size);
+	    break;
+
+	case STAT_BLOCKS:
+	    if (set)
+		sd_v1->u.sd_blocks = cpu_to_le32 (*(__u32 *)value);
+	    else
+		*(__u32 *)value = le32_to_cpu (sd_v1->u.sd_blocks);
+	    break;
+
+	case STAT_NLINK:
+	    /* value must point to 32 bit int */
+	    if (set)
+		sd_v1->sd_nlink = cpu_to_le16 (*(__u32 *)value);
+	    else
+		*(__u32 *)value = le16_to_cpu (sd_v1->sd_nlink);
+	    break;
+
+	case STAT_FDB:
+	    if (set)
+		sd_v1->sd_fdb = cpu_to_le32 (*(__u32 *)value);
+	    else
+		*(__u32 *)value = le32_to_cpu (sd_v1->sd_fdb);
+	    break;
+	    
+	default:
+	    reiserfs_panic ("reiserfs_stat_set: unknown field of old stat data");
+	}
+    } else {
+	reiserfs_sd_t * sd_v2 = sd;
+
+	switch (field) {
+	case STAT_MODE:
+	    if (set)
+		sd_v2->sd_mode = cpu_to_le16 (*(__u16 *)value);
+	    else
+		*(__u16 *)value = le16_to_cpu (sd_v2->sd_mode);
+	    break;
+
+	case STAT_SIZE:
+	    if (set)
+		sd_v2->sd_size = cpu_to_le64 (*(__u64 *)value);
+	    else
+		*(__u64 *)value = le64_to_cpu (sd_v2->sd_size);
+	    break;
+
+	case STAT_BLOCKS:
+	    if (set)
+		sd_v2->sd_blocks = cpu_to_le32 (*(__u32 *)value);
+	    else
+		*(__u32 *)value = le32_to_cpu (sd_v2->sd_blocks);
+	    break;
+
+	case STAT_NLINK:
+	    if (set)
+		sd_v2->sd_nlink = cpu_to_le32 (*(__u32 *)value);
+	    else
+		*(__u32 *)value = le32_to_cpu (sd_v2->sd_nlink);
+	    break;
+
+	case STAT_FDB:
+	default:
+	    reiserfs_panic ("reiserfs_stat_set: unknown field of new stat data");
+	}
+    }
+}
+
+void reiserfs_stat_set (int field, reiserfs_ih_t * ih, 
+			void * sd, void * value)
+{
+	reiserfs_stat_field(field, ih, sd, value, 1/*set*/);
+}
+
+void reiserfs_stat_get (int field, reiserfs_ih_t * ih, 
+			void * sd, void * value)
+{
+	reiserfs_stat_field(field, ih, sd, value, 0/*get*/);
+}
+
+
+/* prepare new or old stat data for the new directory */
+void reiserfs_stat_init (int blocksize, int key_format, 
+			 __u32 dirid, __u32 objectid, 
+			 reiserfs_ih_t * ih, void * sd)
+{
+    memset (ih, 0, REISERFS_IH_SIZE);
+    reiserfs_key_set_did (&ih->ih_key, dirid);
+    reiserfs_key_set_oid (&ih->ih_key, objectid);
+    reiserfs_key_set_off1 (&ih->ih_key, OFFSET_SD);
+    reiserfs_key_set_uni (&ih->ih_key, 0);
+
+    reiserfs_ih_set_format (ih, key_format);
+    reiserfs_ih_set_free (ih, MAX_US_INT);
+    
+    if (key_format == KEY_FORMAT_2) {
+        reiserfs_sd_t *sd_v2 = (reiserfs_sd_t *)sd;
+
+	reiserfs_ih_set_len (ih, REISERFS_SD_SIZE);
+        reiserfs_set_sd_v2_mode (sd_v2, S_IFDIR + 0755);
+        reiserfs_set_sd_v2_nlink (sd_v2, 2);
+        reiserfs_set_sd_v2_uid (sd_v2, 0);
+        reiserfs_set_sd_v2_gid (sd_v2, 0);
+        reiserfs_set_sd_v2_size (sd_v2, REISERFS_DIR_MIN);
+        reiserfs_set_sd_v2_atime (sd_v2, time(NULL));
+        sd_v2->sd_ctime = sd_v2->sd_mtime = sd_v2->sd_atime; /* all le */
+        reiserfs_set_sd_v2_rdev (sd_v2, 0);
+        reiserfs_set_sd_v2_blocks (sd_v2, REISERFS_DIR_BLOCKS (REISERFS_DIR_MIN));
+    }else{
+        reiserfs_sd_v1_t *sd_v1 = (reiserfs_sd_v1_t *)sd;
+
+	reiserfs_ih_set_len (ih, REISERFS_SD_SIZE_V1);
+        reiserfs_set_sd_v1_mode(sd_v1, S_IFDIR + 0755);
+        reiserfs_set_sd_v1_nlink(sd_v1, 2);
+        reiserfs_set_sd_v1_uid (sd_v1, 0);
+        reiserfs_set_sd_v1_gid (sd_v1, 0);
+        reiserfs_set_sd_v1_size(sd_v1, REISERFS_DIR_MIN_V1);
+        reiserfs_set_sd_v1_atime(sd_v1, time(NULL));
+        sd_v1->sd_ctime = sd_v1->sd_mtime = sd_v1->sd_atime; /* all le */
+        reiserfs_set_sd_v1_blocks(sd_v1, REISERFS_DIR_BLOCKS(REISERFS_DIR_MIN_V1));
+        reiserfs_set_sd_v1_fdb(sd_v1, REISERFS_SD_NODIRECT);
+    }
+}
+
+char timebuf[256];
+
+static char * timestamp (time_t t)
+{
+    strftime (timebuf, 256, "%d/%Y %T", localtime (&t));
+    return timebuf;
+}
+
+int reiserfs_print_stat_data (FILE * fp, reiserfs_bh_t * bh, 
+			      reiserfs_ih_t * ih, int alltimes)
+{
+    int retval;
+    
+
+    /* we cannot figure out if it is new stat data or old by key_format
+       macro. Stat data's key looks identical in both formats */
+    if (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) {
+        reiserfs_sd_v1_t * sd_v1 = 
+		(reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih);
+	
+	reiserfs_warning (fp, "(OLD SD), mode %M, size %u, nlink %u, uid %u, "
+			  "FDB %u, mtime %s blocks %u", 
+			  reiserfs_sd_v1_mode(sd_v1), 
+			  reiserfs_sd_v1_size(sd_v1), 
+			  reiserfs_sd_v1_nlink(sd_v1),
+			  reiserfs_sd_v1_uid(sd_v1), 
+			  reiserfs_sd_v1_fdb(sd_v1), 
+			  timestamp(reiserfs_sd_v1_mtime(sd_v1)), 
+			  reiserfs_sd_v1_blocks(sd_v1));
+	
+	retval = (S_ISLNK (reiserfs_sd_v1_mode(sd_v1))) ? 1 : 0;
+	
+        if (alltimes)
+            reiserfs_warning (fp, "%s %s\n", 
+			      timestamp (reiserfs_sd_v1_ctime(sd_v1)),
+			      timestamp (reiserfs_sd_v1_atime(sd_v1)));
+    } else {
+        reiserfs_sd_t * sd = (reiserfs_sd_t *)reiserfs_item_by_ih (bh, ih);
+	reiserfs_warning (fp, "(NEW SD), mode %M, size %Lu, nlink %u, mtime "
+			  "%s blocks %u, uid %u", reiserfs_sd_v2_mode(sd), 
+			  reiserfs_sd_v2_size(sd), reiserfs_sd_v2_nlink(sd), 
+			  timestamp (reiserfs_sd_v2_mtime(sd)), 
+			  reiserfs_sd_v2_blocks(sd), reiserfs_sd_v2_uid(sd));
+	
+	retval = (S_ISLNK (reiserfs_sd_v2_mode(sd))) ? 1 : 0;
+        if (alltimes)
+            reiserfs_warning (fp, "%s %s\n", 
+			      timestamp (reiserfs_sd_v2_ctime(sd)),
+			      timestamp (reiserfs_sd_v2_atime(sd)));
+    }
+
+    reiserfs_warning (fp, "\n");
+    return retval;
+}
+
+
diff --git a/libreiserfs/super.c b/libreiserfs/super.c
new file mode 100644
index 0000000..627a442
--- /dev/null
+++ b/libreiserfs/super.c
@@ -0,0 +1,192 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+int reiserfs_super_35_magic (reiserfs_sb_t * rs)
+{
+    return (!strncmp (rs->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING, 
+		      strlen ( REISERFS_3_5_SUPER_MAGIC_STRING)));
+}
+
+
+int reiserfs_super_36_magic (reiserfs_sb_t * rs)
+{
+    return (!strncmp (rs->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING, 
+		      strlen ( REISERFS_3_6_SUPER_MAGIC_STRING)));
+}
+
+
+int reiserfs_super_jr_magic (reiserfs_sb_t * rs)
+{
+    return (!strncmp (rs->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, 
+		      strlen ( REISERFS_JR_SUPER_MAGIC_STRING)));
+}
+
+
+int reiserfs_super_magic (reiserfs_sb_t * rs)
+{
+    if (reiserfs_super_35_magic (rs) ||
+	reiserfs_super_36_magic (rs) ||
+	reiserfs_super_jr_magic (rs))
+	return 1;
+    return 0;
+}
+
+
+int reiserfs_super_format (reiserfs_sb_t * sb)
+{
+    /* after conversion to 3.6 format we change magic correctly, 
+       but do not change sb_format. When we create non-standard journal 
+       field format in sb get adjusted correctly. Thereby, for standard 
+       journal we should rely on magic and for non-standard - on format */
+    if (reiserfs_super_35_magic (sb) ||
+	(reiserfs_super_jr_magic (sb) && 
+	 reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_5))
+	return REISERFS_FORMAT_3_5;
+
+    if (reiserfs_super_36_magic (sb) ||
+	(reiserfs_super_jr_magic (sb) &&
+	 reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6))
+	return REISERFS_FORMAT_3_6;
+
+    return REISERFS_FORMAT_UNKNOWN;
+}
+
+int reiserfs_super_size (reiserfs_sb_t * sb)
+{
+    switch (reiserfs_super_format (sb)) {
+    case REISERFS_FORMAT_3_5:
+	return REISERFS_SB_SIZE_V1;
+    case REISERFS_FORMAT_3_6:
+	return REISERFS_SB_SIZE;
+    }
+    reiserfs_panic ("Unknown format found");
+    return 0;
+}
+
+/* this one had signature in different place of the super_block
+   structure */
+int reiserfs_super_prejournaled (reiserfs_sb_t * rs)
+{
+    return (!strncmp((char*)rs + REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ,
+		     REISERFS_3_5_SUPER_MAGIC_STRING,
+		     strlen(REISERFS_3_5_SUPER_MAGIC_STRING)));
+}
+
+int reiserfs_super_valid(reiserfs_bh_t *bh) {
+    reiserfs_sb_t *sb;
+
+    sb = (reiserfs_sb_t *)bh->b_data;
+    
+    if (!reiserfs_super_magic (sb))
+    	return 0;
+    
+    if (!reiserfs_fs_blksize_check(reiserfs_sb_get_blksize (sb)))
+	return 0;
+	
+    return 1;
+}
+
+/* return 1 if this is not super block */
+int reiserfs_super_print (FILE * fp, 
+			  reiserfs_filsys_t * fs, 
+			  char * file_name,
+			  reiserfs_bh_t * bh, 
+			  int short_print)
+{
+    reiserfs_sb_t * sb = (reiserfs_sb_t *)(bh->b_data);
+    int format = 0;
+    __u16 state;
+
+    if (!reiserfs_super_valid(bh))
+	return 1;
+
+    /* Print volume label if it is non-empty. */
+    if (sb->s_label[0])
+	    reiserfs_warning (fp, "%s: ", sb->s_label);
+    else
+	    reiserfs_warning (fp, "%s: ", fs->fs_file_name);
+    
+    reiserfs_warning (fp, "Reiserfs super block in block %lu on %s of ",
+		      bh->b_blocknr, fs->fs_file_name);
+    switch (reiserfs_super_format (sb)) {
+    case REISERFS_FORMAT_3_5:
+	reiserfs_warning (fp, "format 3.5 with ");
+        format = 1;
+	break;
+    case REISERFS_FORMAT_3_6:
+	reiserfs_warning (fp, "format 3.6 with ");
+        format = 2;
+	break;
+    default:
+	reiserfs_warning (fp, "unknown format with ");
+	break;
+    }
+    if (reiserfs_super_jr_magic (sb))
+	reiserfs_warning (fp, "non-");
+    reiserfs_warning (fp, "standard journal\n");
+    if (short_print) {
+	reiserfs_warning (fp, "Blocks (total/free): %u/%u by %d bytes\n",
+		reiserfs_sb_get_blocks (sb), reiserfs_sb_get_free (sb), reiserfs_sb_get_blksize (sb));
+    } else {
+	reiserfs_warning (fp, "Count of blocks on the device: %u\n", reiserfs_sb_get_blocks (sb));
+	reiserfs_warning (fp, "Number of bitmaps: %u\n", reiserfs_sb_get_bmaps (sb));
+	reiserfs_warning (fp, "Blocksize: %d\n", reiserfs_sb_get_blksize (sb));
+	reiserfs_warning (fp, "Free blocks (count of blocks - used [journal, "
+		      "bitmaps, data, reserved] blocks): %u\n", reiserfs_sb_get_free (sb));
+	reiserfs_warning (fp, "Root block: %u\n", reiserfs_sb_get_root (sb));
+    }
+    reiserfs_warning (fp, "Filesystem is %sclean\n",
+		      (reiserfs_sb_get_umount (sb) == FS_CLEANLY_UMOUNTED) ? "" : "NOT ");
+
+    if (short_print)
+    	return 0;
+    reiserfs_warning (fp, "Tree height: %d\n", reiserfs_sb_get_height (sb));
+    reiserfs_warning (fp, "Hash function used to sort names: %s\n",
+		      reiserfs_hash_name (reiserfs_sb_get_hash (sb)));
+    reiserfs_warning (fp, "Objectid map size %d, max %d\n", reiserfs_sb_get_mapcur (sb),
+		      reiserfs_sb_get_mapmax (sb));
+    reiserfs_warning (fp, "Journal parameters:\n");
+    reiserfs_journal_print_params (fp, reiserfs_sb_jp (sb));
+    reiserfs_warning (fp, "Blocks reserved by journal: %u\n",
+		      reiserfs_sb_get_reserved (sb));
+    state = reiserfs_sb_get_state (sb);
+    reiserfs_warning (fp, "Fs state field: 0x%x:\n", state);
+    if ((state & FS_FATAL) == FS_FATAL)
+	reiserfs_warning (fp, "\tFATAL corruptions exist.\n");
+    if ((state & FS_ERROR) == FS_ERROR)
+	reiserfs_warning (fp, "\t some corruptions exist.\n");
+    if ((state & IO_ERROR) == IO_ERROR)
+	reiserfs_warning (fp, "\tI/O corruptions exist.\n");
+
+    reiserfs_warning (fp, "sb_version: %u\n", reiserfs_sb_get_version (sb));
+    if (format == 2) {
+        reiserfs_warning (fp, "inode generation number: %u\n", reiserfs_sb_get_gen (sb));
+        reiserfs_warning (fp, "UUID: %U\n", sb->s_uuid);
+        reiserfs_warning (fp, "LABEL: %.16s\n", sb->s_label);
+        reiserfs_warning (fp, "Set flags in SB:\n");
+	if ((reiserfs_sb_isflag (sb, reiserfs_attrs_cleared)))
+	    reiserfs_warning (fp, "\tATTRIBUTES CLEAN\n");
+    }
+
+    return 0;
+}
+
+
+void reiserfs_super_print_state (FILE * fp, reiserfs_filsys_t * fs)
+{
+    reiserfs_warning (fp, "\nFilesystem state: ");
+    if (reiserfs_sb_state_ok (fs))
+	reiserfs_warning (fp, "consistent\n\n");
+    else
+	reiserfs_warning (fp, "consistency is not checked after last mounting\n\n");
+}
+
+
diff --git a/libreiserfs/tree.c b/libreiserfs/tree.c
new file mode 100644
index 0000000..19d1422
--- /dev/null
+++ b/libreiserfs/tree.c
@@ -0,0 +1,963 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+#include "misc/unaligned.h"
+#include "misc/malloc.h"
+
+static int reiserfs_tree_search (reiserfs_filsys_t * fs, 
+				 const reiserfs_key_t * key,
+				 reiserfs_path_t * path, 
+				 misc_comp_func_t comp_func)
+{
+    reiserfs_bh_t * bh;   
+    unsigned long block;
+    reiserfs_path_element_t * curr;
+    int retval;
+    
+
+    block = reiserfs_sb_get_root (fs->fs_ondisk_sb);
+    if (reiserfs_fs_block(fs, block) != BT_UNKNOWN)
+	return IO_ERROR;
+    
+    path->path_length = REISERFS_PATH_OFFILL;
+    while (1) {
+	curr = REISERFS_PATH_ELEM (path, ++ path->path_length);
+	bh = curr->pe_buffer = reiserfs_buffer_read (fs->fs_dev, block, 
+						     fs->fs_blocksize);
+        if (bh == 0) {
+	    path->path_length --;
+	    reiserfs_tree_pathrelse (path);
+	    return ITEM_NOT_FOUND;
+	}
+	
+	retval = misc_bin_search (key, reiserfs_ih_key_at (bh, 0), 
+				  reiserfs_node_items (bh),
+				  reiserfs_leaf_head (bh) ? 
+				  REISERFS_IH_SIZE : REISERFS_KEY_SIZE,
+				  &(curr->pe_position), comp_func);
+	
+	if (retval == 1) {
+	    /* key found, return if this is leaf level */
+	    if (reiserfs_leaf_head (bh)) {
+		path->pos_in_item = 0;
+		return ITEM_FOUND;
+	    }
+	    curr->pe_position ++;
+	} else {
+	    /* key not found in the node */
+	    if (reiserfs_leaf_head (bh))
+		return ITEM_NOT_FOUND;
+	}
+	
+	block = reiserfs_dc_get_nr (reiserfs_int_at (bh, curr->pe_position));
+	
+	if (reiserfs_fs_block(fs, block) != BT_UNKNOWN)
+		return IO_ERROR;
+    }
+    
+    printf ("reiserfs_tree_search: you can not get here\n");
+    return ITEM_NOT_FOUND;
+}
+
+int reiserfs_tree_search_body (reiserfs_filsys_t * fs, 
+			       const reiserfs_key_t * key,
+			       reiserfs_path_t * path)
+{
+    return reiserfs_tree_search (fs, key, path, reiserfs_key_comp3);
+}
+
+
+int reiserfs_tree_search_item (reiserfs_filsys_t * fs, 
+			       const reiserfs_key_t * key,
+			       reiserfs_path_t * path)
+{
+    return reiserfs_tree_search (fs, key, path, reiserfs_key_comp);
+}
+
+
+/* key is key of byte in the regular file. This searches in tree
+   through items and in the found item as well */
+int reiserfs_tree_search_position (reiserfs_filsys_t * fs, 
+				   const reiserfs_key_t * key,
+				   reiserfs_path_t * path)
+{
+    const reiserfs_key_t * next_key;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+
+    if (reiserfs_tree_search_body (fs, key, path) == ITEM_FOUND) {
+    	ih = REISERFS_PATH_IH (path);
+
+	if (!reiserfs_ih_direct (ih) && !reiserfs_ih_ext (ih))
+	    return DIRECTORY_FOUND;
+
+	path->pos_in_item = 0;
+	return POSITION_FOUND;
+    }
+
+    bh = REISERFS_PATH_LEAF (path);
+    ih = REISERFS_PATH_IH (path);
+
+    if (REISERFS_PATH_LEAF_POS (path) == 0) {
+	/* previous item does not exist, that means we are in leftmost leaf of
+	 * the tree */
+	if (!reiserfs_key_comp2 (&ih->ih_key, key)) {
+	    if (!reiserfs_ih_direct (ih) && !reiserfs_ih_ext (ih))
+		return DIRECTORY_FOUND;
+	    return POSITION_NOT_FOUND;
+	}
+	return FILE_NOT_FOUND;
+    }
+
+    /* take previous item */
+    REISERFS_PATH_LEAF_POS (path) --;
+    ih --;
+
+    if (reiserfs_key_comp2 (&ih->ih_key, key) || reiserfs_ih_stat(ih)) {
+	/* previous item belongs to another object or is a stat data, check
+	 * next item */
+	REISERFS_PATH_LEAF_POS (path) ++;
+	if (REISERFS_PATH_LEAF_POS (path) < reiserfs_node_items (bh))
+	    /* next key is in the same node */
+	    next_key = reiserfs_ih_key_at (bh, REISERFS_PATH_LEAF_POS (path));
+	else
+	    next_key = reiserfs_tree_rkey (path, fs);
+	if (next_key == 0 || reiserfs_key_comp2 (next_key, key)) {
+	    /* there is no any part of such file in the tree */
+	    path->pos_in_item = 0;
+	    return FILE_NOT_FOUND;
+	}
+
+	if (reiserfs_key_dir (next_key)) {
+	    reiserfs_warning (stderr, "reiserfs_tree_search_position: looking "
+			      "for %k found a directory with the same key\n",
+			      next_key);
+	    
+	    return DIRECTORY_FOUND;
+	}
+
+	/* next item is the part of this file */
+	path->pos_in_item = 0;
+	return POSITION_NOT_FOUND;
+    }
+
+    if (reiserfs_ih_dir (ih)) {
+	return DIRECTORY_FOUND;
+    }
+
+    if (reiserfs_ih_stat(ih)) {
+	REISERFS_PATH_LEAF_POS (path) ++;
+	return FILE_NOT_FOUND;
+    }
+
+    /* previous item is part of desired file */
+    if (reiserfs_item_has_key (ih, key, bh->b_size)) {
+	path->pos_in_item = reiserfs_key_get_off (key) - 
+		reiserfs_key_get_off (&ih->ih_key);
+	
+	if (reiserfs_ih_ext (ih) )
+	    path->pos_in_item /= bh->b_size;
+	return POSITION_FOUND;
+    }
+
+    path->pos_in_item = reiserfs_ih_ext (ih) ? reiserfs_ext_count (ih) : 
+	    reiserfs_ih_get_len (ih);
+    
+    return POSITION_NOT_FOUND;
+}
+
+const reiserfs_key_t * reiserfs_tree_lkey (reiserfs_path_t * path, 
+					   reiserfs_filsys_t * fs)
+{
+    int pos, offset = path->path_length;
+    reiserfs_bh_t * bh;
+    reiserfs_sb_t * sb;
+
+    sb = fs->fs_ondisk_sb;
+    
+    if (offset < REISERFS_PATH_OFFINIT)
+	misc_die ("reiserfs_tree_lkey: illegal offset in the path (%d)", offset);
+
+    /* While not higher in path than first element. */
+    while (offset-- > REISERFS_PATH_OFFINIT) {
+	if (! reiserfs_buffer_uptodate (REISERFS_PATH_BUFFER (path, offset)) )
+	    misc_die ("reiserfs_tree_lkey: parent is not uptodate");
+	
+	/* Parent at the path is not in the tree now. */
+	if (! REISERFS_NODE_INTREE (bh = REISERFS_PATH_BUFFER (path, offset)))
+	    misc_die ("reiserfs_tree_lkey: buffer on the path is not in tree");
+
+	/* Check whether position in the parent is correct. */
+	if ((pos = REISERFS_PATH_POS (path, offset)) > reiserfs_node_items (bh))
+	    misc_die ("reiserfs_tree_lkey: invalid position (%d) in the path", pos);
+
+	/* Check whether parent at the path really points to the child. */
+	if (reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)) != 
+	    REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr)
+	{
+	    misc_die ("reiserfs_tree_lkey: invalid block number (%d). Must be %ld",
+		 reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)), 
+		 REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr);
+	}
+	
+	/* Return delimiting key if position in the parent is not equal to zero. */
+	if (pos) return reiserfs_int_key_at(bh, pos - 1);
+    }
+
+    /* Return MIN_KEY if we are in the root of the buffer tree. */
+    if ( REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr
+	 != reiserfs_sb_get_root (sb) )
+    {
+	misc_die("reiserfs_tree_lkey: invalid root block number (%lu). Must be (%u).",
+		 REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr,
+		 reiserfs_sb_get_root (sb));
+    }
+    
+    /* there is no left delimiting key */
+    return &MIN_KEY;
+}
+
+const reiserfs_key_t * reiserfs_tree_rkey (reiserfs_path_t * path,
+					   reiserfs_filsys_t * fs)
+{
+    int pos, offset = path->path_length;
+    reiserfs_bh_t * bh;
+    reiserfs_sb_t * sb;
+
+    sb = fs->fs_ondisk_sb;
+    
+    if (offset < REISERFS_PATH_OFFINIT)
+	misc_die ("reiserfs_tree_rkey: illegal offset in the path (%d)", offset);
+
+    while (offset-- > REISERFS_PATH_OFFINIT) {
+	if (! reiserfs_buffer_uptodate (REISERFS_PATH_BUFFER (path, offset)))
+	    misc_die ("reiserfs_tree_rkey: parent is not uptodate");
+
+	/* Parent at the path is not in the tree now. */
+	if (! REISERFS_NODE_INTREE (bh = REISERFS_PATH_BUFFER (path, offset)))
+	    misc_die ("reiserfs_tree_rkey: buffer on the path is not in tree");
+
+	/* Check whether position in the parrent is correct. */
+	if ((pos = REISERFS_PATH_POS (path, offset)) > reiserfs_node_items (bh))
+	    misc_die ("reiserfs_tree_rkey: invalid position (%d) in the path", pos);
+
+	/* Check whether parent at the path really points to the child. */
+	if (reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)) != 
+	    REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr)
+	{
+	    misc_die ("reiserfs_tree_rkey: invalid block number (%d). Must be %ld",
+		      reiserfs_dc_get_nr (reiserfs_int_at (bh, pos)), 
+		      REISERFS_PATH_BUFFER (path, offset + 1)->b_blocknr);
+	}
+	
+	/* Return delimiting key if position in the parent is not the 
+	   last one. */
+	if (pos != reiserfs_node_items (bh))
+	    return reiserfs_int_key_at (bh, pos);
+    }
+    
+    /* Return MAX_KEY if we are in the root of the buffer tree. */
+    if ( REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr !=
+	 reiserfs_sb_get_root (sb) )
+    {
+	misc_die ("reiserfs_tree_rkey: invalid root block number (%lu). Must be (%u).",
+		  REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFINIT)->b_blocknr,
+		  reiserfs_sb_get_root (sb));
+    }
+    
+    /* there is no right delimiting key */
+    return &MAX_KEY;
+}
+
+const reiserfs_key_t *reiserfs_tree_next_key(reiserfs_path_t *path, 
+					     reiserfs_filsys_t *fs) 
+{
+    if (REISERFS_PATH_LEAF_POS (path) < 
+	reiserfs_node_items (REISERFS_PATH_LEAF (path)) - 1)
+    {
+	return reiserfs_ih_key_at(REISERFS_PATH_LEAF (path), 
+				  REISERFS_PATH_LEAF_POS (path) + 1);
+    }
+
+    return reiserfs_tree_rkey (path, fs);
+}
+
+static int comp_dir_entries (const void * p1, const void * p2) {
+    __u32 off1, off2;
+
+    off1 = d32_get((__u32 *)p1, 0);
+    off2 = *(__u32 *)p2;
+    
+    if (off1 < off2)
+	return -1;
+    if (off1 > off2)
+	return 1;
+    return 0;
+}
+
+
+/* NOTE: this only should be used to look for keys who exists */
+int reiserfs_tree_search_entry (reiserfs_filsys_t * fs, 
+				const reiserfs_key_t * key, 
+				reiserfs_path_t * path)
+{
+    reiserfs_bh_t * bh;
+    int item_pos;
+    reiserfs_ih_t * ih;
+    reiserfs_key_t tmpkey;
+    __u32 offset;
+
+    if (reiserfs_tree_search_item (fs, key, path) == ITEM_FOUND) {
+        path->pos_in_item = 0;
+        return POSITION_FOUND;
+    }
+
+    bh = REISERFS_PATH_LEAF (path);
+    item_pos = REISERFS_PATH_LEAF_POS (path);
+    ih = REISERFS_PATH_IH (path);
+
+    if (item_pos == 0) {
+	/* key is less than the smallest key in the tree */
+	if (reiserfs_key_comp2 (&(ih->ih_key), key))
+	    /* there are no items of that directory */
+	    return DIRECTORY_NOT_FOUND;
+
+	if (!reiserfs_ih_dir (ih)) {
+	    reiserfs_panic ("reiserfs_tree_search_entry: found item "
+			    "is not of directory type %H", ih);
+	}
+
+	/* key we looked for should be here */
+        path->pos_in_item = 0;
+	return POSITION_NOT_FOUND;
+    }
+
+    /* take previous item */
+    item_pos --;
+    ih --;
+    REISERFS_PATH_LEAF_POS (path) --;
+
+    if (reiserfs_key_comp2 (&(ih->ih_key), key) || !reiserfs_ih_dir (ih)) {
+        /* previous item belongs to another object or is stat data, check next
+           item */
+
+	item_pos ++;
+	REISERFS_PATH_LEAF_POS (path) ++;
+
+        if (item_pos < reiserfs_node_items (bh)) {
+	    /* next item is in the same node */
+	    ih ++;
+            if (reiserfs_key_comp2 (&(ih->ih_key), key)) {
+		/* there are no items of that directory */
+                path->pos_in_item = 0;
+                return DIRECTORY_NOT_FOUND;
+            }
+
+            if (!reiserfs_ih_dir (ih))
+		reiserfs_panic ("reiserfs_tree_search_entry: %k is not a directory",
+				key);
+        } else {
+	    /* next item is in right neighboring node */
+            const reiserfs_key_t * next_key = reiserfs_tree_rkey (path, fs);
+
+            if (next_key == 0 || reiserfs_key_comp2 (next_key, key)) {
+                /* there are no items of that directory */
+                path->pos_in_item = 0;
+                return DIRECTORY_NOT_FOUND;
+            }
+
+            if (!reiserfs_key_dir (next_key))
+		reiserfs_panic ("reiserfs_tree_search_entry: %k is not a directory",
+				key);
+
+            /* we got right delimiting key - search for it - the entry will be
+	       pasted in position 0 */
+            reiserfs_key_copy (&tmpkey, next_key);
+            reiserfs_tree_pathrelse (path);
+            if (reiserfs_tree_search_item (fs, &tmpkey, path) != ITEM_FOUND || 
+		REISERFS_PATH_LEAF_POS (path) != 0)
+	    {
+                reiserfs_panic ("reiserfs_tree_search_entry: item "
+				"corresponding to delimiting key %k "
+				"not found", &tmpkey);
+	    }
+        }
+
+        /* next item is the part of this directory */
+        path->pos_in_item = 0;
+        return POSITION_NOT_FOUND;
+    }
+
+    /* previous item is part of desired directory */
+    offset = reiserfs_key_get_off1 (key);
+    if (misc_bin_search (&offset, reiserfs_deh (bh, ih), 
+			     reiserfs_ih_get_entries (ih),
+			     REISERFS_DEH_SIZE, &(path->pos_in_item), 
+			     comp_dir_entries) == 1)
+    {
+	return POSITION_FOUND;
+    }
+
+    return POSITION_NOT_FOUND;
+}
+
+int reiserfs_tree_delete_entry (reiserfs_filsys_t * fs, reiserfs_key_t * key)
+{
+    reiserfs_path_t path;
+    reiserfs_tb_t tb;
+    reiserfs_ih_t * ih;
+    reiserfs_deh_t * deh;
+    int entry_len;
+
+    if (reiserfs_tree_search_entry (fs, key, &path) != POSITION_FOUND) {
+	reiserfs_tree_pathrelse (&path);
+	return 1;
+    }
+
+    ih = REISERFS_PATH_IH (&path);
+    if (reiserfs_ih_get_entries (ih) == 1) {
+	
+	reiserfs_tb_init (&tb, fs, &path, 
+			  -(REISERFS_IH_SIZE + reiserfs_ih_get_len (ih)));
+	
+	if (reiserfs_fix_nodes (M_DELETE, &tb, 0) != CARRY_ON) {
+	    reiserfs_unfix_nodes (&tb);
+	    return 1;
+	}
+	reiserfs_tb_balance (&tb, 0, 0, M_DELETE, 0);
+	return 0;
+    }
+
+    deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), ih) + path.pos_in_item;
+    entry_len = reiserfs_direntry_entry_len (ih, deh, path.pos_in_item);
+    reiserfs_tb_init (&tb, fs, &path, -(REISERFS_DEH_SIZE + entry_len));
+    
+    if (reiserfs_fix_nodes (M_CUT, &tb, 0) != CARRY_ON) {
+	reiserfs_unfix_nodes (&tb);
+	return 1;
+    }
+    reiserfs_tb_balance (&tb, 0, 0, M_CUT, 0);
+    return 0;
+}
+
+static void free_unformatted_nodes (reiserfs_filsys_t * fs, 
+				    reiserfs_path_t * path, 
+				    int start, int end)
+{
+    __u32 * item = REISERFS_PATH_ITEM(path); 
+    unsigned int i;
+
+    for (i = start; i < end; i ++) {
+        __u32 unfm = d32_get (item, i);
+	
+	if (unfm != 0)
+	    reiserfs_node_forget(fs, unfm);
+    }
+}
+
+void reiserfs_tree_delete (reiserfs_filsys_t * fs, 
+			   reiserfs_path_t * path, 
+			   int temporary) 
+{
+    reiserfs_tb_t tb;
+    reiserfs_ih_t * ih = REISERFS_PATH_IH (path);
+    
+    if (reiserfs_ih_ext (ih) && !temporary)
+	free_unformatted_nodes (fs, path, 0, reiserfs_ext_count (ih));
+
+    reiserfs_tb_init (&tb, fs, path, 
+		      -(REISERFS_IH_SIZE + reiserfs_ih_get_len(ih)));
+
+    if (reiserfs_fix_nodes (M_DELETE, &tb, 0/*ih*/) != CARRY_ON)
+	misc_die ("reiserfs_tree_delete: reiserfs_fix_nodes failed");
+    
+    reiserfs_tb_balance (&tb, 0, 0, M_DELETE, 0/*zero num*/);
+}
+
+void reiserfs_tree_delete_unit (reiserfs_filsys_t *fs, 
+				reiserfs_path_t * path, 
+				int cut_size)
+{
+    reiserfs_ih_t * ih = REISERFS_PATH_IH (path);
+    reiserfs_tb_t tb;
+
+    if (cut_size >= 0) {
+	misc_die ("reiserfs_tree_delete_unit: cut size == %d", cut_size);
+    }
+
+    if (reiserfs_ih_ext (ih)) 
+	free_unformatted_nodes(fs, path, (reiserfs_ih_get_len(ih) + cut_size) / 
+			       REISERFS_EXT_SIZE, reiserfs_ext_count (ih));
+
+    reiserfs_tb_init (&tb, fs, path, cut_size);
+
+    if (reiserfs_fix_nodes (M_CUT, &tb, 0) != CARRY_ON)
+	misc_die ("reiserfs_tree_delete_unit: reiserfs_fix_nodes failed");
+
+    reiserfs_tb_balance (&tb, 0, 0, M_CUT, 0/*zero num*/);
+}
+
+void reiserfs_tree_insert_unit (reiserfs_filsys_t * fs, 
+				reiserfs_path_t * path,
+				const void * body, int size)
+{
+    reiserfs_tb_t tb;
+  
+    reiserfs_tb_init (&tb, fs, path, size);
+
+    if (reiserfs_fix_nodes (M_PASTE, &tb, 0/*ih*/) != CARRY_ON)
+	reiserfs_panic ("reiserfs_tree_insert_unit: "
+			"reiserfs_fix_nodes failed");
+
+    reiserfs_tb_balance (&tb, 0, body, M_PASTE, 0/*zero num*/);
+}
+
+void reiserfs_tree_insert (reiserfs_filsys_t * fs, 
+			   reiserfs_path_t * path,
+			   reiserfs_ih_t * ih, 
+			   const void * body)
+{
+    reiserfs_tb_t tb;
+    
+    reiserfs_tb_init (&tb, fs, path, REISERFS_IH_SIZE + 
+		      reiserfs_ih_get_len(ih));
+    
+    if (reiserfs_fix_nodes (M_INSERT, &tb, ih) != CARRY_ON)
+	misc_die ("reiserfs_tree_insert: reiserfs_fix_nodes failed");
+
+    reiserfs_tb_balance (&tb, ih, body, M_INSERT, 0/*zero num*/);
+}
+
+/* if name is found in a directory - return 1 and set path to the name,
+   otherwise return 0 and reiserfs_tree_pathrelse path */
+int reiserfs_tree_scan_name (reiserfs_filsys_t * fs, 
+			     reiserfs_key_t * dir, 
+			     char * name,
+			     reiserfs_path_t * path)
+{
+    const reiserfs_key_t * rdkey;
+    reiserfs_key_t entry_key;
+    reiserfs_deh_t * deh;
+    reiserfs_ih_t * ih;
+    int i, retval;
+    
+    reiserfs_key_set_did (&entry_key, reiserfs_key_get_did (dir));
+    reiserfs_key_set_oid (&entry_key, reiserfs_key_get_oid (dir));
+    reiserfs_key_set_off1 (&entry_key, 0);
+    reiserfs_key_set_uni (&entry_key, UNI_DE);
+
+ 
+    if (reiserfs_tree_search_entry (fs, &entry_key, path) == 
+	DIRECTORY_NOT_FOUND) 
+    {
+	reiserfs_tree_pathrelse (path);
+	return 0;
+    }
+
+    do {
+	ih = REISERFS_PATH_IH (path);
+	deh = reiserfs_deh (REISERFS_PATH_LEAF (path), ih) + path->pos_in_item;
+	for (i = path->pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++)
+	{
+	    /* the name in directory has the same hash as the given name */
+	    if ((reiserfs_direntry_name_len (ih, deh, i) == 
+		 (int)strlen (name)) &&
+		!memcmp (reiserfs_deh_name (deh, i), name, strlen (name))) 
+	    {
+		path->pos_in_item = i;
+		return 1;
+	    }
+	}
+
+	rdkey = reiserfs_tree_rkey (path, fs);
+	if (!rdkey || reiserfs_key_comp2 (rdkey, dir)) {
+	    reiserfs_tree_pathrelse (path);
+	    return 0;
+	}
+	
+	if (!reiserfs_key_dir (rdkey))
+	    reiserfs_panic ("reiserfs_tree_scan_name: can not find name in "
+			    "broken directory yet");
+
+	/* first name of that item may be a name we are looking for */
+	entry_key = *rdkey;
+	reiserfs_tree_pathrelse (path);
+	retval = reiserfs_tree_search_entry (fs, &entry_key, path);
+	
+	if (retval != POSITION_FOUND)
+	    reiserfs_panic ("reiserfs_tree_scan_name: wrong delimiting "
+			    "key in the tree");
+    } while (1);
+
+    return 0;
+}
+
+
+/* returns 0 if name is not found in a directory and 1 if name is
+   found. Stores key found in the entry in 'key'. Returns minimal not used
+   generation counter in 'min_gen_counter'. dies if found object is not a
+   directory. */
+int reiserfs_tree_search_name (reiserfs_filsys_t * fs, 
+			       const reiserfs_key_t * dir, 
+			       char * name, 
+			       unsigned int * min_gen_counter, 
+			       reiserfs_key_t * key)
+{
+    const reiserfs_key_t * rdkey;
+    reiserfs_key_t entry_key;
+    REISERFS_PATH_INIT (path);
+    reiserfs_deh_t * deh;
+    reiserfs_ih_t * ih;
+    __u32 hash;
+    int retval;
+    int i;
+
+
+    reiserfs_key_set_did (&entry_key, reiserfs_key_get_did (dir));
+    reiserfs_key_set_oid (&entry_key, reiserfs_key_get_oid (dir));
+    if (!strcmp (name, "."))
+	hash = OFFSET_DOT;
+    else if (!strcmp (name, ".."))
+	hash = OFFSET_DOT_DOT;
+    else
+	hash = reiserfs_hash_value (fs->hash, name, strlen (name));
+    reiserfs_key_set_off1 (&entry_key, hash);
+    reiserfs_key_set_uni (&entry_key, UNI_DE);
+
+    *min_gen_counter = 0;
+
+    if (reiserfs_tree_search_entry (fs, &entry_key, &path) == 
+	DIRECTORY_NOT_FOUND) 
+    {
+	reiserfs_tree_pathrelse (&path);
+	return 0;
+    }
+	
+    do {
+	ih = REISERFS_PATH_IH (&path);
+	deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), ih) + path.pos_in_item;
+	for (i = path.pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	    if (OFFSET_HASH (reiserfs_deh_get_off (deh)) != OFFSET_HASH (hash))
+	    {
+		/* all entries having the same hash were scanned */
+		reiserfs_tree_pathrelse (&path);
+		return 0;
+	    }
+			
+	    if (OFFSET_GEN (reiserfs_deh_get_off (deh)) == 
+		*min_gen_counter)
+	    {
+		(*min_gen_counter) ++;
+	    }
+			
+	    if ((reiserfs_direntry_name_len (ih, deh, i) == 
+		 (int)strlen (name)) &&
+	        (!memcmp (reiserfs_deh_name (deh, i), name, strlen (name)))) 
+	    {
+		/* entry found in the directory */
+		if (key) {
+		    memset (key, 0, sizeof (reiserfs_key_t));
+		    reiserfs_key_set_did (key, reiserfs_deh_get_did (deh));
+		    reiserfs_key_set_oid (key, reiserfs_deh_get_obid (deh));
+		}
+		reiserfs_tree_pathrelse (&path);
+		return 1;//reiserfs_deh_get_obid (deh) ? reiserfs_deh_get_obid (deh) : 1;
+	    }
+	}
+		
+	rdkey = reiserfs_tree_rkey (&path, fs);
+	if (!rdkey || reiserfs_key_comp2 (rdkey, dir)) {
+	    reiserfs_tree_pathrelse (&path);
+	    return 0;
+	}
+		
+	if (!reiserfs_key_dir (rdkey))
+	    reiserfs_panic ("reiserfs_tree_search_name: can not find name "
+			    "in broken directory yet");
+		
+	/* next item is the item of the directory we are looking name in */
+	if (OFFSET_HASH (reiserfs_key_get_off (rdkey)) != hash) {
+	    /* but there is no names with given hash */
+	    reiserfs_tree_pathrelse (&path);
+	    return 0;
+	}
+		
+	/* first name of that item may be a name we are looking for */
+	entry_key = *rdkey;
+	reiserfs_tree_pathrelse (&path);
+	retval = reiserfs_tree_search_entry (fs, &entry_key, &path);
+	if (retval != POSITION_FOUND)
+	    reiserfs_panic ("reiserfs_tree_search_name: wrong delimiting "
+			    "key in the tree");
+		
+    } while (1);
+    
+    return 0;
+}
+
+
+/* compose directory entry: dir entry head and name itself */
+static char * make_entry (char * entry, char * name, 
+			  const reiserfs_key_t * key, 
+			  __u32 offset)
+{
+    reiserfs_deh_t * deh;
+    __u16 state;
+	
+    if (!entry)
+	entry = misc_getmem (REISERFS_DEH_SIZE + MISC_ROUND_UP (strlen (name)));
+
+    memset (entry, 0, REISERFS_DEH_SIZE + MISC_ROUND_UP (strlen (name)));
+    deh = (reiserfs_deh_t *)entry;
+	
+    reiserfs_deh_set_loc (deh, 0);
+    reiserfs_deh_set_off (deh, offset);
+    state = (1 << DEH_Visible2);
+    reiserfs_deh_set_state (deh, state);
+	
+    /* key of object entry will point to */
+    reiserfs_deh_set_did (deh, reiserfs_key_get_did (key));
+    reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (key));
+	
+    memcpy ((char *)(deh + 1), name, strlen (name));
+    return entry;
+}
+
+/* add new name into a directory. If it exists in a directory - do
+   nothing */
+int reiserfs_tree_insert_entry (reiserfs_filsys_t * fs, 
+				const reiserfs_key_t * dir, 
+				char * name, int name_len,
+				const reiserfs_key_t * key, 
+				__u16 fsck_need)
+{
+    reiserfs_ih_t entry_ih = {{0,}, };
+    char * entry;
+    int retval;
+    REISERFS_PATH_INIT(path);
+    unsigned int gen_counter;
+    int item_len;
+    __u32 hash;
+
+    if (reiserfs_tree_search_name (fs, dir, name, &gen_counter, 0))
+	/* entry is in the directory already or directory was not found */
+	return 0;
+
+    /* compose entry key to look for its place in the tree */
+    reiserfs_key_set_did (&(entry_ih.ih_key), reiserfs_key_get_did (dir));
+    reiserfs_key_set_oid (&(entry_ih.ih_key), reiserfs_key_get_oid (dir));
+    if (!strcmp (name, "."))
+	hash = OFFSET_DOT;
+    else if (!strcmp (name, ".."))
+	hash = OFFSET_DOT_DOT;
+    else
+	hash = reiserfs_hash_value (fs->hash, name, strlen (name)) + gen_counter;
+    reiserfs_key_set_off1 (&(entry_ih.ih_key), hash);
+    reiserfs_key_set_uni (&(entry_ih.ih_key), UNI_DE);
+
+    reiserfs_ih_set_format (&entry_ih, KEY_FORMAT_1);
+    reiserfs_ih_set_entries (&entry_ih, 1);
+
+    item_len = REISERFS_DEH_SIZE + name_len;
+/*
+    if (reiserfs_super_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_3_5)
+	item_len = REISERFS_DEH_SIZE + strlen (name);
+    else if (reiserfs_super_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_3_6)
+	item_len = REISERFS_DEH_SIZE + MISC_ROUND_UP (strlen (name));
+    else
+	reiserfs_panic ("unknown fs format");
+*/
+
+    reiserfs_ih_set_len (&entry_ih, item_len);
+
+    /* fsck may need to insert item which was not reached yet */
+    reiserfs_ih_set_flags (&entry_ih, fsck_need);
+
+    entry = make_entry (0, name, key, 
+			reiserfs_key_get_off (&(entry_ih.ih_key)));
+
+    retval = reiserfs_tree_search_entry (fs, &(entry_ih.ih_key), &path);
+    switch (retval) {
+    case POSITION_NOT_FOUND:
+	reiserfs_tree_insert_unit (fs, &path, entry, item_len);
+	break;
+
+    case DIRECTORY_NOT_FOUND:
+	reiserfs_deh_set_loc ((reiserfs_deh_t *)entry, REISERFS_DEH_SIZE);
+	reiserfs_tree_insert (fs, &path, &entry_ih, entry);
+	break;
+
+    default:
+	reiserfs_panic ("reiserfs_tree_insert_entry: looking for %k (inserting "
+			"name \"%s\") reiserfs_tree_search_entry returned %d",
+			&(entry_ih.ih_key), name, retval);
+    }
+
+    misc_freemem (entry);
+    return item_len;
+}
+
+
+/* inserts new or old stat data of a __DIRECTORY__ (unreachable, nlinks == 0) */
+int reiserfs_tree_create_stat (reiserfs_filsys_t * fs,
+			       reiserfs_path_t * path, 
+			       const reiserfs_key_t * key,
+			       item_modify_t modify)
+{
+    reiserfs_ih_t ih;
+    reiserfs_sd_t sd;
+    int key_format;
+
+    if (fs->fs_format == REISERFS_FORMAT_3_5)
+	key_format = KEY_FORMAT_1;
+    else
+	key_format = KEY_FORMAT_2;
+
+    memset(&sd, 0, sizeof(sd));
+    reiserfs_stat_init (fs->fs_blocksize, key_format, reiserfs_key_get_did (key),
+			reiserfs_key_get_oid (key), &ih, &sd);
+
+    if (modify)
+        modify (&ih, &sd);
+    
+    reiserfs_tree_insert (fs, path, &ih, &sd);
+    return key_format;
+}
+
+__u16 reiserfs_tree_root (reiserfs_filsys_t * fs,
+			  item_modify_t modify,
+			  __u16 ih_flags)
+{
+    __u16 format;
+    REISERFS_PATH_INIT (path);
+
+
+    /* is there root's stat data */
+    if (reiserfs_tree_search_item (fs, &root_dir_key, &path) == ITEM_NOT_FOUND) {	
+	format = reiserfs_tree_create_stat (fs, &path, &root_dir_key, modify);
+    } else {
+    	reiserfs_ih_t * ih = REISERFS_PATH_IH (&path);
+    	
+    	if (!reiserfs_ih_stat (ih))
+	    reiserfs_panic ("It must be root's stat data %k\n", &ih->ih_key);
+	
+        format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? 
+		KEY_FORMAT_2 : KEY_FORMAT_1;
+	
+	reiserfs_tree_pathrelse (&path);
+    }
+
+    /* add "." and ".." if any of them do not exist. Last two
+       parameters say: 0 - entry is not added on lost_found pass and 1
+       - mark item unreachable */
+
+    reiserfs_tree_insert_entry (fs, &root_dir_key, ".", 
+				reiserfs_direntry_entry_estimate (".", format),
+				&root_dir_key, ih_flags);
+    reiserfs_tree_insert_entry (fs, &root_dir_key, "..", 
+				reiserfs_direntry_entry_estimate ("..", format),
+				&parent_root_dir_key, ih_flags);
+
+    return format;
+}
+
+/* Release all buffers in the path. */
+void  reiserfs_tree_pathrelse (reiserfs_path_t * p_s_search_path) 
+{
+    int n_path_offset = p_s_search_path->path_length;
+    
+    while ( n_path_offset > REISERFS_PATH_OFFILL )
+	reiserfs_buffer_close(REISERFS_PATH_BUFFER(p_s_search_path, n_path_offset--));
+
+    p_s_search_path->path_length = REISERFS_PATH_OFFILL;
+}
+
+int reiserfs_tree_left_mergeable (reiserfs_filsys_t * s, reiserfs_path_t * path)
+{
+    reiserfs_ih_t * right;
+    reiserfs_bh_t * bh;
+    int retval;
+    
+    right = reiserfs_ih_at (REISERFS_PATH_LEAF (path), 0);
+    
+    bh = reiserfs_tree_left_neighbor (s, path);
+    if (bh == 0) {
+	return 0;
+    }
+    retval = reiserfs_leaf_mergeable (reiserfs_ih_at (bh, reiserfs_node_items (bh) - 1), 
+				      right, bh->b_size);
+    reiserfs_buffer_close (bh);
+    return retval;
+}
+
+int reiserfs_tree_right_mergeable (reiserfs_filsys_t * s, reiserfs_path_t * path)
+{
+    reiserfs_ih_t * left;
+    reiserfs_bh_t * bh;
+    int retval;
+    
+    left = reiserfs_ih_at (REISERFS_PATH_LEAF (path), 
+			   reiserfs_node_items (REISERFS_PATH_LEAF (path)) - 1);
+    
+    bh = reiserfs_tree_right_neighbor (s, path);
+    if (bh == 0) {
+	return 0;
+    }
+    retval = reiserfs_leaf_mergeable (left, reiserfs_ih_at (bh, 0), bh->b_size);
+    reiserfs_buffer_close (bh);
+    return retval;
+}
+
+/* return 1 if left and right nodes can be packed into 1 node. 0 otherwise */
+int reiserfs_tree_node_mergeable(reiserfs_bh_t * left, 
+				 reiserfs_bh_t * right)
+{
+    reiserfs_ih_t *ih = reiserfs_ih_at (left, reiserfs_node_items (left) - 1);
+    
+    if (reiserfs_node_free (left) >= reiserfs_node_used (right) -
+	(reiserfs_leaf_mergeable (ih, reiserfs_ih_at(right, 0), left->b_size)
+	 ? REISERFS_IH_SIZE : 0))
+    {
+	return 1;
+    }
+
+    return 0;
+}
+
+/* A simple 2 nodes merge operation. */
+int reiserfs_tree_merge(reiserfs_filsys_t *fs, 
+			reiserfs_path_t *dst_path, 
+			reiserfs_path_t *src_path)
+{
+	reiserfs_bufinfo_t dest_bi;
+	reiserfs_bufinfo_t src_bi;
+	int num, res;
+	
+	src_bi.bi_bh = REISERFS_PATH_LEAF (src_path);
+	src_bi.bi_parent = REISERFS_PATH_UPPARENT (src_path, 0);
+	src_bi.bi_position = REISERFS_PATH_UPPARENT_POS (src_path, 0);	
+	
+	dest_bi.bi_bh = REISERFS_PATH_LEAF(dst_path);
+	dest_bi.bi_parent = REISERFS_PATH_UPPARENT (dst_path, 0);
+	dest_bi.bi_position = REISERFS_PATH_UPPARENT_POS (dst_path, 0);
+	
+	num = reiserfs_node_items(src_bi.bi_bh);
+	res = reiserfs_lb_copy (fs, &dest_bi, src_bi.bi_bh, 
+				FIRST_TO_LAST, num, -1);
+	
+	/* Delete all but the very first one. */
+	reiserfs_lb_delete (fs, &src_bi, FIRST_TO_LAST, 1, num - 1, -1);
+	
+	/* Delete the very first one and rebalance the tree. */
+	REISERFS_PATH_LEAF_POS (src_path) = 0;
+	reiserfs_tree_delete (fs, src_path, 0);
+	return res;
+}
+
diff --git a/libreiserfs/tree_balance.c b/libreiserfs/tree_balance.c
new file mode 100644
index 0000000..5ef053e
--- /dev/null
+++ b/libreiserfs/tree_balance.c
@@ -0,0 +1,197 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "reiserfs/libreiserfs.h"
+
+/* Make empty node */
+void reiserfs_tb_attach_new (reiserfs_bufinfo_t * bi)
+{
+    reiserfs_leaf_mkempty (bi->bi_bh);
+
+    if (bi->bi_parent)
+	reiserfs_dc_set_size (reiserfs_int_at (bi->bi_parent, bi->bi_position), 0);
+}
+
+
+/* Get first empty buffer */
+reiserfs_bh_t * reiserfs_tb_FEB (reiserfs_tb_t * tb) {
+    int i;
+    reiserfs_bh_t * first_b;
+    reiserfs_bufinfo_t bi;
+
+    for (i = 0; i < TB_FEB_MAX; i ++)
+	if (tb->FEB[i] != 0)
+	    break;
+
+    if (i == TB_FEB_MAX)
+	reiserfs_panic("vs-12300: reiserfs_tb_FEB: FEB list is empty");
+
+    bi.bi_bh = first_b = tb->FEB[i];
+    bi.bi_parent = 0;
+    bi.bi_position = 0;
+    reiserfs_tb_attach_new (&bi);
+    misc_set_bit(BH_Uptodate, &first_b->b_state);
+
+    tb->FEB[i] = 0;
+    tb->used[i] = first_b;
+
+    return(first_b);
+}
+
+int reiserfs_tb_lpos (reiserfs_tb_t * tb, int h) 
+{
+  int Sh_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+
+  if (Sh_position == 0)
+    return reiserfs_node_items (tb->FL[h]);
+  else
+    return Sh_position - 1;
+}
+
+
+int reiserfs_tb_rpos (reiserfs_tb_t * tb, int h)
+{
+  int Sh_position = REISERFS_PATH_UPPOS (tb->tb_path, h + 1);
+
+  if (Sh_position == reiserfs_node_items (REISERFS_PATH_UPPARENT (tb->tb_path, h)))
+    return 0;
+  else
+    return Sh_position + 1;
+}
+
+/* Now we have all of the buffers that must be used in balancing of the tree.
+   We rely on the assumption that schedule() will not occur while reiserfs_tb_balance
+   works. ( Only interrupt handlers are acceptable.)  We balance the tree
+   according to the analysis made before this, using buffers already obtained.
+   For SMP support it will someday be necessary to add ordered locking of
+   tb. */
+
+/* Some interesting rules of balancing:
+
+   we delete a maximum of two nodes per level per balancing: we never delete R, when we delete two
+   of three nodes L, S, R then we move them into R.
+
+   we only delete L if we are deleting two nodes, if we delete only one node we delete S
+
+   if we shift leaves then we shift as much as we can: this is a deliberate policy of extremism in
+   node packing which results in higher average utilization after repeated random balance
+   operations at the cost of more memory copies and more balancing as a result of small insertions
+   to full nodes.
+
+   if we shift internal nodes we try to evenly balance the node utilization, with consequent less
+   balancing at the cost of lower utilization.
+
+   one could argue that the policy for directories in leaves should be that of internal nodes, but
+   we will wait until another day to evaluate this....  It would be nice to someday measure and
+   prove these assumptions as to what is optimal....
+
+*/
+
+void reiserfs_tb_balance (
+	reiserfs_tb_t * tb,	/* tree_balance structure */
+	reiserfs_ih_t * ih,	/* item header of inserted item */
+	const char * body, /* body  of inserted item or bytes to paste */
+	int flag,  /* i - insert, d - delete
+		      c - cut, p - paste			
+		      Cut means delete part of an item (includes
+		      removing an entry from a directory).
+
+		      Delete means delete whole item.
+
+		      Insert means add a new item into the tree.
+
+		      Paste means to append to the end of an existing
+		      file or to insert a directory entry.  */
+	int zeros_num)
+{
+    //int pos_in_item = tb->tb_path->pos_in_item;
+    int child_pos, /* position of a child node in its parent */
+	h;	   /* level of the tree being processed */
+    reiserfs_ih_t insert_key[2]; /* in our processing of one level we
+				       sometimes determine what must be
+				       inserted into the next higher level.
+				       This insertion consists of a key or two
+				       keys and their corresponding pointers */
+    reiserfs_bh_t *insert_ptr[2]; /* inserted node-ptrs for the next
+					  level */
+
+    /* if we have no real work to do  */
+    if ( ! tb->insert_size[0] ) {
+	reiserfs_unfix_nodes(/*th,*/ tb);
+	return;
+    }
+
+    if (flag == M_INTERNAL) {
+	insert_ptr[0] = (reiserfs_bh_t *)body;
+	/* we must prepare insert_key */
+
+	if (REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0)
+	    /*LAST_POSITION (tb->tb_path)*//*item_pos*/ == -1) 
+	{
+		/* get delimiting key from buffer in tree */
+		reiserfs_key_copy (&insert_key[0].ih_key, 
+				   reiserfs_ih_key_at (REISERFS_PATH_LEAF (tb->tb_path), 0));
+		/*insert_ptr[0]->b_item_order = 0;*/
+	} else {
+	    /* get delimiting key from new buffer */
+	    reiserfs_key_copy (&insert_key[0].ih_key, 
+			       reiserfs_ih_key_at((reiserfs_bh_t *)body,0));
+	    
+	    /*insert_ptr[0]->b_item_order = item_pos;*/
+	}
+      
+	/* and insert_ptr instead of reiserfs_lb_balance */
+	child_pos = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0)/*item_pos*/;
+    } else
+	/* balance leaf returns 0 except if combining L R and S into 
+	   one node. see reiserfs_ib_balance() for explanation 
+	   of this line of code.*/
+	child_pos = REISERFS_PATH_UPPARENT_POS (tb->tb_path, 0) +
+	    reiserfs_lb_balance (tb, ih, body, flag, zeros_num, 
+				 insert_key, insert_ptr);
+
+    /* Balance internal level of the tree. */
+    for ( h = 1; h < REISERFS_TREE_HEIGHT_MAX && tb->insert_size[h]; h++ )
+	child_pos = reiserfs_ib_balance (tb, h, child_pos, 
+					 insert_key, insert_ptr);
+
+    /* Release all (except for S[0]) non NULL buffers fixed by reiserfs_fix_nodes() */
+    reiserfs_unfix_nodes(/*th,*/ tb);
+}
+
+void reiserfs_tb_init (reiserfs_tb_t * tb, 
+		       reiserfs_filsys_t * fs,
+		       reiserfs_path_t * path, 
+		       int size)
+{
+    memset (tb, '\0', sizeof(reiserfs_tb_t));
+    tb->tb_fs = fs;
+    tb->tb_path = path;
+
+    REISERFS_PATH_BUFFER(path, REISERFS_PATH_OFFILL) = NULL;
+    REISERFS_PATH_POS(path, REISERFS_PATH_OFFILL) = 0;
+    tb->insert_size[0] = size;
+}
+
+void reiserfs_tb_print_path (reiserfs_tb_t * tb, reiserfs_path_t * path)
+{
+    int offset = path->path_length;
+    reiserfs_bh_t * bh;
+
+    printf ("Offset    Bh     (b_blocknr, b_count) Position Nr_item\n");
+    while ( offset > REISERFS_PATH_OFFILL ) {
+	bh = REISERFS_PATH_BUFFER (path, offset);
+	printf ("%6d %10p (%9lu, %7d) %8d %7d\n", offset, 
+		bh, bh ? bh->b_blocknr : 0, bh ? bh->b_count : 0,
+		REISERFS_PATH_POS (path, offset), bh ? reiserfs_node_items (bh) : -1);
+	
+	offset --;
+    }
+}
+
diff --git a/libutil/Makefile.am b/libutil/Makefile.am
new file mode 100644
index 0000000..4e4cde7
--- /dev/null
+++ b/libutil/Makefile.am
@@ -0,0 +1,7 @@
+noinst_LIBRARIES          = libutil-static.a
+
+libutil_static_a_SOURCES  = badblock.c device.c misc.c mntent.c print.c
+libutil_static_a_LIBADD   = $(top_builddir)/libmisc/libmisc-static.a
+libutil_static_a_CFLAGS   = @CFLAGS@
+
+INCLUDES                  = -I$(top_srcdir)/include
diff --git a/libutil/Makefile.in b/libutil/Makefile.in
new file mode 100644
index 0000000..cff88f2
--- /dev/null
+++ b/libutil/Makefile.in
@@ -0,0 +1,469 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(libutil_static_a_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = libutil
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libutil_static_a_AR = $(AR) $(ARFLAGS)
+libutil_static_a_DEPENDENCIES =  \
+	$(top_builddir)/libmisc/libmisc-static.a
+am_libutil_static_a_OBJECTS = libutil_static_a-badblock.$(OBJEXT) \
+	libutil_static_a-device.$(OBJEXT) \
+	libutil_static_a-misc.$(OBJEXT) \
+	libutil_static_a-mntent.$(OBJEXT) \
+	libutil_static_a-print.$(OBJEXT)
+libutil_static_a_OBJECTS = $(am_libutil_static_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libutil_static_a_SOURCES)
+DIST_SOURCES = $(libutil_static_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LIBRARIES = libutil-static.a
+libutil_static_a_SOURCES = badblock.c device.c misc.c mntent.c print.c
+libutil_static_a_LIBADD = $(top_builddir)/libmisc/libmisc-static.a
+libutil_static_a_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  libutil/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  libutil/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libutil-static.a: $(libutil_static_a_OBJECTS) $(libutil_static_a_DEPENDENCIES) 
+	-rm -f libutil-static.a
+	$(libutil_static_a_AR) libutil-static.a $(libutil_static_a_OBJECTS) $(libutil_static_a_LIBADD)
+	$(RANLIB) libutil-static.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-badblock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-device.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-misc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-mntent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_static_a-print.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+libutil_static_a-badblock.o: badblock.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-badblock.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-badblock.Tpo" -c -o libutil_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-badblock.Tpo" "$(DEPDIR)/libutil_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libutil_static_a-badblock.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='badblock.c' object='libutil_static_a-badblock.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-badblock.o `test -f 'badblock.c' || echo '$(srcdir)/'`badblock.c
+
+libutil_static_a-badblock.obj: badblock.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-badblock.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-badblock.Tpo" -c -o libutil_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-badblock.Tpo" "$(DEPDIR)/libutil_static_a-badblock.Po"; else rm -f "$(DEPDIR)/libutil_static_a-badblock.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='badblock.c' object='libutil_static_a-badblock.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-badblock.obj `if test -f 'badblock.c'; then $(CYGPATH_W) 'badblock.c'; else $(CYGPATH_W) '$(srcdir)/badblock.c'; fi`
+
+libutil_static_a-device.o: device.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-device.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-device.Tpo" -c -o libutil_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-device.Tpo" "$(DEPDIR)/libutil_static_a-device.Po"; else rm -f "$(DEPDIR)/libutil_static_a-device.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='device.c' object='libutil_static_a-device.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-device.o `test -f 'device.c' || echo '$(srcdir)/'`device.c
+
+libutil_static_a-device.obj: device.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-device.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-device.Tpo" -c -o libutil_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-device.Tpo" "$(DEPDIR)/libutil_static_a-device.Po"; else rm -f "$(DEPDIR)/libutil_static_a-device.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='device.c' object='libutil_static_a-device.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`
+
+libutil_static_a-misc.o: misc.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-misc.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-misc.Tpo" -c -o libutil_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-misc.Tpo" "$(DEPDIR)/libutil_static_a-misc.Po"; else rm -f "$(DEPDIR)/libutil_static_a-misc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='misc.c' object='libutil_static_a-misc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c
+
+libutil_static_a-misc.obj: misc.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-misc.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-misc.Tpo" -c -o libutil_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-misc.Tpo" "$(DEPDIR)/libutil_static_a-misc.Po"; else rm -f "$(DEPDIR)/libutil_static_a-misc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='misc.c' object='libutil_static_a-misc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi`
+
+libutil_static_a-mntent.o: mntent.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-mntent.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-mntent.Tpo" -c -o libutil_static_a-mntent.o `test -f 'mntent.c' || echo '$(srcdir)/'`mntent.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-mntent.Tpo" "$(DEPDIR)/libutil_static_a-mntent.Po"; else rm -f "$(DEPDIR)/libutil_static_a-mntent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mntent.c' object='libutil_static_a-mntent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-mntent.o `test -f 'mntent.c' || echo '$(srcdir)/'`mntent.c
+
+libutil_static_a-mntent.obj: mntent.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-mntent.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-mntent.Tpo" -c -o libutil_static_a-mntent.obj `if test -f 'mntent.c'; then $(CYGPATH_W) 'mntent.c'; else $(CYGPATH_W) '$(srcdir)/mntent.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-mntent.Tpo" "$(DEPDIR)/libutil_static_a-mntent.Po"; else rm -f "$(DEPDIR)/libutil_static_a-mntent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mntent.c' object='libutil_static_a-mntent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-mntent.obj `if test -f 'mntent.c'; then $(CYGPATH_W) 'mntent.c'; else $(CYGPATH_W) '$(srcdir)/mntent.c'; fi`
+
+libutil_static_a-print.o: print.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-print.o -MD -MP -MF "$(DEPDIR)/libutil_static_a-print.Tpo" -c -o libutil_static_a-print.o `test -f 'print.c' || echo '$(srcdir)/'`print.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-print.Tpo" "$(DEPDIR)/libutil_static_a-print.Po"; else rm -f "$(DEPDIR)/libutil_static_a-print.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='print.c' object='libutil_static_a-print.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-print.o `test -f 'print.c' || echo '$(srcdir)/'`print.c
+
+libutil_static_a-print.obj: print.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -MT libutil_static_a-print.obj -MD -MP -MF "$(DEPDIR)/libutil_static_a-print.Tpo" -c -o libutil_static_a-print.obj `if test -f 'print.c'; then $(CYGPATH_W) 'print.c'; else $(CYGPATH_W) '$(srcdir)/print.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libutil_static_a-print.Tpo" "$(DEPDIR)/libutil_static_a-print.Po"; else rm -f "$(DEPDIR)/libutil_static_a-print.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='print.c' object='libutil_static_a-print.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libutil_static_a_CFLAGS) $(CFLAGS) -c -o libutil_static_a-print.obj `if test -f 'print.c'; then $(CYGPATH_W) 'print.c'; else $(CYGPATH_W) '$(srcdir)/print.c'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-noinstLIBRARIES ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libutil/badblock.c b/libutil/badblock.c
new file mode 100644
index 0000000..2d4c91c
--- /dev/null
+++ b/libutil/badblock.c
@@ -0,0 +1,62 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "util/badblock.h"
+
+int util_badblock_load (reiserfs_filsys_t * fs, char * badblocks_file) {
+    FILE * fd;
+    char buf[128];
+    __u32 blocknr;
+    int count;
+
+    fs->fs_badblocks_bm = 
+	    reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb));
+    
+    reiserfs_bitmap_zero (fs->fs_badblocks_bm);
+
+    if (!badblocks_file)
+	return 0;
+    
+    fd = fopen (badblocks_file, "r");
+
+    if (fd == NULL) {
+        fprintf (stderr, "%s: Failed to open the given badblock file '%s'.\n\n",
+        	__FUNCTION__, badblocks_file);
+        return 1;
+    }
+
+
+    while (!feof (fd)) {
+	if (fgets(buf, sizeof(buf), fd) == NULL)
+	    break;
+	count = sscanf(buf, "%u", &blocknr);
+	
+	if (count <= 0)
+	    continue;
+
+	if (blocknr >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) {
+	    fprintf (stderr, "%s: block number (%u) points out of fs size "
+		     "(%u).\n", __FUNCTION__, blocknr, 
+		     reiserfs_sb_get_blocks(fs->fs_ondisk_sb));
+	} else if (reiserfs_fs_block(fs, blocknr) != BT_UNKNOWN) {
+	    fprintf (stderr, "%s: block number (%u) belongs to system "
+		     "reiserfs area. It cannot be relocated.\n", 
+		     __FUNCTION__, blocknr);
+	    return 1;
+	} else {
+	    reiserfs_bitmap_set_bit (fs->fs_badblocks_bm, blocknr);
+	} 
+    }
+
+    fclose (fd);
+
+    return 0;
+}
+
+
diff --git a/libutil/device.c b/libutil/device.c
new file mode 100644
index 0000000..b31f210
--- /dev/null
+++ b/libutil/device.c
@@ -0,0 +1,258 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "util/device.h"
+#include "util/print.h"
+#include "util/mntent.h"
+#include "misc/device.h"
+#include "misc/types.h"
+#include "misc/misc.h"
+#include "reiserfs/print.h"
+
+#include <linux/hdreg.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <mntent.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <utime.h>
+#include <assert.h>
+
+#define reiserfs_confirm(force) \
+	if (force < 1) {\
+	    /* avoid formatting it without being forced */\
+	    reiserfs_warning (stderr, "Use -f to force over\n");\
+	    return 0;\
+	}\
+	if (force < 2) {\
+	    if (!util_user_confirmed (stderr, "Continue (y/n):", "y\n"))\
+		return 0;\
+	}\
+
+/* 0 - dma is not supported, scsi or regular file */
+/* 1 - xt drive                                   */
+/* 2 - ide drive */
+static void get_dma_support(util_device_dma_t *dma_info, struct stat *st){
+    if (S_ISREG(st->st_mode))
+	st->st_rdev = st->st_dev;
+
+    if (IDE_DISK_MAJOR(major(st->st_rdev))) {
+        dma_info->support_type = 2;
+	return;
+    }
+    
+#ifdef XT_DISK_MAJOR
+    if (major(st->st_rdev) == XT_DISK_MAJOR) {
+	dma_info->support_type = 1;
+	return;
+    }
+#endif    
+    dma_info->support_type = 0;
+}
+
+/* 
+ * Return values: 
+ * 0 - ok;
+ * 1 - preparation cannot be done 
+ * -1 - preparation failed
+ */
+
+int util_device_dma_prep(util_device_dma_t *dma_info) {
+    struct stat st;
+    char buf[4096];
+    dev_t rdev;
+    int rem;
+    int res;
+
+#ifndef HDIO_GET_DMA
+        return -1;
+#endif
+	
+    if (fstat(dma_info->fd, &st))
+	misc_die("stat on device failed\n");
+   
+    get_dma_support(dma_info, &st);
+   
+    /* dma should be supported */
+    if (dma_info->support_type == 0)
+	return 1;
+    
+    if (dma_info->support_type == 1)
+	return 0;
+
+    rdev = dma_info->st_rdev = st.st_rdev;
+
+    /* If it is the whole device? no preparation needed then. */
+    if ((rem = (minor(rdev) % 64)) == 0)
+	return 0;
+    
+    dma_info->st_rdev -= rem;
+
+    strcpy(buf, "/dev");
+
+    if ((res = misc_dir_walk(buf, misc_device_rdev_match, &dma_info->st_rdev)) <= 0) {
+	    dma_info->st_rdev += rem;
+	    dma_info->support_type = 1;
+	    return res;
+    } 
+    
+    /* Matched block device file found. Open it. */
+    dma_info->fd = open(buf, O_RDONLY
+#if defined(O_LARGEFILE)
+			| O_LARGEFILE
+#endif
+		       );
+    
+    return 0;
+}
+
+static int is_dma_on (int fd) {
+#ifdef HDIO_GET_DMA    
+    static long parm;
+    if (ioctl(fd, HDIO_GET_DMA, &parm))
+	return -1;
+    else 
+	return parm;
+#endif
+    return 0;
+}
+
+
+static __u64 dma_speed(int fd, int support_type) {
+    static struct hd_driveid id;
+    __u64 speed = 0;
+            
+    if (support_type != 2) 
+	return 0;
+
+#ifdef HDIO_OBSOLETE_IDENTITY
+    if (!ioctl(fd, HDIO_GET_IDENTITY, &id) || 
+	!ioctl(fd, HDIO_OBSOLETE_IDENTITY)) {
+#else
+    if (!ioctl(fd, HDIO_GET_IDENTITY, &id)) {
+#endif
+	speed |= (__u64)id.dma_1word &  ~(__u64)0xff;
+	speed |= ((__u64)id.dma_mword & ~(__u64)0xff) << 16;
+	speed |= ((__u64)id.dma_ultra & ~(__u64)0xff) << 32;
+    } else if (errno == -ENOMSG)
+	return -1;
+    else 
+	return -1;
+    
+    return speed;
+}
+
+int util_device_get_dma(util_device_dma_t *dma_info) {
+    if ((dma_info->dma = is_dma_on(dma_info->fd)) == -1)
+	return -1;
+    if ((dma_info->speed = dma_speed(dma_info->fd, dma_info->support_type)) == (__u64)-1) 
+	return -1;
+    return 0;
+}
+
+void util_device_dma_fini(int fd, util_device_dma_t *dma_info) {
+    signal(SIGALRM, SIG_IGN);
+    if (dma_info->fd && fd != dma_info->fd)
+	close(dma_info->fd);
+}
+
+FILE * util_file_open (char * filename, char * option) 
+{
+    FILE * fp = fopen (filename, option);
+    if (!fp) {
+	reiserfs_warning (stderr, "util_file_open: could not "
+			  "open file %s\n", filename);
+	return 0;
+    }
+    reiserfs_warning (stderr, "Temp file opened by fsck: "
+		      "\"%s\" .. \n", filename);
+    return fp;
+}
+
+/* we only can use a file for filesystem or journal if it is either not
+   mounted block device or regular file and we are forced to use it */
+int util_device_formatable (char * device_name, int force)
+{
+    mode_t mode;
+    dev_t rdev;
+
+    if (util_device_mounted(device_name) > 0) {
+	/* device looks mounted */
+	reiserfs_warning (stderr, "'%s' looks mounted.", device_name);
+	reiserfs_confirm (force);
+    }
+
+    mode = misc_device_mode(device_name);
+    rdev = misc_device_rdev(device_name);
+
+    if (!S_ISBLK (mode)) {
+	/* file is not a block device */
+	reiserfs_warning (stderr, "%s is not a block special device\n", device_name);
+	reiserfs_confirm (force);
+    } else {
+	if ((IDE_DISK_MAJOR (major(rdev)) && minor(rdev) % 64 == 0) ||
+	    (SCSI_BLK_MAJOR (major(rdev)) && minor(rdev) % 16 == 0)) {
+	    /* /dev/hda or similar */
+	    reiserfs_warning (stderr, "%s is entire device, not just one partition!\n",
+		    device_name);
+	    reiserfs_confirm (force);
+	}
+    }
+
+    return 1;
+}
+
+int util_root_mounted(char *device) {
+	struct stat rootst, devst;
+	
+	assert(device != NULL);
+
+	if (stat("/", &rootst) != 0) 
+		return -1;
+
+	if (stat(device, &devst) != 0)
+		return -1;
+
+	if (!S_ISBLK(devst.st_mode) || 
+	    devst.st_rdev != rootst.st_dev)
+		return 0;
+
+	return 1;
+}
+
+int util_device_mounted(char *device) {
+	struct mntent *mnt;
+	
+	/* Check for the "/" first to avoid any possible problem with 
+	   reflecting the root fs info in mtab files. */
+	if (util_root_mounted(device) == 1) {
+		return util_file_ro("/") ? MF_RO : MF_RW;
+	}
+	
+	/* Lookup the mount entry. */
+	if ((mnt = util_mntent(device)) == NULL) {
+		return MF_NOT_MOUNTED;
+	} else if (mnt == INVAL_PTR) {
+		return 0;
+	}
+
+	return hasmntopt(mnt, MNTOPT_RO) ? MF_RO : MF_RW;
+}
+
+int util_file_ro(char *file) {
+	if (utime(file, 0) == -1) {
+		if (errno == EROFS)
+			return 1;
+	}
+
+	return 0;
+}
+
diff --git a/libutil/misc.c b/libutil/misc.c
new file mode 100644
index 0000000..953d4b3
--- /dev/null
+++ b/libutil/misc.c
@@ -0,0 +1,225 @@
+/*
+ *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ *  reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "util/misc.h"
+
+#include "misc/malloc.h"
+#include "misc/misc.h"
+
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+
+char buf1 [100];
+char buf2 [100];
+
+static time_t t0 = 0, t1 = 0, t2 = 0;
+
+void util_misc_speed (FILE *fp, unsigned long passed, 
+		      unsigned long total, int cursor_pos, 
+		      int reset_time)
+{
+    int speed;
+    int indent;
+
+    if (passed == 0)
+	reset_time = 1;
+    
+    if (reset_time)
+	time (&t0);
+
+    time (&t1);
+    if (t1 != t0) {
+	speed = passed / (t1 - t0);
+	if (total - passed) {
+	    if (t1 - t2 < 1)
+	        return;
+	    t2 = t1;
+	} 
+    } else if (reset_time) {
+	speed = 0;
+    } else {
+	return;
+    }
+
+    /* what has to be written */
+    if (reset_time)
+	buf1[0] = 0;
+    else if (total)
+	sprintf (buf1, "left %lu, %d /sec", total - passed, speed);
+    else {
+	/*(*passed) ++;*/
+	sprintf (buf1, "done %lu, %d /sec", passed, speed);
+    }
+    
+    /* make indent */
+    indent = 79 - cursor_pos - strlen (buf1);
+    memset (buf2, ' ', indent);
+    buf2[indent] = 0;
+    fprintf (fp, "%s%s", buf2, buf1);
+
+    memset (buf2, '\b', indent + strlen (buf1));
+    buf2 [indent + strlen (buf1)] = 0;
+    fprintf (fp, "%s", buf2);
+    fflush (fp);
+}
+
+
+static char * strs[] =
+{"0%",".",".",".",".",
+ "20%",".",".",".",".",
+ "40%",".",".",".",".",
+ "60%",".",".",".",".",
+ "80%",".",".",".",".","100%"};
+
+static char progress_to_be[1024];
+static char current_progress[1024];
+
+static void str_to_be (char * buf, int prosents) {
+    int i;
+    prosents -= prosents % 4;
+    buf[0] = 0;
+    for (i = 0; i <= prosents / 4; i ++)
+	strcat (buf, strs[i]);
+}
+
+
+void util_misc_progress (FILE * fp, unsigned long * passed, 
+			 unsigned long total, unsigned int inc, 
+			 int forward)
+{
+    int percent;
+
+    if (*passed == 0)
+	current_progress[0] = 0;
+
+    (*passed) += inc;
+    if (*passed > total) {
+/*	fprintf (fp, "\nutil_misc_progress: total %lu has been "
+		 "reached already. cur=%lu\n", total, *passed);*/
+	return;
+    }
+
+    percent = ((*passed) * 100) / total;
+
+    str_to_be (progress_to_be, percent);
+
+    if (strlen (current_progress) != strlen (progress_to_be)) {
+	fprintf (fp, "%s", progress_to_be + strlen (current_progress));
+    }
+
+    strcat (current_progress, progress_to_be + strlen (current_progress));
+
+    if (forward != 2) {
+	util_misc_speed(fp, *passed /* - inc*/, forward ? 0 : total, 
+			strlen (progress_to_be), (*passed == inc) ? 1 : 0);
+    }
+    
+    fflush (fp);
+}
+
+static int screen_width = 0;
+static int screen_curr_pos = 0;
+static char *screen_savebuffer;
+static int screen_savebuffer_len;
+
+void screen_init() {
+    char *width;
+
+    width = getenv("COLUMNS");
+    if ( width )
+	screen_width = atoi(width);
+    
+    if (screen_width == 0)
+	screen_width = 80; // We default to 80 characters wide screen
+    screen_width--;
+
+    screen_savebuffer_len=screen_width;
+    screen_savebuffer=misc_getmem(screen_width+1);
+    memset(screen_savebuffer,0,screen_savebuffer_len+1);
+}
+
+void util_misc_name (FILE * fp) {
+    static int printed_len = 0;
+    int i;
+    
+    if (screen_curr_pos == 0 || t0 == 0) {
+	/* Start the new progress. */
+	time (&t0);
+	t2 = t0;
+    } else {
+	time (&t1);
+	if (t1 - t2 < 1)
+	    return;
+	t2 = t1;
+    } 
+
+    if (screen_width && screen_curr_pos >= screen_width ) {
+	fprintf(fp, "... %.*s", screen_width - 4,
+		screen_savebuffer + ( screen_curr_pos - (screen_width - 4)));
+	printed_len = screen_width;
+    } else if (screen_width) {
+	fprintf(fp, "%s", screen_savebuffer);
+	
+	for (i = 0; i <= printed_len - screen_curr_pos ; i++)
+	    fprintf(fp, " ");
+	
+	printed_len = screen_curr_pos;
+    }
+    
+    fprintf(fp, "\r");
+    fflush (fp);
+}
+
+/* semantic pass progress */
+void util_misc_print_name (FILE *fp, char * name, int len) {
+    int i;
+	
+    if (screen_width == 0)
+	screen_init();
+    
+    if ( len + screen_curr_pos + 1 > screen_savebuffer_len) {
+	char *t;
+	
+	t = misc_expandmem(screen_savebuffer, screen_savebuffer_len + 1, 
+	    len + screen_curr_pos - screen_savebuffer_len + 1);
+	
+	if (!t) {
+	    return; // ????
+	}
+	
+	screen_savebuffer = t;
+	screen_savebuffer_len = len + screen_curr_pos + 1;
+    }
+    
+    strcat(screen_savebuffer,"/");
+    strncat(screen_savebuffer,name,len);
+    i = screen_curr_pos;
+    screen_curr_pos += len+1;
+    for ( ; i<screen_curr_pos; i++)
+	if ( screen_savebuffer[i] < 32 )
+	    screen_savebuffer[i] = '?';
+    screen_savebuffer[screen_curr_pos]=0;
+
+    util_misc_name(fp);
+}
+
+void util_misc_erase_name (FILE * fp, int len) {
+    screen_curr_pos-=(len+1);
+    if (screen_curr_pos < 0 )
+	misc_die("%s: Get out of buffer's data!\n", __FUNCTION__);
+
+    screen_savebuffer[screen_curr_pos]=0;
+}
+
+
+void util_misc_fini_name (FILE * fp) {
+    screen_curr_pos = 0;
+    util_misc_name(fp);
+}
diff --git a/libutil/mntent.c b/libutil/mntent.c
new file mode 100644
index 0000000..6ce1858
--- /dev/null
+++ b/libutil/mntent.c
@@ -0,0 +1,164 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+/* Lookup the @file in the @mntfile. @file is mntent.mnt_fsname if @fsname 
+   is set; mntent.mnt_dir otherwise. Return the mnt entry from the @mntfile.
+   
+   Warning: if the root fs is mounted RO, the content of /etc/mtab may be 
+   not correct. */
+
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "misc/types.h"
+#include "util/device.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+#include <mntent.h>
+#include <assert.h>
+#include <stdio.h>
+
+static struct mntent *util_mntent_lookup(char *mntfile, 
+					 char *file, 
+					 int path) 
+{
+	struct mntent *mnt;
+	int name_match = 0;
+	struct stat st;
+	dev_t rdev = 0;
+	dev_t dev = 0;
+	ino_t ino = 0;
+	char *name;
+	FILE *fp;
+	
+	assert(mntfile != NULL);
+	assert(file != NULL);
+
+	if (stat(file, &st) == 0) {
+		/* Devices is stated. */
+		if (S_ISBLK(st.st_mode)) {
+			rdev = st.st_rdev;
+		} else {
+			dev = st.st_dev;
+			ino = st.st_ino;
+		}
+	}
+
+	if ((fp = setmntent(mntfile, "r")) == NULL)
+		return INVAL_PTR;
+
+	while ((mnt = getmntent(fp)) != NULL) {
+		/* Check if names match. */
+		name = path ? mnt->mnt_dir : mnt->mnt_fsname;
+		
+		if (strcmp(file, name) == 0)
+			name_match = 1;
+
+		if (stat(name, &st))
+			continue;
+		
+		/* If names do not match, check if stats match. */
+		if (!name_match) {
+			if (rdev && S_ISBLK(st.st_mode)) {
+				if (rdev != st.st_rdev)
+					continue;
+			} else if (dev && !S_ISBLK(st.st_mode)) {
+				if (dev != st.st_dev ||
+				    ino != st.st_ino)
+					continue;
+			} else {
+				continue;
+			}
+		}
+
+		/* If not path and not block device do not check anything more. */
+		if (!path && !rdev) 
+			break;
+
+		if (path) {
+			/* Either names or stats match. Make sure the st_dev of 
+			   the path is same as @mnt_fsname device rdev. */
+			if (stat(mnt->mnt_fsname, &st) == 0 && 
+			    dev == st.st_rdev)
+				break;
+		} else {
+			/* Either names or stats match. Make sure the st_dev of 
+			   the mount entry is same as the given device rdev. */
+			if (stat(mnt->mnt_dir, &st) == 0 && 
+			    rdev == st.st_dev)
+				break;
+		}
+	}
+
+	endmntent (fp);
+        return mnt;
+}
+
+struct mntent *util_mntent(char *device) {
+	int proc = 0, path = 0, root = 0;
+	
+	struct mntent *mnt;
+	struct statfs stfs;
+
+	assert(device != NULL);
+	
+	/* Check if the root. */
+	if (util_root_mounted(device) == 1)
+		root = 1;
+	
+#ifdef __linux__
+	/* Check if /proc is procfs. */
+	if (statfs("/proc", &stfs) == 0 && stfs.f_type == 0x9fa0) {
+		proc = 1;
+		
+		if (root) {
+			/* Lookup the "/" entry in /proc/mounts. Special 
+			   case as root entry can present as:
+				rootfs / rootfs rw 0 0
+			   Look up the mount point in this case. */
+			mnt = util_mntent_lookup("/proc/mounts", "/", 1);
+		} else {
+			/* Lookup the @device /proc/mounts */
+			mnt = util_mntent_lookup("/proc/mounts", device, 0);
+		}
+		
+		if (mnt == INVAL_PTR) 
+			proc = 0;
+		else if (mnt)
+			return mnt;
+	}
+#endif /* __linux__ */
+
+#if defined(MOUNTED) || defined(_PATH_MOUNTED)
+
+#ifndef MOUNTED
+    #define MOUNTED _PATH_MOUNTED
+#endif
+	/* Check in MOUNTED (/etc/mtab) if RW. */
+	if (!util_file_ro(MOUNTED)) {
+		path = 1;
+
+		if (root) {
+			mnt = util_mntent_lookup(MOUNTED, "/", 1);
+		} else {
+			mnt = util_mntent_lookup(MOUNTED, device, 0);
+		}
+
+		if (mnt == INVAL_PTR) 
+			path = 0;
+		else if (mnt)
+			return mnt;
+	}
+#endif /* defined(MOUNTED) || defined(_PATH_MOUNTED) */
+	
+	/* If has not been checked in neither /proc/mounts nor /etc/mtab (or 
+	   errors have occured), return INVAL_PTR, NULL otherwise. */
+	return (!proc && !path) ? INVAL_PTR : NULL;
+}
+
diff --git a/libutil/print.c b/libutil/print.c
new file mode 100644
index 0000000..27fac7e
--- /dev/null
+++ b/libutil/print.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "util/print.h"
+#include <string.h>
+
+int util_user_confirmed (FILE * fp, char * q, char * yes) {
+    char answer[4096];
+
+    fprintf (fp, "%s", q);
+    
+    if (fgets(answer, sizeof(answer), stdin) == NULL ||
+	(strlen(answer) != strlen(yes) || strcmp(yes, answer)))
+    {
+	return 0;
+    }
+
+    return 1;
+}
+
+#define BANNER						\
+	"Copyright (C) 2001-2005 by Hans Reiser, "	\
+	"licensing governed by reiserfsprogs/COPYING."
+
+void util_print_banner(char *name) {
+	fprintf(stderr, "%s %s\n%s\n", name, VERSION, BANNER);
+}
diff --git a/missing b/missing
index 6a37006..09edd88 100755
--- a/missing
+++ b/missing
@@ -1,6 +1,10 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
-# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
+
+scriptversion=2005-02-08.22
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+#   Free Software Foundation, Inc.
 # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
@@ -38,18 +42,24 @@
   configure_ac=configure.in
 fi
 
+msg="missing on your system"
+
 case "$1" in
 --run)
   # Try to run requested program, and just exit if it succeeds.
   run=
   shift
   "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
   ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case "$1" in
 
   -h|--h|--he|--hel|--help)
     echo "\
@@ -74,11 +84,15 @@
   lex          create \`lex.yy.c', if possible, from existing .c
   makeinfo     touch the output file
   tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
     ;;
 
   -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing 0.4 - GNU automake"
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
     ;;
 
   -*)
@@ -87,14 +101,44 @@
     exit 1
     ;;
 
-  aclocal*)
+esac
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
     if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
        # We have it, but it failed.
        exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
     fi
+    ;;
+esac
 
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+  aclocal*)
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
          you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
          to install the \`Automake' and \`Perl' packages.  Grab them from
          any GNU archive site."
@@ -102,13 +146,8 @@
     ;;
 
   autoconf)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
          you modified \`${configure_ac}'.  You might want to install the
          \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
          archive site."
@@ -116,13 +155,8 @@
     ;;
 
   autoheader)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
          you modified \`acconfig.h' or \`${configure_ac}'.  You might want
          to install the \`Autoconf' and \`GNU m4' packages.  Grab them
          from any GNU archive site."
@@ -140,13 +174,8 @@
     ;;
 
   automake*)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
          you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
          You might want to install the \`Automake' and \`Perl' packages.
          Grab them from any GNU archive site."
@@ -156,16 +185,11 @@
     ;;
 
   autom4te)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
     echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
-         system.  You might have modified some files without having the
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
          proper tools for further handling them.
-         You can get \`$1Help2man' as part of \`Autoconf' from any GNU
+         You can get \`$1' as part of \`Autoconf' from any GNU
          archive site."
 
     file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
@@ -185,7 +209,7 @@
 
   bison|yacc)
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' $msg.  You should only need it if
          you modified a \`.y' file.  You may need the \`Bison' package
          in order for those modifications to take effect.  You can get
          \`Bison' from any GNU archive site."
@@ -215,7 +239,7 @@
 
   lex|flex)
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
          you modified a \`.l' file.  You may need the \`Flex' package
          in order for those modifications to take effect.  You can get
          \`Flex' from any GNU archive site."
@@ -237,13 +261,8 @@
     ;;
 
   help2man)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
 	 you modified a dependency of a manual page.  You may need the
 	 \`Help2man' package in order for those modifications to take
 	 effect.  You can get \`Help2man' from any GNU archive site."
@@ -262,32 +281,27 @@
     ;;
 
   makeinfo)
-    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
-       # We have makeinfo, but it failed.
-       exit 1
-    fi
-
     echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
+WARNING: \`$1' is $msg.  You should only need it if
          you modified a \`.texi' or \`.texinfo' file, or any other file
          indirectly affecting the aspect of the manual.  The spurious
          call might also be the consequence of using a buggy \`make' (AIX,
          DU, IRIX).  You might want to install the \`Texinfo' package or
          the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
     file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
     if test -z "$file"; then
-      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
     fi
     touch $file
     ;;
 
   tar)
     shift
-    if test -n "$run"; then
-      echo 1>&2 "ERROR: \`tar' requires --run"
-      exit 1
-    fi
 
     # We have already tried tar in the generic part.
     # Look for gnutar/gtar before invocation to avoid ugly error
@@ -323,10 +337,10 @@
 
   *)
     echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
-         system.  You might have modified some files without having the
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
          proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequirements for installing
+         it often tells you about the needed prerequisites for installing
          this package.  You may also peek at any GNU archive site, in case
          some other package would contain this missing \`$1' program."
     exit 1
@@ -334,3 +348,10 @@
 esac
 
 exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/mkinstalldirs b/mkinstalldirs
old mode 100755
new mode 100644
diff --git a/mkreiserfs/Makefile.am b/mkreiserfs/Makefile.am
deleted file mode 100644
index cdb92ec..0000000
--- a/mkreiserfs/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-sbin_PROGRAMS = mkreiserfs
-
-mkreiserfs_SOURCES = mkreiserfs.c
-man_MANS = mkreiserfs.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-
diff --git a/mkreiserfs/Makefile.in b/mkreiserfs/Makefile.in
deleted file mode 100644
index d7ab194..0000000
--- a/mkreiserfs/Makefile.in
+++ /dev/null
@@ -1,453 +0,0 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UUID_LIBS = @UUID_LIBS@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-sbin_PROGRAMS = mkreiserfs
-
-mkreiserfs_SOURCES = mkreiserfs.c
-man_MANS = mkreiserfs.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-subdir = mkreiserfs
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-sbin_PROGRAMS = mkreiserfs$(EXEEXT)
-PROGRAMS = $(sbin_PROGRAMS)
-
-am_mkreiserfs_OBJECTS = mkreiserfs.$(OBJEXT)
-mkreiserfs_OBJECTS = $(am_mkreiserfs_OBJECTS)
-mkreiserfs_LDADD = $(LDADD)
-mkreiserfs_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
-	$(top_srcdir)/reiserfscore/libcore.a
-mkreiserfs_LDFLAGS =
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/mkreiserfs.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(mkreiserfs_SOURCES)
-
-NROFF = nroff
-MANS = $(man_MANS)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(mkreiserfs_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  mkreiserfs/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(sbindir)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f"; \
-	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f $(DESTDIR)$(sbindir)/$$f"; \
-	  rm -f $(DESTDIR)$(sbindir)/$$f; \
-	done
-
-clean-sbinPROGRAMS:
-	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
-mkreiserfs$(EXEEXT): $(mkreiserfs_OBJECTS) $(mkreiserfs_DEPENDENCIES) 
-	@rm -f mkreiserfs$(EXEEXT)
-	$(LINK) $(mkreiserfs_LDFLAGS) $(mkreiserfs_OBJECTS) $(mkreiserfs_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkreiserfs.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-uninstall-info-am:
-
-man8dir = $(mandir)/man8
-install-man8: $(man8_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(man8dir)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
-	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
-	done
-uninstall-man8:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
-	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(MANS)
-
-installdirs:
-	$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir)
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-exec-am: install-sbinPROGRAMS
-
-install-info: install-info-am
-
-install-man: install-man8
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-man uninstall-sbinPROGRAMS
-
-uninstall-man: uninstall-man8
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-sbinPROGRAMS ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man8 install-sbinPROGRAMS \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man8 uninstall-sbinPROGRAMS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/reiserfscore/Makefile.am b/reiserfscore/Makefile.am
deleted file mode 100644
index f1b9be3..0000000
--- a/reiserfscore/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-noinst_LIBRARIES = libcore.a
-
-libcore_a_SOURCES = do_balan.c fix_node.c hashes.c ibalance.c lbalance.c prints.c \
-stree.c node_formats.c reiserfslib.c bitmap.c journal.c includes.h
-
diff --git a/reiserfscore/Makefile.in b/reiserfscore/Makefile.in
deleted file mode 100644
index 1d1f24a..0000000
--- a/reiserfscore/Makefile.in
+++ /dev/null
@@ -1,394 +0,0 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UUID_LIBS = @UUID_LIBS@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-noinst_LIBRARIES = libcore.a
-
-libcore_a_SOURCES = do_balan.c fix_node.c hashes.c ibalance.c lbalance.c prints.c \
-stree.c node_formats.c reiserfslib.c bitmap.c journal.c includes.h
-
-subdir = reiserfscore
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-
-libcore_a_AR = $(AR) cru
-libcore_a_LIBADD =
-am_libcore_a_OBJECTS = do_balan.$(OBJEXT) fix_node.$(OBJEXT) \
-	hashes.$(OBJEXT) ibalance.$(OBJEXT) lbalance.$(OBJEXT) \
-	prints.$(OBJEXT) stree.$(OBJEXT) node_formats.$(OBJEXT) \
-	reiserfslib.$(OBJEXT) bitmap.$(OBJEXT) journal.$(OBJEXT)
-libcore_a_OBJECTS = $(am_libcore_a_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/bitmap.Po ./$(DEPDIR)/do_balan.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/fix_node.Po ./$(DEPDIR)/hashes.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/ibalance.Po ./$(DEPDIR)/journal.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/lbalance.Po ./$(DEPDIR)/node_formats.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/prints.Po ./$(DEPDIR)/reiserfslib.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/stree.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(libcore_a_SOURCES)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(libcore_a_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  reiserfscore/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-AR = ar
-
-clean-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libcore.a: $(libcore_a_OBJECTS) $(libcore_a_DEPENDENCIES) 
-	-rm -f libcore.a
-	$(libcore_a_AR) libcore.a $(libcore_a_OBJECTS) $(libcore_a_LIBADD)
-	$(RANLIB) libcore.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitmap.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/do_balan.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fix_node.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashes.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ibalance.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/journal.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lbalance.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node_formats.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prints.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reiserfslib.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stree.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LIBRARIES)
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-noinstLIBRARIES ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/reiserfscore/do_balan.c b/reiserfscore/do_balan.c
deleted file mode 100644
index 43bfbc4..0000000
--- a/reiserfscore/do_balan.c
+++ /dev/null
@@ -1,1153 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-/* Now we have all buffers that must be used in balancing of the tree 	*/
-/* Further calculations can not cause schedule(), and thus the buffer 	*/
-/* tree will be stable until the balancing will be finished 		*/
-/* balance the tree according to the analysis made before,		*/
-/* and using buffers obtained after all above.				*/
-
-
-/**
- ** balance_leaf_when_delete
- ** balance_leaf
- ** do_balance
- **
- **/
-
-#include "includes.h"
-
-/* summary:
- if deleting something ( tb->insert_size[0] < 0 )
-   return(balance_leaf_when_delete()); (flag d handled here)
- else
-   if lnum is larger than 0 we put items into the left node
-   if rnum is larger than 0 we put items into the right node
-   if snum1 is larger than 0 we put items into the new node s1
-   if snum2 is larger than 0 we put items into the new node s2 
-Note that all *num* count new items being created.
-
-It would be easier to read balance_leaf() if each of these summary
-lines was a separate procedure rather than being inlined.  I think
-that there are many passages here and in balance_leaf_when_delete() in
-which two calls to one procedure can replace two passages, and it
-might save cache space and improve software maintenance costs to do so.  
-
-Vladimir made the perceptive comment that we should offload most of
-the decision making in this function into fix_nodes/check_balance, and
-then create some sort of structure in tb that says what actions should
-be performed by do_balance.
-
--Hans */
-
-
-
-/* Balance leaf node in case of delete or cut: insert_size[0] < 0
- *
- * lnum, rnum can have values >= -1
- *	-1 means that the neighbor must be joined with S
- *	 0 means that nothing should be done with the neighbor
- *	>0 means to shift entirely or partly the specified number of items to the neighbor
- */
-static int balance_leaf_when_delete (/*struct reiserfs_transaction_handle *th,*/
-				     struct tree_balance * tb, 
-				     int flag)
-{
-    struct buffer_head * tbS0 = PATH_PLAST_BUFFER (tb->tb_path);
-    int item_pos = PATH_LAST_POSITION (tb->tb_path);
-    int pos_in_item = tb->tb_path->pos_in_item;
-    struct buffer_info bi;
-    int n;
-    struct item_head * ih;
-
-    ih = B_N_PITEM_HEAD (tbS0, item_pos);
-
-    /* Delete or truncate the item */
-
-    switch (flag) {
-    case M_DELETE:   /* delete item in S[0] */
-
-	bi.bi_bh = tbS0;
-	bi.bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-	bi.bi_position = PATH_H_POSITION (tb->tb_path, 1);
-	leaf_delete_items (tb->tb_fs, &bi, 0, item_pos, 1, -1);
-
-	if ( ! item_pos ) {
-	    // we have removed first item in the node - update left delimiting key
-	    if ( B_NR_ITEMS(tbS0) ) {
-		replace_key(tb->tb_fs, tb->CFL[0],tb->lkey[0],tbS0,0);
-	    }
-	    else {
-		if ( ! PATH_H_POSITION (tb->tb_path, 1) )
-		    replace_key(tb->tb_fs, tb->CFL[0],tb->lkey[0],PATH_H_PPARENT(tb->tb_path, 0),0);
-	    }
-	} 
-    
-	break;
-
-    case M_CUT: {  /* cut item in S[0] */
-	bi.bi_bh = tbS0;
-	bi.bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-	bi.bi_position = PATH_H_POSITION (tb->tb_path, 1);
-	if (I_IS_DIRECTORY_ITEM (ih)) {
-	    /* UFS unlink semantics are such that you can only delete
-               one directory entry at a time. */
-	    /* when we cut a directory tb->insert_size[0] means number
-               of entries to be cut (always 1) */
-	    tb->insert_size[0] = -1;
-	    leaf_cut_from_buffer (tb->tb_fs, &bi, item_pos, pos_in_item, -tb->insert_size[0]);
-
-	    if ( ! item_pos && ! pos_in_item ) {
-		replace_key(tb->tb_fs, tb->CFL[0],tb->lkey[0],tbS0,0);
-	    }
-	} else {
-	    leaf_cut_from_buffer (tb->tb_fs, &bi, item_pos, pos_in_item, -tb->insert_size[0]);
-	}
-	break;
-    }
-
-    default:
-	print_tb(flag, item_pos, pos_in_item, tb,"when_del");
-	reiserfs_panic ("PAP-12040: balance_leaf_when_delete: unexpectable mode: %s(%d)",
-			(flag == M_PASTE) ? "PASTE" : ((flag == M_INSERT) ? "INSERT" : "UNKNOWN"), flag);
-    }
-
-    /* the rule is that no shifting occurs unless by shifting a node can be freed */
-    n = B_NR_ITEMS(tbS0);
-    if ( tb->lnum[0] )     /* L[0] takes part in balancing */
-    {
-	if ( tb->lnum[0] == -1 )    /* L[0] must be joined with S[0] */
-	{
-	    if ( tb->rnum[0] == -1 )    /* R[0] must be also joined with S[0] */
-	    {			
-		if ( tb->FR[0] == PATH_H_PPARENT(tb->tb_path, 0) )
-		{
-		    /* all contents of all the 3 buffers will be in L[0] */
-		    if ( PATH_H_POSITION (tb->tb_path, 1) == 0 && 1 < B_NR_ITEMS(tb->FR[0]) )
-			replace_key(tb->tb_fs, tb->CFL[0],tb->lkey[0],tb->FR[0],1);
-
-
-		    leaf_move_items (LEAF_FROM_S_TO_L, tb, n, -1, 0);
-		    leaf_move_items (LEAF_FROM_R_TO_L, tb, B_NR_ITEMS(tb->R[0]), -1, 0);
-
-		    reiserfs_invalidate_buffer (tb, tbS0, 1/*do_free_block*/);
-		    reiserfs_invalidate_buffer (tb, tb->R[0], 1/*do_free_block*/);
-
-		    return 0;
-		}
-		/* all contents of all the 3 buffers will be in R[0] */
-		leaf_move_items(LEAF_FROM_S_TO_R, tb, n, -1, 0);
-		leaf_move_items(LEAF_FROM_L_TO_R, tb, B_NR_ITEMS(tb->L[0]), -1, 0);
-
-		/* right_delimiting_key is correct in R[0] */
-		replace_key(tb->tb_fs, tb->CFR[0],tb->rkey[0],tb->R[0],0);
-
-		reiserfs_invalidate_buffer (tb, tbS0, 1/*do_free_block*/);
-		reiserfs_invalidate_buffer (tb, tb->L[0], 1/*do_free_block*/);
-
-		return -1;
-	    }
-
-	    /* all contents of L[0] and S[0] will be in L[0] */
-	    leaf_shift_left(tb, n, -1);
-
-	    reiserfs_invalidate_buffer (tb, tbS0, 1/*do_free_block*/);
-
-	    return 0;
-	}
-	/* a part of contents of S[0] will be in L[0] and the rest part of S[0] will be in R[0] */
-
-	leaf_shift_left (tb, tb->lnum[0], tb->lbytes);
-	leaf_shift_right(tb, tb->rnum[0], tb->rbytes);
-
-	reiserfs_invalidate_buffer (tb, tbS0, 1/*do_free_block*/);
-
-	return 0;
-    }
-
-    if ( tb->rnum[0] == -1 ) {
-	/* all contents of R[0] and S[0] will be in R[0] */
-	leaf_shift_right(tb, n, -1);
-	reiserfs_invalidate_buffer (tb, tbS0, 1/*do_free_block*/);
-	return 0;
-    }
-    return 0;
-}
-
-static int balance_leaf(/*struct reiserfs_transaction_handle *th, */
-			struct tree_balance * tb, /* see reiserfs_fs.h */
-			struct item_head * ih, /* item header of inserted item */
-			const char * body,		/* body  of inserted item or bytes to paste */
-			int flag,			/* i - insert, d - delete, c - cut, p - paste
-							   (see comment to do_balance) */
-			int zeros_number,		/* it is always 0 */
-				
-			struct item_head * insert_key,  /* in our processing of one level we sometimes determine what
-							   must be inserted into the next higher level.  This insertion
-							   consists of a key or two keys and their corresponding
-							   pointers */
-			struct buffer_head ** insert_ptr /* inserted node-ptrs for the next level */
-    )
-{
-    int pos_in_item = tb->tb_path->pos_in_item; /* position in item, in bytes for direct and
-						   indirect items, in entries for directories (for
-						   which it is an index into the array of directory
-						   entry headers.) */
-    struct buffer_head * tbS0 = PATH_PLAST_BUFFER (tb->tb_path);
-/*  struct buffer_head * tbF0 = PATH_H_PPARENT (tb->tb_path, 0);
-    int S0_b_item_order = PATH_H_B_ITEM_ORDER (tb->tb_path, 0);*/
-    int item_pos = PATH_LAST_POSITION (tb->tb_path);	/*  index into the array of item headers in S[0] 
-							    of the affected item */
-    struct buffer_info bi;
-    struct buffer_head *S_new[2];  /* new nodes allocated to hold what could not fit into S */
-    int snum[2];			   /* number of items that will be placed into S_new (includes partially shifted items) */
-    int sbytes[2];                   /* if an item is partially shifted into S_new then 
-					if it is a directory item 
-					it is the number of entries from the item that are shifted into S_new
-					else
-					it is the number of bytes from the item that are shifted into S_new
-				     */
-    int n, i;
-    int ret_val;
-
-    /* Make balance in case insert_size[0] < 0 */
-    if ( tb->insert_size[0] < 0 )
-	return balance_leaf_when_delete (/*th,*/ tb, flag);
-  
-    /* for indirect item pos_in_item is measured in unformatted node
-       pointers. Recalculate to bytes */
-    if (flag != M_INSERT && I_IS_INDIRECT_ITEM (B_N_PITEM_HEAD (tbS0, item_pos)))
-	pos_in_item *= UNFM_P_SIZE;
-
-    if ( tb->lnum[0] > 0 ) {
-	/* Shift lnum[0] items from S[0] to the left neighbor L[0] */
-	if ( item_pos < tb->lnum[0] ) {
-	    /* new item or it part falls to L[0], shift it too */
-	    n = B_NR_ITEMS(tb->L[0]);
-
-	    switch (flag) {
-	    case M_INSERT:   /* insert item into L[0] */
-
-		if ( item_pos == tb->lnum[0] - 1 && tb->lbytes != -1 ) {
-		    /* part of new item falls into L[0] */
-		    int new_item_len;
-
-		    ret_val = leaf_shift_left (/*th,*/ tb, tb->lnum[0]-1, -1);
-		    /* Calculate item length to insert to S[0] */
-		    new_item_len = get_ih_item_len (ih) - tb->lbytes;
-		    /* Calculate and check item length to insert to L[0] */
-		    set_ih_item_len (ih, get_ih_item_len (ih) - new_item_len);
-		    /* Insert new item into L[0] */
-		    bi.bi_bh = tb->L[0];
-		    bi.bi_parent = tb->FL[0];
-		    bi.bi_position = get_left_neighbor_position (tb, 0);
-		    leaf_insert_into_buf (tb->tb_fs, &bi, n + item_pos - ret_val, ih, body,
-					  zeros_number > get_ih_item_len (ih) ? get_ih_item_len (ih) : zeros_number);
-
-		    /* Calculate key component, item length and body to insert into S[0] */
-		    //ih->ih_key.k_offset += tb->lbytes;
-		    set_offset (key_format (&ih->ih_key), &ih->ih_key, get_offset (&ih->ih_key) +
-		    	tb->lbytes * (is_indirect_ih(ih) ? tb->tb_fs->fs_blocksize / UNFM_P_SIZE : 1) );
-		    set_ih_item_len (ih, new_item_len);
-		    if ( tb->lbytes >  zeros_number ) {
-			body += (tb->lbytes - zeros_number);
-			zeros_number = 0;
-		    }
-		    else
-			zeros_number -= tb->lbytes;
-		} else {
-		    /* new item in whole falls into L[0] */
-		    /* Shift lnum[0]-1 items to L[0] */
-		    ret_val = leaf_shift_left(tb, tb->lnum[0]-1, tb->lbytes);
-
-		    /* Insert new item into L[0] */
-		    bi.bi_bh = tb->L[0];
-		    bi.bi_parent = tb->FL[0];
-		    bi.bi_position = get_left_neighbor_position (tb, 0);
-		    leaf_insert_into_buf (tb->tb_fs, &bi, n + item_pos - ret_val, ih, body, zeros_number);
-
-		    tb->insert_size[0] = 0;
-		    zeros_number = 0;
-		}
-		break;
-
-	    case M_PASTE:   /* append item in L[0] */
-
-		if ( item_pos == tb->lnum[0] - 1 && tb->lbytes != -1 ) {
-		    /* we must shift the part of the appended item */
-		    if ( I_IS_DIRECTORY_ITEM (B_N_PITEM_HEAD (tbS0, item_pos))) {
-			/* directory item */
-			if ( tb->lbytes > pos_in_item ) {
-			    /* new directory entry falls into L[0] */
-			    struct item_head * pasted;
-			    int l_pos_in_item = pos_in_item;
-							  
-			    /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */
-			    ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes - 1);
-			    if ( ret_val && ! item_pos ) {
-				pasted =  B_N_PITEM_HEAD(tb->L[0],B_NR_ITEMS(tb->L[0])-1);
-				l_pos_in_item += get_ih_entry_count(pasted) - (tb->lbytes-1);
-			    }
-
-			    /* Append given directory entry to directory item */
-			    bi.bi_bh = tb->L[0];
-			    bi.bi_parent = tb->FL[0];
-			    bi.bi_position = get_left_neighbor_position (tb, 0);
-			    leaf_paste_in_buffer (tb->tb_fs, &bi, n + item_pos - ret_val, l_pos_in_item,
-						  tb->insert_size[0], body, zeros_number);
-
-			    /* previous string prepared space for pasting new entry, following string pastes this entry */
-
-			    /* when we have merge directory item, pos_in_item has been changed too */
-
-			    /* paste new directory entry. 1 is entry number */
-			    leaf_paste_entries (bi.bi_bh, n + item_pos - ret_val, l_pos_in_item, 1,
-						(struct reiserfs_de_head *)body, 
-						body + DEH_SIZE, tb->insert_size[0]
-				);
-			    tb->insert_size[0] = 0;
-			} else {
-			    /* new directory item doesn't fall into L[0] */
-			    /* Shift lnum[0]-1 items in whole. Shift lbytes directory entries from directory item number lnum[0] */
-			    leaf_shift_left (tb, tb->lnum[0], tb->lbytes);
-			}
-			/* Calculate new position to append in item body */
-			pos_in_item -= tb->lbytes;
-		    }
-		    else {
-			/* regular object */
-			if ( tb->lbytes >= pos_in_item ) {
-			    /* appended item will be in L[0] in whole */
-			    int l_n, temp_n;
-                            struct key * key;
-
-			    /* this bytes number must be appended to the last item of L[h] */
-			    l_n = tb->lbytes - pos_in_item;
-
-			    /* Calculate new insert_size[0] */
-			    tb->insert_size[0] -= l_n;
-
-			    ret_val =  leaf_shift_left(tb, tb->lnum[0],
-						       get_ih_item_len (B_N_PITEM_HEAD(tbS0,item_pos)));
-			    /* Append to body of item in L[0] */
-			    bi.bi_bh = tb->L[0];
-			    bi.bi_parent = tb->FL[0];
-			    bi.bi_position = get_left_neighbor_position (tb, 0);
-			    leaf_paste_in_buffer(tb->tb_fs, 
-						 &bi,n + item_pos - ret_val,
-						 get_ih_item_len (B_N_PITEM_HEAD(tb->L[0],n+item_pos-ret_val)),
-						 l_n,body, zeros_number > l_n ? l_n : zeros_number);
-
-
-			    /* 0-th item in S0 can be only of DIRECT type when l_n != 0*/
-			    //B_N_PKEY (tbS0, 0)->k_offset += l_n;z
-			    key = B_N_PKEY (tbS0, 0);
-                            temp_n = is_indirect_ih(B_N_PITEM_HEAD (tb->L[0], n + item_pos - ret_val)) ?
-                                 (int)((l_n / UNFM_P_SIZE) * tb->tb_fs->fs_blocksize) : l_n;
-
-			    set_offset (key_format (key), key, get_offset (key) + temp_n);
-
-			    //B_N_PDELIM_KEY(tb->CFL[0],tb->lkey[0])->k_offset += l_n;
-			    key = B_N_PDELIM_KEY(tb->CFL[0],tb->lkey[0]);
-			    set_offset (key_format (key), key, get_offset (key) + temp_n);
-
-			    /* Calculate new body, position in item and insert_size[0] */
-			    if ( l_n > zeros_number ) {
-				body += (l_n - zeros_number);
-				zeros_number = 0;
-			    }
-			    else
-				zeros_number -= l_n;
-			    pos_in_item = 0;	
-			}
-			else {
-			    /* only part of the appended item will be in L[0] */
-
-			    /* Calculate position in item for append in S[0] */
-			    pos_in_item -= tb->lbytes;
-
-			    /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */
-			    leaf_shift_left(tb,tb->lnum[0],tb->lbytes);
-			}
-		    }
-		} else {
-		    /* appended item will be in L[0] in whole */
-		    struct item_head * pasted;
-		
-		    if ( ! item_pos  && is_left_mergeable (tb->tb_fs, tb->tb_path) == 1 )
-			{ /* if we paste into first item of S[0] and it is left mergable */
-			    /* then increment pos_in_item by the size of the last item in L[0] */
-			    pasted = B_N_PITEM_HEAD(tb->L[0],n-1);
-			    if ( I_IS_DIRECTORY_ITEM(pasted) )
-				pos_in_item += get_ih_entry_count (pasted);
-			    else
-				pos_in_item += get_ih_item_len (pasted);
-			}
-
-		    /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */
-		    ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes);
-		    /* Append to body of item in L[0] */
-		    bi.bi_bh = tb->L[0];
-		    bi.bi_parent = tb->FL[0];
-		    bi.bi_position = get_left_neighbor_position (tb, 0);
-		    leaf_paste_in_buffer (tb->tb_fs, &bi, n + item_pos - ret_val, pos_in_item, tb->insert_size[0],
-					  body, zeros_number);
-
-		    /* if appended item is directory, paste entry */
-		    pasted = B_N_PITEM_HEAD (tb->L[0], n + item_pos - ret_val);
-		    if (I_IS_DIRECTORY_ITEM (pasted))
-			leaf_paste_entries (bi.bi_bh, n + item_pos - ret_val, pos_in_item, 1, 
-					    (struct reiserfs_de_head *)body, body + DEH_SIZE, tb->insert_size[0]);
-
-		    /* if appended item is indirect item, put unformatted node into un list */
-		    if (I_IS_INDIRECT_ITEM (pasted))
-			set_ih_free_space (pasted, 0);
-
-		    tb->insert_size[0] = 0;
-		    zeros_number = 0;
-		}
-		break;
-	    default:    /* cases d and t */
-		reiserfs_panic ("PAP-12130: balance_leaf: lnum > 0: unexpectable mode: %s(%d)",
-				(flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag);
-	    }
-	} else { 
-	    /* new item doesn't fall into L[0] */
-	    leaf_shift_left (tb, tb->lnum[0], tb->lbytes);
-	}
-    }	/* tb->lnum[0] > 0 */
-
-    /* Calculate new item position */
-    item_pos -= ( tb->lnum[0] - (( tb->lbytes != -1 ) ? 1 : 0));
-
-    if ( tb->rnum[0] > 0 ) {
-	/* shift rnum[0] items from S[0] to the right neighbor R[0] */
-	n = B_NR_ITEMS(tbS0);
-	switch ( flag ) {
-
-	case M_INSERT:   /* insert item */
-	    if ( n - tb->rnum[0] < item_pos ) {
-		/* new item or its part falls to R[0] */
-		if ( item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1 ) {
-		    /* part of new item falls into R[0] */
-		    loff_t old_key_comp, old_len, r_zeros_number;
-		    const char * r_body;
-		    loff_t multiplyer;
-
-		    leaf_shift_right(tb, tb->rnum[0] - 1, -1);
-
-		    /* Remember key component and item length */
-		    old_key_comp = get_offset (&ih->ih_key);
-		    old_len = get_ih_item_len (ih);
-
-		    multiplyer = is_indirect_ih(ih) ? tb->tb_fs->fs_blocksize / UNFM_P_SIZE : 1;
-		    /* Calculate key component and item length to insert into R[0] */
-		    //ih->ih_key.k_offset += (old_len - tb->rbytes);
-		    set_offset (key_format (&ih->ih_key), &ih->ih_key, old_key_comp +
-		    	(old_len - tb->rbytes) * multiplyer );
-
-		    set_ih_item_len (ih, tb->rbytes);
-		    /* Insert part of the item into R[0] */
-		    bi.bi_bh = tb->R[0];
-		    bi.bi_parent = tb->FR[0];
-		    bi.bi_position = get_right_neighbor_position (tb, 0);
-		    if (old_len - tb->rbytes > zeros_number ) {
-			r_zeros_number = 0;
-			r_body = body + old_len - tb->rbytes - zeros_number;
-		    }
-		    else { /* zeros_number is always 0 */
-			r_body = body;
-			r_zeros_number = zeros_number - old_len - tb->rbytes;
-			zeros_number -= r_zeros_number;
-		    }
-
-		    leaf_insert_into_buf (tb->tb_fs, &bi, 0, ih, r_body, r_zeros_number);
-
-		    /* Replace right delimiting key by first key in R[0] */
-		    replace_key(tb->tb_fs, tb->CFR[0],tb->rkey[0],tb->R[0],0);
-
-		    /* Calculate key component and item length to insert into S[0] */
-		    //ih->ih_key.k_offset = old_key_comp;
-		    set_offset (key_format (&ih->ih_key), &ih->ih_key, old_key_comp);
-
-		    set_ih_item_len (ih, old_len - tb->rbytes);
-
-		    tb->insert_size[0] -= tb->rbytes;
-
-		} else {
-		    /* whole new item falls into R[0] */
-
-		    /* Shift rnum[0]-1 items to R[0] */
-		    ret_val = leaf_shift_right(tb, tb->rnum[0] - 1, tb->rbytes);
-
-		    /* Insert new item into R[0] */
-		    bi.bi_bh = tb->R[0];
-		    bi.bi_parent = tb->FR[0];
-		    bi.bi_position = get_right_neighbor_position (tb, 0);
-		    leaf_insert_into_buf (tb->tb_fs, &bi, item_pos - n + tb->rnum[0] - 1, ih, body, zeros_number);
-
-		    /* If we insert new item in the begin of R[0] change the right delimiting key */
-		    if ( item_pos - n + tb->rnum[0] - 1 == 0 ) {
-			replace_key (tb->tb_fs, tb->CFR[0],tb->rkey[0],tb->R[0],0);
-		    }
-		    zeros_number = tb->insert_size[0] = 0;
-		}
-	    } else {
-		/* new item or part of it doesn't fall into R[0] */
-		leaf_shift_right (tb, tb->rnum[0], tb->rbytes);
-	    }
-	    break;
-
-	case M_PASTE:   /* append item */
-
-	    if ( n - tb->rnum[0] <= item_pos ) { /* pasted item or part of it falls to R[0] */
-		if ( item_pos == n - tb->rnum[0] && tb->rbytes != -1 ) {
-		    /* we must shift the part of the appended item */
-		    if ( I_IS_DIRECTORY_ITEM (B_N_PITEM_HEAD(tbS0, item_pos))) {
-			/* we append to directory item */
-			int entry_count;
-
-			entry_count = get_ih_entry_count (B_N_PITEM_HEAD(tbS0, item_pos));
-			if ( entry_count - tb->rbytes < pos_in_item ) {
-			    /* new directory entry falls into R[0] */
-			    int paste_entry_position;
-
-			    /* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */
-			    leaf_shift_right (tb, tb->rnum[0], tb->rbytes - 1);
-
-			    /* Paste given directory entry to directory item */
-			    paste_entry_position = pos_in_item - entry_count + tb->rbytes - 1;
-
-			    bi.bi_bh = tb->R[0];
-			    bi.bi_parent = tb->FR[0];
-			    bi.bi_position = get_right_neighbor_position (tb, 0);
-			    leaf_paste_in_buffer (tb->tb_fs, &bi, 0, paste_entry_position,
-						  tb->insert_size[0],body,zeros_number);
-			    /* paste entry */
-			    leaf_paste_entries (
-				bi.bi_bh, 0, paste_entry_position, 1, (struct reiserfs_de_head *)body, 
-				body + DEH_SIZE, tb->insert_size[0]
-				);								
-						
-			    if ( paste_entry_position == 0 ) {
-				/* change delimiting keys */
-				replace_key(tb->tb_fs, tb->CFR[0],tb->rkey[0],tb->R[0],0);
-			    }
-
-			    tb->insert_size[0] = 0;
-			    pos_in_item++;
-			} else {
-			    /* new directory entry doesn't fall into R[0] */
-			    leaf_shift_right (tb, tb->rnum[0],tb->rbytes);
-			}
-		    }
-		    else {
-			/* regular object */
-
-			int n_shift, n_rem, r_zeros_number;
-			const char * r_body;
-			struct key * key;
-
-			/* Calculate number of bytes which must be shifted from appended item */
-			if ( (n_shift = tb->rbytes - tb->insert_size[0]) < 0 )
-			    n_shift = 0;
-
-			leaf_shift_right (tb, tb->rnum[0], n_shift);
-
-			/* Calculate number of bytes which must remain in body after appending to R[0] */
-			if ( (n_rem = tb->insert_size[0] - tb->rbytes) < 0 )
-			    n_rem = 0;
-
-			{
-			    unsigned long temp_rem = n_rem;
-			
-			    if (is_indirect_key(B_N_PKEY(tb->R[0],0)))
-				temp_rem = (n_rem / UNFM_P_SIZE) * tb->tb_fs->fs_blocksize;
-
-			    //B_N_PKEY(tb->R[0],0)->k_offset += n_rem;
-			    key = B_N_PKEY(tb->R[0],0);
-			    set_offset (key_format (key), key, get_offset (key) + temp_rem);
-
-			    //B_N_PDELIM_KEY(tb->CFR[0],tb->rkey[0])->k_offset += n_rem;
-			    key = B_N_PDELIM_KEY(tb->CFR[0],tb->rkey[0]);
-			    set_offset (key_format (key), key, get_offset (key) + temp_rem);
-                        }
-
-			mark_buffer_dirty (tb->CFR[0]);
-
-			/* Append part of body into R[0] */
-			bi.bi_bh = tb->R[0];
-			bi.bi_parent = tb->FR[0];
-			bi.bi_position = get_right_neighbor_position (tb, 0);
-			if ( n_rem > zeros_number ) {
-			    r_zeros_number = 0;
-			    r_body = body + n_rem - zeros_number;
-			}
-			else {
-			    r_body = body;
-			    r_zeros_number = zeros_number - n_rem;
-			    zeros_number -= r_zeros_number;
-			}
-
-			leaf_paste_in_buffer(tb->tb_fs, &bi, 0, n_shift, tb->insert_size[0] - n_rem, r_body, r_zeros_number);
-
-			if (I_IS_INDIRECT_ITEM(B_N_PITEM_HEAD(tb->R[0],0))) {
-			    set_ih_free_space (B_N_PITEM_HEAD(tb->R[0],0), 0);
-			}
-
-			tb->insert_size[0] = n_rem;
-			if ( ! n_rem )
-			    pos_in_item ++;
-		    }
-		}
-		else { 
-		    /* pasted item falls into R[0] entirely */
-
-		    struct item_head * pasted;
-
-		    ret_val = leaf_shift_right (tb, tb->rnum[0], tb->rbytes);
-
-		    /* append item in R[0] */
-		    if ( pos_in_item >= 0 ) {
-			bi.bi_bh = tb->R[0];
-			bi.bi_parent = tb->FR[0];
-			bi.bi_position = get_right_neighbor_position (tb, 0);
-			leaf_paste_in_buffer(tb->tb_fs, &bi,item_pos - n + tb->rnum[0], pos_in_item,
-					     tb->insert_size[0],body, zeros_number);
-		    }
-
-		    /* paste new entry, if item is directory item */
-		    pasted = B_N_PITEM_HEAD(tb->R[0], item_pos - n + tb->rnum[0]);
-		    if (I_IS_DIRECTORY_ITEM (pasted) && pos_in_item >= 0 ) {
-			leaf_paste_entries (bi.bi_bh, item_pos - n + tb->rnum[0], pos_in_item, 1, 
-					    (struct reiserfs_de_head *)body, body + DEH_SIZE, tb->insert_size[0]);
-			if ( ! pos_in_item ) {
-			    /* update delimiting keys */
-			    replace_key (tb->tb_fs, tb->CFR[0],tb->rkey[0],tb->R[0],0);
-			}
-		    }
-
-		    if (I_IS_INDIRECT_ITEM (pasted))
-			set_ih_free_space (pasted, 0);
-		    zeros_number = tb->insert_size[0] = 0;
-		}
-	    }
-	    else {
-		/* new item doesn't fall into R[0] */
-		leaf_shift_right (tb, tb->rnum[0], tb->rbytes);
-	    }
-	    break;
-
-	default:    /* cases d and t */
-	    reiserfs_panic ("PAP-12175: balance_leaf: rnum > 0: unexpectable mode: %s(%d)",
-			    (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag);
-	}
-    
-    }	/* tb->rnum[0] > 0 */
-
-    /* if while adding to a node we discover that it is possible to split
-       it in two, and merge the left part into the left neighbor and the
-       right part into the right neighbor, eliminating the node */
-    if ( tb->blknum[0] == 0 ) { /* node S[0] is empty now */
-        /* if insertion was done before 0-th position in R[0], right
-           delimiting key of the tb->L[0]'s and left delimiting key are
-           not set correctly */
-        if (tb->CFL[0]) {
-            if (!tb->CFR[0])
-                reiserfs_panic (tb->tb_fs, "vs-12195: balance_leaf: CFR not initialized");
-            copy_key (B_N_PDELIM_KEY (tb->CFL[0], tb->lkey[0]), B_N_PDELIM_KEY (tb->CFR[0], tb->rkey[0]));
-            mark_buffer_dirty (tb->CFL[0]);
-        }
-        
-	reiserfs_invalidate_buffer(tb,tbS0, 1);									
-	return 0;
-    }
-
-
-    /* Fill new nodes that appear in place of S[0] */
-
-    /* I am told that this copying is because we need an array to enable
-       the looping code. -Hans */
-    snum[0] = tb->s1num,
-	snum[1] = tb->s2num;
-    sbytes[0] = tb->s1bytes;
-    sbytes[1] = tb->s2bytes;
-    for( i = tb->blknum[0] - 2; i >= 0; i-- ) {
-	/* here we shift from S to S_new nodes */
-	S_new[i] = get_FEB(tb);
-
-	/* set block_head's level to leaf level */
-	set_blkh_level (B_BLK_HEAD (S_new[i]), DISK_LEAF_NODE_LEVEL);
-
-	n = B_NR_ITEMS(tbS0);
-	
-	switch (flag) {
-	case M_INSERT:   /* insert item */
-
-	    if ( n - snum[i] < item_pos ) {
-		/* new item or it's part falls to first new node S_new[i]*/
-		if ( item_pos == n - snum[i] + 1 && sbytes[i] != -1 ) {
-		    /* part of new item falls into S_new[i] */
-		    int old_key_comp, old_len, r_zeros_number;
-		    const char * r_body;
-		    loff_t multiplyer;
-
-		    /* Move snum[i]-1 items from S[0] to S_new[i] */
-		    leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i] - 1, -1, S_new[i]);
-
-		    /* Remember key component and item length */
-		    old_key_comp = get_offset (&ih->ih_key);
-		    old_len = get_ih_item_len (ih);
-		    multiplyer = is_indirect_ih(ih) ? tb->tb_fs->fs_blocksize / UNFM_P_SIZE : 1;
-
-		    /* Calculate key component and item length to insert into S_new[i] */
-		    //ih->ih_key.k_offset += (old_len - sbytes[i]);
-		    set_offset (key_format (&ih->ih_key), &ih->ih_key, old_key_comp +
-		    	(old_len - sbytes[i]) * multiplyer);
-
-		    set_ih_item_len (ih, sbytes[i]);
-
-		    /* Insert part of the item into S_new[i] before 0-th item */
-		    bi.bi_bh = S_new[i];
-		    bi.bi_parent = 0;
-		    bi.bi_position = 0;
-
-		    if ( old_len - sbytes[i] > zeros_number ) {
-			r_zeros_number = 0;
-			r_body = body + (old_len - sbytes[i]) - zeros_number;
-		    }
-		    else {
-			r_body = body;
-			r_zeros_number = zeros_number - (old_len - sbytes[i]);
-			zeros_number -= r_zeros_number;
-		    }
-
-		    leaf_insert_into_buf (tb->tb_fs, &bi, 0, ih, r_body, r_zeros_number);
-
-		    /* Calculate key component and item length to insert into S[i] */
-		    //ih->ih_key.k_offset = old_key_comp;
-		    set_offset (key_format (&ih->ih_key), &ih->ih_key, old_key_comp);
-		    set_ih_item_len (ih, old_len - sbytes[i]);
-		    tb->insert_size[0] -= sbytes[i];
-		}
-		else /* whole new item falls into S_new[i] */
-		{
-		    /* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */
-		    leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i] - 1, sbytes[i], S_new[i]);
-
-		    /* Insert new item into S_new[i] */
-		    bi.bi_bh = S_new[i];
-		    bi.bi_parent = 0;
-		    bi.bi_position = 0;
-		    leaf_insert_into_buf (tb->tb_fs, &bi, item_pos - n + snum[i] - 1, ih, body, zeros_number);
-		    zeros_number = tb->insert_size[0] = 0;
-		}
-	    }
-
-	    else /* new item or it part don't falls into S_new[i] */
-	    {
-		leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]);
-	    }
-	    break;
-
-	case M_PASTE:   /* append item */
-
-	    if ( n - snum[i] <= item_pos )  /* pasted item or part if it falls to S_new[i] */
-	    {
-		if ( item_pos == n - snum[i] && sbytes[i] != -1 )
-		{ /* we must shift part of the appended item */
-		    struct item_head * aux_ih;
-
-		    if ( I_IS_DIRECTORY_ITEM (aux_ih = B_N_PITEM_HEAD(tbS0,item_pos))) {
-			/* we append to directory item */
-
-			int entry_count;
-		
-			entry_count = get_ih_entry_count(aux_ih);
-
-			if ( entry_count - sbytes[i] < pos_in_item  && pos_in_item <= entry_count ) {
-			    /* new directory entry falls into S_new[i] */
-		  
-			    /* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */
-			    leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i]-1, S_new[i]);
-
-			    /* Paste given directory entry to directory item */
-			    bi.bi_bh = S_new[i];
-			    bi.bi_parent = 0;
-			    bi.bi_position = 0;
-			    leaf_paste_in_buffer (tb->tb_fs, &bi, 0, pos_in_item - entry_count + sbytes[i] - 1,
-						  tb->insert_size[0], body,zeros_number);
-			    /* paste new directory entry */
-			    leaf_paste_entries (
-				bi.bi_bh, 0, pos_in_item - entry_count + sbytes[i] - 1,
-				1, (struct reiserfs_de_head *)body, body + DEH_SIZE,
-				tb->insert_size[0]
-				);
-			    tb->insert_size[0] = 0;
-			    pos_in_item++;
-			} else { /* new directory entry doesn't fall into S_new[i] */
-			    leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]);
-			}
-		    }
-		    else /* regular object */
-		    {
-			int n_shift, n_rem, r_zeros_number;
-			const char * r_body;
-			struct item_head * tmp;
-
-			/* Calculate number of bytes which must be shifted from appended item */
-			n_shift = sbytes[i] - tb->insert_size[0];
-			if ( n_shift < 0 )
-			    n_shift = 0;
-			leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i], n_shift, S_new[i]);
-
-			/* Calculate number of bytes which must remain in body after append to S_new[i] */
-			n_rem = tb->insert_size[0] - sbytes[i];
-			if ( n_rem < 0 )
-			    n_rem = 0;
-			/* Append part of body into S_new[0] */
-			bi.bi_bh = S_new[i];
-			bi.bi_parent = 0;
-			bi.bi_position = 0;
-
-			if ( n_rem > zeros_number ) {
-			    r_zeros_number = 0;
-			    r_body = body + n_rem - zeros_number;
-			}
-			else {
-			    r_body = body;
-			    r_zeros_number = zeros_number - n_rem;
-			    zeros_number -= r_zeros_number;
-			}
-
-			leaf_paste_in_buffer(tb->tb_fs, &bi, 0, n_shift, tb->insert_size[0]-n_rem, r_body,r_zeros_number);
-			tmp = B_N_PITEM_HEAD (S_new[i], 0);
-			if (I_IS_INDIRECT_ITEM(tmp)) {
-/*			
-			    if (n_rem)
-				reiserfs_panic ("PAP-12230: balance_leaf: "
-						"invalid action with indirect item");
-			    set_ih_free_space (tmp, 0);
-*/
-			    set_ih_free_space (tmp, 0);
-			    set_offset( key_format (&tmp->ih_key), &tmp->ih_key, get_offset(&tmp->ih_key) +
-				(n_rem / UNFM_P_SIZE) * tb->tb_fs->fs_blocksize);
-			} else
-				set_offset (key_format (&tmp->ih_key), &tmp->ih_key, get_offset (&tmp->ih_key) + n_rem);
-
-			//B_N_PKEY(S_new[i],0)->k_offset += n_rem;
-//			
-
-			tb->insert_size[0] = n_rem;
-			if ( ! n_rem )
-			    pos_in_item++;
-		    }
-		}
-		else
-		    /* item falls wholly into S_new[i] */
-		{
-		    struct item_head * pasted;
-		
-		    leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]);
-		    /* paste into item */
-		    bi.bi_bh = S_new[i];
-		    bi.bi_parent = 0;
-		    bi.bi_position = 0;
-		    leaf_paste_in_buffer(tb->tb_fs, &bi, item_pos - n + snum[i], pos_in_item, tb->insert_size[0], body, zeros_number);
-
-		    pasted = B_N_PITEM_HEAD(S_new[i], item_pos - n + snum[i]);
-		    if (I_IS_DIRECTORY_ITEM (pasted)) {
-			leaf_paste_entries (bi.bi_bh, item_pos - n + snum[i], pos_in_item, 1, 
-					    (struct reiserfs_de_head *)body, body + DEH_SIZE, tb->insert_size[0]);
-		    }
-
-		    /* if we paste to indirect item update ih_free_space */
-		    if (I_IS_INDIRECT_ITEM (pasted))
-			set_ih_free_space (pasted, 0);
-		    zeros_number = tb->insert_size[0] = 0;
-		}
-	    } else {
-		/* pasted item doesn't fall into S_new[i] */
-		leaf_move_items (LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i], S_new[i]);
-	    }
-	    break;
-
-	default:    /* cases d and t */
-	    reiserfs_panic ("PAP-12245: balance_leaf: blknum > 2: unexpectable mode: %s(%d)",
-			    (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag);
-	}
-
-	memcpy (insert_key + i,B_N_PKEY(S_new[i],0),KEY_SIZE);
-	insert_ptr[i] = S_new[i];
-    }
-
-    /* if the affected item was not wholly shifted then we perform all
-       necessary operations on that part or whole of the affected item which
-       remains in S */
-    if ( 0 <= item_pos && item_pos < tb->s0num ) {
-	/* if we must insert or append into buffer S[0] */
-
-	switch (flag) {
-	case M_INSERT:   /* insert item into S[0] */
-	    bi.bi_bh = tbS0;
-	    bi.bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-	    bi.bi_position = PATH_H_POSITION (tb->tb_path, 1);
-	    leaf_insert_into_buf (tb->tb_fs, &bi, item_pos, ih, body, zeros_number);
-
-	    /* If we insert the first key change the delimiting key */
-	    if( item_pos == 0 ) {
-		if (tb->CFL[0]) /* can be 0 in reiserfsck */
-		    replace_key (tb->tb_fs, tb->CFL[0], tb->lkey[0],tbS0,0);
-	    }
-	    break;
-
-	case M_PASTE: {  /* append item in S[0] */
-	    struct item_head * pasted;
-
-	    pasted = B_N_PITEM_HEAD (tbS0, item_pos);
-	    /* when directory, may be new entry already pasted */
-	    if (I_IS_DIRECTORY_ITEM (pasted)) {
-		if ( pos_in_item >= 0 && pos_in_item <= get_ih_entry_count (pasted) ) {
-		    /* prepare space */
-		    bi.bi_bh = tbS0;
-		    bi.bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-		    bi.bi_position = PATH_H_POSITION (tb->tb_path, 1);
-		    leaf_paste_in_buffer(tb->tb_fs, &bi, item_pos, pos_in_item, tb->insert_size[0], body, zeros_number);
-
-		    /* paste entry */
-		    leaf_paste_entries (bi.bi_bh, item_pos, pos_in_item, 1, (struct reiserfs_de_head *)body,
-					body + DEH_SIZE, tb->insert_size[0]);
-		    if ( ! item_pos && ! pos_in_item ) {
-			if (tb->CFL[0])  // can be 0 in reiserfsck
-			    replace_key(tb->tb_fs, tb->CFL[0], tb->lkey[0],tbS0,0);
-		    }
-		    tb->insert_size[0] = 0;
-		}
-	    } else { /* regular object */
-		if ( pos_in_item == get_ih_item_len (pasted) ) {
-		    bi.bi_bh = tbS0;
-		    bi.bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-		    bi.bi_position = PATH_H_POSITION (tb->tb_path, 1);
-		    leaf_paste_in_buffer (tb->tb_fs, &bi, item_pos, pos_in_item, tb->insert_size[0], body, zeros_number);
-
-		    if (I_IS_INDIRECT_ITEM (pasted)) {
-			set_ih_free_space (pasted, 0);
-		    }
-		    tb->insert_size[0] = 0;
-		}
-	    }
-	} /* case M_PASTE: */
-	}
-    }
-
-    return 0;
-} /* Leaf level of the tree is balanced (end of balance_leaf) */
-
-
-void make_empty_leaf (struct buffer_head * bh)
-{
-    set_blkh_nr_items (B_BLK_HEAD (bh), 0);
-    set_blkh_free_space (B_BLK_HEAD (bh), MAX_FREE_SPACE (bh->b_size));
-    set_blkh_level (B_BLK_HEAD (bh), DISK_LEAF_NODE_LEVEL);
-}
-
-
-/* Make empty node */
-void make_empty_node (struct buffer_info * bi)
-{
-    make_empty_leaf (bi->bi_bh);
-
-    if (bi->bi_parent)
-	set_dc_child_size (B_N_CHILD (bi->bi_parent, bi->bi_position), 0);
-}
-
-
-/* Get first empty buffer */
-struct buffer_head * get_FEB (struct tree_balance * tb)
-{
-    int i;
-    struct buffer_head * first_b;
-    struct buffer_info bi;
-
-    for (i = 0; i < MAX_FEB_SIZE; i ++)
-	if (tb->FEB[i] != 0)
-	    break;
-
-    if (i == MAX_FEB_SIZE)
-	reiserfs_panic("vs-12300: get_FEB: FEB list is empty");
-
-    bi.bi_bh = first_b = tb->FEB[i];
-    bi.bi_parent = 0;
-    bi.bi_position = 0;
-    make_empty_node (&bi);
-    misc_set_bit(BH_Uptodate, &first_b->b_state);
-
-    tb->FEB[i] = 0;
-    tb->used[i] = first_b;
-
-    return(first_b);
-}
-
-
-/* Replace n_dest'th key in buffer dest by n_src'th key of buffer src.*/
-void replace_key (reiserfs_filsys_t * fs,
-		  struct buffer_head * dest, int n_dest,
-		  struct buffer_head * src, int n_src)
-{
-    if (dest) {
-	if (is_leaf_node (src))
-	    /* source buffer contains leaf node */
-	    memcpy (B_N_PDELIM_KEY(dest,n_dest), B_N_PITEM_HEAD(src,n_src), KEY_SIZE);
-	else
-	    memcpy (B_N_PDELIM_KEY(dest,n_dest), B_N_PDELIM_KEY(src,n_src), KEY_SIZE);
-	
-	mark_buffer_dirty(dest);
-    }
-}
-
-
-void reiserfs_invalidate_buffer (struct tree_balance * tb, struct buffer_head * bh, int do_free_block)
-{
-    set_blkh_level (B_BLK_HEAD (bh), FREE_LEVEL);
-    misc_clear_bit(BH_Dirty, &bh->b_state);
-
-    if (do_free_block) {
-	struct buffer_head * to_be_forgotten;
-
-	to_be_forgotten = find_buffer (bh->b_dev, bh->b_blocknr, bh->b_size);
-	if (to_be_forgotten) {
-	    to_be_forgotten->b_count ++;
-	    bforget (to_be_forgotten);
-	}
-
-	reiserfs_free_block (tb->tb_fs, bh->b_blocknr);
-    }
-}
-
-
-int get_left_neighbor_position (
-				struct tree_balance * tb, 
-				int h
-				)
-{
-  int Sh_position = PATH_H_POSITION (tb->tb_path, h + 1);
-
-  if (Sh_position == 0)
-    return B_NR_ITEMS (tb->FL[h]);
-  else
-    return Sh_position - 1;
-}
-
-
-int get_right_neighbor_position (struct tree_balance * tb, int h)
-{
-  int Sh_position = PATH_H_POSITION (tb->tb_path, h + 1);
-
-  if (Sh_position == B_NR_ITEMS (PATH_H_PPARENT (tb->tb_path, h)))
-    return 0;
-  else
-    return Sh_position + 1;
-}
-
-/* Now we have all of the buffers that must be used in balancing of the tree.
-   We rely on the assumption that schedule() will not occur while do_balance
-   works. ( Only interrupt handlers are acceptable.)  We balance the tree
-   according to the analysis made before this, using buffers already obtained.
-   For SMP support it will someday be necessary to add ordered locking of
-   tb. */
-
-/* Some interesting rules of balancing:
-
-   we delete a maximum of two nodes per level per balancing: we never delete R, when we delete two
-   of three nodes L, S, R then we move them into R.
-
-   we only delete L if we are deleting two nodes, if we delete only one node we delete S
-
-   if we shift leaves then we shift as much as we can: this is a deliberate policy of extremism in
-   node packing which results in higher average utilization after repeated random balance
-   operations at the cost of more memory copies and more balancing as a result of small insertions
-   to full nodes.
-
-   if we shift internal nodes we try to evenly balance the node utilization, with consequent less
-   balancing at the cost of lower utilization.
-
-   one could argue that the policy for directories in leaves should be that of internal nodes, but
-   we will wait until another day to evaluate this....  It would be nice to someday measure and
-   prove these assumptions as to what is optimal....
-
-*/
-
-void do_balance (struct tree_balance * tb,		/* tree_balance structure 		*/
-		 struct item_head * ih,	/* item header of inserted item */
-		 const char * body, /* body  of inserted item or bytes to paste */
-		 int flag,  /* i - insert, d - delete
-			       c - cut, p - paste
-						      
-			       Cut means delete part of an item (includes
-			       removing an entry from a directory).
-						      
-			       Delete means delete whole item.
-						      
-			       Insert means add a new item into the tree.
-						      						      
-			       Paste means to append to the end of an existing
-			       file or to insert a directory entry.  */
-		 int zeros_num)
-{
-    //int pos_in_item = tb->tb_path->pos_in_item;
-    int child_pos, /* position of a child node in its parent */
-	h;	   /* level of the tree being processed */
-    struct item_head insert_key[2]; /* in our processing of one level we
-				       sometimes determine what must be
-				       inserted into the next higher level.
-				       This insertion consists of a key or two
-				       keys and their corresponding pointers */
-    struct buffer_head *insert_ptr[2]; /* inserted node-ptrs for the next
-					  level */
-
-    /* if we have no real work to do  */
-    if ( ! tb->insert_size[0] ) {
-	unfix_nodes(/*th,*/ tb);
-	return;
-    }
-
-    if (flag == M_INTERNAL) {
-	insert_ptr[0] = (struct buffer_head *)body;
-	/* we must prepare insert_key */
-
-	if (PATH_H_B_ITEM_ORDER (tb->tb_path, 0)/*LAST_POSITION (tb->tb_path)*//*item_pos*/ == -1) {
-		/* get delimiting key from buffer in tree */
-		copy_key (&insert_key[0].ih_key, B_N_PKEY (PATH_PLAST_BUFFER (tb->tb_path), 0));
-		/*insert_ptr[0]->b_item_order = 0;*/
-	} else {
-	    /* get delimiting key from new buffer */
-	    copy_key (&insert_key[0].ih_key, B_N_PKEY((struct buffer_head *)body,0));
-	    /*insert_ptr[0]->b_item_order = item_pos;*/
-	}
-      
-	/* and insert_ptr instead of balance_leaf */
-	child_pos = PATH_H_B_ITEM_ORDER (tb->tb_path, 0)/*item_pos*/;
-    } else
-	/* balance leaf returns 0 except if combining L R and S into one node.
-	   see balance_internal() for explanation of this line of code.*/
-	child_pos = PATH_H_B_ITEM_ORDER (tb->tb_path, 0) +
-	    balance_leaf (/*th,*/ tb/*, pos_in_item*/, ih, body, flag, zeros_num, insert_key, insert_ptr);
-
-    /* Balance internal level of the tree. */
-    for ( h = 1; h < MAX_HEIGHT && tb->insert_size[h]; h++ )
-	child_pos = balance_internal (/*th,*/ tb, h, child_pos, insert_key, insert_ptr);
-
-    /* Release all (except for S[0]) non NULL buffers fixed by fix_nodes() */
-    unfix_nodes(/*th,*/ tb);
-}
-
-
-
-
-
-
-
-
-
diff --git a/reiserfscore/hashes.c b/reiserfscore/hashes.c
deleted file mode 100644
index 6a08072..0000000
--- a/reiserfscore/hashes.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-/*
- * Keyed 32-bit hash function using TEA in a Davis-Meyer function
- *   H0 = Key
- *   Hi = E Mi(Hi-1) + Hi-1
- *
- * (see Applied Cryptography, 2nd edition, p448).
- *
- * Jeremy Fitzhardinge <jeremy@zip.com.au> 1998
- * 
- * Jeremy has agreed to the contents of reiserfs/README. -Hans
- * Yura's function is added (04/07/2000)
- */
-
-//
-// keyed_hash
-// yura_hash
-// r5
-//
-
-#include <asm/types.h>
-
-
-
-#define DELTA 0x9E3779B9
-#define FULLROUNDS 10		/* 32 is overkill, 16 is strong crypto */
-#define PARTROUNDS 6		/* 6 gets complete mixing */
-
-#ifndef __KERNEL__
-typedef __u32 u32;
-#endif
-
-/* a, b, c, d - data; h0, h1 - accumulated hash */
-#define TEACORE(rounds)							\
-	do {								\
-		u32 sum = 0;						\
-		int n = rounds;						\
-		u32 b0, b1;						\
-									\
-		b0 = h0;						\
-		b1 = h1;						\
-									\
-		do							\
-		{							\
-			sum += DELTA;					\
-			b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b);	\
-			b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d);	\
-		} while(--n);						\
-									\
-		h0 += b0;						\
-		h1 += b1;						\
-	} while(0)
-
-
-u32 keyed_hash(const signed char *msg, int len)
-{
-	u32 k[] = { 0x9464a485, 0x542e1a94, 0x3e846bff, 0xb75bcfc3}; 
-
-	u32 h0 = k[0], h1 = k[1];
-	u32 a, b, c, d;
-	u32 pad;
-	int i;
- 
-
-	pad = (u32)len | ((u32)len << 8);
-	pad |= pad << 16;
-
-	while(len >= 16)
-	{
-		a = (u32)msg[ 0]      |
-		    (u32)msg[ 1] << 8 |
-		    (u32)msg[ 2] << 16|
-		    (u32)msg[ 3] << 24;
-		b = (u32)msg[ 4]      |
-		    (u32)msg[ 5] << 8 |
-		    (u32)msg[ 6] << 16|
-		    (u32)msg[ 7] << 24;
-		c = (u32)msg[ 8]      |
-		    (u32)msg[ 9] << 8 |
-		    (u32)msg[10] << 16|
-		    (u32)msg[11] << 24;
-		d = (u32)msg[12]      |
-		    (u32)msg[13] << 8 |
-		    (u32)msg[14] << 16|
-		    (u32)msg[15] << 24;
-		
-		TEACORE(PARTROUNDS);
-
-		len -= 16;
-		msg += 16;
-	}
-
-	if (len >= 12)
-	{
-		if (len >= 16)
-		    *(int *)0 = 0;
-
-		a = (u32)msg[ 0]      |
-		    (u32)msg[ 1] << 8 |
-		    (u32)msg[ 2] << 16|
-		    (u32)msg[ 3] << 24;
-		b = (u32)msg[ 4]      |
-		    (u32)msg[ 5] << 8 |
-		    (u32)msg[ 6] << 16|
-		    (u32)msg[ 7] << 24;
-		c = (u32)msg[ 8]      |
-		    (u32)msg[ 9] << 8 |
-		    (u32)msg[10] << 16|
-		    (u32)msg[11] << 24;
-
-		d = pad;
-		for(i = 12; i < len; i++)
-		{
-			d <<= 8;
-			d |= msg[i];
-		}
-	}
-	else if (len >= 8)
-	{
-		if (len >= 12)
-		    *(int *)0 = 0;
-		a = (u32)msg[ 0]      |
-		    (u32)msg[ 1] << 8 |
-		    (u32)msg[ 2] << 16|
-		    (u32)msg[ 3] << 24;
-		b = (u32)msg[ 4]      |
-		    (u32)msg[ 5] << 8 |
-		    (u32)msg[ 6] << 16|
-		    (u32)msg[ 7] << 24;
-
-		c = d = pad;
-		for(i = 8; i < len; i++)
-		{
-			c <<= 8;
-			c |= msg[i];
-		}
-	}
-	else if (len >= 4)
-	{
-		if (len >= 8)
-		    *(int *)0 = 0;
-		a = (u32)msg[ 0]      |
-		    (u32)msg[ 1] << 8 |
-		    (u32)msg[ 2] << 16|
-		    (u32)msg[ 3] << 24;
-
-		b = c = d = pad;
-		for(i = 4; i < len; i++)
-		{
-			b <<= 8;
-			b |= msg[i];
-		}
-	}
-	else
-	{
-		if (len >= 4)
-		    *(int *)0 = 0;
-		a = b = c = d = pad;
-		for(i = 0; i < len; i++)
-		{
-			a <<= 8;
-			a |= msg[i];
-		}
-	}
-
-	TEACORE(FULLROUNDS);
-
-	return h0^h1;
-}
-
-
-u32 yura_hash (const signed char *msg, int len)
-{
-    int j, pow;
-    u32 a, c;
-    int i;
-    
-    for (pow=1,i=1; i < len; i++) pow = pow * 10; 
-    
-    if (len == 1) 
-	a = msg[0]-48;
-    else
-	a = (msg[0] - 48) * pow;
-    
-    for (i=1; i < len; i++) {
-	c = msg[i] - 48; 
-	for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
-	a = a + c * pow;
-    }
-    
-    for (; i < 40; i++) {
-	c = '0' - 48; 
-	for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
-	a = a + c * pow;
-    }
-    
-    for (; i < 256; i++) {
-	c = i; 
-	for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
-	a = a + c * pow;
-    }
-    
-    a = a << 7;
-    return a;
-}
-
-
-u32 r5_hash (const signed char *msg, int len)
-{
-    u32 a=0;
-    int i;
-    
-    for (i = 0; i < len; i ++) {
-	a += msg[i] << 4;
-	a += msg[i] >> 4;
-	a *= 11;
-    } 
-    return a;
-}
-
-
-#if 0
-
-#include <stdio.h>
-
-int main (void)
-{
-    char * name = 0;
-    size_t n = 0;
-
-    while (1) {
-	getline (&name, &n, stdin);
-	if (!strcmp (name, "\n"))
-	    break;
-	name [strlen (name) - 1] = 0;
-	printf ("tea %lu\n, r5 %lu\nyura %lu\n",
-		keyed_hash (name, strlen (name)) & 0x7fffff80,
-		r5_hash (name, strlen (name)) & 0x7fffff80,
-		yura_hash (name, strlen (name)) & 0x7fffff80);
-	free (name);
-	name = 0;
-	n = 0;
-    }
-}
-
-#endif
-
diff --git a/reiserfscore/ibalance.c b/reiserfscore/ibalance.c
deleted file mode 100644
index bd0d29e..0000000
--- a/reiserfscore/ibalance.c
+++ /dev/null
@@ -1,890 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "includes.h"
-
-
-/* modes of internal_shift_left, internal_shift_right and internal_insert_childs */
-#define INTERNAL_SHIFT_FROM_S_TO_L 0
-#define INTERNAL_SHIFT_FROM_R_TO_S 1
-#define INTERNAL_SHIFT_FROM_L_TO_S 2
-#define INTERNAL_SHIFT_FROM_S_TO_R 3
-#define INTERNAL_INSERT_TO_S 4
-#define INTERNAL_INSERT_TO_L 5
-#define INTERNAL_INSERT_TO_R 6
-
-static void	internal_define_dest_src_infos (
-						int shift_mode,
-						struct tree_balance * tb,
-						int h,
-						struct buffer_info * dest_bi,
-						struct buffer_info * src_bi,
-						int * d_key,
-						struct buffer_head ** cf
-						)
-{
-  /* define dest, src, dest parent, dest position */
-  switch (shift_mode) {
-  case INTERNAL_SHIFT_FROM_S_TO_L:	/* used in internal_shift_left */
-    src_bi->bi_bh = PATH_H_PBUFFER (tb->tb_path, h);
-    src_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-    src_bi->bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-    dest_bi->bi_bh = tb->L[h];
-    dest_bi->bi_parent = tb->FL[h];
-    dest_bi->bi_position = get_left_neighbor_position (tb, h);
-    *d_key = tb->lkey[h];
-    *cf = tb->CFL[h];
-    break;
-  case INTERNAL_SHIFT_FROM_L_TO_S:
-    src_bi->bi_bh = tb->L[h];
-    src_bi->bi_parent = tb->FL[h];
-    src_bi->bi_position = get_left_neighbor_position (tb, h);
-    dest_bi->bi_bh = PATH_H_PBUFFER (tb->tb_path, h);
-    dest_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-    dest_bi->bi_position = PATH_H_POSITION (tb->tb_path, h + 1); /* dest position is analog of dest->b_item_order */
-    *d_key = tb->lkey[h];
-    *cf = tb->CFL[h];
-    break;
-
-  case INTERNAL_SHIFT_FROM_R_TO_S:	/* used in internal_shift_left */
-    src_bi->bi_bh = tb->R[h];
-    src_bi->bi_parent = tb->FR[h];
-    src_bi->bi_position = get_right_neighbor_position (tb, h);
-    dest_bi->bi_bh = PATH_H_PBUFFER (tb->tb_path, h);
-    dest_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-    dest_bi->bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-    *d_key = tb->rkey[h];
-    *cf = tb->CFR[h];
-    break;
-  case INTERNAL_SHIFT_FROM_S_TO_R:
-    src_bi->bi_bh = PATH_H_PBUFFER (tb->tb_path, h);
-    src_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-    src_bi->bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-    dest_bi->bi_bh = tb->R[h];
-    dest_bi->bi_parent = tb->FR[h];
-    dest_bi->bi_position = get_right_neighbor_position (tb, h);
-    *d_key = tb->rkey[h];
-    *cf = tb->CFR[h];
-    break;
-
-  case INTERNAL_INSERT_TO_L:
-    dest_bi->bi_bh = tb->L[h];
-    dest_bi->bi_parent = tb->FL[h];
-    dest_bi->bi_position = get_left_neighbor_position (tb, h);
-    break;
-
-  case INTERNAL_INSERT_TO_S:
-    dest_bi->bi_bh = PATH_H_PBUFFER (tb->tb_path, h);
-    dest_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-    dest_bi->bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-    break;
-
-  case INTERNAL_INSERT_TO_R:
-    dest_bi->bi_bh = tb->R[h];
-    dest_bi->bi_parent = tb->FR[h];
-    dest_bi->bi_position = get_right_neighbor_position (tb, h);
-    break;
-
-  default:
-      reiserfs_panic ("internal_define_dest_src_infos", "shift type is unknown (%d)", shift_mode);
-  }
-}
-
-
-
-/* Insert 'count' node pointers into buffer cur before position 'to' + 1.
- * Insert count items into buffer cur before position to.
- * Items and node pointers are specified by inserted and bh respectively.
- */ 
-static void internal_insert_childs (reiserfs_filsys_t * fs, 
-				    struct buffer_info * cur_bi,
-				    int to, int count,
-				    struct item_head * inserted,
-				    struct buffer_head ** bh)
-{
-    struct buffer_head * cur = cur_bi->bi_bh;
-    struct block_head * blkh;
-    int nr;
-    struct key * key;
-    struct disk_child new_dc[2];
-    struct disk_child * dc;
-    int i;
-    int from;
-    
-    if (count <= 0)
-	return;
-    
-    blkh = B_BLK_HEAD (cur);
-    nr = get_blkh_nr_items (blkh);
-    
-    /* prepare space for count disk_child */
-    dc = B_N_CHILD (cur,to+1);
-    
-    memmove (dc + count, dc, (nr+1-(to+1)) * DC_SIZE);
-    
-    /* make disk child array for insertion */
-    for (i = 0; i < count; i ++) {
-	set_dc(new_dc + i, MAX_CHILD_SIZE(bh[i]->b_size) - 
-	       get_blkh_free_space (B_BLK_HEAD (bh[i])),
-	       bh[i]->b_blocknr);
-	/*
-	set_dc_child_size (new_dc + i,
-			   MAX_CHILD_SIZE(bh[i]->b_size) - 
-			   get_blkh_free_space (B_BLK_HEAD (bh[i])));
-	set_dc_child_blocknr (new_dc + i, bh[i]->b_blocknr);*/
-    }
-    memcpy (dc, new_dc, DC_SIZE * count);
-    
-    /* prepare space for 'count' items  */
-    from = ((to == -1) ? 0 : to);
-    key = B_N_PDELIM_KEY (cur, from);
-    
-    memmove (key + count, key, (nr - from/*to*/) * KEY_SIZE + (nr + 1 + count) * DC_SIZE);
-
-    /* copy keys */
-    memcpy (key, inserted, KEY_SIZE);
-    if ( count > 1 )
-	memcpy (key + 1, inserted + 1, KEY_SIZE);
-    
-    /* sizes, item number */
-    set_blkh_nr_items (blkh, nr + count);
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) - count * (DC_SIZE + KEY_SIZE));
-
-    mark_buffer_dirty (cur);
-    
-    if (cur_bi->bi_parent) {
-	dc = B_N_CHILD (cur_bi->bi_parent,cur_bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) + count * (DC_SIZE + KEY_SIZE));
-	mark_buffer_dirty (cur_bi->bi_parent);
-    }
-    
-}
-
-
-/* Delete del_num items and node pointers from buffer cur starting from *
- * the first_i'th item and first_p'th pointers respectively.		*/
-static void internal_delete_pointers_items (reiserfs_filsys_t * fs,
-					    struct buffer_info * cur_bi,
-					    int first_p, int first_i, 
-					    int del_num)
-{
-    struct buffer_head * cur = cur_bi->bi_bh;
-    int nr;
-    struct block_head * blkh;
-    struct key * key;
-    struct disk_child * dc;
-
-    if ( del_num == 0 )
-	return;
-
-    blkh = B_BLK_HEAD(cur);
-    nr = get_blkh_nr_items (blkh);
-
-    if ( first_p == 0 && del_num == nr + 1 ) {
-	make_empty_node (cur_bi);
-	return;
-    }
-
-    /* deleting */
-    dc = B_N_CHILD (cur, first_p);
-
-    memmove (dc, dc + del_num, (nr + 1 - first_p - del_num) * DC_SIZE);
-    key = B_N_PDELIM_KEY (cur, first_i);
-    memmove (key, key + del_num, (nr - first_i - del_num) * KEY_SIZE + (nr + 1 - del_num) * DC_SIZE);
-
-
-    /* sizes, item number */
-    set_blkh_nr_items (blkh, get_blkh_nr_items (blkh) - del_num);
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) +
-			 del_num * (KEY_SIZE +  DC_SIZE));
-
-    mark_buffer_dirty (cur);
- 
-    if (cur_bi->bi_parent) {
-	dc = B_N_CHILD (cur_bi->bi_parent, cur_bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) - del_num * (KEY_SIZE +  DC_SIZE));
-	mark_buffer_dirty (cur_bi->bi_parent);
-    }
-}
-
-
-/* delete n node pointers and items starting from given position */
-static void internal_delete_childs (reiserfs_filsys_t * fs,
-				    struct buffer_info * cur_bi, 
-				    int from, int n)
-{
-    int i_from;
-    
-    i_from = (from == 0) ? from : from - 1;
-    
-    /* delete n pointers starting from `from' position in CUR;
-       delete n keys starting from 'i_from' position in CUR;
-    */
-    internal_delete_pointers_items (fs, cur_bi, from, i_from, n);
-}
-
-
-/* copy cpy_num node pointers and cpy_num - 1 items from buffer src to buffer dest
-* last_first == FIRST_TO_LAST means, that we copy first items from src to tail of dest
- * last_first == LAST_TO_FIRST means, that we copy last items from src to head of dest 
- */
-static void internal_copy_pointers_items (reiserfs_filsys_t * fs,
-					  struct buffer_info * dest_bi,
-					  struct buffer_head * src,
-					  int last_first, int cpy_num)
-{
-    /* ATTENTION! Number of node pointers in DEST is equal to number of items in DEST *
-     * as delimiting key have already inserted to buffer dest.*/
-    struct buffer_head * dest = dest_bi->bi_bh;
-    int nr_dest, nr_src;
-    int dest_order, src_order;
-    struct block_head * blkh;
-    struct key * key;
-    struct disk_child * dc;
-
-    nr_src = B_NR_ITEMS (src);
-
-    if ( cpy_num == 0 )
-	return;
-
-    /* coping */
-    blkh = B_BLK_HEAD (dest);
-    nr_dest = get_blkh_nr_items (blkh);
-
-    /*dest_order = (last_first == LAST_TO_FIRST) ? 0 : nr_dest;*/
-    /*src_order = (last_first == LAST_TO_FIRST) ? (nr_src - cpy_num + 1) : 0;*/
-    (last_first == LAST_TO_FIRST) ?	(dest_order = 0, src_order = nr_src - cpy_num + 1) :
-	(dest_order = nr_dest, src_order = 0);
-
-    /* prepare space for cpy_num pointers */
-    dc = B_N_CHILD (dest, dest_order);
-
-    memmove (dc + cpy_num, dc, (nr_dest - dest_order) * DC_SIZE);
-
-	/* insert pointers */
-    memcpy (dc, B_N_CHILD (src, src_order), DC_SIZE * cpy_num);
-
-
-    /* prepare space for cpy_num - 1 item headers */
-    key = B_N_PDELIM_KEY(dest, dest_order);
-    memmove (key + cpy_num - 1, key,
-	     KEY_SIZE * (nr_dest - dest_order) + DC_SIZE * (nr_dest + cpy_num));
-
-
-    /* insert headers */
-    memcpy (key, B_N_PDELIM_KEY (src, src_order), KEY_SIZE * (cpy_num - 1));
-
-    /* sizes, item number */
-    set_blkh_nr_items (blkh, get_blkh_nr_items (blkh) + cpy_num - 1);
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) -
-			 (KEY_SIZE * (cpy_num - 1) + DC_SIZE * cpy_num));
-
-    mark_buffer_dirty (dest);
-    if (dest_bi->bi_parent) {
-	dc = B_N_CHILD(dest_bi->bi_parent,dest_bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) + KEY_SIZE * (cpy_num - 1) + DC_SIZE * cpy_num);
-	mark_buffer_dirty (dest_bi->bi_parent);
-    }
-
-}
-
-
-/* Copy cpy_num node pointers and cpy_num - 1 items from buffer src to buffer dest.
- * Delete cpy_num - del_par items and node pointers from buffer src.
- * last_first == FIRST_TO_LAST means, that we copy/delete first items from src.
- * last_first == LAST_TO_FIRST means, that we copy/delete last items from src.
- */
-static void internal_move_pointers_items (reiserfs_filsys_t * fs,
-					  struct buffer_info * dest_bi, 
-					  struct buffer_info * src_bi, 
-					  int last_first, int cpy_num, int del_par)
-{
-    int first_pointer;
-    int first_item;
-    
-    internal_copy_pointers_items (fs, dest_bi, src_bi->bi_bh, last_first, cpy_num);
-    
-    if (last_first == FIRST_TO_LAST) {	/* shift_left occurs */
-	first_pointer = 0;
-	first_item = 0;
-	/* delete cpy_num - del_par pointers and keys starting for pointers with first_pointer, 
-	   for key - with first_item */
-	internal_delete_pointers_items (fs, src_bi, first_pointer, first_item, cpy_num - del_par);
-    } else {			/* shift_right occurs */
-	int i, j;
-	
-	i = ( cpy_num - del_par == ( j = B_NR_ITEMS(src_bi->bi_bh)) + 1 ) ? 0 : j - cpy_num + del_par;
-	
-	internal_delete_pointers_items (fs, src_bi, j + 1 - cpy_num + del_par, i, cpy_num - del_par);
-    }
-}
-
-/* Insert n_src'th key of buffer src before n_dest'th key of buffer dest. */
-static void internal_insert_key (reiserfs_filsys_t * fs,
-				 struct buffer_info * dest_bi, 
-				 int dest_position_before,                 /* insert key before key with n_dest number */
-				 struct buffer_head * src, 
-				 int src_position )
-{
-    struct buffer_head * dest = dest_bi->bi_bh;
-    int nr;
-    struct block_head * blkh;
-    struct key * key;
-
-    blkh = B_BLK_HEAD(dest);
-    nr = get_blkh_nr_items (blkh);
-
-    /* prepare space for inserting key */
-    key = B_N_PDELIM_KEY (dest, dest_position_before);
-    memmove (key + 1, key, (nr - dest_position_before) * KEY_SIZE + (nr + 1) * DC_SIZE);
-
-    /* insert key */
-    memcpy (key, B_N_PDELIM_KEY(src, src_position), KEY_SIZE);
-
-    /* Change dirt, free space, item number fields. */
-    set_blkh_nr_items (blkh, get_blkh_nr_items (blkh) + 1);
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) - KEY_SIZE);
-
-    mark_buffer_dirty (dest);
-
-    if (dest_bi->bi_parent) {
-	struct disk_child * dc;
-	
-	dc = B_N_CHILD(dest_bi->bi_parent,dest_bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) + KEY_SIZE);
-	mark_buffer_dirty (dest_bi->bi_parent);
-    }
-}
-
-
-
-/* Insert d_key'th (delimiting) key from buffer cfl to tail of dest. 
- * Copy pointer_amount node pointers and pointer_amount - 1 items from buffer src to buffer dest.
- * Replace  d_key'th key in buffer cfl.
- * Delete pointer_amount items and node pointers from buffer src.
- */
-/* this can be invoked both to shift from S to L and from R to S */
-static void internal_shift_left (int mode,	/* INTERNAL_FROM_S_TO_L | INTERNAL_FROM_R_TO_S */
-				 struct tree_balance * tb, int h,
-				 int pointer_amount)
-{
-    struct buffer_info dest_bi, src_bi;
-    struct buffer_head * cf;
-    int d_key_position;
-
-    internal_define_dest_src_infos (mode, tb, h, &dest_bi, &src_bi, &d_key_position, &cf);
-
-    /*printk("pointer_amount = %d\n",pointer_amount);*/
-
-    if (pointer_amount) {
-	/* insert delimiting key from common father of dest and src to node dest into position B_NR_ITEM(dest) */
-	internal_insert_key (tb->tb_fs, &dest_bi, B_NR_ITEMS(dest_bi.bi_bh), cf, d_key_position);
-
-	if (B_NR_ITEMS(src_bi.bi_bh) == pointer_amount - 1) {
-	    if (src_bi.bi_position/*src->b_item_order*/ == 0)
-		replace_key (tb->tb_fs, cf, d_key_position, src_bi.bi_parent/*src->b_parent*/, 0);
-	} else
-	    replace_key (tb->tb_fs, cf, d_key_position, src_bi.bi_bh, pointer_amount - 1);
-    }
-    /* last parameter is del_parameter */
-    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, FIRST_TO_LAST, pointer_amount, 0);
-
-}
-
-/* Insert delimiting key to L[h].
- * Copy n node pointers and n - 1 items from buffer S[h] to L[h].
- * Delete n - 1 items and node pointers from buffer S[h].
- */
-/* it always shifts from S[h] to L[h] */
-static void internal_shift1_left (struct tree_balance * tb, 
-				  int h, int pointer_amount)
-{
-    struct buffer_info dest_bi, src_bi;
-    struct buffer_head * cf;
-    int d_key_position;
-    
-    internal_define_dest_src_infos (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, &dest_bi, &src_bi, &d_key_position, &cf);
-    
-    if ( pointer_amount > 0 ) /* insert lkey[h]-th key  from CFL[h] to left neighbor L[h] */
-	internal_insert_key (tb->tb_fs, &dest_bi, B_NR_ITEMS(dest_bi.bi_bh), cf, d_key_position);
-    
-    /* last parameter is del_parameter */
-    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, FIRST_TO_LAST, pointer_amount, 1);
-}
-
-
-/* Insert d_key'th (delimiting) key from buffer cfr to head of dest. 
- * Copy n node pointers and n - 1 items from buffer src to buffer dest.
- * Replace  d_key'th key in buffer cfr.
- * Delete n items and node pointers from buffer src.
- */
-static void internal_shift_right (int mode,	/* INTERNAL_FROM_S_TO_R | INTERNAL_FROM_L_TO_S */
-				  struct tree_balance * tb, int h,
-				  int pointer_amount)
-{
-    struct buffer_info dest_bi, src_bi;
-    struct buffer_head * cf;
-    int d_key_position;
-    int nr;
-
-
-    internal_define_dest_src_infos (mode, tb, h, &dest_bi, &src_bi, &d_key_position, &cf);
-
-    nr = B_NR_ITEMS (src_bi.bi_bh);
-
-    if (pointer_amount > 0) {
-	/* insert delimiting key from common father of dest and src to dest node into position 0 */
-	internal_insert_key (tb->tb_fs, &dest_bi, 0, cf, d_key_position);
-	if (nr == pointer_amount - 1) {
-	    /* when S[h] disappers replace left delemiting key as well */
-	    if (tb->CFL[h])
-		replace_key(tb->tb_fs, cf, d_key_position, tb->CFL[h], tb->lkey[h]);
-	} else
-	    replace_key(tb->tb_fs, cf, d_key_position, src_bi.bi_bh, nr - pointer_amount);
-    }      
-
-    /* last parameter is del_parameter */
-    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, pointer_amount, 0);
-}
-
-/* Insert delimiting key to R[h].
- * Copy n node pointers and n - 1 items from buffer S[h] to R[h].
- * Delete n - 1 items and node pointers from buffer S[h].
- */
-/* it always shift from S[h] to R[h] */
-static void internal_shift1_right (struct tree_balance * tb, 
-				   int h, int pointer_amount)
-{
-    struct buffer_info dest_bi, src_bi;
-    struct buffer_head * cf;
-    int d_key_position;
-
-    internal_define_dest_src_infos (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, &dest_bi, &src_bi, &d_key_position, &cf);
-    
-    if (pointer_amount > 0) /* insert rkey from CFR[h] to right neighbor R[h] */
-	internal_insert_key (tb->tb_fs, &dest_bi, 0, cf, d_key_position);
-    
-    /* last parameter is del_parameter */
-    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, pointer_amount, 1);
-}
-
-
-/* Delete insert_num node pointers together with their left items
- * and balance current node.*/
-static void balance_internal_when_delete (struct tree_balance * tb, 
-					  int h, int child_pos)
-{
-    int insert_num;
-    int n;
-    struct buffer_head * tbSh = PATH_H_PBUFFER (tb->tb_path, h);
-    struct buffer_info bi;
-
-    insert_num = tb->insert_size[h] / ((int)(DC_SIZE + KEY_SIZE));
-  
-    /* delete child-node-pointer(s) together with their left item(s) */
-    bi.bi_bh = tbSh;
-
-    bi.bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-
-    bi.bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-
-    internal_delete_childs (tb->tb_fs, &bi, child_pos, -insert_num);
-
-    n = B_NR_ITEMS(tbSh);
-
-    if ( tb->lnum[h] == 0 && tb->rnum[h] == 0 ) {
-	if ( tb->blknum[h] == 0 ) {
-	    /* node S[h] (root of the tree) is empty now */
-	    struct buffer_head *new_root;
-	    struct reiserfs_super_block * sb;
-
-	    /* choose a new root */
-	    if ( ! tb->L[h-1] || ! B_NR_ITEMS(tb->L[h-1]) )
-		new_root = tb->R[h-1];
-	    else
-		new_root = tb->L[h-1];
-
-	    /* update super block's tree height and pointer to a root block */
-	    sb = tb->tb_fs->fs_ondisk_sb;
-	    set_sb_root_block (sb, new_root->b_blocknr);
-	    set_sb_tree_height (sb, get_sb_tree_height (sb) - 1);
-
-	    mark_buffer_dirty (tb->tb_fs->fs_super_bh);
-	    tb->tb_fs->fs_dirt = 1;
-
-	    /* mark buffer S[h] not uptodate and put it in free list */
-	    reiserfs_invalidate_buffer(tb, tbSh, 1);
-	    return;
-	}
-	return;
-    }
-
-    if ( tb->L[h] && tb->lnum[h] == -B_NR_ITEMS(tb->L[h]) - 1 ) { /* join S[h] with L[h] */
-	internal_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, n + 1);/*tb->L[h], tb->CFL[h], tb->lkey[h], tb->S[h], n+1);*/
-	reiserfs_invalidate_buffer(tb, tbSh, 1); /* preserve not needed, internal, 1 mean free block */
-
-	return;
-    }
-
-    if ( tb->R[h] &&  tb->rnum[h] == -B_NR_ITEMS(tb->R[h]) - 1 ) { /* join S[h] with R[h] */
-	internal_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, n + 1);
-	reiserfs_invalidate_buffer (tb, tbSh, 1);
-	return;
-    }
-
-    if ( tb->lnum[h] < 0 ) { /* borrow from left neighbor L[h] */
-	internal_shift_right (INTERNAL_SHIFT_FROM_L_TO_S, tb, h, -tb->lnum[h]);
-	return;
-    }
-
-    if ( tb->rnum[h] < 0 ) { /* borrow from right neighbor R[h] */
-	internal_shift_left (INTERNAL_SHIFT_FROM_R_TO_S, tb, h, -tb->rnum[h]);/*tb->S[h], tb->CFR[h], tb->rkey[h], tb->R[h], -tb->rnum[h]);*/
-	return;
-    }
-
-    if ( tb->lnum[h] > 0 ) { /* split S[h] into two parts and put them into neighbors */
-	internal_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, tb->lnum[h]);/*tb->L[h], tb->CFL[h], tb->lkey[h], tb->S[h], tb->lnum[h]);*/
-	internal_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, tb->rnum[h]);
-	reiserfs_invalidate_buffer (tb, tbSh, 1);
-
-	return;
-    }
-    reiserfs_panic ("balance_internal_when_delete", "unexpected tb->lnum[%d]==%d or tb->rnum[%d]==%d",
-		    h, tb->lnum[h], h, tb->rnum[h]);
-}
-
-
-/* Replace delimiting key of buffers L[h] and S[h] by the given key.*/
-void replace_lkey (struct tree_balance * tb,
-		   int h, struct item_head * key)
-{
-    if (B_NR_ITEMS(PATH_H_PBUFFER(tb->tb_path, h)) == 0)
-	return;
-
-    memcpy (B_N_PDELIM_KEY(tb->CFL[h],tb->lkey[h]), key, KEY_SIZE);
-
-    mark_buffer_dirty (tb->CFL[h]);
-}
-
-
-/* Replace delimiting key of buffers S[h] and R[h] by the given key.*/
-void replace_rkey (struct tree_balance * tb,
-		   int h, struct item_head * key)
-{
-    memcpy (B_N_PDELIM_KEY(tb->CFR[h],tb->rkey[h]), key, KEY_SIZE);
-    
-    mark_buffer_dirty (tb->CFR[h]);
-}
-
-
-
-int balance_internal (struct tree_balance * tb,			/* tree_balance structure 		*/
-		      int h,					/* level of the tree 			*/
-		      int child_pos,
-		      struct item_head * insert_key,		/* key for insertion on higher level   	*/
-		      struct buffer_head ** insert_ptr)	/* node for insertion on higher level*/
-  /* if inserting/pasting
-   {
-   child_pos is the position of the node-pointer in S[h] that	 *
-   pointed to S[h-1] before balancing of the h-1 level;		 *
-   this means that new pointers and items must be inserted AFTER *
-   child_pos
-   }
-   else 
-   {
-   it is the position of the leftmost pointer that must be deleted (together with
-   its corresponding key to the left of the pointer)
-   as a result of the previous level's balancing.
-   }
-*/
-{
-    struct buffer_head * tbSh = PATH_H_PBUFFER (tb->tb_path, h);
-    struct buffer_info bi;
-    int order;		/* we return this: it is 0 if there is no S[h], else it is tb->S[h]->b_item_order */
-    int insert_num, n, k;
-    struct buffer_head * S_new;
-    struct item_head new_insert_key;
-    struct buffer_head * new_insert_ptr = NULL;
-    struct item_head * new_insert_key_addr = insert_key;
-
-    order = ( tbSh ) ? PATH_H_POSITION (tb->tb_path, h + 1)/*tb->S[h]->b_item_order*/ : 0;
-
-  /* Using insert_size[h] calculate the number insert_num of items
-     that must be inserted to or deleted from S[h]. */
-    insert_num = tb->insert_size[h]/((int)(KEY_SIZE + DC_SIZE));
-
-    /* Check whether insert_num is proper **/
-    /* Make balance in case insert_num < 0 */
-    if ( insert_num < 0 ) {
-	balance_internal_when_delete (tb, h, child_pos);
-	return order;
-    }
- 
-    k = 0;
-    if ( tb->lnum[h] > 0 ) {
-	/* shift lnum[h] items from S[h] to the left neighbor L[h].
-	   check how many of new items fall into L[h] or CFL[h] after shifting */
-	n = get_blkh_nr_items (B_BLK_HEAD(tb->L[h])); /* number of items in L[h] */
-	if ( tb->lnum[h] <= child_pos ) {
-	    /* new items don't fall into L[h] or CFL[h] */
-	    internal_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, tb->lnum[h]);
-	    child_pos -= tb->lnum[h];
-	} else if ( tb->lnum[h] > child_pos + insert_num ) {
-	    /* all new items fall into L[h] */
-	    internal_shift_left (INTERNAL_SHIFT_FROM_S_TO_L, tb, h, tb->lnum[h] - insert_num);
-
-	    /* insert insert_num keys and node-pointers into L[h] */
-	    bi.bi_bh = tb->L[h];
-	    bi.bi_parent = tb->FL[h];
-	    bi.bi_position = get_left_neighbor_position (tb, h);
-	    internal_insert_childs (tb->tb_fs, &bi,/*tb->L[h], tb->S[h-1]->b_next*/ n + child_pos + 1,
-				    insert_num,insert_key,insert_ptr);
-
-	    insert_num = 0; 
-	} else {
-	    struct disk_child * dc;
-
-	    /* some items fall into L[h] or CFL[h], but some don't fall */
-	    internal_shift1_left (tb, h, child_pos + 1);
-	    /* calculate number of new items that fall into L[h] */
-	    k = tb->lnum[h] - child_pos - 1;
-
-	    bi.bi_bh = tb->L[h];
-	    bi.bi_parent = tb->FL[h];
-	    bi.bi_position = get_left_neighbor_position (tb, h);
-	    internal_insert_childs (tb->tb_fs, &bi,/*tb->L[h], tb->S[h-1]->b_next,*/ n + child_pos + 1,k,
-				    insert_key,insert_ptr);
-
-	    replace_lkey(tb, h, insert_key + k);
-
-	    /* replace the first node-ptr in S[h] by node-ptr to insert_ptr[k] */
-	    dc = B_N_CHILD(tbSh, 0);
-
-	    set_dc(dc, MAX_CHILD_SIZE(insert_ptr[k]->b_size) - 
-		   get_blkh_free_space (B_BLK_HEAD(insert_ptr[k])), 
-		   insert_ptr[k]->b_blocknr);
-	/*	       
-	    set_dc_child_size (dc, MAX_CHILD_SIZE(insert_ptr[k]->b_size) -
-			       get_blkh_free_space (B_BLK_HEAD(insert_ptr[k])));
-	    set_dc_child_blocknr (dc, insert_ptr[k]->b_blocknr);
-	*/
-	    mark_buffer_dirty (tbSh);
-
-	    k++;
-	    insert_key += k;
-	    insert_ptr += k;
-	    insert_num -= k;
-	    child_pos = 0;
-	}
-    }	/* tb->lnum[h] > 0 */
-
-    if ( tb->rnum[h] > 0 ) {
-	/*shift rnum[h] items from S[h] to the right neighbor R[h]*/
-	/* check how many of new items fall into R or CFR after shifting */
-	n = get_blkh_nr_items (B_BLK_HEAD (tbSh)); /* number of items in S[h] */
-	if ( n - tb->rnum[h] >= child_pos )
-	    /* new items fall into S[h] */
-	    /*internal_shift_right(tb,h,tbSh,tb->CFR[h],tb->rkey[h],tb->R[h],tb->rnum[h]);*/
-	    internal_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, tb->rnum[h]);
-	else
-	    if ( n + insert_num - tb->rnum[h] < child_pos )
-	    {
-		/* all new items fall into R[h] */
-		internal_shift_right (INTERNAL_SHIFT_FROM_S_TO_R, tb, h, tb->rnum[h] - insert_num);
-
-		/* insert insert_num keys and node-pointers into R[h] */
-		bi.bi_bh = tb->R[h];
-		bi.bi_parent = tb->FR[h];
-		bi.bi_position = get_right_neighbor_position (tb, h);
-		internal_insert_childs (tb->tb_fs, &bi, /*tb->R[h],tb->S[h-1]->b_next*/ child_pos - n - insert_num + tb->rnum[h] - 1,
-					insert_num,insert_key,insert_ptr);
-		insert_num = 0;
-	    }
-	    else
-	    {
-		struct disk_child * dc;
-
-		/* one of the items falls into CFR[h] */
-		internal_shift1_right(tb, h, n - child_pos + 1);
-		/* calculate number of new items that fall into R[h] */
-		k = tb->rnum[h] - n + child_pos - 1;
-
-		bi.bi_bh = tb->R[h];
-		bi.bi_parent = tb->FR[h];
-		bi.bi_position = get_right_neighbor_position (tb, h);
-		internal_insert_childs (tb->tb_fs, &bi, /*tb->R[h], tb->R[h]->b_child,*/ 0, k, insert_key + 1, insert_ptr + 1);
-
-		replace_rkey(tb, h, insert_key + insert_num - k - 1);
-
-		/* replace the first node-ptr in R[h] by node-ptr insert_ptr[insert_num-k-1]*/
-		dc = B_N_CHILD(tb->R[h], 0);
-		set_dc(dc, MAX_CHILD_SIZE(insert_ptr[insert_num-k-1]->b_size) -
-		       get_blkh_free_space (B_BLK_HEAD(insert_ptr[insert_num-k-1])),
-		       insert_ptr[insert_num-k-1]->b_blocknr);
-		/*
-		set_dc_child_size (dc, MAX_CHILD_SIZE(insert_ptr[insert_num-k-1]->b_size) -
-				   get_blkh_free_space (B_BLK_HEAD(insert_ptr[insert_num-k-1])));
-		set_dc_child_blocknr (dc, insert_ptr[insert_num-k-1]->b_blocknr);
-		*/
-		mark_buffer_dirty (tb->R[h]);
-		    
-		insert_num -= (k + 1);
-	    }
-    }
-
-    /** Fill new node that appears instead of S[h] **/
-    if ( ! tb->blknum[h] )
-    { /* node S[h] is empty now */
-	/* Mark buffer as invalid and put it to head of free list. */
-	reiserfs_invalidate_buffer(tb, tbSh, 1);/* do not preserve, internal node*/
-	return order;
-    }
-
-    if ( ! tbSh ) {
-	/* create new root */
-	struct disk_child  * dc;
-	struct buffer_head * tbSh_1 = PATH_H_PBUFFER (tb->tb_path, h - 1);
-	struct reiserfs_super_block * sb;
-
-	if ( tb->blknum[h] != 1 )
-	    reiserfs_panic(0, "balance_internal", "One new node required for creating the new root");
-	/* S[h] = empty buffer from the list FEB. */
-	tbSh = get_FEB (tb);
-	set_blkh_level (B_BLK_HEAD(tbSh), h + 1);
-	
-	/* Put the unique node-pointer to S[h] that points to S[h-1]. */
-
-	dc = B_N_CHILD(tbSh, 0);
-
-	set_dc(dc, MAX_CHILD_SIZE (tbSh_1->b_size) - 
-	       get_blkh_free_space (B_BLK_HEAD(tbSh_1)),
-	       tbSh_1->b_blocknr);
-	/*
-	set_dc_child_size (dc, MAX_CHILD_SIZE (tbSh_1->b_size) - get_blkh_free_space (B_BLK_HEAD(tbSh_1)));
-	set_dc_child_blocknr (dc, tbSh_1->b_blocknr);
-	*/
-	tb->insert_size[h] -= DC_SIZE;
-	set_blkh_free_space (B_BLK_HEAD(tbSh),
-			     get_blkh_free_space (B_BLK_HEAD(tbSh)) - DC_SIZE);
-
-	mark_buffer_dirty (tbSh);
-	
-	/* put new root into path structure */
-	PATH_OFFSET_PBUFFER(tb->tb_path, ILLEGAL_PATH_ELEMENT_OFFSET) = tbSh;
-	
-	/* Change root in structure super block. */
-	sb = tb->tb_fs->fs_ondisk_sb;
-	set_sb_root_block (sb, tbSh->b_blocknr);
-	set_sb_tree_height (sb, get_sb_tree_height (sb) + 1);
-	
-	mark_buffer_dirty (tb->tb_fs->fs_super_bh);
-	tb->tb_fs->fs_dirt = 1;
-    }
-    
-    if ( tb->blknum[h] == 2 ) {
-	int snum;
-	struct buffer_info dest_bi, src_bi;
-
-
-	/* S_new = free buffer from list FEB */
-	S_new = get_FEB(tb);
-
-	set_blkh_level (B_BLK_HEAD(S_new), h + 1);
-
-	dest_bi.bi_bh = S_new;
-	dest_bi.bi_parent = 0;
-	dest_bi.bi_position = 0;
-	src_bi.bi_bh = tbSh;
-	src_bi.bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-	src_bi.bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-		
-	n = get_blkh_nr_items (B_BLK_HEAD(tbSh)); /* number of items in S[h] */
-	snum = (insert_num + n + 1)/2;
-	if ( n - snum >= child_pos ) {
-	    /* new items don't fall into S_new */
-	    /*	store the delimiting key for the next level */
-	    /* new_insert_key = (n - snum)'th key in S[h] */
-	    memcpy (&new_insert_key,B_N_PDELIM_KEY(tbSh,n - snum),
-		    KEY_SIZE);
-	    /* last parameter is del_par */
-	    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, snum, 0);
-	} else if ( n + insert_num - snum < child_pos ) {
-	    /* all new items fall into S_new */
-	    /*	store the delimiting key for the next level */
-	    /* new_insert_key = (n + insert_item - snum)'th key in S[h] */
-	    memcpy(&new_insert_key,B_N_PDELIM_KEY(tbSh,n + insert_num - snum),
-		   KEY_SIZE);
-	    /* last parameter is del_par */
-	    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, snum - insert_num, 0);
-	    /*			internal_move_pointers_items(S_new,tbSh,1,snum - insert_num,0);*/
-
-	    /* insert insert_num keys and node-pointers into S_new */
-	    internal_insert_childs (tb->tb_fs, &dest_bi, /*S_new,tb->S[h-1]->b_next,*/child_pos - n - insert_num + snum - 1,
-				    insert_num,insert_key,insert_ptr);
-
-	    insert_num = 0;
-	} else {
-	    struct disk_child * dc;
-
-	    /* some items fall into S_new, but some don't fall */
-	    /* last parameter is del_par */
-	    internal_move_pointers_items (tb->tb_fs, &dest_bi, &src_bi, LAST_TO_FIRST, n - child_pos + 1, 1);
-	    /*			internal_move_pointers_items(S_new,tbSh,1,n - child_pos + 1,1);*/
-	    /* calculate number of new items that fall into S_new */
-	    k = snum - n + child_pos - 1;
-
-	    internal_insert_childs (tb->tb_fs, &dest_bi, /*S_new,*/ 0, k, insert_key + 1, insert_ptr+1);
-
-	    /* new_insert_key = insert_key[insert_num - k - 1] */
-	    memcpy(&new_insert_key,insert_key + insert_num - k - 1,
-		   KEY_SIZE);
-	    /* replace first node-ptr in S_new by node-ptr to insert_ptr[insert_num-k-1] */
-
-	    dc = B_N_CHILD(S_new,0);
-	    set_dc(dc, MAX_CHILD_SIZE(insert_ptr[insert_num-k-1]->b_size) -
-		   get_blkh_free_space (B_BLK_HEAD(insert_ptr[insert_num-k-1])),
-		   insert_ptr[insert_num-k-1]->b_blocknr);
-	    /*
-	    set_dc_child_size (dc, MAX_CHILD_SIZE(insert_ptr[insert_num-k-1]->b_size) -
-			       get_blkh_free_space (B_BLK_HEAD(insert_ptr[insert_num-k-1])));
-	    set_dc_child_blocknr (dc, insert_ptr[insert_num-k-1]->b_blocknr);
-	    */
-	    mark_buffer_dirty (S_new);
-			
-	    insert_num -= (k + 1);
-	}
-	/* new_insert_ptr = node_pointer to S_new */
-	new_insert_ptr = S_new;
-	/*
-	  S_new->b_count --;
-	*/
-	/*brelse(S_new);*/
-    }
-
-    n = get_blkh_nr_items (B_BLK_HEAD(tbSh)); /*number of items in S[h] */
-
-    if ( -1 <= child_pos && child_pos <= n && insert_num > 0 ) {
-	bi.bi_bh = tbSh;
-	bi.bi_parent = PATH_H_PPARENT (tb->tb_path, h);
-	bi.bi_position = PATH_H_POSITION (tb->tb_path, h + 1);
-	if (child_pos == -1) {
-	    /* this is a little different from original do_balance:
-	       here we insert the minimal keys in the tree, that has never happened when file system works */
-	    if (tb->CFL[h-1] || insert_num != 1 || h != 1)
-		die ("balance_internal: invalid child_pos");
-	    /* insert_child (tb->S[h], tb->S[h-1], child_pos, insert_num, B_N_ITEM_HEAD(tb->S[0],0), insert_ptr);*/
-	    internal_insert_childs (tb->tb_fs, &bi, child_pos, insert_num,
-			B_N_PITEM_HEAD (PATH_PLAST_BUFFER (tb->tb_path), 0), insert_ptr);
-	} else
-	    internal_insert_childs (tb->tb_fs, &bi, child_pos,insert_num,insert_key,insert_ptr);
-    }
-
-
-    memcpy (new_insert_key_addr,&new_insert_key,KEY_SIZE);
-    insert_ptr[0] = new_insert_ptr;
-
-    return order;
-}
-
diff --git a/reiserfscore/includes.h b/reiserfscore/includes.h
deleted file mode 100644
index ecb0676..0000000
--- a/reiserfscore/includes.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2000-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#ifdef HAVE_CONFIG_H
-#   include "config.h"
-#endif
-
-#include "io.h"
-#include "misc.h"
-#include "reiserfs_lib.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <asm/types.h>
-#include <fcntl.h>
-#include <malloc.h>
-#include <sys/vfs.h>
-#include <time.h>
diff --git a/reiserfscore/journal.c b/reiserfscore/journal.c
deleted file mode 100644
index 3803599..0000000
--- a/reiserfscore/journal.c
+++ /dev/null
@@ -1,850 +0,0 @@
-/*
- * Copyright 2002-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#define _GNU_SOURCE
-
-#include "includes.h"
-
-/* compares description block with commit block. returns 0 if they differ, 1
-   if they match */
-static int does_desc_match_commit (struct buffer_head *d_bh, 
-			    struct buffer_head *c_bh) 
-{
-    return (get_commit_trans_id (c_bh) == get_desc_trans_id (d_bh) &&
-	    get_commit_trans_len (c_bh) == get_desc_trans_len (d_bh));
-}
-
-
-/* d_bh is descriptor, return number of block where commit block of this
-   transaction is to be */
-unsigned long commit_expected (reiserfs_filsys_t * fs, struct buffer_head * d_bh)
-{
-    unsigned long offset;
-    struct journal_params * sb_jp;
-
-
-    sb_jp = sb_jp (fs->fs_ondisk_sb);
-    //desc = (struct reiserfs_journal_desc *)d_bh->b_data;
-    offset = d_bh->b_blocknr - get_jp_journal_1st_block (sb_jp);
-    return get_jp_journal_1st_block (sb_jp) + 
-	((offset + get_desc_trans_len (d_bh) + 1) % get_jp_journal_size (sb_jp));
-}
-
-
-/* d_bh contains journal descriptor, returns number of block where descriptor
-   block of next transaction should be */
-unsigned long next_desc_expected (reiserfs_filsys_t * fs, struct buffer_head * d_bh)
-{
-    unsigned long offset;
-    struct journal_params * sb_jp;
-
-
-    sb_jp = sb_jp (fs->fs_ondisk_sb);
-    //desc = (struct reiserfs_journal_desc *)d_bh->b_data;
-    offset = d_bh->b_blocknr - get_jp_journal_1st_block (sb_jp);
-    return get_jp_journal_1st_block (sb_jp) + 
-	((offset + get_desc_trans_len (d_bh) + 2) % get_jp_journal_size (sb_jp));
-}
-
-/* common checks for validness of a transaction */
-int transaction_check_content (reiserfs_filsys_t * fs, reiserfs_trans_t * trans) {
-    struct buffer_head *d_bh, *c_bh;
-    struct reiserfs_journal_desc * desc;
-    struct reiserfs_journal_commit * commit;
-    unsigned long block;
-    unsigned int trans_half, i;
-
-    d_bh = bread (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize);
-
-    if (!d_bh || who_is_this (d_bh->b_data, d_bh->b_size) != THE_JDESC)
-	goto error_desc_brelse;
-
-    /* read expected commit block and compare with descriptor block */
-    c_bh = bread (fs->fs_journal_dev, commit_expected (fs, d_bh), fs->fs_blocksize);
-    if (!c_bh)
-	goto error_desc_brelse;
- 
-    if (!does_desc_match_commit (d_bh, c_bh)) 
-	goto error_commit_brelse;
-
-    /* Check that all target blocks are journalable */
-    desc = (struct reiserfs_journal_desc *)(d_bh->b_data);
-    commit = (struct reiserfs_journal_commit *)(c_bh->b_data);
-
-    trans_half = journal_trans_half (d_bh->b_size);
-    for (i = 0; i < get_desc_trans_len(d_bh); i++) {
-	if (i < trans_half)
-	    block = le32_to_cpu (desc->j2_realblock[i]);
-	else
-	    block = le32_to_cpu (commit->j3_realblock[i - trans_half]);
-
-	if (not_journalable(fs, block)) 
-	    goto error_commit_brelse;
-    }
-    
-    brelse (d_bh);
-    brelse (c_bh);
-    return 1;
-    
-error_commit_brelse:
-    brelse (c_bh);
-error_desc_brelse:
-    brelse(d_bh);
-    return 0;
-}
-
-/* common checks for validness of a transaction */
-int transaction_check_desc(reiserfs_filsys_t * fs, struct buffer_head * d_bh) {
-    struct buffer_head * c_bh;
-    int ret = 1;
-
-    if (!d_bh || who_is_this (d_bh->b_data, d_bh->b_size) != THE_JDESC)
-	return 0;
-
-    /* read expected commit block and compare with descriptor block */
-    c_bh = bread (fs->fs_journal_dev, commit_expected (fs, d_bh), fs->fs_blocksize);
-    if (!c_bh)
-	return 0;
- 
-    if (!does_desc_match_commit (d_bh, c_bh)) 
-	ret = 0;
-
-    brelse (c_bh);
-    return ret;
-}
-
-
-/* read the journal and find the oldest and newest transactions, return number
-   of transactions found */
-int get_boundary_transactions (reiserfs_filsys_t * fs,
-			       reiserfs_trans_t * oldest,
-			       reiserfs_trans_t * newest)
-{
-    struct reiserfs_super_block * sb;
-    unsigned long j_cur;
-    unsigned long j_start;
-    unsigned long j_size;
-    struct buffer_head * d_bh;
-    __u32 newest_trans_id, oldest_trans_id, trans_id;
-    int trans_nr;
-
-    sb = fs->fs_ondisk_sb;
-    
-    j_start = get_jp_journal_1st_block (sb_jp (sb));
-    j_size = get_jp_journal_size (sb_jp (sb));
-    
-    oldest_trans_id = 0xffffffff;
-    newest_trans_id = 0;
-
-    trans_nr = 0;
-    for (j_cur = 0; j_cur < j_size; j_cur ++) {
-	d_bh = bread (fs->fs_journal_dev, j_start + j_cur, fs->fs_blocksize);
-	if (!transaction_check_desc (fs, d_bh)) {
-	    brelse (d_bh);
-	    continue;
-	}
-
-	trans_nr ++;
-
-	trans_id = get_desc_trans_id (d_bh);
-	if (trans_id < oldest_trans_id) {
-	    oldest_trans_id = trans_id;
-
-	    oldest->mount_id = get_desc_mount_id (d_bh);
-	    oldest->trans_id = get_desc_trans_id (d_bh);
-	    oldest->desc_blocknr = d_bh->b_blocknr;
-	    oldest->trans_len = get_desc_trans_len (d_bh);
-	    oldest->commit_blocknr = commit_expected (fs, d_bh);
-	    oldest->next_trans_offset = next_desc_expected (fs, d_bh) - j_start;
-	}
-
-	if (trans_id > newest_trans_id) {
-	    newest_trans_id = trans_id;
-
-	    newest->mount_id = get_desc_mount_id (d_bh);
-	    newest->trans_id = get_desc_trans_id (d_bh);
-	    newest->desc_blocknr = d_bh->b_blocknr;
-	    newest->trans_len = get_desc_trans_len (d_bh);
-	    newest->commit_blocknr = commit_expected (fs, d_bh);
-	    newest->next_trans_offset = next_desc_expected (fs, d_bh) - j_start;
-	}
-
-	j_cur += get_desc_trans_len (d_bh) + 1;
-	brelse (d_bh);
-    }
-
-    return trans_nr;
-}
-
-#define TRANS_FOUND     1
-#define TRANS_NOT_FOUND 0
-
-/* trans is a valid transaction. Look for valid transaction with smallest
-   trans id which is greater than the id of the current one */
-int next_transaction (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, reiserfs_trans_t break_trans)
-{
-    struct buffer_head * d_bh, * next_d_bh;
-    int found;
-    unsigned long j_start;
-    unsigned long j_offset;
-    unsigned long block;
-
-
-    j_start = get_jp_journal_1st_block (sb_jp (fs->fs_ondisk_sb));
-
-    found = TRANS_NOT_FOUND;
-
-    if (trans->trans_id == break_trans.trans_id)
-	return found;
-	
-    /* make sure that 'trans' is a valid transaction */
-    d_bh = bread (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize);
-    if (!transaction_check_desc (fs, d_bh))
-	die ("next_transaction: valid transaction is expected");
-
-    block = next_desc_expected (fs, d_bh);
-    j_offset = block - j_start;
-
-    while (1) {
-	next_d_bh = bread (fs->fs_journal_dev, block, fs->fs_blocksize);
-	if (transaction_check_desc (fs, next_d_bh))
-	    break;
-
-	brelse (next_d_bh);
-	j_offset ++;
-	block = j_start + (j_offset % get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)));
-    }
-
-    //next_desc = (struct reiserfs_journal_desc *)next_d_bh->b_data;
-    
-    if (break_trans.trans_id >= get_desc_trans_id (next_d_bh)) {
-	/* found transaction is newer */
-	trans->mount_id = get_desc_mount_id (next_d_bh);
-	trans->trans_id = get_desc_trans_id (next_d_bh);
-	trans->desc_blocknr = next_d_bh->b_blocknr;
-	trans->trans_len = get_desc_trans_len (next_d_bh);
-	trans->commit_blocknr = commit_expected (fs, next_d_bh);
-	trans->next_trans_offset = next_desc_expected (fs, next_d_bh) - j_start;
-	found = TRANS_FOUND;
-    }
-
-    brelse (d_bh);
-    brelse (next_d_bh);
-    return found;
-}
-
-static void read_journal_write_in_place (reiserfs_filsys_t * fs, reiserfs_trans_t * trans, unsigned int index, 
-                                         unsigned long in_journal, unsigned long in_place)
-{
-    struct buffer_head * j_bh, * bh;
-
-    j_bh = bread (fs->fs_journal_dev, in_journal, fs->fs_blocksize);
-    if (!j_bh) {
-	fprintf (stderr, "replay_one_transaction: transaction %lu: reading %lu block failed\n",
-		 trans->trans_id, in_journal);
-	return;
-    }
-    if (not_journalable (fs, in_place)) {
-	fprintf (stderr, "replay_one_transaction: transaction %lu: block %ld should not be journalled (%lu)\n",
-		 trans->trans_id, in_journal, in_place);
-	brelse (j_bh);
-	return;
-    }
-
-    bh = getblk (fs->fs_dev, in_place, fs->fs_blocksize);
-    
-    memcpy (bh->b_data, j_bh->b_data, bh->b_size);
-    mark_buffer_dirty (bh);
-    mark_buffer_uptodate (bh, 1);
-    bwrite (bh);
-    brelse (bh);
-    brelse (j_bh);
-    
-}
-
-
-/* go through all blocks of transaction and call 'action' each of them */
-void for_each_block (reiserfs_filsys_t * fs, reiserfs_trans_t * trans,
-		     action_on_block_t action)
-{
-    struct buffer_head * d_bh, * c_bh;
-    struct reiserfs_journal_desc * desc;
-    struct reiserfs_journal_commit * commit;
-    unsigned long j_start, j_offset, j_size;
-    unsigned int i, trans_half;
-    unsigned long block;
- 
-    d_bh = bread (fs->fs_journal_dev, trans->desc_blocknr, fs->fs_blocksize);
-    if (!d_bh) {
-	reiserfs_warning (stdout, "reading descriptor block %lu failed\n", trans->desc_blocknr);
-	return;
-    }
-
-    c_bh = bread (fs->fs_journal_dev, trans->commit_blocknr, fs->fs_blocksize);
-    if (!c_bh) {
-	reiserfs_warning (stdout, "reading commit block %lu failed\n", trans->commit_blocknr);
-	brelse (d_bh);
-	return;
-    }
-
-    desc = (struct reiserfs_journal_desc *)(d_bh->b_data);
-    commit = (struct reiserfs_journal_commit *)(c_bh->b_data);
-
-    /* first block of journal and size of journal */
-    j_start = get_jp_journal_1st_block (sb_jp (fs->fs_ondisk_sb));
-    j_size = get_jp_journal_size (sb_jp (fs->fs_ondisk_sb));
-
-    /* offset in the journal where the transaction starts */
-    j_offset = trans->desc_blocknr - j_start + 1;
-
-    trans_half = journal_trans_half (d_bh->b_size);
-    for (i = 0; i < trans->trans_len; i ++, j_offset ++) {
-	if (i < trans_half)
-	    block = le32_to_cpu (desc->j2_realblock[i]);
-	else
-	    block = le32_to_cpu (commit->j3_realblock[i - trans_half]);
-	action (fs, trans, i, j_start + (j_offset % j_size), block);
-    }
-
-    brelse (d_bh);
-    brelse (c_bh);
-}
-
-
-/* transaction is supposed to be valid */
-int replay_one_transaction (reiserfs_filsys_t * fs,
-			    reiserfs_trans_t * trans)
-{
-    for_each_block (fs, trans, read_journal_write_in_place);
-    fsync(fs->fs_dev);
-    return 0;
-}
-
-
-void for_each_transaction (reiserfs_filsys_t * fs, action_on_trans_t action)
-{
-    reiserfs_trans_t oldest, newest;
-    int ret = 0;
-
-    if (!get_boundary_transactions (fs, &oldest, &newest))
-	return;
-
-    while (1) {
-	action (fs, &oldest);	
-	if ((ret = next_transaction (fs, &oldest, newest)) == TRANS_NOT_FOUND)
-	    break;
-    }
-}
-
-unsigned long get_size_of_journal_or_reserved_area(
-    struct reiserfs_super_block * sb)
-{
-	if (is_reiserfs_jr_magic_string (sb))
-		return get_sb_reserved_for_journal (sb);
-
-	/* with standard journal */
-	return get_jp_journal_size (sb_jp (sb)) + 1;
-}
-
-
-__u32 advise_journal_max_trans_len (__u32 desired, __u32 journal_size /* no j_header */, 
-    int blocksize, int verbose)
-{
-    __u32 saved;
-    __u32 ratio = 1;
-
-    if (blocksize < 4096)
-	ratio = 4096/blocksize;
-	
-    saved = desired;
-    if (!desired)
-		desired = JOURNAL_TRANS_MAX/ratio;
-    
-    if (journal_size / desired < JOURNAL_MIN_RATIO)
-		desired = journal_size / JOURNAL_MIN_RATIO;
-    
-    if (desired > JOURNAL_TRANS_MAX/ratio)
-		desired = JOURNAL_TRANS_MAX/ratio;
-    
-    if (desired < JOURNAL_TRANS_MIN/ratio)
-		desired = JOURNAL_TRANS_MIN/ratio;
-
-    if (verbose) {
-	if (saved && saved != desired)
-		reiserfs_warning (stderr,
-		    "WARNING: wrong transaction max size (%u). Changed to %u\n", 
-		    saved, desired);
-    }
-
-    return desired;
-}
-#if 0
-    __u32 ret_val;
-    ret_val = 0;
-    if (!desired)                   ret_val = JOURNAL_TRANS_MAX;
-    if (desired<journal_size/8)     ret_val = journal_size/8;
-    if (desired>journal_size/2)     ret_val = journal_size/2;
-    if (desired>JOURNAL_TRANS_MAX)  ret_val = JOURNAL_TRANS_MAX;
-    if (ret_val) {
-        reiserfs_warning (stderr, "WARNING: Journal max trans length is wrong seting: %u, resetting to available possible %u\n",
-                          desired, ret_val);
-    } else {
-        ret_val = desired;
-    }
-    return ret_val;
-}
-#endif
-
-__u32 advise_journal_max_batch (unsigned long journal_trans_max)
-{
-    return journal_trans_max*JOURNAL_MAX_BATCH/JOURNAL_TRANS_MAX;
-}
-
-
-__u32 advise_journal_max_commit_age (void)
-{
-    return JOURNAL_MAX_COMMIT_AGE;
-}
-
-
-__u32 advise_journal_max_trans_age (void)
-{
-    return JOURNAL_MAX_TRANS_AGE;
-}
-
-
-int reiserfs_journal_params_check (reiserfs_filsys_t * fs) {
-    struct reiserfs_journal_header * j_head;
-    struct reiserfs_super_block * sb = fs->fs_ondisk_sb;
-    
-    j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
-	
-    /* Check the superblock's journal parameters. */
-    if (!is_reiserfs_jr_magic_string (sb)) {    
-	if (get_jp_journal_dev (sb_jp(sb)) != 0 || 
-	    get_jp_journal_1st_block (sb_jp(sb)) != get_journal_start_must (fs) || 
-	    get_jp_journal_size (sb_jp(sb)) != 
-	    journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
-	{
-	    reiserfs_warning (stderr, 
-		"\nreiserfs_open_journal: wrong journal parameters found in the "
-		"super block. \nYou should run reiserfsck with --rebuild-sb to "
-		"check your superblock consistency.\n\n");
-		
-	    return 1;
-	}
-    }
-	
-    if (memcmp(&j_head->jh_journal, sb_jp (sb), sizeof(struct journal_params))) {
-	if (!is_reiserfs_jr_magic_string (sb)) {
-	    reiserfs_warning (stderr, 
-		"\nreiserfs_open_journal: journal parameters from the superblock "
-		"does not match \nto the journal headers ones. It looks like that "
-		"you created your fs with old\nreiserfsprogs. Journal header is "
-		"fixed.\n\n", fs->fs_j_file_name);
-		
-	    memcpy(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params));
-	    mark_buffer_dirty(fs->fs_jh_bh);
-	    bwrite(fs->fs_jh_bh);
-	} else {
-	    reiserfs_warning (stderr,
-		"\nreiserfs_open_journal: journal parameters from the super block "
-		"does not match \nto journal parameters from the journal. You should "
-		"run  reiserfsck with --rebuild-sb to check your superblock consistency.\n\n");
-		
-	    return 1;	
-	}
-    }
-    
-    return 0;
-}
-
-/* read journal header and make sure that it matches with the filesystem
-   opened */
-int reiserfs_open_journal (reiserfs_filsys_t * fs, char * j_filename, int flags) {
-    struct reiserfs_super_block * sb;
-    __u64 count;
-    
-    sb = fs->fs_ondisk_sb;
-
-    if (!j_filename) {
-	/*
-        if (is_reiserfs_jr_magic_string (sb)) {
-            // create a special file to access journal
-            return 1;
-        } */
-	
-	j_filename = fs->fs_file_name;
-    } else if (!is_reiserfs_jr_magic_string (sb)) {
-        /* make sure that name specified is a correct name */
-	if (strcmp (j_filename, fs->fs_file_name)) {
-	    reiserfs_warning (stderr, "Filesystem with standard journal found, "
-		"wrong name of specified journal device %s \n", j_filename);
-	    return 2;
-	}
-    }
-
-    fs->fs_journal_dev = open (j_filename, flags 
-#if defined(O_LARGEFILE)
-			       | O_LARGEFILE
-#endif
-			       );
-    if (fs->fs_journal_dev == -1) 
-        return -1;
-    
-    asprintf (&fs->fs_j_file_name, "%s", j_filename);
-    
-    if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) {
-	reiserfs_warning (stderr, "Journal of (%lu) block size found on "
-	    "specified journal device %s.\nMust be not less than (%lu).\n",
-	    get_jp_journal_size (sb_jp (sb)) + 1, j_filename, 
-	    JOURNAL_MIN_SIZE + 1);
-	close(fs->fs_journal_dev);
-	return 1;
-    }
-    
-    if (!(count = count_blocks (j_filename, fs->fs_blocksize))) {
-	close(fs->fs_journal_dev);
-	return -1;
-    }
-
-    if (get_jp_journal_1st_block (sb_jp (sb)) + 
-	get_jp_journal_size (sb_jp (sb)) + 1 > count) 
-    {
-	reiserfs_warning (stderr, "Detected journal on specified device %s "
-			  "does not fit to the device.\nStart block (%lu) + "
-			  "size (%lu) less than device size (%lu).\n", 
-			  j_filename, get_jp_journal_1st_block(sb_jp (sb)), 
-			  get_jp_journal_size(sb_jp (sb)) + 1, count);
-	close(fs->fs_journal_dev);
-	return 1;
-    }
-    
-    /* read journal header */
-    fs->fs_jh_bh = bread (fs->fs_journal_dev, 
-			  get_jp_journal_1st_block (sb_jp (sb)) + 
-			  get_jp_journal_size (sb_jp (sb)), 
-			  fs->fs_blocksize);
-
-    if (!fs->fs_jh_bh) {
-	reiserfs_warning (stderr, "reiserfs_open_journal: bread failed "
-			  "reading journal  header.\n");
-	close(fs->fs_journal_dev);
-	return -1;
-    }
-
-    return 0;
-}
-
-/* initialize super block's journal related fields and journal header fields. 
- * If len is 0 - make journal of default size */
-int reiserfs_create_journal(
-    reiserfs_filsys_t * fs, 
-    char * j_device,		/* journal device name */
-    unsigned long offset,	/* journal offset on the j_device */
-    unsigned long len,		/* including journal header */
-    int transaction_max_size)
-{
-    struct stat st;
-    struct buffer_head * bh;
-    struct reiserfs_journal_header * jh;
-    struct reiserfs_super_block * sb;
-    unsigned long blocks;
-
-    sb = fs->fs_ondisk_sb;
-    
-    if (!j_device || !strcmp (j_device, fs->fs_file_name)) {
-	/* Journal is to be on the host device, check the amount space for the 
-	 * journal on it. */
-	len = len ? len : journal_default_size(fs->fs_super_bh->b_blocknr, 
-	    fs->fs_blocksize) + 1;
-		
-	offset = offset ? offset : get_journal_start_must(fs);
-	
-	if (offset < get_journal_start_must(fs)) {
-	    reiserfs_warning (stderr, "reiserfs_create_journal: offset is "
-		"%lu, but it cannot be less then %llu on the device %s\n", 
-		offset, get_journal_start_must(fs), j_device);
-	    return 0;
-	}
-	
-	if (!is_block_count_correct(offset, fs->fs_blocksize, 
-	    get_sb_block_count(sb), len)) 
-	{
-	    /* host device does not contain enough blocks */
-	    reiserfs_warning (stderr, "reiserfs_create_journal: cannot create "
-		"a journal of %lu blocks with %lu offset on %d blocks\n", 
-		len, offset, get_sb_block_count(sb));
-		return 0;
-	}
-	
-	j_device = fs->fs_file_name;
-	
-	
-	st.st_rdev = 0;
-    } else {
-	/* journal is to be on separate device */
-	if (!(blocks = count_blocks (j_device, fs->fs_blocksize)))
-		return 0;
-
-	if (!len) {
-	    /* default size of a journal on a separate device is whole device */
-	    if (blocks < offset) {
-		reiserfs_warning (stderr, "reiserfs_create_journal: offset is "
-		    "%lu, blocks on device %lu\n", offset, blocks);
-		return 0;
-	    }
-	    len = blocks - offset;
-	}
-
-	if (len > journal_default_size (fs->fs_super_bh->b_blocknr, 
-	    fs->fs_blocksize) + 1) 
-	{
-	    fflush(stderr);
-	    
-	    reiserfs_warning (stdout, "NOTE: journal new size %lu is greater "
-		"than default size %lu:\nthis may slow down initializing and "
-		"mounting of the journal. Hope it is ok.\n\n", len, 
-		journal_default_size(fs->fs_super_bh->b_blocknr, 
-		fs->fs_blocksize) + 1);
-	}
-
-	if (blocks < offset + len) {
-	    reiserfs_warning (stderr, "reiserfs_create_journal: no enough "
-		"blocks on device %lu, needed %lu\n", blocks, offset + len);
-	    return 0;
-	}
-	
-	if (stat (j_device, &st) == -1) {
-	    reiserfs_warning (stderr, "reiserfs_create_journal: stat %s failed"
-		": %s\n", j_device, strerror(errno));
-	    return 0;
-	}
-/*
-	if (!S_ISBLK (st.st_mode)) {
-		reiserfs_warning (stderr, "reiserfs_create_journal: "
-		"%s is not a block device (%x)\n", j_device, st.st_rdev);
-		return 0;
-	}
-*/
-    }
-
-    fs->fs_journal_dev = open (j_device, O_RDWR 
-#if defined(O_LARGEFILE)
-			       | O_LARGEFILE
-#endif
-			       );
-    if (fs->fs_journal_dev == -1) {
-	reiserfs_warning (stderr, "reiserfs_create_journal: could not open "
-	    "%s: %s\n", j_device, strerror(errno));
-	return 0;
-    }
-
-    asprintf (&fs->fs_j_file_name, "%s", j_device);
-
-    if (len < JOURNAL_MIN_SIZE + 1) {
-	reiserfs_warning (stderr, "WARNING: Journal size (%u) is less, than "
-	    "minimal supported journal size (%u).\n", len, JOURNAL_MIN_SIZE + 1);
-        return 0;
-    }
-    /* get journal header */
-    bh = getblk (fs->fs_journal_dev, offset + len - 1, fs->fs_blocksize);
-    if (!bh) {
-	reiserfs_warning (stderr, "reiserfs_create_journal: getblk failed\n");
-	return 0;
-    }
-
-    /* fill journal header */
-    jh = (struct reiserfs_journal_header *)bh->b_data;
-    set_jp_journal_1st_block(&jh->jh_journal, offset);
-    set_jp_journal_dev(&jh->jh_journal, st.st_rdev);
-    set_jp_journal_magic(&jh->jh_journal, get_random());
-
-    set_jp_journal_size(&jh->jh_journal, len - 1);
-    set_jp_journal_max_trans_len(&jh->jh_journal, advise_journal_max_trans_len(
-	transaction_max_size, len - 1, fs->fs_blocksize, 1));
-    set_jp_journal_max_batch(&jh->jh_journal, advise_journal_max_batch(
-	get_jp_journal_max_trans_len(&jh->jh_journal)));
-    set_jp_journal_max_commit_age(&jh->jh_journal, 
-	advise_journal_max_commit_age());
-    set_jp_journal_max_trans_age(&jh->jh_journal, 
-	advise_journal_max_trans_age ());
-
-    mark_buffer_uptodate (bh, 1);
-    mark_buffer_dirty (bh);
-    
-    fs->fs_jh_bh = bh;
-    
-    /* make a copy of journal header in the super block */
-    memcpy (sb_jp (sb), &jh->jh_journal, sizeof (struct journal_params));
-    mark_buffer_dirty (fs->fs_super_bh);
-
-    return 1;
-}
-
-
-/* brelse journal header, flush all dirty buffers, close device, open, read
-   journal header */
-void reiserfs_reopen_journal (reiserfs_filsys_t * fs, int flag)
-{
-    unsigned long jh_block;
-
-
-    if (!reiserfs_journal_opened (fs))
-	return;
-
-    jh_block = fs->fs_jh_bh->b_blocknr;
-    brelse (fs->fs_jh_bh);
-    flush_buffers (fs->fs_journal_dev);
-    invalidate_buffers (fs->fs_journal_dev);
-    if (close (fs->fs_journal_dev))
-	die ("reiserfs_reopen_journal: closed failed: %s", strerror(errno));
-
-    fs->fs_journal_dev = open (fs->fs_j_file_name, flag 
-#if defined(O_LARGEFILE)
-			       | O_LARGEFILE
-#endif
-			       );
-    if (fs->fs_journal_dev == -1)
-	die ("reiserfs_reopen_journal: could not reopen journal device");
-
-    fs->fs_jh_bh = bread (fs->fs_journal_dev, jh_block, fs->fs_blocksize);
-    if (!fs->fs_jh_bh)
-	die ("reiserfs_reopen_journal: reading journal header failed");
-}
-
-
-int reiserfs_journal_opened (reiserfs_filsys_t * fs)
-{
-    return fs->fs_jh_bh ? 1 : 0;
-}
-
-
-void reiserfs_flush_journal (reiserfs_filsys_t * fs)
-{
-    if (!reiserfs_journal_opened (fs))
-		return;
-    flush_buffers (fs->fs_journal_dev);
-}
-
-
-void reiserfs_free_journal (reiserfs_filsys_t * fs)
-{
-    if (!reiserfs_journal_opened (fs))
-		return;
-    brelse (fs->fs_jh_bh);
-    fs->fs_jh_bh = 0;
-    free (fs->fs_j_file_name);
-    fs->fs_j_file_name = 0;
-}
-
-
-void reiserfs_close_journal (reiserfs_filsys_t * fs)
-{
-    reiserfs_flush_journal (fs);
-    reiserfs_free_journal (fs);
-
-}
-
-/* update journal header */
-static void update_journal_header (reiserfs_filsys_t * fs, 
-				   struct buffer_head * bh_jh, 
-				   reiserfs_trans_t *trans) 
-{
-    struct reiserfs_journal_header * j_head;
-	
-    j_head = (struct reiserfs_journal_header *)(bh_jh->b_data);
-
-    /* update journal header */
-    set_jh_last_flushed (j_head, trans->trans_id);
-    set_jh_mount_id (j_head, trans->mount_id);
-    set_jh_replay_start_offset (j_head, trans->next_trans_offset);
-    mark_buffer_dirty (bh_jh);
-    bwrite (bh_jh);
-    fsync(fs->fs_journal_dev);
-}
-
-/* fixme: what should be done when not all transactions can be replayed in proper order? */
-int replay_journal (reiserfs_filsys_t * fs)
-{
-    struct buffer_head * bh;
-    struct reiserfs_journal_header * j_head;
-    reiserfs_trans_t cur, newest, control;
-    int replayed, ret;
-
-    if (!reiserfs_journal_opened (fs))
-        reiserfs_panic ("replay_journal: journal is not opened");
-    
-    if (!is_opened_rw (fs))
-        reiserfs_panic ("replay_journal: fs is not opened with write perms");
-
-    reiserfs_warning (stderr, "Replaying journal..\n");
-    bh = fs->fs_jh_bh;
-	
-    j_head = (struct reiserfs_journal_header *)(bh->b_data);
-    control.mount_id = get_jh_mount_id (j_head);
-    control.trans_id = get_jh_last_flushed (j_head);
-    control.desc_blocknr = get_jh_replay_start_offset (j_head);
-
-    if (!get_boundary_transactions (fs, &cur, &newest)) {
-	reiserfs_warning (stderr, "No transactions found\n");
-	return 0;
-    }
-
-    /*  Smth strange with journal header or journal. We cannot say for sure what was the last 
-	replaied transaction, but relying on JH data is preferable. */
-
-    replayed = 0;
-    ret = TRANS_FOUND;
-    
-    /* Looking to the first valid not replayed transaction. */
-    while (1) {
-	if (cur.mount_id == control.mount_id && 
-	    cur.trans_id > control.trans_id)
-	    break;
-
-	if ((ret = next_transaction (fs, &cur, newest)) != TRANS_FOUND)
-	    break;
-    }
-    
-    while (ret == TRANS_FOUND) {
-	/* If not the next transaction to be replayed, break out here. */
-	if ((cur.mount_id != control.mount_id) || 
-	    (cur.trans_id != control.trans_id + 1 && control.trans_id))
-	    break;
-	
-	if (!transaction_check_content(fs, &cur)) {
-	    reiserfs_warning (stderr, "Trans broken: mountid %lu, transid %lu, desc %lu, "
-		"len %lu, commit %lu, next trans offset %lu\n", cur.mount_id, cur.trans_id, 
-		cur.desc_blocknr, cur.trans_len, cur.commit_blocknr, cur.next_trans_offset);
-	    break;
-	}
-
-        reiserfs_warning (stderr, "Trans replayed: mountid %lu, transid %lu, desc %lu, "
-            "len %lu, commit %lu, next trans offset %lu\n",
-	    cur.mount_id, cur.trans_id, cur.desc_blocknr, cur.trans_len,
-	    cur.commit_blocknr, cur.next_trans_offset);
-	replay_one_transaction (fs, &cur);
-	update_journal_header (fs, bh, &cur);
-	control = cur;
-        replayed ++;
-
-	ret = next_transaction (fs, &cur, newest);
-    }
-
-    reiserfs_warning (stderr, "Reiserfs journal '%s' in blocks [%u..%u]: %d "
-		      "transactions replayed\n", fs->fs_j_file_name, 
-		      get_jp_journal_1st_block(sb_jp(fs->fs_ondisk_sb)),
-		      get_jp_journal_1st_block(sb_jp(fs->fs_ondisk_sb)) + 
-		      get_jp_journal_size(sb_jp(fs->fs_ondisk_sb)) + 1,
-		      replayed);
-	
-    mark_buffer_dirty (fs->fs_super_bh);
-    bwrite (fs->fs_super_bh);
-	
-    update_journal_header (fs, bh, &newest);
-
-    return 0;
-}
diff --git a/reiserfscore/lbalance.c b/reiserfscore/lbalance.c
deleted file mode 100644
index e9323ba..0000000
--- a/reiserfscore/lbalance.c
+++ /dev/null
@@ -1,1118 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "includes.h"
-
-
-/* these are used in do_balance.c */
-
-/* leaf_move_items
-   leaf_shift_left
-   leaf_shift_right
-   leaf_delete_items
-   leaf_insert_into_buf
-   leaf_paste_in_buffer
-   leaf_cut_from_buffer
-   leaf_paste_entries
-   */
-
-
-extern struct tree_balance init_tb;
-extern int init_item_pos;
-extern int init_pos_in_item;
-extern int init_mode;
-
-
-
-/* copy copy_count entries from source directory item to dest buffer (creating new item if needed) */
-static void leaf_copy_dir_entries (reiserfs_filsys_t * fs,
-			           struct buffer_info * dest_bi, struct buffer_head * source, 
-				   int last_first, int item_num, int from, int copy_count)
-{
-    struct buffer_head * dest = dest_bi->bi_bh;
-    int item_num_in_dest;		/* either the number of target item,
-					   or if we must create a new item,
-					   the number of the item we will
-					   create it next to */
-    struct item_head * ih;
-    struct reiserfs_de_head * deh;
-    int copy_records_len;			/* length of all records in item to be copied */
-    char * records;
-
-    ih = B_N_PITEM_HEAD (source, item_num);
-
-    /* length of all record to be copied and first byte of the last of them */
-    deh = B_I_DEH (source, ih);
-    if (copy_count) {
-	copy_records_len = (from ? get_deh_location (&deh[from - 1]) : get_ih_item_len (ih)) - 
-	    get_deh_location (&deh[from + copy_count - 1]);
-	records = source->b_data + get_ih_location (ih) + get_deh_location (&deh[from + copy_count - 1]);
-    } else {
-	copy_records_len = 0;
-	records = 0;
-    }
-
-    /* when copy last to first, dest buffer can contain 0 items */
-    item_num_in_dest = (last_first == LAST_TO_FIRST) ? (( B_NR_ITEMS(dest) ) ? 0 : -1) : (B_NR_ITEMS(dest) - 1);
-
-    /* if there are no items in dest or the first/last item in dest is not item of the same directory */
-    if ( (item_num_in_dest == - 1) ||
-	 (last_first == FIRST_TO_LAST && are_items_mergeable (B_N_PITEM_HEAD (dest, item_num_in_dest), ih, dest->b_size) == 0) ||
-	 (last_first == LAST_TO_FIRST && are_items_mergeable (ih, B_N_PITEM_HEAD (dest, item_num_in_dest), dest->b_size) == 0)) {
-	/* create new item in dest */
-	struct item_head new_ih;
-
-	/* form item header */
-	memcpy (&new_ih.ih_key, &ih->ih_key, KEY_SIZE);
-
-	/* calculate item len */
-	set_ih_item_len (&new_ih, DEH_SIZE * copy_count + copy_records_len);
-	set_ih_entry_count (&new_ih, 0);
-    
-	if (last_first == LAST_TO_FIRST) {
-	    /* form key by the following way */
-	    if (from < get_ih_entry_count (ih)) {
-		set_key_offset_v1 (&new_ih.ih_key, get_deh_offset (&deh[from]));
-	    } else {
-		/* no entries will be copied to this item in this function */
-		set_key_offset_v1 (&new_ih.ih_key, MAX_KEY1_OFFSET);
-	    }
-	    set_key_uniqueness (&new_ih.ih_key, DIRENTRY_UNIQUENESS);
-	}
-	set_ih_key_format (&new_ih, get_ih_key_format (ih));
-	set_ih_flags (&new_ih, get_ih_flags (ih));
-    
-	/* insert item into dest buffer */
-	leaf_insert_into_buf (fs, dest_bi, (last_first == LAST_TO_FIRST) ? 0 : B_NR_ITEMS(dest), &new_ih, NULL, 0);
-    } else {
-	/* prepare space for entries */
-	leaf_paste_in_buffer (fs, dest_bi, (last_first == FIRST_TO_LAST) ? (B_NR_ITEMS(dest) - 1) : 0, 0xffff /*MAX_US_INT */,
-			      DEH_SIZE * copy_count + copy_records_len, records, 0);
-    }
-  
-    item_num_in_dest = (last_first == FIRST_TO_LAST) ? (B_NR_ITEMS(dest)-1) : 0;
-  
-    leaf_paste_entries (dest_bi->bi_bh, item_num_in_dest,
-			(last_first == FIRST_TO_LAST) ? get_ih_entry_count (B_N_PITEM_HEAD (dest, item_num_in_dest)) : 0,
-			copy_count, deh + from, records,
-			DEH_SIZE * copy_count + copy_records_len
-	);
-}
-
-
-/* Copy the first (if last_first == FIRST_TO_LAST) or last (last_first == LAST_TO_FIRST) item or 
-   part of it or nothing (see the return 0 below) from SOURCE to the end 
-   (if last_first) or beginning (!last_first) of the DEST */
-/* returns 1 if anything was copied, else 0 */
-static int leaf_copy_boundary_item (reiserfs_filsys_t * fs,
-                                    struct buffer_info * dest_bi, struct buffer_head * src, int last_first,
-				    int bytes_or_entries)
-{
-    struct buffer_head * dest = dest_bi->bi_bh;
-    int dest_nr_item, src_nr_item; /* number of items in the source and destination buffers */
-    struct item_head * ih;
-    struct item_head * dih;
-  
-    dest_nr_item = B_NR_ITEMS(dest);
-  
-    if ( last_first == FIRST_TO_LAST ) {
-	/* if ( DEST is empty or first item of SOURCE and last item of DEST are the items of different objects
-	   or of different types ) then there is no need to treat this item differently from the other items
-	   that we copy, so we return */
-	ih = B_N_PITEM_HEAD (src, 0);
-	dih = B_N_PITEM_HEAD (dest, dest_nr_item - 1);
-	if (!dest_nr_item || (are_items_mergeable (dih, ih, src->b_size) == 0))
-	    /* there is nothing to merge */
-	    return 0;
-      
-	if ( I_IS_DIRECTORY_ITEM(ih) ) {
-	    if ( bytes_or_entries == -1 )
-		/* copy all entries to dest */
-		bytes_or_entries = get_ih_entry_count(ih);
-	    leaf_copy_dir_entries (fs, dest_bi, src, FIRST_TO_LAST, 0, 0, bytes_or_entries);
-	    return 1;
-	}
-      
-	/* copy part of the body of the first item of SOURCE to the end of the body of the last item of the DEST
-	   part defined by 'bytes_or_entries'; if bytes_or_entries == -1 copy whole body; don't create new item header
-	*/
-	if ( bytes_or_entries == -1 )
-	    bytes_or_entries = get_ih_item_len (ih);
-
-	/* merge first item (or its part) of src buffer with the last
-	   item of dest buffer. Both are of the same file */
-	leaf_paste_in_buffer (fs, dest_bi, dest_nr_item - 1, get_ih_item_len (dih),
-		bytes_or_entries, B_I_PITEM(src,ih), 0);
-      
-	if (I_IS_INDIRECT_ITEM(dih)) {
-	    if (bytes_or_entries == get_ih_item_len (ih))
-		//dih->u.ih_free_space = ih->u.ih_free_space;
-		set_ih_free_space (dih, get_ih_free_space (ih));
-	}
-    
-	return 1;
-    }
-  
-
-    /* copy boundary item to right (last_first == LAST_TO_FIRST) */
-
-    /* ( DEST is empty or last item of SOURCE and first item of DEST
-       are the items of different object or of different types )
-    */
-    src_nr_item = B_NR_ITEMS (src);
-    ih = B_N_PITEM_HEAD (src, src_nr_item - 1);
-    dih = B_N_PITEM_HEAD (dest, 0);
-
-    if (!dest_nr_item || are_items_mergeable (ih, dih, src->b_size) == 0)
-	return 0;
-  
-    if ( I_IS_DIRECTORY_ITEM(ih)) {
-	if ( bytes_or_entries == -1 )
-	    /* bytes_or_entries = entries number in last item body of SOURCE */
-	    bytes_or_entries = get_ih_entry_count(ih);
-    
-	leaf_copy_dir_entries (fs, dest_bi, src, LAST_TO_FIRST, src_nr_item - 1, get_ih_entry_count(ih) - bytes_or_entries, 
-			       bytes_or_entries);
-	return 1;
-    }
-
-    /* copy part of the body of the last item of SOURCE to the begin of the body of the first item of the DEST;
-       part defined by 'bytes_or_entries'; if byte_or_entriess == -1 copy whole body; change first item key of the DEST;
-       don't create new item header
-    */
-  
-    if ( bytes_or_entries == -1 ) {
-	/* bytes_or_entries = length of last item body of SOURCE */
-	bytes_or_entries = get_ih_item_len (ih);
-
-	/* change first item key of the DEST */
-	//dih->ih_key.k_offset = ih->ih_key.k_offset;
-	set_offset (key_format (&dih->ih_key), &dih->ih_key, get_offset (&ih->ih_key));
-
-	/* item becomes non-mergeable */
-	/* or mergeable if left item was */
-	//dih->ih_key.k_uniqueness = ih->ih_key.k_uniqueness;
-	set_type (key_format (&dih->ih_key), &dih->ih_key, get_type (&ih->ih_key));
-    } else {
-	/* merge to right only part of item */
-	/* change first item key of the DEST */
-	if ( I_IS_DIRECT_ITEM(dih) ) {
-	    //dih->ih_key.k_offset -= bytes_or_entries;
-	    set_offset (key_format (&dih->ih_key), &dih->ih_key, get_offset (&dih->ih_key) - bytes_or_entries);
-	} else {
-	    //dih->ih_key.k_offset -= ((bytes_or_entries/UNFM_P_SIZE)*dest->b_size);
-	    set_offset (key_format (&dih->ih_key), &dih->ih_key, 
-			get_offset (&dih->ih_key) - ((bytes_or_entries/UNFM_P_SIZE)*dest->b_size));
-	}
-    }
-  
-    leaf_paste_in_buffer (fs, dest_bi, 0, 0, bytes_or_entries, B_I_PITEM(src,ih) + get_ih_item_len (ih) - bytes_or_entries, 0);
-    return 1;
-}
-
-
-/* copy cpy_mun items from buffer src to buffer dest
- * last_first == FIRST_TO_LAST means, that we copy cpy_num  items beginning from first-th item in src to tail of dest
- * last_first == LAST_TO_FIRST means, that we copy cpy_num  items beginning from first-th item in src to head of dest
- */
-static void leaf_copy_items_entirely (reiserfs_filsys_t * fs, struct buffer_info * dest_bi, 
-                                      struct buffer_head * src, int last_first,
-				      int first, int cpy_num)
-{
-    struct buffer_head * dest;
-    int nr;
-    int dest_before;
-    int last_loc, last_inserted_loc, location;
-    int i, j;
-    struct block_head * blkh;
-    struct item_head * ih;
-
-    dest = dest_bi->bi_bh;
-
-    if (cpy_num == 0)
-	return;
-
-    blkh = B_BLK_HEAD(dest);
-    nr = get_blkh_nr_items (blkh);
-  
-    /* we will insert items before 0-th or nr-th item in dest buffer. It depends of last_first parameter */
-    dest_before = (last_first == LAST_TO_FIRST) ? 0 : nr;
-
-    /* location of head of first new item */
-    ih = B_N_PITEM_HEAD (dest, dest_before);
-
-    /* prepare space for headers */
-    memmove (ih + cpy_num, ih, (nr-dest_before) * IH_SIZE);
-
-    /* copy item headers */
-    memcpy (ih, B_N_PITEM_HEAD (src, first), cpy_num * IH_SIZE);
-
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) - IH_SIZE * cpy_num);
-
-    /* location of unmovable item */
-    j = location = (dest_before == 0) ? dest->b_size : get_ih_location (ih-1);
-    for (i = dest_before; i < nr + cpy_num; i ++) {
-	location -= get_ih_item_len (&ih[i-dest_before]);
-	set_ih_location (&ih[i-dest_before], location);
-    }
-
-    /* prepare space for items */
-    last_loc = get_ih_location (&ih[nr+cpy_num-1-dest_before]);
-    last_inserted_loc = get_ih_location (&ih[cpy_num-1]);
-
-    /* check free space */
-    memmove (dest->b_data + last_loc,
-	     dest->b_data + last_loc + j - last_inserted_loc,
-	     last_inserted_loc - last_loc);
-
-    /* copy items */
-    memcpy (dest->b_data + last_inserted_loc, B_N_PITEM(src,(first + cpy_num - 1)),
-	    j - last_inserted_loc);
-
-    /* sizes, item number */
-    set_blkh_nr_items (blkh, get_blkh_nr_items (blkh) + cpy_num);
-    set_blkh_free_space (blkh, 
-			 get_blkh_free_space (blkh) - (j - last_inserted_loc));
-  
-    mark_buffer_dirty (dest);
-
-    if (dest_bi->bi_parent) {
-	struct disk_child * dc;
-	dc = B_N_CHILD (dest_bi->bi_parent, dest_bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) + j - last_inserted_loc + IH_SIZE * cpy_num);
-	mark_buffer_dirty(dest_bi->bi_parent);
-    }
-}
-
-
-/* This function splits the (liquid) item into two items (useful when
-   shifting part of an item into another node.) */
-static void leaf_item_bottle (reiserfs_filsys_t * fs,
-			      struct buffer_info * dest_bi, struct buffer_head * src, int last_first,
-			      int item_num, int cpy_bytes)
-{
-    struct buffer_head * dest = dest_bi->bi_bh;
-    struct item_head * ih;
-  
-    if ( last_first == FIRST_TO_LAST ) {
-	/* if ( if item in position item_num in buffer SOURCE is directory item ) */
-	if (I_IS_DIRECTORY_ITEM(ih = B_N_PITEM_HEAD(src,item_num)))
-	    leaf_copy_dir_entries (fs, dest_bi, src, FIRST_TO_LAST, item_num, 0, cpy_bytes);
-	else {
-	    struct item_head n_ih;
-      
-	    /* copy part of the body of the item number 'item_num' of SOURCE to the end of the DEST 
-	       part defined by 'cpy_bytes'; create new item header; change old item_header (????);
-	       n_ih = new item_header;
-	    */
-	    memcpy (&n_ih, ih, IH_SIZE);
-	    set_ih_item_len (&n_ih, cpy_bytes);
-	    if (I_IS_INDIRECT_ITEM(ih)) {
-		//n_ih.u.ih_free_space = 0;
-		set_ih_free_space (&n_ih, 0);;
-	    }
-
-	    //n_ih.ih_version = ih->ih_version;
-	    set_ih_key_format (&n_ih, get_ih_key_format (ih));
-	    set_ih_flags (&n_ih, get_ih_flags (ih));
-	    leaf_insert_into_buf (fs, dest_bi, B_NR_ITEMS(dest), &n_ih, B_N_PITEM (src, item_num), 0);
-	}
-    } else {
-	/*  if ( if item in position item_num in buffer SOURCE is directory item ) */
-	if (I_IS_DIRECTORY_ITEM(ih = B_N_PITEM_HEAD (src, item_num)))
-	    leaf_copy_dir_entries (fs, dest_bi, src, LAST_TO_FIRST, item_num, get_ih_entry_count(ih) - cpy_bytes, cpy_bytes);
-	else {
-	    struct item_head n_ih;
-      
-	    /* copy part of the body of the item number 'item_num' of SOURCE to the begin of the DEST 
-	       part defined by 'cpy_bytes'; create new item header;
-	       n_ih = new item_header;
-	    */
-	    memcpy (&n_ih, ih, SHORT_KEY_SIZE);
-      
-	    if (I_IS_DIRECT_ITEM(ih)) {
-		//n_ih.ih_key.k_offset = ih->ih_key.k_offset + ih->ih_item_len - cpy_bytes;
-		set_offset (key_format (&ih->ih_key), &n_ih.ih_key, get_offset (&ih->ih_key) + get_ih_item_len (ih) - cpy_bytes);
-		//n_ih.ih_key.k_uniqueness = TYPE_DIRECT;
-		set_type (key_format (&ih->ih_key), &n_ih.ih_key, TYPE_DIRECT);
-		//n_ih.u.ih_free_space = USHRT_MAX;
-		set_ih_free_space (&n_ih, USHRT_MAX);
-	    } else {
-		/* indirect item */
-		//n_ih.ih_key.k_offset = ih->ih_key.k_offset + (ih->ih_item_len - cpy_bytes) / UNFM_P_SIZE * dest->b_size;
-		set_offset (key_format (&ih->ih_key), &n_ih.ih_key,
-			    get_offset (&ih->ih_key) + (get_ih_item_len (ih) - cpy_bytes) / UNFM_P_SIZE * dest->b_size);
-		//n_ih.ih_key.k_uniqueness = TYPE_INDIRECT;
-		set_type (key_format (&ih->ih_key), &n_ih.ih_key, TYPE_INDIRECT);
-		//n_ih.u.ih_free_space = ih->u.ih_free_space;
-		set_ih_free_space (&n_ih, get_ih_free_space (ih));
-	    }
-      
-	    /* set item length */
-	    set_ih_item_len (&n_ih, cpy_bytes);
-	    //n_ih.ih_version = ih->ih_version;
-	    set_ih_key_format (&n_ih, get_ih_key_format (ih));
-	    set_ih_flags (&n_ih, get_ih_flags (ih));
-	    leaf_insert_into_buf (fs, dest_bi, 0, &n_ih, B_N_PITEM(src,item_num) + get_ih_item_len (ih) - cpy_bytes, 0);
-	}
-    }
-}
-
-
-/* If cpy_bytes equals minus one than copy cpy_num whole items from SOURCE to DEST.
-   If cpy_bytes not equal to minus one than copy cpy_num-1 whole items from SOURCE to DEST.
-   From last item copy cpy_num bytes for regular item and cpy_num directory entries for
-   directory item. */
-static int leaf_copy_items (reiserfs_filsys_t * fs,
-                            struct buffer_info * dest_bi, struct buffer_head * src,
-			    int last_first, int cpy_num,
-			    int cpy_bytes)
-{
-    struct buffer_head * dest;
-    int pos, i, src_nr_item, bytes;
-
-    dest = dest_bi->bi_bh;
-    if ( cpy_num == 0 )
-	return 0;
- 
-    if ( last_first == FIRST_TO_LAST ) {
-	/* copy items to left */
-	pos = 0;
-	if ( cpy_num == 1 )
-	    bytes = cpy_bytes;
-	else
-	    bytes = -1;
-   
-	/* copy the first item or it part or nothing to the end of the DEST (i = leaf_copy_boundary_item(DEST,SOURCE,0,bytes)) */
-	i = leaf_copy_boundary_item (fs, dest_bi, src, FIRST_TO_LAST, bytes);
-	cpy_num -= i;
-	if ( cpy_num == 0 )
-	    return i;
-	pos += i;
-	if ( cpy_bytes == -1 )
-	    /* copy first cpy_num items starting from position 'pos' of SOURCE to end of DEST */
-	    leaf_copy_items_entirely(fs, dest_bi, src, FIRST_TO_LAST, pos, cpy_num);
-	else {
-	    /* copy first cpy_num-1 items starting from position 'pos-1' of the SOURCE to the end of the DEST */
-	    leaf_copy_items_entirely(fs, dest_bi, src, FIRST_TO_LAST, pos, cpy_num-1);
-	     
-	    /* copy part of the item which number is cpy_num+pos-1 to the end of the DEST */
-	    leaf_item_bottle (fs, dest_bi, src, FIRST_TO_LAST, cpy_num+pos-1, cpy_bytes);
-	} 
-    } else {
-	/* copy items to right */
-	src_nr_item = B_NR_ITEMS (src);
-	if ( cpy_num == 1 )
-	    bytes = cpy_bytes;
-	else
-	    bytes = -1;
-   
-	/* copy the last item or it part or nothing to the begin of the DEST (i = leaf_copy_boundary_item(DEST,SOURCE,1,bytes)); */
-	i = leaf_copy_boundary_item (fs, dest_bi, src, LAST_TO_FIRST, bytes);
-   
-	cpy_num -= i;
-	if ( cpy_num == 0 )
-	    return i;
-   
-	pos = src_nr_item - cpy_num - i;
-	if ( cpy_bytes == -1 ) {
-	    /* starting from position 'pos' copy last cpy_num items of SOURCE to begin of DEST */
-	    leaf_copy_items_entirely(fs, dest_bi, src, LAST_TO_FIRST, pos, cpy_num);
-	} else {
-	    /* copy last cpy_num-1 items starting from position 'pos+1' of the SOURCE to the begin of the DEST; */
-	    leaf_copy_items_entirely(fs, dest_bi, src, LAST_TO_FIRST, pos+1, cpy_num-1);
-
-	    /* copy part of the item which number is pos to the begin of the DEST */
-	    leaf_item_bottle (fs, dest_bi, src, LAST_TO_FIRST, pos, cpy_bytes);
-	}
-    }
-    return i;
-}
-
-
-/* there are types of coping: from S[0] to L[0], from S[0] to R[0],
-   from R[0] to L[0]. for each of these we have to define parent and
-   positions of destination and source buffers */
-static void leaf_define_dest_src_infos (int shift_mode, struct tree_balance * tb, struct buffer_info * dest_bi,
-					struct buffer_info * src_bi, int * first_last,
-					struct buffer_head * Snew)
-{
-    /* define dest, src, dest parent, dest position */
-    switch (shift_mode) {
-    case LEAF_FROM_S_TO_L:    /* it is used in leaf_shift_left */
-	src_bi->bi_bh = PATH_PLAST_BUFFER (tb->tb_path);
-	src_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-	src_bi->bi_position = PATH_H_B_ITEM_ORDER (tb->tb_path, 0);	/* src->b_item_order */
-	dest_bi->bi_bh = tb->L[0];
-	dest_bi->bi_parent = tb->FL[0];
-	dest_bi->bi_position = get_left_neighbor_position (tb, 0);
-	*first_last = FIRST_TO_LAST;
-	break;
-
-    case LEAF_FROM_S_TO_R:  /* it is used in leaf_shift_right */
-	src_bi->bi_bh = PATH_PLAST_BUFFER (tb->tb_path);
-	src_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-	src_bi->bi_position = PATH_H_B_ITEM_ORDER (tb->tb_path, 0);
-	dest_bi->bi_bh = tb->R[0];
-	dest_bi->bi_parent = tb->FR[0];
-	dest_bi->bi_position = get_right_neighbor_position (tb, 0);
-	*first_last = LAST_TO_FIRST;
-	break;
-
-    case LEAF_FROM_R_TO_L:  /* it is used in balance_leaf_when_delete */
-	src_bi->bi_bh = tb->R[0];
-	src_bi->bi_parent = tb->FR[0];
-	src_bi->bi_position = get_right_neighbor_position (tb, 0);
-	dest_bi->bi_bh = tb->L[0];
-	dest_bi->bi_parent = tb->FL[0];
-	dest_bi->bi_position = get_left_neighbor_position (tb, 0);
-	*first_last = FIRST_TO_LAST;
-	break;
-    
-    case LEAF_FROM_L_TO_R:  /* it is used in balance_leaf_when_delete */
-	src_bi->bi_bh = tb->L[0];
-	src_bi->bi_parent = tb->FL[0];
-	src_bi->bi_position = get_left_neighbor_position (tb, 0);
-	dest_bi->bi_bh = tb->R[0];
-	dest_bi->bi_parent = tb->FR[0];
-	dest_bi->bi_position = get_right_neighbor_position (tb, 0);
-	*first_last = LAST_TO_FIRST;
-	break;
-
-    case LEAF_FROM_S_TO_SNEW:
-	src_bi->bi_bh = PATH_PLAST_BUFFER (tb->tb_path);
-	src_bi->bi_parent = PATH_H_PPARENT (tb->tb_path, 0);
-	src_bi->bi_position = PATH_H_B_ITEM_ORDER (tb->tb_path, 0);
-	dest_bi->bi_bh = Snew;
-	dest_bi->bi_parent = 0;
-	dest_bi->bi_position = 0;
-	*first_last = LAST_TO_FIRST;
-	break;
-    
-    default:
-	reiserfs_panic (0, "vs-10250: leaf_define_dest_src_infos: shift type is unknown (%d)", shift_mode);
-    }
-}
-
-
-
-
-/* copy mov_num items and mov_bytes of the (mov_num-1)th item to
-   neighbor. Delete them from source */
-int leaf_move_items (int shift_mode, struct tree_balance * tb, 
-		     int mov_num, int mov_bytes, struct buffer_head * Snew)
-{
-    int ret_value;
-    struct buffer_info dest_bi, src_bi;
-    int first_last;
-
-    leaf_define_dest_src_infos (shift_mode, tb, &dest_bi, &src_bi, &first_last, Snew);
-
-    ret_value = leaf_copy_items (tb->tb_fs, &dest_bi, src_bi.bi_bh, first_last, mov_num, mov_bytes);
-
-    leaf_delete_items (tb->tb_fs, &src_bi, first_last, (first_last == FIRST_TO_LAST) ? 0 : 
-		       (B_NR_ITEMS(src_bi.bi_bh) - mov_num), mov_num, mov_bytes);
-
-  
-    return ret_value;
-}
-
-
-/* Shift shift_num items (and shift_bytes of last shifted item if shift_bytes != -1)
-   from S[0] to L[0] and replace the delimiting key */
-int leaf_shift_left (struct tree_balance * tb, int shift_num, int shift_bytes)
-{
-    struct buffer_head * S0 = PATH_PLAST_BUFFER (tb->tb_path);
-    int i;
-
-    /* move shift_num (and shift_bytes bytes) items from S[0] to left neighbor L[0] */
-    i = leaf_move_items (LEAF_FROM_S_TO_L, tb, shift_num, shift_bytes, 0);
-
-    if ( shift_num ) {
-	if (B_NR_ITEMS (S0) == 0) { 
-	    /* everything is moved from S[0] */
-	    if (PATH_H_POSITION (tb->tb_path, 1) == 0)
-		replace_key(tb->tb_fs, tb->CFL[0], tb->lkey[0], PATH_H_PPARENT (tb->tb_path, 0), 0);
-	} else {
-	    /* replace lkey in CFL[0] by 0-th key from S[0]; */
-	    replace_key(tb->tb_fs, tb->CFL[0], tb->lkey[0], S0, 0);
-      
-	}
-    }
-  
-    return i;
-}
-
-
-
-
-
-/* CLEANING STOPPED HERE */
-
-
-
-
-/* Shift shift_num (shift_bytes) items from S[0] to the right neighbor, and replace the delimiting key */
-int leaf_shift_right (struct tree_balance * tb, int shift_num, int shift_bytes)
-{
-    int ret_value;
-
-    /* move shift_num (and shift_bytes) items from S[0] to right neighbor R[0] */
-    ret_value = leaf_move_items (LEAF_FROM_S_TO_R, tb, shift_num, shift_bytes, 0);
-
-    /* replace rkey in CFR[0] by the 0-th key from R[0] */
-    if (shift_num) {
-	replace_key(tb->tb_fs, tb->CFR[0], tb->rkey[0], tb->R[0], 0);
-    }
-
-    return ret_value;
-}
-
-
-
-static void leaf_delete_items_entirely (reiserfs_filsys_t * sb,
-					/*struct reiserfs_transaction_handle *th,*/
-					struct buffer_info * bi,
-					int first,
-					int del_num);
-/*  If del_bytes == -1, starting from position 'first' delete del_num items in whole in buffer CUR.
-    If not. 
-    If last_first == 0. Starting from position 'first' delete del_num-1 items in whole. Delete part of body of
-    the first item. Part defined by del_bytes. Don't delete first item header
-    If last_first == 1. Starting from position 'first+1' delete del_num-1 items in whole. Delete part of body of
-    the last item . Part defined by del_bytes. Don't delete last item header.
-*/
-void leaf_delete_items (reiserfs_filsys_t * fs,
-			struct buffer_info * cur_bi,
-			int last_first, 
-			int first, int del_num, int del_bytes)
-{
-    struct buffer_head * bh;
-    int item_amount = B_NR_ITEMS (bh = cur_bi->bi_bh);
-    
-    if ( del_num == 0 )
-	return;
-    
-    if ( first == 0 && del_num == item_amount && del_bytes == -1 ) {
-	make_empty_node (cur_bi);
-	mark_buffer_dirty (bh);
-	return;
-    }
-    
-    if ( del_bytes == -1 )
-	/* delete del_num items beginning from item in position first */
-	leaf_delete_items_entirely (fs, cur_bi, first, del_num);
-    else {
-	if ( last_first == FIRST_TO_LAST ) {
-	    /* delete del_num-1 items beginning from item in position first  */
-	    leaf_delete_items_entirely (fs, cur_bi, first, del_num-1);
-	    
-	    /* delete the part of the first item of the bh do not
-	       delete item header */
-	    leaf_cut_from_buffer (fs, cur_bi, 0, 0, del_bytes);
-	} else  {
-	    struct item_head * ih;
-	    int len;
-	    
-	    /* delete del_num-1 items beginning from item in position first+1  */
-	    leaf_delete_items_entirely (fs, cur_bi, first+1, del_num-1);
-	    
-	    if (I_IS_DIRECTORY_ITEM(ih = B_N_PITEM_HEAD(bh, B_NR_ITEMS(bh)-1))) 	/* the last item is directory  */
-	        /* len = numbers of directory entries in this item */
-	        len = get_ih_entry_count(ih);
-	    else
-		/* len = body len of item */
- 	        len = get_ih_item_len (ih);
-	    
-	    /* delete the part of the last item of the bh 
-	       do not delete item header
-	    */
-	    leaf_cut_from_buffer (fs, cur_bi, B_NR_ITEMS(bh) - 1, len - del_bytes, del_bytes);
-	}
-    }
-}
-
-
-/* insert item into the leaf node in position before */
-void leaf_insert_into_buf (reiserfs_filsys_t * s,
-			   struct buffer_info * bi,
-			   int before,
-			   struct item_head * inserted_item_ih,
-			   const char * inserted_item_body,
-			   int zeros_number
-			   )
-{
-    struct buffer_head * bh = bi->bi_bh;
-    int nr;
-    struct block_head * blkh;
-    struct item_head * ih;
-    int i;
-    int last_loc, unmoved_loc;
-    char * to;
-
-    blkh = B_BLK_HEAD (bh);
-    nr = get_blkh_nr_items (blkh);
-
-    /* get item new item must be inserted before */
-    ih = B_N_PITEM_HEAD (bh, before);
-
-    /* prepare space for the body of new item */
-    last_loc = nr ? get_ih_location (&ih[nr - before - 1]) : bh->b_size;
-    unmoved_loc = before ? get_ih_location (ih-1) : bh->b_size;
-
-    memmove (bh->b_data + last_loc - get_ih_item_len (inserted_item_ih), 
-	     bh->b_data + last_loc, unmoved_loc - last_loc);
-
-    to = bh->b_data + unmoved_loc - get_ih_item_len (inserted_item_ih);
-    memset (to, 0, zeros_number);
-    to += zeros_number;
-
-    /* copy body to prepared space */
-    if (inserted_item_body)
-	//if (mem_mode == REISERFS_USER_MEM)
-	//  copy_from_user (to, inserted_item_body, inserted_item_ih->ih_item_len - zeros_number);
-	//else {
-	memmove (to, inserted_item_body, get_ih_item_len (inserted_item_ih) - zeros_number);
-    //}
-    else
-	memset(to, '\0', get_ih_item_len (inserted_item_ih) - zeros_number);
-  
-    /* insert item header */
-    memmove (ih + 1, ih, IH_SIZE * (nr - before));
-    memmove (ih, inserted_item_ih, IH_SIZE);
-  
-    /* change locations */
-    for (i = before; i < nr + 1; i ++) {
-	unmoved_loc -= get_ih_item_len (&ih[i-before]);
-	set_ih_location (&ih[i-before], unmoved_loc);
-    }
-  
-    /* sizes, free space, item number */
-    set_blkh_nr_items (blkh, get_blkh_nr_items (blkh) + 1);
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) -
-			 (IH_SIZE + get_ih_item_len (inserted_item_ih)));
-
-    mark_buffer_dirty(bh) ;
-
-    if (bi->bi_parent) { 
-	struct disk_child * dc;
-
-	dc = B_N_CHILD (bi->bi_parent, bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) + IH_SIZE + get_ih_item_len (inserted_item_ih));
-	mark_buffer_dirty(bi->bi_parent) ;
-    }
-
-    if (is_a_leaf(bh->b_data, bh->b_size) != THE_LEAF)
-	reiserfs_panic ("leaf_insert_into_buf: bad leaf %lu: %b", bh->b_blocknr, bh);
-}
-
-
-/* paste paste_size bytes to affected_item_num-th item. 
-   When item is a directory, this only prepare space for new entries */
-void leaf_paste_in_buffer (reiserfs_filsys_t * fs,
-			   struct buffer_info * bi,
-			   int affected_item_num,
-			   int pos_in_item,
-			   int paste_size,
-			   const char * body,
-			   int zeros_number)
-{
-    struct buffer_head * bh = bi->bi_bh;
-    int nr;
-    struct block_head * blkh;
-    struct item_head * ih;
-    int i;
-    int last_loc, unmoved_loc;
-
-
-    blkh = B_BLK_HEAD (bh);
-    nr = get_blkh_nr_items (blkh);
-
-    /* item to be appended */
-    ih = B_N_PITEM_HEAD(bh, affected_item_num);
-
-    last_loc = get_ih_location (&ih[nr - affected_item_num - 1]);
-    unmoved_loc = affected_item_num ? get_ih_location (ih-1) : bh->b_size;  
-
-    /* prepare space */
-    memmove (bh->b_data + last_loc - paste_size, bh->b_data + last_loc,
-	     unmoved_loc - last_loc);
-
-
-    /* change locations */
-    for (i = affected_item_num; i < nr; i ++)
-	set_ih_location (&ih[i-affected_item_num], get_ih_location (&ih[i-affected_item_num]) - paste_size);
-
-    if ( body ) {
-	if (!I_IS_DIRECTORY_ITEM(ih)) {
-	    //if (mem_mode == REISERFS_USER_MEM) {
-	    //memset (bh->b_data + unmoved_loc - paste_size, 0, zeros_number);
-	    //copy_from_user (bh->b_data + unmoved_loc - paste_size + zeros_number, body, paste_size - zeros_number);
-	    //} else 
-	    {
-		if (!pos_in_item) {
-		    /* shift data to right */
-		    memmove (bh->b_data + get_ih_location (ih) + paste_size, 
-			     bh->b_data + get_ih_location (ih), get_ih_item_len (ih));
-		    /* paste data in the head of item */
-		    memset (bh->b_data + get_ih_location (ih), 0, zeros_number);
-		    memcpy (bh->b_data + get_ih_location (ih) + zeros_number, body, paste_size - zeros_number);
-		} else {
-		    memset (bh->b_data + unmoved_loc - paste_size, 0, zeros_number);
-		    memcpy (bh->b_data + unmoved_loc - paste_size + zeros_number, body, paste_size - zeros_number);
-		}
-	    }
-	}
-    }
-    else
-	memset(bh->b_data + unmoved_loc - paste_size,'\0',paste_size);
-
-    set_ih_item_len (ih, get_ih_item_len (ih) + paste_size);
-
-    /* change free space */
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) - paste_size);
-
-    mark_buffer_dirty(bh) ;
-
-    if (bi->bi_parent) { 
-	struct disk_child * dc;
-
-	dc = B_N_CHILD (bi->bi_parent, bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) + paste_size);
-	mark_buffer_dirty(bi->bi_parent);
-    }
-    if (is_a_leaf(bh->b_data, bh->b_size) != THE_LEAF)
-	reiserfs_panic ("leaf_paste_in_buffer: bad leaf %lu: %b", bh->b_blocknr, bh);
-}
-
-
-/* cuts DEL_COUNT entries beginning from FROM-th entry. Directory item
-   does not have free space, so it moves DEHs and remaining records as
-   necessary. Return value is size of removed part of directory item
-   in bytes. */
-static int leaf_cut_entries (struct buffer_head * bh,
-			     struct item_head * ih, 
-			     int from, int del_count)
-{
-    char * item;
-    struct reiserfs_de_head * deh;
-    int prev_record_offset;	/* offset of record, that is (from-1)th */
-    char * prev_record;		/* */
-    int cut_records_len;		/* length of all removed records */
-    int i;
-    int entry_count;
-
-
-    /* first byte of item */
-    item = B_I_PITEM (bh, ih);
-
-    /* entry head array */
-    deh = B_I_DEH (bh, ih);
-    entry_count = get_ih_entry_count (ih);
-
-    if (del_count == 0) {
-	int shift;
-	int last_location;
-
-	last_location = get_deh_location (deh + entry_count - 1);
-	shift = last_location - DEH_SIZE * entry_count;
-	
-	memmove (deh + entry_count, item + last_location,
-		 get_ih_item_len (ih) - last_location);
-	for (i = 0; i < entry_count; i ++)
-	    set_deh_location (&deh[i], get_deh_location (&deh[i]) - shift);
-
-	return shift;
-    }
-
-    /* first byte of remaining entries, those are BEFORE cut entries
-       (prev_record) and length of all removed records (cut_records_len) */
-    prev_record_offset = (from ? get_deh_location (&deh[from - 1]) : get_ih_item_len (ih));
-    cut_records_len = prev_record_offset/*from_record*/ - get_deh_location (&deh[from + del_count - 1]);
-    prev_record = item + prev_record_offset;
-
-
-    /* adjust locations of remaining entries */
-    for (i = get_ih_entry_count (ih) - 1; i > from + del_count - 1; i --) {
-	set_deh_location (deh + i, get_deh_location (deh + i) - (DEH_SIZE * del_count));
-    }
-
-    for (i = 0; i < from; i ++) {
-	set_deh_location (deh + i, get_deh_location (deh + i) - (DEH_SIZE * del_count + cut_records_len));
-    }
-
-    set_ih_entry_count (ih, get_ih_entry_count (ih) - del_count);
-
-    /* shift entry head array and entries those are AFTER removed entries */
-    memmove ((char *)(deh + from),
-	     deh + from + del_count, 
-	     prev_record - cut_records_len - (char *)(deh + from + del_count));
-  
-    /* shift records, those are BEFORE removed entries */
-    memmove (prev_record - cut_records_len - DEH_SIZE * del_count,
-	     prev_record, item + get_ih_item_len (ih) - prev_record);
-
-    return DEH_SIZE * del_count + cut_records_len;
-}
-
-
-/*  when cut item is part of regular file
-        pos_in_item - first byte that must be cut
-        cut_size - number of bytes to be cut beginning from pos_in_item
- 
-   when cut item is part of directory
-        pos_in_item - number of first deleted entry
-        cut_size - count of deleted entries
-    */
-void leaf_cut_from_buffer (reiserfs_filsys_t * fs,
-			   struct buffer_info * bi, int cut_item_num,
-			   int pos_in_item, int cut_size)
-{
-    int nr;
-    struct buffer_head * bh = bi->bi_bh;
-    struct block_head * blkh;
-    struct item_head * ih;
-    int last_loc, unmoved_loc;
-    int i;
-
-    blkh = B_BLK_HEAD (bh);
-    nr = get_blkh_nr_items (blkh);
-
-    /* item head of truncated item */
-    ih = B_N_PITEM_HEAD (bh, cut_item_num);
-
-    if (I_IS_DIRECTORY_ITEM (ih)) {
-        /* first cut entry ()*/
-        cut_size = leaf_cut_entries (bh, ih, pos_in_item, cut_size);
-        if (pos_in_item == 0) {
-            /* change item key by key of first entry in the item */
-	    set_key_offset_v1 (&ih->ih_key, get_deh_offset (B_I_DEH (bh, ih)));
-            /*memcpy (&ih->ih_key.k_offset, &(B_I_DEH (bh, ih)->deh_offset), SHORT_KEY_SIZE);*/
-	}
-    } else {
-        /* item is direct or indirect */
-        /* shift item body to left if cut is from the head of item */
-        if (pos_in_item == 0) {
-	    memmove (bh->b_data + get_ih_location (ih),
-		     bh->b_data + get_ih_location (ih) + cut_size,
-		     get_ih_item_len (ih) - cut_size);
-
-            /* change key of item */
-            if (I_IS_DIRECT_ITEM(ih)) {
-                //ih->ih_key.k_offset += cut_size;
-                set_offset (key_format (&ih->ih_key), &ih->ih_key, get_offset (&ih->ih_key) + cut_size);
-            } else {
-                //ih->ih_key.k_offset += (cut_size / UNFM_P_SIZE) * bh->b_size;
-                set_offset (key_format (&ih->ih_key), &ih->ih_key, 
-			    get_offset (&ih->ih_key) + (cut_size / UNFM_P_SIZE) * bh->b_size);
-	    }
-	}
-    }
-  
-
-    /* location of the last item */
-    last_loc = get_ih_location (&ih[nr - cut_item_num - 1]);
-
-    /* location of the item, which is remaining at the same place */
-    unmoved_loc = cut_item_num ? get_ih_location (ih-1) : bh->b_size;
-
-
-    /* shift */
-    memmove (bh->b_data + last_loc + cut_size, bh->b_data + last_loc,
-	       unmoved_loc - last_loc - cut_size);
-
-    /* change item length */
-    set_ih_item_len (ih, get_ih_item_len (ih) - cut_size);
-  
-    if (I_IS_INDIRECT_ITEM(ih)) {
-        if (pos_in_item)
-            //ih->u.ih_free_space = 0;
-            set_ih_free_space (ih, 0);
-    }
-
-    /* change locations */
-    for (i = cut_item_num; i < nr; i ++) {
-	set_ih_location (&ih[i-cut_item_num], get_ih_location (&ih[i-cut_item_num]) + cut_size);
-    }
-
-    /* size, free space */
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) + cut_size);
-
-    mark_buffer_dirty(bh);
-    
-    if (bi->bi_parent) {
-	struct disk_child * dc;
-
-	dc = B_N_CHILD (bi->bi_parent, bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) - cut_size);
-	mark_buffer_dirty(bi->bi_parent);
-    }
-    if (is_a_leaf(bh->b_data, bh->b_size) != THE_LEAF &&
-	is_a_leaf(bh->b_data, bh->b_size) != HAS_IH_ARRAY)
-	reiserfs_panic ("leaf_cut_from_buffer: bad leaf %lu: %b",
-			bh->b_blocknr, bh);
-}
-
-
-/* delete del_num items from buffer starting from the first'th item */
-static void leaf_delete_items_entirely (reiserfs_filsys_t * fs,
-					struct buffer_info * bi,
-					int first, int del_num)
-{
-    struct buffer_head * bh = bi->bi_bh;
-    int nr;
-    int i, j;
-    int last_loc, last_removed_loc;
-    struct block_head * blkh;
-    struct item_head * ih;
-
-    if (del_num == 0)
-	return;
-    
-    blkh = B_BLK_HEAD (bh);
-    nr = get_blkh_nr_items (blkh);
-
-    if (first == 0 && del_num == nr) {
-	/* this does not work */
-	make_empty_node (bi);
-	
-	mark_buffer_dirty(bh);
-	return;
-    }
-    
-    ih = B_N_PITEM_HEAD (bh, first);
-    
-    /* location of unmovable item */
-    j = (first == 0) ? bh->b_size : get_ih_location (ih-1);
-    
-    /* delete items */
-    last_loc = get_ih_location (&ih[nr - 1 - first]);
-    last_removed_loc = get_ih_location (&ih[del_num-1]);
-    
-    memmove (bh->b_data + last_loc + j - last_removed_loc,
-	     bh->b_data + last_loc, last_removed_loc - last_loc);
-    
-    /* delete item headers */
-    memmove (ih, ih + del_num, (nr - first - del_num) * IH_SIZE);
-    
-    /* change item location */
-    for (i = first; i < nr - del_num; i ++) {
-	set_ih_location (&ih[i-first], get_ih_location (&ih[i-first]) + j - last_removed_loc);
-    }
-    
-    /* sizes, item number */
-    set_blkh_nr_items (blkh, get_blkh_nr_items (blkh)/*nr*/ - del_num);
-    set_blkh_free_space (blkh, get_blkh_free_space (blkh) + j - last_removed_loc + IH_SIZE * del_num);
-    
-    mark_buffer_dirty(bh);
-    
-    if (bi->bi_parent) {
-	struct disk_child * dc;
-
-	dc = B_N_CHILD (bi->bi_parent, bi->bi_position);
-	set_dc_child_size (dc, get_dc_child_size (dc) - 
-	    (j - last_removed_loc + IH_SIZE * del_num));
-	mark_buffer_dirty(bi->bi_parent);
-    }
-    if (is_a_leaf(bh->b_data, bh->b_size) != THE_LEAF &&
-	is_a_leaf(bh->b_data, bh->b_size) != HAS_IH_ARRAY)
-	reiserfs_panic ("leaf_delete_items_entirely: bad leaf %lu: %b", bh->b_blocknr, bh);
-}
-
-
-
-
-
-/* paste new_entry_count entries (new_dehs, records) into position before to item_num-th item */
-void leaf_paste_entries (struct buffer_head * bh,
-			 int item_num, int before, int new_entry_count,
-			 struct reiserfs_de_head * new_dehs,
-			 const char * records, int paste_size)
-{
-    struct item_head * ih;
-    char * item;
-    struct reiserfs_de_head * deh;
-    char * insert_point;
-    int i, old_entry_num;
-
-    if (new_entry_count == 0)
-        return;
-
-    ih = B_N_PITEM_HEAD(bh, item_num);
-
-    /* first byte of dest item */
-    item = B_I_PITEM (bh, ih);
-
-    /* entry head array */
-    deh = B_I_DEH (bh, ih);
-
-    /* new records will be pasted at this point */
-    insert_point = item + (before ? get_deh_location (&deh[before - 1]) : (get_ih_item_len (ih) - paste_size));
-
-    /* adjust locations of records that will be AFTER new records */
-    for (i = get_ih_entry_count (ih) - 1; i >= before; i --)
-	set_deh_location (deh + i, get_deh_location (deh + i) + DEH_SIZE * new_entry_count);
-
-    /* adjust locations of records that will be BEFORE new records */
-    for (i = 0; i < before; i ++)
-	set_deh_location (deh + i, get_deh_location (deh + i) + paste_size);
-
-    old_entry_num = get_ih_entry_count (ih);
-    //I_ENTRY_COUNT(ih) += new_entry_count;
-    set_ih_entry_count (ih, old_entry_num + new_entry_count);
-
-    /* prepare space for pasted records */
-    memmove (insert_point + paste_size, insert_point, item + (get_ih_item_len (ih) - paste_size) - insert_point);
-
-    /* copy new records */
-    memcpy (insert_point + DEH_SIZE * new_entry_count, records,
-	    paste_size - DEH_SIZE * new_entry_count);
-  
-    /* prepare space for new entry heads */
-    deh += before;
-    memmove ((char *)(deh + new_entry_count), deh, insert_point - (char *)deh);
-
-    /* copy new entry heads */
-    memcpy (deh, new_dehs, DEH_SIZE * new_entry_count);
-
-    /* set locations of new records */
-    for (i = 0; i < new_entry_count; i ++)
-	set_deh_location (deh + i,
-			  get_deh_location (deh + i) + (- get_deh_location (&new_dehs[new_entry_count - 1]) +
-							insert_point + DEH_SIZE * new_entry_count - item));
-
-
-    /* change item key if neccessary (when we paste before 0-th entry */
-    if (!before)
-	set_key_offset_v1 (&ih->ih_key, get_deh_offset (new_dehs));
-}
-
-
-
-/* wrappers for operations on one separated node */
-
-void delete_item (reiserfs_filsys_t * fs,
-		  struct buffer_head * bh, int item_num)
-{
-    struct buffer_info bi;
-
-    bi.bi_bh = bh;
-    bi.bi_parent = 0;
-    bi.bi_position = 0;
-    leaf_delete_items_entirely (fs, &bi, item_num, 1);
-}
-
-
-void cut_entry (reiserfs_filsys_t * fs, struct buffer_head * bh,
-		int item_num, int entry_num, int del_count)
-{
-    struct buffer_info bi;
-
-    bi.bi_bh = bh;
-    bi.bi_parent = 0;
-    bi.bi_position = 0;
-    leaf_cut_from_buffer (fs, &bi, item_num, entry_num, del_count);
-}
-
diff --git a/reiserfscore/node_formats.c b/reiserfscore/node_formats.c
deleted file mode 100644
index 59697be..0000000
--- a/reiserfscore/node_formats.c
+++ /dev/null
@@ -1,1306 +0,0 @@
-/*
- *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
- *  reiserfsprogs/README
- */
-
-#include "includes.h"
-
-int leaf_count_ih(char * buf, int blocksize) {
-    struct item_head * ih;
-    int prev_location;
-    int nr;
-
-    /* look at the table of item head */
-    prev_location = blocksize;
-    ih = (struct item_head *)(buf + BLKH_SIZE);
-    nr = 0;
-    while (1) {
-	if (get_ih_location (ih) + get_ih_item_len (ih) != prev_location)
-	    break;
-	if (get_ih_location (ih) < IH_SIZE * (nr + 1) + BLKH_SIZE)
-	    break;
-	if (get_ih_item_len (ih) > MAX_ITEM_LEN (blocksize))
-	    break;
-	prev_location = get_ih_location (ih);
-	ih ++;
-	nr ++;
-    }
-    
-    return nr;
-}
-
-int leaf_free_space_estimate(char * buf, int blocksize) {
-    struct block_head * blkh;
-    struct item_head * ih;
-    int nr;
-    
-    blkh = (struct block_head *)buf;
-    nr = get_blkh_nr_items(blkh);    
-    ih = (struct item_head *)(buf + BLKH_SIZE) + nr - 1;
-    
-    return (nr ? get_ih_location (ih) : blocksize) - BLKH_SIZE - IH_SIZE * nr;
-}
-
-static int leaf_blkh_correct(char * buf, int blocksize) {
-    struct block_head * blkh;
-    unsigned int nr;
-
-    blkh = (struct block_head *)buf;
-    if (!is_leaf_block_head (buf))
-	return 0;
-
-    nr = get_blkh_nr_items(blkh);
-    if (nr > ((blocksize - BLKH_SIZE) / (IH_SIZE + MIN_ITEM_LEN)))
-	/* item number is too big or too small */
-	return 0;
-
-    return leaf_free_space_estimate(buf, blocksize) == get_blkh_free_space (blkh);
-}
-
-int is_a_leaf(char * buf, int blocksize) {
-    struct block_head * blkh;
-    int counted;
-    
-    blkh = (struct block_head *)buf;
-    if (!is_leaf_block_head (buf))
-	return 0;
-
-    counted = leaf_count_ih(buf, blocksize);
-    
-    /* if leaf block header is ok, check item count also. */
-    if (leaf_blkh_correct(buf, blocksize))
-	return counted >= get_blkh_nr_items (blkh) ? THE_LEAF : HAS_IH_ARRAY;
-    
-    /* leaf block header is corrupted, it is ih_array if some items were detected.*/
-    return counted ? HAS_IH_ARRAY : 0;
-}
-
-int leaf_item_number_estimate(struct buffer_head * bh) {
-    struct block_head * blkh;
-    int nr;
-    
-    nr = leaf_count_ih(bh->b_data, bh->b_size);
-    blkh = (struct block_head *)bh->b_data;
-
-    return nr >= get_blkh_nr_items (blkh) ? get_blkh_nr_items (blkh) : nr;
-}
-
-#if 0
-/* this only checks block header and item head array (ih_location-s
-   and ih_item_len-s). Item internals are not checked */
-int does_node_look_like_a_leaf (char * buf, int blocksize)
-{
-    struct block_head * blkh;
-    struct item_head * ih;
-    int used_space;
-    int prev_location;
-    int i;
-    int nr;
-
-    blkh = (struct block_head *)buf;
-    if (!is_leaf_block_head (buf))
-	return 0;
-
-    nr = get_blkh_nr_items (blkh);
-    if (nr < 0 || nr > ((blocksize - BLKH_SIZE) / (IH_SIZE + MIN_ITEM_LEN)))
-	/* item number is too big or too small */
-	return 0;
-
-    ih = (struct item_head *)(buf + BLKH_SIZE) + nr - 1;
-    used_space = BLKH_SIZE + IH_SIZE * nr + (blocksize - (nr ? get_ih_location (ih) : blocksize));
-
-    if (used_space != blocksize - get_blkh_free_space (blkh))
-	/* free space does not match to calculated amount of use space */
-	return 0;
-
-    // FIXME: it is_leaf will hit performance too much - we may have
-    // return 1 here
-
-    /* check tables of item heads */
-    ih = (struct item_head *)(buf + BLKH_SIZE);
-    prev_location = blocksize;
-    for (i = 0; i < nr; i ++, ih ++) {
-	/* items of zero length are allowed - they may exist for short time
-           during balancing */
-	if (get_ih_location (ih) > blocksize || get_ih_location (ih) < IH_SIZE * nr)
-	    return 0;
-	if (/*ih_item_len (ih) < 1 ||*/ get_ih_item_len (ih) > MAX_ITEM_LEN (blocksize))
-	    return 0;
-	if (prev_location - get_ih_location (ih) != get_ih_item_len (ih))
-	    return 0;
-	prev_location = get_ih_location (ih);
-    }
-
-    // one may imagine much more checks
-    return 1;
-}
-
-/* check ih_item_len and ih_location. Should be useful when block head is
-   corrupted */
-static int does_node_have_ih_array (char * buf, int blocksize)
-{
-    struct item_head * ih;
-    int prev_location;
-    int nr;
-
-    /* look at the table of item head */
-    prev_location = blocksize;
-    ih = (struct item_head *)(buf + BLKH_SIZE);
-    nr = 0;
-    while (1) {
-	if (get_ih_location (ih) + get_ih_item_len (ih) != prev_location)
-	    break;
-
-	prev_location = get_ih_location (ih);
-	ih ++;
-	nr ++;
-    }
-    if (nr < 2)
-	return 0;
-    return nr;
-}
-#endif
-
-/* returns 1 if buf looks like an internal node, 0 otherwise */
-static int is_correct_internal (char * buf, int blocksize)
-{
-    struct block_head * blkh;
-    unsigned int nr;
-    int used_space;
-
-    blkh = (struct block_head *)buf;
-
-    if (!is_internal_block_head (buf))
-	return 0;
-    
-    nr = get_blkh_nr_items (blkh);
-    if (nr > (blocksize - BLKH_SIZE - DC_SIZE) / (KEY_SIZE + DC_SIZE))
-	/* for internal which is not root we might check min number of keys */
-	return 0;
-
-    used_space = BLKH_SIZE + KEY_SIZE * nr + DC_SIZE * (nr + 1);
-    if (used_space != blocksize - get_blkh_free_space (blkh))
-	return 0;
-
-    // one may imagine much more checks
-    return 1;
-}
-
-
-// make sure that bh contains formatted node of reiserfs tree of
-// 'level'-th level
-int is_tree_node (struct buffer_head * bh, int level)
-{
-    if (B_LEVEL (bh) != level)
-	return 0;
-    if (is_leaf_node (bh))
-	return is_a_leaf(bh->b_data, bh->b_size);
-
-    return is_correct_internal (bh->b_data, bh->b_size);
-}
-
-
-static int is_desc_block (char * buf, unsigned long buf_size)
-{
-    struct reiserfs_journal_desc *desc = (struct reiserfs_journal_desc *)buf;
-    if (!memcmp(buf + buf_size - 12, JOURNAL_DESC_MAGIC, 8) &&
-	le32_to_cpu (desc->j2_len) > 0)
-	return 1;
-    return 0;
-}
-
-
-int is_reiserfs_3_5_magic_string (struct reiserfs_super_block * rs)
-{
-    return (!strncmp (rs->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING, 
-		      strlen ( REISERFS_3_5_SUPER_MAGIC_STRING)));
-}
-
-
-int is_reiserfs_3_6_magic_string (struct reiserfs_super_block * rs)
-{
-    return (!strncmp (rs->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING, 
-		      strlen ( REISERFS_3_6_SUPER_MAGIC_STRING)));
-}
-
-
-int is_reiserfs_jr_magic_string (struct reiserfs_super_block * rs)
-{
-    return (!strncmp (rs->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, 
-		      strlen ( REISERFS_JR_SUPER_MAGIC_STRING)));
-}
-
-
-int is_any_reiserfs_magic_string (struct reiserfs_super_block * rs)
-{
-    if (is_reiserfs_3_5_magic_string (rs) ||
-	is_reiserfs_3_6_magic_string (rs) ||
-	is_reiserfs_jr_magic_string (rs))
-	return 1;
-    return 0;
-}
-
-
-int get_reiserfs_format (struct reiserfs_super_block * sb)
-{
-    /* after conversion to 3.6 format we change magic correctly, 
-       but do not change sb_format. When we create non-standard journal 
-       field format in sb get adjusted correctly. Thereby, for standard 
-       journal we should rely on magic and for non-standard - on format */
-    if (is_reiserfs_3_5_magic_string (sb) ||
-	(is_reiserfs_jr_magic_string (sb) && 
-	 get_sb_version (sb) == REISERFS_FORMAT_3_5))
-	return REISERFS_FORMAT_3_5;
-
-    if (is_reiserfs_3_6_magic_string (sb) ||
-	(is_reiserfs_jr_magic_string (sb) &&
-	 get_sb_version (sb) == REISERFS_FORMAT_3_6))
-	return REISERFS_FORMAT_3_6;
-
-    return REISERFS_FORMAT_UNKNOWN;
-}
-
-
-
-int reiserfs_super_block_size (struct reiserfs_super_block * sb)
-{
-    switch (get_reiserfs_format (sb)) {
-    case REISERFS_FORMAT_3_5:
-	return SB_SIZE_V1;
-    case REISERFS_FORMAT_3_6:
-	return SB_SIZE;
-    }
-    reiserfs_panic ("Unknown format found");
-    return 0;
-}
-
-/* this one had signature in different place of the super_block
-   structure */
-int is_prejournaled_reiserfs (struct reiserfs_super_block * rs)
-{
-    return (!strncmp((char*)rs + REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ,
-		     REISERFS_3_5_SUPER_MAGIC_STRING,
-		     strlen(REISERFS_3_5_SUPER_MAGIC_STRING)));
-}
-
-int does_look_like_super_block (struct reiserfs_super_block * sb) {
-    if (!is_any_reiserfs_magic_string (sb))
-    	return 0;
-    
-    if (!is_blocksize_correct(get_sb_block_size (sb)))
-	return 0;
-	
-    return 1;
-}
-
-
-/* returns code of reiserfs metadata block (leaf, internal, super
-   block, journal descriptor), unformatted */
-int who_is_this (char * buf, int blocksize)
-{
-    int res;
-    
-    /* super block? */
-    if (does_look_like_super_block ((void *)buf))
-	return THE_SUPER;
-
-    if ((res = is_a_leaf(buf, blocksize)))
-	/* if block head and item head array seem matching (node level, free
-           space, item number, item locations and length), then it is THE_LEAF,
-	  otherwise, it is HAS_IH_ARRAY */
-	return res;
-
-    if (is_correct_internal (buf, blocksize))
-	return THE_INTERNAL;
-
-
-    /* journal descriptor block? */
-    if (is_desc_block (buf, blocksize))
-	return THE_JDESC;
-
-    /* contents of buf does not look like reiserfs metadata. Bitmaps
-       are possible here */
-    return THE_UNKNOWN;
-}
-
-
-char * which_block (int code)
-{
-    static char * leaf = "leaf";
-    static char * broken_leaf = "broken leaf";
-    static char * internal = "internal";
-    static char * other = "unknown";
-
-    switch (code) {
-    case THE_LEAF:
-	return leaf;
-    case HAS_IH_ARRAY:
-	return broken_leaf;
-    case THE_INTERNAL:
-	return internal;
-    }
-    return other;
-}
-
-
-/** */
-int block_of_journal (reiserfs_filsys_t * fs, unsigned long block) {
-    if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb)) {
-	/* standard journal */
-	if (block >= get_journal_start_must (fs) &&
-	    block <= get_journal_start_must (fs) + get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)))
-	    return 1;
-	return 0;
-    }
-    
-    if (get_sb_reserved_for_journal (fs->fs_ondisk_sb))
-	/* there is space reserved for the journal on the host device */
-	if (block >= get_journal_start_must (fs) && 
-	    block < get_journal_start_must (fs) + get_sb_reserved_for_journal (fs->fs_ondisk_sb))
-	    return 1;
-
-    return 0;
-}
-
-
-int block_of_bitmap (reiserfs_filsys_t * fs, unsigned long block)
-{
-    if (spread_bitmaps (fs)) {
-	if (!(block % (fs->fs_blocksize * 8)))
-	    /* bitmap block */
-	    return 1;
-	return (block == (REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize + 1)) ;
-    } else {
-	/* bitmap in */
-	return (block > 2ul && block < 3ul + get_sb_bmap_nr(fs->fs_ondisk_sb)) ? 1 : 0;
-    }
-    return 0;
-}
-
-
-/* check whether 'block' can be pointed to by an indirect item */
-int not_data_block (reiserfs_filsys_t * fs, unsigned long block)
-{
-    if (block_of_bitmap (fs, block))
-	/* it is one of bitmap blocks */
-	return 1;
-
-    if (block_of_journal (fs, block))
-	/* block of journal area */
-	return 1;
-
-    if (block <= fs->fs_super_bh->b_blocknr)
-	/* either super block or a block from skipped area at the
-           beginning of filesystem */
-	return 1;
-
-    return 0;
-}
-
-
-/* check whether 'block' can be logged */
-int not_journalable (reiserfs_filsys_t * fs, unsigned long block)
-{   
-    /* we should not update SB with journal copy during fsck */
-    if (block < fs->fs_super_bh->b_blocknr)
-	return 1;
-
-    if (block_of_journal (fs, block))
-	return 1;
-
-    if (block >= get_sb_block_count (fs->fs_ondisk_sb))
-	return 1;
-
-    return 0;
-}
-
-// in reiserfs version 0 (undistributed bitmap)
-// FIXME: what if number of bitmaps is 15?
-unsigned int get_journal_old_start_must (reiserfs_filsys_t * fs) {
-    return (REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) + 1 + 
-	get_sb_bmap_nr (fs->fs_ondisk_sb);
-}
-
-unsigned int get_journal_new_start_must (reiserfs_filsys_t * fs)
-{
-    return (REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize) + 2;
-}
-
-unsigned int get_journal_start_must(reiserfs_filsys_t * fs) {
-    if (is_old_sb_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
-    	return get_journal_old_start_must (fs);
-
-    return get_journal_new_start_must(fs);
-}
-
-__u32 get_bytes_number (struct item_head * ih, int blocksize) {
-    switch (get_type (&ih->ih_key)) {
-    case TYPE_DIRECT:
-	return get_ih_item_len (ih);
-    case TYPE_INDIRECT:
-	return I_UNFM_NUM(ih) * blocksize;// - get_ih_free_space (ih);
-    case TYPE_STAT_DATA:
-    case TYPE_DIRENTRY:
-	return 0;
-    }
-    reiserfs_warning (stderr, "get_bytes_number: called for wrong type of item %h", ih);
-    return 0;
-}
-
-
-int check_item_f (reiserfs_filsys_t * fs, struct item_head * ih, char * item);
-
-/* ih_key, ih_location and ih_item_len seem correct, check other fields */
-static int does_ih_look_correct (struct item_head * ih)
-{
-    int ih_key_format;
-    int key_key_format;
-
-    /* key format from item_head */
-    ih_key_format = get_ih_key_format (ih);
-    if (ih_key_format != KEY_FORMAT_1 && ih_key_format != KEY_FORMAT_2)
-	return 0;
-
-    /* key format calculated on key */
-    key_key_format = key_format (&ih->ih_key);
-    if (is_stat_data_ih (ih)) {
-	/* for stat data we can not find key format from a key itself, so look at
-           the item length */
-	if (get_ih_item_len (ih) == SD_SIZE)
-	    key_key_format = KEY_FORMAT_2;
-	else if (get_ih_item_len (ih) == SD_V1_SIZE)
-	    key_key_format = KEY_FORMAT_1;
-	else
-	    return 0;
-    }
-    if (key_key_format != ih_key_format)
-	return 0;
-
-    /* we do not check ih_format.fsck_need as fsck might change it. So,
-       debugreiserfs -p will have to dump it */
-    return 1;
-}
-
-/* check item length, ih_free_space for pure 3.5 format, unformatted node
-   pointers */
-static int is_bad_indirect (reiserfs_filsys_t * fs, struct item_head * ih, char * item,
-			    check_unfm_func_t check_unfm_func)
-{
-    unsigned int i;
-    __u32 * ind = (__u32 *)item;
-
-    if (get_ih_item_len (ih) % UNFM_P_SIZE)
-	return 1;
-
-    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-	if (!ind [i])
-	    continue;
-	if (check_unfm_func && check_unfm_func (fs, d32_get (ind, i)))
-	    return 1;
-    }
-
-    if (fs->fs_format == REISERFS_FORMAT_3_5) {
-	/* check ih_free_space for 3.5 format only */
-	if (get_ih_free_space (ih) > fs->fs_blocksize - 1)
-	    return 1;
-    }
-    
-    return 0;
-}
-
-
-static const struct {
-    hashf_t func;
-    char * name;
-} hashes[] = {{0, "not set"},
-	      {keyed_hash, "\"tea\""},
-	      {yura_hash, "\"rupasov\""},
-	      {r5_hash, "\"r5\""}};        
-
-#define HASH_AMOUNT (sizeof (hashes) / sizeof (hashes [0]))
-
-
-
-int known_hashes (void)
-{
-    return HASH_AMOUNT;
-}
-
-
-#define good_name(hashfn,name,namelen,deh_offset) \
-(hash_value (hashfn, name, namelen) == GET_HASH_VALUE (deh_offset))
-
-
-/* this also sets hash function */
-int is_properly_hashed (reiserfs_filsys_t * fs,
-			char * name, int namelen, __u32 offset)
-{
-    unsigned int i;
-
-    if (namelen == 1 && name[0] == '.') {
-	if (offset == DOT_OFFSET)
-	    return 1;
-	return 0;
-    }
-
-    if (namelen == 2 && name[0] == '.' && name[1] == '.') {
-	if (offset == DOT_DOT_OFFSET)
-	    return 1;
-	return 0;
-    }
-
-    if (hash_func_is_unknown (fs)) {
-	/* try to find what hash function the name is sorted with */
-	for (i = 1; i < HASH_AMOUNT; i ++) {
-	    if (good_name (hashes [i].func, name, namelen, offset)) {
-		if (!hash_func_is_unknown (fs)) {
-		    /* two or more hash functions give the same value for this
-                       name */
-		    fprintf (stderr, "Detecting hash code: could not detect hash with name \"%.*s\"\n",
-			     namelen, name);
-		    reiserfs_hash (fs) = 0;
-		    return 1;
-		}
-
-		/* set hash function */
- 		reiserfs_hash(fs) = hashes [i].func;
- 	    }
- 	}
-
-        if (hash_func_is_unknown (fs)) {
-            return 0;
-        }
-    }
-
-    if (good_name (reiserfs_hash(fs), name, namelen, offset))
-	return 1;
-
-    return 0;
-}
-
-
-int find_hash_in_use (char * name, int namelen, __u32 offset, unsigned int code_to_try_first)
-{
-    unsigned int i;
-
-    if (!namelen || !name[0])
-	return UNSET_HASH;
-
-    if (code_to_try_first) {
-	if (good_name (hashes [code_to_try_first].func, name, namelen, offset))
-	    return code_to_try_first;
-    }
-    
-    for (i = 1; i < HASH_AMOUNT; i ++) {
-	if (i == code_to_try_first)
-	    continue;
-	if (good_name (hashes [i].func, name, namelen, offset))
-	    return i;
-    }
-
-    /* not matching hash found */
-    return UNSET_HASH;
-}
-
-
-char * code2name(unsigned int code) {
-    if (code >= HASH_AMOUNT || code < 0)
-        return 0;
-    return hashes [code].name;
-}
-
-
-int func2code (hashf_t func)
-{
-    unsigned int i;
-    
-    for (i = 0; i < HASH_AMOUNT; i ++)
-	if (func == hashes [i].func)
-	    return i;
-
-    reiserfs_panic ("func2code: no hashes matches this function\n");
-    return 0;
-}
-
-
-hashf_t code2func(unsigned int code) {
-    if (code >= HASH_AMOUNT) {
-	reiserfs_warning (stderr, "code2func: wrong hash code %d.\n"
-			  "Using default %s hash function\n", code,
-			  code2name (DEFAULT_HASH));
-	code = DEFAULT_HASH;
-    }
-    return hashes [code].func;
-}
-
-
-hashf_t name2func (char * hash) {
-    unsigned int i;
- 
-    for (i = 0; i < HASH_AMOUNT; i ++)
-	if (!strcmp (hash, hashes [i].name))
-	    return hashes [i].func;
-    return 0;
-}
-
-
-int dir_entry_bad_location (struct reiserfs_de_head * deh, struct item_head * ih, int first)
-{
-    if (get_deh_location (deh) < DEH_SIZE * get_ih_entry_count (ih))
-	return 1;
-    
-    if (get_deh_location (deh) >= get_ih_item_len (ih))
-	return 1;
-
-    if (!first && get_deh_location (deh) >= get_deh_location (deh - 1))
-	return 1;
-
-    return 0;
-}
-
-
-/* the only corruption which is not considered fatal - is hash mismatching. If
-   bad_dir is set - directory item having such names is considered bad */
-static int is_bad_directory (reiserfs_filsys_t * fs, struct item_head * ih, char * item,
-			     int bad_dir)
-{
-    int i;
-    int namelen;
-    struct reiserfs_de_head * deh = (struct reiserfs_de_head *)item;
-    __u32 prev_offset = 0;
-    __u16 prev_location = get_ih_item_len (ih);
-    
-    for (i = 0; i < get_ih_entry_count (ih); i ++, deh ++) {
-	if (get_deh_location (deh) >= prev_location)
-	    return 1;
-	prev_location = get_deh_location (deh);
-	    
-	namelen = name_in_entry_length (ih, deh, i);
-	if (namelen > (int)REISERFS_MAX_NAME_LEN(fs->fs_blocksize))
-	    return 1;
-	
-	if (get_deh_offset (deh) <= prev_offset)
-	    return 1;
-	prev_offset = get_deh_offset (deh);
-	
-	/* check hash value */
-	if (!is_properly_hashed (fs, item + prev_location, namelen, prev_offset)) {
-	    if (bad_dir)
-		/* make is_bad_leaf to not insert whole leaf. Node will be
-		   marked not-insertable and put into tree item by item in
-		   pass 2 */
-		return 1;
-	}
-    }
-
-    return 0;
-}
-
-
-/* used by debugreisrefs -p only yet */
-int is_it_bad_item (reiserfs_filsys_t * fs, struct item_head * ih, char * item,
-		    check_unfm_func_t check_unfm, int bad_dir)
-{
-    int retval;
-
-/*
-    if (!does_key_look_correct (fs, &ih->ih_key))
-	return 1;
-
-    if (!does_ih_look_correct (ih))
-	return 1;
-*/
-    if (!does_ih_look_correct (ih))
-	return 1;
-
-    
-    if (is_stat_data_ih (ih) || is_direct_ih (ih))
-	return 0;
-
-    if (is_direntry_ih (ih)) {
-	retval =  is_bad_directory (fs, ih, item, bad_dir);
-	/*
-	if (retval)
-	reiserfs_warning (stderr, "is_bad_directory %H\n", ih);*/
-	return retval;
-    }
-    if (is_indirect_ih (ih)) {
-	retval = is_bad_indirect (fs, ih, item, check_unfm);
-	/*
-	if (retval)
-	reiserfs_warning (stderr, "is_bad_indirect %H\n", ih);*/
-	return retval;
-    }
-
-    return 1;
-}
-
-
-/* prepare new or old stat data for the new directory */
-void make_dir_stat_data (int blocksize, int key_format, 
-			 __u32 dirid, __u32 objectid, 
-			 struct item_head * ih, void * sd)
-{
-    memset (ih, 0, IH_SIZE);
-    set_key_dirid (&ih->ih_key, dirid);
-    set_key_objectid (&ih->ih_key, objectid);
-    set_key_offset_v1 (&ih->ih_key, SD_OFFSET);
-    set_key_uniqueness (&ih->ih_key, 0);
-
-    set_ih_key_format (ih, key_format);
-    set_ih_free_space (ih, MAX_US_INT);
-
-
-    if (key_format == KEY_FORMAT_2) {
-        struct stat_data *sd_v2 = (struct stat_data *)sd;
-
-	set_ih_item_len (ih, SD_SIZE);
-        set_sd_v2_mode (sd_v2, S_IFDIR + 0755);
-        set_sd_v2_nlink (sd_v2, 2);
-        set_sd_v2_uid (sd_v2, 0);
-        set_sd_v2_gid (sd_v2, 0);
-        set_sd_v2_size (sd_v2, EMPTY_DIR_SIZE);
-        set_sd_v2_atime (sd_v2, time(NULL));
-        sd_v2->sd_ctime = sd_v2->sd_mtime = sd_v2->sd_atime; /* all le */
-        set_sd_v2_rdev (sd_v2, 0);
-        set_sd_v2_blocks (sd_v2, dir_size2st_blocks (EMPTY_DIR_SIZE));
-    }else{
-        struct stat_data_v1 *sd_v1 = (struct stat_data_v1 *)sd;
-
-	set_ih_item_len (ih, SD_V1_SIZE);
-        set_sd_v1_mode(sd_v1, S_IFDIR + 0755);
-        set_sd_v1_nlink(sd_v1, 2);
-        set_sd_v1_uid (sd_v1, 0);
-        set_sd_v1_gid (sd_v1, 0);
-        set_sd_v1_size(sd_v1, EMPTY_DIR_SIZE_V1);
-        set_sd_v1_atime(sd_v1, time(NULL));
-        sd_v1->sd_ctime = sd_v1->sd_mtime = sd_v1->sd_atime; /* all le */
-        set_sd_v1_blocks(sd_v1, dir_size2st_blocks(EMPTY_DIR_SIZE_V1));
-        set_sd_v1_first_direct_byte(sd_v1, NO_BYTES_IN_DIRECT_ITEM);
-    }
-}
-
-
-static void _empty_dir_item (int format, char * body, __u32 dirid, __u32 objid,
-			     __u32 par_dirid, __u32 par_objid)
-{
-    struct reiserfs_de_head * deh;
-    __u16 state;
-
-    memset (body, 0, (format == KEY_FORMAT_2 ? EMPTY_DIR_SIZE : EMPTY_DIR_SIZE_V1));
-    deh = (struct reiserfs_de_head *)body;
-    
-    /* direntry header of "." */
-    set_deh_offset (deh, DOT_OFFSET);
-    set_deh_dirid (deh, dirid);
-    set_deh_objectid (deh, objid);
-    state = (1 << DEH_Visible2);
-    set_deh_state (deh, state);
-
-    /* direntry header of ".." */
-    set_deh_offset (deh + 1, DOT_DOT_OFFSET);
-    /* key of ".." for the root directory */
-    set_deh_dirid (deh + 1, par_dirid);
-    set_deh_objectid (deh + 1, par_objid);
-    set_deh_state (deh + 1, state);
-
-    if (format == KEY_FORMAT_2) {
-	set_deh_location (deh, EMPTY_DIR_SIZE - ROUND_UP (strlen (".")));
-	set_deh_location (deh + 1, get_deh_location (deh) - ROUND_UP (strlen ("..")));
-    } else {
-	set_deh_location (deh, EMPTY_DIR_SIZE_V1 - strlen ("."));
-	set_deh_location (deh + 1, get_deh_location (deh) - strlen (".."));
-    }
-
-    /* copy ".." and "." */
-    memcpy (body + get_deh_location (deh), ".", 1);
-    memcpy (body + get_deh_location (deh + 1), "..", 2);
-    
-}
-
-
-void make_empty_dir_item_v1 (char * body, __u32 dirid, __u32 objid,
-			     __u32 par_dirid, __u32 par_objid)
-{
-    _empty_dir_item (KEY_FORMAT_1, body, dirid, objid, par_dirid, par_objid);
-}
-
-
-void make_empty_dir_item (char * body, __u32 dirid, __u32 objid,
-			  __u32 par_dirid, __u32 par_objid)
-{
-    _empty_dir_item (KEY_FORMAT_2, body, dirid, objid, par_dirid, par_objid);
-}
-
-
-
-/* for every item call common action and an action corresponding to
-   item type */
-void for_every_item (struct buffer_head * bh, item_head_action_t action,
-		     item_action_t * actions)
-{
-    int i;
-    struct item_head * ih;
-    item_action_t iaction;
-
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < get_blkh_nr_items (B_BLK_HEAD (bh)); i ++, ih ++) {
-	if (action)
-	    action (ih);
-
-	iaction = actions[get_type (&ih->ih_key)];
-	if (iaction)
-	    iaction (bh, ih);
-    }
-}
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# define get_key_offset_v2(key)     (__u64)((key->u.k2_offset_v2.k_offset))
-# define set_key_offset_v2(key,val) (void)(key->u.k2_offset_v2.k_offset = (val))
-# define get_key_type_v2(key)       (__u16)((key->u.k2_offset_v2.k_type))
-# define set_key_type_v2(key,val)   (void)(key->u.k2_offset_v2.k_type = (val))
-#elif __BYTE_ORDER == __BIG_ENDIAN
-typedef union {
-    struct offset_v2 offset_v2;
-    __u64 linear;
-} __attribute__ ((__packed__)) offset_v2_esafe_overlay;
-
-static inline __u64 get_key_offset_v2 (const struct key *key)
-{
-    offset_v2_esafe_overlay tmp =
-                        *(offset_v2_esafe_overlay *) (&(key->u.k2_offset_v2));
-    tmp.linear = le64_to_cpu( tmp.linear );
-    return tmp.offset_v2.k_offset;
-}
-
-static inline __u32 get_key_type_v2 (const struct key *key)
-{
-    offset_v2_esafe_overlay tmp =
-                        *(offset_v2_esafe_overlay *) (&(key->u.k2_offset_v2));
-    tmp.linear = le64_to_cpu( tmp.linear );
-    return tmp.offset_v2.k_type;
-}
-
-static inline void set_key_offset_v2 (struct key *key, __u64 offset)
-{
-    offset_v2_esafe_overlay *tmp =
-                        (offset_v2_esafe_overlay *)(&(key->u.k2_offset_v2));
-    tmp->linear = le64_to_cpu(tmp->linear);
-    tmp->offset_v2.k_offset = offset;
-    tmp->linear = cpu_to_le64(tmp->linear);
-}
-
-static inline void set_key_type_v2 (struct key *key, __u32 type)
-{
-    offset_v2_esafe_overlay *tmp =
-                        (offset_v2_esafe_overlay *)(&(key->u.k2_offset_v2));
-    if (type > 15)
-        reiserfs_panic ("set_key_type_v2: type is too big %d", type);
-
-    tmp->linear = le64_to_cpu(tmp->linear);
-    tmp->offset_v2.k_type = type;
-    tmp->linear = cpu_to_le64(tmp->linear);
-}
-#else
-# error "nuxi/pdp-endian archs are not supported"
-#endif
-
-static inline int is_key_format_1 (int type) {
-    return ( (type == 0 || type == 15) ? 1 : 0);
-}
-
-/* old keys (on i386) have k_offset_v2.k_type == 15 (direct and
-   indirect) or == 0 (dir items and stat data) */
-
-/* */
-int key_format (const struct key * key)
-{
-    int type;
-
-    type = get_key_type_v2 (key);
-
-    if (is_key_format_1 (type))
-	return KEY_FORMAT_1;
-
-    return KEY_FORMAT_2;
-}
-
-
-unsigned long long get_offset (const struct key * key) {
-    if (key_format (key) == KEY_FORMAT_1)
-	return get_key_offset_v1 (key);
-
-    return get_key_offset_v2 (key);
-}
-
-
-int uniqueness2type (__u32 uniqueness)
-{
-    switch (uniqueness) {
-    case V1_SD_UNIQUENESS: return TYPE_STAT_DATA;
-    case V1_INDIRECT_UNIQUENESS: return TYPE_INDIRECT;
-    case V1_DIRECT_UNIQUENESS: return TYPE_DIRECT;
-    case V1_DIRENTRY_UNIQUENESS: return TYPE_DIRENTRY;
-    }
-    return TYPE_UNKNOWN;
-}
-
-
-__u32 type2uniqueness (int type)
-{
-    switch (type) {
-    case TYPE_STAT_DATA: return V1_SD_UNIQUENESS;
-    case TYPE_INDIRECT: return V1_INDIRECT_UNIQUENESS;
-    case TYPE_DIRECT: return V1_DIRECT_UNIQUENESS;
-    case TYPE_DIRENTRY: return V1_DIRENTRY_UNIQUENESS;
-    } 
-    return V1_UNKNOWN_UNIQUENESS;
-}
-
-
-int get_type (const struct key * key)
-{
-    int type_v2 = get_key_type_v2 (key);
-
-    if (is_key_format_1 (type_v2))
-	return uniqueness2type (get_key_uniqueness (key));
-
-    return type_v2;
-}
-
-
-char * key_of_what (const struct key * key)
-{
-    switch (get_type (key)) {
-    case TYPE_STAT_DATA: return "SD";
-    case TYPE_INDIRECT: return "IND";
-    case TYPE_DIRECT: return "DRCT";
-    case TYPE_DIRENTRY: return "DIR";
-    default: return "???";
-    }
-}
-
-
-int type_unknown (struct key * key)
-{
-    int type = get_type (key);
-    
-    switch (type) {
-    case TYPE_STAT_DATA:
-    case TYPE_INDIRECT:
-    case TYPE_DIRECT:
-    case TYPE_DIRENTRY:
-	return 0;
-    default:
-	break;
-    }
-    return 1;
-}
-
-
-// this sets key format as well as type of item key belongs to
-//
-void set_type (int format, struct key * key, int type)
-{
-    if (format == KEY_FORMAT_1)
-	set_key_uniqueness (key, type2uniqueness (type));
-    else
-	set_key_type_v2 (key, type);
-}
-
-
-// 
-void set_offset (int format, struct key * key, loff_t offset)
-{
-    if (format == KEY_FORMAT_1)
-	set_key_offset_v1 (key, offset);
-    else
-	set_key_offset_v2 (key, offset);
-	
-}
-
-
-void set_type_and_offset (int format, struct key * key, loff_t offset, int type)
-{
-    set_type (format, key, type);
-    set_offset (format, key, offset);
-}
-
-
-/* length of the directory entry in directory item. This define calculates
-   length of i-th directory entry using directory entry locations from dir
-   entry head. When it calculates length of 0-th directory entry, it uses
-   length of whole item in place of entry location of the non-existent
-   following entry in the calculation.  See picture above.*/
-
-
-// NOTE: this is not name length. This is length of whole entry
-int entry_length (struct item_head * ih, struct reiserfs_de_head * deh, int pos_in_item)
-{
-    if (pos_in_item)
-	return (get_deh_location (deh - 1) - get_deh_location (deh));
-    return (get_ih_item_len (ih) - get_deh_location (deh));
-}
-
-
-char * name_in_entry (struct reiserfs_de_head * deh, int pos_in_item)
-{
-    return ((char *)(deh - pos_in_item) + get_deh_location(deh));
-}
-
-int name_in_entry_length (struct item_head * ih,
-		 struct reiserfs_de_head * deh, int pos_in_item)
-{
-    int len, i;
-    char * name;
-
-    len = entry_length (ih, deh, pos_in_item);
-    name = name_in_entry (deh, pos_in_item);
-
-    // name might be padded with 0s
-    i = 0;
-    while (name[i] && i < len)
-	i++;
-
-    return i;
-}
-
-int name_length (char * name, int key_format)
-{
-    if (key_format == KEY_FORMAT_2)
-    	return ROUND_UP (strlen(name));
-    else if (key_format == KEY_FORMAT_1)
-    	return strlen(name);
-
-    return -1;
-}
-
-/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
-__u16 get_ih_key_format (const struct item_head * ih)
-{
-    get_bit_field_XX (16, &ih->ih_format, 0, 12);
-}
-
-
-__u16 get_ih_flags (const struct item_head * ih)
-{
-    get_bit_field_XX (16, &ih->ih_format, 12, 4);
-}
-
-
-void set_ih_key_format (struct item_head * ih, __u16 val)
-{
-    set_bit_field_XX (16, &ih->ih_format, val, 0, 12);
-}
-
-
-void set_ih_flags (struct item_head * ih, __u16 val)
-{
-    set_bit_field_XX (16, &ih->ih_format, val, 12, 4);
-}
-
-
-
-/* access to fields of stat data (both v1 and v2) */
-
-void get_set_sd_field (int field, struct item_head * ih, void * sd,
-		       void * value, int set)
-{
-    if (get_ih_key_format (ih) == KEY_FORMAT_1) {
-	struct stat_data_v1 * sd_v1 = sd;
-
-	switch (field) {
-	case GET_SD_MODE:
-	    if (set)
-		sd_v1->sd_mode = cpu_to_le16 (*(__u16 *)value);
-	    else
-		*(__u16 *)value = le16_to_cpu (sd_v1->sd_mode);
-	    break;
-
-	case GET_SD_SIZE:
-	    /* value must point to 64 bit int */
-	    if (set)
-		sd_v1->sd_size = cpu_to_le32 (*(__u64 *)value);
-	    else
-		*(__u64 *)value = le32_to_cpu (sd_v1->sd_size);
-	    break;
-
-	case GET_SD_BLOCKS:
-	    if (set)
-		sd_v1->u.sd_blocks = cpu_to_le32 (*(__u32 *)value);
-	    else
-		*(__u32 *)value = le32_to_cpu (sd_v1->u.sd_blocks);
-	    break;
-
-	case GET_SD_NLINK:
-	    /* value must point to 32 bit int */
-	    if (set)
-		sd_v1->sd_nlink = cpu_to_le16 (*(__u32 *)value);
-	    else
-		*(__u32 *)value = le16_to_cpu (sd_v1->sd_nlink);
-	    break;
-
-	case GET_SD_FIRST_DIRECT_BYTE:
-	    if (set)
-		sd_v1->sd_first_direct_byte = cpu_to_le32 (*(__u32 *)value);
-	    else
-		*(__u32 *)value = le32_to_cpu (sd_v1->sd_first_direct_byte);
-	    break;
-	    
-	default:
-	    reiserfs_panic ("get_set_sd_field: unknown field of old stat data");
-	}
-    } else {
-	struct stat_data * sd_v2 = sd;
-
-	switch (field) {
-	case GET_SD_MODE:
-	    if (set)
-		sd_v2->sd_mode = cpu_to_le16 (*(__u16 *)value);
-	    else
-		*(__u16 *)value = le16_to_cpu (sd_v2->sd_mode);
-	    break;
-
-	case GET_SD_SIZE:
-	    if (set)
-		sd_v2->sd_size = cpu_to_le64 (*(__u64 *)value);
-	    else
-		*(__u64 *)value = le64_to_cpu (sd_v2->sd_size);
-	    break;
-
-	case GET_SD_BLOCKS:
-	    if (set)
-		sd_v2->sd_blocks = cpu_to_le32 (*(__u32 *)value);
-	    else
-		*(__u32 *)value = le32_to_cpu (sd_v2->sd_blocks);
-	    break;
-
-	case GET_SD_NLINK:
-	    if (set)
-		sd_v2->sd_nlink = cpu_to_le32 (*(__u32 *)value);
-	    else
-		*(__u32 *)value = le32_to_cpu (sd_v2->sd_nlink);
-	    break;
-
-	case GET_SD_FIRST_DIRECT_BYTE:
-	default:
-	    reiserfs_panic ("get_set_sd_field: unknown field of new stat data");
-	}
-    }
-}
-
-int comp_ids (const void * p1, const void * p2)
-{
-    __u32 id1 = le32_to_cpu(*(__u32 *)p1) ;
-    __u32 id2 = le32_to_cpu(*(__u32 *)p2) ;
-
-    if (id1 < id2)
-        return -1;
-    if (id1 > id2)
-        return 1 ;
-    return 0 ;
-}
-
-/* functions to manipulate with super block's objectid map */
-
-int is_objectid_used (reiserfs_filsys_t * fs, __u32 objectid)
-{
-    __u32 * objectid_map;
-    __u32 count = get_sb_oid_cursize(fs->fs_ondisk_sb);
-    int ret;
-    __u32 pos;
-    __u32 le_id = cpu_to_le32(objectid);
-
-
-    objectid_map = (__u32 *)((char *)fs->fs_ondisk_sb + reiserfs_super_block_size (fs->fs_ondisk_sb));
-    
-    ret = reiserfs_bin_search(&le_id, objectid_map, count, sizeof(__u32), &pos, comp_ids);
-
-    /* if the position returned is odd, the oid is in use */
-    if (ret == POSITION_NOT_FOUND)
-	return (pos & 1) ;
-
-    /* if the position returned is even, the oid is in use */
-    return !(pos & 1) ;
-}
-
-
-void mark_objectid_used (reiserfs_filsys_t * fs, __u32 objectid)
-{
-    int i;
-    __u32 * objectid_map;
-    int cursize;
-
-
-    if (is_objectid_used (fs, objectid)) {
-	return;
-    }
-
-    objectid_map = (__u32 *)((char *)fs->fs_ondisk_sb + reiserfs_super_block_size (fs->fs_ondisk_sb));
-    cursize = get_sb_oid_cursize (fs->fs_ondisk_sb);
-
-    for (i = 0; i < cursize; i += 2) {
-	if (objectid >= le32_to_cpu (objectid_map [i]) &&
-	    objectid < le32_to_cpu (objectid_map [i + 1]))
-	    /* it is used */
-	    return;
-	
-	if (objectid + 1 == le32_to_cpu (objectid_map[i])) {
-	    /* size of objectid map does not change */
-	    objectid_map[i] = cpu_to_le32 (objectid);
-	    return;
-	}
-	
-	if (objectid == le32_to_cpu (objectid_map[i + 1])) {
-	    /* size of objectid map is decreased */
-	    objectid_map [i + 1] = cpu_to_le32 (le32_to_cpu (objectid_map [i + 1]) + 1);
-
-	    if (i + 2 < cursize) {
-		if (objectid_map[i + 1] == objectid_map[i + 2]) {
-		    memmove (objectid_map + i + 1, objectid_map + i + 1 + 2, 
-			     (cursize - (i + 2 + 2 - 1)) * sizeof (__u32));
-		    set_sb_oid_cursize (fs->fs_ondisk_sb, cursize - 2);
-		}
-	    }
-	    return;
-	}
-	
-	if (objectid < le32_to_cpu (objectid_map[i])) {
-	    /* size of objectid map must be increased */
-	    if (cursize == get_sb_oid_maxsize (fs->fs_ondisk_sb)) {
-		/* here all objectids between objectid and objectid_map[i] get
-                   used */
-		objectid_map[i] = cpu_to_le32 (objectid);
-		return;
-	    } else {
-		memmove (objectid_map + i + 2, objectid_map + i, (cursize - i) * sizeof (__u32));
-		set_sb_oid_cursize (fs->fs_ondisk_sb, cursize + 2);
-	    }
-	    
-	    objectid_map[i] = cpu_to_le32 (objectid);
-	    objectid_map[i+1] = cpu_to_le32 (objectid + 1);
-	    return;
-	}
-	
-    }
-    
-    /* append to current objectid map, if we have space */
-    if (i < get_sb_oid_maxsize (fs->fs_ondisk_sb)) {
-	objectid_map[i] = cpu_to_le32 (objectid);
-	objectid_map[i + 1] = cpu_to_le32 (objectid + 1);
-	set_sb_oid_cursize (fs->fs_ondisk_sb, cursize + 2);
-    } else if (i == get_sb_oid_maxsize (fs->fs_ondisk_sb)) {
-	objectid_map[i - 1] = cpu_to_le32 (objectid + 1);
-    } else
-	die ("mark_objectid_as_used: objectid map corrupted");
-    
-    return;
-}
-
-
-int is_blocksize_correct (unsigned int blocksize)
-{
-    return ((((blocksize & -blocksize) == blocksize) 
-	&& (blocksize >= 512) && (blocksize <= 8192)));
-}
-
diff --git a/reiserfscore/prints.c b/reiserfscore/prints.c
deleted file mode 100644
index c2522e4..0000000
--- a/reiserfscore/prints.c
+++ /dev/null
@@ -1,1041 +0,0 @@
-/*
- * Copyright 1996-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#define _GNU_SOURCE
-
-#include "includes.h"
-#include <stdarg.h>
-#include <limits.h>
-#include <printf.h>
-
-#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
-#  include <uuid/uuid.h>
-#endif
-
-#define PA_KEY		(PA_LAST)
-#define PA_BUFFER_HEAD	(PA_LAST + 1)
-#define PA_ITEM_HEAD	(PA_LAST + 2)
-#define PA_DISK_CHILD	(PA_LAST + 3)
-
-
-static int _arginfo_b (const struct printf_info *info, size_t n, int *argtypes) {
-    if (n > 0)
-	argtypes[0] = PA_BUFFER_HEAD | PA_FLAG_PTR;
-    return 1;
-}
-
-static int _arginfo_K (const struct printf_info *info, size_t n, int *argtypes) {
-    if (n > 0)
-	argtypes[0] = PA_KEY | PA_FLAG_PTR;
-    return 1;
-}
-
-static int _arginfo_H (const struct printf_info *info, size_t n, int *argtypes) {
-    if (n > 0)
-	argtypes[0] = PA_ITEM_HEAD | PA_FLAG_PTR;
-    return 1;
-}
-
-static int _arginfo_y (const struct printf_info *info, size_t n, int *argtypes) {
-    if (n > 0)
-	argtypes[0] = PA_DISK_CHILD | PA_FLAG_PTR;
-    return 1;
-}
-
-static int _arginfo_M (const struct printf_info *info, size_t n, int *argtypes) {
-    if (n > 0)
-	argtypes[0] = PA_INT | PA_FLAG_SHORT | PA_FLAG_PTR;
-    return 1;
-}
-
-static int _arginfo_U (const struct printf_info *info, size_t n, int *argtypes) {
-    if (n > 0)
-	argtypes[0] = (PA_CHAR|PA_FLAG_PTR);
-    return 1;
-}
-
-#define FPRINTF \
-    if (len == -1) {\
-	return -1;\
-    }\
-    len = fprintf (stream, "%*s",\
-		   info->left ? -info->width : info->width, buffer);\
-    free (buffer);\
-    return len;\
-
-
-/* %b */
-static int print_block_head (FILE * stream,
-			     const struct printf_info *info,
-			     const void *const *args)
-{
-    const struct buffer_head * bh;
-    char * buffer;
-    int len;
-
-    bh = *((const struct buffer_head **)(args[0]));
-    len = asprintf (&buffer, "level=%d, nr_items=%d, free_space=%d rdkey",
-		    B_LEVEL (bh), B_NR_ITEMS (bh), B_FREE_SPACE (bh));
-    FPRINTF;
-}
-
-
-/* %K */
-static int print_short_key (FILE * stream,
-			    const struct printf_info *info,
-			    const void *const *args)
-{
-    const struct key * key;
-    char * buffer;
-    int len;
-
-    key = *((const struct key **)(args[0]));
-    len = asprintf (&buffer, "[%u %u]", get_key_dirid (key),
-		    get_key_objectid (key));
-    FPRINTF;
-}
-
-
-/* %k */
-static int print_key (FILE * stream,
-		      const struct printf_info *info,
-		      const void *const *args)
-{
-    const struct key * key;
-    char * buffer;
-    int len;
-
-    key = *((const struct key **)(args[0]));
-    len = asprintf (&buffer, "[%u %u 0x%Lx %s (%d)]",  
-		    get_key_dirid (key), get_key_objectid (key),
-		    (unsigned long long)get_offset (key), key_of_what (key), get_type (key));
-    FPRINTF;
-}
-
-
-/* %H */
-static int print_item_head (FILE * stream,
-			    const struct printf_info *info,
-			    const void *const *args)
-{
-    const struct item_head * ih;
-    char * buffer;
-    int len;
-
-    ih = *((const struct item_head **)(args[0]));
-    len = asprintf (&buffer, "%u %u 0x%Lx %s (%d), "
-		    "len %u, location %u entry count %u, fsck need %u, format %s",
-		    get_key_dirid (&ih->ih_key), get_key_objectid (&ih->ih_key),
-		    (unsigned long long)get_offset (&ih->ih_key), key_of_what (&ih->ih_key),
-		    get_type (&ih->ih_key), get_ih_item_len (ih), get_ih_location (ih),
-		    get_ih_entry_count (ih), get_ih_flags (ih),
-		    get_ih_key_format (ih) == KEY_FORMAT_2 ? "new" : 
-		    ((get_ih_key_format (ih) == KEY_FORMAT_1) ? "old" : "BAD"));
-    FPRINTF;
-}
-
-
-static int print_disk_child (FILE * stream,
-			     const struct printf_info *info,
-			     const void *const *args)
-{
-    const struct disk_child * dc;
-    char * buffer;
-    int len;
-
-    dc = *((const struct disk_child **)(args[0]));
-    len = asprintf (&buffer, "[dc_number=%u, dc_size=%u]", get_dc_child_blocknr (dc),
-		    get_dc_child_size (dc));
-    FPRINTF;
-}
-
-
-char ftypelet (mode_t mode)
-{
-    if (S_ISBLK (mode))
-	return 'b';
-    if (S_ISCHR (mode))
-	return 'c';
-    if (S_ISDIR (mode))
-	return 'd';
-    if (S_ISREG (mode))
-	return '-';
-    if (S_ISFIFO (mode))
-	return 'p';
-    if (S_ISLNK (mode))
-	return 'l';
-    if (S_ISSOCK (mode))
-	return 's';
-    return '?';
-}
-
-
-static int rwx (FILE * stream, mode_t mode)
-{
-    return fprintf (stream, "%c%c%c",
-		    (mode & S_IRUSR) ? 'r' : '-',
-		    (mode & S_IWUSR) ? 'w' : '-',
-		    (mode & S_IXUSR) ? 'x' : '-');
-}
-
-
-/* %M */
-static int print_sd_mode (FILE * stream,
-			  const struct printf_info *info,
-			  const void *const *args)
-{
-    int len = 0;
-    __u16 mode;
-
-    mode = *(mode_t *)args[0];
-    len = fprintf (stream, "%c", ftypelet (mode));
-    len += rwx (stream, (mode & 0700) << 0);
-    len += rwx (stream, (mode & 0070) << 3);
-    len += rwx (stream, (mode & 0007) << 6);
-    return len;
-}
-
-/* %U */
-static int print_sd_uuid (FILE * stream,
-			  const struct printf_info *info,
-			  const void *const *args)
-{
-#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
-    const unsigned char *uuid = *((const unsigned char **)(args[0]));
-    char buf[37];
-
-    buf[36] = '\0';
-    uuid_unparse(uuid, buf);
-    return fprintf(stream, "%s", buf);
-#else
-    return fprintf(stream, "<no libuuid installed>");
-#endif
-}
-
-void reiserfs_warning (FILE * fp, const char * fmt, ...) 
-{
-    static int registered = 0;
-    va_list args;
-
-    if (!registered) {
-	registered = 1;
-	
-	register_printf_function ('K', print_short_key, _arginfo_K);
-	register_printf_function ('k', print_key, _arginfo_K);
-	register_printf_function ('H', print_item_head, _arginfo_H);
-	register_printf_function ('b', print_block_head, _arginfo_b);
-	register_printf_function ('y', print_disk_child, _arginfo_y);
-	register_printf_function ('M', print_sd_mode, _arginfo_M);
-	register_printf_function ('U', print_sd_uuid, _arginfo_U);
-    }
-
-    va_start (args, fmt);
-    vfprintf (fp, fmt, args);
-    va_end (args);
-}
-
-
-static char * vi_type (struct virtual_item * vi)
-{
-    static char *types[]={"directory", "direct", "indirect", "stat data"};
-
-    if (vi->vi_type & VI_TYPE_STAT_DATA)
-	return types[3];
-    if (vi->vi_type & VI_TYPE_INDIRECT)
-	return types[2];
-    if (vi->vi_type & VI_TYPE_DIRECT)
-	return types[1];
-    if (vi->vi_type & VI_TYPE_DIRECTORY)
-	return types[0];
-
-    reiserfs_panic ("vi_type: 6000: unknown type (0x%x)", vi->vi_type);
-    return NULL;
-}
-
-
-void print_virtual_node (struct virtual_node * vn)
-{
-    int i, j;
-  
-    printf ("VIRTUAL NODE CONTAINS %d items, has size %d,%s,%s, ITEM_POS=%d POS_IN_ITEM=%d MODE=\'%c\'\n",
-	    vn->vn_nr_item, vn->vn_size,
-	    (vn->vn_vi[0].vi_type & VI_TYPE_LEFT_MERGEABLE )? "left mergeable" : "", 
-	    (vn->vn_vi[vn->vn_nr_item - 1].vi_type & VI_TYPE_RIGHT_MERGEABLE) ? "right mergeable" : "",
-	    vn->vn_affected_item_num, vn->vn_pos_in_item, vn->vn_mode);
-
-
-    for (i = 0; i < vn->vn_nr_item; i ++) {
-	printf ("%s %d %d", vi_type (&vn->vn_vi[i]), i, vn->vn_vi[i].vi_item_len);
-	if (vn->vn_vi[i].vi_entry_sizes)
-	{
-	    printf ("It is directory with %d entries: ", vn->vn_vi[i].vi_entry_count);
-	    for (j = 0; j < vn->vn_vi[i].vi_entry_count; j ++)
-		printf ("%d ", vn->vn_vi[i].vi_entry_sizes[j]);
-	}
-	printf ("\n");
-    }
-}
-
-
-void print_path (struct tree_balance * tb, struct path * path)
-{
-    int offset = path->path_length;
-    struct buffer_head * bh;
-
-    printf ("Offset    Bh     (b_blocknr, b_count) Position Nr_item\n");
-    while ( offset > ILLEGAL_PATH_ELEMENT_OFFSET ) {
-	bh = PATH_OFFSET_PBUFFER (path, offset);
-	printf ("%6d %10p (%9lu, %7d) %8d %7d\n", offset, 
-		bh, bh ? bh->b_blocknr : 0, bh ? bh->b_count : 0,
-		PATH_OFFSET_POSITION (path, offset), bh ? B_NR_ITEMS (bh) : -1);
-	
-	offset --;
-    }
-}
-
-
-
-void print_directory_item (FILE * fp, reiserfs_filsys_t * fs,
-			   struct buffer_head * bh, struct item_head * ih)
-{
-    int i;
-    int namelen;
-    struct reiserfs_de_head * deh;
-    char * name;
-/*    static char namebuf [80];*/
-
-    if (!I_IS_DIRECTORY_ITEM (ih))
-	return;
-
-    //printk ("\n%2%-25s%-30s%-15s%-15s%-15s\n", "    Name", "length", "Object key", "Hash", "Gen number", "Status");
-    reiserfs_warning (fp, "%3s: %-25s%s%-22s%-12s%s\n", "###", "Name", "length", "    Object key", "   Hash", "Gen number");
-    deh = B_I_DEH (bh, ih);
-    for (i = 0; i < get_ih_entry_count (ih); i ++, deh ++) {
-	if (dir_entry_bad_location (deh, ih, i == 0 ? 1 : 0)) {
-	    reiserfs_warning (fp, "%3d: wrong entry location %u, deh_offset %u\n",
-			      i, get_deh_location (deh), get_deh_offset (deh));
-	    continue;
-	}
-	if (i && dir_entry_bad_location (deh - 1, ih, ((i - 1) == 0) ? 1 : 0))
-	    /* previous entry has bad location so we can not calculate entry
-               length */
-	    namelen = 25;
-	else
-	    namelen = name_in_entry_length (ih, deh, i);
-
-	name = name_in_entry (deh, i);
-	reiserfs_warning (fp, "%3d: \"%-25.*s\"(%3d)%20K%12d%5d, loc %u, state %x %s\n", 
-			  i, namelen, name, namelen,
-			  (struct key *)&(deh->deh2_dir_id),
-			  GET_HASH_VALUE (get_deh_offset (deh)),
-			  GET_GENERATION_NUMBER (get_deh_offset (deh)),
-			  get_deh_location (deh), get_deh_state (deh),
-			  code2name (find_hash_in_use (name, namelen, get_deh_offset (deh),
-						       fs ? get_sb_hash_code (fs->fs_ondisk_sb) : UNSET_HASH)));
-	/*fs ? (is_properly_hashed (fs, name, namelen, deh_offset (deh)) ? "" : "(BROKEN)") : "??");*/
-    }
-}
-
-
-//
-// printing of indirect item
-//
-static void start_new_sequence (__u32 * start, int * len, __u32 new)
-{
-    *start = new;
-    *len = 1;
-}
-
-
-static int sequence_finished (__u32 start, int * len, __u32 new)
-{
-    if (le32_to_cpu (start) == INT_MAX)
-	return 1;
-
-    if (start == 0 && new == 0) {
-	(*len) ++;
-	return 0;
-    }
-    if (start != 0 && (le32_to_cpu (start) + *len) == le32_to_cpu (new)) {
-	(*len) ++;
-	return 0;
-    }
-    return 1;
-}
-
-static void print_sequence (FILE * fp, __u32 start, int len)
-{
-    if (start == INT_MAX)
-	return;
-
-    if (len == 1)
-	reiserfs_warning (fp, " %d", le32_to_cpu (start));
-    else
-	reiserfs_warning (fp, " %d(%d)", le32_to_cpu (start), len);
-}
-
-
-void print_indirect_item (FILE * fp, struct buffer_head * bh, int item_num)
-{
-    struct item_head * ih;
-    unsigned int j;
-    __u32 * unp, prev = INT_MAX;
-    int num;
-
-    ih = B_N_PITEM_HEAD (bh, item_num);
-    unp = (__u32 *)B_I_PITEM (bh, ih);
-
-    if (get_ih_item_len (ih) % UNFM_P_SIZE)
-	reiserfs_warning (fp, "print_indirect_item: invalid item len");  
-
-    reiserfs_warning (fp, "%d pointer%s\n[", I_UNFM_NUM (ih),
-                      I_UNFM_NUM (ih) != 1 ? "s" : "" );
-    for (j = 0; j < I_UNFM_NUM (ih); j ++) {
-	if (sequence_finished (prev, &num, d32_get(unp, j))) {
-	    print_sequence (fp, prev, num);
-	    start_new_sequence (&prev, &num, d32_get(unp, j));
-	}
-    }
-    print_sequence (fp, prev, num);
-    reiserfs_warning (fp, "]\n");
-}
-
-
-char timebuf[256];
-
-char * timestamp (time_t t)
-{
-    strftime (timebuf, 256, "%d/%Y %T", localtime (&t));
-    return timebuf;
-}
-
-static int print_stat_data (FILE * fp, struct buffer_head * bh, struct item_head * ih, int alltimes)
-{
-    int retval;
-    
-
-    /* we cannot figure out if it is new stat data or old by key_format
-       macro. Stat data's key looks identical in both formats */
-    if (get_ih_key_format (ih) == KEY_FORMAT_1) {
-        struct stat_data_v1 * sd_v1 = (struct stat_data_v1 *)B_I_PITEM (bh, ih);
-	reiserfs_warning (fp, "(OLD SD), mode %M, size %u, nlink %u, uid %u, FDB %u, mtime %s blocks %u",
-		sd_v1_mode(sd_v1), sd_v1_size(sd_v1), sd_v1_nlink(sd_v1),
-                sd_v1_uid(sd_v1), sd_v1_first_direct_byte(sd_v1), timestamp
-                (sd_v1_mtime(sd_v1)), sd_v1_blocks(sd_v1));
-	retval = (S_ISLNK (sd_v1_mode(sd_v1))) ? 1 : 0;
-        if (alltimes)
-            reiserfs_warning (fp, "%s %s\n", timestamp (sd_v1_ctime(sd_v1)),
-                timestamp (sd_v1_atime(sd_v1)));
-    } else {
-        struct stat_data * sd = (struct stat_data *)B_I_PITEM (bh, ih);
-	reiserfs_warning (fp, "(NEW SD), mode %M, size %Lu, nlink %u, mtime %s blocks %u, uid %u",
-		sd_v2_mode(sd), sd_v2_size(sd), sd_v2_nlink(sd),
-		timestamp (sd_v2_mtime(sd)), sd_v2_blocks(sd), sd_v2_uid(sd));
-	retval = (S_ISLNK (sd_v2_mode(sd))) ? 1 : 0;
-        if (alltimes)
-            reiserfs_warning (fp, "%s %s\n", timestamp (sd_v2_ctime(sd)),
-                timestamp (sd_v2_atime(sd)));
-    }
-
-    reiserfs_warning (fp, "\n");
-    return retval;
-}
-
-
-/* used by debugreiserfs/scan.c */
-void reiserfs_print_item (FILE * fp, struct buffer_head * bh,
-			  struct item_head * ih)
-{
-    reiserfs_warning (fp, "block %lu, item %d: %H\n",
-	bh->b_blocknr, (ih - B_N_PITEM_HEAD (bh, 0))/sizeof(struct item_head), ih);
-    if (is_stat_data_ih (ih)) {
-	print_stat_data (fp, bh, ih, 0/*all times*/);
-	return;
-    }
-    if (is_indirect_ih (ih)) {
-	print_indirect_item (fp, bh, ih - B_N_PITEM_HEAD (bh, 0));
-	return;
-    }
-    if (is_direct_ih (ih)) {
-	reiserfs_warning (fp, "direct item: block %lu, start %d, %d bytes\n",
-			  bh->b_blocknr, get_ih_location (ih), get_ih_item_len (ih));
-	return;
-    }
-
-    print_directory_item (fp, 0, bh, ih);    
-}
-
-
-/* this prints internal nodes (4 keys/items in line) (dc_number,
-   dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number,
-   dc_size)...*/
-static int print_internal (FILE * fp, struct buffer_head * bh, int first, int last)
-{
-    struct key * key;
-    struct disk_child * dc;
-    int i;
-    int from, to;
-
-    if (!is_internal_node (bh))
-	return 1;
-
-    if (first == -1) {
-	from = 0;
-	to = B_NR_ITEMS (bh);
-    } else {
-	from = first;
-	to = last < B_NR_ITEMS (bh) ? last : B_NR_ITEMS (bh);
-    }
-
-    reiserfs_warning (fp, "INTERNAL NODE (%ld) contains %b\n",  bh->b_blocknr, bh);
-
-    dc = B_N_CHILD (bh, from);
-    reiserfs_warning (fp, "PTR %d: %y ", from, dc);
-
-    for (i = from, key = B_N_PDELIM_KEY (bh, from), dc ++; i < to; i ++, key ++, dc ++) {
-	reiserfs_warning (fp, "KEY %d: %20k PTR %d: %20y ", i, key, i + 1, dc);
-	if (i && i % 4 == 0)
-	    reiserfs_warning (fp, "\n");
-    }
-    reiserfs_warning (fp, "\n");
-    return 0;
-}
-
-
-
-static int is_symlink = 0;
-static int print_leaf (FILE * fp, reiserfs_filsys_t * fs, struct buffer_head * bh,
-		       int print_mode, int first, int last)
-{
-    struct block_head * blkh;
-    struct item_head * ih;
-    int i;
-    int from, to;
-    int real_nr, nr;
-
-    if (!is_tree_node (bh, DISK_LEAF_NODE_LEVEL))
-	return 1;
-    
-    blkh = B_BLK_HEAD (bh);
-    ih = B_N_PITEM_HEAD (bh,0);
-    real_nr = leaf_count_ih(bh->b_data, bh->b_size);
-    nr = get_blkh_nr_items((struct block_head *)bh->b_data);
-
-    reiserfs_warning (fp,
-		      "\n===================================================================\n");
-    reiserfs_warning (fp, "LEAF NODE (%ld) contains %b (real items %d)\n",
-		      bh->b_blocknr, bh, real_nr);
-
-    if (!(print_mode & PRINT_TREE_DETAILS)) {
-	reiserfs_warning (fp, "FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n",
-			   &(ih->ih_key), &((ih + real_nr - 1)->ih_key));
-	return 0;
-    }
-
-    if (first < 0 || first > real_nr - 1) 
-	from = 0;
-    else 
-	from = first;
-
-    if (last < 0 || last > real_nr)
-	to = real_nr;
-    else
-	to = last;
-
-
-    reiserfs_warning (fp,
-		       "-------------------------------------------------------------------------------\n"
-		       "|###|type|ilen|f/sp| loc|fmt|fsck|                   key                      |\n"
-		       "|   |    |    |e/cn|    |   |need|                                            |\n");
-    for (i = from; i < to; i++) {
-	reiserfs_warning (fp,
-			  "-------------------------------------------------------------------------------\n"
-			  "|%3d|%30H|%s\n", i, ih + i, i >= nr ? " DELETED" : "");
-
-	if (I_IS_STAT_DATA_ITEM(ih+i)) {
-	    is_symlink = print_stat_data (fp, bh, ih + i, 0/*all times*/);
-	    continue;
-	}
-
-	if (I_IS_DIRECTORY_ITEM(ih+i)) {
-	    print_directory_item (fp, fs, bh, ih+i);
-	    continue;
-	}
-
-	if (I_IS_INDIRECT_ITEM(ih+i)) {
-	    print_indirect_item (fp, bh, i);
-	    continue;
-	}
-
-	if (I_IS_DIRECT_ITEM(ih+i)) {
-	    int j = 0;
-	    if (is_symlink || print_mode & PRINT_DIRECT_ITEMS) {
-		reiserfs_warning (fp, "\"");
-		while (j < get_ih_item_len (&ih[i])) {
-		    if (B_I_PITEM(bh,ih+i)[j] == 10)
-			reiserfs_warning (fp, "\\n");
-		    else
-			reiserfs_warning (fp, "%c", B_I_PITEM(bh,ih+i)[j]);
-		    j ++;
-		}
-		reiserfs_warning (fp, "\"\n");
-	    }
-	    continue;
-	}
-    }
-    reiserfs_warning (fp, "===================================================================\n");
-    return 0;
-}
-
-
-void print_journal_params (FILE * fp, struct journal_params * jp)
-{
-    reiserfs_warning (fp, "\tDevice [0x%x]\n", get_jp_journal_dev (jp));
-    reiserfs_warning (fp, "\tMagic [0x%x]\n", get_jp_journal_magic (jp));
-
-    reiserfs_warning (fp, "\tSize %u blocks (including 1 for journal header) (first block %u)\n",
-		      get_jp_journal_size (jp) + 1,
-		      get_jp_journal_1st_block (jp));
-    reiserfs_warning (fp, "\tMax transaction length %u blocks\n", get_jp_journal_max_trans_len (jp));
-    reiserfs_warning (fp, "\tMax batch size %u blocks\n", get_jp_journal_max_batch (jp));
-    reiserfs_warning (fp, "\tMax commit age %u\n", get_jp_journal_max_commit_age (jp));
-    /*reiserfs_warning (fp, "\tMax transaction age %u\n", get_jp_journal_max_trans_age (jp));*/
-}
-
-/* return 1 if this is not super block */
-int print_super_block (FILE * fp, reiserfs_filsys_t * fs, char * file_name,
-			      struct buffer_head * bh, int short_print)
-{
-    struct reiserfs_super_block * sb = (struct reiserfs_super_block *)(bh->b_data);
-    dev_t rdev;
-    int format = 0;
-    __u16 state;
-
-    if (!does_look_like_super_block (sb))
-	return 1;
-
-    rdev = misc_device_rdev(file_name);
-
-    reiserfs_warning (fp, "Reiserfs super block in block %lu on 0x%x of ",
-		      bh->b_blocknr, rdev);
-    switch (get_reiserfs_format (sb)) {
-    case REISERFS_FORMAT_3_5:
-	reiserfs_warning (fp, "format 3.5 with ");
-        format = 1;
-	break;
-    case REISERFS_FORMAT_3_6:
-	reiserfs_warning (fp, "format 3.6 with ");
-        format = 2;
-	break;
-    default:
-	reiserfs_warning (fp, "unknown format with ");
-	break;
-    }
-    if (is_reiserfs_jr_magic_string (sb))
-	reiserfs_warning (fp, "non-");
-    reiserfs_warning (fp, "standard journal\n");
-    if (short_print) {
-	reiserfs_warning (fp, "Blocks (total/free): %u/%u by %d bytes\n",
-		get_sb_block_count (sb), get_sb_free_blocks (sb), get_sb_block_size (sb));
-    } else {
-	reiserfs_warning (fp, "Count of blocks on the device: %u\n", get_sb_block_count (sb));
-	reiserfs_warning (fp, "Number of bitmaps: %u\n", get_sb_bmap_nr (sb));
-	reiserfs_warning (fp, "Blocksize: %d\n", get_sb_block_size (sb));
-	reiserfs_warning (fp, "Free blocks (count of blocks - used [journal, "
-		      "bitmaps, data, reserved] blocks): %u\n", get_sb_free_blocks (sb));
-	reiserfs_warning (fp, "Root block: %u\n", get_sb_root_block (sb));
-    }
-    reiserfs_warning (fp, "Filesystem is %sclean\n",
-		      (get_sb_umount_state (sb) == FS_CLEANLY_UMOUNTED) ? "" : "NOT ");
-
-    if (short_print)
-    	return 0;
-    reiserfs_warning (fp, "Tree height: %d\n", get_sb_tree_height (sb));
-    reiserfs_warning (fp, "Hash function used to sort names: %s\n",
-		      code2name (get_sb_hash_code (sb)));
-    reiserfs_warning (fp, "Objectid map size %d, max %d\n", get_sb_oid_cursize (sb),
-		      get_sb_oid_maxsize (sb));
-    reiserfs_warning (fp, "Journal parameters:\n");
-    print_journal_params (fp, sb_jp (sb));
-    reiserfs_warning (fp, "Blocks reserved by journal: %u\n",
-		      get_sb_reserved_for_journal (sb));
-    state = get_sb_fs_state (sb);
-    reiserfs_warning (fp, "Fs state field: 0x%x:\n", state);
-    if ((state & FS_FATAL) == FS_FATAL)
-	reiserfs_warning (fp, "\tFATAL corruptions exist.\n");
-    if ((state & FS_ERROR) == FS_ERROR)
-	reiserfs_warning (fp, "\t some corruptions exist.\n");
-    if ((state & IO_ERROR) == IO_ERROR)
-	reiserfs_warning (fp, "\tI/O corruptions exist.\n");
-
-    reiserfs_warning (fp, "sb_version: %u\n", get_sb_version (sb));
-    if (format == 2) {
-        reiserfs_warning (fp, "inode generation number: %u\n", get_sb_v2_inode_generation (sb));
-        reiserfs_warning (fp, "UUID: %U\n", sb->s_uuid);
-        reiserfs_warning (fp, "LABEL: %.16s\n", sb->s_label);
-        reiserfs_warning (fp, "Set flags in SB:\n");
-	if ((get_sb_v2_flag (sb, reiserfs_attrs_cleared)))
-	    reiserfs_warning (fp, "\tATTRIBUTES CLEAN\n");
-    }
-
-    return 0;
-}
-
-
-void print_filesystem_state (FILE * fp, reiserfs_filsys_t * fs)
-{
-    reiserfs_warning (fp, "\nFilesystem state: ");
-    if (reiserfs_is_fs_consistent (fs))
-	reiserfs_warning (fp, "consistent\n\n");
-    else
-	reiserfs_warning (fp, "consistency is not checked after last mounting\n\n");
-}
-
-
-
-static int print_desc_block (FILE * fp, struct buffer_head * bh)
-{
-    if (memcmp(get_jd_magic (bh), JOURNAL_DESC_MAGIC, 8))
-	return 1;
-
-    reiserfs_warning (fp, "Desc block %lu (j_trans_id %ld, j_mount_id %ld, j_len %ld)\n",
-		      bh->b_blocknr, get_desc_trans_id (bh),
-		      get_desc_mount_id (bh), get_desc_trans_len (bh));
-
-    return 0;
-}
-
-
-void print_block (FILE * fp, reiserfs_filsys_t * fs, 
-		  struct buffer_head * bh, ...)//int print_mode, int first, int last)
-{
-    va_list args;
-    int mode, first, last;
-    char * file_name;
-
-    va_start (args, bh);
-
-    if ( ! bh ) {
-	reiserfs_warning (stderr, "print_block: buffer is NULL\n");
-	return;
-    }
-
-    mode = va_arg (args, int);
-    first = va_arg (args, int);
-    last = va_arg (args, int);
-    file_name = (fs) ? fs->fs_file_name : NULL ;
-    if (print_desc_block (fp, bh))
-        if (print_super_block (fp, fs, file_name, bh, 0))
-	    if (print_leaf (fp, fs, bh, mode, first, last))
-		if (print_internal (fp, bh, first, last))
-		    reiserfs_warning (fp, "Block %ld contains unformatted data\n", bh->b_blocknr);
-}
-
-
-void print_tb (int mode, int item_pos, int pos_in_item, struct tree_balance * tb, char * mes)
-{
-  unsigned int h = 0;
-  struct buffer_head * tbSh, * tbFh;
-
-
-  if (!tb)
-    return;
-
-  printf ("\n********************** PRINT_TB for %s *******************\n", mes);
-  printf ("MODE=%c, ITEM_POS=%d POS_IN_ITEM=%d\n", mode, item_pos, pos_in_item);
-  printf ("*********************************************************************\n");
-
-  printf ("* h *    S    *    L    *    R    *   F   *   FL  *   FR  *  CFL  *  CFR  *\n");
-/*
-01234567890123456789012345678901234567890123456789012345678901234567890123456789
-       1        2         3         4         5         6         7         8
-  printk ("*********************************************************************\n");
-*/
-  
-  
-  for (h = 0; h < sizeof(tb->insert_size) / sizeof (tb->insert_size[0]); h ++) {
-    if (PATH_H_PATH_OFFSET (tb->tb_path, h) <= tb->tb_path->path_length && 
-	PATH_H_PATH_OFFSET (tb->tb_path, h) > ILLEGAL_PATH_ELEMENT_OFFSET) {
-      tbSh = PATH_H_PBUFFER (tb->tb_path, h);
-      tbFh = PATH_H_PPARENT (tb->tb_path, h);
-    } else {
-      /*      printk ("print_tb: h=%d, PATH_H_PATH_OFFSET=%d, path_length=%d\n", 
-	      h, PATH_H_PATH_OFFSET (tb->tb_path, h), tb->tb_path->path_length);*/
-      tbSh = 0;
-      tbFh = 0;
-    }
-    printf ("* %u * %3lu(%2lu) * %3lu(%2lu) * %3lu(%2lu) * %5ld * %5ld * %5ld * %5ld * %5ld *\n",
-	    h, 
-	    tbSh ? tbSh->b_blocknr : ~0ul,
-	    tbSh ? tbSh->b_count : ~0ul,
-	    tb->L[h] ? tb->L[h]->b_blocknr : ~0ul,
-	    tb->L[h] ? tb->L[h]->b_count : ~0ul,
-	    tb->R[h] ? tb->R[h]->b_blocknr : ~0ul,
-	    tb->R[h] ? tb->R[h]->b_count : ~0ul,
-	    tbFh ? tbFh->b_blocknr : ~0ul,
-	    tb->FL[h] ? tb->FL[h]->b_blocknr : ~0ul,
-	    tb->FR[h] ? tb->FR[h]->b_blocknr : ~0ul,
-	    tb->CFL[h] ? tb->CFL[h]->b_blocknr : ~0ul,
-	    tb->CFR[h] ? tb->CFR[h]->b_blocknr : ~0ul);
-  }
-
-  printf ("*********************************************************************\n");
-
-
-  /* print balance parameters for leaf level */
-  h = 0;
-  printf ("* h * size * ln * lb * rn * rb * blkn * s0 * s1 * s1b * s2 * s2b * curb * lk * rk *\n");
-  printf ("* %d * %4d * %2d * %2d * %2d * %2d * %4d * %2d * %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n",
-	  h, tb->insert_size[h], tb->lnum[h], tb->lbytes, tb->rnum[h],tb->rbytes, tb->blknum[h], 
-	  tb->s0num, tb->s1num,tb->s1bytes,  tb->s2num, tb->s2bytes, tb->cur_blknum, tb->lkey[h], tb->rkey[h]);
-
-
-/* this prints balance parameters for non-leaf levels */
-  do {
-    h++;
-    printf ("* %d * %4d * %2d *    * %2d *    * %2d *\n",
-    h, tb->insert_size[h], tb->lnum[h], tb->rnum[h], tb->blknum[h]);
-  } while (tb->insert_size[h]);
-
-  printf ("*********************************************************************\n");
-
-
-  /* print FEB list (list of buffers in form (bh (b_blocknr, b_count), that will be used for new nodes) */
-  for (h = 0; h < sizeof (tb->FEB) / sizeof (tb->FEB[0]); h++)
-    printf("%s%p (%lu %d)", h == 0 ? "FEB list: " : ", ", tb->FEB[h], tb->FEB[h] ? tb->FEB[h]->b_blocknr : 0,
-	    tb->FEB[h] ? tb->FEB[h]->b_count : 0);
-  printf ("\n");
-
-  printf ("********************** END OF PRINT_TB *******************\n\n");
-}
-
-
-static void print_bmap_block (FILE * fp, int i, unsigned long block, char * map, int blocks, int silent, int blocksize)
-{
-    int j, k;
-    int bits = blocksize * 8;
-    int zeros = 0, ones = 0;
-  
-
-    reiserfs_warning (fp, "#%d: block %lu: ", i, block);
-
-    blocks = blocksize * 8;
-
-    if (misc_test_bit (0, map)) {
-	/* first block addressed by this bitmap block is used */
-	ones ++;
-	if (!silent)
-	    reiserfs_warning (fp, "Busy (%d-", i * bits);
-	for (j = 1; j < blocks; j ++) {
-	    while (misc_test_bit (j, map)) {
-		ones ++;
-		if (j == blocks - 1) {
-		    if (!silent)
-			reiserfs_warning (fp, "%d)\n", j + i * bits);
-		    goto end;
-		}
-		j++;
-	    }
-	    if (!silent)
-		reiserfs_warning (fp, "%d) Free(%d-", j - 1 + i * bits, j + i * bits);
-
-	    while (!misc_test_bit (j, map)) {
-		zeros ++;
-		if (j == blocks - 1) {
-		    if (!silent)
-			reiserfs_warning (fp, "%d)\n", j + i * bits);
-		    goto end;
-		}
-		j++;
-	    }
-	    if (!silent)
-		reiserfs_warning (fp, "%d) Busy(%d-", j - 1 + i * bits, j + i * bits);
-
-	    j --;
-	end:
-	    /* to make gcc 3.2 do not sware here */;
-	}
-    } else {
-	/* first block addressed by this bitmap is free */
-	zeros ++;
-	if (!silent)
-	    reiserfs_warning (fp, "Free (%d-", i * bits);
-	for (j = 1; j < blocks; j ++) {
-	    k = 0;
-	    while (!misc_test_bit (j, map)) {
-		k ++;
-		if (j == blocks - 1) {
-		    if (!silent)
-			reiserfs_warning (fp, "%d)\n", j + i * bits);
-		    zeros += k;
-		    goto end2;
-		}
-		j++;
-	    }
-	    zeros += k;
-	    if (!silent)
-		reiserfs_warning (fp, "%d) Busy(%d-", j - 1 + i * bits, j + i * bits);
-	    
-	    k = 0;
-	    while (misc_test_bit (j, map)) {
-		ones ++;
-		if (j == blocks - 1) {
-		    if (!silent)
-			reiserfs_warning (fp, "%d)\n", j + i * bits);
-		    ones += k;
-		    goto end2;
-		}
-		j++;
-	    }
-	    ones += k;
-	    if (!silent)
-		reiserfs_warning (fp, "%d) Free(%d-", j - 1 + i * bits, j + i * bits);
-	
-	    j --;
-	end2:
-	    /* to make gcc 3.2 do not sware here */;
-	}
-    }
-
-    reiserfs_warning (fp, "used %d, free %d\n", ones, zeros);
-}
-
-
-/* read bitmap of disk and print details */
-void print_bmap (FILE * fp, reiserfs_filsys_t * fs, int silent)
-{
-    struct reiserfs_super_block * sb;
-    int bmap_nr;
-    int i;
-    int bits_per_block;
-    int blocks;
-    unsigned long block;
-    struct buffer_head * bh;
-
-
-    sb = fs->fs_ondisk_sb;
-    bmap_nr = get_sb_bmap_nr (sb);
-    bits_per_block = fs->fs_blocksize * 8;
-    blocks = bits_per_block;
-
-    reiserfs_warning (fp, "Bitmap blocks are:\n");
-    block = fs->fs_super_bh->b_blocknr + 1;
-    for (i = 0; i < bmap_nr; i ++) {
-	bh = bread (fs->fs_dev, block, fs->fs_blocksize);
-	if (!bh) {
-	    reiserfs_warning (stderr, "print_bmap: bread failed for %d: %lu\n", i, block);
-	    continue;
-	}
-	if (i == bmap_nr - 1)
-	    if (get_sb_block_count (sb) % bits_per_block)
-		blocks = get_sb_block_count (sb) % bits_per_block;
-	print_bmap_block (fp, i, block, bh->b_data, blocks, silent, fs->fs_blocksize);
-	brelse (bh);
-
-	if (spread_bitmaps (fs))
-	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);
-	else
-	    block ++;
-	
-    }
-}
-
-
-
-void print_objectid_map (FILE * fp, reiserfs_filsys_t * fs)
-{
-    int i;
-    struct reiserfs_super_block * sb;
-    __u32 * omap;
-
-
-    sb = fs->fs_ondisk_sb;
-    if (fs->fs_format == REISERFS_FORMAT_3_6)
-	omap = (__u32 *)(sb + 1);
-    else if (fs->fs_format == REISERFS_FORMAT_3_5)
-	omap = (__u32 *)((struct reiserfs_super_block_v1 *)sb + 1);
-    else {
-	reiserfs_warning (fp, "print_objectid_map: proper signature is not found\n");
-	return;
-    }
-	
-    reiserfs_warning (fp, "Map of objectids (super block size %d)\n",
-		      (char *)omap - (char *)sb);
-      
-    for (i = 0; i < get_sb_oid_cursize (sb); i ++) {
-	if (i % 2 == 0) {
-	    reiserfs_warning(fp, "busy(%u-%u) ", le32_to_cpu (omap[i]),
-			     le32_to_cpu (omap[i+1]) - 1); 
-	} else {
-	    reiserfs_warning(fp, "free(%u-%u) ", le32_to_cpu (omap[i]),
-			    ((i+1) == get_sb_oid_cursize (sb)) ? 
-			    ~(__u32)0 : (le32_to_cpu (omap[i+1]) - 1));
-	}
-    }
-
-    reiserfs_warning (fp, "\nObject id array has size %d (max %d):", 
-		      get_sb_oid_cursize (sb), get_sb_oid_maxsize (sb));
-  
-    for (i = 0; i < get_sb_oid_cursize (sb); i ++)
-	reiserfs_warning (fp, "%s%u ", i % 2 ? "" : "*", le32_to_cpu (omap[i])); 
-    reiserfs_warning (fp, "\n");
-
-}
-
-
-void print_journal_header (reiserfs_filsys_t * fs)
-{
-    struct reiserfs_journal_header * j_head;
-
-
-    j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
-    reiserfs_warning (stdout, "Journal header (block #%lu of %s):\n"
-		      "\tj_last_flush_trans_id %ld\n"
-		      "\tj_first_unflushed_offset %ld\n"
-		      "\tj_mount_id %ld\n", 
-		      fs->fs_jh_bh->b_blocknr, fs->fs_j_file_name,
-		      get_jh_last_flushed (j_head),
-		      get_jh_replay_start_offset (j_head),
-		      get_jh_mount_id (j_head));
-    print_journal_params (stdout, &j_head->jh_journal);
-}
-
-
-static void print_trans_element (reiserfs_filsys_t * fs, reiserfs_trans_t * trans,
-				 unsigned int index, unsigned long in_journal, 
-				 unsigned long in_place)
-{
-    if (index % 8 == 0)
-	reiserfs_warning (stdout, "#%d\t", index);
-
-    reiserfs_warning (stdout, "%lu->%lu%s ",  in_journal, in_place,
-		      block_of_bitmap (fs, in_place) ? "B" : "");
-    if ((index + 1) % 8 == 0 || index == trans->trans_len - 1)
-	reiserfs_warning (stdout, "\n");
-}
-
-
-void print_one_transaction (reiserfs_filsys_t * fs, reiserfs_trans_t * trans)
-{
-    reiserfs_warning (stdout, "Mountid %u, transid %u, desc %lu, length %u, commit %lu\n",
-		      trans->mount_id, trans->trans_id,
-		      trans->desc_blocknr,
-		      trans->trans_len, trans->commit_blocknr);
-    for_each_block (fs, trans, print_trans_element);
-}
-
-
-/* print all valid transactions and found dec blocks */
-void print_journal (reiserfs_filsys_t * fs)
-{
-    if (!reiserfs_journal_opened (fs)) {
-	reiserfs_warning (stderr, "print_journal: journal is not opened\n");
-	return;
-    }
-    print_journal_header (fs);
-
-    for_each_transaction (fs, print_one_transaction);
-}
-
diff --git a/reiserfscore/reiserfslib.c b/reiserfscore/reiserfslib.c
deleted file mode 100644
index d904b5b..0000000
--- a/reiserfscore/reiserfslib.c
+++ /dev/null
@@ -1,1418 +0,0 @@
-/*
- *  Copyright 2000-2004 by Hans Reiser, licensing governed by 
- *  reiserfsprogs/README
- */
-
-#define _GNU_SOURCE
-
-#include "includes.h"
-#include <linux/kdev_t.h>
-
-struct key root_dir_key = {0, 0, {{0, 0},}};
-struct key parent_root_dir_key = {0, 0, {{0, 0},}};
-struct key lost_found_dir_key = {0, 0, {{0, 0}, }};
-struct key badblock_key = {BADBLOCK_DIRID, BADBLOCK_OBJID, {{0, 0},}};
-
-__u16 root_dir_format = 0;
-__u16 lost_found_dir_format = 0;
-
-static void make_const_keys (void)
-{
-    set_key_dirid (&root_dir_key, REISERFS_ROOT_PARENT_OBJECTID);
-    set_key_objectid (&root_dir_key, REISERFS_ROOT_OBJECTID);
-
-    set_key_dirid (&parent_root_dir_key, 0);
-    set_key_objectid (&parent_root_dir_key, REISERFS_ROOT_PARENT_OBJECTID);
-}
-
-
-
-/* reiserfs needs at least: enough blocks for journal, 64 k at the beginning,
-   one block for super block, bitmap block and root block. Note that first
-   bitmap block must point to all of them */
-int is_block_count_correct (unsigned long journal_offset, unsigned int block_size,
-    unsigned long block_count, unsigned long journal_size)
-{
-    unsigned long blocks;
-
-    /* RESERVED, MD RAID SBs, super block, bitmap, root, journal size with journal header */
-    blocks = journal_offset + journal_size;
-
-    /* we have a limit: skipped area, super block, journal and root block
-    all have to be addressed by one first bitmap */
-    if (blocks > block_size * 8)
-    	return 0;
-    	
-    if (blocks > block_count)
-    	return 0;
-    	
-    return 1;
-}
-
-/* read super block. fixme: only 4k blocks, pre-journaled format
-   is refused. Journal and bitmap are to be opened separately.
-   skip_check is set to 1 if checks of openned SB should be omitted.*/
-reiserfs_filsys_t * reiserfs_open (char * filename, int flags, 
-				   int *error, void * vp, int check)
-{
-    reiserfs_filsys_t * fs;
-    struct buffer_head * bh;
-    struct reiserfs_super_block * sb;
-    int fd, i;
-
-    /* convert root dir key and parent root dir key to little endian format */
-    make_const_keys ();
-
-    if (error) 
-	*error = 0;
-
-    fd = open (filename, flags 
-#if defined(O_LARGEFILE)
-	       | O_LARGEFILE
-#endif
-	       );
-    if (fd == -1) {
-	if (error)
-	    *error = errno;
-	return 0;
-    }
-
-    fs = getmem (sizeof (*fs));
-    fs->fs_dev = fd;
-    fs->fs_vp = vp;
-    asprintf (&fs->fs_file_name, "%s", filename);
-    
-    /* reiserfs super block is either in 16-th or in 2-nd 4k block of the
-       device */
-    for (i = 2; i < 17; i += 14) {
-	bh = bread (fd, i, 4096);
-	if (!bh) {
-	    reiserfs_warning (stderr, "reiserfs_open: bread failed reading block %d\n", i);
-	} else {
-	    sb = (struct reiserfs_super_block *)bh->b_data;
-	    
-	    if (is_any_reiserfs_magic_string(sb))
-		goto found;
-
-	    /* reiserfs signature is not found at the i-th 4k block */
-	    brelse (bh);
-	}
-    }
-
-    reiserfs_warning(stderr, 
-	"\nreiserfs_open: the reiserfs superblock cannot be found on %s.\n", filename);
-    
-    freemem (fs);
-    close (fd);
-    fs = NULL;
-    return fs;
-
- found:
-
-    if (!is_blocksize_correct(get_sb_block_size(sb))) {
-	reiserfs_warning(stderr, "reiserfs_open: a superblock with wrong parameters "
-			 "was found in the block (%d).\n", i);
-	freemem (fs);
-	close (fd);
-	brelse(bh);
-	return NULL;
-    }
-
-    if (check) {
-	/* A few checks of found super block. */
-	struct buffer_head *tmp_bh;
-	
-	tmp_bh = bread (fd, get_sb_block_count(sb) - 1, get_sb_block_size(sb));
-	
-	if (!tmp_bh) {
-	    reiserfs_warning (stderr, "\n%s: Your partition is not big enough to contain the \n"
-		    "filesystem of (%lu) blocks as was specified in the found super block.\n", 
-		    __FUNCTION__,  get_sb_block_count(sb) - 1);
-	    
-	    freemem (fs);
-	    close (fd);
-	    brelse(bh);
-	    return NULL;
-	}
-	
-	brelse(tmp_bh);
-    }
-   
-    fs->fs_blocksize = get_sb_block_size (sb);
-    
-    /* check block size on the filesystem */
-    if (fs->fs_blocksize != 4096) {
-	i = bh->b_blocknr * 4096 / fs->fs_blocksize;
-	brelse (bh);
-	bh = bread (fd, i, fs->fs_blocksize);
-	if (!bh) {
-	    reiserfs_warning (stderr, "reiserfs_open: bread failed reading block %d, size %d\n",
-			      i, fs->fs_blocksize);
-	    freemem (fs);
-	    return 0;
-	}
-	sb = (struct reiserfs_super_block *)bh->b_data;
-    }
-
-    fs->fs_hash_function = code2func (get_sb_hash_code (sb));
-    fs->fs_super_bh = bh;
-    fs->fs_ondisk_sb = sb;
-    fs->fs_flags = flags; /* O_RDONLY or O_RDWR */
-
-    fs->fs_format = get_reiserfs_format (sb);
-    
-    /*reiserfs_read_bitmap_blocks(fs);*/
-    if (flags & O_RDWR)
-	fs->fs_dirt  = 1;
-    else
-	fs->fs_dirt = 0;
-
-    return fs;
-}
-
-
-/* creates buffer for super block and fills it up with fields which are
-   constant for given size and version of a filesystem */
-reiserfs_filsys_t * reiserfs_create (char * filename,
-				     int version,
-				     unsigned long block_count, 
-				     int block_size, 
-				     int default_journal, 
-				     int new_format)
-{
-    reiserfs_filsys_t * fs;
-
-
-    /* convert root dir key and parent root dir key to little endian format */
-    make_const_keys ();
-
-
-    if (count_blocks (filename, block_size) < block_count) {
-	reiserfs_warning (stderr, "reiserfs_create: no enough blocks on device\n");
-	return 0;
-    }
-
-    if (!is_block_count_correct (REISERFS_DISK_OFFSET_IN_BYTES / block_size, 
-	block_size, block_count, 0)) 
-    {
-	reiserfs_warning (stderr, "reiserfs_create: can not create that small "
-	    "(%d blocks) filesystem\n", block_count);
-	return 0;
-    }
-
-    fs = getmem (sizeof (*fs));
-    if (!fs) {
-	reiserfs_warning (stderr, "reiserfs_create: getmem failed\n");
-	return 0;
-    }
-
-    fs->fs_dev = open (filename, O_RDWR 
-#if defined(O_LARGEFILE)
-		       | O_LARGEFILE
-#endif
-		       );
-    if (fs->fs_dev == -1) {
-	reiserfs_warning (stderr, "reiserfs_create: could not open %s: %s\n",
-			  filename, strerror(errno));
-	freemem (fs);
-	return 0;
-    }
-
-    fs->fs_blocksize = block_size;
-    asprintf (&fs->fs_file_name, "%s", filename);
-    fs->fs_format = version;
-
-    if (new_format)
-        fs->fs_super_bh = getblk (fs->fs_dev, 
-	    REISERFS_DISK_OFFSET_IN_BYTES / block_size, block_size);
-    else 
-        fs->fs_super_bh = getblk (fs->fs_dev, 
-	    REISERFS_OLD_DISK_OFFSET_IN_BYTES / block_size, block_size);
-    
-    if (!fs->fs_super_bh) {
-	reiserfs_warning (stderr, "reiserfs_create: getblk failed\n");
-	return 0;
-    }
-
-    mark_buffer_uptodate (fs->fs_super_bh, 1);
-    
-    fs->fs_ondisk_sb = (struct reiserfs_super_block *)fs->fs_super_bh->b_data;
-    memset (fs->fs_ondisk_sb, 0, block_size);
-    
-    /* fill super block fields which are constant for given version and block count */
-    set_sb_block_count (fs->fs_ondisk_sb, block_count);
-    /* sb_free_blocks */
-    /* sb_root_block */
-    /* sb_journal_1st_block */
-    /* sb_journal_dev */
-    /* sb_orig_journal_size */
-    /* sb_joural_magic */
-    /* sb_journal magic_F */
-    /* sb_mount_id */
-    /* sb_not_used0 */
-    /* sb_generation_number */    
-    set_sb_block_size (fs->fs_ondisk_sb, block_size);
-    switch (version) {
-    case REISERFS_FORMAT_3_5:
-	set_sb_oid_maxsize (fs->fs_ondisk_sb, 
-	    (block_size - SB_SIZE_V1) / sizeof(__u32) / 2 * 2);
-	/* sb_oid_cursize */
-	/* sb_state */
-	memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING,
-		strlen (REISERFS_3_5_SUPER_MAGIC_STRING));
-	break;
-
-    case REISERFS_FORMAT_3_6:
-	set_sb_oid_maxsize (fs->fs_ondisk_sb, 
-	    (block_size - SB_SIZE) / sizeof(__u32) / 2 * 2);
-	/* sb_oid_cursize */
-	/* sb_state */
-        memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING,
-                strlen (REISERFS_3_6_SUPER_MAGIC_STRING));
-	break;
-    }
-    if (!default_journal)
-        memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING,
-                strlen (REISERFS_JR_SUPER_MAGIC_STRING));
-
-    /* sb_fsck_state */
-    /* sb_hash_function_code */
-    /* sb_tree_height */
-    set_sb_bmap_nr (fs->fs_ondisk_sb,
-		    (block_count + (block_size * 8 - 1)) / (block_size * 8));
-    set_sb_version (fs->fs_ondisk_sb, version);
-    /* sb_not_used1 */
-
-    mark_buffer_dirty (fs->fs_super_bh);
-    fs->fs_dirt = 1;
-
-    return fs;
-}
-
-
-int no_reiserfs_found (reiserfs_filsys_t * fs)
-{
-    return (fs == NULL || fs->fs_blocksize == 0) ? 1 : 0;
-}
-
-
-int new_format (reiserfs_filsys_t * fs)
-{
-    return fs->fs_super_bh->b_blocknr != 2;
-}
-
-
-int spread_bitmaps (reiserfs_filsys_t * fs)
-{
-    return fs->fs_super_bh->b_blocknr != 2;
-}
-
-
-/* 0 means: do not guarantee that fs is consistent */
-int reiserfs_is_fs_consistent (reiserfs_filsys_t * fs)
-{
-    if (get_sb_umount_state (fs->fs_ondisk_sb) == FS_CLEANLY_UMOUNTED &&
-	get_sb_fs_state (fs->fs_ondisk_sb) == FS_CONSISTENT)
-	return 1;
-    return 0;
-}
-
-/* flush bitmap, brelse super block, flush all dirty buffers, close and open
-   again the device, read super block */
-static void reiserfs_only_reopen (reiserfs_filsys_t * fs, int flag)
-{
-    unsigned long super_block;
-
-
-    /*  reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);*/
-    super_block = fs->fs_super_bh->b_blocknr;                
-    brelse (fs->fs_super_bh);
-    flush_buffers (fs->fs_dev);
-    
-    invalidate_buffers (fs->fs_dev);
-    if (close (fs->fs_dev))
-	die ("reiserfs_reopen: closed failed: %s", strerror(errno));
-    
-    fs->fs_dev = open (fs->fs_file_name, flag 
-#if defined(O_LARGEFILE)
-		       | O_LARGEFILE
-#endif
-		       );
-    if (fs->fs_dev == -1)
-	die ("reiserfs_reopen: could not reopen device: %s", strerror(errno));
-
-    fs->fs_super_bh = bread (fs->fs_dev, super_block, fs->fs_blocksize);
-    if (!fs->fs_super_bh)
-	die ("reiserfs_reopen: reading super block failed");
-    fs->fs_ondisk_sb = (struct reiserfs_super_block *)fs->fs_super_bh->b_data;
-    fs->fs_flags = flag; /* O_RDONLY or O_RDWR */
-    
-    if (flag & O_RDWR)
-	fs->fs_dirt  = 1;
-    else
-	fs->fs_dirt = 0;
-}
-
-void reiserfs_reopen (reiserfs_filsys_t * fs, int flag)
-{
-    reiserfs_only_reopen (fs, flag);
-    reiserfs_reopen_journal (fs, flag);
-}
-
-int is_opened_rw (reiserfs_filsys_t * fs)
-{
-    if ((fs->fs_flags) & O_RDWR)
-	return 1;
-    return 0;
-}
-
-
-/* flush all changes made on a filesystem */
-void reiserfs_flush (reiserfs_filsys_t * fs)
-{
-    if (fs->fs_dirt) {
-	reiserfs_flush_journal (fs);
-	flush_buffers (fs->fs_dev);
-    }
-    fs->fs_dirt = 0;
-}
-
-
-/* free all memory involved into manipulating with filesystem */
-void reiserfs_free (reiserfs_filsys_t * fs)
-{
-    reiserfs_free_journal (fs);
-    reiserfs_free_ondisk_bitmap (fs);
-
-    /* release super block and memory used by filesystem handler */
-    brelse (fs->fs_super_bh);
-    fs->fs_super_bh = 0;
-
-    free_buffers ();
-
-    free (fs->fs_file_name);
-    fs->fs_file_name = 0;
-    freemem (fs);
-}
-
-
-/* this closes everything: journal. bitmap and the fs itself */
-void reiserfs_close (reiserfs_filsys_t * fs)
-{
-    reiserfs_close_journal (fs);
-    reiserfs_close_ondisk_bitmap (fs);
-
-    reiserfs_flush (fs);
-    reiserfs_free (fs);
-    fsync(fs->fs_dev);
-}
-
-
-int reiserfs_new_blocknrs (reiserfs_filsys_t * fs, 
-			   unsigned long * free_blocknrs, 
-			   unsigned long start, 
-			   int amount_needed)
-{
-    if (fs->block_allocator)
-	return fs->block_allocator (fs, free_blocknrs, start, amount_needed);
-    die ("block allocator is not defined\n");
-    return 0;
-}
-
-
-int reiserfs_free_block (reiserfs_filsys_t * fs, unsigned long block)
-{
-    if (fs->block_deallocator)
-	return fs->block_deallocator (fs, block);
-    die ("block deallocator is not defined\n");
-    return 0;
-}
-
-static int reiserfs_search_by_key_x (reiserfs_filsys_t * fs, struct key * key,
-				     struct path * path, int key_length)
-{
-    struct buffer_head * bh;   
-    unsigned long block;
-    struct path_element * curr;
-    int retval;
-    
-
-    block = get_sb_root_block (fs->fs_ondisk_sb);
-    if (not_data_block(fs, block))
-	return IO_ERROR;
-    
-    path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-    while (1) {
-	curr = PATH_OFFSET_PELEMENT (path, ++ path->path_length);
-	bh = curr->pe_buffer = bread (fs->fs_dev, block, fs->fs_blocksize);
-        if (bh == 0) {
-	    path->path_length --;
-	    pathrelse (path);
-	    return ITEM_NOT_FOUND;
-	}
-	retval = reiserfs_bin_search (key, B_N_PKEY (bh, 0), B_NR_ITEMS (bh),
-				      is_leaf_node (bh) ? IH_SIZE : KEY_SIZE,
-				      &(curr->pe_position), key_length == 4 ? comp_keys : comp_keys_3);
-	if (retval == POSITION_FOUND) {
-	    /* key found, return if this is leaf level */
-	    if (is_leaf_node (bh)) {
-		path->pos_in_item = 0;
-		return ITEM_FOUND;
-	    }
-	    curr->pe_position ++;
-	} else {
-	    /* key not found in the node */
-	    if (is_leaf_node (bh))
-		return ITEM_NOT_FOUND;
-	}
-	block = get_dc_child_blocknr (B_N_CHILD (bh, curr->pe_position));
-	if (not_data_block(fs, block))
-		return IO_ERROR;
-    }
-    printf ("search_by_key: you can not get here\n");
-    return ITEM_NOT_FOUND;
-}
-
-
-int reiserfs_search_by_key_3 (reiserfs_filsys_t * fs, struct key * key,
-			      struct path * path)
-{
-    return reiserfs_search_by_key_x (fs, key, path, 3);
-}
-
-
-int reiserfs_search_by_key_4 (reiserfs_filsys_t * fs, struct key * key,
-			      struct path * path)
-{
-    return reiserfs_search_by_key_x (fs, key, path, 4);
-}
-
-
-/* key is key of byte in the regular file. This searches in tree
-   through items and in the found item as well */
-int usearch_by_position (reiserfs_filsys_t * s, struct key * key,
-			 int version, struct path * path)
-{
-    struct buffer_head * bh;
-    struct item_head * ih;
-    struct key * next_key;
-
-    if (reiserfs_search_by_key_3 (s, key, path) == ITEM_FOUND) {
-    	ih = get_ih (path);
-
-	if (!is_direct_ih (ih) && !is_indirect_ih (ih))
-	    return DIRECTORY_FOUND;
-
-	path->pos_in_item = 0;
-	return POSITION_FOUND;
-    }
-
-    bh = get_bh (path);
-    ih = get_ih (path);
-
-
-    if (PATH_LAST_POSITION (path) == 0) {
-	/* previous item does not exist, that means we are in leftmost leaf of
-	 * the tree */
-	if (!not_of_one_file (&ih->ih_key, key)) {
-	    if (!is_direct_ih (ih) && !is_indirect_ih (ih))
-		return DIRECTORY_FOUND;
-	    return POSITION_NOT_FOUND;
-	}
-	return FILE_NOT_FOUND;
-    }
-
-    /* take previous item */
-    PATH_LAST_POSITION (path) --;
-    ih --;
-
-    if (not_of_one_file (&ih->ih_key, key) || is_stat_data_ih(ih)) {
-	/* previous item belongs to another object or is a stat data, check
-	 * next item */
-	PATH_LAST_POSITION (path) ++;
-	if (PATH_LAST_POSITION (path) < B_NR_ITEMS (bh))
-	    /* next key is in the same node */
-	    next_key = B_N_PKEY (bh, PATH_LAST_POSITION (path));
-	else
-	    next_key = uget_rkey (path);
-	if (next_key == 0 || not_of_one_file (next_key, key)) {
-	    /* there is no any part of such file in the tree */
-	    path->pos_in_item = 0;
-	    return FILE_NOT_FOUND;
-	}
-
-	if (is_direntry_key (next_key)) {
-	    reiserfs_warning (stderr, "usearch_by_position: looking for %k found a directory with the same key\n",
-		      next_key);
-	    return DIRECTORY_FOUND;
-	}
-
-	/* next item is the part of this file */
-	path->pos_in_item = 0;
-	return POSITION_NOT_FOUND;
-    }
-
-    if (is_direntry_ih (ih)) {
-	return DIRECTORY_FOUND;
-    }
-
-    if (is_stat_data_ih(ih)) {
-	PATH_LAST_POSITION (path) ++;
-	return FILE_NOT_FOUND;
-    }
-
-    /* previous item is part of desired file */
-    if (I_K_KEY_IN_ITEM (ih, key, bh->b_size)) {
-	path->pos_in_item = get_offset (key) - get_offset (&ih->ih_key);
-	if (is_indirect_ih (ih) )
-	    path->pos_in_item /= bh->b_size;
-	return POSITION_FOUND;
-    }
-
-    path->pos_in_item = is_indirect_ih (ih) ? I_UNFM_NUM (ih) : get_ih_item_len (ih);
-    return POSITION_NOT_FOUND;
-}
-
-static int comp_dir_entries (const void * p1, const void * p2)
-{
-    __u32 off1, off2;
-
-    off1 = d32_get((__u32 *)p1, 0);
-    off2 = *(__u32 *)p2;
-    
-    if (off1 < off2)
-	return -1;
-    if (off1 > off2)
-	return 1;
-    return 0;
-}
-
-struct key * uget_lkey (struct path * path)
-{
-    int pos, offset = path->path_length;
-    struct buffer_head * bh;
-
-    if (offset < FIRST_PATH_ELEMENT_OFFSET)
-	die ("uget_lkey: illegal offset in the path (%d)", offset);
-
-
-    /* While not higher in path than first element. */
-    while (offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-	if (! buffer_uptodate (PATH_OFFSET_PBUFFER (path, offset)) )
-	    die ("uget_lkey: parent is not uptodate");
-	
-	/* Parent at the path is not in the tree now. */
-	if (! B_IS_IN_TREE (bh = PATH_OFFSET_PBUFFER (path, offset)))
-	    die ("uget_lkey: buffer on the path is not in tree");
-
-	/* Check whether position in the parent is correct. */
-	if ((pos = PATH_OFFSET_POSITION (path, offset)) > B_NR_ITEMS (bh))
-	    die ("uget_lkey: invalid position (%d) in the path", pos);
-
-	/* Check whether parent at the path really points to the child. */
-	if (get_dc_child_blocknr (B_N_CHILD (bh, pos)) != PATH_OFFSET_PBUFFER (path, offset + 1)->b_blocknr)
-	    die ("uget_lkey: invalid block number (%d). Must be %ld",
-		 get_dc_child_blocknr (B_N_CHILD (bh, pos)), PATH_OFFSET_PBUFFER (path, offset + 1)->b_blocknr);
-	
-	/* Return delimiting key if position in the parent is not equal to zero. */
-	if (pos)
-	    return B_N_PDELIM_KEY(bh, pos - 1);
-    }
-
-    /* there is no left delimiting key */
-    return 0;
-}
-
-struct key * uget_rkey (struct path * path)
-{
-    int pos, offset = path->path_length;
-    struct buffer_head * bh;
-
-    if (offset < FIRST_PATH_ELEMENT_OFFSET)
-	die ("uget_rkey: illegal offset in the path (%d)", offset);
-
-    while (offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-	if (! buffer_uptodate (PATH_OFFSET_PBUFFER (path, offset)))
-	    die ("uget_rkey: parent is not uptodate");
-
-	/* Parent at the path is not in the tree now. */
-	if (! B_IS_IN_TREE (bh = PATH_OFFSET_PBUFFER (path, offset)))
-	    die ("uget_rkey: buffer on the path is not in tree");
-
-	/* Check whether position in the parrent is correct. */
-	if ((pos = PATH_OFFSET_POSITION (path, offset)) > B_NR_ITEMS (bh))
-	    die ("uget_rkey: invalid position (%d) in the path", pos);
-
-	/* Check whether parent at the path really points to the child. */
-	if (get_dc_child_blocknr (B_N_CHILD (bh, pos)) != PATH_OFFSET_PBUFFER (path, offset + 1)->b_blocknr)
-	    die ("uget_rkey: invalid block number (%d). Must be %ld",
-		 get_dc_child_blocknr (B_N_CHILD (bh, pos)), PATH_OFFSET_PBUFFER (path, offset + 1)->b_blocknr);
-	
-	/* Return delimiting key if position in the parent is not the last one. */
-	if (pos != B_NR_ITEMS (bh))
-	    return B_N_PDELIM_KEY (bh, pos);
-    }
-    
-    /* there is no right delimiting key */
-    return 0;
-}
-
-struct key * reiserfs_next_key (struct path * path) {
-    if (get_item_pos (path) < B_NR_ITEMS (get_bh (path)) - 1)
-	return B_N_PKEY (get_bh (path), get_item_pos (path) + 1);
-
-    return uget_rkey (path);
-}
-
-
-/* NOTE: this only should be used to look for keys who exists */
-int reiserfs_search_by_entry_key (reiserfs_filsys_t * fs, struct key * key, 
-				  struct path * path)
-{
-    struct buffer_head * bh;
-    int item_pos;
-    struct item_head * ih;
-    struct key tmpkey;
-    __u32 offset;
-
-    if (reiserfs_search_by_key_4 (fs, key, path) == ITEM_FOUND) {
-        path->pos_in_item = 0;
-        return POSITION_FOUND;
-    }
-
-    bh = get_bh (path);
-    item_pos = get_item_pos (path);
-    ih = get_ih (path);
-
-    if (item_pos == 0) {
-	/* key is less than the smallest key in the tree */
-	if (not_of_one_file (&(ih->ih_key), key))
-	    /* there are no items of that directory */
-	    return DIRECTORY_NOT_FOUND;
-
-	if (!is_direntry_ih (ih)) {
-	    reiserfs_panic ("reiserfs_search_by_entry_key: found item "
-			    "is not of directory type %H", ih);
-	}
-
-	/* key we looked for should be here */
-        path->pos_in_item = 0;
-	return POSITION_NOT_FOUND;
-    }
-
-    /* take previous item */
-    item_pos --;
-    ih --;
-    PATH_LAST_POSITION (path) --;
-
-    if (not_of_one_file (&(ih->ih_key), key) || !is_direntry_ih (ih)) {
-        /* previous item belongs to another object or is stat data, check next
-           item */
-
-	item_pos ++;
-	PATH_LAST_POSITION (path) ++;
-
-        if (item_pos < B_NR_ITEMS (bh)) {
-	    /* next item is in the same node */
-	    ih ++;
-            if (not_of_one_file (&(ih->ih_key), key)) {
-		/* there are no items of that directory */
-                path->pos_in_item = 0;
-                return DIRECTORY_NOT_FOUND;
-            }
-
-            if (!is_direntry_ih (ih))
-		reiserfs_panic ("_search_by_entry_key: %k is not a directory",
-				key);
-        } else {
-	    /* next item is in right neighboring node */
-            struct key * next_key = uget_rkey (path);
-
-            if (next_key == 0 || not_of_one_file (next_key, key)) {
-                /* there are no items of that directory */
-                path->pos_in_item = 0;
-                return DIRECTORY_NOT_FOUND;
-            }
-
-            if (!is_direntry_key (next_key))
-		reiserfs_panic ("_search_by_entry_key: %k is not a directory",
-				key);
-
-            /* we got right delimiting key - search for it - the entry will be
-	       pasted in position 0 */
-            copy_key (&tmpkey, next_key);
-            pathrelse (path);
-            if (reiserfs_search_by_key_4 (fs, &tmpkey, path) != ITEM_FOUND || PATH_LAST_POSITION (path) != 0)
-                reiserfs_panic ("_search_by_entry_key: item corresponding to delimiting key %k not found",
-				&tmpkey);
-        }
-
-        /* next item is the part of this directory */
-        path->pos_in_item = 0;
-        return POSITION_NOT_FOUND;
-    }
-
-    /* previous item is part of desired directory */
-    offset = get_key_offset_v1 (key);
-    if (reiserfs_bin_search (&offset, B_I_DEH (bh, ih), get_ih_entry_count (ih),
-			     DEH_SIZE, &(path->pos_in_item), comp_dir_entries) == POSITION_FOUND)
-	return POSITION_FOUND;
-
-    return POSITION_NOT_FOUND;
-}
-
-
-void init_tb_struct (struct tree_balance * tb, reiserfs_filsys_t * fs,
-			     struct path * path, int size)
-{
-    memset (tb, '\0', sizeof(struct tree_balance));
-    tb->tb_fs = fs;
-    tb->tb_path = path;
-
-    PATH_OFFSET_PBUFFER(path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
-    PATH_OFFSET_POSITION(path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
-    tb->insert_size[0] = size;
-}
-
-
-int reiserfs_remove_entry (reiserfs_filsys_t * fs, struct key * key)
-{
-    struct path path;
-    struct tree_balance tb;
-    struct item_head * ih;
-    struct reiserfs_de_head * deh;
-
-    if (reiserfs_search_by_entry_key (fs, key, &path) != POSITION_FOUND) {
-	pathrelse (&path);
-	return 1;
-    }
-
-    ih = get_ih (&path);
-    if (get_ih_entry_count (ih) == 1) {
-	init_tb_struct (&tb, fs, &path, -(IH_SIZE + get_ih_item_len (ih)));
-	if (fix_nodes (M_DELETE, &tb, 0) != CARRY_ON) {
-	    unfix_nodes (&tb);
-	    return 1;
-	}
-	do_balance (&tb, 0, 0, M_DELETE, 0);
-	return 0;
-    }
-
-    deh = B_I_DEH (get_bh (&path), ih) + path.pos_in_item;
-    init_tb_struct (&tb, fs, &path, -(DEH_SIZE + entry_length (ih, deh, path.pos_in_item)));
-    if (fix_nodes (M_CUT, &tb, 0) != CARRY_ON) {
-	unfix_nodes (&tb);
-	return 1;
-    }
-    do_balance (&tb, 0, 0, M_CUT, 0);
-    return 0;
-}
-
-
-
-void reiserfs_paste_into_item (reiserfs_filsys_t * fs, struct path * path,
-			       const void * body, int size)
-{
-    struct tree_balance tb;
-  
-    init_tb_struct (&tb, fs, path, size);
-
-    if (fix_nodes (M_PASTE, &tb, 0/*ih*/) != CARRY_ON)
-	reiserfs_panic ("reiserfs_paste_into_item: fix_nodes failed");
-
-    do_balance (&tb, 0, body, M_PASTE, 0/*zero num*/);
-}
-
-
-void reiserfs_insert_item (reiserfs_filsys_t * fs, struct path * path,
-			   struct item_head * ih, const void * body)
-{
-    struct tree_balance tb;
-    
-    init_tb_struct (&tb, fs, path, IH_SIZE + get_ih_item_len(ih));
-    if (fix_nodes (M_INSERT, &tb, ih) != CARRY_ON)
-	die ("reiserfs_insert_item: fix_nodes failed");
-
-    do_balance (&tb, ih, body, M_INSERT, 0/*zero num*/);
-}
-
-
-/*===========================================================================*/
-
-__u32 hash_value (hashf_t func, char * name, int namelen)
-{
-    __u32 res;
-
-    res = func (name, namelen);
-    res = GET_HASH_VALUE(res);
-    if (res == 0)
-	res = 128;
-
-    return res;
-}
-
-
-/* if name is found in a directory - return 1 and set path to the name,
-   otherwise return 0 and pathrelse path */
-int reiserfs_locate_entry (reiserfs_filsys_t * fs, struct key * dir, char * name,
-			   struct path * path)
-{
-    struct key entry_key;
-    struct item_head * ih;
-    struct reiserfs_de_head * deh;
-    int i, retval;
-    struct key * rdkey;
-    
-    set_key_dirid (&entry_key, get_key_dirid (dir));
-    set_key_objectid (&entry_key, get_key_objectid (dir));
-    set_key_offset_v1 (&entry_key, 0);
-    set_key_uniqueness (&entry_key, DIRENTRY_UNIQUENESS);
-
- 
-    if (reiserfs_search_by_entry_key (fs, &entry_key, path) == DIRECTORY_NOT_FOUND) {
-	pathrelse (path);
-	return 0;
-    }
-
-    do {
-	ih = get_ih (path);
-	deh = B_I_DEH (get_bh (path), ih) + path->pos_in_item;
-	for (i = path->pos_in_item; i < get_ih_entry_count (ih); i ++, deh ++) {
-	    /* the name in directory has the same hash as the given name */
-	    if ((name_in_entry_length (ih, deh, i) == (int)strlen (name)) &&
-		!memcmp (name_in_entry (deh, i), name, strlen (name))) {
-		path->pos_in_item = i;
-		return 1;
-	    }
-	}
-
-	rdkey = uget_rkey (path);
-	if (!rdkey || not_of_one_file (rdkey, dir)) {
-	    pathrelse (path);
-	    return 0;
-	}
-	
-	if (!is_direntry_key (rdkey))
-	    reiserfs_panic ("reiserfs_locate_entry: can not find name in broken directory yet");
-
-	/* first name of that item may be a name we are looking for */
-	entry_key = *rdkey;
-	pathrelse (path);
-	retval = reiserfs_search_by_entry_key (fs, &entry_key, path);
-	if (retval != POSITION_FOUND)
-	    reiserfs_panic ("reiserfs_locate_entry: wrong delimiting key in the tree");
-
-    } while (1);
-
-    return 0;
-    
-}
-
-
-/* returns 0 if name is not found in a directory and 1 if name is
-   found. Stores key found in the entry in 'key'. Returns minimal not used
-   generation counter in 'min_gen_counter'. dies if found object is not a
-   directory. */
-int reiserfs_find_entry (reiserfs_filsys_t * fs, struct key * dir, char * name, 
-			 unsigned int * min_gen_counter, struct key * key)
-{
-    struct key entry_key;
-    int retval;
-    int i;
-    INITIALIZE_PATH (path);
-    struct item_head * ih;
-    struct reiserfs_de_head * deh;
-    struct key * rdkey;
-    __u32 hash;
-
-
-    set_key_dirid (&entry_key, get_key_dirid (dir));
-    set_key_objectid (&entry_key, get_key_objectid (dir));
-    if (!strcmp (name, "."))
-	hash = DOT_OFFSET;
-    else if (!strcmp (name, ".."))
-	hash = DOT_DOT_OFFSET;
-    else
-	hash = hash_value (reiserfs_hash (fs), name, strlen (name));
-    set_key_offset_v1 (&entry_key, hash);
-    set_key_uniqueness (&entry_key, DIRENTRY_UNIQUENESS);
-
-    *min_gen_counter = 0;
-
-    if (reiserfs_search_by_entry_key (fs, &entry_key, &path) == DIRECTORY_NOT_FOUND) {
-	pathrelse (&path);
-	return 0;
-    }
-	
-    do {
-	ih = get_ih (&path);
-	deh = B_I_DEH (get_bh (&path), ih) + path.pos_in_item;
-	for (i = path.pos_in_item; i < get_ih_entry_count (ih); i ++, deh ++) {
-	    if (GET_HASH_VALUE (get_deh_offset (deh)) != GET_HASH_VALUE (hash)) {
-		/* all entries having the same hash were scanned */
-		pathrelse (&path);
-		return 0;
-	    }
-			
-	    if (GET_GENERATION_NUMBER (get_deh_offset (deh)) == *min_gen_counter)
-		(*min_gen_counter) ++;
-			
-	    if ((name_in_entry_length (ih, deh, i) == (int)strlen (name)) &&
-	        (!memcmp (name_in_entry (deh, i), name, strlen (name)))) {
-		/* entry found in the directory */
-		if (key) {
-		    memset (key, 0, sizeof (struct key));
-		    set_key_dirid (key, get_deh_dirid (deh));
-		    set_key_objectid (key, get_deh_objectid (deh));
-		}
-		pathrelse (&path);
-		return 1;//get_deh_objectid (deh) ? get_deh_objectid (deh) : 1;
-	    }
-	}
-		
-	rdkey = uget_rkey (&path);
-	if (!rdkey || not_of_one_file (rdkey, dir)) {
-	    pathrelse (&path);
-	    return 0;
-	}
-		
-	if (!is_direntry_key (rdkey))
-	    reiserfs_panic ("reiserfs_find_entry: can not find name in broken directory yet");
-		
-	/* next item is the item of the directory we are looking name in */
-	if (GET_HASH_VALUE (get_offset (rdkey)) != hash) {
-	    /* but there is no names with given hash */
-	    pathrelse (&path);
-	    return 0;
-	}
-		
-	/* first name of that item may be a name we are looking for */
-	entry_key = *rdkey;
-	pathrelse (&path);
-	retval = reiserfs_search_by_entry_key (fs, &entry_key, &path);
-	if (retval != POSITION_FOUND)
-	    reiserfs_panic ("reiserfs_find_entry: wrong delimiting key in the tree");
-		
-    } while (1);
-    
-    return 0;
-}
-
-
-/* compose directory entry: dir entry head and name itself */
-char * make_entry (char * entry, char * name, struct key * key, __u32 offset)
-{
-    struct reiserfs_de_head * deh;
-    __u16 state;
-	
-    if (!entry)
-	entry = getmem (DEH_SIZE + ROUND_UP (strlen (name)));
-
-    memset (entry, 0, DEH_SIZE + ROUND_UP (strlen (name)));
-    deh = (struct reiserfs_de_head *)entry;
-	
-    set_deh_location (deh, 0);
-    set_deh_offset (deh, offset);
-    state = (1 << DEH_Visible2);
-    set_deh_state (deh, state);
-	
-    /* key of object entry will point to */
-    set_deh_dirid (deh, get_key_dirid (key));
-    set_deh_objectid (deh, get_key_objectid (key));
-	
-    memcpy ((char *)(deh + 1), name, strlen (name));
-    return entry;
-}
-
-
-/* add new name into a directory. If it exists in a directory - do
-   nothing */
-int reiserfs_add_entry (reiserfs_filsys_t * fs, struct key * dir, char * name, int name_len,
-			struct key * key, __u16 fsck_need)
-{
-    struct item_head entry_ih = {{0,}, };
-    char * entry;
-    int retval;
-    INITIALIZE_PATH(path);
-    unsigned int gen_counter;
-    int item_len;
-    __u32 hash;
-
-    if (reiserfs_find_entry (fs, dir, name, &gen_counter, 0))
-	/* entry is in the directory already or directory was not found */
-	return 0;
-
-    /* compose entry key to look for its place in the tree */
-    set_key_dirid (&(entry_ih.ih_key), get_key_dirid (dir));
-    set_key_objectid (&(entry_ih.ih_key), get_key_objectid (dir));
-    if (!strcmp (name, "."))
-	hash = DOT_OFFSET;
-    else if (!strcmp (name, ".."))
-	hash = DOT_DOT_OFFSET;
-    else
-	hash = hash_value (reiserfs_hash (fs), name, strlen (name)) + gen_counter;
-    set_key_offset_v1 (&(entry_ih.ih_key), hash);
-    set_key_uniqueness (&(entry_ih.ih_key), DIRENTRY_UNIQUENESS);
-
-    set_ih_key_format (&entry_ih, KEY_FORMAT_1);
-    set_ih_entry_count (&entry_ih, 1);
-
-    item_len = DEH_SIZE + name_len;
-/*
-    if (get_reiserfs_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_3_5)
-	item_len = DEH_SIZE + strlen (name);
-    else if (get_reiserfs_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_3_6)
-	item_len = DEH_SIZE + ROUND_UP (strlen (name));
-    else
-	reiserfs_panic ("unknown fs format");
-*/
-
-    set_ih_item_len (&entry_ih, item_len);
-
-    /* fsck may need to insert item which was not reached yet */
-    set_ih_flags (&entry_ih, fsck_need);
-
-    entry = make_entry (0, name, key, get_offset (&(entry_ih.ih_key)));
-
-    retval = reiserfs_search_by_entry_key (fs, &(entry_ih.ih_key), &path);
-    switch (retval) {
-    case POSITION_NOT_FOUND:
-	reiserfs_paste_into_item (fs, &path, entry, item_len);
-	break;
-
-    case DIRECTORY_NOT_FOUND:
-	set_deh_location ((struct reiserfs_de_head *)entry, DEH_SIZE);
-	reiserfs_insert_item (fs, &path, &entry_ih, entry);
-	break;
-
-    default:
-	reiserfs_panic ("reiserfs_add_entry: looking for %k (inserting name \"%s\") "
-			"search_by_entry_key returned %d",
-			&(entry_ih.ih_key), name, retval);
-    }
-
-    freemem (entry);
-    return item_len;
-}
-
-
-void copy_key (void * to, void * from)
-{
-    memcpy (to, from, KEY_SIZE);
-}
-
-
-void copy_short_key (void * to, void * from)
-{
-    memcpy (to, from, SHORT_KEY_SIZE);
-}
-
-
-void copy_item_head(void * p_v_to, void * p_v_from)
-{
-    memcpy (p_v_to, p_v_from, IH_SIZE);
-}
-
-
-/* inserts new or old stat data of a directory (unreachable, nlinks == 0) */
-int create_dir_sd (reiserfs_filsys_t * fs,
-		    struct path * path, struct key * key,
-		    void (*modify_item)(struct item_head *, void *))
-{
-    struct item_head ih;
-    struct stat_data sd;
-    int key_format;
-
-    if (fs->fs_format == REISERFS_FORMAT_3_5)
-	key_format = KEY_FORMAT_1;
-    else
-	key_format = KEY_FORMAT_2;
-
-    memset(&sd, 0, sizeof(sd));
-    make_dir_stat_data (fs->fs_blocksize, key_format, get_key_dirid (key),
-			get_key_objectid (key), &ih, &sd);
-
-    if (modify_item)
-	modify_item (&ih, &sd);
-#if 0
-    /* set nlink count to 0 and make the item unreachable */
-    zero_nlink (&ih, &sd, 0);
-    mark_item_unreachable (&ih);
-#endif
-    reiserfs_insert_item (fs, path, &ih, &sd);
-    return key_format;
-}
-
-
-
-void make_sure_root_dir_exists (reiserfs_filsys_t * fs,
-				void (*modify_item)(struct item_head *, void *),
-				int ih_flags)
-{
-    INITIALIZE_PATH (path);
-
-
-    /* is there root's stat data */
-    if (reiserfs_search_by_key_4 (fs, &root_dir_key, &path) == ITEM_NOT_FOUND) {	
-	root_dir_format = create_dir_sd (fs, &path, &root_dir_key, modify_item);
-    } else {
-    	struct item_head * ih = get_ih (&path);
-    	
-    	if (!is_stat_data_ih (ih))
-	    reiserfs_panic ("It must be root's stat data %k\n", &ih->ih_key);
-	
-        root_dir_format = (get_ih_item_len (get_ih (&path)) == SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
-	pathrelse (&path);
-    }
-
-    /* add "." and ".." if any of them do not exist. Last two
-       parameters say: 0 - entry is not added on lost_found pass and 1
-       - mark item unreachable */
-
-    reiserfs_add_entry (fs, &root_dir_key, ".", name_length (".", root_dir_format),
-    		&root_dir_key, ih_flags);
-    reiserfs_add_entry (fs, &root_dir_key, "..", name_length ("..", root_dir_format),
-    		&parent_root_dir_key, ih_flags);
-}
-
-
-/* we only can use a file for filesystem or journal if it is either not
-   mounted block device or regular file and we are forced to use it */
-int can_we_format_it (char * device_name, int force)
-{
-    mode_t mode;
-    dev_t rdev;
-
-
-    if (misc_device_mounted(device_name) > 0) {
-	/* device looks mounted */
-	reiserfs_warning (stderr, "'%s' looks mounted.", device_name);
-	check_forcing_ask_confirmation (force);
-    }
-
-    mode = misc_device_mode(device_name);
-    rdev = misc_device_rdev(device_name);
-
-    if (!S_ISBLK (mode)) {
-	/* file is not a block device */
-	reiserfs_warning (stderr, "%s is not a block special device\n", device_name);
-	check_forcing_ask_confirmation (force);
-    } else {
-	if ((IDE_DISK_MAJOR (major(rdev)) && minor(rdev) % 64 == 0) ||
-	    (SCSI_BLK_MAJOR (major(rdev)) && minor(rdev) % 16 == 0)) {
-	    /* /dev/hda or similar */
-	    reiserfs_warning (stderr, "%s is entire device, not just one partition!\n",
-		    device_name);
-	    check_forcing_ask_confirmation (force);
-	}
-    }
-
-    return 1;
-}
-
-int create_badblock_bitmap (reiserfs_filsys_t * fs, char * badblocks_file) {
-    FILE * fd;
-    char buf[128];
-    __u32 blocknr;
-    int count;
-
-    fs->fs_badblocks_bm = reiserfs_create_bitmap(get_sb_block_count(fs->fs_ondisk_sb));
-    reiserfs_bitmap_zero (fs->fs_badblocks_bm);
-
-    if (!badblocks_file)
-	return 0;
-    
-    fd = fopen (badblocks_file, "r");
-
-    if (fd == NULL) {
-        fprintf (stderr, "%s: Failed to open the given badblock file '%s'.\n\n",
-        	__FUNCTION__, badblocks_file);
-        return 1;
-    }
-
-
-    while (!feof (fd)) {
-	if (fgets(buf, sizeof(buf), fd) == NULL)
-	    break;
-	count = sscanf(buf, "%u", &blocknr);
-	
-	if (count <= 0)
-	    continue;
-
-	if (blocknr >= get_sb_block_count (fs->fs_ondisk_sb)) {
-	    fprintf (stderr, "%s: block number (%u) points out of fs size "
-		     "(%u).\n", __FUNCTION__, blocknr, 
-		     get_sb_block_count(fs->fs_ondisk_sb));
-	} else if (not_data_block (fs, blocknr)) {
-	    fprintf (stderr, "%s: block number (%u) belongs to system "
-		     "reiserfs area. It cannot be relocated.\n", 
-		     __FUNCTION__, blocknr);
-	    return 1;
-	} else {
-	    reiserfs_bitmap_set_bit (fs->fs_badblocks_bm, blocknr);
-	} 
-    }
-
-    fclose (fd);
-
-    return 0;
-}
-
-void badblock_list(reiserfs_filsys_t * fs, badblock_func_t action, void *data) {
-    struct path badblock_path;
-    struct key rd_key = badblock_key;
-    struct key *key;
-    
-    badblock_path.path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-    set_type_and_offset (KEY_FORMAT_2, &badblock_key, 1, TYPE_INDIRECT);
-    
-    while (1) {
-	    if (reiserfs_search_by_key_4 (fs, &rd_key, &badblock_path) == IO_ERROR) {
-		fprintf (stderr, "%s: Some problems while searching by the key "
-			 "occured. Probably due to tree corruptions.\n",
-			 __FUNCTION__);
-		pathrelse (&badblock_path);
-		break;
-	    }
-		    
-
-	    if (get_blkh_nr_items (B_BLK_HEAD (get_bh (&badblock_path))) <= 
-		PATH_LAST_POSITION (&badblock_path)) 
-	    {
-		pathrelse (&badblock_path);
-		break;
-	    }
-
-	    rd_key = get_ih(&badblock_path)->ih_key;
-
-	    if (get_key_dirid(&rd_key) != BADBLOCK_DIRID || 
-		get_key_objectid(&rd_key) != BADBLOCK_OBJID ||
-		!KEY_IS_INDIRECT_KEY(&rd_key)) 
-	    {
-		pathrelse (&badblock_path);
-		break;
-	    }
-	
-	    if ((key = reiserfs_next_key(&badblock_path)))
-		rd_key = *key;
-	    else
-	        memset(&rd_key, 0, sizeof(rd_key));
-	    
-	    action(fs, &badblock_path, data);
-
-	    if (get_key_dirid(&rd_key) == 0)
-		break;
-    }
-}
-
-static void callback_badblock_rm(reiserfs_filsys_t *fs,
-				 struct path *badblock_path, 
-				 void *data) 
-{
-	struct tree_balance tb;
-	struct item_head * tmp_ih;
-
-	tmp_ih = get_ih(badblock_path);
-	memset (get_item (badblock_path), 0, get_ih_item_len (tmp_ih));
-
-	init_tb_struct (&tb, fs, badblock_path, 
-			-(IH_SIZE + get_ih_item_len(PATH_PITEM_HEAD(badblock_path))));
-
-	if (fix_nodes (M_DELETE, &tb, 0) != CARRY_ON)
-		die ("%s: fix_nodes failed", __FUNCTION__);
-
-	do_balance (/*tb.transaction_handle,*/ &tb, 0, 0, M_DELETE, 0/*zero num*/);
-}
-
-void mark_badblock(reiserfs_filsys_t *fs, 
-		   struct path *badblock_path, 
-		   void *data) 
-{
-	struct item_head *tmp_ih;
-	__u32 *ind_item;
-	__u32 i;
-
-	if (!fs->fs_badblocks_bm)
-	    create_badblock_bitmap(fs, NULL);
-	
-	tmp_ih = get_ih(badblock_path);
-	ind_item = (__u32 *)get_item(badblock_path);
-
-	for (i = 0; i < I_UNFM_NUM(tmp_ih); i++) {
-		reiserfs_bitmap_set_bit(fs->fs_badblocks_bm, 
-					d32_get(ind_item, i));
-	}
-	
-	pathrelse (badblock_path);
-}
-
-void add_badblock_list (reiserfs_filsys_t * fs, int replace) {
-    struct tree_balance tb;
-    struct path badblock_path;
-    struct item_head badblock_ih;
-    __u32 ni;
-
-    __u64 offset;
-    __u32 i, j;
-
-    if (fs->fs_badblocks_bm == NULL)
-    	return;
-
-    /* delete all items with badblock_key */
-    if (replace)
-	badblock_list(fs, callback_badblock_rm, NULL);
-
-    memset(&badblock_ih, 0, sizeof(badblock_ih));
-    set_ih_key_format (&badblock_ih, KEY_FORMAT_2);
-    set_ih_item_len (&badblock_ih, UNFM_P_SIZE);
-    set_ih_free_space (&badblock_ih, 0);
-    set_ih_location (&badblock_ih, 0);
-    set_key_dirid (&badblock_ih.ih_key, BADBLOCK_DIRID);
-    set_key_objectid (&badblock_ih.ih_key, BADBLOCK_OBJID);
-    set_type (KEY_FORMAT_2, &badblock_ih.ih_key, TYPE_INDIRECT);
-
-    j = 0;
-
-    /* insert all badblock pointers */
-    for (i = 0; i < fs->fs_badblocks_bm->bm_bit_size; i++) {
-        int retval;
-
-	if (!reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))	
-	    continue;
-	
-	offset = j * fs->fs_blocksize + 1;
-	set_offset (KEY_FORMAT_2, &badblock_ih.ih_key, offset);
-	ni = cpu_to_le32 (i);
-	
-	retval = usearch_by_position (fs, &badblock_ih.ih_key, 
-				      key_format(&badblock_ih.ih_key), 
-				      &badblock_path);
-
-	switch (retval) {
-	case (FILE_NOT_FOUND):
-		init_tb_struct (&tb, fs, &badblock_path, 
-				IH_SIZE + get_ih_item_len(&badblock_ih));
-		
-		if (fix_nodes (M_INSERT, &tb, &badblock_ih) != CARRY_ON)
-		    die ("reiserfsck_insert_item: fix_nodes failed");
-		
-		do_balance (&tb, &badblock_ih, (void *)&ni , M_INSERT, 0);
-
-		break;
-	
-	case (POSITION_NOT_FOUND):
-	case (POSITION_FOUND):
-		/* Insert the new item to the found position. */
-	
-		init_tb_struct (&tb, fs, &badblock_path, UNFM_P_SIZE);
-		
-		if (fix_nodes (M_PASTE, &tb, 0) != CARRY_ON)
-		    die ("reiserfsck_paste_into_item: fix_nodes failed");
-
-		do_balance (&tb, 0, (const char *)&ni, M_PASTE, 0);
-		break;
-	}
-	
-	j++;
-    }
-}
diff --git a/reiserfscore/stree.c b/reiserfscore/stree.c
deleted file mode 100644
index 389c692..0000000
--- a/reiserfscore/stree.c
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- *  Copyright 1996-2004 by Hans Reiser, licensing governed by 
- *  reiserfsprogs/README
- */
-
-/*
- *  Written by Anatoly P. Pinchuk pap@namesys.botik.ru
- *  Programm System Institute
- *  Pereslavl-Zalessky Russia
- */
-
-/*
- *  This file contains functions dealing with internal tree
- *
- * comp_keys
- * comp_short_keys
- * bin_search
- * get_lkey
- * get_rkey
- * key_in_buffer
- * decrement_bcount
- * decrement_counters_in_path
- * pathrelse
- * search_by_key
- * search_for_position_by_key
- * comp_items
- * prepare_for_delete_or_cut
- * calc_deleted_bytes_number
- * init_tb_struct
- * reiserfs_delete_item
- * indirect_to_direct
- * maybe_indirect_to_direct
- * reiserfs_cut_from_item
- * reiserfs_cut_dir_entry
- * reiserfs_paste_into_item
- * reiserfs_insert_item
- */
-#include "includes.h"
-
-
-/* Does the buffer contain a disk block which is in the tree. */
-inline int B_IS_IN_TREE (struct buffer_head * p_s_bh)
-{
-    return ( get_blkh_level (B_BLK_HEAD (p_s_bh)) != FREE_LEVEL );
-}
-
-
-/*
- Compare keys using REISERFS_SHORT_KEY_LEN fields.
- Returns:  -1 if key1 < key2
-            0 if key1 = key2
-            1 if key1 > key2
-*/
-
-int comp_short_keys (const void * k1, const void * k2)
-{
-    int n_key_length = REISERFS_SHORT_KEY_LEN;
-    __u32 * p_s_key1 = (__u32 *)k1;
-    __u32 * p_s_key2 = (__u32 *)k2;
-    __u32 u1, u2;
-
-    for( ; n_key_length--; ++p_s_key1, ++p_s_key2 ) {
-	u1 = d32_get(p_s_key1, 0) ;
-	u2 = d32_get(p_s_key2, 0) ;
-	if ( u1 < u2 )
-	    return -1;
-	if ( u1 > u2 )
-	    return 1;
-    }
-
-    return 0;
-}
-
-
-int comp_keys_3 (const void * p1, const void * p2)
-{
-    int retval;
-    const struct key * k1 = p1;
-    const struct key * k2 = p2;
-    loff_t off1, off2;
-
-    retval = comp_short_keys (k1, k2);
-    if (retval)
-	return retval;
-    off1 = get_offset(k1) ;
-    off2 = get_offset(k2) ;
-    if (off1 < off2)
-	return -1;
-
-    if (off1 > off2)
-	return 1;
-
-    return 0;
-}
-
-
-/*
- Compare keys using all 4 key fields.
- Returns:  -1 if key1 < key2
-            0 if key1 = key2
-            1 if key1 > key2
-*/
-int comp_keys (const void * p1, const void * p2)
-{
-    int retval;
-    const struct key * k1 = p1;
-    const struct key * k2 = p2;
-    __u32 u1, u2;
-
-    retval = comp_keys_3 (k1, k2);
-    if (retval)
-	return retval;
-
-    u1 = get_type (k1);
-    u2 = get_type (k2);
-
-    if (u1 < u2)
-        return -1;
-
-    if (u1 > u2)
-        return 1;
-
-    return 0;
-}
-
-
-/**************************************************************************
- *  Binary search toolkit function                                        *
- *  Search for an item in the array by the item key                       *
- *  Returns:    1 if found,  0 if not found;                              *
- *        *p_n_pos = number of the searched element if found, else the    *
- *        number of the first element that is larger than p_v_key.        *
- **************************************************************************/
-/* For those not familiar with binary search: n_lbound is the leftmost item that it
- could be, n_rbound the rightmost item that it could be.  We examine the item
- halfway between n_lbound and n_rbound, and that tells us either that we can increase
- n_lbound, or decrease n_rbound, or that we have found it, or if n_lbound <= n_rbound that
- there are no possible items, and we have not found it. With each examination we
- cut the number of possible items it could be by one more than half rounded down,
- or we find it. */
-inline	int bin_search (
-              void    * p_v_key,    /* Key to search for.                   */
-	      void    * p_v_base,   /* First item in the array.             */
-	      int       p_n_num,    /* Number of items in the array.        */
-	      int       p_n_width,  /* Item size in the array.
-				       searched. Lest the reader be
-				       confused, note that this is crafted
-				       as a general function, and when it
-				       is applied specifically to the array
-				       of item headers in a node, p_n_width
-				       is actually the item header size not
-				       the item size.                      */
-	      int     * p_n_pos     /* Number of the searched for element. */
-            ) {
-    int   n_rbound, n_lbound, n_j;
-
-    for ( n_j = ((n_rbound = p_n_num - 1) + (n_lbound = 0))/2; n_lbound <= n_rbound; n_j = (n_rbound + n_lbound)/2 )
-	switch( COMP_KEYS((struct key *)((char * )p_v_base + n_j * p_n_width), p_v_key) )  {
-	case -1: n_lbound = n_j + 1; continue;
-	case  1: n_rbound = n_j - 1; continue;
-	case  0: *p_n_pos = n_j;     return ITEM_FOUND; /* Key found in the array.  */
-	}
-
-    /* bin_search did not find given key, it returns position of key,
-     that is minimal and greater than the given one. */
-    *p_n_pos = n_lbound;
-    return ITEM_NOT_FOUND;
-}
-
-/* Minimal possible key. It is never in the tree. */
-struct key  MIN_KEY = {0, 0, {{0, 0},}};
-
-/* Maximal possible key. It is never in the tree. */
-struct key  MAX_KEY = {0xffffffff, 0xffffffff, {{0xffffffff, 0xffffffff},}};
-
-
-/* Get delimiting key of the buffer by looking for it in the buffers in the
-   path, starting from the bottom of the path, and going upwards.  We must
-   check the path's validity at each step.  If the key is not in the path,
-   there is no delimiting key in the tree (buffer is first or last buffer in
-   tree), and in this case we return a special key, either MIN_KEY or
-   MAX_KEY. */
-struct key * get_lkey (struct path * p_s_chk_path,
-		       reiserfs_filsys_t * fs)
-{
-    struct reiserfs_super_block * sb;
-    int  n_position, n_path_offset = p_s_chk_path->path_length;
-    struct buffer_head  * p_s_parent;
-  
-    sb = fs->fs_ondisk_sb;
-
-    /* While not higher in path than first element. */
-    while ( n_path_offset-- > FIRST_PATH_ELEMENT_OFFSET ) {
-	/* Parent at the path is not in the tree now. */
-	if ( ! B_IS_IN_TREE(p_s_parent = PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset)) )
-	    return &MAX_KEY;
-	/* Check whether position in the parent is correct. */
-	if ( (n_position = PATH_OFFSET_POSITION(p_s_chk_path, n_path_offset)) > B_NR_ITEMS(p_s_parent) )
-	    return &MAX_KEY;
-	/* Check whether parent at the path really points to the child. */
-	if ( get_dc_child_blocknr (B_N_CHILD (p_s_parent, n_position)) !=
-	     PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset + 1)->b_blocknr )
-	    return &MAX_KEY;
-	/* Return delimiting key if position in the parent is not equal to zero. */
-	if ( n_position )
-	    return B_N_PDELIM_KEY(p_s_parent, n_position - 1);
-    }
-    /* Return MIN_KEY if we are in the root of the buffer tree. */
-    if ( PATH_OFFSET_PBUFFER(p_s_chk_path, FIRST_PATH_ELEMENT_OFFSET)->b_blocknr ==
-	 get_sb_root_block (sb) )
-	return &MIN_KEY;
-    return  &MAX_KEY;
-}
-
-
-/* Get delimiting key of the buffer at the path and its right neighbor. */
-struct key * get_rkey (struct path * p_s_chk_path,
-		       reiserfs_filsys_t * fs)
-{
-    struct reiserfs_super_block * sb;
-    int                   n_position,
-	n_path_offset = p_s_chk_path->path_length;
-    struct buffer_head  * p_s_parent;
-
-    sb = fs->fs_ondisk_sb;
-
-    while ( n_path_offset-- > FIRST_PATH_ELEMENT_OFFSET ) {
-	/* Parent at the path is not in the tree now. */
-	if ( ! B_IS_IN_TREE(p_s_parent = PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset)) )
-	    return &MIN_KEY;
-	/* Check whether position in the parrent is correct. */
-	if ( (n_position = PATH_OFFSET_POSITION(p_s_chk_path, n_path_offset)) > B_NR_ITEMS(p_s_parent) )
-	    return &MIN_KEY;
-	/* Check whether parent at the path really points to the child. */
-	if ( get_dc_child_blocknr (B_N_CHILD (p_s_parent, n_position)) !=
-	     PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset + 1)->b_blocknr )
-	    return &MIN_KEY;
-	/* Return delimiting key if position in the parent is not the last one. */
-	if ( n_position != B_NR_ITEMS(p_s_parent) )
-	    return B_N_PDELIM_KEY(p_s_parent, n_position);
-    }
-    /* Return MAX_KEY if we are in the root of the buffer tree. */
-    if ( PATH_OFFSET_PBUFFER(p_s_chk_path, FIRST_PATH_ELEMENT_OFFSET)->b_blocknr ==
-	 get_sb_root_block (sb) )
-	return &MAX_KEY;
-    return  &MIN_KEY;
-}
-
-
-/* Check whether a key is contained in the tree rooted from a buffer at a
-   path.  This works by looking at the left and right delimiting keys for the
-   buffer in the last path_element in the path.  These delimiting keys are
-   stored at least one level above that buffer in the tree. If the buffer is
-   the first or last node in the tree order then one of the delimiting keys
-   may be absent, and in this case get_lkey and get_rkey return a special key
-   which is MIN_KEY or MAX_KEY. */
-static  inline  int key_in_buffer (
-    struct path         * p_s_chk_path, /* Path which should be checked.  */
-    struct key          * p_s_key,      /* Key which should be checked.   */
-    reiserfs_filsys_t  * fs        /* Super block pointer.           */
-    ) {
-
-    if ( COMP_KEYS(get_lkey(p_s_chk_path, fs), p_s_key) == 1 )
-	return 0;
-    if ( COMP_KEYS(p_s_key, get_rkey(p_s_chk_path, fs)) != -1 )
-	return 0;
-    return 1;
-}
-
-/* Release all buffers in the path. */
-void  pathrelse (struct path * p_s_search_path) 
-{
-    int n_path_offset = p_s_search_path->path_length;
-    
-    while ( n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET )
-	brelse(PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--));
-
-    p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-}
-
-
-/**************************************************************************
- * Algorithm   SearchByKey                                                *
- *             look for item in internal tree on the disk by its key      *
- * Input:  p_s_sb   -  super block                                        *
- *         p_s_key  - pointer to the key to search                        *
- * Output: true value -  1 - found,  0 - not found                        *
- *         p_s_search_path - path from the root to the needed leaf        *
- **************************************************************************/
-
-/* This function fills up the path from the root to the leaf as it
-   descends the tree looking for the key.  It uses reiserfs_bread to
-   try to find buffers in the cache given their block number.  If it
-   does not find them in the cache it reads them from disk.  For each
-   node search_by_key finds using reiserfs_bread it then uses
-   bin_search to look through that node.  bin_search will find the
-   position of the block_number of the next node if it is looking
-   through an internal node.  If it is looking through a leaf node
-   bin_search will find the position of the item which has key either
-   equal to given key, or which is the maximal key less than the given
-   key.  search_by_key returns a path that must be checked for the
-   correctness of the top of the path but need not be checked for the
-   correctness of the bottom of the path */
-int search_by_key (reiserfs_filsys_t * fs,
-		   struct key * p_s_key,        /* Key to search */
-		   struct path * p_s_search_path,/* This structure was
-						    allocated and
-						    initialized by the
-						    calling
-						    function. It is
-						    filled up by this
-						    function.  */
-		   int  n_stop_level)   /* How far down the tree to search.*/
-{
-    struct reiserfs_super_block * sb;
-    int n_block_number,
-	expected_level,
-	n_block_size    = fs->fs_blocksize;
-    struct buffer_head  *       p_s_bh;
-    struct path_element *       p_s_last_element;
-    int				n_retval;
-
-
-    sb = fs->fs_ondisk_sb;
-    n_block_number = get_sb_root_block (sb);
-    expected_level = get_sb_tree_height (sb);
-    
-    /* As we add each node to a path we increase its count.  This
-       means that we must be careful to release all nodes in a path
-       before we either discard the path struct or re-use the path
-       struct, as we do here. */
-    pathrelse (p_s_search_path);
-
-
-    /* With each iteration of this loop we search through the items in
-       the current node, and calculate the next current node(next path
-       element) for the next iteration of this loop.. */
-    while ( 1 ) {
-
-	/* prep path to have another element added to it. */
-	p_s_last_element = PATH_OFFSET_PELEMENT(p_s_search_path, ++p_s_search_path->path_length);
-	expected_level --;
-
-	/* Read the next tree node, and set the last element in the
-           path to have a pointer to it. */
-	if ( ! (p_s_bh = p_s_last_element->pe_buffer =
-		bread (fs->fs_dev, n_block_number, n_block_size)) ) {
-	    p_s_search_path->path_length --;
-	    pathrelse(p_s_search_path);
-	    return IO_ERROR;
-	}
-
-	/* It is possible that schedule occured. We must check whether
-	   the key to search is still in the tree rooted from the
-	   current buffer. If not then repeat search from the root. */
-	if (!B_IS_IN_TREE (p_s_bh) || 
-	    ! key_in_buffer(p_s_search_path, p_s_key, fs))
-	    reiserfs_panic ("search_by_key: something wrong with the tree");
-
-	/* make sure, that the node contents look like a node of
-           certain level */
-	if (!is_tree_node (p_s_bh, expected_level)) {
-	    print_block (stderr, 0, p_s_bh, 3, -1, -1);
-	    reiserfs_panic ("search_by_key: expected level %d", expected_level);
-	}
-
-	/* ok, we have acquired next formatted node in the tree */
-	n_retval = bin_search (p_s_key, B_N_PITEM_HEAD(p_s_bh, 0), B_NR_ITEMS(p_s_bh),
-			       is_leaf_node (p_s_bh) ? IH_SIZE : KEY_SIZE, &(p_s_last_element->pe_position));
-	if (get_blkh_level (B_BLK_HEAD (p_s_bh)) == n_stop_level)
-	    return n_retval;
-
-	/* we are not in the stop level */
-	if (n_retval == ITEM_FOUND)
-	    /* item has been found, so we choose the pointer which is
-               to the right of the found one */
-	    p_s_last_element->pe_position++;
-
-	/* if item was not found we choose the position which is to
-	   the left of the found item. This requires no code,
-	   bin_search did it already.*/
-
-	/* So we have chosen a position in the current node which is
-	   an internal node.  Now we calculate child block number by
-	   position in the node. */
-	n_block_number = get_dc_child_blocknr (B_N_CHILD (p_s_bh, p_s_last_element->pe_position));
-    }
-}
-
-
-int bin_search_in_dir_item (struct item_head * ih, struct reiserfs_de_head * deh, 
-			    struct key * key, int * pos_in_item)
-{
-    int rbound, lbound, j;
-
-    lbound = 0;
-    rbound = get_ih_entry_count (ih) - 1;
-
-    for (j = (rbound + lbound) / 2; lbound <= rbound; j = (rbound + lbound) / 2) {
-	if (get_offset (key) < get_deh_offset (deh + j)) {
-	    rbound = j - 1;
-	    continue;
-	}
-	if (get_offset (key) > get_deh_offset (deh + j)) {
-	    lbound = j + 1;
-	    continue;
-	}
-	/* key found */
-	*pos_in_item = j;
-	return POSITION_FOUND;
-    }
-    
-    *pos_in_item = lbound;
-    return POSITION_NOT_FOUND;
-}
diff --git a/reiserfsprogs.spec b/reiserfsprogs.spec
index f824b91..debf448 100644
--- a/reiserfsprogs.spec
+++ b/reiserfsprogs.spec
@@ -1,68 +1,44 @@
-%define reiserfsprogsversion 3.6.19
+Name: reiserfsprogs
+Version: 3.6.20
+Release: 1
+Summary: Utilities for reiserfs filesystems
+License: GPL
+Group: System Environment/Base
+URL: http://www.namesys.com/
+Source: reiserfsprogs-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
 
-Vendor:       Hans Reiser
-Distribution: Hans Reiser
-Name:         reiserfsprogs
-Release:      1
-Copyright:    2004 Hans Reiser
-Group:        Unsorted
-
-Packager:     anthon@mnt.org
-
-Version:      %{reiserfsprogsversion}
-Summary:      utilities belonging to the Reiser filesystem
-Source:       reiserfsprogs-%{reiserfsprogsversion}.tar.gz
-BuildRoot:    %{_tmppath}/rpmbuildroot-%{name}
 %description
-
-The reiserfsprogs package contains programs for creating (mkreiserfs),
-checking and correcting any inconsistencies (reiserfsck) and resizing
-(resize_reiserfs) of a reiserfs filesystem.
-
-Authors:
---------
-Hans Reiser <reiser@namesys.com>
-Vitaly Fertman <vitaly@namesys.com>
-Alexander Zarochentcev <zam@namesys.com>
-Vladimir Saveliev <monstr@namesys.com>
+The reiserfsprogs package contains utilities for manipulating
+reiserfs filesystems.
 
 %prep
-# Jeff Johnson states that RPM doesn't delete obviouse crap like / if 
-# buildroot is set differently since RPM 3.0.4 (rpm mailing list 2001-04-10)
-    rm -rf $RPM_BUILD_ROOT
-%setup -q -n reiserfsprogs-%{reiserfsprogsversion}
-# %patch
-%build
-  MANDIR=$(dirname $(dirname $(man -w fsck | cut -d ' ' -f 1)))
-  ./configure --prefix="" --mandir=$MANDIR
-  %{__make} all
-%install
-  mkdir -p $RPM_BUILD_ROOT/sbin
-  %{__make} DESTDIR=$RPM_BUILD_ROOT install
-# do we need this?
-  cd $RPM_BUILD_ROOT/sbin
-  %{__ln_s} -f reiserfsck fsck.reiserfs
-  %{__ln_s} -f mkreiserfs mkfs.reiserfs
+%setup -q -n reiserfsprogs-3.6.20
 
-# __os_install_post is normally executed after \%install disable it
-%define ___build_post %{nil} 
+%build
+  export CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS"
+  find . -name "config.cache" |xargs rm -f
+  ./configure --sbindir=%{_sbindir} --mandir=%{_mandir}
+
+%install
+  rm -rf $RPM_BUILD_ROOT
+  %{__make} DESTDIR=$RPM_BUILD_ROOT install
+
+# __os_install_post is normally executed after \% install disable it
+%define ___build_post %{nil}
 # explicitly call it now, so manpages get compressed, exec's stripped etc.
 %{?__os_install_post}
 %define __os_install_post %{nil}
+
 # now we have all the files execpt for docs, but their owner is unimportant
 cd $RPM_BUILD_ROOT
 
-%{__rm} -f rpm-filelist
-# we do not have special directories to make
-#find . -type d \
-# | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' >> rpm-filelist
-find . -type f \
- | sed 's,^\.,\%attr(-\,root\,root) ,' | fgrep -v rpm-filelist >> rpm-filelist
-find . -type l \
- | sed 's,^\.,\%attr(-\,root\,root) ,' >> rpm-filelist
+%clean
+  rm -rf $RPM_BUILD_ROOT
 
 %post
-CONFIG=/usr/src/linux/.config
+  rm -rf $RPM_BUILD_ROOT
+  CONFIG=/usr/src/linux/.config
 
 if [ -f $CONFIG ] ; then
   source $CONFIG
@@ -78,8 +54,8 @@
   echo -e 'and recompile and reboot your kernel if you cannot use the\nreiserfsprogs utilities'
 fi
 
-%clean
-  %{__rm} -rf $RPM_BUILD_ROOT
-%files -f %{buildroot}/rpm-filelist
+%files
 %defattr(-,root,root)
-%doc README
+%doc AUTHORS COPYING CREDITS INSTALL NEWS README
+%{_sbindir}/*
+%{_mandir}/man8/*.gz
diff --git a/reiserfsprogs.spec.in b/reiserfsprogs.spec.in
new file mode 100644
index 0000000..9ccfae0
--- /dev/null
+++ b/reiserfsprogs.spec.in
@@ -0,0 +1,61 @@
+Name: reiserfsprogs
+Version: @VERSION@
+Release: 1
+Summary: Utilities for reiserfs filesystems
+License: GPL
+Group: System Environment/Base
+URL: http://www.namesys.com/
+Source: reiserfsprogs-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
+
+%description
+The reiserfsprogs package contains utilities for manipulating
+reiserfs filesystems.
+
+%prep
+%setup -q -n reiserfsprogs-@VERSION@
+
+%build
+  export CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS"
+  find . -name "config.cache" |xargs rm -f
+  ./configure --sbindir=%{_sbindir} --mandir=%{_mandir}
+
+%install
+  rm -rf $RPM_BUILD_ROOT
+  %{__make} DESTDIR=$RPM_BUILD_ROOT install
+
+# __os_install_post is normally executed after \% install disable it
+%define ___build_post %{nil}
+# explicitly call it now, so manpages get compressed, exec's stripped etc.
+%{?__os_install_post}
+%define __os_install_post %{nil}
+
+# now we have all the files execpt for docs, but their owner is unimportant
+cd $RPM_BUILD_ROOT
+
+%clean
+  rm -rf $RPM_BUILD_ROOT
+
+%post
+  rm -rf $RPM_BUILD_ROOT
+  CONFIG=/usr/src/linux/.config
+
+if [ -f $CONFIG ] ; then
+  source $CONFIG
+fi
+
+if [ -z $CONFIG_REISERFS_FS ] ; then
+  echo -e "\nIn $CONFIG , you probably have to set:"
+  if [ "$CONFIG_EXPERIMENTAL" != "y" ] ; then
+    echo -e 'CONFIG_EXPERIMENTAL=y'
+  fi
+  echo -e 'CONFIG_REISERFS_FS=y\n  or'
+  echo -e 'CONFIG_REISERFS_FS=m'
+  echo -e 'and recompile and reboot your kernel if you cannot use the\nreiserfsprogs utilities'
+fi
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS COPYING CREDITS INSTALL NEWS README
+%{_sbindir}/*
+%{_mandir}/man8/*.gz
diff --git a/resize_reiserfs/Makefile.am b/resize_reiserfs/Makefile.am
deleted file mode 100644
index 24c669a..0000000
--- a/resize_reiserfs/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-sbin_PROGRAMS = resize_reiserfs
-
-resize_reiserfs_SOURCES = fe.c resize_reiserfs.c do_shrink.c resize.h
-man_MANS = resize_reiserfs.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-
diff --git a/resize_reiserfs/Makefile.in b/resize_reiserfs/Makefile.in
deleted file mode 100644
index bfebbf8..0000000
--- a/resize_reiserfs/Makefile.in
+++ /dev/null
@@ -1,457 +0,0 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UUID_LIBS = @UUID_LIBS@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-sbin_PROGRAMS = resize_reiserfs
-
-resize_reiserfs_SOURCES = fe.c resize_reiserfs.c do_shrink.c resize.h
-man_MANS = resize_reiserfs.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-subdir = resize_reiserfs
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-sbin_PROGRAMS = resize_reiserfs$(EXEEXT)
-PROGRAMS = $(sbin_PROGRAMS)
-
-am_resize_reiserfs_OBJECTS = fe.$(OBJEXT) resize_reiserfs.$(OBJEXT) \
-	do_shrink.$(OBJEXT)
-resize_reiserfs_OBJECTS = $(am_resize_reiserfs_OBJECTS)
-resize_reiserfs_LDADD = $(LDADD)
-resize_reiserfs_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
-	$(top_srcdir)/reiserfscore/libcore.a
-resize_reiserfs_LDFLAGS =
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/do_shrink.Po ./$(DEPDIR)/fe.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/resize_reiserfs.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(resize_reiserfs_SOURCES)
-
-NROFF = nroff
-MANS = $(man_MANS)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(resize_reiserfs_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  resize_reiserfs/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(sbindir)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f"; \
-	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f $(DESTDIR)$(sbindir)/$$f"; \
-	  rm -f $(DESTDIR)$(sbindir)/$$f; \
-	done
-
-clean-sbinPROGRAMS:
-	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
-resize_reiserfs$(EXEEXT): $(resize_reiserfs_OBJECTS) $(resize_reiserfs_DEPENDENCIES) 
-	@rm -f resize_reiserfs$(EXEEXT)
-	$(LINK) $(resize_reiserfs_LDFLAGS) $(resize_reiserfs_OBJECTS) $(resize_reiserfs_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/do_shrink.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resize_reiserfs.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-uninstall-info-am:
-
-man8dir = $(mandir)/man8
-install-man8: $(man8_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(man8dir)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
-	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
-	done
-uninstall-man8:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
-	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(MANS)
-
-installdirs:
-	$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir)
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-exec-am: install-sbinPROGRAMS
-
-install-info: install-info-am
-
-install-man: install-man8
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-man uninstall-sbinPROGRAMS
-
-uninstall-man: uninstall-man8
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-sbinPROGRAMS ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man8 install-sbinPROGRAMS \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man8 uninstall-sbinPROGRAMS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/resize_reiserfs/do_shrink.c b/resize_reiserfs/do_shrink.c
deleted file mode 100644
index b1854c8..0000000
--- a/resize_reiserfs/do_shrink.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright 2000-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#include "resize.h"
-#include <time.h>
-
-static unsigned long int_node_cnt   = 0, int_moved_cnt   = 0;
-static unsigned long leaf_node_cnt  = 0, leaf_moved_cnt  = 0;
-static unsigned long unfm_node_cnt  = 0, unfm_moved_cnt  = 0;
-static unsigned long total_node_cnt = 0;
-static unsigned long total_moved_cnt = 0;
-
-static unsigned long unused_block;
-static unsigned long blocks_used;
-static int block_count_mismatch = 0;
-
-static reiserfs_bitmap_t * bmp;
-static struct reiserfs_super_block * ondisk_sb;
-
-/* abnornal exit from block reallocation process */
-static void quit_resizer(reiserfs_filsys_t * fs)
-{
-	/* save changes to bitmap blocks */
-	reiserfs_close (fs);
-	/* leave fs in ERROR state */
-	reiserfs_exit(1, "fs shrinking was not completed successfully, "
-		      "run reiserfsck.");
-}
-
-/* block moving */
-static unsigned long move_generic_block(reiserfs_filsys_t * fs, 
-					unsigned long block, 
-					unsigned long bnd, int h)
-{
-    struct buffer_head * bh, * bh2;
-
-	/* primitive fsck */
-	if (block > get_sb_block_count(ondisk_sb)) {
-		fprintf(stderr, "resize_reiserfs: invalid block number "
-			"(%lu) found.\n", block);
-		quit_resizer(fs);
-	}
-	
-	/* progress bar, 3D style :) */
-	if (opt_verbose)
-	    print_how_far(stderr, &total_node_cnt, blocks_used, 1, 0);
-	else
-	    total_node_cnt ++;
-
-	/* infinite loop check */
-	if( total_node_cnt > blocks_used && !block_count_mismatch) {
-		fputs("resize_reiserfs: warning: block count exeeded\n",stderr);
-		block_count_mismatch = 1;
-	}
-
-	if (block < bnd) /* block will not be moved */
-		return 0;
-	
-	/* move wrong block */ 
-	bh = bread(fs->fs_dev, block, fs->fs_blocksize);
-
-	if (!bh)
-	    reiserfs_exit (1, "move_generic_block: bread failed.\n");
-
-	reiserfs_bitmap_find_zero_bit(bmp, &unused_block);
-	if (unused_block == 0 || unused_block >= bnd) {
-		fputs ("resize_reiserfs: can\'t find free block\n", stderr);
-		quit_resizer(fs);
-	}
-
-	/* blocknr changing */
-	bh2 = getblk(fs->fs_dev, unused_block, fs->fs_blocksize);
-	memcpy(bh2->b_data, bh->b_data, bh2->b_size);
-	reiserfs_bitmap_clear_bit(bmp, block);
-	reiserfs_bitmap_set_bit(bmp, unused_block);
-
-	brelse(bh);
-	mark_buffer_uptodate(bh2,1);
-	mark_buffer_dirty(bh2);
-	bwrite(bh2);
-	brelse(bh2);
-
-	total_moved_cnt++;
-	return unused_block;
-}
-
-static unsigned long move_unformatted_block(reiserfs_filsys_t * fs, unsigned long block, unsigned long bnd, int h)
-{
-	unsigned long b;
-	unfm_node_cnt++;
-	b = move_generic_block(fs, block, bnd, h);
-	if (b)
-		unfm_moved_cnt++;
-	return b;		
-}
-
-
-/* recursive function processing all tree nodes */
-static unsigned long move_formatted_block(reiserfs_filsys_t * fs, unsigned long block, unsigned long bnd, int h)
-{
-	struct buffer_head * bh;
-	struct item_head *ih;
-	unsigned long new_blocknr = 0;
-	int node_is_internal = 0;
-	unsigned int i, j;
-	
-	bh = bread(fs->fs_dev, block, fs->fs_blocksize);
-	if (!bh)
-	    reiserfs_exit (1, "move_formatted_block: bread failed");
-	
-	if (is_leaf_node (bh)) {
-		
-		leaf_node_cnt++;
-		
-		for (i = 0; i < B_NR_ITEMS(bh); i++) {
-			ih = B_N_PITEM_HEAD(bh, i);
-			
-			/* skip the bad blocks. */
-			if (get_key_objectid (&ih->ih_key) == BADBLOCK_OBJID &&
-			    get_key_dirid (&ih->ih_key) == BADBLOCK_DIRID)
-				continue;
-			
-			if (is_indirect_ih(ih)) {
-				__u32 * indirect;
-
-				indirect = (__u32 *)B_I_PITEM (bh, ih);
-				for (j = 0; j < I_UNFM_NUM(ih); j++) {
-					unsigned long  unfm_block;
-
-					if (d32_get (indirect, j) == 0) /* hole */
-						continue;
-					unfm_block = move_unformatted_block(fs, d32_get (indirect, j), bnd, h + 1);
-					if (unfm_block) {
-						d32_put (indirect, j, unfm_block);
-						mark_buffer_dirty(bh);
-					}
-				}
-			}	
-		}
-	} else if (is_internal_node (bh)) { /* internal node */
-		
-		int_node_cnt++;
-		node_is_internal = 1;
-		
-		for (i=0; i <= B_NR_ITEMS(bh); i++) {
-			unsigned long moved_block;
-			moved_block = move_formatted_block(fs, get_dc_child_blocknr (B_N_CHILD (bh, i)), bnd, h+1);
-			if (moved_block) {
-			    	set_dc_child_blocknr (B_N_CHILD (bh, i), moved_block);
-				mark_buffer_dirty(bh);
-			}
-		}	
-	} else {
-		DIE ("block (%lu) has invalid format\n", block);
-	}
-	
-	if (buffer_dirty(bh)) {
-		mark_buffer_uptodate(bh,1);
-		bwrite(bh);
-	}
-	
-	brelse(bh);	
-	
-	new_blocknr = move_generic_block(fs, block, bnd, h);
-	if (new_blocknr) {
-		if (node_is_internal)
-			int_moved_cnt++;
-		else
-			leaf_moved_cnt++;
-	}
-	
-	return new_blocknr;
-}
-
-int shrink_fs(reiserfs_filsys_t * fs, long long int blocks)
-{
-	unsigned long n_root_block;
-	unsigned int bmap_nr_new;
-	unsigned long bad_count;
-	
-	ondisk_sb = fs->fs_ondisk_sb;
-	
-	
-	bmap_nr_new = (blocks - 1) / (8 * fs->fs_blocksize) + 1;
-
-	/* is shrinking possible ? */
-	if (get_sb_block_count(ondisk_sb) - blocks > 
-	    get_sb_free_blocks(ondisk_sb) + get_sb_bmap_nr(ondisk_sb) - 
-	    bmap_nr_new) 
-	{
-	    fprintf(stderr, "resize_reiserfs: can\'t shrink fs; too many "
-		"blocks already allocated\n");
-	    return -1;
-	}
-
-	/* warn about alpha version */
-	{
-		int c;
-
-		printf(
-		    "You are running BETA version of reiserfs shrinker.\n"
-		    "This version is only for testing or VERY CAREFUL use.\n"
-		    "Backup of you data is recommended.\n\n"
-		    "Do you want to continue? [y/N]:"
-		);
-		fflush(stdout);
-		c = getchar();
-		if (c != 'y' && c != 'Y')
-			exit(1);
-	}
-
-	reiserfs_reopen(fs, O_RDWR);
-	if (reiserfs_open_ondisk_bitmap (fs))
-	    reiserfs_exit(1, "cannot open ondisk bitmap");
-	bmp = fs->fs_bitmap2;
-	ondisk_sb = fs->fs_ondisk_sb;
-
-	set_sb_fs_state (fs->fs_ondisk_sb, FS_ERROR);
-	mark_buffer_uptodate(fs->fs_super_bh, 1);
-	mark_buffer_dirty(fs->fs_super_bh);
-	bwrite(fs->fs_super_bh);
-
-	/* calculate number of data blocks */		
-	blocks_used = 
-	    get_sb_block_count(fs->fs_ondisk_sb)
-	    - get_sb_free_blocks(fs->fs_ondisk_sb)
-	    - get_sb_bmap_nr(fs->fs_ondisk_sb)
-	    - get_jp_journal_size(sb_jp (fs->fs_ondisk_sb))
-	    - REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize
-	    - 2; /* superblock itself and 1 descriptor after the journal */
-
-	unused_block = 1;
-
-	if (opt_verbose) {
-		printf("Processing the tree: ");
-		fflush(stdout);
-	}
-
-	n_root_block = move_formatted_block(fs, get_sb_root_block(ondisk_sb), 
-	    blocks, 0);
-	
-	if (n_root_block)
-	    set_sb_root_block (ondisk_sb, n_root_block);
-
-	if (opt_verbose)
-	    printf ("\n\nnodes processed (moved):\n"
-		    "int        %lu (%lu),\n"
-		    "leaves     %lu (%lu),\n" 
-		    "unfm       %lu (%lu),\n"
-		    "total      %lu (%lu).\n\n",
-		    int_node_cnt, int_moved_cnt,
-		    leaf_node_cnt, leaf_moved_cnt, 
-		    unfm_node_cnt, unfm_moved_cnt,
-		    (unsigned long)total_node_cnt, total_moved_cnt);
-
-	if (block_count_mismatch) {
-	    fprintf(stderr, "resize_reiserfs: data block count %lu"
-		    " doesn\'t match data block count %lu from super block\n",
-		    (unsigned long)total_node_cnt, blocks_used);
-	}
-
-	{
-	    unsigned long l;
-
-	    /* make sure that none of truncated block are in use */
-	    printf("check for used blocks in truncated region\n");
-	    for (l = blocks; l < fs->fs_bitmap2->bm_bit_size; l ++) {
-		if ((l % (fs->fs_blocksize * 8)) == 0)
-		    continue;
-		if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, l))
-		    printf ("<%lu>", l);
-	    }
-	    printf("\n");
-	}
-
-	badblock_list(fs, mark_badblock, NULL);
-	
-	if (fs->fs_badblocks_bm) {
-		bad_count = reiserfs_bitmap_ones(fs->fs_badblocks_bm);
-		reiserfs_shrink_bitmap (fs->fs_badblocks_bm, blocks);
-		add_badblock_list(fs, 1);
-		bad_count -= reiserfs_bitmap_ones(fs->fs_badblocks_bm);
-	} else
-		bad_count = 0;
-	
-	reiserfs_shrink_bitmap (fs->fs_bitmap2, blocks);
-
-	set_sb_free_blocks (ondisk_sb, get_sb_free_blocks(ondisk_sb)
-			    - (get_sb_block_count(ondisk_sb) - blocks)
-			    + (get_sb_bmap_nr(ondisk_sb) - bmap_nr_new)
-			    + bad_count);
-	set_sb_block_count (ondisk_sb, blocks);
-	set_sb_bmap_nr (ondisk_sb, bmap_nr_new);
-
-	return 0;
-}
diff --git a/resize_reiserfs/resize.h b/resize_reiserfs/resize.h
deleted file mode 100644
index 0d901f8..0000000
--- a/resize_reiserfs/resize.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* 
- * Copyright 2000-2004 by Hans Reiser, licensing governed by 
- * reiserfsprogs/README
- */
-
-#ifndef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include "io.h"
-#include "misc.h"
-#include "reiserfs_lib.h"
-
-#include "../version.h"
-
-#if __GLIBC__ >= 2
-#include <sys/mount.h>
-#else
-#include <linux/fs.h>
-#endif
-
-#include <errno.h>
-#include <string.h>
-
-#include <mntent.h>
-
-#define print_usage_and_exit() {\
- fprintf (stderr, "Usage: %s  [-s[+|-]#[G|M|K]] [-fqvV] device\n\n", argv[0]);\
- exit(16);\
-}
-
-#define DIE(form, args...) die("%s: " form "\n", g_progname , ## args)
-
-/* reiserfs_resize.c */
-extern struct buffer_head * g_sb_bh;
-extern char * g_progname;
-
-extern int opt_force;
-extern int opt_verbose;
-extern int opt_nowrite;
-extern int opt_safe;
-
-/* fe.c */
-extern int resize_fs_online(char * devname, long long int blocks);
-
-/* do_shrink.c */
-extern int shrink_fs(reiserfs_filsys_t *, long long int blocks);
diff --git a/tune/Makefile.am b/tune/Makefile.am
deleted file mode 100644
index a046409..0000000
--- a/tune/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-sbin_PROGRAMS = reiserfstune
-
-reiserfstune_SOURCES = tune.c tune.h
-
-man_MANS = reiserfstune.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-
diff --git a/tune/Makefile.in b/tune/Makefile.in
deleted file mode 100644
index 6275e8f..0000000
--- a/tune/Makefile.in
+++ /dev/null
@@ -1,454 +0,0 @@
-# Makefile.in generated by automake 1.7.6 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UUID_LIBS = @UUID_LIBS@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-sbin_PROGRAMS = reiserfstune
-
-reiserfstune_SOURCES = tune.c tune.h
-
-man_MANS = reiserfstune.8
-EXTRA_DIST = $(man_MANS)
-
-LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-subdir = tune
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/include/config.h
-CONFIG_CLEAN_FILES =
-sbin_PROGRAMS = reiserfstune$(EXEEXT)
-PROGRAMS = $(sbin_PROGRAMS)
-
-am_reiserfstune_OBJECTS = tune.$(OBJEXT)
-reiserfstune_OBJECTS = $(am_reiserfstune_OBJECTS)
-reiserfstune_LDADD = $(LDADD)
-reiserfstune_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
-	$(top_srcdir)/reiserfscore/libcore.a
-reiserfstune_LDFLAGS =
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/include
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/tune.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(reiserfstune_SOURCES)
-
-NROFF = nroff
-MANS = $(man_MANS)
-DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(reiserfstune_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  tune/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(sbindir)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f"; \
-	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) $$p $(DESTDIR)$(sbindir)/$$f || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f $(DESTDIR)$(sbindir)/$$f"; \
-	  rm -f $(DESTDIR)$(sbindir)/$$f; \
-	done
-
-clean-sbinPROGRAMS:
-	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
-reiserfstune$(EXEEXT): $(reiserfstune_OBJECTS) $(reiserfstune_DEPENDENCIES) 
-	@rm -f reiserfstune$(EXEEXT)
-	$(LINK) $(reiserfstune_LDFLAGS) $(reiserfstune_OBJECTS) $(reiserfstune_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tune.Po@am__quote@
-
-distclean-depend:
-	-rm -rf ./$(DEPDIR)
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-uninstall-info-am:
-
-man8dir = $(mandir)/man8
-install-man8: $(man8_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(man8dir)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
-	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
-	done
-uninstall-man8:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
-	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(MANS)
-
-installdirs:
-	$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir)
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
-	distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-exec-am: install-sbinPROGRAMS
-
-install-info: install-info-am
-
-install-man: install-man8
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-man uninstall-sbinPROGRAMS
-
-uninstall-man: uninstall-man8
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-sbinPROGRAMS ctags distclean distclean-compile \
-	distclean-depend distclean-generic distclean-tags distdir dvi \
-	dvi-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man8 install-sbinPROGRAMS \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man8 uninstall-sbinPROGRAMS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644
index 0000000..f9dcdcf
--- /dev/null
+++ b/utils/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = mkfs debugfs fsck tune resizer
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644
index 0000000..97efb7c
--- /dev/null
+++ b/utils/Makefile.in
@@ -0,0 +1,446 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = utils
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIRS = mkfs debugfs fsck tune resizer
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-recursive ctags ctags-recursive \
+	distclean distclean-generic distclean-recursive distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/debugfs/Makefile.am b/utils/debugfs/Makefile.am
new file mode 100644
index 0000000..14a994d
--- /dev/null
+++ b/utils/debugfs/Makefile.am
@@ -0,0 +1,28 @@
+sbin_PROGRAMS		 = debugfs.reiserfs
+
+man_MANS		 = debugfs.reiserfs.8
+EXTRA_DIST		 = debugfs.reiserfs.8
+
+debugfs_reiserfs_SOURCES = debugreiserfs.c pack.c unpack.c stat.c corruption.c \
+			   scan.c recover.c debugreiserfs.h
+debugfs_reiserfs_LDADD	 = $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			   $(top_builddir)/libutil/libutil-static.a         \
+			   $(top_builddir)/libmisc/libmisc-static.a
+debugfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+debugfs_reiserfs_CFLAGS	 = @CFLAGS@
+
+INCLUDES		 = -I$(top_srcdir)/include
+
+uninstall-debugreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/debugreiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \
+	fi;
+
+install-debugreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/debugfs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \
+		ln $(DESTDIR)$(sbindir)/debugfs.reiserfs $(DESTDIR)$(sbindir)/debugreiserfs; \
+	fi;
+
+install-data-local: install-debugreiserfs
+uninstall-local: uninstall-debugreiserfs
diff --git a/utils/debugfs/Makefile.in b/utils/debugfs/Makefile.in
new file mode 100644
index 0000000..35c8bf9
--- /dev/null
+++ b/utils/debugfs/Makefile.in
@@ -0,0 +1,600 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(debugfs_reiserfs_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+sbin_PROGRAMS = debugfs.reiserfs$(EXEEXT)
+subdir = utils/debugfs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(sbin_PROGRAMS)
+am_debugfs_reiserfs_OBJECTS =  \
+	debugfs_reiserfs-debugreiserfs.$(OBJEXT) \
+	debugfs_reiserfs-pack.$(OBJEXT) \
+	debugfs_reiserfs-unpack.$(OBJEXT) \
+	debugfs_reiserfs-stat.$(OBJEXT) \
+	debugfs_reiserfs-corruption.$(OBJEXT) \
+	debugfs_reiserfs-scan.$(OBJEXT) \
+	debugfs_reiserfs-recover.$(OBJEXT)
+debugfs_reiserfs_OBJECTS = $(am_debugfs_reiserfs_OBJECTS)
+debugfs_reiserfs_DEPENDENCIES =  \
+	$(top_builddir)/libreiserfs/libreiserfs-static.a \
+	$(top_builddir)/libutil/libutil-static.a \
+	$(top_builddir)/libmisc/libmisc-static.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(debugfs_reiserfs_SOURCES)
+DIST_SOURCES = $(debugfs_reiserfs_SOURCES)
+man8dir = $(mandir)/man8
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+man_MANS = debugfs.reiserfs.8
+EXTRA_DIST = debugfs.reiserfs.8
+debugfs_reiserfs_SOURCES = debugreiserfs.c pack.c unpack.c stat.c corruption.c \
+			   scan.c recover.c debugreiserfs.h
+
+debugfs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			   $(top_builddir)/libutil/libutil-static.a         \
+			   $(top_builddir)/libmisc/libmisc-static.a
+
+debugfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+debugfs_reiserfs_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/debugfs/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  utils/debugfs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+	done
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+debugfs.reiserfs$(EXEEXT): $(debugfs_reiserfs_OBJECTS) $(debugfs_reiserfs_DEPENDENCIES) 
+	@rm -f debugfs.reiserfs$(EXEEXT)
+	$(LINK) $(debugfs_reiserfs_LDFLAGS) $(debugfs_reiserfs_OBJECTS) $(debugfs_reiserfs_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-corruption.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-pack.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-recover.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-scan.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-stat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugfs_reiserfs-unpack.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+debugfs_reiserfs-debugreiserfs.o: debugreiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-debugreiserfs.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" -c -o debugfs_reiserfs-debugreiserfs.o `test -f 'debugreiserfs.c' || echo '$(srcdir)/'`debugreiserfs.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='debugreiserfs.c' object='debugfs_reiserfs-debugreiserfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-debugreiserfs.o `test -f 'debugreiserfs.c' || echo '$(srcdir)/'`debugreiserfs.c
+
+debugfs_reiserfs-debugreiserfs.obj: debugreiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-debugreiserfs.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" -c -o debugfs_reiserfs-debugreiserfs.obj `if test -f 'debugreiserfs.c'; then $(CYGPATH_W) 'debugreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/debugreiserfs.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo" "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-debugreiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='debugreiserfs.c' object='debugfs_reiserfs-debugreiserfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-debugreiserfs.obj `if test -f 'debugreiserfs.c'; then $(CYGPATH_W) 'debugreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/debugreiserfs.c'; fi`
+
+debugfs_reiserfs-pack.o: pack.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-pack.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" -c -o debugfs_reiserfs-pack.o `test -f 'pack.c' || echo '$(srcdir)/'`pack.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" "$(DEPDIR)/debugfs_reiserfs-pack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pack.c' object='debugfs_reiserfs-pack.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-pack.o `test -f 'pack.c' || echo '$(srcdir)/'`pack.c
+
+debugfs_reiserfs-pack.obj: pack.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-pack.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" -c -o debugfs_reiserfs-pack.obj `if test -f 'pack.c'; then $(CYGPATH_W) 'pack.c'; else $(CYGPATH_W) '$(srcdir)/pack.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo" "$(DEPDIR)/debugfs_reiserfs-pack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-pack.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pack.c' object='debugfs_reiserfs-pack.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-pack.obj `if test -f 'pack.c'; then $(CYGPATH_W) 'pack.c'; else $(CYGPATH_W) '$(srcdir)/pack.c'; fi`
+
+debugfs_reiserfs-unpack.o: unpack.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-unpack.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" -c -o debugfs_reiserfs-unpack.o `test -f 'unpack.c' || echo '$(srcdir)/'`unpack.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" "$(DEPDIR)/debugfs_reiserfs-unpack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='unpack.c' object='debugfs_reiserfs-unpack.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-unpack.o `test -f 'unpack.c' || echo '$(srcdir)/'`unpack.c
+
+debugfs_reiserfs-unpack.obj: unpack.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-unpack.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" -c -o debugfs_reiserfs-unpack.obj `if test -f 'unpack.c'; then $(CYGPATH_W) 'unpack.c'; else $(CYGPATH_W) '$(srcdir)/unpack.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo" "$(DEPDIR)/debugfs_reiserfs-unpack.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-unpack.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='unpack.c' object='debugfs_reiserfs-unpack.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-unpack.obj `if test -f 'unpack.c'; then $(CYGPATH_W) 'unpack.c'; else $(CYGPATH_W) '$(srcdir)/unpack.c'; fi`
+
+debugfs_reiserfs-stat.o: stat.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-stat.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" -c -o debugfs_reiserfs-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" "$(DEPDIR)/debugfs_reiserfs-stat.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='stat.c' object='debugfs_reiserfs-stat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-stat.o `test -f 'stat.c' || echo '$(srcdir)/'`stat.c
+
+debugfs_reiserfs-stat.obj: stat.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-stat.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" -c -o debugfs_reiserfs-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo" "$(DEPDIR)/debugfs_reiserfs-stat.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-stat.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='stat.c' object='debugfs_reiserfs-stat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-stat.obj `if test -f 'stat.c'; then $(CYGPATH_W) 'stat.c'; else $(CYGPATH_W) '$(srcdir)/stat.c'; fi`
+
+debugfs_reiserfs-corruption.o: corruption.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-corruption.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" -c -o debugfs_reiserfs-corruption.o `test -f 'corruption.c' || echo '$(srcdir)/'`corruption.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" "$(DEPDIR)/debugfs_reiserfs-corruption.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='corruption.c' object='debugfs_reiserfs-corruption.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-corruption.o `test -f 'corruption.c' || echo '$(srcdir)/'`corruption.c
+
+debugfs_reiserfs-corruption.obj: corruption.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-corruption.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" -c -o debugfs_reiserfs-corruption.obj `if test -f 'corruption.c'; then $(CYGPATH_W) 'corruption.c'; else $(CYGPATH_W) '$(srcdir)/corruption.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo" "$(DEPDIR)/debugfs_reiserfs-corruption.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-corruption.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='corruption.c' object='debugfs_reiserfs-corruption.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-corruption.obj `if test -f 'corruption.c'; then $(CYGPATH_W) 'corruption.c'; else $(CYGPATH_W) '$(srcdir)/corruption.c'; fi`
+
+debugfs_reiserfs-scan.o: scan.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-scan.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" -c -o debugfs_reiserfs-scan.o `test -f 'scan.c' || echo '$(srcdir)/'`scan.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" "$(DEPDIR)/debugfs_reiserfs-scan.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='scan.c' object='debugfs_reiserfs-scan.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-scan.o `test -f 'scan.c' || echo '$(srcdir)/'`scan.c
+
+debugfs_reiserfs-scan.obj: scan.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-scan.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" -c -o debugfs_reiserfs-scan.obj `if test -f 'scan.c'; then $(CYGPATH_W) 'scan.c'; else $(CYGPATH_W) '$(srcdir)/scan.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo" "$(DEPDIR)/debugfs_reiserfs-scan.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-scan.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='scan.c' object='debugfs_reiserfs-scan.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-scan.obj `if test -f 'scan.c'; then $(CYGPATH_W) 'scan.c'; else $(CYGPATH_W) '$(srcdir)/scan.c'; fi`
+
+debugfs_reiserfs-recover.o: recover.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-recover.o -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" -c -o debugfs_reiserfs-recover.o `test -f 'recover.c' || echo '$(srcdir)/'`recover.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" "$(DEPDIR)/debugfs_reiserfs-recover.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='recover.c' object='debugfs_reiserfs-recover.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-recover.o `test -f 'recover.c' || echo '$(srcdir)/'`recover.c
+
+debugfs_reiserfs-recover.obj: recover.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -MT debugfs_reiserfs-recover.obj -MD -MP -MF "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" -c -o debugfs_reiserfs-recover.obj `if test -f 'recover.c'; then $(CYGPATH_W) 'recover.c'; else $(CYGPATH_W) '$(srcdir)/recover.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo" "$(DEPDIR)/debugfs_reiserfs-recover.Po"; else rm -f "$(DEPDIR)/debugfs_reiserfs-recover.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='recover.c' object='debugfs_reiserfs-recover.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(debugfs_reiserfs_CFLAGS) $(CFLAGS) -c -o debugfs_reiserfs-recover.obj `if test -f 'recover.c'; then $(CYGPATH_W) 'recover.c'; else $(CYGPATH_W) '$(srcdir)/recover.c'; fi`
+uninstall-info-am:
+install-man8: $(man8_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)"
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+uninstall-man8:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am: install-sbinPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man8
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-local uninstall-man \
+	uninstall-sbinPROGRAMS
+
+uninstall-man: uninstall-man8
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-sbinPROGRAMS ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-data-local install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-man8 install-sbinPROGRAMS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am uninstall-local uninstall-man \
+	uninstall-man8 uninstall-sbinPROGRAMS
+
+
+uninstall-debugreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/debugreiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \
+	fi;
+
+install-debugreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/debugfs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/debugreiserfs; \
+		ln $(DESTDIR)$(sbindir)/debugfs.reiserfs $(DESTDIR)$(sbindir)/debugreiserfs; \
+	fi;
+
+install-data-local: install-debugreiserfs
+uninstall-local: uninstall-debugreiserfs
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/debugfs/corruption.c b/utils/debugfs/corruption.c
new file mode 100644
index 0000000..20cd42f
--- /dev/null
+++ b/utils/debugfs/corruption.c
@@ -0,0 +1,1467 @@
+/*
+ * Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "debugreiserfs.h"
+#include "misc/unaligned.h"
+#include "util/print.h"
+
+#include <time.h>
+
+extern struct reiserfs_fsstat g_stat_info;
+
+int  do_one_ih_corrupt (reiserfs_ih_t * ih, unsigned int nr_bytes);
+int  do_one_ih_random_corrupt (reiserfs_ih_t * ih);
+
+void do_one_corruption_in_one_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, char * corruption_command);
+int corrupt_block_header (reiserfs_node_head_t * blkh, unsigned int offset, unsigned int bytes );
+void do_one_block_random_corrupt (reiserfs_bh_t * bh);
+
+static int str2int (char * str, int * res)
+{
+    int val;
+    char * tmp;
+
+    val = (int) strtol (str, &tmp, 0);
+    if (tmp == str)
+		/* could not convert string into a number */
+		return 0;
+    *res = val;
+    return 1;
+}
+
+static int get_rand (double min, double max) {
+
+	/* srand (time (0)); */
+	int ret;
+
+	ret =  (int)(min + (int)((max - min + 1) * rand() / (RAND_MAX + 1.0)));
+	if ((ret < min) || (ret > max))
+		misc_die ("get_rand failed: min %d, max %d, returned %d\n", (int)min, (int)max, ret);
+
+	return ret;
+}
+
+static void edit_journal_params (reiserfs_journal_param_t * jp)
+{
+    char str[256];
+    int num;
+
+    printf ("Journal parameters:\n");
+    printf ("\tDevice: current: %x: new:", reiserfs_jp_get_dev (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_dev (jp, num);
+
+    printf ("\tFirst block: current: %d: new:",
+	    reiserfs_jp_get_start (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_start (jp, num);
+
+    printf ("\tSize: current: %d: new:", reiserfs_jp_get_size (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_size (jp, num);
+
+    printf ("\tMagic number: current: %d: new:", reiserfs_jp_get_magic (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_magic (jp, num);
+
+    printf ("\tMax transaction size: current: %d: new:",
+	    reiserfs_jp_get_tlen (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_tlen (jp, num);
+
+    printf ("\tMax batch size: current: %d: new:",
+	    reiserfs_jp_get_max_batch (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_max_batch (jp, num);
+
+    printf ("\tMax commit age: current: %d: new:",
+	    reiserfs_jp_get_commit_age (jp));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_jp_set_commit_age (jp, num);
+}
+
+/* this allows to edit all super block fields */
+static void edit_super_block (reiserfs_filsys_t * fs)
+{
+    char str[256];
+    int num;
+
+    /* bs_block_count */
+    printf ("\tBlock count: current: %u: new:",
+	    reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_blocks (fs->fs_ondisk_sb, num);
+    
+    /* sb_free_blocks */
+    printf ("\tFree block count: current: %u: new:",
+	    reiserfs_sb_get_free (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_free (fs->fs_ondisk_sb, num);
+
+    /* sb_root_block */
+    printf ("\tRoot block: current: %u: new:",
+	    reiserfs_sb_get_root (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_root (fs->fs_ondisk_sb, num);
+
+    /* sb_journal */
+    edit_journal_params (reiserfs_sb_jp (fs->fs_ondisk_sb));
+
+    /* sb_blocksize */
+    printf ("\tBlocksize: current: %u: new:",
+	    reiserfs_sb_get_blksize (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_blksize (fs->fs_ondisk_sb, num);
+
+    /* sb_oid_maxsize */
+    printf ("\tMax objectid size: current: %u: new:",
+	    reiserfs_sb_get_mapmax (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, num);
+
+    /* sb_oid_cursize */
+    printf ("\tCur objectid size: current: %u: new:",
+	    reiserfs_sb_get_mapcur (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, num);
+
+    /* sb_state */
+    printf ("\tUmount state: current: %u: new:",
+	    reiserfs_sb_get_umount (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_umount (fs->fs_ondisk_sb, num);
+
+    /* char s_magic [10]; */
+    printf ("\tMagic: current: \"%s\": new:", fs->fs_ondisk_sb->s_v1.s_magic);
+    
+    fgets(str, sizeof(str), stdin);
+    if (strcmp (str, "\n"))
+	    strncpy (fs->fs_ondisk_sb->s_v1.s_magic, 
+		     str, strlen(str) > 10 ? 10 : strlen(str));
+
+    /* __u16 sb_fsck_state; */
+    printf ("\tFielsystem state: current: %u: new:", 
+	    reiserfs_sb_get_state (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_state (fs->fs_ondisk_sb, num);
+
+    /* __u32 sb_hash_function_code; */
+    printf ("\tHash code: current: %u: new (tea %d, r5 %d, rupasov %d):",
+	    reiserfs_sb_get_hash (fs->fs_ondisk_sb), REISERFS_HASH_TEA, 
+	    REISERFS_HASH_R5, REISERFS_HASH_YURA);
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_hash (fs->fs_ondisk_sb, num);
+
+    /* __u16 sb_tree_height; */
+    printf ("\tTree height: current: %u: new:",
+	    reiserfs_sb_get_height (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_height (fs->fs_ondisk_sb, num);
+
+    /* __u16 sb_bmap_nr; */
+    printf ("\tNumber of bitmaps: current: %u: new:",
+	    reiserfs_sb_get_bmaps (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_bmaps (fs->fs_ondisk_sb, num);
+
+    /* __u16 sb_version; */
+    printf ("\tFilesystem format: current: %u: new:",
+	    le16_to_cpu (fs->fs_ondisk_sb->s_v1.sb_version));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_version (fs->fs_ondisk_sb, num);
+
+    /* __u16 sb_reserved_for_journal; */
+    printf ("\tSpace reserved for journal: current: %u: new:",
+	    reiserfs_sb_get_reserved (fs->fs_ondisk_sb));
+    
+    fgets(str, sizeof(str), stdin);
+    if (str2int (str, &num))
+	    reiserfs_sb_set_reserved (fs->fs_ondisk_sb, num);
+
+    reiserfs_node_print (stdout, fs, fs->fs_super_bh);
+    
+    if (util_user_confirmed (stderr, "Is this ok ? [N/Yes]: ", "Yes\n")) {
+	    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+	    reiserfs_buffer_write (fs->fs_super_bh);
+    }
+}
+
+
+static void corrupt_clobber_hash (char * name, reiserfs_ih_t * ih, 
+								  reiserfs_deh_t * deh)
+{
+    printf ("\tCorrupting deh_offset of entry \"%s\" of [%u %u]\n", name,
+			reiserfs_key_get_did (&ih->ih_key), reiserfs_key_get_oid (&ih->ih_key));
+    reiserfs_deh_set_off (deh, 700);
+}
+
+
+/* this reads list of desired corruptions from stdin and perform the
+   corruptions. Format of that list:
+   A hash_code
+   C name objectid     - 'C'ut entry 'name' from directory item with 'objectid'
+   H name objectid     - clobber 'H'hash of entry 'name' of directory 'objectid'
+   I item_num pos_in_item  make pos_in_item-th slot of extent item to point out of device
+   O item_num          - destroy item 'O'rder - make 'item_num'-th to have key bigger than 'item_num' + 1-th item
+   D item_num          - 'D'elete item_num-th item
+   S item_num value    - change file size (item_num-th item must be stat data)
+   F item_num value    - change sd_fdb of stat data
+   J item_num objectid
+   E name objectid new - change entry's deh_objectid to new
+   P                   - print the block
+   B offset bytes_to_corrupt - corrupt bytes_to_corrupt bytes in block header,
+                               start from offset
+*/
+
+void do_corrupt_one_block (reiserfs_filsys_t * fs, char * fline)
+{
+	reiserfs_bh_t * bh;
+	char line[256];
+	size_t n = 0;
+	unsigned long block;
+
+	block = certain_block (fs);
+	printf ("block = %lu\n", block);
+	if (block == fs->fs_super_bh->b_blocknr) {
+		edit_super_block (fs);
+		return;
+	}
+
+	if (!fs->fs_bitmap2) {
+		reiserfs_bh_t * bm_bh;
+		unsigned long bm_block;
+
+		if (reiserfs_bitmap_spread (fs))
+			bm_block = ( block / (fs->fs_blocksize * 8) ) ? 
+				(block / (fs->fs_blocksize * 8)) * (fs->fs_blocksize * 8) : 
+					fs->fs_super_bh->b_blocknr + 1;
+		else
+			bm_block = fs->fs_super_bh->b_blocknr + 1 + (block / (fs->fs_blocksize * 8));
+
+		bm_bh = reiserfs_buffer_read (fs->fs_dev, bm_block, fs->fs_blocksize);
+		if (bm_bh) {
+			if ( misc_test_bit((block % (fs->fs_blocksize * 8)), bm_bh->b_data) )
+				fprintf (stderr, "%lu is used in ondisk bitmap\n", block);
+			else
+				fprintf (stderr, "%lu is free in ondisk bitmap\n", block);
+
+			reiserfs_buffer_close (bm_bh);
+		}
+	} else {
+		if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, block))
+			fprintf (stderr, "%lu is used in ondisk bitmap\n", block);
+		else
+			fprintf (stderr, "%lu is free in ondisk bitmap\n", block);
+	}
+
+	/* READ block */
+	bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
+	if (!bh) {
+		printf ("corrupt_one_block: reiserfs_buffer_read fialed\n");
+		return;
+	}
+
+	if (reiserfs_node_type (bh) != NT_LEAF) {
+		printf ("Can not corrupt not a leaf node\n");
+		reiserfs_buffer_close (bh);
+		return;
+	}
+
+	printf ("Corrupting block %lu..\n", bh->b_blocknr);
+
+	if (data(fs)->log_file_name) {
+		printf ("Log file : %s\n", data(fs)->log_file_name);
+	} else {
+		printf ("No Log file specified\n");
+	}
+
+	if (fline != NULL) {
+		do_one_corruption_in_one_block (fs, bh, fline);
+		if ((data(fs)->log_file_name) && (data(fs)->log)) {
+			fprintf (data(fs)->log, "%lu\n", block);
+			fprintf (data(fs)->log, "%s\n", fline);
+		}
+	} else {
+		/* Get list of corruptions from stdin */
+		while (fgets(line, sizeof(line), stdin)) {
+			if ( line [0] == '\n' ) {
+				n = 0;
+				break;
+			}
+			
+			do_one_corruption_in_one_block (fs, bh, line);
+			if ((data(fs)->log_file_name) && (data(fs)->log)) {
+				fprintf (data(fs)->log, "%lu\n", block);
+				fprintf (data(fs)->log, "%s\n", line);
+			}
+
+			line[0] = '\0';
+			n = 0;
+		}
+	}
+
+	printf ("Done\n");
+	reiserfs_buffer_write(bh);
+	reiserfs_buffer_close (bh);
+	return;
+}
+
+void do_one_corruption_in_one_block (reiserfs_filsys_t * fs,
+				     reiserfs_bh_t * bh,
+				     char * corruption_command)
+{
+    int i, j;
+    reiserfs_ih_t * ih;
+    int item_num;
+    int item_numbers;
+    int bytes_to_corrupt;
+    char code, name [100];
+    __u32 objectid, new_objectid;
+    int value;
+    int hash_code;
+    unsigned int pos_in_item;
+    int type, format;
+
+    printf ("corruption_command  : %s", corruption_command);
+
+    switch (corruption_command [0]) {
+	case '#':
+	case '\n':
+		break;
+		
+	case '?':
+		printf ("A hash_code     - reset hAsh code in super block\n"
+			"T item_num type (0, 1, 2, 3) format (0, 1)\n"
+			"C name objectid - Cut entry 'name' from directory item with 'objectid'\n"
+			"H name objectid - clobber Hash of entry 'name' of directory 'objectid'\n"
+			"I item_num pos_in_item  make pos_in_tem-th slot of Indirect item to point out of device\n"
+			"O item_num      - destroy item Order - make 'item_num'-th to have key bigger than 'item_num' + 1-th item\n"
+			"D item_num      - Delete item_num-th item\n"
+			"S item_num value - change file Size (item_num-th item must be stat data)\n"
+			"F item_num value - change sd_First_direct_byte of stat data\n"
+			"J item_num objectid - set 'obJectid' of 'item_num'-th item\n"
+			"E name objectid objectid - set deh_objectid of an entry to objectid\n"
+			"N item_numbers bytes_to_corrupt - corrupt bytes_to_corrupt in number of bytes in item_numbers items\n"
+			"B offset bytes_to_corrupt - corrupt bytes_to_corrupt in block_header, start corruption from offset\n");
+
+	    break;
+		
+	case 'P':
+		reiserfs_node_print (stderr, fs, bh, 3, -1, -1);
+		break;
+	    
+	case 'A':
+		/* corrupt hash record in super block */
+		if (sscanf (corruption_command, "%c %d\n", &code, &hash_code) != 2) {
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		reiserfs_warning (stderr, "Changing %s to %s\n",
+			reiserfs_hash_name (reiserfs_sb_get_hash (fs->fs_ondisk_sb)),
+			reiserfs_hash_name (hash_code));
+		
+		reiserfs_sb_set_hash (fs->fs_ondisk_sb, hash_code);
+		break;
+	    
+	case 'C': /* cut entry */
+	case 'H': /* make hash wrong */
+		if (sscanf (corruption_command, "%c %s %u\n", &code, name, &objectid) != 3) {
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+	  }
+		
+		ih = reiserfs_ih_at (bh, 0);
+		for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) {
+			reiserfs_deh_t * deh;
+			/* look for property objectid */
+			if (reiserfs_key_get_oid (&ih->ih_key) != objectid || !reiserfs_ih_dir (ih))
+				continue;
+
+			deh = reiserfs_deh (bh, ih);
+			
+			for (j = 0; j < reiserfs_ih_get_entries (ih); j ++, deh ++) {
+				/* look for proper entry */
+				if (reiserfs_direntry_name_len (ih, deh, j) == (int)strlen (name) &&
+					!strncmp (name, reiserfs_deh_name (deh, j), strlen (name)))
+					break;
+			}
+			if (j == reiserfs_ih_get_entries (ih)) {
+				printf ("Can't find entry %s\n", name);
+				exit (1);
+			}
+			switch (code) {
+			case 'H' : /* clobber hash */
+				corrupt_clobber_hash (name, ih, deh);
+				break;
+
+			case 'C' : /* cut entry */
+				reiserfs_leaf_delete_entry (fs, bh, i, j, 1);
+				break;
+
+			default:
+				printf ("Unknown command found\n");
+			}
+		}
+
+		if (!REISERFS_NODE_INTREE (bh)) {
+			printf ("NOTE: block is deleted from the tree\n");
+			exit (0);
+		}
+		break;
+		
+	case 'E': /* set objectid : used to simulate objectid sharing problem */
+		if (sscanf (corruption_command, "%c %s %u %d\n", &code, name, &objectid, &new_objectid) != 4) {
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		ih = reiserfs_ih_at (bh, 0);
+		for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) {
+			reiserfs_deh_t * deh;
+			/* look for property objectid */
+			if (reiserfs_key_get_oid (&ih->ih_key) != objectid || !reiserfs_ih_dir (ih))
+				continue;
+			deh = reiserfs_deh (bh, ih);
+			reiserfs_deh_set_obid (deh, new_objectid);
+			break;
+		}  
+		break;
+		
+	case 'T': /* set type of item */
+	    if (sscanf (corruption_command, "%c %d %d %d\n", &code, &item_num, &type, &format) != 4) {
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+	    }
+	    if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+			printf ("Wrong format \'%c\', wrong item_num \n", corruption_command [0]);
+			return;
+	    }
+		
+	    ih = reiserfs_ih_at (bh, item_num);
+	    reiserfs_ih_set_format (ih, format);
+	    reiserfs_key_set_type (format, &ih->ih_key, type);
+		
+	    break;
+		
+	case 'J': /* set objectid : used to simulate objectid sharing problem */
+	    if (sscanf (corruption_command, "%c %d %d\n", &code, 
+			&item_num, &objectid) != 3) 
+	    {
+			printf ("Wrong format \'%c\'\n", 
+				corruption_command [0]);
+			return;
+	    }
+	    
+	    if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+			printf ("Wrong format \'%c\', wrong item_num \n", 
+				corruption_command [0]);
+			
+			return;
+	    }
+	    
+	    ih = reiserfs_ih_at (bh, item_num);
+	    reiserfs_key_set_oid (&ih->ih_key, objectid);
+	    break;
+		
+	case 'I': /* break unformatted node pointer */
+	    if (sscanf (corruption_command, "%c %d %u\n", &code, 
+			&item_num, &pos_in_item) != 3) 
+	    {
+			printf ("Wrong format \'%c\'\n", 
+				corruption_command [0]);
+			
+			return;
+	    }
+	    if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+			printf ("Wrong format \'%c\', wrong item_num \n", 
+				corruption_command [0]);
+			
+			return;
+	    }
+	    
+	    ih = reiserfs_ih_at (bh, item_num);
+	    if (!reiserfs_ih_ext (ih) || pos_in_item >= reiserfs_ext_count (ih)) {
+	        reiserfs_warning (stderr, "Not an extent item or there is "
+				  "not so many unfm ptrs in it\n");
+			return;
+	    }
+	    
+	    d32_put((__u32 *)reiserfs_item_by_ih (bh, ih), pos_in_item, 
+		    reiserfs_sb_get_blocks (fs->fs_ondisk_sb) + 100);
+	    break;
+	    
+	case 'D': /* delete item */
+	    if (sscanf (corruption_command, "%c %d\n", &code, &item_num) != 2) 
+	    {
+			printf ("Wrong format \'%c\'\n", 
+				corruption_command [0]);
+			
+			return;
+	    }
+	    
+	    if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+			printf ("Wrong format \'%c\', wrong item_num \n", 
+				corruption_command [0]);
+			
+			return;
+	    }
+	    
+	    reiserfs_leaf_delete_item (fs, bh, item_num);
+	    break;
+		
+	case 'O': /* make item out of order */
+		{
+			reiserfs_key_t * key;
+			if (sscanf (corruption_command, "%c %d\n", &code, 
+				    &item_num) != 2) 
+			{
+				printf ("Wrong format \'%c\'\n", 
+					corruption_command [0]);
+				
+				return;
+			}
+			
+			if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+				printf ("Wrong format \'%c\', wrong item_num "
+					"\n", corruption_command [0]);
+				
+				return;
+			}
+			
+			/* destroy item order */
+			
+			if (item_num == reiserfs_nh_get_items (NODE_HEAD (bh)) - 1)
+			{
+				printf ("can not destroy order\n");
+				return;
+			}
+			
+			ih = reiserfs_ih_at (bh, item_num);
+			key = &(ih + 1)->ih_key;
+			reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (key) + 1);
+			
+			break;
+		}  
+	case 'S': /* corrupt st_size */
+		{
+			/* fixme: old stat data only */
+			reiserfs_sd_v1_t * sd;
+			
+			if (sscanf (corruption_command, "%c %d %d\n", 
+				    &code, &item_num, &value) != 3) 
+			{
+				printf ("Wrong format \'%c\'\n", 
+					corruption_command [0]);
+				
+				return;
+			}
+			
+			if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+				printf ("Wrong format \'%c\', wrong item_num "
+					"\n", corruption_command [0]);
+				
+				return;
+			}
+			
+			ih = reiserfs_ih_at (bh, item_num);
+			
+			sd = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); 
+			reiserfs_warning (stderr, "Changing sd_size of %k "
+					  "from %d to %d\n", &ih->ih_key, 
+					  reiserfs_sd_v1_size(sd), value);
+			
+			reiserfs_set_sd_v1_size( sd, value );
+			break;
+		}
+		
+    case 'F': /*         st_fdb */
+		{
+			/* fixme: old stat data only */
+			reiserfs_sd_v1_t * sd;
+			
+			if (sscanf (corruption_command, "%c %d %d\n", 
+				    &code, &item_num, &value) != 3) 
+			{
+				printf ("Wrong format \'%c\'\n", 
+					corruption_command [0]);
+				
+				return;
+			}
+			
+			if (item_num > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+				printf ("Wrong format \'%c\', wrong item_num "
+					"\n", corruption_command [0]);
+				
+				return;
+			}
+			
+			ih = reiserfs_ih_at (bh, item_num);
+			
+			sd = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih); 
+			reiserfs_warning (stderr, "Changing "
+					  "sd_fdb of %k from "
+					  "%d to %d\n", &ih->ih_key, 
+					  reiserfs_sd_v1_fdb(sd), value);
+			
+			reiserfs_set_sd_v1_fdb( sd, value );
+			break;
+		}
+		
+	case 'N': /* corrupt N number of items */
+	    if (sscanf (corruption_command, "%c %d %d\n",
+			&code, &item_numbers, &bytes_to_corrupt) != 3) 
+	    {
+		printf ("Wrong format \'%c\'\n", corruption_command [0]);
+		return;
+	    }
+		
+	    if (item_numbers > reiserfs_nh_get_items (NODE_HEAD (bh))) {
+		printf ("Wrong item_numbers %d expected not more then %d\n",
+			item_numbers, reiserfs_nh_get_items (NODE_HEAD (bh)));
+		return;
+	    }
+		
+	    for (i = 0; i < item_numbers; i++) { 
+		printf ("Do corruptions :  %d item header; \n", i );
+		ih = reiserfs_ih_at (bh, i);
+		do_one_ih_corrupt (ih, bytes_to_corrupt);
+		printf ("Ok\n");
+	    }
+		
+	    break;
+	case 'B' :
+	    {
+		reiserfs_node_head_t * blkh;
+		unsigned int offset;
+			
+		if (sscanf (corruption_command, "%c %d %d\n",
+			    &code, &offset, &bytes_to_corrupt) != 3) 
+		{
+		    printf ("Wrong format \'%c\'\n", corruption_command [0]);
+		    return;
+		}
+			
+		blkh = NODE_HEAD (bh);
+		corrupt_block_header (blkh, offset, bytes_to_corrupt);
+		break;
+	    }
+	default:
+		printf ("Unknown command found\n");
+	}
+    
+    reiserfs_buffer_mkdirty (bh);
+    return;
+}
+
+/* corrupt first nr_bytes bytes in item header */
+int do_one_ih_corrupt (reiserfs_ih_t * ih, unsigned int nr_bytes)
+{
+	if (nr_bytes > REISERFS_IH_SIZE) {
+		printf ("Bad byte number %u expected not more then %lu\n", 
+			nr_bytes, (unsigned long)REISERFS_IH_SIZE);
+		exit (1);
+	}
+
+	if (memset ((char *)ih, 0, nr_bytes) != ih ) {
+		perror ("do_one_ih_corrupt: memset failed");
+		exit (1);
+	}
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "\tfirst %u bytes corrupted\n", 
+			 nr_bytes);
+
+	printf ("\tfirst %u bytes corrupted\n", nr_bytes);
+	return 0;
+}
+
+/* item header random corruption */
+int do_one_ih_random_corrupt (reiserfs_ih_t * ih)
+{
+	unsigned int i;
+	unsigned int from;
+	unsigned int count;
+		
+	from = get_rand (0,  REISERFS_IH_SIZE - 1);
+	count = get_rand (1, REISERFS_IH_SIZE);
+
+	if (from + count > REISERFS_IH_SIZE)
+		count = REISERFS_IH_SIZE - from;
+
+	for (i = from; i < from + count; i ++)
+		((char *)ih)[i] = get_rand(0, 255);
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "\tfrom %u ( %u )\n", from, count);
+
+	printf ("\tfrom %u ( %u )\n",  from, count);
+	return 0;
+}
+
+/* Corrupt n bytes in block header */
+int corrupt_block_header (reiserfs_node_head_t * blkh, unsigned int offset, 
+			  unsigned int bytes) 
+{
+	if ((offset + bytes) > REISERFS_NODEH_SIZE) {
+		printf ("Bad offset number: %u or bad bytes number: %u, "
+			"the suumary value expected not more then %lu\n", 
+			offset, bytes, (unsigned long)REISERFS_NODEH_SIZE);
+		exit (1);
+	} 
+
+	if (memset ((char *)blkh, 0, bytes) != blkh ) {
+		perror ("corrupt_block_head: memset failed");
+		exit (1);   
+	}
+
+	printf ("offset : %u, corrupt %u bytes\n", offset, bytes);
+	return 0;
+}
+
+/* corrupt random number of bytes within block header started from random
+   offset */
+void do_one_blkh_random_corrupt (reiserfs_bh_t * bh)
+{
+	reiserfs_node_head_t * blkh;
+	unsigned int from;
+	unsigned int count;
+	unsigned int i;
+
+	from = get_rand (0, REISERFS_NODEH_SIZE - 1);
+	count = get_rand (1, REISERFS_NODEH_SIZE);
+
+	blkh = NODE_HEAD (bh);
+
+	if (from + count > REISERFS_NODEH_SIZE)
+		count = REISERFS_NODEH_SIZE - from;
+
+	for (i = from; i < from + count; i ++)
+		((char *)blkh)[i] = get_rand(0, 255);
+
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "# : %lu #    ", bh->b_blocknr);
+		fprintf (data(fs)->log, "from %u (%u)\n", from, count);
+	}
+
+	printf ("# : %lu #   ", bh->b_blocknr);
+	printf ("from %u (%u)\n", from, count);
+
+}
+
+void do_leaves_corruption (reiserfs_filsys_t * fs,
+			   unsigned long nr_leaves_cr) 
+{
+	reiserfs_bh_t * bh;
+	unsigned long nr_leaves = 0;
+	unsigned int i, should_be_corrupted;
+
+	srand (time (0));
+	printf ("%lu leaves will be corrupted\n", nr_leaves_cr);
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "Block headers in %lu leaves "
+			 "will be corrupted\n", nr_leaves_cr);
+	}
+
+	if (reiserfs_bitmap_open (fs) < 0)
+		reiserfs_exit (1, "Could not open ondisk bitmap");
+
+	for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) &&
+	     nr_leaves < nr_leaves_cr; i ++) {
+
+		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
+			continue;
+
+		bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
+		if (!bh) {
+			reiserfs_warning (stderr, "could not read "
+					  "block %lu\n", i);
+			continue;
+		}
+
+		if (reiserfs_node_type (bh) != NT_LEAF) {
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		if ((!reiserfs_leaf_head (bh)) || 
+		    (reiserfs_journal_block (fs, i))) 
+		{
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		should_be_corrupted = 
+			(unsigned int)get_rand ((double)0, (double)1);
+
+		if (should_be_corrupted == 0)
+		{
+			reiserfs_buffer_close (bh);
+			continue;
+		}
+
+		do_one_blkh_random_corrupt (bh);
+		/* do_one_block_random_corrupt (bh); */
+		reiserfs_buffer_mkdirty (bh);
+		reiserfs_buffer_write(bh);
+		reiserfs_buffer_close (bh);
+		nr_leaves ++;
+	}
+
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "%lu leaves WERE corrupted\n",
+			 nr_leaves);
+	}
+
+	printf ("%lu leaves WERE corrupted\n", nr_leaves);
+
+	reiserfs_bitmap_close (fs);
+	return;
+}
+
+void do_one_block_random_corrupt (reiserfs_bh_t * bh) 
+{
+	unsigned int from = get_rand (0, bh->b_size - 1);
+	unsigned int count = get_rand (1, bh->b_size);
+	unsigned int i;
+
+	if (from + count > bh->b_size)
+		count = bh->b_size - from;
+
+	for (i = from; i < from + count; i ++)
+		((char *)bh->b_data)[i] = get_rand(0, 255);
+
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "# block %lu: ", bh->b_blocknr);
+		fprintf (data(fs)->log, "from %u ( %u )\n", from, count);
+	}
+
+	printf ("# block %lu: ", bh->b_blocknr);
+	printf ("from %u ( %u )\n", from, count);
+	
+}
+
+void do_bitmap_corruption (reiserfs_filsys_t * fs)
+{
+
+	unsigned long first = fs->fs_super_bh->b_blocknr + 1;
+	unsigned long nr_bitmap_to_corrupt;
+	unsigned long block, bmap_nr;;
+	reiserfs_bh_t * bh;
+	unsigned int i;
+
+	bmap_nr = reiserfs_bmap_nr(
+		reiserfs_sb_get_blocks(fs->fs_ondisk_sb),
+		fs->fs_blocksize);
+	
+	nr_bitmap_to_corrupt = (unsigned long)get_rand (1, bmap_nr - 1);
+
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "%lu bitmaps will be "
+			 "corrupted\n", nr_bitmap_to_corrupt);
+	}
+	printf ("%lu bitmaps will be corrupted\n", nr_bitmap_to_corrupt);
+	
+	for (i = 0; i < nr_bitmap_to_corrupt; i ++ ) {
+		block = ( i == 0 ) ? first : fs->fs_blocksize * 8 * i;
+		
+		bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
+		
+		if (!bh) {
+			printf ("do_bitmap_corruption: reiserfs_buffer_read "
+				"failed for bitmap %d: %lu\n", i, block);
+			exit (1);
+		}
+		
+		do_one_block_random_corrupt (bh);
+		reiserfs_buffer_mkdirty (bh);
+		reiserfs_buffer_write(bh);
+		reiserfs_buffer_close (bh);
+	}
+} 
+
+/* corrupt the random number of item headers in random number of leaves */
+void do_ih_random_corrupt (reiserfs_filsys_t * fs, unsigned long nr_leaves_cr) 
+{
+	unsigned int nr_ih_cr;
+	unsigned int i, j;
+	reiserfs_bh_t * bh;
+	reiserfs_ih_t * ih;
+	unsigned long nr_leaves = 0;
+	unsigned int should_be_corrupted = 0;
+
+	srand (time (0));
+
+	printf ("item headers in %lu leaves will be corrupted\n", 
+		nr_leaves_cr);
+
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "item headers in %lu leaves will "
+			 "be corrupted\n", nr_leaves_cr);
+	}
+
+	if (reiserfs_bitmap_open (fs) < 0)
+		reiserfs_exit (1, "Could not open ondisk bitmap");
+
+	for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) &&
+	     nr_leaves < nr_leaves_cr; i ++) {
+
+		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
+			continue;
+
+		bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
+		if (!bh) {
+			reiserfs_warning (stderr, "could not read "
+					  "block %lu\n", i);
+			continue;
+		}
+
+		if (reiserfs_node_type (bh) != NT_LEAF) {
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		if ((!reiserfs_leaf_head (bh)) || 
+		    (reiserfs_journal_block (fs, i))) 
+		{
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		should_be_corrupted = 
+			(unsigned int) get_rand ((double)0, (double)1);
+
+		if (should_be_corrupted == 0) {
+			reiserfs_buffer_close (bh);
+			continue;
+		}
+
+		nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh)));
+
+		for (j = 0; j < nr_ih_cr; j ++ ) {
+			should_be_corrupted = 
+				(unsigned int) get_rand ((double)0, (double)1);
+
+			if (should_be_corrupted == 0)
+				continue;
+
+			if ((data(fs)->log_file_name) && (data(fs)->log))
+				fprintf (data(fs)->log, "# block %lu , "
+					 "item header %d\n", bh->b_blocknr, j);
+
+			printf ("# block %lu , item header %d\n", 
+				bh->b_blocknr, j);
+
+			ih = reiserfs_ih_at (bh, j);
+			do_one_ih_random_corrupt (ih);
+		}
+
+		reiserfs_buffer_mkdirty (bh);
+		reiserfs_buffer_write(bh);
+		reiserfs_buffer_close (bh);
+		nr_leaves ++ ;
+	}
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "item headers in %lu leaves "
+			 "WERE corrupted\n", nr_leaves);
+
+	printf ("item headers in %lu leaves WERE corrupted\n", nr_leaves);
+	reiserfs_bitmap_close (fs);
+}
+
+/* corrupt item */
+void do_one_item_random_corrupt (reiserfs_bh_t * bh,
+				 reiserfs_ih_t * ih)
+{
+	unsigned int i;
+	unsigned int from;
+	unsigned int count;
+	char * p;
+
+	p = (char *)reiserfs_item_by_ih(bh, ih);
+
+	from = get_rand (0, reiserfs_ih_get_len(ih)  - 1);
+	count = get_rand (1, reiserfs_ih_get_len(ih));
+
+	if (from + count > reiserfs_ih_get_len(ih))
+		count = reiserfs_ih_get_len(ih) - from;
+
+	for (i = from; i < from + count; i ++)
+		((char *)p)[i] = get_rand(0, 255);
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "item body \tfrom %u ( %u )\n", 
+			 from, count);
+
+	printf ("item body \tfrom %u ( %u )\n",  from, count);
+	return ;
+}
+
+
+/* corrupt the random number of directory items in random number of leaves */
+void do_dir_random_corrupt (reiserfs_filsys_t * fs,
+			    unsigned long nr_leaves_cr) 
+{
+	unsigned int nr_ih_cr;
+	unsigned int i, j;
+	reiserfs_bh_t * bh;
+	reiserfs_ih_t * ih;
+	unsigned long nr_leaves = 0;
+	unsigned int should_be_corrupted = 0;
+
+	srand (time (0));
+
+	printf ("DIR items in %lu leaves will be corrupted\n", nr_leaves_cr);
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "DIR items in %lu leaves "
+			 "will be corrupted\n", nr_leaves_cr);
+	}
+
+	if (reiserfs_bitmap_open (fs) < 0)
+		reiserfs_exit (1, "Could not open ondisk bitmap");
+
+	for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) &&
+	     nr_leaves < nr_leaves_cr; i ++) {
+
+		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
+			continue;
+
+		bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
+		if (!bh) {
+			reiserfs_warning (stderr, "could not read "
+					  "block %lu\n", i);
+			continue;
+		}
+
+		if (reiserfs_node_type (bh) != NT_LEAF) {
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		if ((!reiserfs_leaf_head (bh)) || 
+		    (reiserfs_journal_block (fs, i))) 
+		{
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		should_be_corrupted = 
+			(unsigned int) get_rand ((double)0, (double)1);
+
+		if (should_be_corrupted == 0) {
+			reiserfs_buffer_close (bh);
+			continue;
+		}
+
+		/* get next item, look is it a DIR */
+		nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh)));
+
+		for (j = 0; j < nr_ih_cr; j ++ ) {
+			should_be_corrupted = 
+				(unsigned int) get_rand ((double)0, (double)1);
+
+			if (should_be_corrupted == 0)
+				continue;
+
+			if ((data(fs)->log_file_name) && (data(fs)->log))
+				fprintf (data(fs)->log, "# block %lu , item "
+					 "%d\n", bh->b_blocknr, j);
+
+			printf ("# block %lu , item %d\n", bh->b_blocknr, j);
+
+			ih = reiserfs_ih_at (bh, j);
+
+			if (reiserfs_key_get_type (&ih->ih_key) != 
+			    TYPE_DIRENTRY)
+			{
+				continue;
+			}
+
+			do_one_item_random_corrupt (bh, ih);
+		}
+
+		reiserfs_buffer_mkdirty (bh);
+		reiserfs_buffer_write(bh);
+		reiserfs_buffer_close (bh);
+		nr_leaves ++ ;
+	}
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "DIR items in %lu leaves WERE "
+			 "corrupted\n", nr_leaves);
+
+	printf ("DIR items in %lu leaves WERE corrupted\n", nr_leaves);
+	reiserfs_bitmap_close (fs);
+}
+
+/* corrupt the random number of stat data items in random number of leaves */
+void do_sd_random_corrupt (reiserfs_filsys_t * fs,
+			   unsigned long nr_leaves_cr) 
+{
+	unsigned int nr_ih_cr;
+	unsigned int i, j;
+	reiserfs_bh_t * bh;
+	reiserfs_ih_t * ih;
+	unsigned long nr_leaves = 0;
+	unsigned int should_be_corrupted = 0;
+
+	srand (time (0));
+
+	printf ("SD items in %lu leaves will be corrupted\n", nr_leaves_cr);
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "SD items in %lu leaves will "
+			 "be corrupted\n", nr_leaves_cr);
+	}
+
+	if (reiserfs_bitmap_open (fs) < 0)
+		reiserfs_exit (1, "Could not open ondisk bitmap");
+
+	for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) &&
+	     nr_leaves < nr_leaves_cr; i ++) {
+
+		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
+			continue;
+
+		bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
+		if (!bh) {
+			reiserfs_warning (stderr, "could not read block %lu\n", i);
+			continue;
+		}
+
+		if (reiserfs_node_type (bh) != NT_LEAF) {
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		if ((!reiserfs_leaf_head (bh)) || 
+		    (reiserfs_journal_block (fs, i))) 
+		{
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		should_be_corrupted = 
+			(unsigned int) get_rand ((double)0, (double)1);
+
+		if (should_be_corrupted == 0) {
+			reiserfs_buffer_close (bh);
+			continue;
+		}
+
+		/* get next item, look is it a SD */
+		nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh))); 
+
+		for (j = 0; j < nr_ih_cr; j ++ ) {
+			should_be_corrupted = 
+				(unsigned int) get_rand ((double)0, (double)1);
+
+			if (should_be_corrupted == 0)
+				continue;
+
+			if ((data(fs)->log_file_name) && (data(fs)->log))
+				fprintf (data(fs)->log, "# block %lu , item "
+					 "%d\n", bh->b_blocknr, j);
+
+			printf ("# block %lu , item %d\n", bh->b_blocknr, j);
+
+			ih = reiserfs_ih_at (bh, j);
+			if (reiserfs_key_get_type (&ih->ih_key) != 
+			    TYPE_STAT_DATA)
+			{
+				continue;
+			}
+
+			do_one_item_random_corrupt (bh, ih);
+		}
+
+		reiserfs_buffer_mkdirty (bh);
+		reiserfs_buffer_write(bh);
+		reiserfs_buffer_close (bh);
+		nr_leaves ++ ;
+	}
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "SD items in %lu leaves "
+			 "WERE corrupted\n", nr_leaves);
+
+	printf ("SD items in %lu leaves WERE corrupted\n", nr_leaves);
+	reiserfs_bitmap_close (fs);
+}
+
+/* corrupt the random number of indirect items in random number of leaves */
+void do_ext_random_corrupt (reiserfs_filsys_t * fs,
+			    unsigned long nr_leaves_cr) 
+{
+	unsigned int nr_ih_cr;
+	unsigned int i, j;
+	reiserfs_bh_t * bh;
+	reiserfs_ih_t * ih;
+	unsigned long nr_leaves = 0;
+	unsigned int should_be_corrupted = 0;
+
+	srand (time (0));
+
+	printf ("EXT items in %lu leaves will be corrupted\n", nr_leaves_cr);
+	if ((data(fs)->log_file_name) && (data(fs)->log)) {
+		fprintf (data(fs)->log, "EXT items in %lu leaves will "
+			 "be corrupted\n", nr_leaves_cr);
+	}
+
+	if (reiserfs_bitmap_open (fs) < 0)
+		reiserfs_exit (1, "Could not open ondisk bitmap");
+
+	for (i = 0; (i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) &&
+	     nr_leaves < nr_leaves_cr; i ++) {
+
+		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i))
+			continue;
+
+		bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
+		if (!bh) {
+			reiserfs_warning (stderr, "could not read "
+					  "block %lu\n", i);
+			continue;
+		}
+
+		if (reiserfs_node_type (bh) != NT_LEAF) {
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		if ((!reiserfs_leaf_head (bh)) || 
+		    (reiserfs_journal_block (fs, i))) 
+		{
+			reiserfs_buffer_close (bh);	
+			continue;
+		}
+
+		should_be_corrupted = 
+			(unsigned int) get_rand ((double)0, (double)1);
+
+		if (should_be_corrupted == 0)
+		{
+			reiserfs_buffer_close (bh);
+			continue;
+		}
+
+		/* get next item, look is it an EXT */
+		nr_ih_cr = get_rand (1, reiserfs_nh_get_items (NODE_HEAD (bh))); 
+
+		for (j = 0; j < nr_ih_cr; j ++ ) {
+			should_be_corrupted = 
+				(unsigned int) get_rand ((double)0, (double)1);
+
+			if (should_be_corrupted == 0)
+				continue;
+
+			ih = reiserfs_ih_at (bh, j);
+
+			if (reiserfs_key_get_type (&ih->ih_key) != 
+			    TYPE_EXTENT)
+			{
+				continue;
+			}
+
+			if ((data(fs)->log_file_name) && (data(fs)->log))
+				fprintf (data(fs)->log, "# block %lu , item "
+					 "%d\n", bh->b_blocknr, j);
+
+			printf ("# block %lu , item %d\n", bh->b_blocknr, j);
+			do_one_item_random_corrupt (bh, ih);
+		}
+
+		reiserfs_buffer_mkdirty (bh);
+		reiserfs_buffer_write(bh);
+		reiserfs_buffer_close (bh);
+		nr_leaves ++ ;
+	}
+
+	if ((data(fs)->log_file_name) && (data(fs)->log))
+		fprintf (data(fs)->log, "EXT items in %lu leaves "
+			 "WERE corrupted\n", nr_leaves);
+
+	printf ("EXT items in %lu leaves WERE corrupted\n", nr_leaves);
+	reiserfs_bitmap_close (fs);
+}
+
+/* this reads list of desired corruptions from stdin and performs the
+   corruptions. Format of that list:
+   B           - the random number of bitmap to be corrupted
+   L nr_leaves - block headers in nr_leaves leaves to be corupted
+   H nr_leaves - the random number of item headers in nr_leaves to be corrupted
+   S nr_leaves - the random number of stat data items in nr_leaves to be
+                 corrupted
+   D nr_leaves - the random number of directory items in nr_leaves to be
+                 corrupted
+   I nr_leaves - the random number of extent items in nr_leaves to be
+                 corrupted
+*/
+
+void what_to_corrupt (reiserfs_filsys_t * fs, char * corruption_command)
+{
+	unsigned long nr_leaves_cr;
+	char code;
+
+	switch (corruption_command [0]){
+	case 'B' :
+		/* bitmap */
+		do_bitmap_corruption (fs);
+		break;
+
+	case 'L' :
+		/* leaves */
+		if (sscanf (corruption_command, "%c %lu\n", 
+			    &code, &nr_leaves_cr) != 2) 
+		{
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		
+		do_leaves_corruption (fs, nr_leaves_cr);		
+		break;
+
+	case 'H' :
+		/* item headers */
+		if (sscanf (corruption_command, "%c %lu\n", 
+			    &code, &nr_leaves_cr) != 2) 
+		{
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		
+		do_ih_random_corrupt (fs, nr_leaves_cr);
+		break;
+
+	case 'D' :
+		/* directory items */
+		if (sscanf (corruption_command, "%c %lu\n", 
+			    &code, &nr_leaves_cr) != 2) 
+		{
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		
+		do_dir_random_corrupt (fs, nr_leaves_cr);
+		break;
+
+	case 'S' :
+		/* stat data items */
+		if (sscanf (corruption_command, "%c %lu\n", 
+			    &code, &nr_leaves_cr) != 2) 
+		{
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		
+		do_sd_random_corrupt (fs, nr_leaves_cr);
+		break;
+
+	case 'I' :
+		/* extent items */
+		if (sscanf (corruption_command, "%c %lu\n", 
+			    &code, &nr_leaves_cr) != 2) 
+		{
+			printf ("Wrong format \'%c\'\n", corruption_command [0]);
+			return;
+		}
+		
+		do_ext_random_corrupt (fs, nr_leaves_cr);
+		break;
+
+	default :
+		printf ("Unknown command specified\n");
+	}
+}
+
+void do_fs_random_corrupt (reiserfs_filsys_t * fs)
+{
+    char line[256];
+    size_t n = 0;
+
+    printf ("Corrupting fs. Please insert one of the following command\n"
+			" B - the random number of bitmap to be corrupted\n"
+			" L nr_leaves - block headers in nr_leaves leaves to be corupted\n"
+			" H nr_leaves - the random number of item headers in nr_leaves to be corrupted\n"
+			" S nr_leaves - the random number of stat data items in nr_leaves to be corrupted\n"
+			" D nr_leaves - the random number of directory items in nr_leaves to be corrupted\n"
+			" I nr_leaves - the random number of extent items in nr_leaves to be corrupted\n"
+			".. ->\n");
+
+	/* Get list of corruptions from stdin */
+	while (fgets(line, sizeof(line), stdin)) {
+		if ( line [0] == '\n' ) {
+			n = 0;
+			break;
+		}
+		printf ("################## command : %s", line);
+		if ((data(fs)->log_file_name) && (data(fs)->log)) {
+			fprintf (data(fs)->log, "################## command : %s", line);
+		}
+
+		what_to_corrupt (fs, line);
+		
+		line[0] = '\0';
+		n = 0;
+	}
+}
+
+/*
+   Local variables:
+   c-indentation-style: "K&R"
+   mode-name: "LC"
+   c-basic-offset: 4
+   tab-width: 4
+   fill-column: 80
+   End:
+*/
+
+
+
+
+
+
+
+
diff --git a/debugreiserfs/debugreiserfs.8 b/utils/debugfs/debugfs.reiserfs.8
similarity index 75%
rename from debugreiserfs/debugreiserfs.8
rename to utils/debugfs/debugfs.reiserfs.8
index 0f89591..2faff02 100644
--- a/debugreiserfs/debugreiserfs.8
+++ b/utils/debugfs/debugfs.reiserfs.8
@@ -1,11 +1,11 @@
 .\" -*- nroff -*-
 .\" Copyright 1996-2004 Hans Reiser.
 .\" 
-.TH DEBUGREISERFS 8 "February 2004" "Reiserfsprogs 3.6.19"
+.TH debugfs.reiserfs 8 "February 2004" "Reiserfsprogs 3.6.19"
 .SH NAME
-debugreiserfs \- The debugging tool for the ReiserFS filesystem.
+debugfs.reiserfs \- The debugging tool for the ReiserFS filesystem.
 .SH SYNOPSIS
-.B debugreiserfs
+.B debugfs.reiserfs
 [
 .B -dDJmoqpuSV
 ] [
@@ -21,7 +21,7 @@
 .\" ] [
 .I device
 .SH DESCRIPTION
-\fBdebugreiserfs\fR sometimes helps to solve problems with reiserfs filesystems. 
+\fBdebugfs.reiserfs\fR sometimes helps to solve problems with reiserfs filesystems. 
 When run without options it prints the super block of the ReiserFS filesystem found
 on the \fIdevice\fR.
 .TP
@@ -61,37 +61,37 @@
 .\" formatted nodes found. Can be used to find specific key in the filesystem.
 .\" .TP
 .B -p
-extracts the filesystem's metadata with \fBdebugreiserfs\fR -p /dev/xxx | gzip -c > 
+extracts the filesystem's metadata with \fBdebugfs.reiserfs\fR -p /dev/xxx | gzip -c > 
 xxx.gz. None of your data are packed unless a filesystem corruption presents when 
 the whole block having this corruption is packed. You send us the output, and we use 
-it to create a filesystem with the same strucure as yours using \fBdebugreiserfs -u\fR.
+it to create a filesystem with the same strucure as yours using \fBdebugfs.reiserfs -u\fR.
 When the data file is not too large, this usually allows us to quickly reproduce 
 and debug the problem.
 .TP
 .B -u
-builds the ReiserFS filesystem image with gunzip -c xxx.gz | \fBdebugreiserfs\fR 
--u /dev/image of the previously packed metadata with \fBdebugreiserfs -p\fR. The
+builds the ReiserFS filesystem image with gunzip -c xxx.gz | \fBdebugfs.reiserfs\fR 
+-u /dev/image of the previously packed metadata with \fBdebugfs.reiserfs -p\fR. The
 result image is not the same as the original filesystem, because mostly only metadata
-were packed with \fBdebugreiserfs -p\fR, but the filesystem structure is completely 
+were packed with \fBdebugfs.reiserfs -p\fR, but the filesystem structure is completely 
 recreated.
 .TP
 .B -S 
 When -S is not specified -p 
 .\" and -s 
 deals with blocks marked used in the filesystem bitmap only. With this option 
-set \fBdebugreiserfs\fR will work with the entire device.
+set \fBdebugfs.reiserfs\fR will work with the entire device.
 .TP
 .B -q
 When 
 .\" -s or 
 -p is in use, suppress showing the speed of progress.
 .SH AUTHOR
-This version of \fBdebugreiserfs\fR has been written by Vitaly Fertman 
+This version of \fBdebugfs.reiserfs\fR has been written by Vitaly Fertman 
 <vitaly@namesys.com>.
 .SH BUGS
 Please report bugs to the ReiserFS developers <reiserfs-dev@namesys.com>, providing
 as much information as possible--your hardware, kernel, patches, settings, all printed
 messages; check the syslog file for any related information.
 .SH SEE ALSO
-.BR reiserfsck (8),
-.BR mkreiserfs (8)
+.BR fsck.reiserfs (8),
+.BR mkfs.reiserfs (8)
diff --git a/debugreiserfs/debugreiserfs.c b/utils/debugfs/debugreiserfs.c
similarity index 69%
rename from debugreiserfs/debugreiserfs.c
rename to utils/debugfs/debugreiserfs.c
index 3435626..c94715f 100644
--- a/debugreiserfs/debugreiserfs.c
+++ b/utils/debugfs/debugreiserfs.c
@@ -3,7 +3,19 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include "debugreiserfs.h"
+#include "misc/unaligned.h"
+#include "misc/malloc.h"
+#include "util/misc.h"
+#include "util/print.h"
+
+#include <getopt.h>
+#include <errno.h>
+#include <fcntl.h>
 
 reiserfs_filsys_t * fs;
 
@@ -69,52 +81,51 @@
 
 static void print_disk_tree (reiserfs_filsys_t * fs, unsigned long block_nr)
 {
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     int i, j, count;
     static int level = -1;
 	
     if (level == -1)
-	    level = get_sb_tree_height (fs->fs_ondisk_sb);
+	    level = reiserfs_sb_get_height (fs->fs_ondisk_sb);
 
-    bh = bread (fs->fs_dev, block_nr, fs->fs_blocksize);
+    bh = reiserfs_buffer_read (fs->fs_dev, block_nr, fs->fs_blocksize);
     if (!bh) {
-	    die ("Could not read block %lu\n", block_nr);
+	    misc_die ("Could not read block %lu\n", block_nr);
     }
     level --;
 
     if (level < 1)
-	    die ("level too small");
+	    misc_die ("level too small");
 	
-    if (level != get_blkh_level (B_BLK_HEAD (bh))) {
+    if (level != reiserfs_nh_get_level (NODE_HEAD (bh))) {
 	    printf ("%d expected, %d found in %lu\n", level, 
-		    get_blkh_level (B_BLK_HEAD (bh)), bh->b_blocknr);
+		    reiserfs_nh_get_level (NODE_HEAD (bh)), bh->b_blocknr);
     }
 
-    if (is_internal_node (bh)) {
-	    struct disk_child * dc;
+    if (reiserfs_int_head (bh)) {
+	    reiserfs_dc_t * dc;
 
 	    g_stat_info.nr_internals ++;
-	    print_block (stdout, fs, bh, 
-			 data(fs)->options & PRINT_TREE_DETAILS, -1, -1);
+	    reiserfs_node_print (stdout, fs, bh, data(fs)->options, -1, -1);
 
-	    dc = B_N_CHILD (bh, 0);
-	    count = B_NR_ITEMS(bh);
+	    dc = reiserfs_int_at (bh, 0);
+	    count = reiserfs_node_items(bh);
 	    for (i = 0; i <= count; i++, dc++)
-		    print_disk_tree (fs, get_dc_child_blocknr (dc));
-    } else if (is_leaf_node (bh)) {
-	    struct item_head *ih;
+		    print_disk_tree (fs, reiserfs_dc_get_nr (dc));
+    } else if (reiserfs_leaf_head (bh)) {
+	    reiserfs_ih_t *ih;
 
 	    g_stat_info.nr_leaves ++;
-	    print_block (stdout, fs, bh, 
-			 data (fs)->options & PRINT_TREE_DETAILS, -1, -1);
+	    reiserfs_node_print (stdout, fs, bh, data(fs)->options, -1, -1);
 
-	    ih = B_N_PITEM_HEAD (bh, 0);
-	    count = leaf_item_number_estimate(bh);
+	    ih = reiserfs_ih_at (bh, 0);
+	    count = reiserfs_leaf_estimate_items(bh);
 	    for (i = 0; i < count; i++, ih++) {
-		    if (is_indirect_ih(ih)) {
-			    __u32 * ind_item = (__u32 *)B_I_PITEM (bh, ih);
+		    if (reiserfs_ih_ext(ih)) {
+			    __u32 * ind_item = 
+				    (__u32 *)reiserfs_item_by_ih (bh, ih);
 
-			    for (j =  0; j < (int)I_UNFM_NUM (ih); j ++) {
+			    for (j =  0; j < (int)reiserfs_ext_count (ih); j ++) {
 				    if (d32_get (ind_item, j)) {
 					    g_stat_info.nr_unformatted += 1;
 				    }
@@ -122,13 +133,12 @@
 		    }
 	    }
     } else {
-	    print_block (stdout, fs, bh, 
-			 data (fs)->options & PRINT_TREE_DETAILS, -1, -1);
+	    reiserfs_node_print (stdout, fs, bh, data(fs)->options, -1, -1);
 	    
 	    reiserfs_warning (stdout, "print_disk_tree: bad block "
 			      "type (%b)\n", bh);
     }
-    brelse (bh);
+    reiserfs_buffer_close (bh);
     level ++;
 }
 
@@ -136,37 +146,38 @@
 {
     int type;
     unsigned long done = 0, total;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     unsigned int j;
 	
     total = reiserfs_bitmap_ones (input_bitmap(fs));
 	
-    for (j = 0; j < get_sb_block_count (fs->fs_ondisk_sb); j ++) {
-		if (!reiserfs_bitmap_test_bit (input_bitmap (fs), j))
-			continue;
+    for (j = 0; j < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); j ++) {
+	if (!reiserfs_bitmap_test_bit (input_bitmap (fs), j))
+	    continue;
+	
+	if (!misc_test_bit(PRINT_QUIET, &data(fs)->options))
+	    util_misc_progress (stderr, &done, total, 1, 0);
 		
-		print_how_far (stderr, &done, total, 1, be_quiet (fs));
+	bh = reiserfs_buffer_read (fs->fs_dev, j, fs->fs_blocksize);
+	if (!bh) {
+	    reiserfs_warning (stderr, "could not read block %lu\n", j);
+	    continue;
+	}
+
+	type = reiserfs_node_type (bh);
+	if (type != NT_UNKNOWN) {
+	    reiserfs_node_print (stdout, fs, bh, 
+		(1 << LP_LEAF_DETAILS) | (1 << LP_DIRECT_ITEMS), -1, -1);
+	}
 		
-		bh = bread (fs->fs_dev, j, fs->fs_blocksize);
-		if (!bh) {
-			reiserfs_warning (stderr, "could not read block %lu\n", j);
-			continue;
-		}
-		
-		type = who_is_this (bh->b_data, bh->b_size);
-		if (type != THE_UNKNOWN) {
-			print_block (stdout, fs, bh, 
-				     PRINT_TREE_DETAILS | PRINT_DIRECT_ITEMS, 
-				     -1, -1);
-		}
-		
-		if (type == THE_INTERNAL)
-			g_stat_info.nr_internals ++;
-		else if (type == THE_LEAF || type == HAS_IH_ARRAY)
-			g_stat_info.nr_leaves ++;
-	    
-		brelse (bh);
+	if (type == NT_INTERNAL)
+	    g_stat_info.nr_internals ++;
+	else if (type == NT_LEAF || type == NT_IH_ARRAY)
+	    g_stat_info.nr_leaves ++;
+
+	reiserfs_buffer_close (bh);
     }
+    
     fprintf (stderr, "\n");
 }
 
@@ -174,13 +185,13 @@
 void pack_one_block (reiserfs_filsys_t * fs, unsigned long block);
 static void print_one_block (reiserfs_filsys_t * fs, unsigned long block)
 {
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     
     if (!fs->fs_bitmap2) {
-        struct buffer_head * bm_bh;
+        reiserfs_bh_t * bm_bh;
         unsigned long bm_block;
         
-        if (spread_bitmaps (fs))
+        if (reiserfs_bitmap_spread (fs))
 		bm_block = 
 			( block / (fs->fs_blocksize * 8) ) ? 
 			(block / (fs->fs_blocksize * 8)) * 
@@ -190,7 +201,7 @@
 		bm_block = fs->fs_super_bh->b_blocknr + 1 + 
 			(block / (fs->fs_blocksize * 8));
 
-        bm_bh = bread (fs->fs_dev, bm_block, fs->fs_blocksize);
+        bm_bh = reiserfs_buffer_read (fs->fs_dev, bm_block, fs->fs_blocksize);
         if (bm_bh) {
 		if (misc_test_bit((block % (fs->fs_blocksize * 8)), 
 				  bm_bh->b_data))
@@ -202,7 +213,7 @@
 				 "ondisk bitmap\n", block);
 		}
 	        
-            brelse (bm_bh);
+            reiserfs_buffer_close (bm_bh);
         }
     } else {
         if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, block))
@@ -211,23 +222,23 @@
 		fprintf (stderr, "%lu is free in ondisk bitmap\n", block);
     }
     
-    bh = bread (fs->fs_dev, block, fs->fs_blocksize);
+    bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
     if (!bh) {
-	    printf ("print_one_block: bread failed\n");
+	    printf ("print_one_block: reiserfs_buffer_read failed\n");
 	    return;
     }
 	
     if (debug_mode (fs) == DO_PACK) {
 	    pack_one_block (fs, bh->b_blocknr);
-	    brelse (bh);
+	    reiserfs_buffer_close (bh);
 	    return;
     }
 	
-    if (who_is_this (bh->b_data, bh->b_size) != THE_UNKNOWN)
-	    print_block (stdout, fs, bh, PRINT_TREE_DETAILS, -1, -1);
+    if (reiserfs_node_type (bh) != NT_UNKNOWN)
+	    reiserfs_node_print (stdout, fs, bh, (1 << LP_LEAF_DETAILS), -1, -1);
     else
 	    printf ("Looks like unformatted\n");
-    brelse (bh);
+    reiserfs_buffer_close (bh);
     return;
 }
 
@@ -263,13 +274,13 @@
     {
 	    switch (c) {
 	    case 'a': /* -r will read this, -n and -N will write to it */
-		    asprintf (&data->map_file, "%s", optarg);
+		    strncpy(data->map_file, optarg, sizeof(data->map_file));
 		    break;
 
 	    case 'b':
 		    /* will load bitmap from a file and read only blocks
 		       marked in it. This is for -p and -k */
-		    asprintf (&data->input_bitmap, "%s", optarg);
+		    data->input_bitmap = optarg;
 		    data->scan_area = EXTERN_BITMAP;
 		    break;
 
@@ -286,22 +297,20 @@
 	    case '1':	/* print a single node */
 		    data->block = strtol (optarg, &tmp, 0);
 		    if (*tmp)
-			    die ("parse_options: bad block number");
+			    misc_die ("parse_options: bad block number");
 		    break;
 
 	    case 'C':
 		    data->mode = DO_CORRUPT_ONE;
 		    data->block = strtol (optarg, &tmp, 0);
 		    if (*tmp) {
-			    die ("parse_options: bad block number");
+			    misc_die ("parse_options: bad block number");
 		    }
 		    break;
 
 	    case 'F':
 		    data->mode = DO_CORRUPT_FILE;
-		    if (asprintf (&corruption_list_file, "%s", optarg) == -1 ) {    
-			    die ("parse_options: bad list corruption file");
-		    }
+		    corruption_list_file = optarg;
 		    break;
 
 	    case 'p':
@@ -325,7 +334,6 @@
 	    case 'n': /* scan for names matching a specified pattern */
 		    data->mode = DO_SCAN_FOR_NAME;
 		    data->pattern = optarg;
-		    /*asprintf (&data->pattern, "%s", optarg);*/
 		    break;
 
 	    case 'N': /* search name in the tree */
@@ -337,38 +345,38 @@
 		    break;
 
 	    case 'r':
-		    asprintf (&data->recovery_file, "%s", optarg);
+		    data->recovery_file = optarg;
 		    data->mode = DO_RECOVER;
 		    break;
 
 	    case 'd':
 		    /*  print leaf details from internal tree */
-		    data->options |= PRINT_TREE_DETAILS;
+		    misc_set_bit(LP_LEAF_DETAILS, &data->options);
 		    break;
 
 	    case 'D':
 		    /* print leaf details accordingly the bitmap - can be used 
 		       with -S */
-		    data->options |= PRINT_DETAILS;
+		    misc_set_bit(PRINT_DETAILS, &data->options);
 		    break;
 
 	    case 'o':
 		    /* print objectid map */
-		    data->options |= PRINT_OBJECTID_MAP;
+		    misc_set_bit(PRINT_OBJECTID_MAP, &data->options);
 		    break;
 
 	    case 'm':	/* print a block map */
 	    case 'M':	/* print a block map with details */
-		    data->options |= PRINT_BITMAP;
+		    misc_set_bit(PRINT_BITMAP, &data->options);
 		    break;
 
 	    case 'j': /* -j must have a parameter */
-		    data->options |= PRINT_JOURNAL;
+		    misc_set_bit(PRINT_JOURNAL, &data->options);
 		    data->journal_device_name = optarg;
 		    break;
 
 	    case 'J':
-		    data->options |= PRINT_JOURNAL_HEADER;
+		    misc_set_bit(PRINT_JOURNAL_HEADER, &data->options);
 		    break;
 
 	    case 'R': /* read block numbers from stdin and look for them in the
@@ -378,12 +386,12 @@
 		    break;
 
 	    case 'B':              /*disabled for a while*/
-		    asprintf (&badblocks_file, "%s", optarg);
+		    badblocks_file = optarg;
 		    data->mode = DO_EXTRACT_BADBLOCKS;
 		    break;
 	    case 'q':
 		    /* this makes packing to not show speed info during -p or -P */
-		    data->options |= BE_QUIET;
+		    misc_set_bit(PRINT_QUIET, &data->options);
 		    break;
 	    case 'Z':
 		    data->mode = DO_ZERO;
@@ -405,13 +413,13 @@
 		    data->mode = DO_NOTHING;
 		    break;
 	    case 'v':
-		    data->options |= BE_VERBOSE;
+		    misc_set_bit(PRINT_VERBOSE, &data->options);
 		    break;
 	    }
     }
 
     if (data->mode == DO_NOTHING) {
-	    print_banner(program_name);
+	    util_print_banner(program_name);
 	    exit(0);
     }
 
@@ -419,7 +427,7 @@
 	    /* only one non-option argument is permitted */
 	    print_usage_and_exit();
 
-    print_banner(program_name);
+    util_print_banner(program_name);
 
     data->device_name = argv[optind];
     return argv[optind];
@@ -455,29 +463,28 @@
     FILE * fp;
     unsigned long block_count;
 	
-	
-    if (reiserfs_open_ondisk_bitmap (fs) < 0)
+    if (reiserfs_bitmap_open (fs) < 0)
 	    reiserfs_exit (1, "Could not open ondisk bitmap");
-	
-    block_count = get_sb_block_count (fs->fs_ondisk_sb);
+    
+    block_count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb);	
 	
     switch (scan_area (fs)) {
     case ALL_BLOCKS:
-	    input_bitmap (fs) = reiserfs_create_bitmap (block_count);
+	    input_bitmap (fs) = reiserfs_bitmap_create (block_count);
 	    reiserfs_bitmap_fill (input_bitmap (fs));
 	    reiserfs_warning (stderr, "Whole device (%d blocks) is to be scanned\n", 
 			      reiserfs_bitmap_ones (input_bitmap (fs)));	
 	    break;
     case USED_BLOCKS:
 	    reiserfs_warning (stderr, "Loading on-disk bitmap .. ");
-	    input_bitmap (fs) = reiserfs_create_bitmap (block_count);
+	    input_bitmap (fs) = reiserfs_bitmap_create (block_count);
 	    reiserfs_bitmap_copy (input_bitmap (fs), fs->fs_bitmap2);
 	    reiserfs_warning (stderr, "%d bits set - done\n",
 			      reiserfs_bitmap_ones (input_bitmap (fs)));
 	    break;
     case UNUSED_BLOCKS:
 	    reiserfs_warning (stderr, "Loading on-disk bitmap .. ");
-	    input_bitmap (fs) = reiserfs_create_bitmap (block_count);
+	    input_bitmap (fs) = reiserfs_bitmap_create (block_count);
 	    reiserfs_bitmap_copy (input_bitmap (fs), fs->fs_bitmap2);
 	    reiserfs_bitmap_invert (input_bitmap (fs));
 	    reiserfs_warning (stderr, "%d bits set - done\n",
@@ -511,11 +518,11 @@
 	    return;
     }
 	
-    if (((data (fs)->options & PRINT_JOURNAL) || 
-	 (data (fs)->options & PRINT_JOURNAL_HEADER)) && 
+    if ((misc_test_bit(PRINT_JOURNAL, &data(fs)->options) || 
+	 misc_test_bit(PRINT_JOURNAL_HEADER, &data(fs)->options)) && 
 	!reiserfs_journal_opened (fs))
     {
-	    if (reiserfs_open_journal (fs, data(fs)->journal_device_name, 
+	    if (reiserfs_journal_open (fs, data(fs)->journal_device_name, 
 				       O_RDONLY)) 
 	    {
 		    printf ("Could not open journal\n");
@@ -523,33 +530,34 @@
 	    }
     }
 	
-    print_filesystem_state (stdout, fs);
-    print_block (stdout, fs, fs->fs_super_bh);
+    reiserfs_super_print_state (stdout, fs);
+    reiserfs_node_print (stdout, fs, fs->fs_super_bh);
 	
-    if (data (fs)->options & PRINT_JOURNAL)
-		print_journal (fs);
+    if (misc_test_bit(PRINT_JOURNAL, &data(fs)->options))
+	    reiserfs_journal_print (fs);
 
-    if (data (fs)->options & PRINT_JOURNAL_HEADER)
-		print_journal_header (fs);
+    if (misc_test_bit(PRINT_JOURNAL_HEADER, &data(fs)->options))
+	    reiserfs_journal_print_header (fs);
 	
-    if (data (fs)->options & PRINT_OBJECTID_MAP)
-		print_objectid_map (stdout, fs);
+    if (misc_test_bit(PRINT_OBJECTID_MAP, &data(fs)->options))
+	    reiserfs_objmap_print (stdout, fs);
 	
-    if (data (fs)->options & PRINT_BITMAP)
-		print_bmap (stdout, fs, 0/*opt_print_block_map == 1 ? 1 : 0*/);
+    if (misc_test_bit(PRINT_BITMAP, &data(fs)->options))
+	    reiserfs_bitmap_print (stdout, fs, 0);
 	
-    if (data (fs)->options & PRINT_DETAILS)
+    if (misc_test_bit(PRINT_DETAILS, &data(fs)->options))
         init_bitmap (fs);
 	
-    if (data (fs)->options & PRINT_DETAILS || 
-	data (fs)->options & PRINT_TREE_DETAILS) 
+    if (misc_test_bit(PRINT_DETAILS, &data(fs)->options) || 
+	misc_test_bit(LP_LEAF_DETAILS, &data(fs)->options)) 
     {
-	    if (data (fs)->options & PRINT_DETAILS) {
+	    if (misc_test_bit(PRINT_DETAILS, &data(fs)->options)) {
 		    print_disk_blocks (fs);
 		    printf("The '%s' device with reiserfs has:\n", 
 			   fs->fs_file_name);
 	    } else {
-		    print_disk_tree (fs, get_sb_root_block(fs->fs_ondisk_sb));
+		    /* DEBUGGING */
+		    print_disk_tree (fs, reiserfs_sb_get_root(fs->fs_ondisk_sb));
 		    printf("The internal reiserfs tree has:\n");
 	    }
 
@@ -563,24 +571,24 @@
 }
 
 static void callback_badblock_print(reiserfs_filsys_t *fs, 
-				    struct path *badblock_path, 
+				    reiserfs_path_t *badblock_path, 
 				    void *data) 
 {
-	struct item_head *tmp_ih;
+	reiserfs_ih_t *tmp_ih;
 	FILE *fd = (FILE *)data;
 	__u32 *ind_item;
 	__u32 i;
 	
-	tmp_ih = get_ih(badblock_path);
-	ind_item = (__u32 *)get_item(badblock_path);
+	tmp_ih = REISERFS_PATH_IH(badblock_path);
+	ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path);
 	
-	for (i = 0; i < I_UNFM_NUM(tmp_ih); i++)
+	for (i = 0; i < reiserfs_ext_count(tmp_ih); i++)
 		fprintf (fd, "%u\n", d32_get (ind_item, i));
 
-	pathrelse (badblock_path);
+	reiserfs_tree_pathrelse (badblock_path);
 }
 
-void extract_badblock_list () {
+void debug_badblock_print () {
     FILE *fd;
 
     if (!(fd = fopen (badblocks_file, "w"))) {
@@ -588,7 +596,7 @@
 		      badblocks_file);
     }
 
-    badblock_list(fs, callback_badblock_print, fd);
+    reiserfs_badblock_traverse(fs, callback_badblock_print, fd);
     fclose (fd);
 }
 
@@ -607,7 +615,7 @@
 
 void do_corrupt_blocks (reiserfs_filsys_t * fs)
 {
-	char * line;
+	char line[256];
 	FILE * fd;
 	size_t n = 0;
 	int numblock;
@@ -619,9 +627,11 @@
 	}
 	
 	while (1) {
-		line = NULL;
+		line[0] = '\0';
 		n = 0;
-		if (getline (&line, &n, fd) == -1) {
+		if (fgets(line, sizeof(line), fd) == NULL ||
+		    strlen(line) <= 1)
+		{
 			break;
 		}
 		
@@ -634,40 +644,42 @@
 			do_corrupt_one_block(fs, line);
 		}
 		printf ("before free line : %s\n", line);
-		free (line);
 		printf ("after free\n");
-		reiserfs_reopen (fs, O_RDWR);
+		reiserfs_fs_reopen (fs, O_RDWR);
 	}
+	
 	fclose (fd);
 	return;
 }
 
 void debugreiserfs_zero_reiserfs(reiserfs_filsys_t * fs) {
     unsigned long done, total, i;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
 	
-    reiserfs_reopen (fs, O_RDWR);
+    reiserfs_fs_reopen (fs, O_RDWR);
     
     total = reiserfs_bitmap_ones (input_bitmap (fs));
     done = 0;
 	
     for (i = 0; i < input_bitmap(fs)->bm_bit_size; i ++) {
-		if (!reiserfs_bitmap_test_bit (input_bitmap(fs), i))
-			continue;
-		
-		bh = getblk(fs->fs_dev, i, fs->fs_blocksize);
-		
-		if (!bh)
-			die("Could not get block %lu\n", i);
-		
-		memset(bh->b_data, 0, fs->fs_blocksize);
-		mark_buffer_dirty(bh);
-		mark_buffer_uptodate(bh, 0);
-		
-		bwrite(bh);
-		
-		brelse (bh);
-		print_how_far (stderr, &done, total, 1, be_quiet (fs));
+	if (!reiserfs_bitmap_test_bit (input_bitmap(fs), i))
+	    continue;
+
+	bh = reiserfs_buffer_open(fs->fs_dev, i, fs->fs_blocksize);
+
+	if (!bh)
+	    misc_die("Could not get block %lu\n", i);
+
+	memset(bh->b_data, 0, fs->fs_blocksize);
+	reiserfs_buffer_mkdirty(bh);
+	reiserfs_buffer_mkuptodate(bh, 0);
+
+	reiserfs_buffer_write(bh);
+
+	reiserfs_buffer_close (bh);
+
+	if (!misc_test_bit(PRINT_QUIET, &data(fs)->options))
+	    util_misc_progress (stderr, &done, total, 1, 0);
     }
 	
     fprintf(stderr, "\n");
@@ -682,25 +694,25 @@
     int error;
     struct debugreiserfs_data * data;
 	
-    data = getmem (sizeof (struct debugreiserfs_data));
+    data = misc_getmem (sizeof (struct debugreiserfs_data));
     file_name = parse_options (data, argc, argv);
     
     if (data->mode == DO_UNPACK) {
-	    do_unpack(file_name, data->journal_device_name, 
-		      data->input_bitmap, data->options & BE_VERBOSE);
+	    do_unpack(file_name, data->journal_device_name, data->input_bitmap,
+		      misc_test_bit(PRINT_VERBOSE, &data->options));
 	    return 0;
     }
     
-    fs = reiserfs_open (file_name, O_RDONLY, &error, data, 0);
+    fs = reiserfs_fs_open (file_name, O_RDONLY, &error, data, 0);
     
-    if (no_reiserfs_found (fs)) {
+    if (fs == NULL) {
 	    reiserfs_exit (1, "\n\ndebugreiserfs: can not open reiserfs on "
 			   "\"%s\": %s\n\n", file_name, error ? strerror(error)
 			   : "no filesystem found");
 	    exit(1) ;
     }
     
-    if (reiserfs_open_journal (fs, data (fs)->journal_device_name, O_RDONLY)) {
+    if (reiserfs_journal_open (fs, data (fs)->journal_device_name, O_RDONLY)) {
 	    fprintf(stderr,"\ndebugreiserfs: Failed to open the fs journal.\n");
     }
 	
@@ -716,16 +728,16 @@
 	    break;
 
     case DO_CORRUPT_ONE:
-	    reiserfs_reopen (fs, O_RDWR);
+	    reiserfs_fs_reopen (fs, O_RDWR);
 	    do_corrupt_one_block (fs, (char *)NULL);
 	    break;
 
     case DO_CORRUPT_FILE:
-	    reiserfs_reopen (fs, O_RDWR);
+	    reiserfs_fs_reopen (fs, O_RDWR);
 	    do_corrupt_blocks (fs);
 	    break;
     case DO_RANDOM_CORRUPTION:
-	    reiserfs_reopen (fs, O_RDWR);
+	    reiserfs_fs_reopen (fs, O_RDWR);
 	    /*
 	       do_leaves_corruption (fs);
 	       do_bitmap_corruption (fs);
@@ -761,7 +773,7 @@
 	    reiserfs_warning (stderr, "Will try to extract list of bad blocks "
 			      "and save it to '%s' file\n", badblocks_file);
 
-	    extract_badblock_list ();
+	    debug_badblock_print ();
 	    reiserfs_warning (stderr, "Done\n\n");
 	    break;
     case DO_ZERO:
@@ -770,10 +782,9 @@
 	    break;
     }
 
-    reiserfs_close (fs);
-    if (data(fs)->log) {
+    if (data(fs)->log)
 	    fclose (data(fs)->log); 
-    }
+    reiserfs_fs_close (fs);
     return 0;
 }
 
diff --git a/debugreiserfs/debugreiserfs.h b/utils/debugfs/debugreiserfs.h
similarity index 91%
rename from debugreiserfs/debugreiserfs.h
rename to utils/debugfs/debugreiserfs.h
index 58e58e6..99b9541 100644
--- a/debugreiserfs/debugreiserfs.h
+++ b/utils/debugfs/debugreiserfs.h
@@ -2,11 +2,11 @@
  * Copyright 2000-2004 by Hans Reiser, licensing governed by 
  * reiserfsprogs/README
  */
-#define _GNU_SOURCE
 
-#ifndef HAVE_CONFIG_H
-#  include "config.h"
-#endif
+#include "reiserfs/libreiserfs.h"
+
+#if 0
+#define _GNU_SOURCE
 
 #include "io.h"
 #include "misc.h"
@@ -16,9 +16,12 @@
 
 #include <string.h>
 #include <errno.h>
+#endif
 
 extern reiserfs_filsys_t * fs;
 
+/* print all items from bitmap */
+#define PRINT_DETAILS 		LP_LAST
 
 /*
  *  modes
@@ -44,18 +47,18 @@
 
 
 /*first bits are in reiserfs_fs.b*/
-#define PRINT_JOURNAL 		0x10
-#define PRINT_JOURNAL_HEADER	0x20
-#define PRINT_BITMAP 		0x40
-#define PRINT_OBJECTID_MAP	0x80
-#define BE_QUIET 		0x100
-#define BE_VERBOSE 		0x200
+enum debug_print {
+	PRINT_JOURNAL		= LP_LAST,
+	PRINT_JOURNAL_HEADER	= LP_LAST + 1,
+	PRINT_BITMAP		= LP_LAST + 2,
+	PRINT_OBJECTID_MAP	= LP_LAST + 3,
+	PRINT_QUIET		= LP_LAST + 4,
+	PRINT_VERBOSE		= LP_LAST + 5,
+	PRINT_DEBUG_LAST
+};
 
-/* these moved to reiserfs_fs.h */
-//#define PRINT_TREE_DETAILS 		
-//#define PRINT_DETAILS 	
-//#define PRINT_ITEM_DETAILS 	 	
-//#define PRINT_DIRECT_ITEMS 	 	
+#define debug_option(options, bit)	(options & (1 << (bit)))
+#define debug_setoption(options, bit)	(options |= (1 << (bit)))
 
 
 // the leaf is stored in compact form:
@@ -101,8 +104,8 @@
 #define WITH_SD_FIRST_DIRECT_BYTE 	0x80   /* 8. for old stat data first_direct_byte is stored */
 #define NLINK_BITS_32 			0x0100 /* 9. nlinks stored in 32 bits */
 #define SIZE_BITS_64  			0x0200 /* 10. size has to be stored in 64 bit */
-#define WHOLE_INDIRECT 			0x0400 /* 11. indirect item is stored with compression */
-#define SAFE_LINK			0x0800 /* 11. indirect item is stored with compression */
+#define WHOLE_EXTENT 			0x0400 /* 11. extent item is stored with compression */
+#define SAFE_LINK			0x0800 /* 11. extent item is stored with compression */
 
 
 #define TYPE_MASK 0x3 /* two lowest bits are used to store item type */
@@ -224,7 +227,7 @@
     char * pattern; /* for -n */
     char * device_name;
     char * journal_device_name; /* for -j */
-    char * map_file; /* for -n, -N and -f */
+    char map_file[4096]; /* for -n, -N and -f */
     char * recovery_file; /* for -r */
 
     unsigned long options; /* -q only yet*/
@@ -248,8 +251,6 @@
 #define map_file(fs) (data(fs)->map_file)
 #define recovery_file(fs) (data(fs)->recovery_file)
 
-#define be_quiet(fs)  (data(fs)->options & BE_QUIET)
-
 /* stat.c */
 void do_stat (reiserfs_filsys_t * fs);
 
@@ -274,7 +275,7 @@
 void print_map(reiserfs_filsys_t * fs);
 
 struct saved_item {
-    struct item_head si_ih;
+    reiserfs_ih_t si_ih;
     unsigned long si_block;
     int si_item_num, si_entry_pos;
     struct saved_item *si_next; /* list of items having the same key */
diff --git a/debugreiserfs/pack.c b/utils/debugfs/pack.c
similarity index 65%
rename from debugreiserfs/pack.c
rename to utils/debugfs/pack.c
index b390399..33bdd0f 100644
--- a/debugreiserfs/pack.c
+++ b/utils/debugfs/pack.c
@@ -3,9 +3,14 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include "debugreiserfs.h"
-
-
+#include "misc/unaligned.h"
+#include "util/print.h"
+#include "util/misc.h"
 
 /* counters for each kind of blocks */
 int packed,
@@ -26,41 +31,41 @@
 
 inline void set_pi_type( struct packed_item *pi, __u32 val )
 {
-    set_bit_field_XX (32, pi, val, 0, 2);
+    misc_set_bitfield_XX (32, pi, val, 0, 2);
 }
 
 
 inline __u32 get_pi_type( const struct packed_item *pi )
 {
-    get_bit_field_XX (32, pi, 0, 2);
+    return misc_get_bitfield_XX (32, pi, 0, 2);
 }
 
 
 inline void set_pi_mask( struct packed_item *pi, __u32 val )
 {
-    set_bit_field_XX (32, pi, val, 2, 18);
+    misc_set_bitfield_XX (32, pi, val, 2, 18);
 }
 
 
 __u32 get_pi_mask( const struct packed_item *pi )
 {
-    get_bit_field_XX (32, pi, 2, 18);
+    return misc_get_bitfield_XX (32, pi, 2, 18);
 }
 
 
 inline void set_pi_item_len( struct packed_item *pi, __u32 val )
 {
-    set_bit_field_XX (32, pi, val, 20, 12);
+    misc_set_bitfield_XX (32, pi, val, 20, 12);
 }
 
 
 inline __u32 get_pi_item_len( const struct packed_item *pi )
 {
-    get_bit_field_XX (32, pi, 20, 12);
+    return misc_get_bitfield_XX (32, pi, 20, 12);
 }
 
 
-static void pack_ih (struct packed_item * pi, struct item_head * ih)
+static void pack_ih (struct packed_item * pi, reiserfs_ih_t * ih)
 {
     __u32 v32;
     __u16 v16;
@@ -71,31 +76,31 @@
 
     /* sen key components which are to be sent */
     if (get_pi_mask(pi) & DIR_ID) {
-	v32 = get_key_dirid (&ih->ih_key);
+	v32 = reiserfs_key_get_did (&ih->ih_key);
 	fwrite_le32 (&v32);
     }
 
     if (get_pi_mask(pi) & OBJECT_ID) {
-	v32 = get_key_objectid (&ih->ih_key);
+	v32 = reiserfs_key_get_oid (&ih->ih_key);
 	fwrite_le32 (&v32);
     }
 
     if (get_pi_mask(pi) & OFFSET_BITS_64) {
 	__u64 offset;
 
-	offset = get_offset (&ih->ih_key);
+	offset = reiserfs_key_get_off (&ih->ih_key);
 	fwrite_le64 (&offset);
     }
 
     if (get_pi_mask(pi) & OFFSET_BITS_32) {
 	__u32 offset;
 
-	offset = get_offset (&ih->ih_key);
+	offset = reiserfs_key_get_off (&ih->ih_key);
 	fwrite_le32 (&offset);
     }
 
     if (get_pi_mask(pi) & IH_FREE_SPACE) {
-	v16 = get_ih_entry_count (ih);
+	v16 = reiserfs_ih_get_entries (ih);
 	fwrite_le16 (&v16);
     }
 
@@ -106,15 +111,16 @@
 }
 
 
-static void pack_direct (struct packed_item * pi, struct buffer_head * bh, 
-			 struct item_head * ih)
+static void pack_direct (struct packed_item * pi, reiserfs_bh_t * bh, 
+			 reiserfs_ih_t * ih)
 {
-    if (get_ih_free_space (ih) != 0xffff)
+    if (reiserfs_ih_get_free (ih) != 0xffff)
 	/* ih_free_space has unexpected value */
         set_pi_mask (pi, get_pi_mask (pi) | IH_FREE_SPACE);
 
     if (get_pi_mask(pi) & SAFE_LINK)
-	set_key_dirid(&ih->ih_key, d32_get((__u32 *)B_I_PITEM (bh, ih), 0) );
+	reiserfs_key_set_did(&ih->ih_key, 
+		      d32_get((__u32 *)reiserfs_item_by_ih (bh, ih), 0) );
 
     /* send key components which are to be sent */
     pack_ih (pi, ih);
@@ -122,7 +128,7 @@
 
 
 /* if there is at least one extent longer than 2 - it is worth packing */
-static int should_pack_indirect (__u32 * ind_item, int unfm_num)
+static int should_pack_extent (__u32 * ind_item, int unfm_num)
 {
     int i, len;
 
@@ -142,42 +148,42 @@
 }
 
 
-/* indirect item can be either packed using "extents" (when it is
+/* extent item can be either packed using "extents" (when it is
    worth doing) or be stored as is. Size of item in packed form is not
    stored. Unpacking will stop when full item length is reached */
-static void pack_indirect (struct packed_item * pi, struct buffer_head * bh, 
-			   struct item_head * ih)
+static void pack_extent (struct packed_item * pi, reiserfs_bh_t * bh, 
+			   reiserfs_ih_t * ih)
 {
     unsigned int i;
     __u32 * ind_item;
     __u16 len;
 
 
-    if (get_ih_entry_count (ih))
+    if (reiserfs_ih_get_entries (ih))
         set_pi_mask (pi, get_pi_mask (pi) | IH_FREE_SPACE);
 
-    ind_item = (__u32 *)B_I_PITEM (bh, ih);
-    if (!should_pack_indirect (ind_item, I_UNFM_NUM (ih)))
-        set_pi_mask (pi, get_pi_mask (pi) | WHOLE_INDIRECT);
+    ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih);
+    if (!should_pack_extent (ind_item, reiserfs_ext_count (ih)))
+        set_pi_mask (pi, get_pi_mask (pi) | WHOLE_EXTENT);
 
 
     if (get_pi_mask(pi) & SAFE_LINK)
-	set_key_dirid(&ih->ih_key, d32_get(ind_item, 0));
+	reiserfs_key_set_did(&ih->ih_key, d32_get(ind_item, 0));
 
     pack_ih (pi, ih);
 
     if (get_pi_mask(pi) & SAFE_LINK)
         return;
 
-    if (get_pi_mask(pi) & WHOLE_INDIRECT) {
-	fwrite (ind_item, get_ih_item_len (ih), 1, stdout);
-	sent_bytes += get_ih_item_len (ih);
+    if (get_pi_mask(pi) & WHOLE_EXTENT) {
+	fwrite (ind_item, reiserfs_ih_get_len (ih), 1, stdout);
+	sent_bytes += reiserfs_ih_get_len (ih);
 	return;
     }
 
     fwrite32 (&ind_item [0]);
 
-    for (i = 1, len = 1; i < I_UNFM_NUM (ih); i ++) {
+    for (i = 1, len = 1; i < reiserfs_ext_count (ih); i ++) {
 	if ((d32_get(ind_item, i) == 0 && d32_get(ind_item, i - 1) == 0)  || 
 	    d32_get(ind_item, i) == d32_get(ind_item, i - 1) + 1) 
 	{
@@ -206,11 +212,11 @@
 		maybe deh_state (16)
 */
 static void pack_direntry (reiserfs_filsys_t * fs, struct packed_item * pi,
-			   struct buffer_head * bh,
-			   struct item_head * ih)
+			   reiserfs_bh_t * bh,
+			   reiserfs_ih_t * ih)
 {
     int i;
-    struct reiserfs_de_head * deh;
+    reiserfs_deh_t * deh;
     struct packed_dir_entry pe;
     __u16 entry_count, gen_counter;
 
@@ -221,28 +227,28 @@
     pack_ih (pi, ih);
 
     /* entry count is sent unconditionally */
-    entry_count = get_ih_entry_count (ih);
+    entry_count = reiserfs_ih_get_entries (ih);
 
-    deh = B_I_DEH (bh, ih);
+    deh = reiserfs_deh (bh, ih);
     for (i = 0; i < entry_count; i ++, deh ++) {
-	pe.entrylen = entry_length (ih, deh, i);
+	pe.entrylen = reiserfs_direntry_entry_len (ih, deh, i);
 	pe.mask = 0;
-	if (get_deh_dirid (deh) != get_key_objectid (&ih->ih_key))
+	if (reiserfs_deh_get_did (deh) != reiserfs_key_get_oid (&ih->ih_key))
 	    /* entry points to name of another directory, store deh_dir_id */
 	    pe.mask |= HAS_DIR_ID;
 
-	gen_counter = GET_GENERATION_NUMBER (get_deh_offset (deh));
+	gen_counter = OFFSET_GEN (reiserfs_deh_get_off (deh));
 	if (gen_counter != 0)
 	    /* store generation counter if it is != 0 */
 	    pe.mask |= HAS_GEN_COUNTER;
 
-	if (get_deh_state (deh) != 4)
+	if (reiserfs_deh_get_state (deh) != 4)
 	    /* something unusual in deh_state. Store it */
 	    pe.mask |= HAS_STATE;
 
 	fwrite8 (&pe.mask);
 	fwrite_le16 (&pe.entrylen);
-	fwrite (name_in_entry (deh, i), pe.entrylen, 1, stdout);
+	fwrite (reiserfs_deh_name (deh, i), pe.entrylen, 1, stdout);
 	sent_bytes += pe.entrylen;
 	fwrite32 (&(deh->deh2_objectid));
 	
@@ -258,14 +264,14 @@
 }
 
 
-static void pack_stat_data (struct packed_item * pi, struct buffer_head * bh,
-			    struct item_head * ih)
+static void pack_stat_data (struct packed_item * pi, reiserfs_bh_t * bh,
+			    reiserfs_ih_t * ih)
 {
-    if (get_ih_free_space (ih) != 0xffff)
+    if (reiserfs_ih_get_free (ih) != 0xffff)
 	/* ih_free_space has unexpected value */
         set_pi_mask (pi, get_pi_mask (pi) | IH_FREE_SPACE);
 
-    if (stat_data_v1 (ih)) {
+    if (reiserfs_ih_format_v1 (ih)) {
 	/* for old stat data: we take
 	   mode - 16 bits
 	   nlink - 16 bits
@@ -273,10 +279,10 @@
 	   blocks/rdev - 32 bits
 	   maybe first_direct byte 32 bits
 	*/
-	struct stat_data_v1 * sd_v1;
+	reiserfs_sd_v1_t * sd_v1;
 
-	sd_v1 = (struct stat_data_v1 *)B_I_PITEM (bh, ih);
-	if (sd_v1->sd_first_direct_byte != 0xffffffff) /* ok if -1 */
+	sd_v1 = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih);
+	if (sd_v1->sd_fdb != 0xffffffff) /* ok if -1 */
             set_pi_mask (pi, get_pi_mask (pi) | WITH_SD_FIRST_DIRECT_BYTE);
 
 
@@ -288,7 +294,7 @@
 	fwrite32 (&sd_v1->u.sd_blocks);
 
 	if (get_pi_mask(pi) & WITH_SD_FIRST_DIRECT_BYTE)
-	    fwrite32 (&sd_v1->sd_first_direct_byte);
+	    fwrite32 (&sd_v1->sd_fdb);
     } else {
 	/* for new stat data
 	   mode - 16 bits
@@ -296,26 +302,26 @@
 	   size in either 32 or 64 bits
 	   blocks - 32 bits
 	*/
-	struct stat_data * sd;
+	reiserfs_sd_t * sd;
         /* these will maintain disk-order values */
 	__u16 nlink16;
 	__u32 nlink32, size32;
 	__u64 size64;
 
-	sd = (struct stat_data *)B_I_PITEM (bh, ih);
-	if (sd_v2_nlink (sd) > 0xffff) {
+	sd = (reiserfs_sd_t *)reiserfs_item_by_ih (bh, ih);
+	if (reiserfs_sd_v2_nlink (sd) > 0xffff) {
             set_pi_mask (pi, get_pi_mask (pi) | NLINK_BITS_32);
 	    nlink32 = sd->sd_nlink;
 	} else {
             /* This is required to deal with big endian systems */
-	    nlink16 = cpu_to_le16 ((__u16)sd_v2_nlink (sd));
+	    nlink16 = cpu_to_le16 ((__u16)reiserfs_sd_v2_nlink (sd));
 	}
-	if (sd_v2_size (sd) > 0xffffffff) {
+	if (reiserfs_sd_v2_size (sd) > 0xffffffff) {
             set_pi_mask (pi, get_pi_mask (pi) | SIZE_BITS_64);
 	    size64 = sd->sd_size;
 	} else {
             /* This is required to deal with big endian systems */
-	    size32 = cpu_to_le32 ((__u32)sd_v2_size (sd));
+	    size32 = cpu_to_le32 ((__u32)reiserfs_sd_v2_size (sd));
 	}
 
 
@@ -340,7 +346,7 @@
 }
 
 
-static void pack_full_block (reiserfs_filsys_t * fs, struct buffer_head * bh)
+static void pack_full_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh)
 {
     __u16 magic;
     __u32 block;
@@ -370,7 +376,7 @@
     if (block >= SB_BLOCK_COUNT (fs))
         return 1;
 
-    if (not_data_block (fs, block))
+    if (reiserfs_fs_block(fs, block) != BT_UNKNOWN)
         return 1;
 
     return 0;
@@ -378,27 +384,31 @@
 #endif
 
 /* we only pack leaves which do not have any corruptions */
-static int can_pack_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh)
+static int can_pack_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh)
 {
     int i;
-    struct item_head * ih;
+    reiserfs_ih_t * ih;
 
-    ih = B_N_PITEM_HEAD (bh, 0);
-    for (i = 0; i < get_blkh_nr_items (B_BLK_HEAD (bh)); i ++, ih ++) {
-	if (is_it_bad_item (fs, ih, B_I_PITEM (bh, ih), 0/*check_unfm_ptr*/, 1/*bad dir*/))
+    ih = reiserfs_ih_at (bh, 0);
+    for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) {
+	if (reiserfs_leaf_correct_at (fs, ih, reiserfs_item_by_ih (bh, ih), 
+				      0/*check_unfm_ptr*/, 1/*bad dir*/))
+	{
 	    return 0;
+	}
     }
+    
     return 1;
 }
 
 
 /* pack leaf only if all its items are correct: keys are correct,
    direntries are hashed properly and hash function is defined,
-   indirect items are correct, stat data ?, */
-static void pack_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh)
+   extent items are correct, stat data ?, */
+static void pack_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh)
 {
     int i;
-    struct item_head * ih;
+    reiserfs_ih_t * ih;
     struct packed_item pi;
     __u16 v16;
 
@@ -410,17 +420,17 @@
     }
 
     /* start magic in low 8 bits, hash code in high 8 bits */
-    v16 = (LEAF_START_MAGIC | (func2code (fs->fs_hash_function) << 8));
+    v16 = (LEAF_START_MAGIC | (reiserfs_hash_code(fs->hash) << 8));
     fwrite_le16 (&v16);
     
     /* block number */
     fwrite_le32 (&bh->b_blocknr);
 
     /* item number */
-    v16 = get_blkh_nr_items (B_BLK_HEAD (bh));
+    v16 = reiserfs_nh_get_items (NODE_HEAD (bh));
     fwrite_le16 (&v16);
 
-    ih = B_N_PITEM_HEAD (bh, 0);
+    ih = reiserfs_ih_at (bh, 0);
 
     for (i = 0; i < v16; i ++, ih ++) {
 #if 0
@@ -429,41 +439,46 @@
 #endif
 
         set_pi_mask (&pi, 0);
-        set_pi_item_len (&pi, get_ih_item_len (ih));
-        set_pi_type (&pi, get_type (&ih->ih_key));
+        set_pi_item_len (&pi, reiserfs_ih_get_len (ih));
+        set_pi_type (&pi, reiserfs_key_get_type (&ih->ih_key));
 
 	// format
-	if (get_ih_key_format (ih) == KEY_FORMAT_2)
+	if (reiserfs_ih_get_format (ih) == KEY_FORMAT_2)
             set_pi_mask( &pi, get_pi_mask(&pi) | NEW_FORMAT );
 
 	// k_dir_id
-	if (!i || (i && get_key_dirid (&ih->ih_key) != get_key_dirid (&(ih - 1)->ih_key))) {
+	if (!i || (i && reiserfs_key_get_did (&ih->ih_key) != reiserfs_key_get_did (&(ih - 1)->ih_key))) {
 	    /* if item is first in the leaf or if previous item has different
                k_dir_id - store it */
             set_pi_mask (&pi, get_pi_mask (&pi) | DIR_ID);
 	}
 	// k_object_id
-	if (!i || (i && get_key_objectid (&ih->ih_key) != get_key_objectid (&(ih - 1)->ih_key))) {
+	if (!i || (i && reiserfs_key_get_oid (&ih->ih_key) != reiserfs_key_get_oid (&(ih - 1)->ih_key))) {
 	    /* if item is first in the leaf or if previous item has different
                k_objectid - store it */
             set_pi_mask (&pi, get_pi_mask (&pi) | OBJECT_ID);
 	}
 
 	/* store offset if it is != 0 in 32 or 64 bits */
-	if (get_offset (&ih->ih_key)) {
+	if (reiserfs_key_get_off (&ih->ih_key)) {
 	    int send_offset = 1;
 
 	    if ((get_pi_mask (&pi) & DIR_ID) == 0 && (get_pi_mask (&pi) & OBJECT_ID) == 0) {
 		/* previous item is of the same object, so try to avoid
                    sending k_offset */
-		if ((is_stat_data_ih (ih - 1) && get_offset (&ih->ih_key) == 1) ||
-		    (is_indirect_ih (ih - 1) && is_direct_ih (ih) && 
-		     get_offset (&(ih - 1)->ih_key) + get_bytes_number (ih - 1, fs->fs_blocksize) == get_offset (&ih->ih_key)))
+		if ((reiserfs_ih_stat (ih - 1) && 
+		     reiserfs_key_get_off (&ih->ih_key) == 1) ||
+		    (reiserfs_ih_ext (ih - 1) && reiserfs_ih_direct (ih) && 
+		     reiserfs_key_get_off (&(ih - 1)->ih_key) + 
+		     reiserfs_leaf_ibytes (ih - 1, fs->fs_blocksize) == 
+		     reiserfs_key_get_off (&ih->ih_key)))
+		{
 		    /* unpack can calculate offset itself */
 		    send_offset = 0;
+		}
 	    }
 	    if (send_offset) {
-		if (get_offset (&ih->ih_key) > 0xffffffffULL)
+		if (reiserfs_key_get_off (&ih->ih_key) > 0xffffffffULL)
                     set_pi_mask (&pi, get_pi_mask (&pi) | OFFSET_BITS_64);
 		else
                     set_pi_mask (&pi, get_pi_mask (&pi) | OFFSET_BITS_32);
@@ -471,22 +486,22 @@
 	}
 
 	/* ih key format is correct, check fsck_need field */
-	if (get_ih_flags (ih))
+	if (reiserfs_ih_get_flags (ih))
             set_pi_mask (&pi, get_pi_mask (&pi) | IH_FORMAT);
 
-	if ((get_key_dirid (&ih->ih_key) == (__u32)-1) && (get_ih_item_len (ih) == 4))
+	if ((reiserfs_key_get_did (&ih->ih_key) == (__u32)-1) && (reiserfs_ih_get_len (ih) == 4))
             set_pi_mask (&pi, get_pi_mask (&pi) | SAFE_LINK);
 
-	if (is_direct_ih (ih)) {
+	if (reiserfs_ih_direct (ih)) {
 	    pack_direct (&pi, bh, ih);
-	} else if (is_indirect_ih (ih))
-	    pack_indirect (&pi, bh, ih);
-	else if (is_direntry_ih (ih))
+	} else if (reiserfs_ih_ext (ih))
+	    pack_extent (&pi, bh, ih);
+	else if (reiserfs_ih_dir (ih))
 	    pack_direntry (fs, &pi, bh, ih);
-	else if (is_stat_data_ih (ih))
+	else if (reiserfs_ih_stat (ih))
 	    pack_stat_data (&pi, bh, ih);
 	else
-	    die ("pack_leaf: unknown item found");
+	    misc_die ("pack_leaf: unknown item found");
 #if 0
 	v32 = ITEM_END_MAGIC;
 	fwrite32 (&v32);
@@ -504,14 +519,14 @@
 }
 
 
-static int can_pack_internal (reiserfs_filsys_t * fs, struct buffer_head * bh)
+static int can_pack_internal (reiserfs_filsys_t * fs, reiserfs_bh_t * bh)
 {
     return 0;
 }
 
 
 /* pack internal node as a full block */
-static void pack_internal (reiserfs_filsys_t * fs, struct buffer_head * bh)
+static void pack_internal (reiserfs_filsys_t * fs, reiserfs_bh_t * bh)
 {
     internals ++;
     if (!can_pack_internal (fs, bh)) {
@@ -524,24 +539,24 @@
 
 
 /* packed blocks are marked free in the bitmap*/
-static void send_block (reiserfs_filsys_t * fs, struct buffer_head * bh, int send_unknown)
+static void send_block (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int send_unknown)
 {
     int type;
 
     packed ++;
-    type = who_is_this (bh->b_data, bh->b_size);
+    type = reiserfs_node_type (bh);
     switch (type) {
-    case THE_LEAF:
+    case NT_LEAF:
 	pack_leaf (fs, bh);
 	break;
 
-    case HAS_IH_ARRAY:
+    case NT_IH_ARRAY:
 	having_ih_array ++;
 //	fprintf (stderr, "BROKEN BLOCK HEAD %lu\n", bh->b_blocknr);
 	pack_full_block (fs, bh);
 	break;
 	
-    case THE_INTERNAL:
+    case NT_INTERNAL:
 	pack_internal (fs, bh);
 	break;
 
@@ -562,52 +577,58 @@
 /* super block, journal, bitmaps */
 static void pack_frozen_data (reiserfs_filsys_t * fs)
 {
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     unsigned long block;
     __u16 magic16;
     int sent_journal_start_magic = 0;
-    unsigned int i;
+    unsigned int i, bmap_nr;
     
-    if (is_reiserfs_jr_magic_string(fs->fs_ondisk_sb) &&
-	get_jp_journal_dev(sb_jp(fs->fs_ondisk_sb)) &&
+    if (reiserfs_super_jr_magic(fs->fs_ondisk_sb) &&
+	reiserfs_jp_get_dev(reiserfs_sb_jp(fs->fs_ondisk_sb)) &&
 	!journal_device_name(fs)) {
-	if (!user_confirmed (stderr,
-			     "\n File system has non-standard journal "
-			     "that hasn't been specified.\n"
-			     "Continue packing without journal? [N/Yes] (note need to type Yes):", "Yes\n"))
+	if (!util_user_confirmed (stderr,"\n File system has non-standard "
+				  "journal that hasn't been specified.\n"
+				  "Continue packing without journal? [N/Yes] "
+				  "(note need to type Yes):", "Yes\n"))
+	{
 	    exit (0);
+	}
     }
     
     /* super block */
     reiserfs_warning (stderr, "super block..");fflush (stderr);
-    send_block (fs, fs->fs_super_bh, 1/*send block even if its format is not determined */);
-    reiserfs_warning (stderr, "ok\nbitmaps..(%d).. ", 
-		      get_sb_bmap_nr (fs->fs_ondisk_sb));
+    send_block (fs, fs->fs_super_bh, 
+		1/*send block even if its format is not determined */);
+    
+    bmap_nr = reiserfs_bmap_nr(reiserfs_sb_get_blocks (fs->fs_ondisk_sb),
+			       fs->fs_blocksize);
+    
+    reiserfs_warning (stderr, "ok\nbitmaps..(%d).. ", bmap_nr);
     fflush (stderr);
 
     /* bitmaps */
     block = fs->fs_super_bh->b_blocknr + 1;
-    for (i = 0; i < get_sb_bmap_nr (fs->fs_ondisk_sb); i ++) {
-	bh = bread (fs->fs_dev, block, fs->fs_blocksize);
+    for (i = 0; i < bmap_nr; i ++) {
+	bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
 	if (!bh) {
-	    fprintf (stderr, "pack_frozen_data: bread failed: %lu\n", block);
+	    fprintf (stderr, "pack_frozen_data: reiserfs_buffer_read failed: %lu\n", block);
 	    continue;
 	}
 	send_block (fs, bh, 1);
-	if (spread_bitmaps (fs))
+	if (reiserfs_bitmap_spread (fs))
 	    block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8);
 	else
 	    block ++;	
-	brelse (bh);
+	reiserfs_buffer_close (bh);
     }
 
     /* journal */
 
-    if (get_jp_journal_dev (sb_jp (fs->fs_ondisk_sb))) {
+    if (reiserfs_jp_get_dev (reiserfs_sb_jp (fs->fs_ondisk_sb))) {
 	/* non-standard journal is on a separate device */
 	    
 	if (journal_device_name (fs) && !reiserfs_journal_opened (fs))
-	    die ("Specified journal is not available. Specify it correctly or "
+	    misc_die ("Specified journal is not available. Specify it correctly or "
 		 "don't specify at all");
 	else if (!journal_device_name(fs)) 
 	    /* non-standard journal was not specified (that confirmed by user) -
@@ -619,19 +640,19 @@
 	    sent_journal_start_magic = 1;
 	}
     }
-    block = get_jp_journal_1st_block (sb_jp (fs->fs_ondisk_sb));
+    block = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb));
     reiserfs_warning (stderr, "ok\njournal (from %lu to %lu)..",
-		      block, block + get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)));
+		      block, block + reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)));
     fflush (stderr);
-    for (i = 0; i <= get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)); i ++) {
-	bh = bread (fs->fs_journal_dev, block + i, fs->fs_blocksize);
+    for (i = 0; i <= reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)); i ++) {
+	bh = reiserfs_buffer_read (fs->fs_journal_dev, block + i, fs->fs_blocksize);
 	if (!bh) {
 	    reiserfs_warning (stderr, "could not read %lu, skipped\n", i);
 	    continue;
 	}
 	
 	send_block (fs, bh, 1);
-	brelse (bh);
+	reiserfs_buffer_close (bh);
     }
     if (sent_journal_start_magic) {
 	magic16 = SEPARATED_JOURNAL_END_MAGIC;
@@ -647,7 +668,7 @@
 /* pack all "not data blocks" and correct leaf */
 void pack_partition (reiserfs_filsys_t * fs)
 {
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     __u32 magic32;
     __u16 blocksize;
     __u16 magic16;
@@ -675,20 +696,22 @@
     total = reiserfs_bitmap_ones (what_to_pack);
 
 
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
+    for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
 	if (!reiserfs_bitmap_test_bit (what_to_pack, i))
 	    continue;
-	
-	print_how_far (stderr, &done, total, 1, be_quiet (fs));
 
-	bh = bread (fs->fs_dev, i, blocksize);
+	if (!misc_test_bit(PRINT_QUIET, &data(fs)->options)) {
+	    util_misc_progress (stderr, &done, total, 1, 0);
+	}
+
+	bh = reiserfs_buffer_read (fs->fs_dev, i, blocksize);
 	if (!bh) {
 	    reiserfs_warning (stderr, "could not read block %lu\n", i);
 	    continue;
 	}
 
 	send_block (fs, bh, 0/*do not send block of not determined format */);
-	brelse (bh);
+	reiserfs_buffer_close (bh);
     }
 
     magic16 = END_MAGIC;
@@ -714,7 +737,7 @@
 {
     __u32 magic32;
     __u16 magic16;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
 
     // reiserfs magic
     magic32 = REISERFS_SUPER_MAGIC;
@@ -723,17 +746,17 @@
     // blocksize
     fwrite_le16 (&fs->fs_blocksize);
     
-    bh = bread (fs->fs_dev, block, fs->fs_blocksize);
+    bh = reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
 
     if (!bh) 
 	return;
 
-    if (who_is_this (bh->b_data, bh->b_size) == THE_LEAF)
+    if (reiserfs_node_type (bh) == NT_LEAF)
 	pack_leaf (fs, bh);
     else
 	pack_full_block (fs, bh);
 
-    brelse (bh);
+    reiserfs_buffer_close (bh);
 
     // end magic
     magic16 = END_MAGIC;
diff --git a/debugreiserfs/recover.c b/utils/debugfs/recover.c
similarity index 63%
rename from debugreiserfs/recover.c
rename to utils/debugfs/recover.c
index f5130e9..f7ad938 100644
--- a/debugreiserfs/recover.c
+++ b/utils/debugfs/recover.c
@@ -3,8 +3,14 @@
  * reiserfsprogs/README
  */
 
-#include "debugreiserfs.h"
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
 
+#include "debugreiserfs.h"
+#include "misc/unaligned.h"
+
+#include <errno.h>
 
 #if 0
 
@@ -22,17 +28,17 @@
     char * line = 0;
     int n = 0;
     int fd;
-    struct key key = {0, 0, };
-    struct buffer_head * bh;
-    struct item_head * ih;
+    reiserfs_key_t key = {0, 0, };
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
     unsigned long block;
     char code;
-    loff_t recovered = 0;
+    long long int recovered = 0;
     int i, j;
     reiserfs_bitmap_t bitmap;
     int used, not_used;
 
-    bitmap = reiserfs_create_bitmap (SB_BLOCK_COUNT (fs));
+    bitmap = reiserfs_bitmap_create (SB_BLOCK_COUNT (fs));
     reiserfs_fetch_disk_bitmap (bitmap, fs);
     /* we check how many blocks recoverd items point to are free or used */
     used = 0;
@@ -46,7 +52,7 @@
 	case 'K':
 	    /* get a key of file which is to be recovered */
 	    if (sscanf (line, "%c %u %u\n", &code, &key.k_dir_id, &key.k_objectid) != 3) {
-		die ("recover_file: wrong input K format");
+		misc_die ("recover_file: wrong input K format");
 	    }
 	    printf ("Recovering file (%u, %u)\n", key.k_dir_id, key.k_objectid);
 	    break;
@@ -55,22 +61,22 @@
 	    /* get a file name */
 	    recovered = 0;
 	    if (sscanf (line, "%c %s\n", &code, name) != 2) {
-		die ("recover_file: wrong input N format");
+		misc_die ("recover_file: wrong input N format");
 	    }
 	    fd = open (name, O_RDWR | O_CREAT | O_EXCL, 0644);
 	    if (fd == -1)
-		die ("recover_file: could not create file %s: %s",
+		misc_die ("recover_file: could not create file %s: %s",
 		     name,strerror (errno));
 	    printf ("Recovering file %s..\n", name);
 	    break;
 
 	case 'B':
 	    if (!fd)
-		die ("recover_file: file name is not specified");
+		misc_die ("recover_file: file name is not specified");
 	    if (sscanf (line, "%c %lu\n", &code, &block) != 2) {
-		die ("recover_file: wrong input B format");
+		misc_die ("recover_file: wrong input B format");
 	    }
-	    bh = bread (fs->s_dev, block, fs->s_blocksize);
+	    bh = reiserfs_buffer_read (fs->s_dev, block, fs->s_blocksize);
 	    if (!bh) {
 		printf ("reading block %lu failed\n", block);
 		continue;
@@ -78,29 +84,29 @@
 
 	    printf ("working with block %lu..\n", block);
 
-	    ih = B_N_PITEM_HEAD (bh, 0);
+	    ih = reiserfs_ih_at (bh, 0);
 	    for (i = 0; i < node_item_number (bh); i ++, ih ++) {
-		__u32 * indirect;
-		struct buffer_head * tmp_bh;
+		__u32 * extent;
+		reiserfs_bh_t * tmp_bh;
 
-		if (!is_indirect_ih (ih) || key.k_dir_id != ih->ih_key.k_dir_id ||
+		if (!reiserfs_ih_ext (ih) || key.k_dir_id != ih->ih_key.k_dir_id ||
 		    key.k_objectid != ih->ih_key.k_objectid)
 		    continue;
 
-		indirect = (__u32 *)B_I_PITEM (bh, ih);
-		for (j = 0; j < I_UNFM_NUM (ih); j ++) {
-		    block = le32_to_cpu (indirect [j]);
+		extent = (__u32 *)reiserfs_item_by_ih (bh, ih);
+		for (j = 0; j < reiserfs_ext_count (ih); j ++) {
+		    block = le32_to_cpu (extent [j]);
 		    if (!block)
 			continue;
-		    tmp_bh = bread (fs->s_dev, block, fs->s_blocksize);
+		    tmp_bh = reiserfs_buffer_read (fs->s_dev, block, fs->s_blocksize);
 		    if (!tmp_bh) {
-			printf ("reading block %Lu failed\n", (loff_t)block * fs->s_blocksize);
+			printf ("reading block %Lu failed\n", (long long int)block * fs->s_blocksize);
 			continue;
 		    }
-		    if (lseek64 (fd, get_offset (&ih->ih_key) + j * fs->s_blocksize - 1,
-				 SEEK_SET) == (loff_t)-1) {
-			printf ("llseek failed to pos %Ld\n", (loff_t)block * fs->s_blocksize);
-			brelse (tmp_bh);
+		    if (lseek64 (fd, reiserfs_key_get_off (&ih->ih_key) + j * fs->s_blocksize - 1,
+				 SEEK_SET) == (off_t)-1) {
+			printf ("llseek failed to pos %Ld\n", (long long int)block * fs->s_blocksize);
+			reiserfs_buffer_close (tmp_bh);
 			continue;
 		    }
 		    if (reiserfs_bitmap_test_bit (bitmap, block))
@@ -108,17 +114,17 @@
 		    else
 			not_used ++;
 		    /*printf ("block of file %Ld gets block %lu\n",
-		      (get_offset (&ih->ih_key) - 1) / fs->s_blocksize + j, block);*/
+		      (reiserfs_key_get_off (&ih->ih_key) - 1) / fs->s_blocksize + j, block);*/
 		    if (write (fd, tmp_bh->b_data, tmp_bh->b_size) != tmp_bh->b_size) {
-			printf ("write failed to pos %Ld\n", (loff_t)block * fs->s_blocksize);
-			brelse (tmp_bh);
+			printf ("write failed to pos %Ld\n", (long long int)block * fs->s_blocksize);
+			reiserfs_buffer_close (tmp_bh);
 			continue;
 		    }
 		    recovered += fs->s_blocksize;
-		    brelse (tmp_bh);
+		    reiserfs_buffer_close (tmp_bh);
 		}
 	    }
-	    brelse (bh);
+	    reiserfs_buffer_close (bh);
 	    break;
 	}
     }
@@ -169,7 +175,7 @@
 			  &ids[0], buf, &ids[2]);
 
 	
-	//do_recover = user_confirmed (stdout, "recover? (Y):", "Y\n");
+	//do_recover = util_user_confirmed (stdout, "recover? (Y):", "Y\n");
 	//if (do_recover)
 	//    reiserfs_warning (stderr, "recovering not ready\n");
 	
@@ -220,7 +226,7 @@
 {
     FILE * fp;
 
-    if (map_file (fs)) {
+    if (map_file (fs) [0] != '\0') {
 	fp = fopen (map_file (fs), "r");
 	if (fp == 0) {
 	    reiserfs_warning (stderr, "do_recover: fopen failed: %m");
@@ -243,24 +249,28 @@
 #include <limits.h>
 
 static long int get_answer(long int max) {
-    char *answer, *tmp;    
-    size_t n = 0;    
+    char answer[256], *tmp;    
     long int result = 0;
 
     do {
 	printf("Which should be left?: ");
-	getline (&answer, &n, stdin);
+	fgets(answer, sizeof(answer), stdin);
 	result = strtol (answer, &tmp, 0);
-	if ((errno != ERANGE) && (result < max) && (result >= 0) &&
+	if ((errno != ERANGE) && 
+	    (result < max) && 
+	    (result >= 0) &&
 	    (answer != tmp))
+	{
 	    break;
+	}
     } while (1);
+    
     return result;
 }
 
 static void recover_items(FILE *fp, reiserfs_filsys_t * fs, FILE *target_file) {
-    struct buffer_head *bh, *bh_pointed;
-    struct item_head *ih;
+    reiserfs_bh_t *bh, *bh_pointed;
+    reiserfs_ih_t *ih;
     struct saved_item item, *cur;
     int size = sizeof(struct saved_item) - sizeof(struct saved_item *);
     struct saved_item *map = NULL;
@@ -277,42 +287,56 @@
 	memcpy((void *)map + map_size - sizeof(struct saved_item), &item, size);
     }
     
-    for (i = 1, cur = map + 1; i <= map_size / sizeof(struct saved_item); i++, cur++) {
-	bh = bread (fs->fs_dev, (cur - 1)->si_block, fs->fs_blocksize);
+    for (i = 1, cur = map + 1; 
+	 i <= map_size / sizeof(struct saved_item); 
+	 i++, cur++) 
+    {
+	bh = reiserfs_buffer_read (fs->fs_dev, (cur - 1)->si_block, 
+			     fs->fs_blocksize);
 	if (!bh) {
-	    reiserfs_warning (fp, "bread failed\n");
+	    reiserfs_warning (fp, "reiserfs_buffer_read failed\n");
 	    continue;
 	}
 
 	if (i == map_size / sizeof(struct saved_item)) {
 	    if (start != -1) {
-		reiserfs_print_item(stdout, bh, B_N_PITEM_HEAD (bh, (cur - 1)->si_item_num));
+		reiserfs_leaf_print(stdout, fs, bh, 0, 
+				    (cur - 1)->si_item_num, 
+				    (cur - 1)->si_item_num + 1);
+		
 		result = get_answer(i - start) + start;
 	    } else {
 		result = i - 1;
 	    }
 	    
 	    start = -1;
-	} else if (is_direntry_ih(&(cur - 1)->si_ih) || is_stat_data_ih(&(cur - 1)->si_ih)) {
-	    brelse(bh);
+	} else if (reiserfs_ih_dir(&(cur - 1)->si_ih) || 
+		   reiserfs_ih_stat(&(cur - 1)->si_ih)) 
+	{
+	    reiserfs_buffer_close(bh);
 	    continue;
 	} else { 
-	    length = get_bytes_number(&(cur - 1)->si_ih, fs->fs_blocksize);
-	    if (offset < get_offset(&(cur - 1)->si_ih.ih_key) + 
-		get_bytes_number(&(cur - 1)->si_ih, fs->fs_blocksize))
-		offset = get_offset(&(cur - 1)->si_ih.ih_key) + (length ? length - 1 : 0);
+	    length = reiserfs_leaf_ibytes(&(cur - 1)->si_ih, fs->fs_blocksize);
+	    if (offset < reiserfs_key_get_off(&(cur - 1)->si_ih.ih_key) + 
+		reiserfs_leaf_ibytes(&(cur - 1)->si_ih, fs->fs_blocksize))
+		offset = reiserfs_key_get_off(&(cur - 1)->si_ih.ih_key) + 
+			(length ? length - 1 : 0);
 	
-	    if (offset >= get_offset(&cur->si_ih.ih_key)) {
+	    if (offset >= reiserfs_key_get_off(&cur->si_ih.ih_key)) {
 		/* Problem interval */
 		if (start == -1)
 		    start = i - 1;
 	    
 		printf("Problem item %d:\n", i - start - 1);
-		reiserfs_print_item(stdout, bh, B_N_PITEM_HEAD (bh, (cur - 1)->si_item_num));
+		reiserfs_leaf_print(stdout, fs, bh, 0, 
+				    (cur - 1)->si_item_num,
+				    (cur - 1)->si_item_num + 1);
 	    } else if (start != -1) {
 		/* problem interval finished */
 		printf("Problem item %d:\n", i - start - 1);
-		reiserfs_print_item(stdout, bh, B_N_PITEM_HEAD (bh, (cur - 1)->si_item_num));
+		reiserfs_leaf_print(stdout, fs, bh, 0, 
+				    (cur - 1)->si_item_num,
+				    (cur - 1)->si_item_num + 1);
 	    
 		result = get_answer((long int)i - start) + start;
 		start = -1;
@@ -320,40 +344,48 @@
 		result = i - 1;
 	    }
 	}
-	brelse(bh);
+	reiserfs_buffer_close(bh);
 	
 	if (start != -1)
 	    continue;
 
-	printf("write %ld\n", result);
-
-	bh = bread (fs->fs_dev, (map + result)->si_block, fs->fs_blocksize);
+	bh = reiserfs_buffer_read (fs->fs_dev, (map + result)->si_block, 
+			     fs->fs_blocksize);
 	if (!bh) {
-	    reiserfs_warning (fp, "bread failed\n");
+	    reiserfs_warning (fp, "reiserfs_buffer_read failed\n");
 	    continue;
 	}
 
-	fseek(target_file, get_offset(&(map + result)->si_ih.ih_key) - 1, SEEK_SET);
-	ih = B_N_PITEM_HEAD (bh, (map + result)->si_item_num);
-	if (is_direct_ih(ih)) {
-	    fwrite(B_I_PITEM(bh, ih), (map + result)->si_ih.ih2_item_len, 1, target_file);
-	} else if (is_indirect_ih(ih)) {
-	    for (j = 0; j < I_UNFM_NUM (ih); j ++) {
-		unfm_ptr = d32_get((__u32 *)B_I_PITEM(bh, ih), j);
+	fseek(target_file, 
+	      reiserfs_key_get_off(&(map + result)->si_ih.ih_key) - 1, 
+	      SEEK_SET);
+	
+	ih = reiserfs_ih_at (bh, (map + result)->si_item_num);
+	
+	if (reiserfs_ih_direct(ih)) {
+	    fwrite(reiserfs_item_by_ih(bh, ih), 
+		   (map + result)->si_ih.ih2_item_len, 1, target_file);
+	} else if (reiserfs_ih_ext(ih)) {
+	    for (j = 0; j < reiserfs_ext_count (ih); j ++) {
+		unfm_ptr = d32_get((__u32 *)reiserfs_item_by_ih(bh, ih), j);
 		if (!unfm_ptr) {
 		    fseek(target_file, fs->fs_blocksize, SEEK_CUR);
 		    continue;
 		}
-		bh_pointed = bread (fs->fs_dev, unfm_ptr, fs->fs_blocksize);
+		bh_pointed = reiserfs_buffer_read (fs->fs_dev, unfm_ptr, 
+					     fs->fs_blocksize);
 		if (!bh_pointed) {
-		    reiserfs_warning (fp, "bread failed\n");
+		    reiserfs_warning (fp, "reiserfs_buffer_read failed\n");
 		    continue;
 		}
-		fwrite(bh_pointed->b_data, fs->fs_blocksize, 1, target_file);
-		brelse(bh_pointed);
+		fwrite(bh_pointed->b_data, 
+		       fs->fs_blocksize, 1, target_file);
+		
+		reiserfs_buffer_close(bh_pointed);
 	    }
 	}
-	brelse(bh);
+	
+	reiserfs_buffer_close(bh);
     }
 
     free(map);
@@ -362,7 +394,7 @@
 void do_recover(reiserfs_filsys_t * fs) {
     FILE *fp, *recovery;
 
-    if (map_file (fs)) {
+    if (map_file (fs)[0] != '\0') {
 	fp = fopen (map_file (fs), "r");
 	if (fp == 0) {
 	    reiserfs_warning (stderr, "fopen failed: %m\n");
diff --git a/debugreiserfs/scan.c b/utils/debugfs/scan.c
similarity index 64%
rename from debugreiserfs/scan.c
rename to utils/debugfs/scan.c
index 8ed9d03..6eb4bf5 100644
--- a/debugreiserfs/scan.c
+++ b/utils/debugfs/scan.c
@@ -3,7 +3,13 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include "debugreiserfs.h"
+#include "util/misc.h"
+
 #include <regex.h>
 #include <obstack.h>
 #include <search.h>
@@ -50,8 +56,8 @@
 
 
 /* attach item to every name in the list */
-static void store_item (struct saved_name * name, struct buffer_head * bh,
-			struct item_head * ih, int pos)
+static void store_item (struct saved_name * name, reiserfs_bh_t * bh,
+			reiserfs_ih_t * ih, int pos)
 {
     struct saved_item * new;
     void * vp;
@@ -60,11 +66,11 @@
     new = obstack_alloc (&item_store, sizeof (struct saved_item));
     new->si_ih = *ih;
     new->si_block = bh->b_blocknr;
-    new->si_item_num = ih - B_N_PITEM_HEAD (bh, 0);
+    new->si_item_num = ih - reiserfs_ih_at (bh, 0);
     new->si_next = 0;
     new->si_entry_pos = pos;
     
-    vp = tfind (new, &name->items, comp_keys);
+    vp = tfind (new, &name->items, reiserfs_key_comp);
     if (vp) {
 	item_in = *(void **)vp;
 	/* add item to the end of list of items having this key */
@@ -76,7 +82,7 @@
 	    item_in = item_in->si_next;
 	}
     } else
-	tsearch (new, &name->items, comp_keys);
+	tsearch (new, &name->items, reiserfs_key_comp);
 
     saved_items ++;
 }
@@ -100,7 +106,7 @@
     name1 = (struct saved_name *)p1;
     name2 = (struct saved_name *)p2;
 
-    return comp_short_keys (&name1->dirid, &name2->dirid);
+    return reiserfs_key_comp2 (&name1->dirid, &name2->dirid);
 }
 
 
@@ -122,8 +128,8 @@
     /* check every name in the list */
     cur = *name_in;
     while (cur) {
-	if (!not_of_one_file (&name->dirid, &cur->dirid) &&
-	    !not_of_one_file (&name->parent_dirid, &cur->parent_dirid)) 
+	if (!reiserfs_key_comp2 (&name->dirid, &cur->dirid) &&
+	    !reiserfs_key_comp2 (&name->parent_dirid, &cur->parent_dirid))
 	{
 	    cur->count ++;
 	    *name_in = cur;
@@ -171,11 +177,11 @@
 
 
 /* take each name matching to a given pattern, */
-static void scan_for_name (struct buffer_head * bh)
+static void scan_for_name (reiserfs_bh_t * bh)
 {
     int i, j, i_num;
-    struct item_head * ih;
-    struct reiserfs_de_head * deh;
+    reiserfs_ih_t * ih;
+    reiserfs_deh_t * deh;
     int namelen;
     char * name;
     struct saved_name * new, *name_in;
@@ -184,25 +190,28 @@
     int min_entry_size = 1;
     int ih_entry_count = 0;
 
-    ih = B_N_PITEM_HEAD (bh, 0);
-    i_num = leaf_item_number_estimate(bh);
+    ih = reiserfs_ih_at (bh, 0);
+    i_num = reiserfs_leaf_estimate_items(bh);
     for (i = 0; i < i_num; i ++, ih ++) {
-	if (!is_direntry_ih (ih))
+	if (!reiserfs_ih_dir (ih))
 	    continue;
-	if (is_it_bad_item (fs, ih, B_I_PITEM (bh, ih), 0, 1))
+	if (reiserfs_leaf_correct_at (fs, ih, reiserfs_item_by_ih (bh, ih), 
+				      0, 1))
+	{
 	    continue;
+	}
 
-	deh = B_I_DEH (bh, ih);
+	deh = reiserfs_deh (bh, ih);
 	
-        if ( (get_ih_entry_count (ih) > (get_ih_item_len(ih) / (DEH_SIZE + min_entry_size))) ||
-            (get_ih_entry_count (ih) == 0))
-            ih_entry_count = get_ih_item_len(ih) / (DEH_SIZE + min_entry_size);
+        if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) ||
+            (reiserfs_ih_get_entries (ih) == 0))
+            ih_entry_count = reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size);
         else 
-            ih_entry_count = get_ih_entry_count (ih);
+            ih_entry_count = reiserfs_ih_get_entries (ih);
 	
 	for (j = 0; j < ih_entry_count; j ++, deh ++) {
-	    name = name_in_entry (deh, j);
-	    namelen = name_in_entry_length (ih, deh, j);
+	    name = reiserfs_deh_name (deh, j);
+	    namelen = reiserfs_direntry_name_len (ih, deh, j);
 	    ch = name[namelen];
 	    name[namelen] = 0;
 	    retval = regexec (&pattern, name, 0, NULL, 0);
@@ -215,15 +224,15 @@
 	    new = obstack_alloc (&name_store, sizeof (struct saved_name) + namelen);
 
 	    /* pointed object */
-	    new->dirid = get_deh_dirid (deh);
-	    new->objectid = get_deh_objectid (deh);
+	    new->dirid = reiserfs_deh_get_did (deh);
+	    new->objectid = reiserfs_deh_get_obid (deh);
 
 	    /* pointer to first name which points the same key */
 	    new->first_name = 0;
 
 	    /* where this name is from */
-	    new->parent_dirid = get_key_dirid (&ih->ih_key);
-	    new->parent_objectid = get_key_objectid (&ih->ih_key);
+	    new->parent_dirid = reiserfs_key_get_did (&ih->ih_key);
+	    new->parent_objectid = reiserfs_key_get_oid (&ih->ih_key);
 	    new->block = bh->b_blocknr;
 
 	    new->count = 1;
@@ -254,16 +263,16 @@
     return;
 }
 
-static struct saved_name *scan_for_key(struct key *key) {
-	char *name;
+static struct saved_name *scan_for_key(reiserfs_key_t *key) {
 	struct saved_name * new, *name_in;
+	char name[REISERFS_NAME_MAX];
 
-	asprintf (&name, "%u_%u", get_key_dirid (key), get_key_objectid (key));
+	sprintf(name, "%u_%u", reiserfs_key_get_did (key), reiserfs_key_get_oid (key));
 	new = obstack_alloc (&name_store, sizeof (struct saved_name) + strlen(name));
 
 	/* pointed object */
-	new->dirid = get_key_dirid (key);
-	new->objectid = get_key_objectid (key);
+	new->dirid = reiserfs_key_get_did (key);
+	new->objectid = reiserfs_key_get_oid (key);
 
 	/* pointer to first name which points the same key */
 	new->first_name = 0;
@@ -282,8 +291,6 @@
 	new->name [new->name_len] = 0;
 	new->name_next = 0;
 
-	free(name);
-	
 	if (name_found (new, &name_in)) {
 		/* there was already exactly this name */
 		obstack_free (&name_store, new);
@@ -296,32 +303,32 @@
 	return new;
 }
 
-static int comp_token_key(struct buffer_head *bh, struct item_head *ih, struct key *key) {
-    struct reiserfs_de_head * deh;
+static int comp_token_key(reiserfs_bh_t *bh, reiserfs_ih_t *ih, reiserfs_key_t *key) {
+    reiserfs_deh_t * deh;
     int j, ih_entry_count = 0;
     int min_entry_size = 1;
     
-    if ((get_key_dirid(&ih->ih_key) == get_key_dirid(key) || 
-	 get_key_dirid(key) == ~(__u32)0) &&
-	(get_key_objectid(&ih->ih_key) == get_key_objectid(key) || 
-	 get_key_objectid(key) == ~(__u32)0))
+    if ((reiserfs_key_get_did(&ih->ih_key) == reiserfs_key_get_did(key) || 
+	 reiserfs_key_get_did(key) == ~(__u32)0) &&
+	(reiserfs_key_get_oid(&ih->ih_key) == reiserfs_key_get_oid(key) || 
+	 reiserfs_key_get_oid(key) == ~(__u32)0))
 	return -1;
 
-    if (!is_direntry_ih (ih))
+    if (!reiserfs_ih_dir (ih))
 	return 0;
 	
-    deh = B_I_DEH (bh, ih);
+    deh = reiserfs_deh (bh, ih);
 
-    if ( (get_ih_entry_count (ih) > (get_ih_item_len(ih) / (DEH_SIZE + min_entry_size))) ||
-	 (get_ih_entry_count (ih) == 0))
-	 ih_entry_count = get_ih_item_len(ih) / (DEH_SIZE + min_entry_size);
+    if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) ||
+	 (reiserfs_ih_get_entries (ih) == 0))
+	 ih_entry_count = reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size);
     else 
-	 ih_entry_count = get_ih_entry_count (ih);
+	 ih_entry_count = reiserfs_ih_get_entries (ih);
 
 	
     for (j = 0; j < ih_entry_count; j ++, deh ++) {
-	if ((get_deh_dirid (deh) == get_key_dirid (key) || (int)get_key_dirid (key) == -1) &&
-	    (get_deh_objectid (deh) == get_key_objectid (key) || (int)get_key_objectid (key) == -1)) 
+	if ((reiserfs_deh_get_did (deh) == reiserfs_key_get_did (key) || (int)reiserfs_key_get_did (key) == -1) &&
+	    (reiserfs_deh_get_obid (deh) == reiserfs_key_get_oid (key) || (int)reiserfs_key_get_oid (key) == -1)) 
 	{
 	    return j;
 	}
@@ -332,15 +339,15 @@
 
 /* take every item, look for its key in the key index, if it is found - store
    item in the sorted list of items of a file */
-static void scan_items (struct buffer_head * bh, struct key *key) {
+static void scan_items (reiserfs_bh_t * bh, reiserfs_key_t *key) {
     int i, i_num, pos;
-    struct item_head * ih;
+    reiserfs_ih_t * ih;
     struct saved_name * name_in_store;
     void * res;
 
 
-    ih = B_N_PITEM_HEAD (bh, 0);
-    i_num = leaf_item_number_estimate(bh);
+    ih = reiserfs_ih_at (bh, 0);
+    i_num = reiserfs_leaf_estimate_items(bh);
     for (i = 0; i < i_num; i ++, ih ++) {
 	if (key) {
 	    if (!(pos = comp_token_key(bh, ih, key)))
@@ -363,7 +370,7 @@
 
 /* FIXME: does not work for long files */
 struct version {
-    int flag; /* direct or indirect */
+    int flag; /* direct or extent */
     int len;
     __u32 from;
     int count;
@@ -393,15 +400,15 @@
 struct file_map map;
 
 
-static int have_to_append (struct item_head * ih)
+static int have_to_append (reiserfs_ih_t * ih)
 {
-    loff_t off = get_offset (&ih->ih_key);
+    unsigned long long off = reiserfs_key_get_off (&ih->ih_key);
 
-    if (is_indirect_ih (ih)) {
+    if (reiserfs_ih_ext (ih)) {
 	if (map.head_len * fs->fs_blocksize + 1 <= off)
 	    return 1;
 	return 0;
-    } else if (is_direct_ih (ih)) {
+    } else if (reiserfs_ih_direct (ih)) {
 	int i;
 	__u32 tail_start;
 	
@@ -422,24 +429,24 @@
 }
 
 
-static void do_append (struct item_head * ih, void * data)
+static void do_append (reiserfs_ih_t * ih, void * data)
 {
     int i;
     int padd;
-    unsigned long long off = get_offset (&ih->ih_key);
+    unsigned long long off = reiserfs_key_get_off (&ih->ih_key);
 
-    if (is_indirect_ih (ih)) {
+    if (reiserfs_ih_ext (ih)) {
 
 	padd = (off - 1) / fs->fs_blocksize - map.head_len;
-	map.head = realloc (map.head, (map.head_len + padd + I_UNFM_NUM (ih)) * 4);
+	map.head = realloc (map.head, (map.head_len + padd + reiserfs_ext_count (ih)) * 4);
 	if (!map.head)
 	    reiserfs_panic ("realloc failed");
 	memset ((char *)map.head + map.head_len * 4, 0, padd * 4);
 	memcpy ((char *)map.head + (map.head_len + padd) * 4, data,
-		get_ih_item_len (ih));
-	map.head_len += (padd + I_UNFM_NUM (ih));
+		reiserfs_ih_get_len (ih));
+	map.head_len += (padd + reiserfs_ext_count (ih));
 
-    } else if (is_direct_ih (ih)) {
+    } else if (reiserfs_ih_direct (ih)) {
 	unsigned int tail_start, skip;
 	
 	// find correct tail first 
@@ -448,13 +455,13 @@
 	for (i = 0; i < map.tail_nr; i ++) {
 	    if (map.tails[i].offset == tail_start) {
 		map.tails[i].data = realloc (map.tails[i].data,
-					     off - tail_start + get_ih_item_len (ih));
+					     off - tail_start + reiserfs_ih_get_len (ih));
 		if (!map.tails[i].data)
 		    reiserfs_panic ("realloc failed");
 		padd = skip - map.tails[i].len;
 		memset (map.tails[i].data + map.tails[i].len, 0, padd);
-		memcpy (map.tails[i].data + map.tails[i].len + padd, data, get_ih_item_len (ih));
-		map.tails[i].len += (padd + get_ih_item_len (ih));
+		memcpy (map.tails[i].data + map.tails[i].len + padd, data, reiserfs_ih_get_len (ih));
+		map.tails[i].len += (padd + reiserfs_ih_get_len (ih));
 		return;
 	    }
 	}
@@ -464,45 +471,48 @@
 	    reiserfs_panic ("realloc failed");
 
 	map.tails[map.tail_nr].offset = off;
-	map.tails[map.tail_nr].len = skip + get_ih_item_len (ih);
+	map.tails[map.tail_nr].len = skip + reiserfs_ih_get_len (ih);
 	map.tails[map.tail_nr].data = malloc (map.tails[map.tail_nr].len);
 	memset (map.tails[map.tail_nr].data, 0, skip);
-	memcpy (map.tails[map.tail_nr].data + skip, data, get_ih_item_len (ih));
+	memcpy (map.tails[map.tail_nr].data + skip, data, reiserfs_ih_get_len (ih));
 	map.tail_nr ++;		    
     }
 }
 
 
 // map contains 
-static void do_overwrite (struct item_head * ih, void * data)
+static void do_overwrite (reiserfs_ih_t * ih, void * data)
 {
     unsigned long long off, skip;
     int to_compare, to_append;
-    struct item_head tmp_ih;
+    reiserfs_ih_t tmp_ih;
     char * p;
     
-    off = get_offset (&ih->ih_key);
+    off = reiserfs_key_get_off (&ih->ih_key);
     
-    if (is_indirect_ih (ih)) {
+    if (reiserfs_ih_ext (ih)) {
 
 	skip = (off - 1) / fs->fs_blocksize;
-	to_compare = (map.head_len - skip > I_UNFM_NUM (ih)) ? 
-	    I_UNFM_NUM (ih) : (map.head_len - skip);
-	to_append = I_UNFM_NUM (ih) - to_compare;
+	to_compare = (map.head_len - skip > reiserfs_ext_count (ih)) ? 
+	    reiserfs_ext_count (ih) : (map.head_len - skip);
+	to_append = reiserfs_ext_count (ih) - to_compare;
 	
 	p = (char *)map.head + skip * 4;
 
 	if (memcmp (p, data, to_compare * 4))
-	    reiserfs_warning (stderr, "overwrite (indirect): %H contains different data\n", ih);
+	    reiserfs_warning (stderr, "overwrite (extent): %H contains different data\n", ih);
 
 	if (to_append) {
 	    tmp_ih = *ih;
-	    set_ih_item_len (&tmp_ih, get_ih_item_len (ih) - to_compare * 4);
-	    set_offset (key_format (&ih->ih_key), &tmp_ih.ih_key, off + to_compare * fs->fs_blocksize);
+	    reiserfs_ih_set_len (&tmp_ih, reiserfs_ih_get_len (ih) - to_compare * 4);
+	    reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+				     &tmp_ih.ih_key, off + to_compare * 
+				     fs->fs_blocksize);
+	    
 	    do_append (&tmp_ih, (char *)data + to_compare * 4);
 	}
 
-    } else if (is_direct_ih (ih)) {
+    } else if (reiserfs_ih_direct (ih)) {
 	unsigned int tail_start;
 	int i;
 
@@ -512,21 +522,25 @@
 	    if (map.tails[i].offset == tail_start) {
 		// ih is a part of this tail 
 		skip = (off - 1) & (fs->fs_blocksize - 1);
-		to_compare = (map.tails[i].len - skip > get_ih_item_len (ih) ? get_ih_item_len (ih) :
+		to_compare = (map.tails[i].len - skip > reiserfs_ih_get_len (ih) ? reiserfs_ih_get_len (ih) :
 		    map.tails[i].len - skip);
-		to_append = get_ih_item_len (ih) - to_compare;
+		to_append = reiserfs_ih_get_len (ih) - to_compare;
 
 		p = (char *)map.tails[i].data + skip;
 
 		if (memcmp (p, data, to_compare))
-		    reiserfs_warning (stderr, "overwrite (direct): %H contains different data\n", ih);
+		    reiserfs_warning (stderr, "overwrite (direct): %H contains "
+				      "different data\n", ih);
 		
 		if (to_append) {
 		    tmp_ih = *ih;
-		    set_ih_item_len (&tmp_ih, get_ih_item_len (ih) - to_compare);
-		    set_offset (key_format (&ih->ih_key), &tmp_ih.ih_key, off + to_compare);
+		    reiserfs_ih_set_len (&tmp_ih, reiserfs_ih_get_len (ih) - to_compare);
+		    reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+					     &tmp_ih.ih_key, off + to_compare);
+		    
 		    do_append (&tmp_ih, (char *)data + to_compare);
 		}
+		
 		return;
 	    }
 	}
@@ -537,19 +551,19 @@
 
 static void map_one_item (struct saved_item * item)
 {
-    struct buffer_head * bh;
-    struct item_head * ih;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
     void * data;
 
     // read the block containing the item 
-    bh = bread (fs->fs_dev, item->si_block, fs->fs_blocksize);
+    bh = reiserfs_buffer_read (fs->fs_dev, item->si_block, fs->fs_blocksize);
     if (!bh) {
-	reiserfs_warning (stderr, "bread failed\n");
+	reiserfs_warning (stderr, "reiserfs_buffer_read failed\n");
 	return;
     }
 
-    ih = B_N_PITEM_HEAD (bh, item->si_item_num);
-    data = B_I_PITEM (bh, ih);
+    ih = reiserfs_ih_at (bh, item->si_item_num);
+    data = reiserfs_item_by_ih (bh, ih);
     if (memcmp (&item->si_ih, ih, sizeof (*ih)))
 	reiserfs_panic ("wrong item");
 
@@ -558,22 +572,22 @@
     } else
 	do_overwrite (ih, data);
 
-    brelse (bh);
+    reiserfs_buffer_close (bh);
 }
 
 // flush map which is in variable map 
 static void flush_map (reiserfs_filsys_t * fs,
-		       struct key * dir,
+		       reiserfs_key_t * dir,
 		       char * name,
-		       struct key * key)
+		       reiserfs_key_t * key)
 {
     int i;
     FILE * fp;
     __u32 v32;
 
 
-    if (!map_file (fs))
-	asprintf (&map_file (fs), "%s", ".map");
+    if (map_file (fs) == '\0')
+	sprintf(map_file (fs), ".map");
 	
     //reiserfs_warning (stderr, "Saving maps into %s\n", map_file (fs));
     fp = fopen (map_file (fs), "a");
@@ -596,10 +610,10 @@
     fwrite (name, v32, 1, fp);
     
     // short key of a directory 
-    fwrite (dir, SHORT_KEY_SIZE, 1, fp);
+    fwrite (dir, REISERFS_KEY_SHSIZE, 1, fp);
 
     // short key of file 
-    fwrite (key, SHORT_KEY_SIZE, 1, fp);
+    fwrite (key, REISERFS_KEY_SHSIZE, 1, fp);
 
     // list of data block pointers 
     fwrite (&map.head_len, sizeof (map.head_len), 1, fp);
@@ -642,11 +656,11 @@
     item = *(struct saved_item **)nodep;
 
     // 1. find the longest item 
-    max_bytes = get_bytes_number (&item->si_ih, fs->fs_blocksize);
+    max_bytes = reiserfs_leaf_ibytes (&item->si_ih, fs->fs_blocksize);
     longest = item;
     while (item->si_next) {
 	item = item->si_next;
-	bytes = get_bytes_number (&item->si_ih, fs->fs_blocksize);
+	bytes = reiserfs_leaf_ibytes (&item->si_ih, fs->fs_blocksize);
 	if (bytes > max_bytes) {
 	    longest = item;
 	    max_bytes = bytes;
@@ -684,8 +698,8 @@
 		twalk (name->items, map_item_list);
 		
 		// write map to a file 
-		flush_map (fs, (struct key *)&name->parent_dirid, name->name,
-			   (struct key *)&name->dirid);
+		flush_map (fs, (reiserfs_key_t *)&name->parent_dirid, name->name,
+			   (reiserfs_key_t *)&name->dirid);
 		
 	    } else if (name->first_name)
 		reiserfs_warning (stdout, "[%K]:\"%s\" has item list\n",
@@ -703,27 +717,27 @@
 */
 
 static void print_items(FILE *fp, reiserfs_filsys_t * fs) {
-    struct buffer_head *bh;
-    struct item_head *ih;
+    reiserfs_bh_t *bh;
     struct saved_item item;
     int size = sizeof(struct saved_item) - sizeof(struct saved_item *);
 
     while (fread(&item, size, 1, fp) == 1) {
-	bh = bread (fs->fs_dev, item.si_block, fs->fs_blocksize);
+	bh = reiserfs_buffer_read (fs->fs_dev, item.si_block, fs->fs_blocksize);
 	if (!bh) {
-	    reiserfs_warning (fp, "bread failed\n");
+	    reiserfs_warning (fp, "reiserfs_buffer_read failed\n");
 	    continue;
 	}
-	ih = B_N_PITEM_HEAD (bh, item.si_item_num);
-	reiserfs_print_item(stdout, bh, ih);
-	brelse(bh);
+	reiserfs_leaf_print(stdout, fs, bh, 0, 
+			    item.si_item_num, 
+			    item.si_item_num + 1);
+	reiserfs_buffer_close(bh);
     }
 }
 
 void print_map(reiserfs_filsys_t * fs) {
     FILE * fp;
 
-    if (map_file (fs)) {
+    if (map_file (fs) [0] != '\0') {
 	fp = fopen (map_file (fs), "r");
 	if (fp == 0) {
 	    reiserfs_warning (stderr, "fopen failed: %m\n");
@@ -760,7 +774,7 @@
 	if (fp) {
 	    fwrite(item, sizeof(struct saved_item) - sizeof(struct saved_item *), 1, fp);
 	} else {
-	    if (is_direntry_ih (&item->si_ih) && item->si_entry_pos != -1) {
+	    if (reiserfs_ih_dir (&item->si_ih) && item->si_entry_pos != -1) {
 		reiserfs_warning(log_to, "block %lu, item %d (%H): entry %d\n",
 				 item->si_block, item->si_item_num, 
 				 &item->si_ih, item->si_entry_pos);
@@ -778,15 +792,15 @@
 
 static void make_map(const void *nodep, VISIT value, int level) {
     struct saved_name * name;
-    char *file_name = 0;
+    char file_name[4096];
     static int nr = 0;
 
     name = *(struct saved_name **)nodep;
     
     if (value == leaf || value == postorder) {
 	while (name) {
-	    if (map_file(fs)) {
-		asprintf(&file_name, "%s.%d", map_file(fs), ++nr);
+	    if (map_file(fs)[0] != '\0') {
+		sprintf(file_name, "%s.%d", map_file(fs), ++nr);
 		reiserfs_warning (log_to, "%d - (%d): [%K]:\"%s\": stored in the %s\n", 
 				  nr, name->count, &name->parent_dirid, name->name, file_name);
 
@@ -805,148 +819,143 @@
 	    if (fp) {
 		fclose(fp);
 		fp = NULL;
-		free(file_name);
 	    }
 	}
     }
 }
 
 /* store map if it is a regular file */
-static void locate_file (reiserfs_filsys_t * fs, struct key * key)
+static void locate_file (reiserfs_filsys_t * fs, reiserfs_key_t * key)
 {
-    INITIALIZE_PATH (path);
-    struct key * next_key;
+    REISERFS_PATH_INIT (path);
+    const reiserfs_key_t * next_key;
     int retval;
 
     do {
-	retval = reiserfs_search_by_key_4 (fs, key, &path);
+	retval = reiserfs_tree_search_item (fs, key, &path);
 	if (retval != ITEM_FOUND)
 	    break;
 
-	if (!is_stat_data_key (key) && !is_direntry_key (key)) {
+	if (!reiserfs_key_stat (key) && !reiserfs_key_dir (key)) {
 	    struct saved_item si;
 
-	    si.si_block = get_bh (&path)->b_blocknr;
-	    si.si_item_num = get_item_pos (&path);
-	    si.si_ih = *get_ih (&path);
+	    si.si_block = REISERFS_PATH_LEAF (&path)->b_blocknr;
+	    si.si_item_num = REISERFS_PATH_LEAF_POS (&path);
+	    si.si_ih = *REISERFS_PATH_IH (&path);
 	    map_one_item (&si);
 	}
 
-	/*reiserfs_warning (stdout, "\t");
-	  reiserfs_print_item (stdout, get_bh (&path), get_ih (&path));*/
-	
-	next_key = reiserfs_next_key (&path);
-	if (!next_key || not_of_one_file (next_key, key))
+	next_key = reiserfs_tree_next_key (&path, fs);
+	if (!next_key || reiserfs_key_comp2 (next_key, key))
 	    break;
 
 	*key = *next_key;
-	pathrelse (&path); 
+	reiserfs_tree_pathrelse (&path); 
     } while (1);
 
-    pathrelse (&path); 
+    reiserfs_tree_pathrelse (&path); 
 }
 
 
 /* read stdin and look for specified name in the specified directory */
 static void look_for_name (reiserfs_filsys_t * fs)
 {
-    INITIALIZE_PATH (path);
-    char * name, * objectid, * dirid;
-    size_t n;
-    struct key key = {0, };
+    char buf[256], *p;
+    unsigned long dirid, objectid;
+    REISERFS_PATH_INIT (path);
+    reiserfs_key_t key = {0, };
 
-    reiserfs_warning (stderr,
-		      "Enter dirid objectid \"name\" or press ^D to quit\n");
+    reiserfs_warning (stderr, "Enter dirid objectid "
+		      "\"name\" or press ^D to quit\n");
     while (1) {
 	reiserfs_warning (stderr, ">");
-	n = 0; dirid = 0;
-	if (getdelim (&dirid, &n, ' ', stdin) == -1)
-	    break;
-	if (!strcmp (dirid, "\n"))
-	    break;
-	set_key_dirid (&key, atol (dirid));
+	
+	fgets(buf, sizeof(buf), stdin);
+	if ((p = (char *)strtok(buf, " \t\n")) == NULL)
+		continue;
+	
+	if (sscanf(p, "%lu ", &dirid) <= 0)
+		continue;
+	
+	if ((p = (char *)strtok(NULL, " \t\n")) == NULL)
+		continue;
+	
+	if (sscanf(p, "%lu ", &objectid) <= 0)
+		continue;
+	
+	if ((p = (char *)strtok(NULL, " \t\n")) == NULL)
+		continue;
+	
+	reiserfs_key_set_did (&key, dirid);
+	reiserfs_key_set_oid (&key, objectid);
 
-	n = 0; objectid = 0;
-	if (getdelim (&objectid, &n, ' ', stdin) == -1)
-	    break;
-	set_key_objectid (&key, atol (objectid));
-
-	n = 0; name = 0;
-	if (getdelim (&name, &n, '\n', stdin) == -1)
-	    break;
-
-	name [strlen (name) - 1] = 0;
+	p [strlen(p) - 1] = '\0';
 	reiserfs_warning (stdout, "looking for file \"%s\" in (%K) - ",
-			  name, &key);
+			  p, &key);
 
-	if (reiserfs_locate_entry (fs, &key, name, &path)) {
-	    struct key fkey = {0, };
-	    struct reiserfs_de_head * deh;
+	if (reiserfs_tree_scan_name (fs, &key, p, &path)) {
+	    reiserfs_key_t fkey = {0, };
+	    reiserfs_deh_t * deh;
 
 	    reiserfs_warning (stdout, "name is found in block %lu (item %d, entry %d)\n",
-			      get_bh (&path)->b_blocknr, get_item_pos (&path),
+			      REISERFS_PATH_LEAF (&path)->b_blocknr, REISERFS_PATH_LEAF_POS (&path),
 			      path.pos_in_item);
-	    deh = B_I_DEH (get_bh (&path), get_ih (&path)) + path.pos_in_item;
-	    set_key_dirid (&fkey, get_deh_dirid (deh));
-	    set_key_objectid (&fkey, get_deh_objectid (deh));
+	    deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), REISERFS_PATH_IH (&path)) + path.pos_in_item;
+	    reiserfs_key_set_did (&fkey, reiserfs_deh_get_did (deh));
+	    reiserfs_key_set_oid (&fkey, reiserfs_deh_get_obid (deh));
 	    
-	    pathrelse (&path);
+	    reiserfs_tree_pathrelse (&path);
 
 	    /* look for file and print its layout */
 	    memset (&map, 0, sizeof (struct file_map));
 
 	    locate_file (fs, &fkey);
 
-	    flush_map (fs, &key, name, &fkey);
-
+	    flush_map (fs, &key, p, &fkey);
 	} else {
 	    reiserfs_warning (stdout, "name not found\n");
 	}
-
-	free (dirid);
-	free (objectid);
-	free (name);
     }
 }
 
 #if 0
-static void scan_for_key (struct buffer_head * bh, struct key * key)
+static void scan_for_key (reiserfs_bh_t * bh, reiserfs_key_t * key)
 {
     int i, j, i_num;
-    struct item_head * ih;
-    struct reiserfs_de_head * deh;
+    reiserfs_ih_t * ih;
+    reiserfs_deh_t * deh;
     int min_entry_size = 1;
     int ih_entry_count = 0;
 
-    ih = B_N_PITEM_HEAD (bh, 0);
-    i_num = leaf_item_number_estimate(bh);
+    ih = reiserfs_ih_at (bh, 0);
+    i_num = reiserfs_leaf_estimate_items(bh);
     for (i = 0; i < i_num; i ++, ih ++) {
-	if ((get_key_dirid(&ih->ih_key) == get_key_dirid(key) || 
-	     get_key_dirid(key) == ~(__u32)0) &&
-	    (get_key_objectid(&ih->ih_key) == get_key_objectid(key) || 
-	     get_key_objectid(key) == ~(__u32)0)) 
+	if ((reiserfs_key_get_did(&ih->ih_key) == reiserfs_key_get_did(key) || 
+	     reiserfs_key_get_did(key) == ~(__u32)0) &&
+	    (reiserfs_key_get_oid(&ih->ih_key) == reiserfs_key_get_oid(key) || 
+	     reiserfs_key_get_oid(key) == ~(__u32)0)) 
 	{
 	    reiserfs_warning(log_to, "%d-th item of block %lu is item of file %K: %H\n",
 			      i, bh->b_blocknr, key, ih);
 	}
-	if (!is_direntry_ih (ih))
+	if (!reiserfs_ih_dir (ih))
 	    continue;
-	deh = B_I_DEH (bh, ih);
+	deh = reiserfs_deh (bh, ih);
 	
-        if ( (get_ih_entry_count (ih) > (get_ih_item_len(ih) / (DEH_SIZE + min_entry_size))) ||
-            (get_ih_entry_count (ih) == 0))
-            ih_entry_count = get_ih_item_len(ih) / (DEH_SIZE + min_entry_size);
+        if ( (reiserfs_ih_get_entries (ih) > (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) ||
+            (reiserfs_ih_get_entries (ih) == 0))
+            ih_entry_count = reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size);
         else 
-            ih_entry_count = get_ih_entry_count (ih);
+            ih_entry_count = reiserfs_ih_get_entries (ih);
 	
 	
 	for (j = 0; j < ih_entry_count; j ++, deh ++) {
-	    if ((get_deh_dirid (deh) == get_key_dirid (key) || (int)get_key_dirid (key) == -1) &&
-		(get_deh_objectid (deh) == get_key_objectid (key) || (int)get_key_objectid (key) == -1)) {
+	    if ((reiserfs_deh_get_did (deh) == reiserfs_key_get_did (key) || (int)reiserfs_key_get_did (key) == -1) &&
+		(reiserfs_deh_get_obid (deh) == reiserfs_key_get_oid (key) || (int)reiserfs_key_get_oid (key) == -1)) {
 		reiserfs_warning (log_to, "dir item %d (%H) of block %lu has "
 				  "entry (%d-th) %.*s pointing to %K\n",
 				  i, ih, bh->b_blocknr, j,
-				  name_in_entry_length (ih, deh, j), name_in_entry (deh, j), key);
+				  reiserfs_direntry_name_len (ih, deh, j), reiserfs_deh_name (deh, j), key);
 	    }
 	}	
     }
@@ -957,11 +966,10 @@
 void do_scan (reiserfs_filsys_t * fs)
 {
     unsigned long i;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     int type;
-    char * answer = 0;
-    size_t n = 0;
-    struct key key = {0, 0, };
+    char answer[256];
+    reiserfs_key_t key = {0, 0, };
     unsigned long done, total;
 
     if (debug_mode (fs) == DO_LOOK_FOR_NAME) {
@@ -990,35 +998,37 @@
 	}
 
 	printf ("Looking for names matching %s\n", name_pattern (fs));
-	set_key_dirid (&key, 1);
+	reiserfs_key_set_did (&key, 1);
     } else {
 	printf ("What key do you want to find: dirid?");
-	getline (&answer, &n, stdin);
-	set_key_dirid (&key, atoi (answer));
+	fgets(answer, sizeof(answer), stdin);
+	reiserfs_key_set_did (&key, atoi (answer));
 
 	printf ("objectid?");
-	getline (&answer, &n, stdin);
-	set_key_objectid (&key, atoi (answer));
+	fgets(answer, sizeof(answer), stdin);
+	reiserfs_key_set_oid (&key, atoi (answer));
 	reiserfs_warning (stderr, "looking for (%K)\n", &key);
     }
 
     if (debug_mode (fs) == DO_SCAN_FOR_NAME) {
 	done = 0;
-	for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
+	for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
 	    if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i))
 		continue;
-	    bh = bread (fs->fs_dev, i, fs->fs_blocksize);
+	    bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
 	    if (!bh) {
 		printf ("could not read block %lu\n", i);
 		continue;
 	    }
-	    type = who_is_this (bh->b_data, bh->b_size);
-	    if (type == THE_LEAF || type == HAS_IH_ARRAY)
+	    type = reiserfs_node_type (bh);
+	    if (type == NT_LEAF || type == NT_IH_ARRAY)
 		scan_for_name (bh);
 	    else
 		reiserfs_bitmap_clear_bit (input_bitmap (fs), i);
-	    brelse (bh);
-	    print_how_far (stderr, &done, total, 1, be_quiet (fs));
+	    reiserfs_buffer_close (bh);
+	    
+	    if (!misc_test_bit(PRINT_QUIET, &data(fs)->options))
+		util_misc_progress (stderr, &done, total, 1, 0);
 	}
     }
 
@@ -1033,40 +1043,42 @@
     done = 0;
     total = reiserfs_bitmap_ones (input_bitmap (fs));
     printf ("%ld bits set in bitmap\n", total);
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
+    for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
 	int type;
 	
 	if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i))
 	    continue;
-	bh = bread (fs->fs_dev, i, fs->fs_blocksize);
+	bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
 	if (!bh) {
 	    printf ("could not read block %lu\n", i);
 	    continue;
 	}
-	type = who_is_this (bh->b_data, bh->b_size);
+	type = reiserfs_node_type (bh);
 	switch (type) {
-	case THE_JDESC:
-	    if (!get_key_dirid (&key))
+	case NT_JDESC:
+	    if (!reiserfs_key_get_did (&key))
 		printf ("block %lu is journal descriptor\n", i);
 	    break;
-	case THE_SUPER:
-	    if (!get_key_dirid (&key))
+	case NT_SUPER:
+	    if (!reiserfs_key_get_did (&key))
 		printf ("block %lu is reiserfs super block\n", i);
 	    break;
-	case THE_INTERNAL:
-	    if (!get_key_dirid (&key))
+	case NT_INTERNAL:
+	    if (!reiserfs_key_get_did (&key))
 		printf ("block %lu is reiserfs internal node\n", i);
 	    break;
-	case THE_LEAF:
-	case HAS_IH_ARRAY:
+	case NT_LEAF:
+	case NT_IH_ARRAY:
 	    scan_items (bh, (debug_mode (fs) == DO_SCAN_FOR_NAME ? NULL : &key));
 	    break;
 	default:
 	    break;
 	}
 
-	brelse (bh);
-	print_how_far (stderr, &done, total, 1, be_quiet (fs));
+	reiserfs_buffer_close (bh);
+	
+	if (!misc_test_bit(PRINT_QUIET, &data(fs)->options))
+	    util_misc_progress (stderr, &done, total, 1, 0);
     }
     fprintf (stderr, "\nThere were %d items saved\n", saved_items);
 
diff --git a/debugreiserfs/stat.c b/utils/debugfs/stat.c
similarity index 73%
rename from debugreiserfs/stat.c
rename to utils/debugfs/stat.c
index 6e8ff96..ade29bc 100644
--- a/debugreiserfs/stat.c
+++ b/utils/debugfs/stat.c
@@ -3,7 +3,13 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include "debugreiserfs.h"
+#include "util/misc.h"
+
 #include <search.h>
 #include <obstack.h>
 
@@ -39,7 +45,7 @@
 static int comp_items_1 (const void * p1, const void * p2)
 {
     int retval;
-    struct item_head * ih1, * ih2;
+    reiserfs_ih_t * ih1, * ih2;
 
     /*    
     if (*(int *)p1 != *(int *)p2)
@@ -47,22 +53,22 @@
     else
       retval = 0;
     */
-    retval = comp_keys (p1, p2);
-    /*retval = comp_short_keys (p1, p2);*/
+    retval = reiserfs_key_comp (p1, p2);
+    /*retval = reiserfs_key_comp2 (p1, p2);*/
     if (retval)
 	return retval;
 
 
-    ih1 = (struct item_head *)p1;
-    ih2 = (struct item_head *)p2;
+    ih1 = (reiserfs_ih_t *)p1;
+    ih2 = (reiserfs_ih_t *)p2;
 
-    if (get_ih_item_len (ih1) < get_ih_item_len (ih2))
+    if (reiserfs_ih_get_len (ih1) < reiserfs_ih_get_len (ih2))
 	return -1;
-    if (get_ih_item_len (ih1) > get_ih_item_len (ih2))
+    if (reiserfs_ih_get_len (ih1) > reiserfs_ih_get_len (ih2))
 	return 1;
-    if (get_ih_entry_count (ih1) < get_ih_entry_count (ih2))
+    if (reiserfs_ih_get_entries (ih1) < reiserfs_ih_get_entries (ih2))
 	return -1;
-    if (get_ih_entry_count (ih1) > get_ih_entry_count (ih2))
+    if (reiserfs_ih_get_entries (ih1) > reiserfs_ih_get_entries (ih2))
 	return 1;
 
     return 0;
@@ -77,13 +83,13 @@
     if (value == leaf) {
 	for (i = 0; i < level; i ++)
 	    reiserfs_warning (stdout, "\t");
-	reiserfs_warning (stdout, "%H\n", *(struct item_head **)nodep);
+	reiserfs_warning (stdout, "%H\n", *(reiserfs_ih_t **)nodep);
 	return;
     }
     if (value == postorder) {
 	for (i = 0; i < level; i ++)
 	    reiserfs_warning (stdout, "\t");
-	reiserfs_warning (stdout, "%H\n", *(struct item_head **)nodep);
+	reiserfs_warning (stdout, "%H\n", *(reiserfs_ih_t **)nodep);
     }
 }
 */
@@ -94,7 +100,7 @@
     void * res;
     void * key1;
 
-    key1 = obstack_copy (ostack, ih, IH_SIZE);
+    key1 = obstack_copy (ostack, ih, REISERFS_IH_SIZE);
     res = tsearch (key1, tree, comp_items_1);
     if (!res)
 	reiserfs_panic ("Too many keys found");
@@ -113,16 +119,16 @@
 }
 
 
-static void stat1_the_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh)
+static void stat1_the_leaf (reiserfs_filsys_t * fs, reiserfs_bh_t * bh)
 {
     int i, i_num;
-    struct item_head * ih;
+    reiserfs_ih_t * ih;
     int is_there_unique_item;
 
 
-    ih = B_N_PITEM_HEAD (bh, 0);
+    ih = reiserfs_ih_at (bh, 0);
     is_there_unique_item = 0;
-    i_num = leaf_item_number_estimate(bh);
+    i_num = reiserfs_leaf_estimate_items(bh);
     for (i = 0; i < i_num; i ++, ih ++) {
 	/* count all items */
 	fs_stat.all ++;
@@ -140,21 +146,21 @@
 	fs_stat.blocks_to_skip ++;
 	reiserfs_bitmap_clear_bit (input_bitmap (fs), bh->b_blocknr);
     } else {
-	ih = B_N_PITEM_HEAD (bh, 0);
+	ih = reiserfs_ih_at (bh, 0);
 	/* node contains at least one unique item. We will put it in, count items of each type */
 	for (i = 0; i < i_num; i ++, ih ++) {
-	    fs_stat.items [get_type (&ih->ih_key)] ++;
+	    fs_stat.items [reiserfs_key_get_type (&ih->ih_key)] ++;
 	}
     }
 }
 
 /*
-static void stat2_the_leaf (struct buffer_head * bh)
+static void stat2_the_leaf (reiserfs_bh_t * bh)
 {
     int i;
-    struct item_head * ih;
+    reiserfs_ih_t * ih;
 
-    ih = B_N_PITEM_HEAD (bh, 0);
+    ih = reiserfs_ih_at (bh, 0);
     for (i = 0; i < node_item_number (bh); i ++, ih ++) {
 	
     }
@@ -165,7 +171,7 @@
 {
     unsigned long i;
     unsigned long done, total;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     int type;
     FILE * fp;
 
@@ -174,7 +180,7 @@
     items_tree = 0;
 
 /*
-    bh = bread (fs->s_dev, 8211, fs->s_blocksize);
+    bh = reiserfs_buffer_read (fs->s_dev, 8211, fs->s_blocksize);
     stat1_the_leaf (fs, bh);
     
     return;
@@ -183,26 +189,27 @@
     /* pass 0 of stating */
     total = reiserfs_bitmap_ones (input_bitmap (fs));
     done = 0;
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
+    for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
 	if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i))
 	    continue;
 
-	print_how_far (stderr, &done, total, 1, be_quiet (fs));
+	if (!misc_test_bit(PRINT_QUIET, &data(fs)->options))
+	    util_misc_progress (stderr, &done, total, 1, 0);
 
-	bh = bread (fs->fs_dev, i, fs->fs_blocksize);
+	bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
 	if (!bh) {
 	    printf ("could not read block %lu\n", i);
 	    continue;
 	}
-	type = who_is_this (bh->b_data, bh->b_size);
-	if (type != THE_LEAF && type != HAS_IH_ARRAY) {
+	type = reiserfs_node_type (bh);
+	if (type != NT_LEAF && type != NT_IH_ARRAY) {
 	    reiserfs_bitmap_clear_bit (input_bitmap (fs), i);
-	    brelse (bh);
+	    reiserfs_buffer_close (bh);
 	    continue;
 	}
 	fs_stat.leaves ++;
 	stat1_the_leaf (fs, bh);
-	brelse (bh);
+	reiserfs_buffer_close (bh);
     }
 
     reiserfs_warning (stderr, "\nThere were found on the '%s' device:\n"
@@ -211,7 +218,7 @@
 		      "\tblocks containing at least one unique item %lu\n"
 		      "\tblocks which can be skipped %lu\n"
 		      "\t\tstat data %lu\n"
-		      "\t\tindirect %lu\n"
+		      "\t\textent %lu\n"
 		      "\t\tdirect %lu\n"
 		      "\t\tdirectory items %lu\n"
 		      "\tunique items %lu\n",
@@ -227,7 +234,7 @@
 		      fs_stat.leaves - fs_stat.blocks_to_skip,
 		      fs_stat.blocks_to_skip,
 		      fs_stat.items [TYPE_STAT_DATA],
-		      fs_stat.items [TYPE_INDIRECT],
+		      fs_stat.items [TYPE_EXTENT],
 		      fs_stat.items [TYPE_DIRECT],
 		      fs_stat.items [TYPE_DIRENTRY],
 		      fs_stat.unique_items);
@@ -257,13 +264,14 @@
     reiserfs_warning (stderr, "Looking for blocks containing only keys not pointed by any of entries\n");
     total = reiserfs_bitmap_ones (input_bitmap (fs));
     done = 0;
-    for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
+    for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
 	if (!reiserfs_bitmap_test_bit (input_bitmap (fs), i))
 	    continue;
 
-	print_how_far (stderr, &done, total, 1, be_quiet (fs));
+	if (!misc_test_bit(PRINT_QUIET, &data(fs)->options))
+	    util_misc_progress (stderr, &done, total, 1, 0);
 
-	bh = bread (fs->fs_dev, i, fs->fs_blocksize);
+	bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
 	if (!bh) {
 	    printf ("could not read block %lu\n", i);
 	    continue;
diff --git a/utils/debugfs/unpack.c b/utils/debugfs/unpack.c
new file mode 100644
index 0000000..ec4e3ca
--- /dev/null
+++ b/utils/debugfs/unpack.c
@@ -0,0 +1,652 @@
+/*
+ * Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+ 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+ 
+#include "debugreiserfs.h"
+#include "misc/unaligned.h"
+#include "util/device.h"
+#include "util/misc.h"
+
+#include <sys/resource.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#define print_usage_and_exit() misc_die ("Usage: %s [-v] [-b filename] device\n\
+-v		prints blocks number of every block unpacked\n\
+-b filename	saves bitmap of blocks unpacked to filename\n\
+-j filename     stores journal in the filename\n", argv[0]);
+
+
+/* when super block gets unpacked for the first time - create a bitmap
+   and mark in it what have been unpacked. Save that bitmap at the end */
+reiserfs_bitmap_t * what_unpacked = 0;
+
+
+int leaves, full;
+
+int verbose = 0;
+
+int Default_journal = 1;
+
+static void unpack_offset (struct packed_item * pi, reiserfs_ih_t * ih, int blocksize)
+{
+
+    if (get_pi_mask(pi) & OFFSET_BITS_64) {
+	__u64 v64;
+
+	if (reiserfs_ih_get_format (ih) != KEY_FORMAT_2)
+	    misc_die ("unpack_offset: key format is not set or wrong");
+	fread_le64 (&v64);
+	reiserfs_key_set_off (KEY_FORMAT_2, &ih->ih_key, v64);
+	return;
+    }
+
+    if (get_pi_mask(pi) & OFFSET_BITS_32) {
+	__u32 v32;
+
+	fread_le32 (&v32);
+	reiserfs_key_set_off (reiserfs_ih_get_format (ih), &ih->ih_key, v32);
+	return;
+    }
+
+    if ((get_pi_mask(pi) & DIR_ID) == 0 && (get_pi_mask(pi) & OBJECT_ID) == 0) {
+	/* offset was not sent, as it can be calculated looking at the
+           previous item */
+	if (reiserfs_ih_stat (ih - 1))
+	    reiserfs_key_set_off (reiserfs_ih_get_format (ih), &ih->ih_key, 1);
+	if (reiserfs_ih_ext (ih - 1))
+	    reiserfs_key_set_off(reiserfs_ih_get_format (ih), &ih->ih_key, 
+				    reiserfs_key_get_off (&(ih - 1)->ih_key)
+				    + reiserfs_leaf_ibytes (ih - 1, blocksize));
+    }
+
+    // offset is 0
+    return;
+}
+
+
+static void unpack_type (struct packed_item * pi, reiserfs_ih_t * ih)
+{
+    reiserfs_key_set_type (reiserfs_ih_get_format (ih), &ih->ih_key, get_pi_type(pi));
+    if (reiserfs_key_unkn (&ih->ih_key))
+	reiserfs_panic ("unpack_type: unknown type %d unpacked for %H\n",
+			get_pi_type(pi), ih);
+}
+
+
+/* direntry item comes in the following format: 
+   for each entry
+      mask - 8 bits
+      entry length - 16 bits
+      entry itself
+      deh_objectid - 32 bits
+      	maybe deh_dir_id (32 bits)
+	maybe gencounter (16)
+	maybe deh_state (16)
+*/
+static void unpack_direntry (struct packed_item * pi, reiserfs_bh_t * bh,
+			     reiserfs_ih_t * ih, hashf_t hash_func)
+{
+    __u16 entry_count, namelen, gen_counter, entry_len;
+    __u8 mask;
+    int i;
+    reiserfs_deh_t * deh;
+    int location;
+    char * item;
+
+/*    if (!hash_func)
+	misc_die ("unpack_direntry: hash function is not set");*/
+
+    if (!(get_pi_mask(pi) & IH_FREE_SPACE))
+        misc_die ("ih_entry_count must be packed for directory items");
+
+    entry_count = reiserfs_ih_get_entries (ih);
+/*    if (!entry_count)
+	reiserfs_panic ("unpack_direntry: entry count should be set already");*/
+
+    item = bh->b_data + reiserfs_ih_get_loc (ih);
+    deh = (reiserfs_deh_t *)item;
+    location = get_pi_item_len(pi);
+    for (i = 0; i < entry_count; i ++, deh ++) {
+	fread8 (&mask);
+	fread_le16 (&entry_len);
+	location -= entry_len;
+	reiserfs_deh_set_loc (deh, location);
+	fread (item + location, entry_len, 1, stdin);
+
+	/* find name length */
+	namelen = strlen (item + location);
+	if (namelen > entry_len)
+	    namelen = entry_len;
+
+	fread32 (&deh->deh2_objectid);
+	if (mask & HAS_DIR_ID)
+	    fread32 (&deh->deh2_dir_id);
+	else
+	    reiserfs_deh_set_did (deh, reiserfs_key_get_oid (&ih->ih_key));
+
+	if (*(item + location) == '.' && namelen == 1) {
+	    /* old or new "." */
+	    reiserfs_deh_set_off (deh, OFFSET_DOT);
+	} else if (*(item + location) == '.' && 
+		   *(item + location + 1) == '.' && namelen == 2) 
+	{
+	    /* old or new ".." */
+	    reiserfs_deh_set_off (deh, OFFSET_DOT_DOT);
+	} else if (hash_func) {
+	    reiserfs_deh_set_off (deh, reiserfs_hash_value(hash_func, 
+				  item + location, namelen));
+	}
+	
+	if (mask & HAS_GEN_COUNTER) {
+	    fread_le16 (&gen_counter);
+	    reiserfs_deh_set_off (deh, reiserfs_deh_get_off (deh) | gen_counter);
+	}
+
+	if (mask & HAS_STATE)
+	    fread16 (&deh->deh2_state);
+	else
+	    reiserfs_deh_set_state (deh, (1 << DEH_Visible2));
+    }
+
+    return;
+}
+
+
+/* struct packed_item is already unpacked */
+static void unpack_stat_data (struct packed_item * pi, reiserfs_bh_t * bh,
+			      reiserfs_ih_t * ih)
+{
+    if (!(get_pi_mask(pi) & IH_FREE_SPACE)) {
+        /* ih_free_space was not packed - set default */
+        reiserfs_ih_set_entries (ih, 0xffff);
+    }
+
+    if (reiserfs_ih_get_format (ih) == KEY_FORMAT_1) {
+	/* stat data comes in the following format:
+	   if this is old stat data:
+	   mode - 16 bits
+	   nlink - 16 bits
+	   size - 32 bits
+	   blocks/rdev - 32 bits
+	   maybe first_direct byte 32 bits
+	*/
+	reiserfs_sd_v1_t * sd;
+
+	sd = (reiserfs_sd_v1_t *)reiserfs_item_by_ih (bh, ih);
+	memset (sd, 0, sizeof (sd));
+
+	fread16 (&sd->sd_mode);
+	fread16 (&sd->sd_nlink);
+	fread32 (&sd->sd_size);
+	fread32 (&sd->u.sd_blocks);
+	
+	if (get_pi_mask(pi) & WITH_SD_FIRST_DIRECT_BYTE) {
+	    fread32 (&sd->sd_fdb);
+	} else {
+	    sd->sd_fdb = 0xffffffff;
+	}
+    } else {
+	/* for new stat data
+	   mode - 16 bits
+	   nlink in either 16 or 32 bits
+	   size in either 32 or 64 bits
+	   blocks - 32 bits
+	*/
+	reiserfs_sd_t * sd;
+
+	sd = (reiserfs_sd_t *)reiserfs_item_by_ih (bh, ih);
+	memset (sd, 0, sizeof (sd));
+	
+	fread16 (&sd->sd_mode);
+
+	if (get_pi_mask(pi) & NLINK_BITS_32) {
+	    fread32 (&sd->sd_nlink);
+	} else {
+	    __u16 nlink16;
+
+	    fread16 (&nlink16);
+            reiserfs_set_sd_v2_nlink (sd, le16_to_cpu(nlink16));
+	}
+
+	if (get_pi_mask(pi) & SIZE_BITS_64) {
+	    fread64 (&sd->sd_size);
+	} else {
+	    __u32 size32;
+
+            /* We need the endian conversions since sd->sd_size is 64 bit */
+	    fread_le32 (&size32);
+            reiserfs_set_sd_v2_size (sd, size32 );
+	}
+
+	fread32 (&sd->sd_blocks);
+    }
+
+    return;
+}
+
+
+/* extent item comes either in packed form or as is. ih_free_space
+   can go first */
+static void unpack_extent (struct packed_item * pi, reiserfs_bh_t * bh,
+			     reiserfs_ih_t * ih)
+{
+    __u32 * ind_item, * end;
+    int i;
+    __u16 v16;
+
+    if (!(get_pi_mask(pi) & IH_FREE_SPACE)) {
+        /* ih_free_space was not packed - set default */
+        reiserfs_ih_set_entries (ih, 0);
+    }
+
+    ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih);
+
+    if (get_pi_mask(pi) & SAFE_LINK) {
+	d32_put(ind_item, 0, reiserfs_key_get_did(&ih->ih_key));
+	reiserfs_key_set_did(&ih->ih_key, (__u32)-1);
+	return;
+    }
+
+    if (get_pi_mask(pi) & WHOLE_EXTENT) {
+	fread (ind_item, get_pi_item_len(pi), 1, stdin);
+	return;
+    }
+
+    end = ind_item + reiserfs_ext_count (ih);
+    while (ind_item < end) {
+        __u32 base;
+	fread32 (ind_item);
+	fread_le16 (&v16);
+        base = d32_get(ind_item, 0);
+	for (i = 1; i < v16; i ++) {
+	    if (base != 0)
+		d32_put(ind_item, i, base + i);
+	    else
+		d32_put(ind_item, i, 0);
+	}
+	ind_item += i;
+    }
+    return;
+}
+
+
+// FIXME: we have no way to preserve symlinks
+static void unpack_direct (struct packed_item * pi, reiserfs_bh_t * bh,
+			   reiserfs_ih_t * ih)
+{
+    __u32 * d_item = (__u32 *)reiserfs_item_by_ih (bh, ih);
+
+    if (!(get_pi_mask(pi) & IH_FREE_SPACE))
+        /* ih_free_space was not packed - set default */
+        reiserfs_ih_set_entries (ih, 0xffff);
+
+    if (get_pi_mask(pi) & SAFE_LINK) {
+	d32_put(d_item, 0, reiserfs_key_get_did(&ih->ih_key));
+	reiserfs_key_set_did(&ih->ih_key, (__u32)-1);
+    } else {
+	memset (d_item, 'a', get_pi_item_len(pi));
+    }
+    return;
+}
+
+
+static void unpack_leaf (int dev, hashf_t hash_func, __u16 blocksize)
+{
+    static int unpacked_leaves = 0;
+    reiserfs_bh_t * bh;
+    struct packed_item pi;
+    reiserfs_ih_t * ih;
+    int i;
+    __u16 v16;
+    __u32 v32;
+    
+    /* block number */
+    fread_le32 (&v32);
+
+
+    /* item number */
+    fread_le16 (&v16);
+
+    if (verbose)
+	reiserfs_warning (stderr, "leaf %d: %d items\n", v32, v16);
+
+    bh = reiserfs_buffer_open (dev, v32, blocksize);
+    if (!bh)
+	misc_die ("unpack_leaf: reiserfs_buffer_open failed");
+
+    reiserfs_nh_set_items (NODE_HEAD (bh), v16);
+    reiserfs_nh_set_level (NODE_HEAD (bh), LEAF_LEVEL);
+    reiserfs_nh_set_free (NODE_HEAD (bh), REISERFS_NODE_SPACE (bh->b_size));
+
+    ih = reiserfs_ih_at (bh, 0);
+    for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) {
+#if 0
+	fread32 (&v32);
+	if (v32 != ITEM_START_MAGIC)
+	    misc_die ("unpack_leaf: no start item magic found: block %lu, item %i",
+		 bh->b_blocknr, i);
+#endif	
+
+	fread (&pi, sizeof (struct packed_item), 1, stdin);
+	
+	/* dir_id - if it is there */
+	if (get_pi_mask(&pi) & DIR_ID) {
+	    fread32 (&v32);
+            reiserfs_key_set_did (&ih->ih_key, le32_to_cpu(v32));
+	} else {
+	    if (!i)
+		misc_die ("unpack_leaf: dir_id is not set");
+	    reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key));
+	}
+
+	/* object_id - if it is there */
+	if (get_pi_mask(&pi) & OBJECT_ID) {
+	    fread32 (&v32);
+            reiserfs_key_set_oid (&ih->ih_key, le32_to_cpu(v32));
+	} else {
+	    if (!i)
+		misc_die ("unpack_leaf: object_id is not set");
+	    reiserfs_key_set_oid (&ih->ih_key, reiserfs_key_get_oid (&(ih - 1)->ih_key));
+	}
+
+	// we need to set item format before offset unpacking
+	reiserfs_ih_set_format (ih, (get_pi_mask(&pi) & NEW_FORMAT) ? KEY_FORMAT_2 : KEY_FORMAT_1);
+
+	// offset
+	unpack_offset (&pi, ih, bh->b_size);
+
+	/* type */
+	unpack_type (&pi, ih);
+
+	/* ih_free_space and ih_format */
+	if (get_pi_mask(&pi) & IH_FREE_SPACE) {
+	    fread16 (&v16);
+	    reiserfs_ih_set_entries (ih, le16_to_cpu(v16));
+	}
+
+	if (get_pi_mask(&pi) & IH_FORMAT)
+	    fread16 (&ih->ih_format);
+
+	/* item length and item location */
+	reiserfs_ih_set_len (ih, get_pi_item_len(&pi));
+	reiserfs_ih_set_loc (ih, (i ? reiserfs_ih_get_loc (ih - 1) : bh->b_size) - get_pi_item_len(&pi));
+
+	// item itself
+	if (reiserfs_ih_direct (ih)) {
+	    unpack_direct (&pi, bh, ih);
+	} else if (reiserfs_ih_ext (ih)) {
+	    unpack_extent (&pi, bh, ih);
+	} else if (reiserfs_ih_dir (ih)) {
+	    unpack_direntry (&pi, bh, ih, hash_func);
+	} else if (reiserfs_ih_stat (ih)) {
+	    unpack_stat_data (&pi, bh, ih);
+	}
+	reiserfs_nh_set_free (NODE_HEAD (bh), reiserfs_nh_get_free (NODE_HEAD (bh)) -
+			     (REISERFS_IH_SIZE + reiserfs_ih_get_len (ih)));
+
+#if 0
+	fread32 (&v32);
+	if (v32 != ITEM_END_MAGIC)
+	    misc_die ("unpack_leaf: no end item magic found: block %lu, item %i",
+		 bh->b_blocknr, i);
+	if (verbose)
+	    reiserfs_warning (stderr, "%d: %H\n", i, ih);
+#endif
+    }
+
+    fread_le16 (&v16);
+    if (v16 != LEAF_END_MAGIC)
+	misc_die ("unpack_leaf: wrong end signature found - %x, block %lu", 
+	     v16, bh->b_blocknr);
+
+    reiserfs_buffer_mkuptodate (bh, 1);
+    reiserfs_buffer_mkdirty (bh);
+    reiserfs_buffer_write (bh);
+    /*
+    if (reiserfs_fs_block(fs, bh->b_blocknr) == BT_UNKNOWN)
+	data_blocks_unpacked ++;
+    */
+    reiserfs_buffer_close (bh);
+
+    if (what_unpacked)
+	reiserfs_bitmap_set_bit (what_unpacked, bh->b_blocknr);
+    /*unpacked ++;*/
+
+    if (!(++ unpacked_leaves % 10))
+	fprintf (stderr, "#");
+}
+
+
+static void unpack_full_block (int dev, int blocksize)
+{
+    static int full_blocks_unpacked = 0;
+    __u32 block;
+    reiserfs_bh_t * bh;
+
+    fread_le32 (&block);
+
+    if (verbose)
+	fprintf (stderr, "full #%d\n", block);
+
+    bh = reiserfs_buffer_open (dev, block, blocksize);
+    if (!bh)
+	misc_die ("unpack_full_block: reiserfs_buffer_open failed");
+
+    fread (bh->b_data, bh->b_size, 1, stdin);
+
+    if (reiserfs_node_type (bh) == NT_SUPER && !what_unpacked) {
+	unsigned long blocks;
+	reiserfs_bh_t * tmp;
+	
+	blocks = reiserfs_sb_get_blocks ((reiserfs_sb_t *)(bh->b_data));
+	fprintf (stderr, "There were %lu blocks on the device\n", blocks);
+	what_unpacked = reiserfs_bitmap_create (blocks);
+
+	/* make file as long as filesystem is */
+	tmp = reiserfs_buffer_open (dev, blocks - 1, blocksize);
+	reiserfs_buffer_mkdirty (tmp);
+	reiserfs_buffer_mkuptodate (tmp, 0);
+	reiserfs_buffer_write (tmp);
+	reiserfs_buffer_close (tmp);
+    }
+
+    reiserfs_buffer_mkuptodate (bh, 1);
+    reiserfs_buffer_mkdirty (bh);
+    reiserfs_buffer_write (bh);
+/*
+    if (reiserfs_fs_block(fs, bh->b_blocknr) == BT_UNKNOWN)
+	data_blocks_unpacked ++;
+*/
+    reiserfs_buffer_close (bh);
+
+    if (what_unpacked)
+	reiserfs_bitmap_set_bit (what_unpacked, block);
+    /*unpacked ++;*/
+
+    if (!(++ full_blocks_unpacked % 50))
+	fprintf (stderr, ".");
+}
+
+
+/* just skip bitmaps of unformatted nodes */
+static void unpack_unformatted_bitmap (int dev, int blocksize)
+{
+    __u16 bmap_num;
+    __u32 block_count;
+    int i;
+    char * buf;
+ 
+    fread_le16 (&bmap_num);
+    fread_le32 (&block_count);
+    
+    buf = malloc (blocksize);
+    if (!buf)
+	reiserfs_panic ("unpack_unformatted_bitmap: malloc failed: %m");
+
+    for (i = 0; i < bmap_num; i ++) {
+	if (fread (buf, blocksize, 1, stdin) != 1)
+	    reiserfs_panic ("unpack_unformatted_bitmap: "
+			    "could not read bitmap #%d: %m", i);
+    }
+    free (buf);
+}
+
+
+// read packed reiserfs partition metadata from stdin
+void unpack_partition (int fd, int jfd)
+{
+    __u32 magic32;
+    long position;
+    __u16 magic16;
+    __u16 blocksize;
+    int dev = fd;
+    
+    fread_le32 (&magic32);
+    if (magic32 != REISERFS_SUPER_MAGIC)
+	misc_die ("unpack_partition: reiserfs magic number (0x%x) not found - %x\n",
+             REISERFS_SUPER_MAGIC, magic32);
+    
+    fread_le16 (&blocksize);
+    
+    if (verbose)
+	fprintf (stderr, "Blocksize %d\n", blocksize);
+    
+    while (!feof (stdin)) {
+	char c[2];
+
+	fread (c, 1, 1, stdin);
+	switch (c[0]) {
+	case '.':
+	    if (verbose)
+		fprintf (stderr, "\".\" skipped\n");
+	    continue;
+
+	case '1':
+	    fread (c, 1, 1, stdin); /* that was 100%, read in first 0 */
+	case '2':
+	case '4':
+	case '6':
+	case '8':
+	    fread (c, 1, 1, stdin);
+	case '0':
+	    fread (c + 1, 1, 1, stdin); /* read % */
+		
+	    if (c[0] != '0' || c[1] != '%')
+		misc_die ("0%% expected\n");
+
+	    if (verbose)
+		fprintf (stderr, "0%% skipped\n");
+	    continue;
+	}
+
+	fread (c + 1, 1, 1, stdin);
+	magic16 = le16_to_cpu(*(__u16 *)c);
+	/*fread16 (&magic16);*/
+	
+	switch (magic16 & 0xff) {
+	case LEAF_START_MAGIC:
+	    leaves ++;
+	    unpack_leaf (dev, reiserfs_hash_func (magic16 >> 8), blocksize);
+	    break;
+	    
+	case SEPARATED_JOURNAL_START_MAGIC:
+	    if (Default_journal)
+		misc_die ("file name for separated journal has to be specified");	
+	    dev = jfd;
+	    break;    
+
+	case SEPARATED_JOURNAL_END_MAGIC:
+	    dev = fd;
+	    break;
+	    
+	case FULL_BLOCK_START_MAGIC:
+	    full ++;
+	    unpack_full_block (dev, blocksize);
+	    break;
+
+	case UNFORMATTED_BITMAP_START_MAGIC:
+	    fprintf (stderr, "\nBitmap of unformatted - ignored\n");
+	    unpack_unformatted_bitmap (dev, blocksize);
+	    break;
+	    
+	case END_MAGIC:
+	    goto out;
+
+	default:
+	    position = ftell(stdin);
+	    if (position == ~(long)0)
+		misc_die ("unpack_partition: bad magic found - %x", magic16 & 0xff);
+	    else
+		misc_die ("unpack_partition: bad magic found - %x, position %lu", 
+		    magic16 & 0xff, ftell(stdin));
+	}
+    }
+out:
+    fprintf (stderr, "Unpacked %d leaves, %d full blocks\n", leaves, full);
+
+
+    /*    fclose (block_list);*/
+}
+
+
+int do_unpack(char *host, char *j_filename, char *filename, int verbose) {
+    int fd, fdj = -2;
+    struct rlimit lim = {RLIM_INFINITY, RLIM_INFINITY};
+
+    if (filename == NULL)
+	    filename = ".bitmap";
+    
+    if (j_filename)
+	    Default_journal = 0;
+    
+    /* with this 2.4.0-test9's file_write does not send SIGXFSZ */
+    if (setrlimit (RLIMIT_FSIZE, &lim)) {
+	fprintf  (stderr, "sertlimit failed: %m\n");
+    }
+
+    if (util_device_mounted(host) > 0) {
+	fprintf(stderr, "%s seems mounted, umount it first\n", host);
+	return 0;
+    }
+  
+    fd = open (host, O_RDWR 
+#ifdef O_LARGEFILE
+	       | O_LARGEFILE
+#endif
+	       );
+    if (fd == -1) {
+	perror ("open failed");
+	return 0;
+    }
+
+    if (!Default_journal) {
+	fdj = open (j_filename, O_RDWR 
+#ifdef O_LARGEFILE
+		    | O_LARGEFILE
+#endif
+		    );
+	if (fdj == -1) {
+	    perror ("open failed");
+	    return 0;
+	}
+    }
+
+    unpack_partition (fd, fdj);
+
+    if (what_unpacked && filename) {
+        FILE * file = util_file_open(filename, "w+");
+        reiserfs_bitmap_save (file,  what_unpacked);
+        fclose (file);
+    }
+
+    close (fd);
+    if (!Default_journal)
+	close (fdj);	
+    return 0;
+}
diff --git a/utils/fsck/Makefile.am b/utils/fsck/Makefile.am
new file mode 100644
index 0000000..06da297
--- /dev/null
+++ b/utils/fsck/Makefile.am
@@ -0,0 +1,30 @@
+sbin_PROGRAMS		= fsck.reiserfs
+
+man_MANS		= fsck.reiserfs.8
+EXTRA_DIST		= fsck.reiserfs.8
+
+fsck_reiserfs_SOURCES	= main.c pass0.c pass1.c pass2.c semantic_check.c     \
+			  semantic_rebuild.c pass4.c lost+found.c ubitmap.c   \
+			  uobjectid.c ufile.c check_tree.c info.c super.c     \
+			  rollback.c stage.c leaf.c utree.c relocate.c fsck.h
+fsck_reiserfs_LDADD	= $(top_builddir)/libutil/libutil-static.a            \
+			  $(top_builddir)/libreiserfs/libreiserfs-static.a    \
+			  $(top_builddir)/libmisc/libmisc-static.a
+fsck_reiserfs_LDFLAGS	= @PROGS_LDFLAGS@
+fsck_reiserfs_CFLAGS	= @CFLAGS@
+
+INCLUDES		= -I$(top_srcdir)/include
+
+uninstall-reiserfsck:
+	if test -f $(DESTDIR)$(sbindir)/reiserfsck; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfsck; \
+	fi;
+
+install-reiserfsck:
+	if test -f $(DESTDIR)$(sbindir)/fsck.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfsck; \
+		ln $(DESTDIR)$(sbindir)/fsck.reiserfs $(DESTDIR)$(sbindir)/reiserfsck; \
+	fi;
+
+install-data-local: install-reiserfsck
+uninstall-local: uninstall-reiserfsck
diff --git a/utils/fsck/Makefile.in b/utils/fsck/Makefile.in
new file mode 100644
index 0000000..97c4f40
--- /dev/null
+++ b/utils/fsck/Makefile.in
@@ -0,0 +1,788 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(fsck_reiserfs_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+sbin_PROGRAMS = fsck.reiserfs$(EXEEXT)
+subdir = utils/fsck
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(sbin_PROGRAMS)
+am_fsck_reiserfs_OBJECTS = fsck_reiserfs-main.$(OBJEXT) \
+	fsck_reiserfs-pass0.$(OBJEXT) fsck_reiserfs-pass1.$(OBJEXT) \
+	fsck_reiserfs-pass2.$(OBJEXT) \
+	fsck_reiserfs-semantic_check.$(OBJEXT) \
+	fsck_reiserfs-semantic_rebuild.$(OBJEXT) \
+	fsck_reiserfs-pass4.$(OBJEXT) \
+	fsck_reiserfs-lost+found.$(OBJEXT) \
+	fsck_reiserfs-ubitmap.$(OBJEXT) \
+	fsck_reiserfs-uobjectid.$(OBJEXT) \
+	fsck_reiserfs-ufile.$(OBJEXT) \
+	fsck_reiserfs-check_tree.$(OBJEXT) \
+	fsck_reiserfs-info.$(OBJEXT) fsck_reiserfs-super.$(OBJEXT) \
+	fsck_reiserfs-rollback.$(OBJEXT) fsck_reiserfs-stage.$(OBJEXT) \
+	fsck_reiserfs-leaf.$(OBJEXT) fsck_reiserfs-utree.$(OBJEXT) \
+	fsck_reiserfs-relocate.$(OBJEXT)
+fsck_reiserfs_OBJECTS = $(am_fsck_reiserfs_OBJECTS)
+fsck_reiserfs_DEPENDENCIES = $(top_builddir)/libutil/libutil-static.a \
+	$(top_builddir)/libreiserfs/libreiserfs-static.a \
+	$(top_builddir)/libmisc/libmisc-static.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(fsck_reiserfs_SOURCES)
+DIST_SOURCES = $(fsck_reiserfs_SOURCES)
+man8dir = $(mandir)/man8
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+man_MANS = fsck.reiserfs.8
+EXTRA_DIST = fsck.reiserfs.8
+fsck_reiserfs_SOURCES = main.c pass0.c pass1.c pass2.c semantic_check.c     \
+			  semantic_rebuild.c pass4.c lost+found.c ubitmap.c   \
+			  uobjectid.c ufile.c check_tree.c info.c super.c     \
+			  rollback.c stage.c leaf.c utree.c relocate.c fsck.h
+
+fsck_reiserfs_LDADD = $(top_builddir)/libutil/libutil-static.a            \
+			  $(top_builddir)/libreiserfs/libreiserfs-static.a    \
+			  $(top_builddir)/libmisc/libmisc-static.a
+
+fsck_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+fsck_reiserfs_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/fsck/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  utils/fsck/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+	done
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+fsck.reiserfs$(EXEEXT): $(fsck_reiserfs_OBJECTS) $(fsck_reiserfs_DEPENDENCIES) 
+	@rm -f fsck.reiserfs$(EXEEXT)
+	$(LINK) $(fsck_reiserfs_LDFLAGS) $(fsck_reiserfs_OBJECTS) $(fsck_reiserfs_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-check_tree.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-leaf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-lost+found.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass0.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-pass4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-relocate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-rollback.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-semantic_check.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-stage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-super.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-ubitmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-ufile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-uobjectid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsck_reiserfs-utree.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+fsck_reiserfs-main.o: main.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-main.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-main.Tpo" -c -o fsck_reiserfs-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-main.Tpo" "$(DEPDIR)/fsck_reiserfs-main.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-main.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='main.c' object='fsck_reiserfs-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+
+fsck_reiserfs-main.obj: main.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-main.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-main.Tpo" -c -o fsck_reiserfs-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-main.Tpo" "$(DEPDIR)/fsck_reiserfs-main.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-main.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='main.c' object='fsck_reiserfs-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
+
+fsck_reiserfs-pass0.o: pass0.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass0.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" -c -o fsck_reiserfs-pass0.o `test -f 'pass0.c' || echo '$(srcdir)/'`pass0.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" "$(DEPDIR)/fsck_reiserfs-pass0.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass0.c' object='fsck_reiserfs-pass0.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass0.o `test -f 'pass0.c' || echo '$(srcdir)/'`pass0.c
+
+fsck_reiserfs-pass0.obj: pass0.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass0.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" -c -o fsck_reiserfs-pass0.obj `if test -f 'pass0.c'; then $(CYGPATH_W) 'pass0.c'; else $(CYGPATH_W) '$(srcdir)/pass0.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo" "$(DEPDIR)/fsck_reiserfs-pass0.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass0.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass0.c' object='fsck_reiserfs-pass0.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass0.obj `if test -f 'pass0.c'; then $(CYGPATH_W) 'pass0.c'; else $(CYGPATH_W) '$(srcdir)/pass0.c'; fi`
+
+fsck_reiserfs-pass1.o: pass1.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass1.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" -c -o fsck_reiserfs-pass1.o `test -f 'pass1.c' || echo '$(srcdir)/'`pass1.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" "$(DEPDIR)/fsck_reiserfs-pass1.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass1.c' object='fsck_reiserfs-pass1.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass1.o `test -f 'pass1.c' || echo '$(srcdir)/'`pass1.c
+
+fsck_reiserfs-pass1.obj: pass1.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass1.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" -c -o fsck_reiserfs-pass1.obj `if test -f 'pass1.c'; then $(CYGPATH_W) 'pass1.c'; else $(CYGPATH_W) '$(srcdir)/pass1.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo" "$(DEPDIR)/fsck_reiserfs-pass1.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass1.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass1.c' object='fsck_reiserfs-pass1.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass1.obj `if test -f 'pass1.c'; then $(CYGPATH_W) 'pass1.c'; else $(CYGPATH_W) '$(srcdir)/pass1.c'; fi`
+
+fsck_reiserfs-pass2.o: pass2.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass2.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" -c -o fsck_reiserfs-pass2.o `test -f 'pass2.c' || echo '$(srcdir)/'`pass2.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" "$(DEPDIR)/fsck_reiserfs-pass2.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass2.c' object='fsck_reiserfs-pass2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass2.o `test -f 'pass2.c' || echo '$(srcdir)/'`pass2.c
+
+fsck_reiserfs-pass2.obj: pass2.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass2.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" -c -o fsck_reiserfs-pass2.obj `if test -f 'pass2.c'; then $(CYGPATH_W) 'pass2.c'; else $(CYGPATH_W) '$(srcdir)/pass2.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo" "$(DEPDIR)/fsck_reiserfs-pass2.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass2.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass2.c' object='fsck_reiserfs-pass2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass2.obj `if test -f 'pass2.c'; then $(CYGPATH_W) 'pass2.c'; else $(CYGPATH_W) '$(srcdir)/pass2.c'; fi`
+
+fsck_reiserfs-semantic_check.o: semantic_check.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_check.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" -c -o fsck_reiserfs-semantic_check.o `test -f 'semantic_check.c' || echo '$(srcdir)/'`semantic_check.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_check.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='semantic_check.c' object='fsck_reiserfs-semantic_check.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_check.o `test -f 'semantic_check.c' || echo '$(srcdir)/'`semantic_check.c
+
+fsck_reiserfs-semantic_check.obj: semantic_check.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_check.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" -c -o fsck_reiserfs-semantic_check.obj `if test -f 'semantic_check.c'; then $(CYGPATH_W) 'semantic_check.c'; else $(CYGPATH_W) '$(srcdir)/semantic_check.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_check.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_check.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='semantic_check.c' object='fsck_reiserfs-semantic_check.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_check.obj `if test -f 'semantic_check.c'; then $(CYGPATH_W) 'semantic_check.c'; else $(CYGPATH_W) '$(srcdir)/semantic_check.c'; fi`
+
+fsck_reiserfs-semantic_rebuild.o: semantic_rebuild.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_rebuild.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" -c -o fsck_reiserfs-semantic_rebuild.o `test -f 'semantic_rebuild.c' || echo '$(srcdir)/'`semantic_rebuild.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='semantic_rebuild.c' object='fsck_reiserfs-semantic_rebuild.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_rebuild.o `test -f 'semantic_rebuild.c' || echo '$(srcdir)/'`semantic_rebuild.c
+
+fsck_reiserfs-semantic_rebuild.obj: semantic_rebuild.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-semantic_rebuild.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" -c -o fsck_reiserfs-semantic_rebuild.obj `if test -f 'semantic_rebuild.c'; then $(CYGPATH_W) 'semantic_rebuild.c'; else $(CYGPATH_W) '$(srcdir)/semantic_rebuild.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo" "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-semantic_rebuild.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='semantic_rebuild.c' object='fsck_reiserfs-semantic_rebuild.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-semantic_rebuild.obj `if test -f 'semantic_rebuild.c'; then $(CYGPATH_W) 'semantic_rebuild.c'; else $(CYGPATH_W) '$(srcdir)/semantic_rebuild.c'; fi`
+
+fsck_reiserfs-pass4.o: pass4.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass4.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" -c -o fsck_reiserfs-pass4.o `test -f 'pass4.c' || echo '$(srcdir)/'`pass4.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" "$(DEPDIR)/fsck_reiserfs-pass4.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass4.c' object='fsck_reiserfs-pass4.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass4.o `test -f 'pass4.c' || echo '$(srcdir)/'`pass4.c
+
+fsck_reiserfs-pass4.obj: pass4.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-pass4.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" -c -o fsck_reiserfs-pass4.obj `if test -f 'pass4.c'; then $(CYGPATH_W) 'pass4.c'; else $(CYGPATH_W) '$(srcdir)/pass4.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo" "$(DEPDIR)/fsck_reiserfs-pass4.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-pass4.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pass4.c' object='fsck_reiserfs-pass4.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-pass4.obj `if test -f 'pass4.c'; then $(CYGPATH_W) 'pass4.c'; else $(CYGPATH_W) '$(srcdir)/pass4.c'; fi`
+
+fsck_reiserfs-lost+found.o: lost+found.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-lost+found.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" -c -o fsck_reiserfs-lost+found.o `test -f 'lost+found.c' || echo '$(srcdir)/'`lost+found.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" "$(DEPDIR)/fsck_reiserfs-lost+found.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='lost+found.c' object='fsck_reiserfs-lost+found.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-lost+found.o `test -f 'lost+found.c' || echo '$(srcdir)/'`lost+found.c
+
+fsck_reiserfs-lost+found.obj: lost+found.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-lost+found.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" -c -o fsck_reiserfs-lost+found.obj `if test -f 'lost+found.c'; then $(CYGPATH_W) 'lost+found.c'; else $(CYGPATH_W) '$(srcdir)/lost+found.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo" "$(DEPDIR)/fsck_reiserfs-lost+found.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-lost+found.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='lost+found.c' object='fsck_reiserfs-lost+found.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-lost+found.obj `if test -f 'lost+found.c'; then $(CYGPATH_W) 'lost+found.c'; else $(CYGPATH_W) '$(srcdir)/lost+found.c'; fi`
+
+fsck_reiserfs-ubitmap.o: ubitmap.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ubitmap.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" -c -o fsck_reiserfs-ubitmap.o `test -f 'ubitmap.c' || echo '$(srcdir)/'`ubitmap.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" "$(DEPDIR)/fsck_reiserfs-ubitmap.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ubitmap.c' object='fsck_reiserfs-ubitmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ubitmap.o `test -f 'ubitmap.c' || echo '$(srcdir)/'`ubitmap.c
+
+fsck_reiserfs-ubitmap.obj: ubitmap.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ubitmap.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" -c -o fsck_reiserfs-ubitmap.obj `if test -f 'ubitmap.c'; then $(CYGPATH_W) 'ubitmap.c'; else $(CYGPATH_W) '$(srcdir)/ubitmap.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo" "$(DEPDIR)/fsck_reiserfs-ubitmap.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ubitmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ubitmap.c' object='fsck_reiserfs-ubitmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ubitmap.obj `if test -f 'ubitmap.c'; then $(CYGPATH_W) 'ubitmap.c'; else $(CYGPATH_W) '$(srcdir)/ubitmap.c'; fi`
+
+fsck_reiserfs-uobjectid.o: uobjectid.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-uobjectid.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" -c -o fsck_reiserfs-uobjectid.o `test -f 'uobjectid.c' || echo '$(srcdir)/'`uobjectid.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" "$(DEPDIR)/fsck_reiserfs-uobjectid.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='uobjectid.c' object='fsck_reiserfs-uobjectid.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-uobjectid.o `test -f 'uobjectid.c' || echo '$(srcdir)/'`uobjectid.c
+
+fsck_reiserfs-uobjectid.obj: uobjectid.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-uobjectid.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" -c -o fsck_reiserfs-uobjectid.obj `if test -f 'uobjectid.c'; then $(CYGPATH_W) 'uobjectid.c'; else $(CYGPATH_W) '$(srcdir)/uobjectid.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo" "$(DEPDIR)/fsck_reiserfs-uobjectid.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-uobjectid.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='uobjectid.c' object='fsck_reiserfs-uobjectid.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-uobjectid.obj `if test -f 'uobjectid.c'; then $(CYGPATH_W) 'uobjectid.c'; else $(CYGPATH_W) '$(srcdir)/uobjectid.c'; fi`
+
+fsck_reiserfs-ufile.o: ufile.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ufile.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" -c -o fsck_reiserfs-ufile.o `test -f 'ufile.c' || echo '$(srcdir)/'`ufile.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" "$(DEPDIR)/fsck_reiserfs-ufile.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ufile.c' object='fsck_reiserfs-ufile.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ufile.o `test -f 'ufile.c' || echo '$(srcdir)/'`ufile.c
+
+fsck_reiserfs-ufile.obj: ufile.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-ufile.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" -c -o fsck_reiserfs-ufile.obj `if test -f 'ufile.c'; then $(CYGPATH_W) 'ufile.c'; else $(CYGPATH_W) '$(srcdir)/ufile.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo" "$(DEPDIR)/fsck_reiserfs-ufile.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-ufile.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ufile.c' object='fsck_reiserfs-ufile.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-ufile.obj `if test -f 'ufile.c'; then $(CYGPATH_W) 'ufile.c'; else $(CYGPATH_W) '$(srcdir)/ufile.c'; fi`
+
+fsck_reiserfs-check_tree.o: check_tree.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-check_tree.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" -c -o fsck_reiserfs-check_tree.o `test -f 'check_tree.c' || echo '$(srcdir)/'`check_tree.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" "$(DEPDIR)/fsck_reiserfs-check_tree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='check_tree.c' object='fsck_reiserfs-check_tree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-check_tree.o `test -f 'check_tree.c' || echo '$(srcdir)/'`check_tree.c
+
+fsck_reiserfs-check_tree.obj: check_tree.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-check_tree.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" -c -o fsck_reiserfs-check_tree.obj `if test -f 'check_tree.c'; then $(CYGPATH_W) 'check_tree.c'; else $(CYGPATH_W) '$(srcdir)/check_tree.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo" "$(DEPDIR)/fsck_reiserfs-check_tree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-check_tree.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='check_tree.c' object='fsck_reiserfs-check_tree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-check_tree.obj `if test -f 'check_tree.c'; then $(CYGPATH_W) 'check_tree.c'; else $(CYGPATH_W) '$(srcdir)/check_tree.c'; fi`
+
+fsck_reiserfs-info.o: info.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-info.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-info.Tpo" -c -o fsck_reiserfs-info.o `test -f 'info.c' || echo '$(srcdir)/'`info.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-info.Tpo" "$(DEPDIR)/fsck_reiserfs-info.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-info.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='info.c' object='fsck_reiserfs-info.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-info.o `test -f 'info.c' || echo '$(srcdir)/'`info.c
+
+fsck_reiserfs-info.obj: info.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-info.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-info.Tpo" -c -o fsck_reiserfs-info.obj `if test -f 'info.c'; then $(CYGPATH_W) 'info.c'; else $(CYGPATH_W) '$(srcdir)/info.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-info.Tpo" "$(DEPDIR)/fsck_reiserfs-info.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-info.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='info.c' object='fsck_reiserfs-info.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-info.obj `if test -f 'info.c'; then $(CYGPATH_W) 'info.c'; else $(CYGPATH_W) '$(srcdir)/info.c'; fi`
+
+fsck_reiserfs-super.o: super.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-super.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-super.Tpo" -c -o fsck_reiserfs-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-super.Tpo" "$(DEPDIR)/fsck_reiserfs-super.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-super.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='super.c' object='fsck_reiserfs-super.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-super.o `test -f 'super.c' || echo '$(srcdir)/'`super.c
+
+fsck_reiserfs-super.obj: super.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-super.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-super.Tpo" -c -o fsck_reiserfs-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-super.Tpo" "$(DEPDIR)/fsck_reiserfs-super.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-super.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='super.c' object='fsck_reiserfs-super.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-super.obj `if test -f 'super.c'; then $(CYGPATH_W) 'super.c'; else $(CYGPATH_W) '$(srcdir)/super.c'; fi`
+
+fsck_reiserfs-rollback.o: rollback.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-rollback.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" -c -o fsck_reiserfs-rollback.o `test -f 'rollback.c' || echo '$(srcdir)/'`rollback.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" "$(DEPDIR)/fsck_reiserfs-rollback.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='rollback.c' object='fsck_reiserfs-rollback.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-rollback.o `test -f 'rollback.c' || echo '$(srcdir)/'`rollback.c
+
+fsck_reiserfs-rollback.obj: rollback.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-rollback.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" -c -o fsck_reiserfs-rollback.obj `if test -f 'rollback.c'; then $(CYGPATH_W) 'rollback.c'; else $(CYGPATH_W) '$(srcdir)/rollback.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo" "$(DEPDIR)/fsck_reiserfs-rollback.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-rollback.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='rollback.c' object='fsck_reiserfs-rollback.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-rollback.obj `if test -f 'rollback.c'; then $(CYGPATH_W) 'rollback.c'; else $(CYGPATH_W) '$(srcdir)/rollback.c'; fi`
+
+fsck_reiserfs-stage.o: stage.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-stage.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-stage.Tpo" -c -o fsck_reiserfs-stage.o `test -f 'stage.c' || echo '$(srcdir)/'`stage.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo" "$(DEPDIR)/fsck_reiserfs-stage.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='stage.c' object='fsck_reiserfs-stage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-stage.o `test -f 'stage.c' || echo '$(srcdir)/'`stage.c
+
+fsck_reiserfs-stage.obj: stage.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-stage.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-stage.Tpo" -c -o fsck_reiserfs-stage.obj `if test -f 'stage.c'; then $(CYGPATH_W) 'stage.c'; else $(CYGPATH_W) '$(srcdir)/stage.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo" "$(DEPDIR)/fsck_reiserfs-stage.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-stage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='stage.c' object='fsck_reiserfs-stage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-stage.obj `if test -f 'stage.c'; then $(CYGPATH_W) 'stage.c'; else $(CYGPATH_W) '$(srcdir)/stage.c'; fi`
+
+fsck_reiserfs-leaf.o: leaf.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-leaf.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" -c -o fsck_reiserfs-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" "$(DEPDIR)/fsck_reiserfs-leaf.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='leaf.c' object='fsck_reiserfs-leaf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-leaf.o `test -f 'leaf.c' || echo '$(srcdir)/'`leaf.c
+
+fsck_reiserfs-leaf.obj: leaf.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-leaf.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" -c -o fsck_reiserfs-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo" "$(DEPDIR)/fsck_reiserfs-leaf.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-leaf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='leaf.c' object='fsck_reiserfs-leaf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-leaf.obj `if test -f 'leaf.c'; then $(CYGPATH_W) 'leaf.c'; else $(CYGPATH_W) '$(srcdir)/leaf.c'; fi`
+
+fsck_reiserfs-utree.o: utree.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-utree.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-utree.Tpo" -c -o fsck_reiserfs-utree.o `test -f 'utree.c' || echo '$(srcdir)/'`utree.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo" "$(DEPDIR)/fsck_reiserfs-utree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='utree.c' object='fsck_reiserfs-utree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-utree.o `test -f 'utree.c' || echo '$(srcdir)/'`utree.c
+
+fsck_reiserfs-utree.obj: utree.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-utree.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-utree.Tpo" -c -o fsck_reiserfs-utree.obj `if test -f 'utree.c'; then $(CYGPATH_W) 'utree.c'; else $(CYGPATH_W) '$(srcdir)/utree.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo" "$(DEPDIR)/fsck_reiserfs-utree.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-utree.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='utree.c' object='fsck_reiserfs-utree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-utree.obj `if test -f 'utree.c'; then $(CYGPATH_W) 'utree.c'; else $(CYGPATH_W) '$(srcdir)/utree.c'; fi`
+
+fsck_reiserfs-relocate.o: relocate.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-relocate.o -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" -c -o fsck_reiserfs-relocate.o `test -f 'relocate.c' || echo '$(srcdir)/'`relocate.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" "$(DEPDIR)/fsck_reiserfs-relocate.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='relocate.c' object='fsck_reiserfs-relocate.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-relocate.o `test -f 'relocate.c' || echo '$(srcdir)/'`relocate.c
+
+fsck_reiserfs-relocate.obj: relocate.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -MT fsck_reiserfs-relocate.obj -MD -MP -MF "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" -c -o fsck_reiserfs-relocate.obj `if test -f 'relocate.c'; then $(CYGPATH_W) 'relocate.c'; else $(CYGPATH_W) '$(srcdir)/relocate.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo" "$(DEPDIR)/fsck_reiserfs-relocate.Po"; else rm -f "$(DEPDIR)/fsck_reiserfs-relocate.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='relocate.c' object='fsck_reiserfs-relocate.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fsck_reiserfs_CFLAGS) $(CFLAGS) -c -o fsck_reiserfs-relocate.obj `if test -f 'relocate.c'; then $(CYGPATH_W) 'relocate.c'; else $(CYGPATH_W) '$(srcdir)/relocate.c'; fi`
+uninstall-info-am:
+install-man8: $(man8_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)"
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+uninstall-man8:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am: install-sbinPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man8
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-local uninstall-man \
+	uninstall-sbinPROGRAMS
+
+uninstall-man: uninstall-man8
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-sbinPROGRAMS ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-data-local install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-man8 install-sbinPROGRAMS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am uninstall-local uninstall-man \
+	uninstall-man8 uninstall-sbinPROGRAMS
+
+
+uninstall-reiserfsck:
+	if test -f $(DESTDIR)$(sbindir)/reiserfsck; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfsck; \
+	fi;
+
+install-reiserfsck:
+	if test -f $(DESTDIR)$(sbindir)/fsck.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfsck; \
+		ln $(DESTDIR)$(sbindir)/fsck.reiserfs $(DESTDIR)$(sbindir)/reiserfsck; \
+	fi;
+
+install-data-local: install-reiserfsck
+uninstall-local: uninstall-reiserfsck
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/fsck/check_tree.c b/utils/fsck/check_tree.c
new file mode 100644
index 0000000..721a536
--- /dev/null
+++ b/utils/fsck/check_tree.c
@@ -0,0 +1,872 @@
+/*
+ * Copyright 1999-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/unaligned.h"
+
+/* check_fs_tree stops and recommends to run fsck --rebuild-tree when:
+   1. read fails
+   2. node of wrong level found in the tree
+   3. something in the tree points to wrong block number
+      out of filesystem boundary is pointed by tree
+      to block marked as free in bitmap
+      the same block is pointed from more than one place
+      not data blocks (journal area, super block, bitmaps)
+   4. bad formatted node found
+   5. delimiting keys are incorrect
+*/
+
+/* mark every block we see in the tree in control_bitmap, so, when to make
+   sure, that no blocks are pointed to from more than one place we use
+   additional bitmap (control_bitmap). If we see pointer to a block we set
+   corresponding bit to 1. If it is set already - run with --rebuild-tree */
+static reiserfs_bitmap_t * control_bitmap;
+
+static reiserfs_bitmap_t * source_bitmap;
+
+static void fsck_tree_check_bitmap_prep (reiserfs_filsys_t * fs) {
+    unsigned int i;
+    unsigned long nr;
+    unsigned long block;
+    unsigned long reserved;
+    unsigned long bmap_nr;
+
+    nr = reiserfs_sb_get_blocks(fs->fs_ondisk_sb);
+    
+    control_bitmap = reiserfs_bitmap_create(nr);
+    
+    if (!control_bitmap)
+	misc_die ("%s: Failed to allocate a control bitmap.", __FUNCTION__);
+
+    /* skipped and super block */
+    for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++)
+    	reiserfs_bitmap_set_bit (control_bitmap, i);
+
+    /* bitmaps */
+    bmap_nr = reiserfs_bmap_nr(nr, fs->fs_blocksize);
+    block = fs->fs_super_bh->b_blocknr + 1;
+    for (i = 0; i < bmap_nr; i ++) {
+        reiserfs_bitmap_set_bit (control_bitmap, block);
+
+	if (reiserfs_bitmap_spread (fs))
+	    block = (block / (fs->fs_blocksize * 8) + 1) * 
+		    (fs->fs_blocksize * 8);
+	else
+	    block ++;	
+    }
+    
+    /* mark as used area of the main device either containing a journal or
+       reserved to hold it */
+
+    reserved = reiserfs_journal_hostsize(fs->fs_ondisk_sb);
+    
+    /* where does journal area (or reserved journal area) start from */
+
+    if (!reiserfs_new_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) &&
+    	!reiserfs_old_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
+    {
+	misc_die ("%s: Wrong super block location. You must "
+		  "run --rebuild-sb.", __FUNCTION__);
+    }
+
+    block = reiserfs_journal_start_must (fs);
+
+    for (i = block; i < reserved + block; i ++)
+	reiserfs_bitmap_set_bit (control_bitmap, i);
+
+    if (fs->fs_badblocks_bm)
+	for (i = 0; i < nr; i ++) {
+	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))
+	    	reiserfs_bitmap_set_bit (control_bitmap, i);	
+	}
+}
+
+/* if we managed to complete tree scanning and if control bitmap and/or proper
+   amount of free blocks mismatch with bitmap on disk and super block's
+   s_free_blocks - we can fix that */
+static void fsck_tree_check_bitmap_fini (reiserfs_filsys_t * fs) {
+    int problem = 0;
+
+    /* check free block counter */
+    if (reiserfs_sb_get_free (fs->fs_ondisk_sb) != 
+	reiserfs_bitmap_zeros (control_bitmap)) 
+    {
+/*	fsck_log ("vpf-10630: The count of free blocks in the on-disk bitmap "
+		  "(%lu) mismatches with the correct one (%lu).\n",  
+		  reiserfs_sb_get_free (fs->fs_ondisk_sb),
+		  reiserfs_bitmap_zeros (control_bitmap));
+*/
+	problem++;
+    }
+
+    if (reiserfs_bitmap_compare (source_bitmap, control_bitmap))
+	problem++;    
+
+    if (problem) {
+        if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+	    fsck_log ("vpf-10630: The on-disk and the correct "
+		      "bitmaps differs. Will be fixed later.\n");
+	    
+//            fsck_progress ("Trying to fix bitmap ..\n");
+            /* mark blocks as used in source bitmap if they are used in 
+	       control bitmap */
+            reiserfs_bitmap_disjunction (source_bitmap, control_bitmap);
+            /* change used blocks count accordinly source bitmap, copy 
+	       bitmap changes to on_disk bitmap */
+            reiserfs_sb_set_free (fs->fs_ondisk_sb, 
+				reiserfs_bitmap_zeros(source_bitmap));
+            reiserfs_bitmap_copy (fs->fs_bitmap2, source_bitmap);
+            reiserfs_buffer_mkdirty (fs->fs_super_bh);
+/*
+            // check again 
+            if ((diff = reiserfs_bitmap_compare(source_bitmap, 
+						control_bitmap)) != 0)  
+	    {
+                // do not mark them as fatal or fixable because one can live 
+		// with leaked space. So this is not a fatal corruption, and 
+		// fix-fixable cannot fix it 
+                fsck_progress (" bitmaps were not recovered.\n\tYou can either "
+		"run rebuild-tree or live with %d leaked blocks\n", diff);
+            } else {
+                fsck_progress ("finished\n");
+            }
+*/
+        } else if (problem) {
+	    fsck_log ("vpf-10640: The on-disk and the "
+		      "correct bitmaps differs.\n");
+	    
+            while (problem) {
+                /* fixable corruptions because we can try to recover them 
+		   without rebuilding the tree */
+        	one_more_corruption (fs, FIXABLE); 
+        	problem --;
+            }
+        }
+    } else 
+        //fsck_progress ("finished\n");
+        
+    return;
+}
+
+static int fsck_tree_check_bitmap_auto (reiserfs_filsys_t *fs) {
+    unsigned long i;
+    
+    if (source_bitmap->bm_byte_size != control_bitmap->bm_byte_size)
+	return -1;
+    
+    for (i = 0; i < source_bitmap->bm_byte_size; i ++) {
+	if (control_bitmap->bm_map[i] & ~source_bitmap->bm_map[i]) {
+	    return 1;
+	}
+    }
+    
+    return 0;
+}
+
+/* is this block legal to be pointed to by some place of the tree? */
+static int fsck_tree_check_blknr (reiserfs_filsys_t * fs, unsigned long block) {
+    if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) {
+	/* block has value which can not be used as a pointer in a tree */
+	return 1;
+    }
+
+    return 0;
+}
+
+static int fsck_tree_check_mark_block (unsigned long block) {
+    if (reiserfs_bitmap_test_bit (control_bitmap, block)) {
+	/* block is in tree at least twice */
+    	return 1;
+    }
+    
+    reiserfs_bitmap_set_bit (control_bitmap, block);
+    return 0;
+}
+
+/* 1 if it does not look like reasonable stat data */
+static int fsck_tree_check_stat (reiserfs_filsys_t * fs, 
+				 reiserfs_bh_t * bh, 
+				 reiserfs_ih_t * ih)
+{
+    unsigned long objectid;
+
+    objectid = reiserfs_key_get_oid (&ih->ih_key);
+    if (!reiserfs_objmap_test (fs, objectid)) {
+	/* FIXME: this could be cured right here */
+	fsck_log ("%s: The objectid (%lu) is marked free, but used by an "
+		  "object %k\n", __FUNCTION__, objectid, &ih->ih_key);
+
+        /* if it is FIX_FIXABLE we flush objectid map at the end
+           no way to call one_less_corruption later
+        */
+	if (fsck_mode (fs) != FSCK_FIX_FIXABLE)
+	    one_more_corruption (fs, FIXABLE);
+    }
+
+    if (id_map_mark(proper_id_map (fs), objectid)) {
+	fsck_log ("%s: The objectid (%lu) is shared by at least "
+		  "two files. Can be fixed with --rebuild-tree "
+		  "only.\n", __FUNCTION__, objectid);
+    }
+
+    return 0;
+}
+
+static inline void handle_one_pointer (reiserfs_filsys_t * fs, 
+				       reiserfs_bh_t * bh,
+				       __u32 * item, 
+				       int offset)
+{
+    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+	fsck_log (" - zeroed");
+	d32_put (item, offset, 0);
+	reiserfs_buffer_mkdirty (bh);
+    } else {
+	one_more_corruption (fs, FIXABLE);
+    }
+}
+
+static int fsck_tree_check_badblock (reiserfs_filsys_t * fs, 
+				     reiserfs_bh_t * bh,
+				     reiserfs_ih_t * ih) 
+{
+    __u32 i;
+    __u32 * ind = (__u32 *)reiserfs_item_by_ih (bh, ih);
+
+    if (reiserfs_ih_get_len (ih) % 4) {
+	fsck_log ("%s: block %lu: item (%H) has bad length\n", 
+		  __FUNCTION__, bh->b_blocknr, ih);
+	one_more_corruption (fs, FATAL);
+	return 1;
+    }
+	
+    /* All valid badblocks are given in badblock bitmap. 
+       Nothing to check anymore. */
+    if (fs->fs_badblocks_bm)
+	    return 0;
+    
+    for (i = 0; i < reiserfs_ext_count (ih); i ++) {
+	if (!d32_get (ind, i)) {
+/*	    fsck_log ("%s: block %lu: badblocks item (%H) has "
+		      "zero pointer.", __FUNCTION__, bh->b_blocknr, ih);
+	    
+	    if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
+		    fsck_log("Not an error, but could be deleted "
+			     "with --fix-fixable\n");
+	    } else {
+		    fsck_log("Will be deleted later.\n");
+	    }	*/
+	    
+	    continue;
+	}
+
+	/* check list of badblocks pointers */
+	if (d32_get (ind, i) >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) {
+	    fsck_log ("%s: badblock pointer (block %lu) points "
+		      "out of disk spase (%lu)", __FUNCTION__, 
+		      bh->b_blocknr, d32_get (ind, i));
+	    
+	    handle_one_pointer (fs, bh, ind, i);
+	    fsck_log ("\n");
+	}
+
+	if (reiserfs_bitmap_test_bit (control_bitmap, d32_get (ind, i))) {
+	    /* it can be
+	       1. not_data_block
+	       		delete pointer
+	       2. ind [i] or internal/leaf
+	          advice to run fix-fixable if there is no fatal errors
+	          with list of badblocks, say that it could fix it. */
+	
+	    if (reiserfs_fs_block(fs, d32_get (ind, i)) != BT_UNKNOWN ) {
+		fsck_log ("%s: badblock pointer (block %lu) points on fs "
+			  "metadata (%lu)", __FUNCTION__, bh->b_blocknr, 
+			  d32_get (ind, i));
+		
+		handle_one_pointer (fs, bh, ind, i);
+		fsck_log ("\n");
+	    } else {
+		one_more_corruption(fs, FIXABLE);
+	        fsck_log ("%s: badblock pointer (block %lu) points to "
+			  "a block (%lu) which is in the tree already. "
+			  "Use badblock option (-B) to fix the problem\n", 
+			  __FUNCTION__, bh->b_blocknr, d32_get (ind, i));
+	    }
+
+	    continue;
+	}
+	
+	reiserfs_bitmap_set_bit (control_bitmap, d32_get(ind, i));
+    }
+
+    return 0;
+}
+
+/* for each unformatted node pointer: make sure it points to data area and
+   that it is not in the tree yet */
+static int fsck_tree_check_ext (reiserfs_filsys_t * fs, 
+				reiserfs_bh_t * bh,
+				reiserfs_ih_t * ih)
+{
+    __u32 * ind = (__u32 *)reiserfs_item_by_ih (bh, ih);
+    unsigned int i;
+
+    if (reiserfs_ih_get_len (ih) % REISERFS_EXT_SIZE) {
+	fsck_log ("%s: block %lu: The item (%H) has the bad length (%u)\n",
+		  __FUNCTION__, bh->b_blocknr, ih, reiserfs_ih_get_len (ih));
+	one_more_corruption (fs, FATAL);
+	return 1;
+    }
+
+    for (i = 0; i < reiserfs_ext_count (ih); i ++) {
+
+	fsck_check_stat (fs)->unfm_pointers ++;
+	if (!d32_get (ind, i)) {
+	    fsck_check_stat (fs)->zero_unfm_pointers ++;
+	    continue;
+	}
+
+	/* check unformatted node pointer and mark it used in the
+           control bitmap */
+	if (fsck_tree_check_blknr(fs, d32_get (ind, i))) {
+	    fsck_log ("%s: block %lu: The item %k has the bad pointer (%d) to "
+		      "the block (%lu)", __FUNCTION__, bh->b_blocknr, 
+		      &ih->ih_key, i, d32_get (ind, i));
+	    
+	    handle_one_pointer (fs, bh, ind, i);
+	    fsck_log ("\n");
+	    continue;
+	}
+
+        if (fsck_tree_check_mark_block (d32_get (ind, i))) {
+	    fsck_log ("%s: block %lu: The item (%H) has the bad pointer (%d) "
+		      "to the block (%lu), which is in tree already", 
+		      __FUNCTION__, bh->b_blocknr, ih, i, d32_get (ind, i));
+	    
+	    handle_one_pointer (fs, bh, ind, i);
+	    fsck_log ("\n");
+            continue;
+	}
+    }
+
+#if 0
+    /* delete this check for 3.6 */
+    if (reiserfs_ih_get_free (ih) > fs->fs_blocksize - 1) {
+        if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+            /*FIXME: fix it if needed*/
+        } else {
+            fsck_log ("%s: %H has wrong ih_free_space\n", __FUNCTION__, ih);
+            one_more_corruption (fs, fixable);
+        }
+    }
+#endif
+
+    return 0;
+}
+
+static int fsck_tree_check_dir (reiserfs_filsys_t * fs, 
+			       reiserfs_bh_t * bh, 
+			       reiserfs_ih_t * ih)
+{
+    char *name, *prev_name;
+    __u32 off, prev_off;
+    unsigned int count, i;
+    reiserfs_deh_t * deh = reiserfs_deh (bh, ih);
+    int min_entry_size = 1;/* We have no way to understand whether the
+                              filesystem was created in 3.6 format or
+                              converted to it. So, we assume that minimal name
+                              length is 1 */
+    __u16 state;
+    int namelen;
+
+    count = reiserfs_ih_get_entries (ih);
+
+    if (count == 0) {
+	one_more_corruption (fs, FATAL);	
+	return 1;
+    }
+    
+    /* make sure item looks like a directory */
+    if (reiserfs_ih_get_len (ih) / 
+	(REISERFS_DEH_SIZE + min_entry_size) < count) 
+    {
+	/* entry count can not be that big */
+	fsck_log ("%s: block %lu: The directory item %k has the exsessively "
+		  "big entry count (%u)\n",  __FUNCTION__, bh->b_blocknr, 
+		  &ih->ih_key, count);
+	
+	one_more_corruption (fs, FATAL);	
+	return 1;
+    }
+
+    if (reiserfs_deh_get_loc (&deh[count - 1]) != REISERFS_DEH_SIZE * count) {
+	/* last entry should start right after array of dir entry headers */
+	fsck_log ("%s: block %lu: The directory item %k has the corrupted "
+		  "entry structure\n", __FUNCTION__, bh->b_blocknr, 
+		  &ih->ih_key);
+	
+	one_more_corruption (fs, FATAL);
+	return 1;
+    }
+    
+    /* check name hashing */
+    prev_name = reiserfs_item_by_ih(bh, ih) + reiserfs_ih_get_len(ih);
+    prev_off = 0;
+
+    for (i = 0; i < count; i ++, deh ++) {
+	namelen = reiserfs_direntry_name_len (ih, deh, i);
+	name = reiserfs_deh_name (deh, i);
+	off = reiserfs_deh_get_off (deh);
+	
+	if (namelen > REISERFS_NAME_MAX || 
+	    name >= prev_name || off <= prev_off) 
+	{
+	    fsck_log ("%s: block %lu: The directory item %k has a broken entry "
+		      "(%d)\n", __FUNCTION__, bh->b_blocknr, &ih->ih_key, i);
+	    one_more_corruption (fs, FATAL);
+	    return 1;
+	}
+
+	if (!reiserfs_hash_correct (&fs->hash, name, namelen, off)) {
+	    fsck_log ("%s: block %lu: The directory item %k has a not properly "
+		      "hashed entry (%d)\n", __FUNCTION__, bh->b_blocknr, 
+		      &ih->ih_key, i);
+	    
+	    one_more_corruption (fs, FATAL);
+	    return 1;
+	}
+
+	prev_name = name;
+	prev_off = off;
+    }
+
+    deh = reiserfs_deh (bh, ih);
+    state = (1 << DEH_Visible2);
+    /* ok, items looks like a directory */
+    for (i = 0; i < count; i ++, deh ++) {
+	if (reiserfs_deh_get_state (deh) != state) {
+	    fsck_log ("%s: block %lu: The directory item %k has the entry (%d) "
+		      "\"%.*s\" with a not legal state (%o), (%o) expected", 
+		      __FUNCTION__, bh->b_blocknr, &ih->ih_key, i, 
+		      reiserfs_direntry_name_len (ih, deh, i), 
+		      reiserfs_deh_name (deh, i), 
+		      reiserfs_deh_get_state (deh), state);
+	    
+	    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+		reiserfs_deh_set_state (deh, 1 << DEH_Visible2);
+		reiserfs_buffer_mkdirty (bh);
+		fsck_log (" - corrected\n");
+	    } else 
+		one_more_corruption (fs, FIXABLE);
+	    
+	    fsck_log ("\n");
+	}
+    }
+
+    return 0;
+}
+
+static int fsck_tree_check_item (reiserfs_filsys_t * fs, 
+				 reiserfs_bh_t * bh, 
+				 int num)
+{
+    reiserfs_ih_t * ih;
+    int format;
+
+    ih = reiserfs_ih_at (bh, num);
+
+    if ((reiserfs_ih_get_flags(ih)) != 0) {
+	if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
+	    one_more_corruption (fs, FIXABLE);
+	    fsck_log ("%s: vpf-10570: block %lu: The item header (%d) has not "
+		      "cleaned flags.\n", __FUNCTION__, bh->b_blocknr, num);
+	} else {
+	    fsck_log ("%s: vpf-10580: block %lu: Flags in the item header "
+		      "(%d) were cleaned\n", __FUNCTION__, bh->b_blocknr, num);
+	    
+	    reiserfs_ih_clflags(ih);
+	    reiserfs_buffer_mkdirty(bh);
+	}
+    }
+
+    
+    if (reiserfs_ih_stat(ih) && 
+	reiserfs_ih_get_len(ih) == REISERFS_SD_SIZE) 
+    {
+	format = KEY_FORMAT_2;
+    } else if (reiserfs_ih_stat(ih) && 
+	       reiserfs_ih_get_len(ih) == REISERFS_SD_SIZE_V1)
+    {
+	format = KEY_FORMAT_1;
+    } else {
+	format = reiserfs_key_format(&ih->ih_key);
+    }
+    
+    if (format != reiserfs_ih_get_format(ih)) {
+	if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
+	    one_more_corruption (fs, FIXABLE);
+	    fsck_log ("%s: vpf-10710: block %lu: The format (%d) specified "
+		      "in the item header (%d) differs from the key format "
+		      "(%d).\n", __FUNCTION__, bh->b_blocknr, 
+		      reiserfs_ih_get_format(ih), num, format);
+	} else {
+	    fsck_log ("%s: vpf-10720: block %lu: The format (%d) specified "
+		      "in the item header (%d) was fixed to the key format "
+		      "(%d).\n", __FUNCTION__, bh->b_blocknr, 
+		      reiserfs_ih_get_format(ih), num, format);
+	    
+	    reiserfs_ih_set_format(ih, format);
+	    reiserfs_buffer_mkdirty(bh);
+	}
+    }
+
+    if (reiserfs_key_get_oid (&ih->ih_key) == REISERFS_BAD_OID) {
+	if (reiserfs_key_get_did (&ih->ih_key) == REISERFS_BAD_DID && 
+	    reiserfs_ih_ext (ih)) 
+	{
+		/* Bad Block support. */
+		return fsck_tree_check_badblock (fs, bh, ih);
+	}
+
+	goto error;
+    } else {
+	if (reiserfs_key_get_did (&ih->ih_key) == (__u32)-1) {
+	    /*  Safe Link support. Allowable safe links are:
+		-1 object_id           0x1	EXTENT (truncate) or
+		-1 object_id   blocksize+1	DIRECT   (unlink) */
+	    if (reiserfs_ih_direct(ih) && 
+		reiserfs_key_get_off(&ih->ih_key) == fs->fs_blocksize + 1) 
+	    {
+		if (reiserfs_ih_get_len (ih) == 4) {
+		/*  fsck_log("vpf-00010: safe link found %k\n", &ih->ih_key);*/
+		    fsck_check_stat(fs)->safe ++;
+		    return 0;
+		}
+	    }
+
+	    if (reiserfs_ih_ext(ih) && 
+		reiserfs_key_get_off(&ih->ih_key) == 0x1) 
+	    {
+		if (reiserfs_ih_get_len (ih) == 4) {
+		/*  fsck_log("vpf-00020: safe link found %k\n", &ih->ih_key);*/
+		    fsck_check_stat(fs)->safe ++;
+		    return 0;
+		}
+	    }
+	
+	    /* it does not look like safe link */
+	    goto error;
+	}
+    }
+    
+    if (reiserfs_ih_stat (ih))
+	return fsck_tree_check_stat (fs, bh, ih);
+
+    if (reiserfs_ih_direct (ih))
+	return 0;
+
+    if (reiserfs_ih_ext(ih))
+	return fsck_tree_check_ext (fs, bh, ih);
+    
+    return fsck_tree_check_dir (fs, bh, ih);
+ 
+ error:
+    one_more_corruption (fs, FATAL);
+    fsck_log ("%s: vpf-10310: block %lu, item %d: The item has a wrong "
+	      "key %k\n", __FUNCTION__, num, bh->b_blocknr, &ih->ih_key);
+    return 1;
+}
+
+/* 1 if block head or any of items is bad */
+static int fsck_tree_leaf_check (reiserfs_filsys_t * fs, reiserfs_bh_t * bh) {
+    int i;
+
+    if (fsck_leaf_check_header(fs, bh))
+	return 1;
+    
+    for (i = 0; i < reiserfs_node_items (bh); i ++) {
+	if (fsck_tree_check_item (fs, bh, i)) {
+	    fsck_log ("%s: block %lu, item %d: The corrupted item found (%H)\n",
+		      __FUNCTION__, bh->b_blocknr, i, reiserfs_ih_at (bh, i));
+	}
+
+	if (i && fsck_leaf_check_neigh (fs, bh, i)) {
+	    fsck_log ("%s: block %lu, items %d and %d: The wrong order of "
+		      "items: %k, %k\n", __FUNCTION__, bh->b_blocknr, i - 1, i,
+		      &reiserfs_ih_at (bh, i - 1)->ih_key,
+		      &reiserfs_ih_at (bh, i)->ih_key);
+	}
+    }
+    return 0;
+}
+
+/* 1 if bh does not look like internal node */
+static int fsck_tree_check_internal (reiserfs_filsys_t * fs, 
+				     reiserfs_bh_t * bh) 
+{
+    int i;
+
+    for (i = 0; i <= reiserfs_node_items (bh); i ++) {
+        if (i != reiserfs_node_items (bh) && i != 
+	    reiserfs_node_items (bh) - 1)
+	{
+	    /* make sure that keys are in increasing order */
+            if (reiserfs_key_comp (reiserfs_int_key_at (bh, i), 
+				   reiserfs_int_key_at (bh, i + 1)) != -1) 
+	    {
+		fsck_log ("%s: vpf-10320: block %lu, items %d and %d: The "
+			  "wrong order of items: %k, %k\n", __FUNCTION__, 
+			  bh->b_blocknr, i, i + 1, reiserfs_int_key_at (bh, i),
+			  reiserfs_int_key_at (bh, i + 1));
+		
+		one_more_corruption (fs, FATAL);
+                return 1;
+	    }
+	}
+	
+	/* make sure that the child is correct */
+        if (fsck_tree_check_blknr(fs, reiserfs_dc_get_nr (reiserfs_int_at (bh,i))))
+	{
+	    fsck_log ("%s: vpf-10330: block %lu, item %d: The internal "
+		      "item points to the not legal block (%lu)\n", 
+		      __FUNCTION__, bh->b_blocknr, i, 
+		      reiserfs_dc_get_nr (reiserfs_int_at (bh,i)));
+	    
+            one_more_corruption (fs, FATAL);
+            return 1;
+	}
+    }
+    
+    return 0;
+}
+
+/* h == 0 for root level. block head's level == 1 for leaf level  */
+static inline int h_to_level (reiserfs_filsys_t * fs, int h) {
+    return reiserfs_sb_get_height (fs->fs_ondisk_sb) - h + 1;
+}
+
+/* bh must be formatted node. blk_level must be tree_height - path.path_length */
+static int fsck_tree_check_node (reiserfs_filsys_t * fs, 
+				 reiserfs_path_t * path)
+{
+    reiserfs_bh_t *pbh = REISERFS_PATH_LEAF(path);
+
+    if (reiserfs_node_level(pbh) != h_to_level (fs, path->path_length)) {
+       	fsck_log ("block %lu: The level of the node (%d) is not "
+		  "correct, (%d) expected\n", pbh->b_blocknr, 
+		  reiserfs_node_level(pbh), h_to_level(fs, path->path_length));
+	
+	one_more_corruption (fs, FATAL);
+        return 1;
+    }
+
+    if (fsck_tree_check_blknr(fs, pbh->b_blocknr)) {
+	one_more_corruption (fs, FATAL);
+	fsck_log ("%s: vpf-10340: The node in the wrong block number (%lu) "
+		  "found in the tree\n",  __FUNCTION__, pbh->b_blocknr);
+	return 1;
+    }
+
+    if (fsck_tree_check_mark_block (pbh->b_blocknr)) {
+	fsck_log ("%s: vpf-10350: The block (%lu) is used more than once "
+		  "in the tree.\n",  __FUNCTION__, pbh->b_blocknr);
+	one_more_corruption (fs, FATAL);
+        return 1;
+    }
+    
+    if (reiserfs_leaf_head(pbh)) {
+	fsck_check_stat (fs)->leaves ++;
+	return fsck_tree_leaf_check (fs, pbh);
+    }
+    
+    fsck_check_stat (fs)->internals ++;
+    return fsck_tree_check_internal (fs, pbh);
+}
+
+/* are all delimiting keys correct */
+static int fsck_tree_check_path (reiserfs_filsys_t * fs, 
+				 reiserfs_path_t * path)
+{
+    const reiserfs_key_t *dk;
+    reiserfs_bh_t *parent;
+    reiserfs_bh_t *bh;
+    int items;
+    int pos;
+    int h1;
+
+    h1 = REISERFS_PATH_OFFILL;
+    while (path->path_elements[h1 + 1].pe_buffer)
+	h1 ++;
+
+    // path[h] is leaf
+    if (h1 != path->path_length)
+	misc_die ("%s: The leaf is expected as the last "
+		  "element in the path.", __FUNCTION__);
+
+    bh = REISERFS_PATH_LEAF(path);
+    if (h1 != REISERFS_PATH_OFFINIT) {
+	parent = REISERFS_PATH_BUFFER(path, h1 - 1);
+	pos = reiserfs_internal_get_pos (parent, bh->b_blocknr);
+    } else {
+	parent = NULL;
+	pos = 0;
+    }
+
+    dk = reiserfs_tree_lkey (path, fs);
+    if (dk != &MIN_KEY && 
+	reiserfs_key_comp (dk, reiserfs_ih_key_at (bh, 0))) 
+    {
+	/* left delimiting key must be equal to the key of 0-th item in the
+	   node */
+	fsck_log ("%s: The left delimiting key %k of the node (%lu) must "
+		  "be equal to the first element's key %k within the node.\n",
+		  __FUNCTION__, dk, bh->b_blocknr, reiserfs_ih_key_at(bh, 0));
+	
+	one_more_corruption (fs, FATAL);
+	return 1;
+    }
+    
+    items = reiserfs_nh_get_items( NODE_HEAD(bh) ) - 1;
+    dk = reiserfs_tree_rkey (path, fs);
+    if (dk != &MAX_KEY && 
+	reiserfs_key_comp (dk, reiserfs_ih_key_at (bh, items)) != 1) 
+    {
+	/* right delimiting key must be greather then the key of the last 
+	   item in the node */
+	fsck_log ("%s: The right delimiting key %k of the node (%lu) must "
+		  "be greater than the last (%d) element's key %k within "
+		  "the node.\n", __FUNCTION__, dk, bh->b_blocknr,
+		  reiserfs_nh_get_items (NODE_HEAD (bh)) - 1, 
+		  reiserfs_ih_key_at (bh, items));
+	
+	one_more_corruption (fs, FATAL);
+	return 1;
+    }
+
+    if ((h1 != REISERFS_PATH_OFFINIT) && 
+	(reiserfs_dc_get_size(reiserfs_int_at(parent, pos)) +
+	 reiserfs_nh_get_free(NODE_HEAD(bh)) + 
+	 REISERFS_NODEH_SIZE != bh->b_size))
+    {
+	/* wrong dc_size */
+	fsck_log ("bad_path: block %lu, pointer %d: The used space (%d) "
+		  "of the child block (%lu)", parent->b_blocknr, pos, 
+		  reiserfs_dc_get_size(reiserfs_int_at(parent, pos)), 
+		  bh->b_blocknr);
+	
+	fsck_log (" is not equal to the (blocksize (4096) - free space (%d) - "
+		  "header size (%u))", reiserfs_nh_get_free(NODE_HEAD(bh)), 
+		  REISERFS_NODEH_SIZE);
+	
+	if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+	    reiserfs_dc_set_size (
+		    reiserfs_int_at(parent, pos), bh->b_size -
+		    reiserfs_nh_get_free(NODE_HEAD(bh)) - REISERFS_NODEH_SIZE);
+	    
+	    fsck_log (" - corrected to (%lu)\n", 
+		      reiserfs_dc_get_size (reiserfs_int_at(parent, pos)));
+	    
+	    reiserfs_buffer_mkdirty (parent);
+	} else {
+	    one_more_corruption (fs, FIXABLE);
+	    fsck_log ("\n");
+	    return 1;
+	}
+    }
+
+    return 0;
+}
+
+static void fsck_tree_check_prep (reiserfs_filsys_t * fs) {
+    fsck_tree_check_bitmap_prep (fs);
+
+    source_bitmap = 
+	    reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    
+    reiserfs_bitmap_copy (source_bitmap, fs->fs_bitmap2);
+
+    proper_id_map (fs) = id_map_init();
+}
+
+static void fsck_tree_check_fini (reiserfs_filsys_t * fs) {
+    if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
+        reiserfs_bitmap_flush(fs->fs_bitmap2, fs);
+        reiserfs_fs_flush (fs);
+        fs->fs_dirt = 1;
+	reiserfs_bitmap_delta (source_bitmap, control_bitmap);
+	fsck_deallocate_bitmap(fs) = source_bitmap;
+    } else 
+	reiserfs_bitmap_delete (source_bitmap);
+    
+    reiserfs_bitmap_delete (control_bitmap);
+    reiserfs_buffer_flush_all (fs->fs_dev);
+}
+
+/* pass internal tree of filesystem */
+void check_fs_tree (reiserfs_filsys_t * fs)
+{
+    fsck_tree_check_prep (fs);
+    
+    fsck_progress ("Checking Internal tree...\n");
+
+    fsck_tree_trav (fs, fsck_tree_check_node, 
+		    fsck_tree_check_path, 
+		    fsck_mode(fs) == FSCK_AUTO ? 2 : -1);
+ 
+    if (!fsck_quiet(fs))
+	fsck_progress("\n");
+    
+    /* compare created bitmap with the original */
+    if (fsck_mode(fs) == FSCK_AUTO) {
+	if (fsck_tree_check_bitmap_auto(fs)) {
+	    fprintf(stderr, "The on-disk bitmap looks corrupted.");
+	    one_more_corruption(fs, FIXABLE);
+	}
+	id_map_free(proper_id_map(fs));
+    } else
+	fsck_tree_check_bitmap_fini(fs);
+    
+    fsck_tree_check_fini (fs);
+}
+
+static int clean_attributes_handler (reiserfs_filsys_t * fs, 
+				     reiserfs_path_t * path) 
+{
+    reiserfs_bh_t * bh = REISERFS_PATH_LEAF(path);
+    int i;
+
+    if (reiserfs_node_level (bh) != h_to_level (fs, path->path_length)) {
+       	reiserfs_panic ("The node (%lu) with wrong level (%d) "
+			"found in the tree, (%d) expected\n", 
+			bh->b_blocknr, reiserfs_node_level (bh), 
+			h_to_level (fs, path->path_length));
+    }
+
+    if (!reiserfs_leaf_head (bh))
+        return 0;
+
+    for (i = 0; i < reiserfs_node_items (bh); i ++) {
+        if (reiserfs_ih_stat (reiserfs_ih_at (bh, i)) &&
+            reiserfs_ih_get_len (reiserfs_ih_at (bh, i)) == 
+	    REISERFS_SD_SIZE) 
+	{
+	    reiserfs_set_sd_v2_attrs
+		    ((reiserfs_sd_t *)reiserfs_item_at(bh, i), 0);
+	    reiserfs_buffer_mkdirty (bh);
+	}
+    }
+
+    return 0;
+}
+
+void fsck_tree_clean_attr (reiserfs_filsys_t * fs) {
+    fsck_tree_trav (fs, clean_attributes_handler, NULL, -1);
+    reiserfs_sb_mkflag (fs->fs_ondisk_sb, reiserfs_attrs_cleared);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+}
diff --git a/utils/fsck/fsck.h b/utils/fsck/fsck.h
new file mode 100644
index 0000000..bf11437
--- /dev/null
+++ b/utils/fsck/fsck.h
@@ -0,0 +1,560 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#include "reiserfs/libreiserfs.h"
+#include <stdio.h>
+
+#if 0
+
+#include "io.h"
+#include "misc.h"
+#include "reiserfs_lib.h"
+
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <assert.h>
+
+#include "../version.h"
+#endif
+
+/* main.c */
+extern reiserfs_filsys_t * fs;
+
+/* Exit codes. */
+#define EXIT_OK		0
+#define EXIT_FIXED	1
+#define EXIT_REBOOT	2
+#define EXIT_FATAL	4
+#define EXIT_FIXABLE	6
+#define EXIT_OPER	8   /* Some operation returns error. */
+#define EXIT_USER	16
+
+/*
+ * modes
+ */
+#define DO_NOTHING              0
+#define FSCK_CHECK              1
+#define FSCK_FIX_FIXABLE        2
+#define FSCK_SB                 3
+#define FSCK_REBUILD            4
+#define FSCK_ROLLBACK_CHANGES   5
+#define FSCK_CLEAN_ATTRIBUTES	7
+#define FSCK_AUTO               8 /* -a || -p specified */
+
+/* temporary */
+#define DO_TEST                 9
+
+/*
+ * options
+ */
+
+#define OPT_INTERACTIVE                 1 << 0
+#define OPT_ADJUST_FILE_SIZE            1 << 1	/* not default yet */
+#define OPT_QUIET                       1 << 2	/* no "speed" info */
+#define OPT_SILENT                      1 << 3	/* no complains about found corruptions */
+#define OPT_BACKGROUND                  1 << 4
+#define OPT_SKIP_JOURNAL                1 << 5
+#define OPT_HASH_DEFINED                1 << 6
+#define OPT_SAVE_PASSES_DUMP            1 << 7
+#define OPT_SAVE_ROLLBACK               1 << 8
+#define OPT_YES				1 << 9
+#define BADBLOCKS_FILE               	1 << 10
+
+/* set by fsck when pass-by-pass (-d), FS_FATAL flag included */
+enum fsck_state_flags {
+	PASS_0_DONE     = 0xfa02,
+	PASS_1_DONE     = 0xfb02,
+	TREE_IS_BUILT   = 0xfc02,
+	SEMANTIC_DONE   = 0xfd02,
+	LOST_FOUND_DONE = 0xfe02
+
+};
+
+/* Stage.c */
+
+extern void fsck_stage_start_put (FILE * file, unsigned long stage);
+extern void fsck_stage_end_put (FILE * file);
+extern int fsck_stage_magic_check (FILE * fp);
+
+/* pass0.c */
+extern int pass0_block_isbad_unfm(unsigned long block);
+extern int pass0_block_isgood_unfm(unsigned long block);
+extern int pass0_block_isleaf(unsigned long block);
+extern void pass0_block_clleaf(unsigned long block);
+extern void fsck_pass0 (reiserfs_filsys_t *);
+extern void fsck_pass0_load_result (FILE *, reiserfs_filsys_t *);
+extern void make_allocable (unsigned long block);
+extern int fsck_leaf_check(reiserfs_bh_t * bh);
+extern unsigned long alloc_block (void);
+extern void fsck_pass0_aux_fini ();
+extern int fsck_leaf_item_check (reiserfs_bh_t * bh, reiserfs_ih_t *, char *);
+extern int are_there_allocable_blocks (unsigned int amout_needed);
+extern int fsck_leaf_check_header(reiserfs_filsys_t * fs, reiserfs_bh_t * bh);
+
+/* pass1.c */
+#define fsck_item_reach(ih)	(reiserfs_ih_isreach (ih) ? 1 : 0)
+#define fsck_item_mkunreach(ih)			\
+({						\
+	reiserfs_ih_clflags (ih);		\
+	reiserfs_ih_mkunreach (ih);		\
+						\
+	if (reiserfs_ih_ext (ih))		\
+		reiserfs_ih_set_free (ih, 0);	\
+})
+
+#define fsck_item_mkreach(ih, bh)		\
+({						\
+	reiserfs_ih_clunreach (ih);		\
+	reiserfs_buffer_mkdirty (bh);		\
+})
+
+extern void fsck_pass1 (reiserfs_filsys_t *);
+extern void fsck_pass1_load_result (FILE *, reiserfs_filsys_t *);
+extern void fsck_pass2 (reiserfs_filsys_t *);
+extern void fsck_info_checkmem(void);
+
+/* pass2.c */
+typedef struct saveitem saveitem_t;
+struct saveitem {
+    reiserfs_ih_t si_ih;
+    char * si_dnm_data;
+    saveitem_t * si_next;
+    __u32 si_blocknr;
+
+    // changed by XB;
+    saveitem_t * last_known;
+};
+
+extern void fsck_pass2_load_result (reiserfs_filsys_t *);
+
+extern void fsck_item_save(reiserfs_path_t * path, 
+			   saveitem_t ** head);
+
+extern saveitem_t * fsck_item_free(saveitem_t * si);
+
+extern void fsck_tree_insert_item (reiserfs_ih_t * ih, 
+				   char * item, int was_in_tree);
+
+extern void fsck_tree_merge(reiserfs_path_t *path);
+extern long long int must_there_be_a_hole (const reiserfs_ih_t *ih, 
+					   const reiserfs_key_t *key);
+
+extern int fsck_tree_insert_zero_ptr (reiserfs_filsys_t *fs,
+				      reiserfs_key_t *key,
+				      long long int p_count,
+				      __u16 flags);
+
+extern void fsck_tree_rewrite(reiserfs_filsys_t *fs, 
+			      const reiserfs_key_t *start_key,
+			      __u64 end, __u16 flags);
+
+typedef int (*tree_modify_t) (reiserfs_path_t *path, void *data);
+
+/* relocate.c */
+extern void fsck_relocate_mklinked(reiserfs_key_t *new_key);
+extern __u32 fsck_relocate_get_oid (reiserfs_key_t * key);
+extern __u32 fsck_relocate_oid(reiserfs_key_t * key);
+extern void fsck_relocate_link_all (void);
+extern __u32 fsck_relocate_check (reiserfs_ih_t * ih, int isdir);
+
+/* semantic.c */
+
+/* return values for check_regular_file and check_semantic_tree */
+#define OK 0
+#define STAT_DATA_NOT_FOUND -1
+#define DIRECTORY_HAS_NO_ITEMS -2
+#define RELOCATED -3
+#define LOOP_FOUND -4
+
+extern void fsck_semantic (reiserfs_filsys_t *);
+extern void fsck_semantic_load_result (FILE *, reiserfs_filsys_t *);
+extern void fsck_semantic_check (void);
+extern int is_dot_dot (char * name, int namelen);
+extern int is_dot (char * name, int namelen);
+extern int not_a_directory (void * sd);
+extern int not_a_regfile (void * sd);
+extern void zero_nlink (reiserfs_ih_t * ih, void * sd);
+extern int fix_obviously_wrong_sd_mode (reiserfs_path_t * path);
+extern int wrong_st_blocks(const reiserfs_key_t * key, 
+			   __u32 * blocks, 
+			   __u32 sd_blocks, 
+			   __u16 mode, 
+			   int new_format);
+extern int wrong_st_size (const reiserfs_key_t * key, 
+			  unsigned long long max_file_size, 
+			  int blocksize,
+			  __u64 * size, 
+			  __u64 sd_size, 
+			  int type);
+
+extern int rebuild_semantic_pass (reiserfs_key_t * key, 
+				  const reiserfs_key_t * parent, 
+				  int is_dot_dot,
+				  reiserfs_ih_t * new_ih);
+
+extern void relocate_dir (reiserfs_ih_t * ih);
+
+extern int rebuild_check_regular_file (reiserfs_path_t * path, 
+				       void * sd,
+				       reiserfs_ih_t * new_ih);
+
+/* lost+found.c */
+extern void fsck_lost (reiserfs_filsys_t *);
+extern void fsck_lost_load_result (reiserfs_filsys_t *);
+
+/* objectid.c */
+typedef struct id_map {
+    void **index;
+    __u32 count, last_used;
+} id_map_t;
+
+extern void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs);
+extern void id_map_free(id_map_t *);
+extern int id_map_mark(id_map_t *map, __u32 id);
+extern id_map_t *id_map_init();
+extern __u32 id_map_alloc(id_map_t *map);
+extern int id_map_test(id_map_t *map, __u32 id);
+extern void fetch_objectid_map (struct id_map * map, 
+				reiserfs_filsys_t * fs);
+extern void reiserfs_objectid_map_save (FILE * fp, struct id_map * id_map);
+extern struct id_map * reiserfs_objectid_map_load (FILE * fp);
+
+/*  rollback.c */
+extern void fsck_rollback_fini ();
+
+extern void fsck_rollback_init (char * rollback_file, 
+				unsigned int *bloksize, FILE * log);
+
+extern int fsck_rollback_prep (char * rollback_file, FILE * log);
+
+extern void fsck_rollback (int fd_device, 
+			   int fd_journal_device, 
+			   FILE * log); 
+
+/* pass4.c */
+extern void fsck_cleanup (void);
+
+/* check_tree.c */
+extern void check_fs_tree (reiserfs_filsys_t *);
+extern void fsck_tree_clean_attr (reiserfs_filsys_t * fs);
+
+extern int fsck_leaf_check_neigh (reiserfs_filsys_t *fs, 
+				  reiserfs_bh_t * bh, 
+				  int i);
+
+extern int fsck_tree_delete(reiserfs_key_t * start_key, 
+			    saveitem_t ** save_here, 
+			    int skip_dir_items, 
+			    tree_modify_t func,
+			    void *data);
+
+
+/* ubitmap.c */
+extern int is_block_used (unsigned long block);
+extern void mark_block_used (unsigned long block, int check_hardware);
+extern void fsck_bitmap_mkuninsert (unsigned long block);
+extern int fsck_bitmap_isuninsert (unsigned long block);
+extern void fsck_bitmap_cluninsert (unsigned long block);
+extern int reiserfsck_new_blocknrs (reiserfs_filsys_t * fs,
+				    unsigned long * pblocknrs,
+				    unsigned long start_from,
+				    int amount_needed);
+
+extern int reiserfsck_free_block (reiserfs_filsys_t * fs, 
+				  unsigned long block);
+
+extern reiserfs_bh_t * reiserfsck_get_new_buffer (unsigned long start);
+
+/* ufile.c */
+#define FSCK_MAX_GAP(bs) \
+	(100 * REISERFS_ITEM_MAX(bs) / REISERFS_EXT_SIZE * bs)
+
+extern void fsck_file_relocate (reiserfs_key_t *key, 
+				int update_key);
+
+extern int reiserfsck_file_write (reiserfs_ih_t * ih, 
+				  char * item, 
+				  int was_in_tree);
+
+extern int are_file_items_correct (reiserfs_ih_t * sd_ih, 
+				   void * sd, 
+				   __u64 * size, 
+				   __u32 * blocks, 
+				   int mark_passed_items, 
+				   int * symlink);
+
+/* ustree.c*/
+typedef int (*path_func_t) (reiserfs_filsys_t *, 
+			    reiserfs_path_t *);
+
+extern void fsck_tree_trav (reiserfs_filsys_t *, 
+			    path_func_t, 
+			    path_func_t,
+			    int depth);
+enum fsck_stage {
+    FS_CHECK	= 0x0,
+    FS_PASS0	= 0x1,
+    FS_PASS1	= 0x2,
+    FS_PASS2	= 0x3,
+    FS_SEMANTIC = 0x4,
+    FS_LOST	= 0x5,
+    FS_CLEANUP  = 0x6,
+    FS_LAST
+};
+
+struct pass0_stat {
+    unsigned long dealt_with; /* number of blocks read during pass 0 */
+    unsigned long leaves; /* blocks looking like reiserfs leaves found */
+    unsigned long leaves_corrected;
+    unsigned long all_contents_removed;
+    unsigned long too_old_leaves; /* these are leaves which contains
+                                     direntries with different hash from the
+                                     one specified with -h */
+    unsigned long wrong_pointers; /* pointers in extent items pointing to
+                                     wrong area */
+    unsigned long pointed; /* pointers blocks of device pointed by all
+                              extent items */
+    
+    /* number of removed items. */
+    unsigned long long removed;
+};
+
+
+struct pass1_stat {
+    unsigned long leaves; /* leaves found in pass0 to build tree off */
+    unsigned long inserted_leaves; /* number of leaves inserted by pointers */
+    unsigned long pointed_leaves; /* pointers in extent items which pointed
+				     to leaves (zeroed) */
+    unsigned long uninsertable_leaves;
+    unsigned long non_unique_pointers; /* pointers to already pointed unformatted nodes */
+    unsigned long correct_pointers;
+    unsigned long allocable_blocks; /* allocable blocks before pass 1 starts */
+};
+
+
+struct pass2_stat {
+    unsigned long leaves; /* leaves inserted item by item */
+    unsigned long safe_non_unique_pointers; /* these are just the same pointers */
+    unsigned long relocated;
+    unsigned long shared_objectids;
+    unsigned long rewritten;
+};
+
+
+struct semantic_stat {
+    unsigned long regular_files;
+    unsigned long directories;
+    unsigned long symlinks;
+    unsigned long broken_files;
+    unsigned long others;
+    unsigned long fixed_sizes;
+    unsigned long oid_sharing;
+    unsigned long oid_sharing_dirs_relocated;
+    unsigned long oid_sharing_files_relocated;
+    unsigned long deleted_entries;
+    unsigned long added_sd;
+    unsigned long empty_lost_dirs;
+    unsigned long lost_found;
+    unsigned long lost_found_files;
+    unsigned long lost_found_dirs;
+};
+
+struct pass_4_stat {
+    unsigned long deleted_items;
+};
+
+
+struct rebuild_info {
+    struct {
+	struct pass0_stat pass0;
+	struct pass1_stat pass1;
+	struct pass2_stat pass2;
+	struct semantic_stat semantic;
+	struct pass_4_stat pass4;
+    } pass_u;
+
+    /* bitmaps */
+    reiserfs_bitmap_t * source_bitmap;
+    reiserfs_bitmap_t * new_bitmap;
+    reiserfs_bitmap_t * allocable_bitmap;
+    reiserfs_bitmap_t * uninsertables;
+
+    char * bitmap_file_name;
+    /*char * new_bitmap_file_name;*/
+    char * passes_dump_file_name; /* after pass 0, 1 or 2 reiserfsck can store
+                                     data with which it will be able to start
+                                     from the point it stopped last time at */
+
+    unsigned short mode;
+    unsigned long options;
+
+    /* rollback file */
+    char * rollback_file;
+  
+    /* hash hits stat */
+    int hash_amount;
+    unsigned long * hash_hits;
+    char * defined_hash;
+
+#define USED_BLOCKS 1
+#define EXTERN_BITMAP 2
+#define ALL_BLOCKS 3
+    int scan_area;
+    int use_journal_area;
+    int test;
+};
+
+
+struct check_info {
+    unsigned long bad_nodes;
+    unsigned long fatal_corruptions;
+    unsigned long fixable_corruptions;
+//    unsigned long badblocks_corruptions;
+    unsigned long leaves;
+    unsigned long internals;
+    unsigned long dirs;
+    unsigned long files;
+    unsigned long safe;
+    unsigned long unfm_pointers;
+    unsigned long zero_unfm_pointers;
+    reiserfs_bitmap_t * deallocate_bitmap;
+};
+
+
+struct fsck_data {
+    unsigned short mode; /* check, rebuild, etc*/
+    unsigned long options;
+    unsigned long mounted;
+
+    struct rebuild_info rebuild;
+    struct check_info check;
+
+    char * journal_dev_name; 
+    /* log file name and handle */
+    char * log_file_name;
+    FILE * log;
+
+    /* this is a file where reiserfsck will explain what it is doing. This is
+       usually stderr. But when -g is specified - reiserfsck runs in the
+       background and append progress information into 'fsck.run' */
+    FILE * progress;
+
+    /* objectid maps */
+    id_map_t * proper_id_map;
+    id_map_t * semantic_id_map; /* this objectid map is used to
+				   cure objectid sharing problem */
+};
+
+
+#define fsck_data(fs) ((struct fsck_data *)((fs)->fs_vp))
+#define pass_0_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass0))
+#define pass_1_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass1))
+#define pass_2_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass2))
+#define sem_pass_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.semantic))
+#define pass_4_stat(fs) (&(fsck_data(fs)->rebuild.pass_u.pass4))
+
+#define fsck_check_stat(fs) (&(fsck_data(fs)->check))
+
+
+#define proper_id_map(s) fsck_data(s)->proper_id_map
+#define semantic_id_map(s) fsck_data(s)->semantic_id_map
+
+#define fsck_source_bitmap(fs) fsck_data(fs)->rebuild.source_bitmap
+#define fsck_new_bitmap(fs) fsck_data(fs)->rebuild.new_bitmap
+#define fsck_allocable_bitmap(fs) fsck_data(fs)->rebuild.allocable_bitmap
+#define fsck_uninsertables(fs) fsck_data(fs)->rebuild.uninsertables
+
+#define fsck_deallocate_bitmap(fs) fsck_data(fs)->check.deallocate_bitmap
+
+#define fsck_interactive(fs) (fsck_data(fs)->options & OPT_INTERACTIVE)
+//#define fsck_fix_fixable(fs) (fsck_data(fs)->options & OPT_FIX_FIXABLE)
+
+#define fsck_run_one_step(fs) (fsck_data(fs)->options & OPT_SAVE_PASSES_DUMP)
+
+#define fsck_save_rollback(fs) (fsck_data(fs)->options & OPT_SAVE_ROLLBACK)
+
+/* change unknown modes (corrupted) to mode of regular files, fix file
+   sizes which are bigger than a real file size, relocate files with
+   shared objectids (this slows fsck down (when there are too many
+   files sharing the same objectid), it will also remove other names
+   pointing to this file */
+#define fsck_adjust_file_size(fs) (fsck_data(fs)->options & OPT_ADJUST_FILE_SIZE)
+#define fsck_quiet(fs)	(fsck_data(fs)->options & OPT_QUIET)
+#define fsck_silent(fs)	(fsck_data(fs)->options & OPT_SILENT)
+#define fsck_in_background(fs) (fsck_data(fs)->options & OPT_BACKGROUND)
+#define fsck_hash_defined(fs) (fsck_data(fs)->options & OPT_HASH_DEFINED)
+#define fsck_skip_journal(fs) (fsck_data(fs)->options & OPT_SKIP_JOURNAL)
+#define fsck_yes_all(fs) (fsck_data(fs)->options & OPT_YES)
+
+
+#define fsck_mode(fs) (fsck_data(fs)->mode)
+#define fsck_log_file(fs) (fsck_data(fs)->log)
+#define fsck_progress_file(fs) ((fs && fsck_data(fs)->progress) ? fsck_data(fs)->progress : stderr)
+
+/* name of file where we store information for continuing */
+#define state_dump_file(fs) fsck_data(fs)->rebuild.passes_dump_file_name
+
+/* name of file where we store rollback data */
+#define state_rollback_file(fs) fsck_data(fs)->rebuild.rollback_file
+
+int fsck_info_ask (reiserfs_filsys_t * fs, 
+		   char * q, char * a, 
+		   int default_answer);
+
+void fsck_stage_report (int, reiserfs_filsys_t *);
+
+/*pass1: rebuild super block*/
+void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * data);
+
+
+/* special type for symlink not conflicting to any of item types. */
+#define TYPE_SYMLINK	4
+
+
+#define fsck_log(fmt, list...) \
+{\
+if (!fsck_silent (fs))\
+    reiserfs_warning (fsck_log_file (fs), fmt, ## list);\
+}
+
+#define fsck_progress(fmt, list...) \
+{\
+reiserfs_warning (fsck_progress_file(fs), fmt, ## list);\
+fflush (fsck_progress_file(fs));\
+}
+
+#define FATAL	1
+#define FIXABLE 2
+
+enum entry_type {
+    ET_NAME		= 0x0,
+    ET_DOT		= 0x1,
+    ET_DOT_DOT		= 0x2,
+    ET_LOST_FOUND	= 0x3,
+    ET_LAST
+};
+
+#define fsck_exit(fmt, list...) \
+{\
+reiserfs_warning (fsck_progress_file(fs), fmt, ## list);\
+exit (EXIT_USER);\
+}
+
+#define one_more_corruption(fs,kind)			\
+({							\
+    if (kind == FATAL)					\
+	fsck_check_stat (fs)->fatal_corruptions++;	\
+    else if (kind == FIXABLE)				\
+	fsck_check_stat (fs)->fixable_corruptions++;	\
+})
+
+#define one_less_corruption(fs,kind)			\
+({							\
+    if (kind == FATAL)					\
+	fsck_check_stat (fs)->fatal_corruptions--;	\
+    else if (kind == FIXABLE)				\
+	fsck_check_stat (fs)->fixable_corruptions--;	\
+})
diff --git a/fsck/reiserfsck.8 b/utils/fsck/fsck.reiserfs.8
similarity index 73%
rename from fsck/reiserfsck.8
rename to utils/fsck/fsck.reiserfs.8
index 43d4669..af866b4 100644
--- a/fsck/reiserfsck.8
+++ b/utils/fsck/fsck.reiserfs.8
@@ -1,11 +1,11 @@
 .\" -*- nroff -*-
 .\" Copyright 1996-2004 Hans Reiser.
 .\" 
-.TH REISERFSCK 8 "February 2004" "Reiserfsprogs-3.6.19"
+.TH fsck.reiserfs 8 "February 2004" "Reiserfsprogs-3.6.19"
 .SH NAME
-reiserfsck \- The checking tool for the ReiserFS filesystem.
+fsck.reiserfs \- The checking tool for the ReiserFS filesystem.
 .SH SYNOPSIS
-.B reiserfsck 
+.B fsck.reiserfs 
 [ \fB-afprVy\fR ]
 [ \fB--rebuild-sb\fR | \fB--check\fR | \fB--fix-fixable\fR
 | \fB--rebuild-tree\fR | \fB--clean-attributes\fR ]
@@ -24,7 +24,7 @@
 [ \fB--no-journal-available\fR ]
 .I device
 .SH DESCRIPTION
-\fBReiserfsck\fR searches for a Reiserfs filesystem on a device, replays 
+\fBfsck.reiserfs\fR searches for a Reiserfs filesystem on a device, replays 
 any necessary transactions, and either checks or repairs the file system.
 .TP
 .I device
@@ -58,10 +58,10 @@
 .B --rebuild-tree
 This option rebuilds the entire filesystem tree using leaf nodes 
 found on the device.  Normally you only need this option if the 
-\fBreiserfsck --check\fR reports "Running with \fB--rebuild-tree\fR
+\fBfsck.reiserfs --check\fR reports "Running with \fB--rebuild-tree\fR
 is required". You are strongly encouraged to make a backup copy 
 of the whole partition before attempting the \fB--rebuild-tree\fR 
-option. Once \fBreiserfsck --rebuild-tree\fR is started it must
+option. Once \fBfsck.reiserfs --rebuild-tree\fR is started it must
 finish its work (and you should not interrupt it), otherwise the
 filesystem will be left in the unmountable state to avoid subsequent
 data corruptions.
@@ -81,10 +81,10 @@
 option \fB--no-journal-available\fR).
 .TP 
 .\" .B --interactive, -i
-.\" This makes \fBreiserfsck\fR to stop after each pass completed.
+.\" This makes \fBfsck.reiserfs\fR to stop after each pass completed.
 .\" .TP
 .B --adjust-size, -z
-This option causes \fBreiserfsck\fR to correct file sizes that
+This option causes \fBfsck.reiserfs\fR to correct file sizes that
 are larger than the offset of the last discovered byte.  This
 implies that holes at the end of a file will be removed.  File
 sizes that are smaller than the offset of the last discovered
@@ -94,33 +94,33 @@
 This option sets the badblock list to be the list of blocks specified in 
 the given `file`. The filesystem badblock list is cleared before the new 
 list is added. It can be used with \fB--fix-fixable\fR to fix the list of 
-badblocks (see \fBdebugreiserfs -B\fR). If the device has bad blocks, every
+badblocks (see \fBdebugfs.reiserfs -B\fR). If the device has bad blocks, every
 time it must be given with the \fB--rebuild-tree\fR option.
 .TP
 \fB--logfile \fIfile\fR, \fB-l \fI file\fR
-This option causes \fBreiserfsck\fR to report any corruption it finds 
+This option causes \fBfsck.reiserfs\fR to report any corruption it finds 
 to the specified log file rather than to stderr.
 .TP
 .B --nolog, -n
-This option prevents \fBreiserfsck\fR from reporting any kinds of corruption.
+This option prevents \fBfsck.reiserfs\fR from reporting any kinds of corruption.
 .TP
 .B --quiet, -q
-This option prevents \fBreiserfsck\fR from reporting its rate of progress.
+This option prevents \fBfsck.reiserfs\fR from reporting its rate of progress.
 .TP
 .B --yes, -y
-This option inhibits \fBreiserfsck\fR from asking you for confirmation after
+This option inhibits \fBfsck.reiserfs\fR from asking you for confirmation after
 telling you what it is going to do. It will assuem you confirm. For safety, 
 it does not work with the \fB--rebuild-tree\fR option.
 .TP
 \fB-a\fR, \fB-p\fR
 These options are usually passed by fsck -A during the automatic checking 
-of those partitions listed in /etc/fstab. These options cause \fBreiserfsck\fR 
+of those partitions listed in /etc/fstab. These options cause \fBfsck.reiserfs\fR 
 to print some information about the specified filesystem, to check if error 
 flags in the superblock are set and to do some light-weight checks. If these 
 checks reveal a corruption or the flag indicating a (possibly fixable) 
-corruption is found set in the superblock, then \fBreiserfsck\fR switches 
+corruption is found set in the superblock, then \fBfsck.reiserfs\fR switches 
 to the fix-fixable mode. If the flag indicating a fatal corruption is found 
-set in the superblock, then \fBreiserfsck\fR finishes with an error.
+set in the superblock, then \fBfsck.reiserfs\fR finishes with an error.
 .TP
 .B -V
 This option prints the reiserfsprogs version and then exit.
@@ -133,40 +133,40 @@
 OPTIONS.
 .TP
 .B \fB\--no-journal-available\fR
-This option allows \fBreiserfsck\fR to proceed when the journal device is 
+This option allows \fBfsck.reiserfs\fR to proceed when the journal device is 
 not available. This option has no effect when the journal is located on 
-the main data device. NOTE: after this operation you must use \fBreiserfstune\fR 
+the main data device. NOTE: after this operation you must use \fBtunefs.reiserfs\fR 
 to specify a new journal device.
 .TP
 .B --scan-whole-partition, -S
 This option causes \fB--rebuild-tree\fR to scan the whole partition but not only 
 the used space on the partition.
-.SH AN EXAMPLE OF USING reiserfsck
+.SH AN EXAMPLE OF USING fsck.reiserfs
 1. You think something may be wrong with a reiserfs partition on /dev/hda1 
 or you would just like to perform a periodic disk check.
 
-2. Run \fBreiserfsck --check --logfile check.log /dev/hda1\fR. If \fBreiserfsck 
+2. Run \fBfsck.reiserfs --check --logfile check.log /dev/hda1\fR. If \fBfsck.reiserfs 
 --check\fR exits with status 0 it means no errors were discovered. 
 
-3. If \fBreiserfsck --check\fR exits with status 1 (and reports about fixable 
-corruptions) it means that you should run \fBreiserfsck --fix-fixable --logfile 
+3. If \fBfsck.reiserfs --check\fR exits with status 1 (and reports about fixable 
+corruptions) it means that you should run \fBfsck.reiserfs --fix-fixable --logfile 
 fixable.log /dev/hda1\fR.
 
-4. If \fBreiserfsck --check\fR exits with status 2 (and reports about fatal 
-corruptions) it means that you need to run \fBreiserfsck --rebuild-tree\fR.  
-If \fBreiserfsck --check\fR fails in some way you should also run \fBreiserfsck 
+4. If \fBfsck.reiserfs --check\fR exits with status 2 (and reports about fatal 
+corruptions) it means that you need to run \fBfsck.reiserfs --rebuild-tree\fR.  
+If \fBfsck.reiserfs --check\fR fails in some way you should also run \fBfsck.reiserfs 
 --rebuild-tree\fR, but we also encourage you to submit this as a bug report.
 
-5. Before running \fBreiserfsck --rebuild-tree\fR, please make a backup of 
-the whole partition before proceeding. Then run \fBreiserfsck --rebuild-tree 
+5. Before running \fBfsck.reiserfs --rebuild-tree\fR, please make a backup of 
+the whole partition before proceeding. Then run \fBfsck.reiserfs --rebuild-tree 
 --logfile rebuild.log /dev/hda1\fR.
 
-6. If the \fBreiserfsck --rebuild-tree\fR step fails or does not recover what 
+6. If the \fBfsck.reiserfs --rebuild-tree\fR step fails or does not recover what 
 you expected, please submit this as a bug report. Try to provide as much 
 information as possible including your platform and Linux kernel version. We 
 will try to help solve the problem.
 .SH EXIT CODES
-\fBreiserfsck\fR uses the following exit codes:
+\fBfsck.reiserfs\fR uses the following exit codes:
 .br
 \   \fI0\fR \-\ No errors.
 .br
@@ -176,18 +176,18 @@
 .br
 \   \fI4\fR \-\ File system fatal errors left uncorrected,
 .br
-\	  \fBreiserfsck --rebuild-tree\fR needs to be launched.
+\	  \fBfsck.reiserfs --rebuild-tree\fR needs to be launched.
 .br
 \   \fI6\fR \-\ File system fixable errors left uncorrected,
 .br
-\	  \fBreiserfsck --fix-fixable\fR needs to be launched.
+\	  \fBfsck.reiserfs --fix-fixable\fR needs to be launched.
 .br
 \   \fI8\fR \-\ Operational error.
 .br
 \   \fI16\fR \-\ Usage or syntax error.
 .br
 .SH AUTHOR
-This version of \fBreiserfsck\fR has been written by Vitaly Fertman <vitaly@namesys.com>.
+This version of \fBfsck.reiserfs\fR has been written by Vitaly Fertman <vitaly@namesys.com>.
 .SH BUGS
 Please report bugs to the ReiserFS developers <reiserfs-dev@namesys.com>, providing 
 as much information as possible--your hardware, kernel, patches, settings, all printed 
@@ -195,7 +195,7 @@
 .SH TODO
 Faster recovering, signal handling.
 .SH SEE ALSO
-.BR mkreiserfs (8),
-.BR reiserfstune (8)
-.BR resize_reiserfs (8),
-.BR debugreiserfs (8),
+.BR mkfs.reiserfs (8),
+.BR tunefs.reiserfs (8)
+.BR resizefs.reiserfs (8),
+.BR debugfs.reiserfs (8),
diff --git a/utils/fsck/info.c b/utils/fsck/info.c
new file mode 100644
index 0000000..fb2307f
--- /dev/null
+++ b/utils/fsck/info.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "util/print.h"
+#include "assert.h"
+
+void fsck_info_checkmem (void) {
+    fprintf(stderr, 
+	"\nThe problem has occurred looks like a hardware problem (perhaps\n"
+        "memory). Send us the bug report only if the second run dies at\n"
+	"the same place with the same block number.\n");
+}
+
+int fsck_info_ask(reiserfs_filsys_t * fs, char * q, 
+		  char * a, int default_answer)
+{
+    if (!fsck_interactive (fs))
+	return default_answer;
+    
+    return util_user_confirmed (fsck_progress_file (fs), q, a);
+}
+
+void fsck_stage_report (int pass, reiserfs_filsys_t * fs) {
+    if (pass == FS_CHECK) {
+	fsck_progress ("There are on the filesystem:\n"
+		       "\tLeaves %lu\n\tInternal nodes %lu\n"
+		       "\tDirectories %lu\n\tOther files %lu\n"
+		       "\tData block pointers %lu (%lu of them are zero)\n"
+		       "\tSafe links %lu\n",
+		       fsck_check_stat (fs)->leaves,
+		       fsck_check_stat (fs)->internals,
+		       fsck_check_stat (fs)->dirs,
+		       fsck_check_stat (fs)->files,
+		       fsck_check_stat (fs)->unfm_pointers,
+		       fsck_check_stat (fs)->zero_unfm_pointers,
+		       fsck_check_stat (fs)->safe);
+	
+	return;
+    }	
+
+    {
+	if (pass == FS_PASS0)
+		fsck_progress("\tSelected hash: %s\n", 
+			      reiserfs_hash_name(reiserfs_hash_code(fs->hash)));
+	
+	/* what has been done on pass 0 */
+	if (pass_0_stat(fs)->dealt_with)
+		fsck_progress ("\tRead formatted blocks: %lu\n",
+			       pass_0_stat(fs)->dealt_with);
+	
+	if (pass_0_stat(fs)->leaves)
+		fsck_progress ("\tRead leaves (corrected/empty/wrong hash): "
+			       "%lu (%lu/%lu/%lu)\n", 
+			       pass_0_stat(fs)->leaves, 
+			       pass_0_stat(fs)->leaves_corrected,
+			       pass_0_stat(fs)->all_contents_removed,
+			       pass_0_stat(fs)->too_old_leaves);
+	
+	if (pass_0_stat(fs)->wrong_pointers)
+		fsck_progress ("\tWrong indirect pointers (zeroed): %lu\n",
+			       pass_0_stat(fs)->wrong_pointers);
+    }
+    
+    {
+	/* what has been done on pass 1 */
+	if (pass_1_stat(fs)->leaves)
+		fsck_progress ("\tRead leaves (not inserted): %lu (%lu)\n", 
+			       pass_1_stat(fs)->leaves,
+			       pass_1_stat(fs)->uninsertable_leaves);
+	
+	assert(pass_1_stat(fs)->leaves == pass_1_stat(fs)->inserted_leaves + 
+	       pass_1_stat(fs)->uninsertable_leaves);
+	
+	if (pass_1_stat(fs)->pointed_leaves || 
+	    pass_1_stat(fs)->non_unique_pointers)
+	{
+		fsck_progress ("\tDouble indirect pointers to leaves/to "
+			       "unformatted (zeroed): %lu/%lu\n",
+			       pass_1_stat(fs)->pointed_leaves,
+			       pass_1_stat(fs)->non_unique_pointers);
+	}
+    }
+    
+    {
+	/* what has been done on pass 2 */
+	
+	if (pass_2_stat(fs)->leaves)
+		fsck_progress ("\tLeaves inserted item by item: %lu\n", 
+			       pass_2_stat(fs)->leaves);
+	
+	/* FIXME: oid_sharing is the same */
+	if (pass_2_stat(fs)->relocated && pass == FS_PASS2)
+		fsck_progress ("\tFiles relocated because of key "
+			       "conflicts with a directory: %lu\n", 
+			       pass_2_stat(fs)->relocated);
+	
+	if (pass_2_stat(fs)->rewritten)
+		fsck_progress ("\tFiles rewritten: %lu\n", 
+			       pass_2_stat(fs)->rewritten);
+    }
+    
+    {
+	/* what has been done on the semantic pass */
+	
+	if (sem_pass_stat(fs)->regular_files || sem_pass_stat(fs)->directories ||
+	    sem_pass_stat(fs)->symlinks || sem_pass_stat(fs)->others)
+	{
+		fsck_progress ("\tFound files/dirs/symlinks/others: "
+			       "%lu/%lu/%lu/%lu\n", 
+			       sem_pass_stat(fs)->regular_files,
+			       sem_pass_stat(fs)->directories,
+			       sem_pass_stat(fs)->symlinks,
+			       sem_pass_stat(fs)->others);
+	}
+
+	if (sem_pass_stat(fs)->lost_found)
+		fsck_progress ("\tLinked to /lost+found (files/dirs): "
+			       "%lu (%lu/%lu)\n",
+			       sem_pass_stat(fs)->lost_found,
+			       sem_pass_stat(fs)->lost_found_files,
+			       sem_pass_stat(fs)->lost_found_dirs);
+
+	if (sem_pass_stat(fs)->broken_files)
+		fsck_progress ("\tBroken file bodies: %lu\n",
+			       sem_pass_stat(fs)->broken_files);
+	
+	if (sem_pass_stat(fs)->fixed_sizes)
+		fsck_progress ("\tFiles with fixed size: %lu\n", 
+			       sem_pass_stat(fs)->fixed_sizes);
+	
+	if (sem_pass_stat(fs)->added_sd)
+		fsck_progress ("\tInserted missed StatDatas: %lu\n",
+			       sem_pass_stat(fs)->added_sd);
+
+	if (sem_pass_stat(fs)->empty_lost_dirs)
+		fsck_progress ("\tEmpty lost dirs (removed): %lu\n",
+			       sem_pass_stat(fs)->empty_lost_dirs);
+
+	if (sem_pass_stat(fs)->deleted_entries)
+		fsck_progress ("\tNames pointing to nowhere (removed): %lu\n", 
+			       sem_pass_stat(fs)->deleted_entries);
+	
+	if (sem_pass_stat(fs)->oid_sharing) {
+		fsck_progress ("\tObjects having used objectids (files, dirs): "
+			       "%lu (%lu/%lu)\n", 
+			       sem_pass_stat(fs)->oid_sharing,
+			       sem_pass_stat(fs)->oid_sharing_files_relocated,
+			       sem_pass_stat(fs)->oid_sharing_dirs_relocated);
+
+		assert(pass_2_stat(fs)->relocated == 
+		       sem_pass_stat(fs)->oid_sharing);
+	}
+    }
+    
+    if (pass != FS_CLEANUP && pass != FS_PASS1) {
+	    if (proper_id_map(fs)->count)
+		    fsck_progress ("\tObjectids found: %lu\n", 
+				   proper_id_map(fs)->count);
+    } else {
+	/* what has been done on the semantic pass */
+	if (pass_4_stat(fs)->deleted_items)
+	    fsck_progress ("\tDeleted unreachable items: %lu\n",
+			   pass_4_stat(fs)->deleted_items);
+    }
+
+    memset (&fsck_data (fs)->rebuild.pass_u, 0, 
+	    sizeof (fsck_data (fs)->rebuild.pass_u));
+}
+
diff --git a/utils/fsck/leaf.c b/utils/fsck/leaf.c
new file mode 100644
index 0000000..44e7ea9
--- /dev/null
+++ b/utils/fsck/leaf.c
@@ -0,0 +1,357 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ *
+ * The code to check the leaf structure.
+ * Leaf is not supposed to be in the tree, it is rather a single one.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/unaligned.h"
+#include "misc/malloc.h"
+#include <assert.h>
+
+/* 1 if some of fields in the block head of bh look bad */
+int fsck_leaf_check_header(reiserfs_filsys_t * fs, reiserfs_bh_t * bh) {
+    reiserfs_node_head_t * blkh;
+    int free_space, counted;
+
+    blkh = NODE_HEAD (bh);
+    
+    if (!reiserfs_leaf_head(bh)) {
+	/* We should not get here on rebuild. */
+	fsck_log ("block %lu: The block does not look like a leaf.\n", 
+		  bh->b_blocknr);
+	
+        one_more_corruption (fs, FATAL);
+	return 1;
+    }
+
+    if (reiserfs_nh_get_items (blkh) == 0)
+	return 0;
+    
+    counted = reiserfs_leaf_count_items(bh);
+
+    if (counted < reiserfs_nh_get_items (blkh)) {
+	fsck_log ("block %lu: The number of items (%lu) is incorrect, "
+		  "should be (%lu)", bh->b_blocknr, 
+		  reiserfs_nh_get_items(blkh), counted);
+	
+	if (fsck_mode(fs) == FSCK_REBUILD) {
+	    reiserfs_nh_set_items(blkh, counted);	    
+	    fsck_log (" - corrected\n");
+	    reiserfs_buffer_mkdirty (bh);
+	} else {
+	    fsck_log ("\n");
+	    one_more_corruption (fs, FATAL);
+	    return 1;
+	}
+    }
+    
+    free_space = reiserfs_leaf_free_count(bh);
+    if (reiserfs_nh_get_free (blkh) != free_space) {
+	fsck_log ("block %lu: The free space (%lu) is incorrect, should "
+		  "be (%lu)", bh->b_blocknr, reiserfs_nh_get_free (blkh), 
+		  free_space);
+	
+	if (fsck_mode(fs) != FSCK_CHECK && fsck_mode(fs) != FSCK_AUTO) {
+	    reiserfs_nh_set_free (blkh, free_space);	    
+	    fsck_log (" - corrected\n");
+	    reiserfs_buffer_mkdirty (bh);
+	} else {
+	    fsck_log ("\n");
+	    one_more_corruption (fs, FIXABLE);
+	    return 1;
+	}
+    }
+
+    return 0;
+}
+
+static int is_bad_sd (reiserfs_ih_t * ih, char * item)
+{
+    if (reiserfs_key_get_off1 (&ih->ih_key) || 
+	reiserfs_key_get_uni (&ih->ih_key)) 
+    {
+	fsck_log ("vpf-10610: StatData item %k has non "
+		  "zero offset found.\n", &ih->ih_key);
+	return 1;
+    }
+
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1) {
+	/* looks like old stat data */
+	if (reiserfs_ih_get_format (ih) != KEY_FORMAT_1) {
+	    fsck_log ("vpf-10620: StatData item %k has wrong "
+		      "format.\n", &ih->ih_key);
+	}
+    }
+
+    return 0;
+}
+
+
+static int is_bad_directory (reiserfs_ih_t * ih, 
+			     char * item, int dev,
+			     int blocksize)
+{
+    int i;
+    char * name;
+    int namelen, entrylen;
+    reiserfs_deh_t * deh = (reiserfs_deh_t *)item;
+    __u32 prev_offset = 0;
+    __u16 prev_location = reiserfs_ih_get_len (ih);
+    int min_entry_size = 1;/* we have no way to understand whether the
+                              filesystem wes created in 3.6 format or
+                              converted to it. So, we assume that minimal 
+			      name length is 1 */
+
+    if (reiserfs_ih_get_len (ih) / (REISERFS_DEH_SIZE + min_entry_size) < 
+	reiserfs_ih_get_entries (ih))
+    {
+	/* entry count is too big */
+	return 1;
+    }
+    
+    for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	entrylen = reiserfs_direntry_entry_len(ih, deh, i);
+	if (entrylen > REISERFS_NAME_MAX)
+	    return 1;
+	
+	if (reiserfs_deh_get_off (deh) <= prev_offset)
+	    return 1;
+	
+	prev_offset = reiserfs_deh_get_off (deh);
+
+	if (reiserfs_deh_get_loc(deh) + entrylen != prev_location)
+	    return 1;
+	
+	prev_location = reiserfs_deh_get_loc (deh);
+
+	namelen = reiserfs_direntry_name_len (ih, deh, i);
+	name = reiserfs_deh_name (deh, i);
+	if (!reiserfs_hash_correct (&fs->hash, name, namelen, 
+				    reiserfs_deh_get_off (deh)))
+	{
+	    return 1;
+	}
+    }
+    return 0;
+}
+
+
+/* change incorrect block adresses by 0. 
+   Do not consider such item as incorrect */
+static int is_bad_extent (reiserfs_ih_t * ih, 
+			  char * item, int dev, 
+			  int blocksize)
+{
+    unsigned long blocks;
+    unsigned int i;
+    int bad = 0;
+
+    if (reiserfs_ih_get_len(ih) % REISERFS_EXT_SIZE) {
+	fsck_log ("is_bad_extent: extent item of %H of invalid length\n", ih);
+	return 1;
+    }
+
+    blocks = reiserfs_sb_get_blocks (fs->fs_ondisk_sb);
+  
+    for (i = 0; i < reiserfs_ext_count (ih); i ++) {
+	__u32 * ind = (__u32 *)item;
+
+	if (d32_get (ind, i) >= blocks) {
+	    bad ++;
+	    fsck_log ("is_bad_extent: %d-th pointer of item %H "
+		      "looks bad (%lu)\n", i, ih, d32_get (ind, i));
+	    continue;
+	}
+    }
+    return bad;
+}
+
+
+/* this is used by check.c: fsck_leaf_check */
+int fsck_leaf_item_check (reiserfs_bh_t * bh, 
+			  reiserfs_ih_t * ih, 
+			  char * item)
+{
+    int blocksize, dev;
+
+    blocksize = bh->b_size;
+    dev = bh->b_dev;
+
+    // FIXME: refuse transparently bad items
+    if (reiserfs_key_get_did (&ih->ih_key) == 
+	reiserfs_key_get_oid (&ih->ih_key))
+    {
+	return 1;
+    }
+    
+    if (!reiserfs_key_get_did (&ih->ih_key) || 
+	!reiserfs_key_get_oid (&ih->ih_key))
+    {
+	return 1;
+    }
+
+    if (reiserfs_ih_stat(ih))
+	return is_bad_sd (ih, item);
+
+    if (reiserfs_ih_dir (ih))
+	return is_bad_directory (ih, item, dev, blocksize);
+
+    if (reiserfs_ih_ext (ih))
+	return is_bad_extent (ih, item, dev, blocksize);
+
+    if (reiserfs_ih_direct (ih))
+	return 0;
+
+    return 1;
+}
+
+/* 1 if i-th and (i-1)-th items can not be neighbors in a leaf */
+int fsck_leaf_check_neigh (reiserfs_filsys_t * fs, reiserfs_bh_t * bh, int pos) {
+    reiserfs_ih_t * ih;
+
+    ih = reiserfs_ih_at (bh, pos);
+
+    if (reiserfs_key_comp (&((ih - 1)->ih_key), &ih->ih_key) != -1) {
+	if (fsck_mode (fs) != FSCK_REBUILD)
+	    one_more_corruption (fs, FATAL);	
+	return 1;
+    }
+
+    if (reiserfs_ih_stat (ih))
+	/* left item must be of another object */
+	if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key) != -1) {
+	    if (fsck_mode (fs) != FSCK_REBUILD)
+		one_more_corruption (fs, FATAL);	
+	    return 1;
+	}
+
+    if (reiserfs_key_get_oid (&ih->ih_key) == REISERFS_BAD_OID) {
+	/* BAD BLOCK LIST SUPPORT. */
+	if (reiserfs_key_get_did(&ih->ih_key) == REISERFS_BAD_DID && 
+	    reiserfs_ih_ext(ih) && 
+	    reiserfs_key_comp2(&((ih - 1)->ih_key), &ih->ih_key))
+	{
+		return 0;
+	}
+    } else {
+	/* Safe link support. */
+	if (reiserfs_key_get_did (&ih->ih_key) == (__u32)-1) {
+	    if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key) == 0) {
+		if (reiserfs_ih_ext (ih - 1) && reiserfs_ih_direct(ih))
+		    return 0; /* safe link */
+		/* they do not look like safe links */
+	    } else {
+		if (reiserfs_ih_ext (ih) || reiserfs_ih_direct(ih))
+		    return 0; /* safe link */
+		/* it does not look like safe link */
+	    }
+	}
+    }
+    
+    if (reiserfs_ih_direct(ih)) {
+	/* left item must be extent or stat data item of the same file */
+	if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key)) {
+	    if (fsck_mode (fs) != FSCK_REBUILD)
+		one_more_corruption (fs, FATAL);
+	    
+	    return 1;
+	}
+
+	if (!((reiserfs_ih_stat (ih - 1) && 
+	       reiserfs_key_get_off (&ih->ih_key) == 1) ||
+	      (reiserfs_ih_ext (ih - 1) && 
+	       reiserfs_key_get_off (&(ih - 1)->ih_key) + 
+	       reiserfs_leaf_ibytes (ih-1, bh->b_size) == 
+	       reiserfs_key_get_off (&ih->ih_key))))
+	{
+	    if (fsck_mode (fs) != FSCK_REBUILD)
+		one_more_corruption (fs, FATAL);
+	    
+	    return 1;
+	}
+    }
+
+    if (reiserfs_ih_ext (ih) || reiserfs_ih_dir (ih)) {
+	/* left item must be stat data of the same object */
+	if (reiserfs_key_comp2 (&((ih - 1)->ih_key), &ih->ih_key) ||
+	    !reiserfs_ih_stat (ih - 1)) {
+	    if (fsck_mode (fs) != FSCK_REBUILD)
+		one_more_corruption (fs, FATAL);
+	    return 1;
+	}
+    }
+
+    return 0;
+}
+
+int fsck_leaf_check (reiserfs_bh_t * bh) {
+    int i;
+    reiserfs_ih_t * ih;
+    int bad = 0;
+
+    assert (reiserfs_leaf_head (bh));
+
+    for (i = 0, ih = reiserfs_ih_at (bh,  0); 
+	 i < reiserfs_node_items (bh); i ++, ih ++) 
+    {
+	if (fsck_leaf_item_check (bh, ih, reiserfs_item_by_ih (bh, ih))) {
+	    fsck_log ("%s: block %lu, item %d: The corrupted item "
+		      "found (%H)\n", __FUNCTION__, bh->b_blocknr, i, ih);
+	    bad = 1;
+	    continue;
+	}
+
+	if (i && fsck_leaf_check_neigh (fs, bh, i)) {
+	    fsck_log ("%s: block %lu items %d and %d: Wrong order of "
+		      "items:\n\t%H\n\t%H\n", __FUNCTION__, bh->b_blocknr,
+		      i - 1, i, ih - 1, ih);
+	    bad = 1;
+	}
+    }
+
+    return bad;
+}
+
+/* this item is in tree. All unformatted pointer are correct. Do not
+   check them */
+void fsck_item_save(reiserfs_path_t * path, saveitem_t ** head) {
+    reiserfs_ih_t * ih = REISERFS_PATH_IH(path);
+    saveitem_t *si, *cur;
+
+    si = misc_getmem (sizeof (*si));
+    si->si_dnm_data = misc_getmem (reiserfs_ih_get_len(ih));
+    
+    /*si->si_blocknr = blocknr;*/
+    memcpy (&(si->si_ih), ih, REISERFS_IH_SIZE);
+    memcpy (si->si_dnm_data, REISERFS_PATH_ITEM(path), reiserfs_ih_get_len(ih));
+
+    if (*head == 0) {
+	*head = si;
+    } else {
+	cur = *head;
+	while (cur->si_next)
+	    cur = cur->si_next;
+	cur->si_next = si;
+    }
+    
+    return;
+}
+
+saveitem_t * fsck_item_free(saveitem_t * si) {
+    saveitem_t * tmp = si->si_next;
+    
+    misc_freemem (si->si_dnm_data);
+    misc_freemem (si);
+    
+    return tmp;
+}
+
+
diff --git a/utils/fsck/lost+found.c b/utils/fsck/lost+found.c
new file mode 100644
index 0000000..2f87595
--- /dev/null
+++ b/utils/fsck/lost+found.c
@@ -0,0 +1,418 @@
+/*
+ * Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "util/misc.h"
+#include "util/device.h"
+#include "util/misc.h"
+
+#include <sys/stat.h>
+
+
+extern void cb_item_modify (reiserfs_ih_t *ih, void *item);
+
+static __u64 _look_for_lost (reiserfs_filsys_t * fs, int link_lost_dirs) {
+    reiserfs_key_t key, prev_key;
+    const reiserfs_key_t *rdkey;
+    REISERFS_PATH_INIT (path);
+    static int lost_files = 0; /* looking for lost dirs we calculate amount of
+				  lost files, so that when we will look for
+				  lost files we will be able to stop when
+				  there are no lost files anymore */
+    unsigned long leaves;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+    int entry_len;
+    int is_it_dir;
+    int item_pos;
+    int retval;
+    __u64 size;
+
+    key = root_dir_key;
+
+    if (!link_lost_dirs && !lost_files) {
+	/* we have to look for lost files but we know already that there are
+           no any */
+	return 0;
+    }
+	
+    fsck_progress ("Looking for lost %s:\n", link_lost_dirs ? 
+		   "directories" : "files");
+    leaves = 0;
+
+    /* total size of added entries */
+    size = 0;
+    while (1) {
+	retval = reiserfs_tree_search_item (fs, &key, &path);
+	/* fixme: we assume path ends up with a leaf */
+	bh = REISERFS_PATH_LEAF (&path);
+	item_pos = REISERFS_PATH_LEAF_POS (&path);
+	if (retval != ITEM_FOUND) {
+	    if (item_pos == reiserfs_nh_get_items (NODE_HEAD (bh))) {
+		rdkey = reiserfs_tree_rkey (&path, fs);
+		if (!reiserfs_key_comp (rdkey, &MAX_KEY)) {
+		    reiserfs_tree_pathrelse (&path);
+		    break;
+		}
+		key = *rdkey;
+		reiserfs_tree_pathrelse (&path);
+		continue;
+	    }
+	    /* we are on the item in the buffer */
+	}
+
+	/* print ~ how many leaves were scanned and how fast it was */
+	if (!fsck_quiet (fs))
+	    util_misc_speed (fsck_progress_file(fs), leaves++, 0, 50, 0);
+
+	for (ih = REISERFS_PATH_IH (&path); 
+	     item_pos < reiserfs_nh_get_items (NODE_HEAD (bh)); 
+	     item_pos ++, ih ++, REISERFS_PATH_LEAF_POS(&path)++) 
+	{
+	    if (fsck_item_reach(ih))
+		continue;
+
+	    /* found item which can not be reached */
+	    if (!reiserfs_ih_dir (ih) && !reiserfs_ih_stat (ih)) {
+		continue;
+	    }
+
+	    if (reiserfs_ih_dir (ih)) {
+		/* if this directory has no stat data - try to recover it */
+		reiserfs_key_t sd;
+		reiserfs_path_t tmp;
+
+		sd = ih->ih_key;
+		reiserfs_key_set_sec (KEY_FORMAT_1, &sd, 
+				      OFFSET_SD, TYPE_STAT_DATA);
+		if (reiserfs_tree_search_item (fs, &sd, &tmp) == ITEM_FOUND) {
+		    /* should not happen - because if there were a stat data -
+                       we would have done with the whole directory */
+		    reiserfs_tree_pathrelse (&tmp);
+		    continue;
+		}
+		sem_pass_stat(fs)->added_sd ++;
+		reiserfs_tree_create_stat (fs, &tmp, &sd, cb_item_modify);
+                id_map_mark(proper_id_map (fs), reiserfs_key_get_oid (&sd));
+		key = sd;
+		reiserfs_tree_pathrelse (&path);
+		goto cont;
+	    }
+
+
+	    /* stat data marked "not having name" found */
+	    if (reiserfs_ih_stat (REISERFS_PATH_IH(&path)))
+		fix_obviously_wrong_sd_mode (&path);
+		
+    	    is_it_dir = (not_a_directory(reiserfs_item_by_ih(bh,ih))) ? 0 : 1;
+
+	    if (is_it_dir) {
+		reiserfs_key_t tmp_key;
+		REISERFS_PATH_INIT (tmp_path);
+		reiserfs_ih_t * tmp_ih;
+		reiserfs_bh_t *tmp_bh;
+
+		/* there is no need to link empty lost dirs into /lost+found */
+		tmp_key = ih->ih_key;
+		reiserfs_key_set_sec (KEY_FORMAT_1, &tmp_key, 
+				      0xffffffff, TYPE_DIRENTRY);
+		reiserfs_tree_search_item (fs, &tmp_key, &tmp_path);
+		tmp_ih = REISERFS_PATH_IH (&tmp_path);
+		tmp_bh = REISERFS_PATH_LEAF (&tmp_path);
+		tmp_ih --;
+		if (reiserfs_key_comp2 (&tmp_key, tmp_ih))
+		    reiserfs_panic ("not directory found");
+		if (!reiserfs_ih_dir (tmp_ih) ||
+		    (reiserfs_deh_get_off (reiserfs_deh (tmp_bh, tmp_ih) + 
+					   reiserfs_ih_get_entries (tmp_ih) - 1)
+		     == OFFSET_DOT_DOT))
+		{
+		    /* last directory item is either stat data or empty
+                       directory item - do not link this dir into lost+found */
+		    sem_pass_stat(fs)->empty_lost_dirs ++;
+		    reiserfs_tree_pathrelse (&tmp_path);
+		    continue;
+		}
+		reiserfs_tree_pathrelse (&tmp_path);
+	    }
+
+	    if (link_lost_dirs && !is_it_dir) {
+		/* we are looking for directories and it is not a dir */
+		lost_files ++;
+		continue;
+	    }
+
+	    sem_pass_stat(fs)->lost_found ++;
+
+	    {
+		reiserfs_key_t obj_key = {0, 0, {{0, 0},}};
+		char lost_name[REISERFS_NAME_MAX];
+		reiserfs_ih_t tmp_ih;
+
+		/* key to continue */
+		key = ih->ih_key;
+		reiserfs_key_set_oid (&key, reiserfs_key_get_oid (&key) + 1);
+
+		tmp_ih = *ih;
+		if (id_map_test(semantic_id_map (fs), 
+				reiserfs_key_get_oid (&ih->ih_key))) 
+		{
+		    /* objectid is used, relocate an object */
+		    sem_pass_stat(fs)->oid_sharing ++;
+		    
+		    if (is_it_dir) {
+			relocate_dir (&tmp_ih);
+			sem_pass_stat(fs)->oid_sharing_dirs_relocated ++;
+		    } else {
+			fsck_file_relocate (&tmp_ih.ih_key, 1);
+			sem_pass_stat(fs)->oid_sharing_files_relocated ++;
+		    }		    
+		    
+		    fsck_relocate_mklinked(&tmp_ih.ih_key);
+		} else {
+		    if (!is_it_dir)
+			id_map_mark(semantic_id_map (fs), 
+				    reiserfs_key_get_oid (&ih->ih_key));
+		}
+
+		lost_name[0] = '\0';
+		sprintf (lost_name, "%u_%u", reiserfs_key_get_did (&tmp_ih.ih_key),
+			 reiserfs_key_get_oid (&tmp_ih.ih_key));
+
+		/* entry in lost+found directory will point to this key */
+		reiserfs_key_set_did (&obj_key, 
+			reiserfs_key_get_did (&tmp_ih.ih_key));
+		reiserfs_key_set_oid (&obj_key, 
+			reiserfs_key_get_oid (&tmp_ih.ih_key));
+
+		reiserfs_tree_pathrelse (&path);
+		
+		/* 0 does not mean anyting - item with "." and ".." already
+		   exists and reached, so only name will be added */
+		entry_len = reiserfs_direntry_entry_estimate (lost_name, 
+							      fs->lost_format);
+		size += reiserfs_tree_insert_entry (fs, &lost_found_dir_key, 
+						    lost_name, entry_len,
+						    &obj_key, 0/*fsck_need*/);
+		
+		if (is_it_dir) {
+		    /* fixme: we hope that if we will try to pull all the
+		       directory right now - then there will be less
+		       lost_found things */
+		    if (!fsck_quiet(fs)) {
+			util_misc_print_name (fsck_progress_file(fs), 
+					      lost_name, strlen (lost_name));
+		    }
+		    
+		    /*fsck_progress ("\tChecking lost dir \"%s\":", lost_name);*/
+		    rebuild_semantic_pass (&obj_key, &lost_found_dir_key, 
+					   ET_NAME, /*reloc_ih*/0);
+		    
+		    if (!fsck_quiet(fs)) {
+			util_misc_erase_name (fsck_progress_file(fs), 
+					      strlen (lost_name));
+		    
+			util_misc_fini_name(fsck_progress_file(fs));
+		    }
+		    
+		    /*fsck_progress ("finished\n");*/
+		    
+		    sem_pass_stat(fs)->lost_found_dirs ++;
+		} else {
+		    if (reiserfs_tree_search_item (fs, &obj_key, &path) != 
+			ITEM_FOUND)
+		    {
+			reiserfs_panic ("look_for_lost: lost file stat data "
+					"%K not found", &obj_key);
+		    }
+
+		    /* check_regular_file does not mark stat data reachable */
+		    fsck_item_mkreach (REISERFS_PATH_IH (&path), 
+				       REISERFS_PATH_LEAF (&path));
+
+		    rebuild_check_regular_file (&path, REISERFS_PATH_ITEM(&path), 
+						0/*reloc_ih*/);
+		    
+		    reiserfs_tree_pathrelse (&path);
+
+		    sem_pass_stat(fs)->lost_found_files ++;
+		    lost_files --;
+		}
+
+		goto cont;
+	    }
+	} /* for */
+
+	prev_key = key;
+	
+	REISERFS_PATH_LEAF_POS(&path) = item_pos - 1;
+	rdkey = reiserfs_tree_next_key (&path, fs);
+	if (rdkey)
+	    key = *rdkey;
+	else
+	    break;
+	    	
+	if (reiserfs_key_comp (&prev_key, &key) != -1)
+	    reiserfs_panic ("pass_3a: key must grow 2: prev=%k next=%k",
+			    &prev_key, &key);
+	reiserfs_tree_pathrelse (&path);
+
+    cont:
+	if (!link_lost_dirs && !lost_files) {
+	    break;
+	}
+    }
+
+    reiserfs_tree_pathrelse (&path);
+    util_misc_speed(fsck_progress_file(fs), leaves, 0, 50, 1);
+    
+#if 0
+    /* check names added we just have added to/lost+found. Those names are
+       marked DEH_Lost_found flag */
+    fsck_progress ("Checking lost+found directory.."); fflush (stdout);
+    check_semantic_tree (&lost_found_dir_key, &root_dir_key, 0, 1/* lost+found*/);
+    fsck_progress ("finished\n");
+#endif
+
+    return size;
+
+}
+
+static void fsck_lost_save_result (reiserfs_filsys_t * fs)
+{
+    FILE * file;
+    int retval;
+
+    /* save bitmaps with which we will be able start reiserfs from
+       pass 1 */
+    file = util_file_open ("temp_fsck_file.deleteme", "w+");
+    if (!file)
+	return;
+
+    fsck_stage_start_put (file, LOST_FOUND_DONE);
+    fsck_stage_end_put (file);
+    fclose (file);
+
+    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
+    if (retval != 0) {
+	fsck_progress ("pass 0: Could not rename the temporary file "
+		       "temp_fsck_file.deleteme to %s", state_dump_file (fs));
+    }
+}
+
+/* we have nothing to load from a state file, but we have to fetch
+   on-disk bitmap, copy it to allocable bitmap, and fetch objectid
+   map */
+void fsck_lost_load_result (reiserfs_filsys_t * fs) {
+    fsck_new_bitmap (fs) = 
+	    reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    
+    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
+
+    fsck_allocable_bitmap (fs) = 
+	    reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    
+    reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
+
+    fs->block_allocator = reiserfsck_new_blocknrs;
+    fs->block_deallocator = reiserfsck_free_block;
+}
+
+static void fsck_lost_fini(reiserfs_filsys_t * fs) {
+    /* update super block: objectid map, fsck state */
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, LOST_FOUND_DONE);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+
+    /* write all dirty blocks */
+    fsck_progress ("Flushing..");
+    id_map_flush(semantic_id_map (fs), fs);
+    id_map_free(semantic_id_map(fs));
+    semantic_id_map(fs) = NULL;
+ 
+    fs->fs_dirt = 1;
+    reiserfs_bitmap_flush(fsck_new_bitmap(fs), fs);
+    reiserfs_fs_flush (fs);
+    fsck_progress ("finished\n");
+
+    fsck_stage_report (FS_LOST, fs);
+    
+    id_map_free(proper_id_map(fs));
+    proper_id_map(fs) = NULL;
+
+    if (!fsck_run_one_step (fs)) {
+	if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1))
+	    /* reiserfsck continues */
+	    return;
+    }
+
+    fsck_lost_save_result (fs);
+
+    fs->fs_dirt = 1;
+    reiserfs_fs_close (fs);
+    exit(EXIT_OK);
+}
+
+void fsck_lost (reiserfs_filsys_t * fs) {
+    REISERFS_PATH_INIT (path);
+    reiserfs_ih_t * ih;
+    void * sd;
+    __u64 size, sd_size;
+    __u32 blocks;
+    __u16 mode;
+    __u32 objectid;
+    unsigned int gen_counter;
+    fsck_progress ("Pass 3a (looking for lost dir/files):\n");
+
+    /* when warnings go not to stderr - separate them in the log */
+    if (fsck_log_file (fs) != stderr)
+	fsck_log ("####### Pass 3a (lost+found pass) #########\n");
+
+
+    /* look for lost dirs first */
+    size = _look_for_lost (fs, 1);
+
+    /* link files which are still lost */
+    size += _look_for_lost (fs, 0);
+
+    /* update /lost+found sd_size and sd_blocks (nlink is correct already) */
+
+    objectid = reiserfs_tree_search_name (fs, &root_dir_key, "lost+found",
+                                       &gen_counter, &lost_found_dir_key);
+
+    if (!objectid) {
+       reiserfs_panic ("look_for_lost: The entry 'lost+found' could "
+		       "not be found in the root directory.");
+    }
+
+    if (reiserfs_tree_search_item (fs, &lost_found_dir_key, &path) != 
+	ITEM_FOUND)
+    {
+	reiserfs_panic ("look_for_lost: The StatData of the 'lost+found' "
+			"directory %K could not be found", &lost_found_dir_key);
+    }
+    
+    ih = REISERFS_PATH_IH (&path);
+    sd = REISERFS_PATH_ITEM (&path);
+    reiserfs_stat_get_size (ih, sd, &sd_size);
+    size += sd_size;
+    blocks = REISERFS_DIR_BLOCKS (size);
+
+    reiserfs_stat_set_size (ih, sd, &size);
+    reiserfs_stat_set_blocks (ih, sd, &blocks);
+
+    /* make lost+found to be drwx------ */
+    mode = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR;
+    reiserfs_stat_set_mode (ih, sd, &mode);
+
+    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path));
+    reiserfs_tree_pathrelse (&path);
+
+    fsck_lost_fini(fs);
+}
+
diff --git a/fsck/main.c b/utils/fsck/main.c
similarity index 72%
rename from fsck/main.c
rename to utils/fsck/main.c
index ab3342a..d2f7cb0 100644
--- a/fsck/main.c
+++ b/utils/fsck/main.c
@@ -3,15 +3,24 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include "fsck.h"
+#include "misc/malloc.h"
+#include "util/print.h"
+#include "util/device.h"
+#include "util/badblock.h"
+
 #include <getopt.h>
 #include <sys/resource.h>
 #include <sys/mman.h>
 #include <signal.h>
-
-extern int screen_width;
-extern int screen_savebuffer_len;
-extern char *screen_savebuffer;
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
 
 reiserfs_filsys_t * fs;
 char * badblocks_file;
@@ -50,11 +59,11 @@
 
 /*
    -B works with --fix-fixable
-        fixes indirect pointers pointed to
+        fixes extent pointers pointed to
 	badblocks, adds badblocks to badblock list in fs.
     and with --rebuild
         builds the tree without pointers to badblocks (internal,
-	indirect), adds badblocks to badblock list in fs.  
+	extent), adds badblocks to badblock list in fs.  
 */
 
 /*
@@ -160,11 +169,10 @@
 
 	case 'l': /* --logfile */
 	    data->log_file_name = optarg;
-	    /*asprintf (&data->log_file_name, "%s", optarg);*/
 	    data->log = fopen (optarg, "w");
 	    if (!data->log)
 		fprintf (stderr, "reiserfsck: Cannot not open \'%s\': %s", 
-		    optarg, strerror(errno));	    
+			 optarg, strerror(errno));	    
 	    break;
 
 	case 'n': /* --nolog */
@@ -176,7 +184,6 @@
                blocks marked in it. That bitmap could be created by
                previous run of reiserfsck with -c */
 	    data->rebuild.bitmap_file_name = optarg;
-	    /*asprintf (&data->rebuild.bitmap_file_name, "%s", optarg);*/
 	    data->rebuild.scan_area = EXTERN_BITMAP;
 	    break;
 
@@ -192,7 +199,7 @@
 	    break;
 #endif
 	case 'd': /* --create-passes-dump */
-	    asprintf (&data->rebuild.passes_dump_file_name, "%s", optarg);
+	    data->rebuild.passes_dump_file_name = optarg;
 	    data->options |= OPT_SAVE_PASSES_DUMP;
 	    break;
 	
@@ -201,8 +208,8 @@
 	    break;
 
 	case 'h': /* --hash: suppose that this hash was used on a filesystem */
-	    asprintf (&data->rebuild.defined_hash, "%s", optarg);
-	    if (name2func (data->rebuild.defined_hash) == 0)
+	    data->rebuild.defined_hash = optarg;
+	    if (reiserfs_hash_get (data->rebuild.defined_hash) == 0)
 		reiserfs_panic ("reiserfsck: Unknown hash is specified: %s",
 				data->rebuild.defined_hash);
 	    data->options |= OPT_HASH_DEFINED;
@@ -213,12 +220,12 @@
 	    break;
 
 	case 'R': /* preparing rollback data */
-	    asprintf (&data->rebuild.rollback_file, "%s", optarg);
+	    data->rebuild.rollback_file = optarg;
 	    data->options |= OPT_SAVE_ROLLBACK;
 	    break;
 	
 	case 'B': /* list of phisically corrupted blocks */
-	    asprintf (&badblocks_file, "%s", optarg);
+	    badblocks_file = optarg;
 	    data->options |= BADBLOCKS_FILE;
 	    break;
 
@@ -316,7 +323,7 @@
 ** If you would like advice on using this program, support **\n\
 ** is available  for $25 at  www.namesys.com/support.html. **\n\
 *************************************************************\n\
-\nWill rebuild the filesystem (%s) tree\n"
+\nWill rebuild the filesystem on (%s)\n"
 
 #define START_WARNING \
 "*************************************************************\n\
@@ -332,8 +339,7 @@
 \n"
 
 
-void warn_what_will_be_done (char * file_name, struct fsck_data * data)
-{
+static void warn_what_will_be_done (char * file_name, struct fsck_data * data) {
     FILE * warn_to;
 
     warn_to = (data->progress ? data->progress : stderr);
@@ -376,9 +382,8 @@
                 "confirmation before continuing\n");
 
 	if (data->rebuild.bitmap_file_name)
-	    reiserfs_warning (warn_to, "Will try to load a bitmap--of all "
-		"ReiserFS leaves in the partition--from the file \n'%s'\n",
-		data->rebuild.bitmap_file_name);
+	    reiserfs_warning (warn_to, "Will try to obtain the list of ReiserFS"
+		" leaves from the file '%s'\n", data->rebuild.bitmap_file_name);
 
 	if (data->options & OPT_ADJUST_FILE_SIZE)
 	    reiserfs_warning (warn_to, "\tWill set file sizes in their metadata "
@@ -416,43 +421,54 @@
 	(data->log == stdout) ? "stdout" : 
 	(data->log_file_name ? data->log_file_name : "fsck.run"));
     
-    if (!(data->options & OPT_YES) && !user_confirmed (warn_to, "\nDo you want to "
-	"run this program?[N/Yes] (note need to type Yes if you do):", "Yes\n"))
-	exit (EXIT_USER);
+    if (!(data->options & OPT_YES)) {
+	    if (!util_user_confirmed(warn_to, "\nDo you want to run this "
+				     "program?[N/Yes] (note need to type "
+				     "Yes if you do):", "Yes\n"))
+	    {
+		    exit (EXIT_USER);
+	    }
+    }
 }
 
-static dma_info_t dma_info;
-static dma_info_t old_dma_info;
+#define DMA_IS_OFF								\
+"\n********************************************************************\n"	\
+"* Warning: It was just detected that dma mode was turned off while *\n"	\
+"* operating -- probably  due  to some  problem with your hardware. *\n"	\
+"* Please check your hardware and have a look into the syslog file. *\n"	\
+"* Note: running with --rebuild-tree on faulty hardware may destroy *\n"	\
+"* your data.                                                       *\n"	\
+"********************************************************************\n"
 
-void check_dma() {
+#define DMA_IS_CHANGED								\
+"\n********************************************************************\n"	\
+"* Warning: It was just detected that dma speed was descreased while*\n"	\
+"* operating -- probably  due  to some  problem with your hardware. *\n"	\
+"* Please check your hardware and have a look into the syslog file. *\n"	\
+"* Note: running with --rebuild-tree on faulty hardware may destroy *\n"	\
+"* your data.                                                       *\n"	\
+"********************************************************************\n"
+
+static util_device_dma_t dma_info;
+static util_device_dma_t old_dma_info;
+
+static void check_dma() {
     old_dma_info = dma_info;
-    if (get_dma_info(&dma_info) == -1) {
-	fsck_log("get_dma_info failed %s\n", strerror (errno));
+    if (util_device_get_dma(&dma_info) == -1) {
+	fsck_log("util_device_get_dma failed %s\n", strerror (errno));
 	return;
     }
     
     if (dma_info.dma != old_dma_info.dma) {
 	if (dma_info.dma == 0) {
-	    printf("\n********************************************************************\n");
-	    printf("* Warning: It was just detected that dma mode was turned off while *\n");
-	    printf("* operating -- probably  due  to some  problem with your hardware. *\n");
-	    printf("* Please check your hardware and have a look into the syslog file. *\n");
-	    printf("* Note: running with --rebuild-tree on faulty hardware may destroy *\n");
-	    printf("* your data.                                                       *\n");
-	    printf("********************************************************************\n");
+	    printf(DMA_IS_OFF);
 	    if (fsck_log_file (fs) != stdout)
 		fsck_log("WARNING: dma mode has been turned off.\n");
 	}
     }
     if (dma_info.speed != old_dma_info.speed) {
 	if (dma_info.speed < old_dma_info.speed) {
-	    printf("\n********************************************************************\n");
-	    printf("* Warning: It was just detected that dma speed was descreased while*\n");
-	    printf("* operating -- probably  due  to some  problem with your hardware. *\n");
-	    printf("* Please check your hardware and have a look into the syslog file. *\n");
-	    printf("* Note: running with --rebuild-tree on faulty hardware may destroy *\n");
-	    printf("* your data.                                                       *\n");
-	    printf("********************************************************************\n");
+	    printf(DMA_IS_CHANGED);
 	    if (fsck_log_file (fs) != stdout)
 		fsck_log("WARNING: dma speed has been descreased.\n");	    
 	}
@@ -467,11 +483,11 @@
     
     dma_info.fd = fs->fs_dev;
 
-    if (prepare_dma_check(&dma_info) != 0)
+    if (util_device_dma_prep(&dma_info) != 0)
 	return;
 
-    if (get_dma_info(&dma_info) == -1) {
-	fsck_log("get_dma_info failed %s\n", strerror (errno));
+    if (util_device_get_dma(&dma_info) == -1) {
+	fsck_log("util_device_get_dma failed %s\n", strerror (errno));
 	return;
     }
 
@@ -490,86 +506,92 @@
 
 static void reset_super_block (reiserfs_filsys_t * fs)
 {
-    struct reiserfs_super_block * sb;
+    reiserfs_sb_t * sb;
     struct reiserfs_journal_header * jh;
     
     sb = fs->fs_ondisk_sb;
 
-    set_sb_free_blocks (sb, get_sb_block_count (sb));
-    set_sb_root_block (sb, 0);
-    set_sb_tree_height (sb, ~0);
+    reiserfs_sb_set_free (sb, reiserfs_sb_get_blocks (sb));
+    reiserfs_sb_set_root (sb, 0);
+    reiserfs_sb_set_height (sb, ~0);
 
     /* make file system invalid unless fsck finished () */
-    set_sb_fs_state (sb, get_sb_fs_state (sb) | FS_FATAL);
+    reiserfs_sb_set_state (sb, reiserfs_sb_get_state (sb) | FS_FATAL);
 
 /*
     if ( is_reiser2fs_jr_magic_string (sb) ) {???
-	set_sb_version (sb, REISERFS_VERSION_3);
+	reiserfs_sb_set_version (sb, REISERFS_VERSION_3);
     }
     if (is_reiser2fs_magic_string (sb)) {
-	set_sb_version (sb, REISERFS_FORMAT_3_6);
+	reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_6);
     }
     if (is_reiserfs_magic_string (sb)) {
-	set_sb_version (sb, REISERFS_FORMAT_3_5);
+	reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_5);
     }
 */
     /* make sure that hash code in super block match to set hash function */
-    set_sb_hash_code (sb, func2code (fs->fs_hash_function));
+    reiserfs_sb_set_hash (sb, reiserfs_hash_code (fs->hash));
     
     if (fsck_hash_defined (fs)) {
 	/* --hash was specifed */
-	fs->fs_hash_function = name2func (fsck_data (fs)->rebuild.defined_hash);
-	set_sb_hash_code (sb, func2code (fs->fs_hash_function));
+	fs->hash = reiserfs_hash_get (fsck_data (fs)->rebuild.defined_hash);
+	reiserfs_sb_set_hash (sb, reiserfs_hash_code (fs->hash));
     }
     
     if (reiserfs_journal_opened (fs)) {	
 	jh = (struct reiserfs_journal_header *)fs->fs_jh_bh->b_data;
     
 	/* reset journal params if needed. */
-	if (memcmp(sb_jp(sb), &jh->jh_journal, sizeof (struct journal_params))) {
-	    if (is_reiserfs_jr_magic_string (sb)) 
-		memcpy (sb_jp(sb), &jh->jh_journal, sizeof (struct journal_params));
+	if (memcmp(reiserfs_sb_jp(sb), &jh->jh_journal, sizeof (reiserfs_journal_param_t))) {
+	    if (reiserfs_super_jr_magic (sb)) 
+		memcpy (reiserfs_sb_jp(sb), &jh->jh_journal, sizeof (reiserfs_journal_param_t));
 	    else {
-		set_sb_reserved_for_journal (sb, 0);
+		reiserfs_sb_set_reserved (sb, 0);
 	    
-		set_jp_journal_dev (sb_jp(sb), 0);
-		set_jp_journal_magic (sb_jp(sb), get_random());
-		set_jp_journal_1st_block (sb_jp(sb), get_journal_start_must (fs));
-		set_jp_journal_size (sb_jp(sb),
-		    journal_default_size (fs->fs_super_bh->b_blocknr, fs->fs_blocksize));	    
-		set_jp_journal_max_trans_len (sb_jp(sb),
-		    advise_journal_max_trans_len(
-			get_jp_journal_max_trans_len (sb_jp(sb)),
-			get_jp_journal_size (sb_jp(sb)),
-			fs->fs_blocksize, 0));
-		set_jp_journal_max_batch (sb_jp(sb), 
-		    advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));
-		set_jp_journal_max_commit_age (sb_jp(sb), advise_journal_max_commit_age());
-		set_jp_journal_max_trans_age (sb_jp(sb), advise_journal_max_trans_age());
+		reiserfs_jp_set_dev (reiserfs_sb_jp(sb), 0);
+		reiserfs_jp_set_magic (reiserfs_sb_jp(sb), misc_random());
+		reiserfs_jp_set_start (reiserfs_sb_jp(sb), 
+		    reiserfs_journal_start_must (fs));
+		reiserfs_jp_set_size (reiserfs_sb_jp(sb),
+		    reiserfs_journal_default (fs->fs_super_bh->b_blocknr, 
+					      fs->fs_blocksize));	    
 		
-		set_jp_journal_dev (&jh->jh_journal, 0);
-		set_jp_journal_magic (&jh->jh_journal, 
-				      get_jp_journal_magic(sb_jp(sb)));
-		set_jp_journal_1st_block (&jh->jh_journal, 
-		    get_jp_journal_1st_block(sb_jp(sb)));
-		set_jp_journal_size (&jh->jh_journal, get_jp_journal_size(sb_jp(sb)));
-		set_jp_journal_max_trans_len (&jh->jh_journal, 
-		    get_jp_journal_max_trans_len(sb_jp(sb)));
-		set_jp_journal_max_batch (&jh->jh_journal, 
-		    get_jp_journal_max_batch(sb_jp(sb)));
-		set_jp_journal_max_commit_age (&jh->jh_journal, 
-		    get_jp_journal_max_commit_age(sb_jp(sb)));
-		set_jp_journal_max_trans_age (&jh->jh_journal, 
-		    get_jp_journal_max_trans_age(sb_jp(sb))); 
+		reiserfs_jp_set_tlen (reiserfs_sb_jp(sb),
+		    reiserfs_journal_tlen(
+			reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)),
+			reiserfs_jp_get_size (reiserfs_sb_jp(sb)),
+			fs->fs_blocksize, 0));
+		reiserfs_jp_set_max_batch (reiserfs_sb_jp(sb), 
+		    reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb))));
+		reiserfs_jp_set_commit_age (reiserfs_sb_jp(sb), 
+		    reiserfs_journal_commit_age());
+		reiserfs_jp_set_trans_age (reiserfs_sb_jp(sb), 
+		    reiserfs_journal_trans_age());
+		
+		reiserfs_jp_set_dev (&jh->jh_journal, 0);
+		reiserfs_jp_set_magic (&jh->jh_journal, 
+				      reiserfs_jp_get_magic(reiserfs_sb_jp(sb)));
+		reiserfs_jp_set_start (&jh->jh_journal, 
+		    reiserfs_jp_get_start(reiserfs_sb_jp(sb)));
+		reiserfs_jp_set_size (&jh->jh_journal, 
+		    reiserfs_jp_get_size(reiserfs_sb_jp(sb)));
+		reiserfs_jp_set_tlen (&jh->jh_journal, 
+		    reiserfs_jp_get_tlen(reiserfs_sb_jp(sb)));
+		reiserfs_jp_set_max_batch (&jh->jh_journal, 
+		    reiserfs_jp_get_max_batch(reiserfs_sb_jp(sb)));
+		reiserfs_jp_set_commit_age (&jh->jh_journal, 
+		    reiserfs_jp_get_commit_age(reiserfs_sb_jp(sb)));
+		reiserfs_jp_set_trans_age (&jh->jh_journal, 
+		    reiserfs_jp_get_trans_age(reiserfs_sb_jp(sb))); 
 	    }
 	}
     }
 
     /* objectid map is not touched */
-    mark_buffer_dirty (fs->fs_super_bh);
-    bwrite (fs->fs_super_bh);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+    reiserfs_buffer_write (fs->fs_super_bh);
     if (!(fsck_data(fs)->options & OPT_SAVE_PASSES_DUMP))
-        mark_buffer_do_not_flush (fs->fs_super_bh);
+        reiserfs_buffer_mknoflush (fs->fs_super_bh);
 }
 
 
@@ -580,6 +602,8 @@
 #define START_FROM_LOST_FOUND 		5
 #define START_FROM_PASS_4 		6
 
+
+
 /* this decides where to start from  */
 static int where_to_start_from (reiserfs_filsys_t * fs)
 {
@@ -587,21 +611,21 @@
     FILE * fp = 0;
     int last_run_state;
     
-    last_run_state = get_sb_fs_state (fs->fs_ondisk_sb);
+    last_run_state = reiserfs_sb_get_state (fs->fs_ondisk_sb);
     if (last_run_state == 0 || !fsck_run_one_step (fs))
 	/**/
 	return START_FROM_THE_BEGINNING;
     
     /* We are able to perform the next step only if there is a file with the previous 
      * step results. */
-    fp = open_file (state_dump_file (fs), "r");
+    fp = util_file_open (state_dump_file (fs), "r");
     if (fp == 0) {
-	set_sb_fs_state (fs->fs_ondisk_sb, 0);
+	reiserfs_sb_set_state (fs->fs_ondisk_sb, 0);
 	return START_FROM_THE_BEGINNING;
     }
 
     /* check start and end magics of dump file */
-    ret = is_stage_magic_correct (fp);
+    ret = fsck_stage_magic_check (fp);
     
     if (ret <= 0 || ret != last_run_state)
 	return START_FROM_THE_BEGINNING;
@@ -610,54 +634,56 @@
     switch (last_run_state) {
     case PASS_0_DONE:
 	/* skip pass 0 */
-	if (!fsck_user_confirmed (fs, "Pass 0 seems finished. Start from pass 1?(Yes)",
-				  "Yes\n", 1))
+	if (!fsck_info_ask (fs, "Pass 0 seems finished. Start "
+			    "from pass 1?(Yes)", "Yes\n", 1))
+	{
 	    fsck_exit ("Run without -d then\n");
+	}
 	
-	load_pass_0_result (fp, fs);
+	fsck_pass0_load_result (fp, fs);
 	fclose (fp);
 	return START_FROM_PASS_1;
 	
     case PASS_1_DONE:
 	/* skip pass 1 */
-	if (!fsck_user_confirmed (fs, "Passes 0 and 1 seems finished. Start from "
-	    "pass 2?(Yes)", "Yes\n", 1)) 
+	if (!fsck_info_ask (fs, "Passes 0 and 1 seems finished. "
+			    "Start from pass 2?(Yes)", "Yes\n", 1)) 
 	{
 	    fsck_exit ("Run without -d then\n");
 	}
 	
-	load_pass_1_result (fp, fs);
+	fsck_pass1_load_result (fp, fs);
 	fclose (fp);
 	return START_FROM_PASS_2;
 	
     case TREE_IS_BUILT:
-	if (!fsck_user_confirmed (fs, "Internal tree of filesystem looks built. "
-	    "Skip rebuilding?(Yes)", "Yes\n", 1))
+	if (!fsck_info_ask (fs, "Internal tree of filesystem looks built. "
+			    "Skip rebuilding?(Yes)", "Yes\n", 1))
 	{
 	    fsck_exit ("Run without -d then\n");
 	}
 	
-	load_pass_2_result (fs);
+	fsck_pass2_load_result (fs);
 	fclose (fp);
 	return START_FROM_SEMANTIC;
     case SEMANTIC_DONE:
-	if (!fsck_user_confirmed (fs, "Passes 0 and 1 seems finished. Start from "
-	    "pass 2?(Yes)", "Yes\n", 1))
+	if (!fsck_info_ask (fs, "Passes 0 and 1 seems finished. Start from "
+			    "pass 2?(Yes)", "Yes\n", 1))
 	{
 	    fsck_exit ("Run without -d then\n");
 	}
 	
-	load_semantic_result (fp, fs);
+	fsck_semantic_load_result (fp, fs);
 	fclose (fp);
 	return START_FROM_LOST_FOUND;
     case LOST_FOUND_DONE:
-	if (!fsck_user_confirmed (fs, "Passes 0 and 1 seems finished. Start from "
-	    "pass 2?(Yes)", "Yes\n", 1))
+	if (!fsck_info_ask (fs, "Passes 0 and 1 seems finished. Start from "
+			    "pass 2?(Yes)", "Yes\n", 1))
 	{
 	    fsck_exit ("Run without -d then\n");
 	}
 	
-	load_lost_found_result (fs);
+	fsck_lost_load_result (fs);
 	fclose (fp);
 	return START_FROM_PASS_4;
     }
@@ -668,12 +694,12 @@
 
 static void mark_filesystem_consistent (reiserfs_filsys_t * fs)
 {
-    if (!is_opened_rw (fs))
+    if (!reiserfs_fs_rw (fs))
         return;
 
     if (!reiserfs_journal_opened (fs)) {
 	/* make sure journal is not standard */
-	if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb))
+	if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb))
 	    reiserfs_exit(EXIT_OPER, "Filesystem with default journal "
 			  "must be opened.");
 	
@@ -682,73 +708,73 @@
 	
 	/* mark filesystem such that it is not mountable until 
 	 * new journaldevice is defined */	
-	set_jp_journal_magic (sb_jp (fs->fs_ondisk_sb), NEED_TUNE);
+	reiserfs_jp_set_magic (reiserfs_sb_jp (fs->fs_ondisk_sb), NEED_TUNE);
     }
 
-    set_sb_umount_state (fs->fs_ondisk_sb, FS_CLEANLY_UMOUNTED);
-    set_sb_fs_state (fs->fs_ondisk_sb, FS_CONSISTENT);
+    reiserfs_sb_set_umount (fs->fs_ondisk_sb, FS_CLEANLY_UMOUNTED);
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_CONSISTENT);
     
-    mark_buffer_dirty (fs->fs_super_bh);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
 }
 
-static void reiserfsck_replay_journal (reiserfs_filsys_t * fs) {
-    struct reiserfs_super_block *on_place_sb;
-    int sb_size = reiserfs_super_block_size(fs->fs_ondisk_sb);
+static void reiserfsck_journal_replay (reiserfs_filsys_t * fs) {
+    reiserfs_sb_t *on_place_sb;
+    int sb_size = reiserfs_super_size(fs->fs_ondisk_sb);
     
     /* keep the super_block in the separate memory to avoid problems with replaying 
      * broken parameters. */
-    on_place_sb = (struct reiserfs_super_block *)fs->fs_super_bh->b_data;
-    fs->fs_ondisk_sb = getmem (sb_size);
+    on_place_sb = (reiserfs_sb_t *)fs->fs_super_bh->b_data;
+    fs->fs_ondisk_sb = misc_getmem (sb_size);
     memcpy (fs->fs_ondisk_sb, on_place_sb, sb_size);
 
-    replay_journal (fs);
+    reiserfs_journal_replay (fs);
 
     /* Copy checked reliable sb fields from backed up sb to a new one. */
-    set_sb_block_count(on_place_sb, get_sb_block_count(fs->fs_ondisk_sb));
-    memcpy(sb_jp(on_place_sb), sb_jp(fs->fs_ondisk_sb), 
-	sizeof(struct journal_params));    
-    set_sb_block_size(on_place_sb, get_sb_block_size(fs->fs_ondisk_sb));
-    set_sb_oid_maxsize(on_place_sb, get_sb_oid_maxsize(fs->fs_ondisk_sb));
+    reiserfs_sb_set_blocks(on_place_sb, reiserfs_sb_get_blocks(fs->fs_ondisk_sb));
+    memcpy(reiserfs_sb_jp(on_place_sb), reiserfs_sb_jp(fs->fs_ondisk_sb), 
+	sizeof(reiserfs_journal_param_t));    
+    reiserfs_sb_set_blksize(on_place_sb, reiserfs_sb_get_blksize(fs->fs_ondisk_sb));
+    reiserfs_sb_set_mapmax(on_place_sb, reiserfs_sb_get_mapmax(fs->fs_ondisk_sb));
     memcpy(on_place_sb->s_v1.s_magic, fs->fs_ondisk_sb->s_v1.s_magic, 10);
-    set_sb_hash_code(on_place_sb, get_sb_hash_code(fs->fs_ondisk_sb));
-    set_sb_bmap_nr(on_place_sb, get_sb_bmap_nr(fs->fs_ondisk_sb));
-    set_sb_version(on_place_sb, get_sb_version(fs->fs_ondisk_sb));
-    set_sb_reserved_for_journal(on_place_sb, 
-	get_sb_reserved_for_journal(fs->fs_ondisk_sb));
+    reiserfs_sb_set_hash(on_place_sb, reiserfs_sb_get_hash(fs->fs_ondisk_sb));
+    reiserfs_sb_set_bmaps(on_place_sb, reiserfs_sb_get_bmaps(fs->fs_ondisk_sb));
+    reiserfs_sb_set_version(on_place_sb, reiserfs_sb_get_version(fs->fs_ondisk_sb));
+    reiserfs_sb_set_reserved(on_place_sb, 
+	reiserfs_sb_get_reserved(fs->fs_ondisk_sb));
     
-    if (sb_size == SB_SIZE) {
-	set_sb_v2_flags(on_place_sb, get_sb_v2_flags(fs->fs_ondisk_sb));
+    if (sb_size == REISERFS_SB_SIZE) {
+	reiserfs_sb_set_flags(on_place_sb, reiserfs_sb_get_flags(fs->fs_ondisk_sb));
 	memcpy(on_place_sb->s_uuid, fs->fs_ondisk_sb->s_uuid, 16);
 	memcpy(on_place_sb->s_label, fs->fs_ondisk_sb->s_label, 16);
     }
 
     /* get rid of SB copy */
-    freemem (fs->fs_ondisk_sb);
+    misc_freemem (fs->fs_ondisk_sb);
     fs->fs_ondisk_sb = on_place_sb;
 }
 
 static int the_end (reiserfs_filsys_t * fs)
 {
-    struct reiserfs_super_block * sb;
+    reiserfs_sb_t * sb;
     int ret = EXIT_FIXED;
 
     sb = fs->fs_ondisk_sb;
 
     /* put bitmap and objectid map on place */
-    reiserfs_delete_bitmap (fs->fs_bitmap2);
+    reiserfs_bitmap_delete (fs->fs_bitmap2);
     fs->fs_bitmap2 = fsck_new_bitmap (fs);
     if (!fs->fs_bitmap2->bm_dirty)
-	die ("Bitmap not dirty");
+	misc_die ("Bitmap not dirty");
 
 //    id_map_flush(proper_id_map (fs), fs);
-    id_map_flush(semantic_id_map (fs), fs);
-    id_map_free(proper_id_map (fs));
-    id_map_free(semantic_id_map (fs));
+//    id_map_flush(semantic_id_map (fs), fs);
+//    id_map_free(proper_id_map (fs));
+//    id_map_free(semantic_id_map (fs));
 
-/*    set_sb_free_blocks (sb, reiserfs_bitmap_zeros (fsck_new_bitmap (fs)));*/
+/*    reiserfs_sb_set_free (sb, reiserfs_bitmap_zeros (fsck_new_bitmap (fs)));*/
 
     mark_filesystem_consistent (fs);
-    clear_buffer_do_not_flush (fs->fs_super_bh);
+    reiserfs_buffer_clnoflush (fs->fs_super_bh);
 
     if (fsck_data(fs)->mounted == MF_RO) {
 	reiserfs_warning(stderr, "\nThe partition is mounted ro. It "
@@ -759,8 +785,9 @@
     /* write all dirty blocks */
     fsck_progress ("Syncing..");
     fs->fs_dirt = 1;
-    clean_after_dma_check(fs->fs_dev, &dma_info);
-    reiserfs_close (fs);
+    util_device_dma_fini(fs->fs_dev, &dma_info);
+    reiserfs_fs_close (fs);
+    fs = NULL;
     fsck_progress ("finished\n");
 
     return ret;
@@ -772,15 +799,15 @@
     if (fs->fs_flags == O_RDWR) 
 	return;
 
-    reiserfs_reopen (fs, O_RDWR);
+    reiserfs_fs_reopen (fs, O_RDWR);
     
-    fsck_data(fs)->mounted = misc_device_mounted(fs->fs_file_name);
+    fsck_data(fs)->mounted = util_device_mounted(fs->fs_file_name);
     
     if (fsck_data(fs)->mounted > 0) {
 	if (fsck_data(fs)->mounted == MF_RW) {
 	    fsck_progress ("Partition %s is mounted with write permissions, "
 		"cannot check it\n", fs->fs_file_name);
-	    reiserfs_close(fs);
+	    reiserfs_fs_close(fs);
 	    exit(EXIT_USER);
 	}
 	
@@ -802,20 +829,20 @@
 	    /* just to make sure */
 	    reiserfs_panic ("Journal is not opened");
 	} else if (reiserfs_journal_params_check(fs)) {
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    exit(EXIT_FATAL);
 	}
 	
 	fsck_progress ("Filesystem seems mounted read-only. Skipping journal "
-	    "replay.\n");
+		       "replay.\n");
     } else if (!fsck_skip_journal (fs)) {
 	if (reiserfs_journal_params_check(fs)) {
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    exit(EXIT_FATAL);
 	}
 	
 	/* filesystem is not mounted, replay journal before checking */
-        reiserfsck_replay_journal (fs);
+        reiserfsck_journal_replay (fs);
     }
 }
 
@@ -823,15 +850,15 @@
     time_t t;
     int ret;
 
-    init_rollback_file (state_rollback_file(fs), &fs->fs_blocksize, 
-	fsck_data(fs)->log);
+    fsck_rollback_init (state_rollback_file(fs), &fs->fs_blocksize, 
+			fsck_data(fs)->log);
     
     prepare_fs_for_check(fs);
     
-    ret = reiserfs_open_ondisk_bitmap (fs);
+    ret = reiserfs_bitmap_open(fs);
     if (ret < 0) {
         fsck_progress ("reiserfsck: Could not open bitmap\n");
-	reiserfs_close (fs);
+	reiserfs_fs_close (fs);
 	exit(EXIT_OPER);
     } else if (ret > 0) {
 	fsck_log("Zero bit found in on-disk bitmap after the last valid bit. "
@@ -846,31 +873,31 @@
     switch (where_to_start_from (fs)) {
     case START_FROM_THE_BEGINNING:
 	reset_super_block (fs);
-	pass_0 (fs);
+	fsck_pass0 (fs);
 
     case START_FROM_PASS_1:
 	reset_super_block (fs);
-	pass_1 (fs);
+	fsck_pass1 (fs);
 	
     case START_FROM_PASS_2:
-	pass_2 (fs);
+	fsck_pass2 (fs);
 
     case START_FROM_SEMANTIC:
-	pass_3_semantic (fs);
+	fsck_semantic (fs);
 
 	/* if --lost+found is set - link unaccessed directories to lost+found
 	   directory */
     case START_FROM_LOST_FOUND:	
-	pass_3a_look_for_lost (fs);
+	fsck_lost (fs);
 	
     case START_FROM_PASS_4:
 	/* 4. look for unaccessed items in the leaves */
-	pass_4_check_unaccessed_items ();
+	fsck_cleanup ();
 	
 	ret = the_end (fs);
     }
 
-    close_rollback_file ();
+    fsck_rollback_fini ();
        
     time (&t);
     fsck_progress ("###########\n"
@@ -884,18 +911,18 @@
 
     time (&t);
 
-    if (get_sb_umount_state (fs->fs_ondisk_sb) != FS_CLEANLY_UMOUNTED) {
+    if (reiserfs_sb_get_umount (fs->fs_ondisk_sb) != FS_CLEANLY_UMOUNTED) {
         fsck_progress ("Filesystem is not clean\n"
 	    "Check consistency of the partition first.\n");
         exit(EXIT_USER);
     }
-    if (get_sb_fs_state (fs->fs_ondisk_sb) != FS_CONSISTENT) {
+    if (reiserfs_sb_get_state (fs->fs_ondisk_sb) != FS_CONSISTENT) {
         fsck_progress ("Filesystem seems to be in unconsistent state.\n"
 	    "Check consistency of the partition first.\n");
         exit(EXIT_USER);
     }
 
-    if (get_reiserfs_format (fs->fs_ondisk_sb) != REISERFS_FORMAT_3_6) {
+    if (reiserfs_super_format (fs->fs_ondisk_sb) != REISERFS_FORMAT_3_6) {
         fsck_progress ("Filesystems of 3_5 format do not support extended "
 	    "attributes.\n");
 	
@@ -905,16 +932,18 @@
 	           "reiserfsck --clean-attributes started at %s"
                    "###########\n", ctime (&t));
 
-    init_rollback_file (state_rollback_file(fs), &fs->fs_blocksize, 
-	fsck_data(fs)->log);
+    fsck_rollback_init (state_rollback_file(fs), &fs->fs_blocksize, 
+			fsck_data(fs)->log);
 
     prepare_fs_for_check(fs);
 
-    do_clean_attributes (fs);
+    fsck_tree_clean_attr(fs);
 
-    clean_after_dma_check(fs->fs_dev, &dma_info);
-    reiserfs_close (fs);
-    close_rollback_file ();
+    util_device_dma_fini(fs->fs_dev, &dma_info);
+    reiserfs_fs_close (fs);
+    fs = NULL;
+    
+    fsck_rollback_fini();
 
     fsck_progress ("###########\n"
 		   "reiserfsck finished at %s"
@@ -943,9 +972,9 @@
     __u16 state;
     int retval = 0;
     
-    print_super_block (stdout, fs, fs->fs_file_name, fs->fs_super_bh, 1);
+    reiserfs_super_print (stdout, fs, fs->fs_file_name, fs->fs_super_bh, 1);
     
-    state = get_sb_fs_state (fs->fs_ondisk_sb);
+    state = reiserfs_sb_get_state (fs->fs_ondisk_sb);
     if ((state & FS_FATAL) == FS_FATAL) {
 	fprintf(stderr, "Filesystem seems to have fatal corruptions. Running "
 	    "with --rebuild-tree is required.\n");
@@ -966,7 +995,7 @@
     prepare_fs_for_check(fs);
 
     /* Check bitmaps. */
-    retval = reiserfs_open_ondisk_bitmap (fs);
+    retval = reiserfs_bitmap_open (fs);
     
     if (retval > 0) {
 	fsck_log("Zero bit found in on-disk bitmap after the last valid bit. "
@@ -978,8 +1007,8 @@
 	goto error;
     }
     
-    if (get_sb_block_count (fs->fs_ondisk_sb) - 
-	get_sb_free_blocks(fs->fs_ondisk_sb) != 
+    if (reiserfs_sb_get_blocks (fs->fs_ondisk_sb) - 
+	reiserfs_sb_get_free(fs->fs_ondisk_sb) != 
 	fs->fs_bitmap2->bm_set_bits)
     {
 	fsck_log("Wrong amount of used blocks. Switching to the --fix-fixable mode.\n");
@@ -1003,21 +1032,21 @@
 	return 0;
     }
     
-    clean_after_dma_check(fs->fs_dev, &dma_info);
+    util_device_dma_fini(fs->fs_dev, &dma_info);
     
     fsck_sleep();
     
-    reiserfs_close (fs);
+    reiserfs_fs_close (fs);
     /* do not do anything else. */    
     exit (EXIT_OK);
 
 fatal_error:
-    set_sb_fs_state(fs->fs_ondisk_sb, FS_FATAL);
-    mark_buffer_dirty (fs->fs_super_bh);
-    bwrite(fs->fs_super_bh);	
+    reiserfs_sb_set_state(fs->fs_ondisk_sb, FS_FATAL);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+    reiserfs_buffer_write(fs->fs_super_bh);	
 error:
-    clean_after_dma_check(fs->fs_dev, &dma_info);
-    reiserfs_close(fs);
+    util_device_dma_fini(fs->fs_dev, &dma_info);
+    reiserfs_fs_close(fs);
     exit(EXIT_FATAL);
 }
 
@@ -1039,14 +1068,14 @@
                        "###########\n", ctime (&t));
     }
 
-    init_rollback_file (state_rollback_file(fs), &fs->fs_blocksize, 
-	fsck_data(fs)->log);
+    fsck_rollback_init (state_rollback_file(fs), &fs->fs_blocksize, 
+			fsck_data(fs)->log);
     
     prepare_fs_for_check (fs);
 
     if (!fs->fs_bitmap2)
 	/* It could be done on auto_check already. */
-	retval = reiserfs_open_ondisk_bitmap (fs);
+	retval = reiserfs_bitmap_open (fs);
 
     if (retval > 0) {
 	if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
@@ -1060,20 +1089,20 @@
 	}
     } else if (retval < 0) {
         fsck_progress ("reiserfsck: Could not open bitmap\n");
-	reiserfs_close (fs);
+	reiserfs_fs_close (fs);
 	exit(EXIT_OPER);
     }
 
     check_fs_tree (fs);
 
-    semantic_check ();
+    fsck_semantic_check ();
     
     if (fsck_data (fs)->check.fatal_corruptions) {
 	fsck_progress ("%lu found corruptions can be fixed only when running with "
 	    "--rebuild-tree\n", fsck_data (fs)->check.fatal_corruptions);
 	
-        set_sb_fs_state (fs->fs_ondisk_sb, FS_FATAL);
-        mark_buffer_dirty (fs->fs_super_bh);
+        reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_FATAL);
+        reiserfs_buffer_mkdirty (fs->fs_super_bh);
 	retval = EXIT_FATAL;
     } else if (fsck_data (fs)->check.fixable_corruptions) {
         /* fixable corruptions found */
@@ -1090,14 +1119,14 @@
 	    
 	    retval = EXIT_FIXABLE;
         }
-        set_sb_fs_state (fs->fs_ondisk_sb, FS_ERROR);
-        mark_buffer_dirty (fs->fs_super_bh);
+        reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_ERROR);
+        reiserfs_buffer_mkdirty (fs->fs_super_bh);
     } else {
+	fsck_stage_report (FS_CHECK, fs);
 	fsck_progress ("No corruptions found\n");
-	stage_report (5, fs);
 
 	if (fsck_mode(fs) != FSCK_CHECK) {
-		if (misc_device_mounted(fs->fs_file_name) == MF_RO) {
+		if (util_device_mounted(fs->fs_file_name) == MF_RO) {
 			reiserfs_warning(stderr, "\nThe partition is mounted ro. It is better "
 					 "to umount and mount it again.\n\n");
 			retval = EXIT_REBOOT;
@@ -1113,9 +1142,11 @@
         id_map_flush(proper_id_map (fs), fs);
         
     id_map_free(proper_id_map (fs));
-    clean_after_dma_check(fs->fs_dev, &dma_info);
-    reiserfs_close (fs);
-    close_rollback_file ();
+    util_device_dma_fini(fs->fs_dev, &dma_info);
+    reiserfs_fs_close (fs);
+    fs = NULL;
+    
+    fsck_rollback_fini();
     
     //clear_relocated_list();    
     
@@ -1132,7 +1163,11 @@
 {
     int fd;
 
-    fd = open (file_name, O_RDWR | O_LARGEFILE);
+    fd = open (file_name, O_RDWR 
+#ifdef O_LARGEFILE
+	       | O_LARGEFILE
+#endif
+	       );
 
     if (fd == -1) {
         reiserfs_warning (stderr, "reiserfsck: Cannot not open the fs "
@@ -1141,29 +1176,33 @@
         return -1;
     }
 
-    fs = getmem (sizeof (*fs));
+    fs = misc_getmem (sizeof (*fs));
     fs->fs_dev = fd;
     fs->fs_vp = data;
-    asprintf (&fs->fs_file_name, "%s", file_name);
+    strncpy(fs->fs_file_name, file_name, sizeof(fs->fs_file_name));
 
     if (data->journal_dev_name && 
 	strcmp (data->journal_dev_name, file_name)) 
     {
-	fs->fs_journal_dev = open (data->journal_dev_name, 
-	    O_RDWR | O_LARGEFILE);
+	fs->fs_journal_dev = open (data->journal_dev_name, O_RDWR 
+#ifdef O_LARGEFILE
+				   | O_LARGEFILE
+#endif
+				   );
+	
 	if (fs->fs_journal_dev == -1) {
 	    reiserfs_warning (stderr, "Cannot open journal partition\n");
      	    return -1;
 	}
     }
 
-    if (open_rollback_file (state_rollback_file(fs), fsck_data(fs)->log))
+    if (fsck_rollback_prep (state_rollback_file(fs), fsck_data(fs)->log))
         return -1;
 
     return 0;    	
 }
 
-static void fsck_rollback (reiserfs_filsys_t * fs) {
+static void fsck_perform_rollback (reiserfs_filsys_t * fs) {
     time_t t;
 
     time (&t);
@@ -1171,14 +1210,12 @@
 	           "reiserfsck --rollback-fsck-changes started at %s"
                    "###########\n", ctime (&t));
 
-    do_fsck_rollback (fs->fs_dev, fs->fs_journal_dev, fsck_progress_file (fs));
-    close_rollback_file ();
+    fsck_rollback (fs->fs_dev, fs->fs_journal_dev, fsck_progress_file (fs));
+    fsck_rollback_fini ();
 
     close (fs->fs_journal_dev);
-    free (fs->fs_file_name);
-    fs->fs_file_name = 0;
     close (fs->fs_dev);
-    freemem (fs);
+    misc_freemem (fs);
 
     time (&t);
     fsck_progress ("###########\n"
@@ -1193,21 +1230,9 @@
     char * file_name;
     struct fsck_data * data;
     struct rlimit rlim = {RLIM_INFINITY, RLIM_INFINITY};
-    char *width;
     int retval;
     int error;
     
-    width = getenv("COLUMNS");
-    if ( width )
-	screen_width = atoi(width);
-    
-    if (screen_width == 0)
-	screen_width = 80; // We default to 80 characters wide screen
-    screen_width--;
-    screen_savebuffer_len=screen_width;
-    screen_savebuffer=getmem(screen_width+1);
-    memset(screen_savebuffer,0,screen_savebuffer_len+1);
-    
     lost_found_dir_key.k2_dir_id = cpu_to_le32(lost_found_dir_key.k2_dir_id);
     lost_found_dir_key.k2_objectid = cpu_to_le32(lost_found_dir_key.k2_objectid);
     /* this is only needed (and works) when running under 2.4 on regular files */
@@ -1216,15 +1241,15 @@
 	    "with setrlimit: %s\n", strerror(errno));
     }
 
-    data = getmem (sizeof (struct fsck_data));
+    data = misc_getmem (sizeof (struct fsck_data));
 
     file_name = parse_options (data, argc, argv);
 
     if (data->mode != FSCK_AUTO)
-	print_banner ("reiserfsck");
+	util_print_banner ("reiserfsck");
 
     if (data->mode == DO_NOTHING) {
-	freemem (data);
+	misc_freemem (data);
 	exit(EXIT_OK);
     }
 
@@ -1260,8 +1285,8 @@
     	if (open_devices_for_rollback (file_name, data) == -1)
     	    exit(EXIT_OPER);
     } else {
-	fs = reiserfs_open (file_name, O_RDONLY, &error, data, 
-	    data->mode != FSCK_SB);
+	fs = reiserfs_fs_open (file_name, O_RDONLY, &error, data, 
+			       data->mode != FSCK_SB);
 		
 	if (error) {
 		reiserfs_exit(EXIT_OPER, "Failed to open the device "
@@ -1269,7 +1294,7 @@
 	} 
 	
 	if (data->mode != FSCK_SB) {
-	    if (no_reiserfs_found (fs)) {
+	    if (fs == NULL) {
 		reiserfs_exit(EXIT_OPER, "Failed to open the filesystem.\n\n"
 			      "If the partition table has not been changed, "
 			      "and the partition is\nvalid  and  it really  "
@@ -1278,7 +1303,7 @@
 			      "this utility with\n--rebuild-sb.\n");
 	    }
 	    if (fsck_skip_journal (fs) && 
-		!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb)) 
+		!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) 
 	    {
 		reiserfs_warning (stderr, "Filesystem with default journal found, "
 			"--no-journal-available is ignored\n");
@@ -1286,7 +1311,7 @@
 	    }
 	
 	    if (!fsck_skip_journal (fs)) {
-		retval = reiserfs_open_journal(fs, data->journal_dev_name, O_RDONLY);
+		retval = reiserfs_journal_open(fs, data->journal_dev_name, O_RDONLY);
 		
 		if (retval) {
 	            fsck_progress ("Failed to open the journal device (%s).\n", 
@@ -1296,13 +1321,13 @@
 			    fsck_progress ("Run --rebuild-sb to rebuild journal parameters.\n");
 		    }
 		    
-		    reiserfs_close (fs);
+		    reiserfs_fs_close (fs);
 		    exit(EXIT_OPER);
 	        }
 	    }
 	
 	    if (data->options & BADBLOCKS_FILE) {
-		if (create_badblock_bitmap (fs, badblocks_file) != 0) 
+		if (util_badblock_load (fs, badblocks_file) != 0) 
 		    exit(EXIT_OPER);
 	    }
 	    
@@ -1331,7 +1356,7 @@
 	break;
 
     case FSCK_ROLLBACK_CHANGES:
-	fsck_rollback (fs);
+	fsck_perform_rollback (fs);
  	break;
     case FSCK_CLEAN_ATTRIBUTES:
 	clean_attributes (fs);
diff --git a/utils/fsck/pass0.c b/utils/fsck/pass0.c
new file mode 100644
index 0000000..7659190
--- /dev/null
+++ b/utils/fsck/pass0.c
@@ -0,0 +1,2018 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+#include "misc/unaligned.h"
+#include "util/misc.h"
+#include "util/device.h"
+
+#include <assert.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <time.h>
+
+
+/* 
+ * Pass0 scans the used part of the partition. It creates two maps which will 
+ * be used on the pass 1. These are a map of nodes looking like leaves and 
+ * a map of "bad" unformatted nodes. After pass 0 we can detect unformatted 
+ * node pointers pointing to leaves. 
+ */
+
+
+/* leaves */
+reiserfs_bitmap_t * leaves_bitmap;
+
+#define pass0_block_mkleaf(block) \
+	reiserfs_bitmap_set_bit(leaves_bitmap, block)
+
+int pass0_block_isleaf(unsigned long block) {
+	return reiserfs_bitmap_test_bit(leaves_bitmap, block);
+}
+
+void pass0_block_clleaf(unsigned long block) {
+	reiserfs_bitmap_clear_bit(leaves_bitmap, block);
+}
+
+/* nodes which are referred to from only one extent item */
+reiserfs_bitmap_t * good_unfm_bitmap;
+#define pass0_block_mkgood_unfm(block)	\
+	reiserfs_bitmap_set_bit(good_unfm_bitmap, block)
+#define pass0_block_clgood_unfm(block)	\
+	reiserfs_bitmap_clear_bit(good_unfm_bitmap, block)
+
+int pass0_block_isgood_unfm(unsigned long block) {
+	return reiserfs_bitmap_test_bit(good_unfm_bitmap, block);
+}
+
+/* nodes which are referred to from more than one extent item */
+reiserfs_bitmap_t * bad_unfm_bitmap;
+#define pass0_block_mkbad_unfm(block)	\
+	reiserfs_bitmap_set_bit(bad_unfm_bitmap, block)
+#define pass0_block_clbad_unfm(block)	\
+	reiserfs_bitmap_clear_bit(bad_unfm_bitmap, block)
+
+int pass0_block_isbad_unfm(unsigned long block) {
+	return reiserfs_bitmap_test_bit(bad_unfm_bitmap, block);
+}
+
+static int correct_direct_item_offset (reiserfs_ih_t *ih, 
+				       reiserfs_filsys_t *fs) 
+{
+    __u64 offset;
+    __u64 len;
+    int format;
+
+    offset = reiserfs_key_get_off (&ih->ih_key);
+    format = reiserfs_key_format (&ih->ih_key);
+    
+    if (offset == 0)
+	return 0;
+    
+    if (format == KEY_FORMAT_2) {
+	if ((offset - 1) % 8 != 0)
+	    return 0;
+    } 
+
+    len = reiserfs_ih_get_len(ih) + offset - 1;
+    offset = MISC_DOWN(offset - 1, fs->fs_blocksize);
+    
+    if (reiserfs_policy_ext (len, len - offset, fs->fs_blocksize))
+	return 0;
+    
+    return 1;
+}
+
+/* bitmaps which are built on pass 0 and are used on pass 1 */
+static void fsck_pass0_aux_prep (reiserfs_filsys_t * fs)
+{
+    reiserfs_sb_t * sb;
+
+    sb = fs->fs_ondisk_sb;
+
+    /* bitmap of leaves found on the device */
+    leaves_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (sb));
+
+    good_unfm_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (sb));
+
+    bad_unfm_bitmap = reiserfs_bitmap_create (reiserfs_sb_get_blocks (sb));
+}
+
+void fsck_pass0_aux_fini (void) {
+    reiserfs_bitmap_delete (leaves_bitmap);
+    reiserfs_bitmap_delete (good_unfm_bitmap);
+    reiserfs_bitmap_delete (bad_unfm_bitmap);
+}
+
+
+/* register block some extent item points to */
+static void register_unfm (unsigned long block)
+{
+    if (!pass0_block_isgood_unfm (block) && 
+	!pass0_block_isbad_unfm (block)) 
+    {
+	/* this block was not pointed by other extent items yet */
+	pass0_block_mkgood_unfm (block);
+	return;
+    }
+
+    if (pass0_block_isgood_unfm (block)) {
+	/* block was pointed once already, unmark it in bitmap of good
+           unformatted nodes and mark in bitmap of bad pointers */
+	pass0_block_clgood_unfm (block);
+	pass0_block_mkbad_unfm (block);
+	return;
+    }
+
+    assert (pass0_block_isbad_unfm (block));
+}
+
+
+/* 'upper' item is correct if 'upper + 2' exists and its key is greater than
+   key of 'upper' */
+static int upper_correct (reiserfs_bh_t * bh, reiserfs_ih_t * upper,
+			  int upper_item_num)
+{
+    if (upper_item_num + 2 < reiserfs_node_items (bh)) {
+	if (reiserfs_key_comp (&upper->ih_key, &(upper + 2)->ih_key) != -1)
+	    /* item-num's item is out of order of order */
+	    return 0;
+	return 1;
+    }
+    
+    /* there is no item above the "bad pair" */
+    return 2;
+}
+
+
+/* 'lower' item is correct if 'lower - 2' exists and its key is smaller than
+   key of 'lower' */
+static int lower_correct (reiserfs_bh_t * bh, reiserfs_ih_t * lower,
+			  int lower_item_num)
+{
+    if (lower_item_num - 2 >= 0) {
+	if (reiserfs_key_comp (&(lower - 2)->ih_key, &lower->ih_key) != -1)
+	    return 0;
+	return 1;
+    }
+    return 2;
+}
+
+
+/* return 1 if something was changed */
+static int correct_key_format (reiserfs_ih_t * ih, int symlink) 
+{
+    int dirty = 0;
+
+    if (reiserfs_ih_stat (ih)) {
+	/* for stat data we have no way to check whether key format in item
+	   head matches to the key format found from the key directly */
+	if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1) {
+	    if (reiserfs_ih_get_format (ih) != KEY_FORMAT_1) {
+		/*fsck_log ("correct_key_format: ih key format of (%H) is "
+			    "set to format 1\n", ih);*/
+		    
+		reiserfs_ih_set_format (ih, KEY_FORMAT_1);
+		return 1;
+	    }
+	    return 0;
+	}
+	if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) {
+	    if (reiserfs_ih_get_format (ih) != KEY_FORMAT_2) {
+		/*fsck_log ("correct_key_format: ih key format of (%H) "
+			    "is set to format 2\n", ih);*/
+		reiserfs_ih_set_format (ih, KEY_FORMAT_2);
+		return 1;
+	    }
+	    return 0;
+	}
+	
+	misc_die ("stat_data item of the wrong length");
+    }
+    
+    if (symlink && (reiserfs_key_format(&ih->ih_key) != KEY_FORMAT_1)) {
+	/* All symlinks are of 3.5 format */
+	/*fsck_log ("correct_key_format: Symlink keys should be of 3.5 "
+		    "format. %k - fixed.\n", &ih->ih_key); */
+	reiserfs_key_set_sec(KEY_FORMAT_1, &ih->ih_key, 
+			     reiserfs_key_get_off(&ih->ih_key), 
+			     reiserfs_key_get_type(&ih->ih_key));
+    }
+	
+    if (reiserfs_key_format (&ih->ih_key) != reiserfs_ih_get_format (ih)) {
+	/*fsck_log ("correct_key_format: ih key format of (%H) is "
+		    "set to format found in the key\n", ih);*/
+	reiserfs_ih_set_format (ih, reiserfs_key_format (&ih->ih_key));
+	dirty = 1;
+    }
+    
+    return dirty;
+}
+
+static void hash_hits_init (reiserfs_filsys_t * fs)
+{
+    fsck_data (fs)->rebuild.hash_amount = REISERFS_HASH_LAST;
+    fsck_data (fs)->rebuild.hash_hits = misc_getmem (sizeof (unsigned long) * 
+		    fsck_data (fs)->rebuild.hash_amount);
+}
+
+
+static void add_hash_hit (reiserfs_filsys_t * fs, int hash_code)
+{
+    fsck_data (fs)->rebuild.hash_hits [hash_code] ++;
+}
+
+
+/* deh_location look reasonable, try to find name length. return 0 if
+   we failed */
+static int try_to_get_name_length (reiserfs_ih_t * ih, 
+				   reiserfs_deh_t * deh,
+				   int i)
+{
+    int len;
+
+    if (i == 0 || !reiserfs_deh_locbad (deh - 1)) {
+	len = reiserfs_direntry_name_len (ih, deh, i);
+	return (len > 0) ? len : 0;
+    }
+
+    /* previous entry had bad location so we had no way to find
+       name length */
+    return 0;
+}
+
+
+
+/* define this if you are using -t to debug recovering of corrupted directory
+   item */
+#define DEBUG_VERIFY_DENTRY
+#undef DEBUG_VERIFY_DENTRY
+
+
+/* check directory item and try to recover something */
+static int verify_directory_item (reiserfs_filsys_t * fs, 
+				  reiserfs_bh_t * bh,
+				  int item_num)
+{
+    reiserfs_ih_t * ih;
+    reiserfs_ih_t tmp;
+    char * item;
+    reiserfs_deh_t * deh;
+    char * name;
+    int name_len;
+    int bad, lost_found;
+    int i, j;
+    int dirty;
+    int hash_code;
+    int bad_locations;
+    int min_entry_size = 1;
+
+#ifdef DEBUG_VERIFY_DENTRY
+    char * direntries;
+#endif
+
+
+    ih = reiserfs_ih_at (bh, item_num);
+    item = reiserfs_item_by_ih (bh,ih);
+    deh = (reiserfs_deh_t *)item;
+
+    dirty = 0;
+    bad_locations = 0;
+ 
+    if ( (reiserfs_ih_get_entries (ih) > 
+	  (reiserfs_ih_get_len(ih) / (REISERFS_DEH_SIZE + min_entry_size))) ||
+          (reiserfs_ih_get_entries (ih) == 0))
+    {
+        reiserfs_ih_set_entries (ih, (int)reiserfs_ih_get_len(ih) / 
+			    (REISERFS_DEH_SIZE + min_entry_size));
+	
+        reiserfs_buffer_mkdirty (bh);
+    }
+
+    if (reiserfs_ih_get_entries (ih) == 0) {
+	reiserfs_leaf_delete_item (fs, bh, item_num);
+	return -1;
+    }
+
+
+    /* check deh_location */
+    for (i = 0; i < reiserfs_ih_get_entries (ih); i ++) {
+	/* silently fix deh_state */
+	if (reiserfs_deh_get_state (deh + i) != (1 << DEH_Visible2)) {
+	    reiserfs_deh_set_state (deh + i, (1 << DEH_Visible2));
+	    reiserfs_buffer_mkdirty (bh);
+	}
+	if (reiserfs_direntry_loc_check (deh + i, ih, !i))
+	    reiserfs_deh_set_locbad (deh + i);
+    }    
+
+#ifdef DEBUG_VERIFY_DENTRY
+    direntries = misc_getmem (ih_entry_count (ih) * sizeof (int));
+
+    printf ("Entries with bad locations within the directory: ");
+    for (i = 0; i < ih_entry_count (ih); i ++) {
+	if (reiserfs_deh_locbad (deh + i))
+	    printf ("%d ", i);
+    }
+    
+    printf ("\n");
+#endif /* DEBUG_VERIFY_DENTRY */
+
+
+    /* find entries names in which have mismatching deh_offset */
+    for (i = reiserfs_ih_get_entries (ih) - 1; i >= 0; i --) {
+	if (reiserfs_deh_bad (deh + i))
+	    /* bad location */
+	    continue;
+
+	if (i) {
+	    if (reiserfs_deh_get_loc (deh + i - 1) < 
+		reiserfs_deh_get_loc (deh + i))
+	    {
+		reiserfs_deh_set_locbad (deh + i - 1);
+	    }
+	}
+
+	name = reiserfs_deh_name (deh + i, i);
+	/* Although we found a name, we not always can get its length as
+           it depends on deh_location of previous entry. */
+	name_len = try_to_get_name_length (ih, deh + i, i);
+
+#ifdef DEBUG_VERIFY_DENTRY
+	if (name_len == 0)
+	    printf ("Trying to find the name length for %d-th entry\n", i);
+#endif /* DEBUG_VERIFY_DENTRY */
+	if (is_dot (name, name_len)) {
+	    if (i != 0)
+		fsck_log ("block %lu: item %d: \".\" must be the first entry, "
+			  "but it is the %d-th entry\n", bh->b_blocknr, 
+			  item_num, i);
+	    
+	    /* check and fix "." */
+	    
+	    if (reiserfs_deh_get_off (deh + i) != OFFSET_DOT) {
+		reiserfs_deh_set_off (deh + i, OFFSET_DOT);
+		reiserfs_buffer_mkdirty (bh);
+	    }
+	    /* "." must point to the directory it is in */
+/*
+	    if (reiserfs_key_comp2 (&(deh[i].deh2_dir_id), &(ih->ih_key))) {
+		fsck_log ("verify_direntry: block %lu, item %H has entry \".\" "
+			  "pointing to (%K) instead of (%K)\n", 
+			  bh->b_blocknr, ih,
+			  &(deh[i].deh2_dir_id), &(ih->ih_key));
+		reiserfs_deh_set_did (deh + i, reiserfs_key_get_did (&ih->ih_key));
+		reiserfs_deh_set_obid (deh + i, reiserfs_key_get_oid (&ih->ih_key));
+		reiserfs_buffer_mkdirty (bh);
+	    }
+*/
+	} else if (is_dot_dot (name, name_len)) {
+	    if (i != 1)
+		fsck_log ("block %lu: item %d: \"..\" is %d-th entry\n",
+			  bh->b_blocknr, item_num, i);
+	    
+	    /* check and fix ".." */
+	    if (reiserfs_deh_get_off (deh + i) != OFFSET_DOT_DOT) {
+		reiserfs_deh_set_off (deh + i, OFFSET_DOT_DOT);
+		reiserfs_buffer_mkdirty (bh);
+	    }
+	} else {
+	    int min_length, max_length;
+
+	    /* check other name */
+
+	    if (name_len == 0) {
+		/* we do not know the length of name - we will try to find it */
+		min_length = 1;
+		max_length = item + reiserfs_ih_get_len (ih) - name;
+	    } else
+		/* we kow name length, so we will try only one name length */
+		min_length = max_length = name_len;
+
+	    hash_code = 0;
+
+	    for (j = min_length; j <= max_length; j ++) {
+		hash_code = reiserfs_hash_find (name, j, 
+			reiserfs_deh_get_off(deh + i), 
+			reiserfs_sb_get_hash(fs->fs_ondisk_sb));
+		
+/*		add_hash_hit (fs, hash_code);*/
+		if (reiserfs_hash_func (hash_code) != 0) {
+		    /* deh_offset matches to some hash of the name */
+		    if (fsck_hash_defined (fs) && 
+			hash_code != reiserfs_hash_code (fs->hash)) 
+		    {
+			/* wrong hash selected - so we can skip this leaf */
+			return 1;
+		    }
+
+		    if (!name_len) {
+			fsck_log ("%s: block %lu, item %H: Found a name "
+				  "\"%.*s\" for %d-th entry matching to the "
+				  "hash %u.\n", __FUNCTION__, bh->b_blocknr, 
+				  ih, j, name, i, reiserfs_deh_get_off (deh + i));
+			
+			/* FIXME: if next byte is 0 we think that the name is 
+			   aligned to 8 byte boundary */
+			
+			if (i) {
+			    reiserfs_deh_set_loc (&deh[i - 1], 
+					      reiserfs_deh_get_loc (deh + i) +
+					      ((name[j] || fs->fs_format == 
+						REISERFS_FORMAT_3_5) ? j : 
+					       MISC_ROUND_UP (j)));
+			    
+			    reiserfs_deh_set_locok (deh + i - 1);
+			    reiserfs_buffer_mkdirty (bh);
+			}
+		    }
+		    
+		    break;
+		}
+	    }
+
+	    add_hash_hit (fs, hash_code);
+
+	    if (j == max_length + 1) {
+		/* deh_offset does not match to anything. it will be
+		   deleted for now, but maybe we could just fix a
+		   deh_offset if it is in ordeer */
+		reiserfs_deh_set_offbad (deh + i);
+	    }
+	}
+    } /* for */
+
+#ifdef DEBUG_VERIFY_DENTRY
+    printf ("Entries with mismatching hash: ");
+    for (i = 0; i < ih_entry_count (ih); i ++) {
+	if (reiserfs_deh_offbad (deh + i))
+	    printf ("%d ", i);
+    }
+    printf ("\n");
+#endif /* DEBUG_VERIFY_DENTRY */
+
+
+    /* correct deh_locations such that code cutting entries will not get
+       screwed up */
+    {
+	int prev_loc;
+	int loc_fixed;
+
+
+	prev_loc = reiserfs_ih_get_len (ih);
+	for (i = 0; i < reiserfs_ih_get_entries (ih); i ++) {
+	    loc_fixed = 0;
+	    if (reiserfs_deh_locbad (deh + i)) {
+		reiserfs_deh_set_loc (deh + i, prev_loc/* - 1*/);
+		reiserfs_buffer_mkdirty (bh);
+		loc_fixed = 1;
+	    } else {
+		if (reiserfs_deh_get_loc (deh + i) >= prev_loc) {
+		    reiserfs_deh_set_loc (deh + i, prev_loc/* - 1*/);
+		    reiserfs_buffer_mkdirty (bh);
+		    loc_fixed = 1;
+		}
+	    }
+
+	    prev_loc = reiserfs_deh_get_loc (deh + i);
+	    
+	    if (i == reiserfs_ih_get_entries (ih) - 1) {
+		/* last entry starts right after an array of direntry headers */
+		if (!reiserfs_deh_bad (deh + i) &&
+		    reiserfs_deh_get_loc (deh + i) != 
+		    (REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih))) 
+		{
+		    /* free space in the directory item */
+		    fsck_log ("%s: block %lu, item %H: Directory item has a "
+			      "free space - deleting\n", __FUNCTION__, 
+			      bh->b_blocknr, ih);
+		    
+		    reiserfs_leaf_delete_entry (fs, bh, item_num, 
+			    reiserfs_ih_get_entries (ih), 0);
+		}
+		
+		if (reiserfs_deh_get_loc (deh + i) != 
+		    (REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih))) 
+		{
+		    reiserfs_deh_set_loc (&deh[i], 
+			    (REISERFS_DEH_SIZE * reiserfs_ih_get_entries (ih)));
+		    loc_fixed = 1;
+		    reiserfs_buffer_mkdirty (bh);
+		}
+	    }
+
+#ifdef DEBUG_VERIFY_DENTRY
+	    if (loc_fixed)
+		direntries [i] = 1;
+#endif
+	} /* for */
+
+#ifdef DEBUG_VERIFY_DENTRY
+	printf ("Entries with fixed deh_locations: ");
+	for (i = 0; i < ih_entry_count (ih); i ++) {
+	    if (direntries [i])
+		printf ("%d ", i);
+	}
+	printf ("\n");
+#endif /* DEBUG_VERIFY_DENTRY */
+
+    }
+
+#ifdef DEBUG_VERIFY_DENTRY
+    printf (" N  location name\n");
+    for (i = 0; i < ih_entry_count (ih); i ++) {
+	if (reiserfs_deh_bad (deh + i) ||
+	    (i && reiserfs_deh_bad (deh + i - 1)) || /* previous entry marked bad */
+	    (i < ih_entry_count (ih) - 1 && reiserfs_deh_bad (deh + i + 1))) 
+	{
+	    /* next entry is marked bad */
+	    /* print only entries to be deleted and their nearest neighbors */
+	    printf ("%3d: %8d ", i, deh_location (deh + i));
+	    if (reiserfs_deh_bad (deh + i))
+		printf ("will be deleted\n");
+	    else
+		printf ("\"%.*s\"\n", 
+			reiserfs_direntry_name_len (ih, deh + i, i),
+			reiserfs_deh_name (deh + i, i));
+	}
+    }
+    
+#endif
+
+    bad = lost_found = 0;
+    tmp = *ih;
+
+    /* mark enries of /lost+found as bad */
+    deh = reiserfs_deh (bh, ih);
+    for (i = 0; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	unsigned int dirid, objectid;
+	char buf[REISERFS_NAME_MAX];
+
+	if (reiserfs_deh_bad (deh))
+	    continue;
+
+	buf[0] = '\0';
+	sprintf (buf, "%.*s", reiserfs_direntry_name_len (ih, deh, i), 
+		 reiserfs_deh_name (deh, i));
+	
+	if (sscanf (buf, "%d_%d", &dirid, &objectid) != 2)
+	    continue;
+	
+	if (reiserfs_deh_get_did (deh) != dirid || reiserfs_deh_get_obid (deh) != objectid)
+	    continue;
+	
+	/* entry in lost+found */
+//	printf ("%s - will be deleted\n", buf);
+	lost_found++;
+	reiserfs_deh_set_offbad (deh);
+    }
+
+    /* delete entries which are marked bad */
+    for (i = 0; i < reiserfs_ih_get_entries (ih); i ++) {
+	deh = reiserfs_deh (bh, ih) + i;
+	if (reiserfs_deh_bad (deh)) {
+	    bad ++;
+	    if (reiserfs_ih_get_entries (ih) == 1) {
+		reiserfs_leaf_delete_item (fs, bh, item_num);
+		
+		fsck_log ("%s: block %lu, item %H: All entries were deleted from "
+		      "the directory\n", __FUNCTION__, bh->b_blocknr, &tmp);
+		
+		return -1;
+	    } else {
+		reiserfs_leaf_delete_entry (fs, bh, item_num, i, 1);
+	    }
+	    i --;
+	}
+    }
+    
+    deh = reiserfs_deh (bh, ih);
+    if (reiserfs_key_get_off (&ih->ih_key) != reiserfs_deh_get_off (deh)) {
+	fsck_log ("verify_direntry: block %lu, item %H: Key's offset %k must "
+		  "match the directory's hash (%u) - changed.\n", bh->b_blocknr,
+		  ih, &ih->ih_key, reiserfs_deh_get_off (deh));
+	
+	reiserfs_key_set_off (reiserfs_key_format (&ih->ih_key), 
+				 &ih->ih_key, reiserfs_deh_get_off (deh));
+	
+	reiserfs_buffer_mkdirty (bh);
+    }
+    
+    if (bad > lost_found)
+	fsck_log ("pass0: block %lu, item %H: %d entries were deleted\n",
+		  bh->b_blocknr, &tmp, bad - lost_found);
+	
+    return 0;
+
+}
+
+
+static __inline__ int does_it_fit_into_dev (__u64 offset, __u64 fs_size) {
+/* 
+   Count of unformatted pointers :
+	offset / blocksize
+   Count of blocks to store them :
+	REISERFS_EXT_SIZE * offset / blocksize / REISERFS_ITEM_MAX
+   Size to store it :
+	blocksize * REISERFS_EXT_SIZE * offset / blocksize / REISERFS_ITEM_MAX
+*/
+
+   return ( REISERFS_EXT_SIZE * offset / REISERFS_ITEM_MAX(fs->fs_blocksize) < 
+	    fs_size) ? 1 : 0;
+}
+
+
+static int is_wrong_short_key (reiserfs_key_t * key) {
+    if (reiserfs_key_get_did (key) == 0 || 
+	reiserfs_key_get_oid (key) == 0 || 
+	reiserfs_key_get_oid (key) == 1 ||
+	reiserfs_key_get_did (key) == ~(__u32)0 || 
+	reiserfs_key_get_oid (key) == ~(__u32)0 ||
+	reiserfs_key_get_did (key) == reiserfs_key_get_oid (key) ||
+	/* the alloc=packing_groups used to allow dirid = 1
+	(reiserfs_key_get_did (key) == 1 && reiserfs_key_get_oid (key) != 2) || */
+	(reiserfs_key_get_did (key) != 1 && reiserfs_key_get_oid (key) == 2) )
+    {
+	return 1;
+    }
+
+    return 0;
+}
+
+/* do this on pass 0 with every leaf marked used */
+
+/* FIXME: we can improve fixing of broken keys: we can ssfe direct items 
+   which go after stat data and have broken keys */
+static void pass0_correct_leaf (reiserfs_filsys_t * fs,
+				reiserfs_bh_t * bh)
+{
+    int file_format = KEY_FORMAT_UNDEFINED;
+    reiserfs_ih_t * ih;
+    
+    __u32 * ind_item;
+    __u64 fs_size;
+    __u64 offset;
+    int symlnk = 0;
+    int bad_order;
+    
+    unsigned long unfm_ptr;
+//    unsigned int nr_items;
+    int i, j, nr_items;
+    int dirty = 0;
+
+    fsck_leaf_check_header(fs, bh);
+
+    /* Delete all safe links. */
+    for (i = reiserfs_nh_get_items (NODE_HEAD (bh)) - 1; i >= 0; i--) {
+	if (reiserfs_key_get_did (&reiserfs_ih_at (bh, i)->ih_key) == ~(__u32)0)
+	{
+	    reiserfs_leaf_delete_item (fs, bh, i);
+	    pass_0_stat(fs)->removed++;
+	}
+	
+	if (reiserfs_key_get_did (&reiserfs_ih_at (bh, i)->ih_key) == 
+	    REISERFS_BAD_DID && 
+	    reiserfs_key_get_oid (&reiserfs_ih_at (bh, i)->ih_key) == 
+	    REISERFS_BAD_OID) 
+	{
+	    reiserfs_leaf_delete_item (fs, bh, i);
+	    pass_0_stat(fs)->removed++;
+	}
+    }
+
+    fs_size = (__u64)fs->fs_blocksize * 
+	    reiserfs_sb_get_blocks (fs->fs_ondisk_sb);
+
+ start_again:
+
+    ih = reiserfs_ih_at (bh, 0);
+    bad_order = 0;
+    nr_items = reiserfs_nh_get_items (NODE_HEAD (bh));
+    for (i = 0; i < nr_items; i ++, ih ++) {
+	if (reiserfs_ih_ext(ih) && (reiserfs_ih_get_len (ih) % 4 != 0)) {
+	    reiserfs_key_set_type(reiserfs_ih_get_format(ih), 
+				  &ih->ih_key, TYPE_UNKNOWN);
+	    
+	    dirty = 1;
+	}
+	    
+        if (reiserfs_key_unkn (&ih->ih_key)) {
+            if ((reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) || 
+		(reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1)) 
+	    {
+                reiserfs_key_set_sec (KEY_FORMAT_1, &ih->ih_key, 
+				      OFFSET_SD, TYPE_STAT_DATA);
+		dirty = 1;
+                fsck_log("pass0: vpf-10100: block %lu, item (%d): Unknown item "
+			 "type of StatData size, type set to StatData %k\n", 
+			 bh->b_blocknr, i, &ih->ih_key);
+            } else {
+                fsck_log("pass0: vpf-10110: block %lu, item (%d): Unknown item "
+			 "type found %k - deleted\n", bh->b_blocknr, i, 
+			 &ih->ih_key);
+		
+                reiserfs_leaf_delete_item (fs, bh, i);
+		pass_0_stat(fs)->removed++;
+                goto start_again;
+            }
+        }
+
+	if (is_wrong_short_key (&ih->ih_key)) {
+	    /* sometimes stat datas get k_objectid==0 or k_dir_id==0 */
+	    
+/*	    if (i == (nr_items - 1)) {
+		
+		if (i == 0) {
+		    fsck_log ("block %lu: item %d: (%H) id equals 0\n",
+			      bh->b_blocknr, i, ih);
+		    return;
+		}
+		// delete last item 
+                fsck_log ("block %lu: item %d: (%H) id equals 0\n",
+			      bh->b_blocknr, i, ih);
+		reiserfs_leaf_delete_item (fs, bh, i - 1);
+		pass_0_stat(fs)->removed++;
+		return;
+	    }
+*/
+
+            /* FIXME:
+		18842 19034    0x1 EXT  (2)
+		19035 19035    0x0 SD   (0)
+		18842     1    0x1 EXT  (1)
+		18842     1 0x1001 DRCT (2)
+             */
+	    /* there is next item: if it is not stat data - take its k_dir_id
+               and k_objectid. if key order will be still wrong - the changed
+               item will be deleted */
+
+	    if (i && !reiserfs_ih_stat (ih)) {
+	        /* previous item has a wrong short_key */
+		fsck_log ("pass0: vpf-10120: block %lu: item %d: Wrong key %k, "
+			  "corrected to ", bh->b_blocknr, i, &ih->ih_key);
+		reiserfs_key_set_did (&ih->ih_key, 
+			reiserfs_key_get_did (&(ih - 1)->ih_key));
+		reiserfs_key_set_oid (&ih->ih_key, 
+			reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		
+		fsck_log ("%k\n", &ih->ih_key);
+		dirty = 1;
+	    } else if ((i < nr_items - 1) && !reiserfs_ih_stat (ih + 1)) {
+	        if (!is_wrong_short_key(&(ih + 1)->ih_key)) {
+		    fsck_log ("pass0: vpf-10130: block %lu: item %d: Wrong "
+			      "key %k, corrected to ", bh->b_blocknr, i, 
+			      &ih->ih_key);
+		    
+		    reiserfs_key_set_did (&ih->ih_key, 
+			    reiserfs_key_get_did (&(ih + 1)->ih_key));
+		    
+		    reiserfs_key_set_oid (&ih->ih_key, 
+			    reiserfs_key_get_oid (&(ih + 1)->ih_key));
+		    
+/*		    reiserfs_key_set_off (KEY_FORMAT_1, &ih->ih_key, 0);
+		    reiserfs_key_set_type (KEY_FORMAT_1, &ih->ih_key, 
+					   TYPE_STAT_DATA);*/
+		    fsck_log ("%k\n", &ih->ih_key);
+		    dirty = 1;
+		    goto start_again;
+		} else {
+	            fsck_log ("pass0: vpf-10140: block %lu: items %d and %d "
+			      "have bad short keys %k, %k, both deleted\n",
+			      bh->b_blocknr, i, i+1, &ih->ih_key, 
+			      &(ih + 1)->ih_key);
+		    
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		    pass_0_stat(fs)->removed += 2;
+		    goto start_again;
+		}
+	    } else {
+                fsck_log ("pass0: vpf-10150: block %lu: item %d: Wrong key "
+			  "%k, deleted\n", bh->b_blocknr, i, &ih->ih_key);
+		
+		reiserfs_leaf_delete_item (fs, bh, i);
+		pass_0_stat(fs)->removed++;
+		goto start_again;
+	    } 
+	}
+
+#if 0
+	if (i && i + 1 < nr_items) {
+            if (reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih) &&
+                !reiserfs_ih_direct (ih + 1) && !reiserfs_ih_stat (ih + 1)) {
+                /* i or i+1 item should be SD or i+1 should be direct item */
+                if ((reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE) || 
+		    (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1)) 
+		{
+                    /* make i as SD */
+                    fsck_log("pass0: vpf-10400: block %lu, item %d: Wrong "
+			     "order of items - change the type of the key %k "
+			     "to StatData\n",  bh->b_blocknr, i, &ih->ih_key);
+                    reiserfs_key_set_sec (KEY_FORMAT_1, &ih->ih_key, 
+					  OFFSET_SD, TYPE_STAT_DATA);
+		    dirty = 1;
+                } else if ((reiserfs_ih_get_len (ih+1) == REISERFS_SD_SIZE) || 
+			   (reiserfs_ih_get_len (ih+1) == REISERFS_SD_SIZE_V1)) 
+		{
+                    /* make i+1 as SD */
+                    fsck_log("pass0: vpf-10410: block %lu, item %d: Wrong "
+			     "order of items - change the type of the key %k "
+			     "to StatData\n", bh->b_blocknr, i + 1, 
+			     &(ih + 1)->ih_key);
+		    
+                    reiserfs_key_set_sec (KEY_FORMAT_1, &(ih + 1)->ih_key, 
+					  OFFSET_SD, TYPE_STAT_DATA);
+		    dirty = 1;
+                } else if (reiserfs_ih_ext(ih)) {
+                    fsck_log("pass0: vpf-10420: block %lu, item %d: Wrong "
+			     "order of items - change the type of the key %k "
+			     "to Direct\n", bh->b_blocknr, i+1, 
+			     &(ih + 1)->ih_key);
+		    
+                    reiserfs_key_set_type (reiserfs_ih_get_format(ih+1), 
+					   &(ih + 1)->ih_key, 
+					   TYPE_DIRECT);
+		    dirty = 1;
+                }
+            }
+        }
+#endif
+	if (i && ((reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih) &&
+		   (reiserfs_key_get_did (&(ih - 1)->ih_key) != 
+		    reiserfs_key_get_did (&ih->ih_key))) ||
+		  (reiserfs_ih_stat (ih) && 
+		   (reiserfs_key_get_did (&(ih - 1)->ih_key) >
+		    reiserfs_key_get_did (&ih->ih_key)))))
+        {
+            /* not the same dir_id of the same file or not increasing dir_id 
+	       of different files */
+            if ((i > 1) && reiserfs_key_get_did (&(ih - 2)->ih_key) == 
+		reiserfs_key_get_did (&(ih - 1)->ih_key)) 
+	    {
+                /* fix i-th */
+                if (!reiserfs_ih_stat (ih)) {
+                    fsck_log("pass0: vpf-10430: block %lu, item %d: Wrong "
+			     "order of items - change the dir_id of the key "
+			     "%k to %lu\n", bh->b_blocknr, i, &ih->ih_key, 
+			     reiserfs_key_get_did (&(ih - 1)->ih_key));
+		    
+		    reiserfs_key_set_did (&ih->ih_key, 
+				   reiserfs_key_get_did (&(ih - 1)->ih_key));
+		    
+		    dirty = 1;
+                } else if (i + 1 < nr_items) {
+                    fsck_log("pass0: vpf-10440: block %lu, item %d: Wrong "
+			     "order of items - change the dir_id of the key "
+			     "%k to %lu\n", bh->b_blocknr, i, &ih->ih_key, 
+			     reiserfs_key_get_did (&(ih + 1)->ih_key));
+		    
+		    reiserfs_key_set_did (&ih->ih_key, 
+			    reiserfs_key_get_did (&(ih + 1)->ih_key));
+		    dirty = 1;
+                }
+            } else if ((i + 1 < nr_items) && 
+		       reiserfs_key_get_did (&ih->ih_key) == 
+		       reiserfs_key_get_did (&(ih + 1)->ih_key)) 
+	    {
+                fsck_log("pass0: vpf-10450: block %lu, item %d: Wrong order of "
+			 "items - change the dir_id of the key %k to %lu\n",
+			 bh->b_blocknr, i - 1, &(ih - 1)->ih_key, 
+			 reiserfs_key_get_did (&ih->ih_key));
+		
+                /* fix (i - 1)-th */
+		reiserfs_key_set_did (&(ih - 1)->ih_key, 
+				      reiserfs_key_get_did (&ih->ih_key));
+		dirty = 1;
+            }	
+        }
+
+ 	if (i && i + 1 < nr_items) {
+      	    /* there is a previous and a next items */
+	    if ((reiserfs_key_get_did (&(ih - 1)->ih_key) == 
+		 reiserfs_key_get_did (&(ih + 1)->ih_key)) &&
+		(reiserfs_key_get_did (&(ih - 1)->ih_key) != 
+		 reiserfs_key_get_did (&ih->ih_key)))
+	    {
+                fsck_log("pass0: vpf-10460: block %lu, item %d: Wrong order of "
+			 "items - change the dir_id of the key %k to %lu\n",
+			 bh->b_blocknr, i, &ih->ih_key, 
+			 reiserfs_key_get_did (&(ih - 1)->ih_key));
+		
+		reiserfs_key_set_did (&ih->ih_key, reiserfs_key_get_did (&(ih - 1)->ih_key));
+		dirty = 1;
+            }
+
+	    if ((reiserfs_key_get_oid (&(ih - 1)->ih_key) == 
+		 reiserfs_key_get_oid (&(ih + 1)->ih_key)) &&
+		(reiserfs_key_get_oid (&(ih - 1)->ih_key) != 
+		 reiserfs_key_get_oid (&ih->ih_key)))
+	    {
+		fsck_log("pass0: vpf-10470: block %lu, item %d: Wrong "
+			 "order of items - change the object_id of the "
+			 "key %k to %lu\n",	bh->b_blocknr, i, &ih->ih_key,
+			 reiserfs_key_get_oid (&(ih - 1)->ih_key));
+
+		reiserfs_key_set_oid (&ih->ih_key, 
+				      reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		dirty = 1;
+	    }
+
+            if (reiserfs_ih_stat (ih - 1) && 
+		(reiserfs_ih_ext (ih) && reiserfs_ih_direct (ih + 1)))
+	    {
+		
+	    	if ((reiserfs_key_get_oid (&(ih - 1)->ih_key) == 
+		     reiserfs_key_get_oid (&ih->ih_key)) &&
+		    (reiserfs_key_get_oid (&(ih - 1)->ih_key) != 
+		     reiserfs_key_get_oid (&(ih + 1)->ih_key)))
+            	{
+		    fsck_log("pass0: vpf-10480: block %lu, item %d: Wrong "
+			     "order of items - change the object_id of the "
+			     "key %k to %lu\n", bh->b_blocknr, i + 1, 
+			     &(ih+1)->ih_key, 
+			     reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		    
+		    reiserfs_key_set_oid (&(ih + 1)->ih_key, 
+				      reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		    dirty = 1;
+		}
+		
+	    	if ((reiserfs_key_get_oid (&ih->ih_key) == 
+		     reiserfs_key_get_oid (&(ih + 1)->ih_key)) &&
+		    (reiserfs_key_get_oid (&(ih - 1)->ih_key) != 
+		     reiserfs_key_get_oid (&(ih + 1)->ih_key)))
+            	{
+		    fsck_log("pass0: vpf-10490: block %lu, item %d: Wrong "
+			     "order of items - change the object_id of the "
+			     "key %k to %lu\n", bh->b_blocknr, i - 1, 
+			     &(ih-1)->ih_key, 
+			     reiserfs_key_get_oid (&(ih + 1)->ih_key));
+		    
+		    reiserfs_key_set_oid (&(ih - 1)->ih_key, 
+				      reiserfs_key_get_oid (&(ih + 1)->ih_key));
+		    dirty = 1;
+		}
+		
+		if ((reiserfs_key_get_did (&(ih - 1)->ih_key) == 
+		     reiserfs_key_get_did (&ih->ih_key)) &&
+		    (reiserfs_key_get_did (&(ih - 1)->ih_key) != 
+		     reiserfs_key_get_did (&(ih + 1)->ih_key)))
+	    	{
+		    fsck_log("pass0: vpf-10500: block %lu, item %d: Wrong "
+			     "order of items - change the dir_id of the key "
+			     "%k to %lu\n", bh->b_blocknr, i + 1, 
+			     &(ih+1)->ih_key,
+			     reiserfs_key_get_did (&(ih - 1)->ih_key));
+		    reiserfs_key_set_did (&(ih + 1)->ih_key, 
+				   reiserfs_key_get_did (&(ih - 1)->ih_key));
+		    dirty = 1;
+		}
+		
+		if ((reiserfs_key_get_did (&ih->ih_key) == 
+		     reiserfs_key_get_did (&(ih + 1)->ih_key)) &&
+		    (reiserfs_key_get_did (&(ih - 1)->ih_key) != 
+		     reiserfs_key_get_did (&(ih + 1)->ih_key)))
+	    	{
+		    fsck_log("pass0: vpf-10510: block %lu, item %d: Wrong "
+			     "order of items - change the dir_id of the key %k "
+			     "to %lu\n", bh->b_blocknr, i - 1, &(ih-1)->ih_key, 
+			     reiserfs_key_get_did (&(ih + 1)->ih_key));
+		    
+		    reiserfs_key_set_did (&(ih - 1)->ih_key, 
+				   reiserfs_key_get_did (&(ih + 1)->ih_key));
+		    
+		    dirty = 1;
+		}
+            }
+     	}
+
+	if (i && reiserfs_ih_stat (ih) &&
+	    reiserfs_key_get_did (&(ih - 1)->ih_key) == 
+	    reiserfs_key_get_did (&ih->ih_key) &&
+	    reiserfs_key_get_oid (&(ih - 1)->ih_key) >= 
+	    reiserfs_key_get_oid (&ih->ih_key)) 
+	{
+	    if ((i + 1 < nr_items) && !reiserfs_ih_stat (ih + 1)) {
+         	if (reiserfs_key_get_oid (&(ih - 1)->ih_key) < 
+		    reiserfs_key_get_oid (&(ih + 1)->ih_key)) 
+		{
+		    fsck_log("pass0: vpf-10520: block %lu, item %d: Wrong "
+			     "order of items - change the object_id of the key "
+			     "%k to %lu\n", bh->b_blocknr, i - 1, 
+			     &(ih-1)->ih_key, 
+			     reiserfs_key_get_oid (&(ih + 1)->ih_key));
+		    
+		    reiserfs_key_set_oid (&ih->ih_key, 
+				      reiserfs_key_get_oid (&(ih + 1)->ih_key));
+		    
+		    dirty = 1;
+		}
+	    }
+	}
+
+        if (i && reiserfs_ih_stat (ih - 1) && 
+	    !reiserfs_ih_stat (ih) &&
+	    (reiserfs_key_get_oid (&(ih - 1)->ih_key) != 
+	     reiserfs_key_get_oid (&ih->ih_key)))
+        {
+            int err = 0;
+            if (i > 1) {
+                if (reiserfs_key_comp2 (&(ih - 2)->ih_key, 
+					&(ih - 1)->ih_key) != -1)
+		{
+                    misc_set_bit (1, &err);
+		}
+		
+                if (reiserfs_key_comp2 (&(ih - 2)->ih_key, 
+					&ih->ih_key) != -1)
+		{
+                    misc_set_bit (2, &err);
+		}
+            }
+            if (i + 1 < nr_items) {
+                if (reiserfs_key_comp2 (&(ih - 1)->ih_key, 
+					&(ih + 1)->ih_key) != -1)
+		{
+                    misc_set_bit (3, &err);
+		}
+		
+                if (reiserfs_key_comp2 (&ih->ih_key, 
+					&(ih + 1)->ih_key) != -1)
+		{
+                    misc_set_bit (4, &err);
+		}
+            }
+/*
+            if ((test_bit (1, err) || test_bit (3, err)) &&
+		(test_bit (2, err) || test_bit (4, err))) {
+      		// thera are no problem-free keys, delete them both
+                reiserfs_leaf_delete_item (fs, bh, i - 1);
+                reiserfs_leaf_delete_item (fs, bh, i - 1);
+		pass_0_stat(fs)->removed += 2;
+                goto start_again;
+      	    }
+*/
+            if (!misc_test_bit (1, &err) && !misc_test_bit (3, &err) &&
+		!misc_test_bit (2, &err) && !misc_test_bit (4, &err)) 
+	    {
+      		if (i <= 1) {
+            	    /* take bigger */
+                    if (reiserfs_key_comp2 (&(ih - 1)->ih_key, 
+					    &ih->ih_key) == 1) 
+		    {
+			fsck_log("pass0: vpf-10530: block %lu, item %d: Wrong "
+				 "order of items - change the object_id of the "
+				 "key %k to %lu\n", 
+				 bh->b_blocknr, i, &ih->ih_key, 
+				 reiserfs_key_get_oid (&(ih - 1)->ih_key));
+			
+			reiserfs_key_set_oid (&ih->ih_key, 
+					  reiserfs_key_get_oid (&(ih - 1)->ih_key));
+                    } else {
+			fsck_log("pass0: vpf-10540: block %lu, item %d: Wrong "
+				 "order of items - change the object_id of the "
+				 "key %k to %lu\n", bh->b_blocknr, i - 1, 
+				 &(ih - 1)->ih_key, 
+				 reiserfs_key_get_oid (&ih->ih_key));
+			
+                        reiserfs_key_set_oid (&(ih - 1)->ih_key, 
+					  reiserfs_key_get_oid (&ih->ih_key));
+		    }
+            	} else {
+                    /* take smaller */
+                    if (reiserfs_key_comp2 (&(ih - 1)->ih_key, 
+					    &ih->ih_key) == 1)
+		    {
+			fsck_log("pass0: vpf-10550: block %lu, item %d: Wrong "
+				 "order of items - change the object_id of the "
+				 "key %k to %lu\n", 
+				 bh->b_blocknr, i - 1, &(ih - 1)->ih_key, 
+				 reiserfs_key_get_oid (&ih->ih_key));
+			
+                        reiserfs_key_set_oid (&(ih - 1)->ih_key, 
+					  reiserfs_key_get_oid (&ih->ih_key));
+                    } else {
+			fsck_log("pass0: vpf-10560: block %lu, item %d: Wrong "
+				 "order of items - change the object_id of the "
+				 "key %k to %lu\n", 
+				 bh->b_blocknr, i, &ih->ih_key, 
+				 reiserfs_key_get_oid (&(ih - 1)->ih_key));
+			
+			reiserfs_key_set_oid (&ih->ih_key, 
+					  reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		    }
+                }
+		
+		dirty = 1;
+	    } else if (!misc_test_bit (1, &err) && !misc_test_bit (3, &err)) {
+      		/* take i - 1 */
+		fsck_log("pass0: vpf-10590: block %lu, item %d: Wrong order "
+			 "of items - change the object_id of the key %k to "
+			 "%lu\n", bh->b_blocknr, i, &ih->ih_key, 
+			 reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		
+		reiserfs_key_set_oid (&ih->ih_key, 
+				  reiserfs_key_get_oid (&(ih - 1)->ih_key));
+		
+		dirty = 1;
+ 	    } else if (!misc_test_bit (2, &err) && !misc_test_bit (4, &err)) {
+      		/* take i */
+		fsck_log("pass0: vpf-10600: block %lu, item %d: Wrong order "
+			 "of items - change the object_id of the key %k to "
+			 "%lu\n", bh->b_blocknr, i - 1, &(ih - 1)->ih_key, 
+			 reiserfs_key_get_oid (&ih->ih_key));
+		
+                reiserfs_key_set_oid (&(ih - 1)->ih_key, 
+				  reiserfs_key_get_oid (&ih->ih_key));
+		
+		dirty = 1;
+	    }
+        }
+
+	/* this recovers corruptions like the below: 
+	   1774 1732 0 0
+	   116262638 1732 1 3
+	   1774 1736 0 0 */
+	if (i && reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih)) {
+	    if (reiserfs_key_get_oid (&ih->ih_key) != 
+		reiserfs_key_get_oid (&(ih - 1)->ih_key) ||
+		reiserfs_key_get_did (&ih->ih_key) != 
+		reiserfs_key_get_did (&(ih - 1)->ih_key)) 
+	    {
+		fsck_log ("pass0: vpf-10170: block %lu: item %d: Wrong "
+			  "order of items - the item \n\t%H fixed to ", 
+			  bh->b_blocknr, i, ih);
+		
+		reiserfs_key_set_did (&ih->ih_key, 
+				      reiserfs_key_get_did (&(ih - 1)->ih_key));
+		reiserfs_key_set_oid (&ih->ih_key, 
+				      reiserfs_key_get_oid (&(ih - 1)->ih_key));
+
+		dirty = 1;
+		fsck_log ("\n\t%H\n", ih);
+	    }
+#if 0
+	    if (!reiserfs_ih_dir (ih) && 
+		reiserfs_key_get_off (&ih->ih_key) != 1)
+	    {
+		fsck_log ("pass0: vpf-10170: block %lu: item %d: Wrong "
+			  "offset of the item\n\t%H which follows a StatDtat "
+			  "item, fixed to 1", bh->b_blocknr, i, ih);
+		
+		if (reiserfs_ih_get_len (ih - 1) == REISERFS_SD_SIZE) {
+		    /* stat data is new, therefore this item is new too */
+		    reiserfs_key_set_off (KEY_FORMAT_2, &(ih->ih_key), 1);
+		    if ((reiserfs_ih_get_entries (ih) != 0xffff) && 
+			(reiserfs_ih_get_len (ih) % 4 == 0))
+		    {
+			reiserfs_key_set_type (KEY_FORMAT_2, 
+					       &(ih->ih_key), 
+					       TYPE_EXTENT);
+		    } else {
+			reiserfs_key_set_type (KEY_FORMAT_2, 
+					       &(ih->ih_key), 
+					       TYPE_DIRECT);
+		    }
+
+		    reiserfs_ih_set_format (ih, KEY_FORMAT_2);
+		} else {
+		    /* stat data is old, therefore this item is old too */
+		    reiserfs_key_set_off(KEY_FORMAT_1, &(ih->ih_key), 1);
+		    if ((reiserfs_ih_get_entries (ih) != 0xffff) && 
+			(reiserfs_ih_get_len (ih) % 4 == 0))
+		    {
+			reiserfs_key_set_type (KEY_FORMAT_1, 
+					       &(ih->ih_key), 
+					       TYPE_EXTENT);
+		    } else {
+			reiserfs_key_set_type (KEY_FORMAT_1, 
+					       &(ih->ih_key), 
+					       TYPE_DIRECT);
+			reiserfs_ih_set_free (ih, 0xffff);
+		    }
+		    reiserfs_ih_set_format (ih, KEY_FORMAT_1);
+		}
+	    }
+#endif
+	}
+
+	/* FIXME: corruptions like:
+	   56702 66802 1 2
+	   56702 65536 0 0
+	   56702 66803 1 2
+	   do not get recovered (both last items will be deleted) */
+	
+	/* delete item if it is not in correct order of object items */
+	if (i && reiserfs_key_comp2 (&ih->ih_key, &(ih - 1)->ih_key) &&
+	    !reiserfs_ih_stat (ih)) {
+	    fsck_log ("pass0: vpf-10180: block %lu: item %d: The item %k, "
+		      "which follows non StatData item %k, is deleted\n",
+		      bh->b_blocknr, i, &ih->ih_key, &(ih - 1)->ih_key);
+	    reiserfs_leaf_delete_item (fs, bh, i);
+	    pass_0_stat(fs)->removed++;
+	    goto start_again;
+	}
+	
+	if (reiserfs_ih_stat (ih)) {
+            if (reiserfs_key_get_off (&ih->ih_key) != 0) {
+                reiserfs_key_set_off(KEY_FORMAT_1, &ih->ih_key, 0);
+                dirty = 1;
+            }
+	} else if (!reiserfs_ih_dir (ih)) {
+	    int format;
+
+	    format = reiserfs_key_format(&ih->ih_key);
+	    /* not SD, not direntry */
+            if (i && reiserfs_key_comp2 (&(ih - 1)->ih_key, 
+					 &ih->ih_key) == 0) 
+	    {
+                if (reiserfs_ih_stat (ih - 1)) {
+        	    if (reiserfs_key_get_off (&ih->ih_key) != 1) {
+                        reiserfs_key_set_off(format, &ih->ih_key, 1);
+                        dirty = 1;
+                    }
+                } else if (!reiserfs_ih_dir (ih - 1)) {
+		    /* Both @(ih-1) and @ih are not SD not DIR items. */
+        	    if (reiserfs_key_get_off (&ih->ih_key) < 
+        	        reiserfs_key_get_off(&(ih - 1)->ih_key) + 
+			reiserfs_leaf_ibytes(ih - 1, fs->fs_blocksize))
+        	    {
+                        fsck_log("pass0: vpf-10250: block %lu, item %d: The "
+				 "item %k with wrong offset, fixed to %llu\n",
+				 bh->b_blocknr, i, &ih->ih_key,
+				 reiserfs_key_get_off(&(ih - 1)->ih_key) +
+				 reiserfs_ext_count (ih - 1) * fs->fs_blocksize);
+
+                        reiserfs_key_set_off(
+				format, &ih->ih_key,
+				reiserfs_key_get_off(&(ih - 1)->ih_key) +
+				reiserfs_ext_count (ih - 1) * fs->fs_blocksize);
+                        dirty = 1;
+        	    }
+                } else {
+                    /* if extent item or not the first direct item in leaf */
+                    fsck_log("pass0: vpf-10250: block %lu, item %d: The item "
+			     "%k with wrong type is deleted\n", bh->b_blocknr, 
+			     i, &ih->ih_key);
+		    
+                    reiserfs_leaf_delete_item (fs, bh, i);
+		    pass_0_stat(fs)->removed++;
+                    goto start_again;
+                }
+	    } else {
+		/*first item in the node or first item of the file */
+  		if (i) {
+        	    /* first item of the file, but not SD - delete */
+		    fsck_log("pass0: vpf-10190: block %lu, item %d: The item "
+			     "%k, which follows non StatData item %k, is "
+			     "deleted\n", bh->b_blocknr, i, &ih->ih_key, 
+			     &(ih - 1)->ih_key );
+		    
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		    pass_0_stat(fs)->removed++;
+		    goto start_again;
+        	}
+	    }
+
+	    /* extent or direct is the first in the leaf */
+	    offset = (__u64)reiserfs_key_get_off (&ih->ih_key);
+	    if (reiserfs_ih_ext (ih)) {
+		if (offset % fs->fs_blocksize != 1) {
+		    fsck_log("pass0: vpf-10200: block %lu, item %d: The "
+			     "item %k with wrong offset is deleted\n",
+			     bh->b_blocknr, i, &ih->ih_key);
+			
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		    pass_0_stat(fs)->removed++;
+		    goto start_again;
+		}
+	    }
+	    
+	    /* Check the lenght of the direct item; offset should 
+	       be ok already. */
+	    if (reiserfs_ih_direct (ih) && 
+		!correct_direct_item_offset(ih, fs)) 
+	    {
+		fsck_log("pass0: vpf-10700: block %lu, item %d: "
+			 "The item with wrong offset or length "
+			 "found %k, len % lu - deleted\n", 
+			 bh->b_blocknr, i, &ih->ih_key, 
+			 reiserfs_ih_get_len (ih));
+
+		reiserfs_leaf_delete_item (fs, bh, i);
+		pass_0_stat(fs)->removed++;
+		goto start_again;
+	    }
+
+	    offset += reiserfs_leaf_ibytes (ih, fs->fs_blocksize);
+	    if (!does_it_fit_into_dev (offset, fs_size) || 
+		(format == KEY_FORMAT_1 && offset >= (1ull << 32)) ||
+		(format == KEY_FORMAT_2 && offset >= (1ull << 60)))
+	    {
+		fsck_log("pass0: vpf-10230: block %lu, item %d: The item "
+			 "offset is is too big %k - deleted\n",
+			 bh->b_blocknr, i, &ih->ih_key);
+		reiserfs_leaf_delete_item (fs, bh, i);
+		pass_0_stat(fs)->removed++;
+		goto start_again;
+	    }
+        }
+        
+	if (i &&  reiserfs_key_comp (&(ih - 1)->ih_key, &ih->ih_key) != -1) {
+	    /* previous item has key not smaller than the key of currect item */
+	    if (reiserfs_ih_stat (ih - 1) && !reiserfs_ih_stat (ih)) {
+		/* fix stat data key such as if it was stat data of that item */
+		fsck_log ("pass0: block %lu, items %d, %d: Wrong order of "
+			  "items - make the StatData item %k of the file %k\n",
+		    bh->b_blocknr, i - 1, i, &(ih - 1)->ih_key, &ih->ih_key);
+		
+		reiserfs_key_set_did (&(ih - 1)->ih_key, 
+				      reiserfs_key_get_did (&ih->ih_key));
+		
+		reiserfs_key_set_oid (&(ih - 1)->ih_key, 
+				      reiserfs_key_get_oid (&ih->ih_key));
+		
+		reiserfs_key_set_off (KEY_FORMAT_1, &(ih - 1)->ih_key, 0);
+		
+		reiserfs_key_set_type (KEY_FORMAT_1, 
+				       &(ih - 1)->ih_key, 
+				       TYPE_STAT_DATA);
+		dirty = 1;
+	    } else {
+		/* ok, we have to delete one of these two - decide which one */
+		int retval;
+
+		/* something will be deleted */
+		dirty = 1;
+		retval = upper_correct (bh, ih - 1, i - 1);
+		switch (retval) {
+		case 0:
+		    /* delete upper item */
+		    fsck_log ("pass0: block %lu, item %d (upper): Item %k is "
+			      "out of order - deleted\n", bh->b_blocknr, i - 1,
+			      &(ih - 1)->ih_key);
+		    
+		    reiserfs_leaf_delete_item (fs, bh, i - 1);
+		    pass_0_stat(fs)->removed++;
+		    goto start_again;
+
+		case 1:
+		    /* delete lower item */
+		    fsck_log ("pass0: block %lu, item %d (lower): Item %k is "
+			      "out of order - deleted\n", bh->b_blocknr, i, 
+			      &ih->ih_key);
+		    
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		    pass_0_stat(fs)->removed++;
+		    goto start_again;
+
+		default:
+		    /* upper item was the first item of a node */
+		    /* to make gcc 3.2 do not sware here */;
+		}
+
+		retval = lower_correct (bh, ih, i);
+		switch (retval) {
+		case 0:
+		    /* delete lower item */
+		    fsck_log ("pass0: block %lu, item %d (lower): Item %k is "
+			      "out of order - deleted\n", bh->b_blocknr, i, 
+			      &ih->ih_key);
+		    
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		    pass_0_stat(fs)->removed++;
+		    goto start_again;
+
+		case 1:
+		    /* delete upper item */
+		    fsck_log ("pass0: block %lu, %d (upper): Item %k is "
+			      "out of order - deleted\n", bh->b_blocknr, 
+			      i - 1, &(ih - 1)->ih_key);
+		    
+		    reiserfs_leaf_delete_item (fs, bh, i - 1);
+		    pass_0_stat(fs)->removed++;
+		    goto start_again;
+
+		default:
+		    /* only 2 items in the node, how to decide what to delete,
+		       go and ask user */
+		    /* to make gcc 3.2 do not sware here */;
+		}
+		
+		fsck_log ("pass0: block %lu, items %d and %d: Which of these "
+			  "items looks better (the other will be deleted.)?\n"
+			  "%k\n%k\n", bh->b_blocknr, i-1, i, &(ih - 1)->ih_key,
+			  &ih->ih_key);
+		
+		if (fsck_info_ask (fs, "1 or 2?", "1\n", 1)) {
+		    reiserfs_leaf_delete_item (fs, bh, i - 1);
+		} else {
+		    reiserfs_leaf_delete_item (fs, bh, i);
+		}
+
+		pass_0_stat(fs)->removed++;
+		goto start_again;
+	    }
+	}
+
+	if (reiserfs_ih_stat (ih) && 
+	    (reiserfs_ih_get_len (ih) != REISERFS_SD_SIZE &&
+	     reiserfs_ih_get_len (ih) != REISERFS_SD_SIZE_V1))
+	{
+	    fsck_log ("pass0: block %lu, item %d: StatData item of wrong "
+		      "length found %H - deleted\n", bh->b_blocknr, i, ih);
+	    reiserfs_leaf_delete_item (fs, bh, i);
+	    pass_0_stat(fs)->removed++;
+	    goto start_again;
+	}
+
+	dirty += correct_key_format (ih, symlnk);
+	
+	if (reiserfs_ih_stat (ih)) {
+	    __u16 mode;
+
+            file_format = reiserfs_ih_get_format (ih);
+	
+	    reiserfs_stat_get_mode (ih, reiserfs_item_at(bh,i), &mode);
+            symlnk = ( S_ISLNK(mode) ? 1 : 0);
+	    ;/*correct_stat_data (fs, bh, i);*/
+        } else if ( !reiserfs_ih_dir(ih) && !symlnk &&
+        	    (file_format != KEY_FORMAT_UNDEFINED) &&
+        	    (file_format != reiserfs_ih_get_format (ih)))
+        {
+            fsck_log("pass0: vpf-10240: block %lu, item (%d): Item %k, which "
+		     "format (%d) is not equal to StatData format (%d), is "
+		     "deleted\n", bh->b_blocknr, i, &ih->ih_key, 
+		     reiserfs_ih_get_format(ih), file_format);
+	    
+            reiserfs_leaf_delete_item (fs, bh, i);
+	    pass_0_stat(fs)->removed++;
+            goto start_again;
+        } else {
+	    file_format = KEY_FORMAT_UNDEFINED;
+	    symlnk = 0;
+	}
+
+
+	if (i && reiserfs_ih_stat (ih - 1) && 
+	    !reiserfs_key_comp2 (&ih->ih_key, &(ih - 1)->ih_key)) 
+	{
+	    __u16 mode;
+
+	    reiserfs_stat_get_mode (ih - 1, 
+				    reiserfs_item_by_ih (bh, ih - 1), 
+				    &mode);
+	    
+	    if (not_a_directory (reiserfs_item_by_ih (bh, ih - 1)) && 
+		reiserfs_ih_dir (ih)) 
+	    {
+		/* make SD mode SD of dir */
+		fsck_log ("pass0: block %lu, item %d: Not the directory %K has "
+			  "the wrong mode (%M), corrected to ",
+			  bh->b_blocknr, i, &ih->ih_key, mode);
+		mode &= ~S_IFMT;
+		mode |= S_IFDIR;
+		fsck_log ("(%M)\n", mode);
+		reiserfs_stat_set_mode (ih - 1, 
+					reiserfs_item_by_ih (bh, ih - 1), 
+					&mode);
+		dirty = 1;
+	    } else if (!not_a_directory (reiserfs_item_by_ih (bh, ih - 1)) && 
+		       !reiserfs_ih_dir (ih)) 
+	    {
+		/* make SD mode SD of regular file */
+		fsck_log ("pass0: block %lu, item %d: the directory %K "
+			  "has the wrong mode (%M), corrected to ",
+			  bh->b_blocknr, i, &ih->ih_key, mode);
+		mode &= ~S_IFMT;
+		mode |= S_IFREG;
+		fsck_log ("(%M)\n", mode);
+		reiserfs_stat_set_mode (ih - 1, 
+					reiserfs_item_by_ih (bh, ih - 1), 
+					&mode);
+		dirty = 1;
+	    }
+#if 0
+	    if (not_a_regfile (reiserfs_item_by_ih (bh, ih - 1)) && 
+		reiserfs_ih_ext (ih)) 
+	    {
+		fsck_log ("pass0: block %lu, item %d: The file %K has the "
+			  "wrong mode (%M), corrected to ", bh->b_blocknr, i,
+			  &ih->ih_key, mode);
+		mode &= ~S_IFMT;
+		mode |= S_IFREG;
+		fsck_log ("(%M)\n", mode);
+		reiserfs_stat_set_mode (ih - 1, 
+					reiserfs_item_by_ih (bh, ih - 1), 
+					&mode);
+		dirty = 1;
+	    }
+#endif
+	}
+
+	if (reiserfs_ih_dir (ih)) {
+	    j = verify_directory_item (fs, bh, i);
+	
+	    if (j == 1) {
+	        /* wrong hash, skip the leaf */
+		pass_0_stat (fs)->too_old_leaves ++;
+		reiserfs_buffer_mkclean (bh);
+		return;
+	    } else if (j == -1) {
+		/* item was deleted */
+		goto start_again;
+	    }
+	    continue;
+	}
+
+	/*DEBUG*/
+        if (!reiserfs_ih_stat (ih) && 
+	    reiserfs_key_get_off (&ih->ih_key) == 0)
+	{
+            reiserfs_panic ("block %lu, item %d: Zero offset can have "
+			    "StatData items only, but found %k\n", 
+			    bh->b_blocknr, i, &ih->ih_key);
+	}
+
+	if (!reiserfs_ih_ext (ih))
+	    continue;
+	
+	ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih);
+	for (j = 0; j < (int)reiserfs_ext_count (ih); j ++) {
+	    unfm_ptr = d32_get (ind_item, j);
+	    if (!unfm_ptr)
+		continue;
+
+	    if ((reiserfs_fs_block(fs, unfm_ptr) != BT_UNKNOWN) ||
+		(fs->fs_badblocks_bm && 
+		 reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, unfm_ptr))) 
+	    {
+		pass_0_stat (fs)->wrong_pointers ++;
+		/*
+		fsck_log ("pass0: %d-th pointer (%lu) in item %k (leaf "
+			  "block %lu) is wrong\n", j, unfm_ptr, &ih->ih_key, 
+			  bh->b_blocknr);
+		*/
+		d32_put(ind_item, j, 0);
+		dirty = 1;
+		continue;
+	    }
+	    /* mark block in bitmaps of unformatted nodes */
+	    register_unfm (unfm_ptr);
+	}
+    }
+
+    /* mark all objectids in use */
+    ih = reiserfs_ih_at (bh, 0);
+    for (i = 0; i < reiserfs_nh_get_items (NODE_HEAD (bh)); i ++, ih ++) {
+	reiserfs_deh_t * deh;
+
+	id_map_mark(proper_id_map (fs), reiserfs_key_get_did (&ih->ih_key));
+	id_map_mark(proper_id_map (fs), reiserfs_key_get_oid (&ih->ih_key));
+	if (reiserfs_ih_dir(ih)) {
+	    for (j = 0, deh = reiserfs_deh (bh, ih); 
+		 j < reiserfs_ih_get_entries (ih); 
+		 j ++, deh++) 
+	    {
+		id_map_mark(proper_id_map(fs), reiserfs_deh_get_obid(deh));
+	    }
+	}
+    }
+
+    if (reiserfs_nh_get_items (NODE_HEAD (bh)) < 1) {
+	/* pass 1 will skip this */
+	pass_0_stat (fs)->all_contents_removed ++;
+	fsck_log ("pass0: block %lu: no correct item is found. "
+		  "Leave block untouched.\n", bh->b_blocknr);
+	dirty = 0;
+	reiserfs_buffer_mkclean (bh);
+    } else {
+	/* pass1 will use this bitmap */
+	pass0_block_mkleaf (bh->b_blocknr);
+	/*fsck_data (fs)->rebuild.leaves ++;*/
+    }
+    
+    if (dirty) {
+	pass_0_stat (fs)->leaves_corrected ++;
+	reiserfs_buffer_mkdirty (bh);
+    }
+}
+
+
+static int is_to_be_read (reiserfs_filsys_t * fs, unsigned long block) {
+    return reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), block);
+}
+
+static void do_pass_0 (reiserfs_filsys_t * fs) {
+    reiserfs_bh_t * bh;
+    unsigned long i;
+    int what_node;
+    unsigned long done = 0, total;
+
+
+    if (fsck_mode (fs) == DO_TEST) {
+	/* just to test pass0_correct_leaf */
+	bh = reiserfs_buffer_read (fs->fs_dev, 
+				   fsck_data (fs)->rebuild.test, 
+				   fs->fs_blocksize);
+
+	if (!bh) {
+	    fsck_progress ("%s: Reading of the block %lu failed\n",
+			   __FUNCTION__, fsck_data (fs)->rebuild.test);
+	    reiserfs_fs_free (fs);
+	    exit(0);
+	}
+
+	if (fsck_leaf_check(bh))
+	    fsck_progress ("###############  bad #################\n");
+
+	pass0_correct_leaf (fs, bh);
+	reiserfs_node_print (stdout, fs, bh, 3, -1, -1);
+
+	if (fsck_leaf_check(bh))
+	    fsck_progress ("############### still bad #################\n");
+	
+	reiserfs_buffer_close (bh);
+	reiserfs_fs_free (fs);
+	exit(0);
+    }
+
+    total = reiserfs_bitmap_ones (fsck_source_bitmap (fs));
+    for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
+	if (!is_to_be_read (fs, i))
+	    continue;
+
+	if (!fsck_quiet(fs)) {
+	    util_misc_progress (fsck_progress_file (fs), 
+				&done, total, 1, 0);
+	}
+
+	if (!(bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize))) {
+	    fsck_progress ("%s: Reading of the block %lu failed\n", 
+			   __FUNCTION__, i);
+	    continue;
+	}
+
+	if (fs->fs_badblocks_bm && 
+	    reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, i))
+	{
+	    reiserfs_panic ("The block (%lu), specified in badblock "
+			    "list, was read.", i);
+	}
+	
+	if (reiserfs_fs_block(fs, i) != BT_UNKNOWN) {
+	    /* block which could not be pointed by extent item */
+	    if (!(reiserfs_journal_block (fs, i) && 
+		  fsck_data(fs)->rebuild.use_journal_area))
+	    {
+		reiserfs_panic ("The block (%lu) from non "
+				"data area was read.", i);
+	    }
+	}
+
+	pass_0_stat (fs)->dealt_with ++;
+	what_node = reiserfs_node_type (bh);
+	if ( what_node != NT_LEAF && what_node != NT_IH_ARRAY ) {
+	    reiserfs_buffer_close (bh);
+	    continue;
+	}
+	
+	pass_0_stat (fs)->leaves ++;
+	pass0_correct_leaf (fs, bh);
+	reiserfs_buffer_close (bh);
+    }
+
+    if (!fsck_quiet(fs))
+	fsck_progress ("\n");
+
+
+    /* just in case */
+    id_map_mark(proper_id_map (fs), REISERFS_ROOT_OBJECTID);
+
+}
+
+static void choose_hash_function (reiserfs_filsys_t * fs) {
+    unsigned long max;
+    unsigned int hash_code;
+    int i;
+
+    if (fsck_hash_defined (fs))
+	return;
+
+    max = 0;
+    hash_code = reiserfs_hash_code (0);
+    
+    for (i = 0; i < fsck_data (fs)->rebuild.hash_amount; i ++) {
+	/* remember hash whihc got more hits */
+	if (fsck_data (fs)->rebuild.hash_hits [i] > max) {
+	    hash_code = i;
+	    max = fsck_data (fs)->rebuild.hash_hits [i];
+	}
+
+	if (fsck_data (fs)->rebuild.hash_hits [i]) {
+	    fsck_log ("%lu directory entries were hashed with %s hash.\n",
+		      fsck_data (fs)->rebuild.hash_hits [i], 
+		      reiserfs_hash_name(i));
+	}
+    }
+
+    if (max == 0 || hash_code == 0) {
+	/* no names were found. take either super block value or default */
+        hash_code = reiserfs_sb_get_hash (fs->fs_ondisk_sb);
+	if (!hash_code)
+	    hash_code = DEFAULT_HASH;
+	
+        fsck_log ("Could not find a hash in use. Using %s\n",
+		  reiserfs_hash_name (hash_code));
+    }
+    
+    /* compare the most appropriate hash with the hash set in super block */
+    if (hash_code != reiserfs_sb_get_hash (fs->fs_ondisk_sb)) {
+        fsck_progress ("Selected hash (%s) does not match to "
+		       "the hash set in the super block (%s).\n", 
+		       reiserfs_hash_name (hash_code), 
+		       reiserfs_hash_name (
+				reiserfs_sb_get_hash (fs->fs_ondisk_sb)));
+	
+        reiserfs_sb_set_hash (fs->fs_ondisk_sb, hash_code);
+    }
+    
+    fs->hash = reiserfs_hash_func (hash_code);
+}
+
+/* create bitmap of blocks the tree is to be built off */
+/* debugreiserfs and pass0 should share this code -s should show
+the same as we could recover - test: zero first 32M */
+static void init_source_bitmap (reiserfs_filsys_t * fs) {
+    unsigned long count, block, bmap_nr, bits_amount;
+    unsigned long i, j, tmp, reserved;
+    FILE * fp;
+
+    count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb);
+
+    switch (fsck_data (fs)->rebuild.scan_area) {
+    case ALL_BLOCKS:
+	fsck_source_bitmap (fs) = reiserfs_bitmap_create (count);
+	reiserfs_bitmap_fill (fsck_source_bitmap (fs));
+	fsck_progress ("The whole partition (%d blocks) is to be scanned\n", 
+		       reiserfs_bitmap_ones (fsck_source_bitmap (fs)));	
+	break;
+
+    case USED_BLOCKS:
+	fsck_progress ("Loading on-disk bitmap .. ");
+	fsck_source_bitmap (fs) = reiserfs_bitmap_create (count);	
+	reiserfs_bitmap_copy (fsck_source_bitmap (fs), fs->fs_bitmap2);
+	
+	fsck_progress ("ok, %d blocks marked used\n", 
+		       reiserfs_bitmap_ones (fsck_source_bitmap (fs)));
+	break;
+
+    case EXTERN_BITMAP:
+	fp = fopen (fsck_data (fs)->rebuild.bitmap_file_name, "r");
+	
+	if (!fp) {
+	    reiserfs_exit (EXIT_OPER, "Could not load bitmap: %s\n", 
+			   strerror(errno));
+	}
+	
+	fsck_source_bitmap (fs) = reiserfs_bitmap_load (fp);
+	
+	if (!fsck_source_bitmap (fs)) {
+	    reiserfs_exit (EXIT_OPER, "Could not load fitmap from \"%s\"", 
+			   fsck_data (fs)->rebuild.bitmap_file_name);
+	}
+
+	fsck_progress ("%d blocks marked used in extern bitmap\n", 
+		       reiserfs_bitmap_ones (fsck_source_bitmap (fs)));
+	fclose (fp);
+	break;
+
+    default:
+	reiserfs_panic ("No area to scan specified");
+    }
+
+    tmp = 0;
+
+    /* unmark bitmaps */
+    block = fs->fs_super_bh->b_blocknr + 1;
+    reserved = fsck_source_bitmap(fs)->bm_bit_size;
+    
+    bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize);
+    
+    for (i = 0; i < bmap_nr; i ++) {
+	if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), block)) {
+	    /* bitmap is definitely broken, mark all blocks of this 
+	       bitmap block as used */
+	    bits_amount = (reserved < fs->fs_blocksize * 8) ? 
+		    reserved : fs->fs_blocksize * 8;
+	    
+	    fsck_log("%s: Bitmap %lu (of %lu bits) is wrong - "
+		     "mark all blocks [%lu - %lu] as used\n",
+		     __FUNCTION__, i, bits_amount, i * fs->fs_blocksize * 8,
+		     fs->fs_blocksize * 8 * i + bits_amount); 	
+				
+	    for (j = i * fs->fs_blocksize * 8; 
+		 j < i * fs->fs_blocksize * 8 + bits_amount; j++) 
+	    {
+	        if (!reiserfs_bitmap_test_bit (fsck_source_bitmap(fs), j))
+		    reiserfs_bitmap_set_bit (fsck_source_bitmap(fs), j);
+	    }
+        }
+        
+	reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), block);
+	reserved -= fs->fs_blocksize * 8;
+	tmp ++;
+	
+	/* next block fo bitmap */
+	if (reiserfs_bitmap_spread (fs)) {
+	    block = (block / (fs->fs_blocksize * 8) + 1) * 
+		    (fs->fs_blocksize * 8);
+	} else {
+	    block ++;
+	}
+    }
+
+    /* pass 0 will skip super block and journal areas and bitmap blocks, find
+       how many blocks have to be read */
+    for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++) {
+	if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), i))
+	    continue;
+	
+	reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i);
+	tmp ++;
+    }
+
+    /* unmark journal area as used if journal is standard or it is non 
+       standard and initialy has been created on a main device */
+
+    reserved = reiserfs_journal_hostsize (fs->fs_ondisk_sb);
+    /* where does journal area (or reserved journal area) start from */
+
+    if (!reiserfs_new_location (fs->fs_super_bh->b_blocknr, 
+				fs->fs_blocksize) &&
+    	!reiserfs_old_location (fs->fs_super_bh->b_blocknr, 
+				fs->fs_blocksize))
+    {
+	misc_die ("init_source_bitmap: Wrong super block location, "
+		  "you must run --rebuild-sb.");
+    }
+
+    block = reiserfs_journal_start_must (fs);
+
+    for (i = block; i < reserved + block; i ++) {
+	if (!reiserfs_bitmap_test_bit (fsck_source_bitmap (fs), i))
+	    continue;
+	reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i);
+	tmp ++;	
+    }
+
+    if (fs->fs_badblocks_bm)
+    	for (i = 0; i < count; i ++) {
+	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))
+		reiserfs_bitmap_clear_bit (fsck_source_bitmap (fs), i);
+    	}
+
+    fsck_source_bitmap (fs)->bm_set_bits = 
+	    reiserfs_bitmap_ones (fsck_source_bitmap (fs));
+
+    fsck_progress ("Skipping %d blocks (super block, journal, "
+		   "bitmaps) %d blocks will be read\n", tmp, 
+		   fsck_source_bitmap (fs)->bm_set_bits);
+		
+}
+
+static void fsck_pass0_prep (reiserfs_filsys_t * fs) {
+    /* bitmap of blocks to be read */
+    init_source_bitmap (fs);
+
+    /* bitmap of leaves, good and bad unformatted */
+    fsck_pass0_aux_prep (fs);
+
+    /* on pass0 all objectids will be marked here as used */
+    proper_id_map (fs) = id_map_init();
+
+    /* pass0 gathers statistics about hash hits */
+    hash_hits_init (fs);
+}
+
+
+static void fsck_pass0_save_result (reiserfs_filsys_t * fs) {
+    FILE * file;
+    int retval;
+
+    /* save bitmaps with which we will be able start reiserfs from
+       pass 1 */
+    file = util_file_open ("temp_fsck_file.deleteme", "w+");
+    if (!file)
+	return;
+
+    fsck_stage_start_put (file, PASS_0_DONE);
+    reiserfs_bitmap_save (file,  leaves_bitmap);
+    reiserfs_bitmap_save (file,  good_unfm_bitmap);
+    reiserfs_bitmap_save (file,  bad_unfm_bitmap);
+    fsck_stage_end_put (file);
+    fclose (file);
+    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
+    
+    if (retval != 0)
+	fsck_progress ("%s: Could not rename the temporary file "
+		       "temp_fsck_file.deleteme to %s",
+		       __FUNCTION__, state_dump_file (fs));
+}
+
+
+/* file 'fp' must contain 3 bitmaps saved during last pass 0: bitmap
+   of leaves, bitmaps of good and bad unfms*/
+void fsck_pass0_load_result (FILE * fp, reiserfs_filsys_t * fs) {
+    leaves_bitmap = reiserfs_bitmap_load (fp);
+    good_unfm_bitmap = reiserfs_bitmap_load (fp);
+    bad_unfm_bitmap = reiserfs_bitmap_load (fp);
+    if (!leaves_bitmap || !good_unfm_bitmap || !bad_unfm_bitmap)
+	fsck_exit ("State dump file seems corrupted. Run without -d");
+
+    fsck_source_bitmap (fs) = leaves_bitmap;
+
+    /* on pass 1 we do not need proper objectid map */
+
+    fsck_progress ("Pass 0 result loaded. %d leaves, %d/%d good/bad data blocks\n",
+		   reiserfs_bitmap_ones (leaves_bitmap),
+		   reiserfs_bitmap_ones (good_unfm_bitmap),
+		   reiserfs_bitmap_ones (bad_unfm_bitmap));
+}
+
+
+static void fsck_pass0_fini (reiserfs_filsys_t * fs) {
+    time_t t;
+
+    /* update super block: hash, objectid map, fsck state */
+    choose_hash_function (fs);
+    id_map_flush(proper_id_map (fs), fs);
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, PASS_0_DONE);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+
+    /* write all dirty blocks */
+    fsck_progress ("Flushing..");
+    fs->fs_dirt = 1;
+    reiserfs_fs_flush (fs);
+    fsck_progress ("finished\n");
+
+    fsck_stage_report (FS_PASS0, fs);
+
+    /* free what we do not need anymore */
+
+    if (!fsck_run_one_step (fs)) {
+	if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1)) {
+	    /* reiserfsck continues */
+	    reiserfs_bitmap_delete (fsck_source_bitmap (fs));
+	    fsck_source_bitmap (fs) = 0;
+	    fsck_source_bitmap (fs) = leaves_bitmap;
+	    return;
+	}
+    } else
+	fsck_pass0_save_result (fs);
+
+    reiserfs_bitmap_flush (fsck_source_bitmap (fs), fs);
+    reiserfs_bitmap_delete (fsck_source_bitmap (fs));
+    fsck_source_bitmap (fs) = 0;
+    id_map_free(proper_id_map (fs));
+    proper_id_map (fs) = 0;
+    
+    time (&t);
+    fsck_progress ("###########\n"
+		   "reiserfsck finished pass 0 at %s"
+		   "###########\n", ctime (&t));
+    fs->fs_dirt = 1;
+    reiserfs_fs_close (fs);
+    exit(0);
+}
+
+
+void fsck_pass0 (reiserfs_filsys_t * fs) {
+    if (reiserfs_super_format (fs->fs_ondisk_sb) != fs->fs_format || 
+        reiserfs_super_format (fs->fs_ondisk_sb) == REISERFS_FORMAT_UNKNOWN)
+    {
+	reiserfs_exit (EXIT_OPER, "pass 0: ReiserFS format version mismatch "
+		       "found, you should run --rebuild-sb");
+    }
+  
+    fsck_progress ("Pass 0:\n");
+    if (fsck_log_file (fs) != stderr)
+	/* this is just to separate warnings in the log file */
+	fsck_log ("####### Pass 0 #######\n");
+
+
+    fsck_pass0_prep (fs);
+
+    /* scan the partition, find leaves and correct them */
+    do_pass_0 (fs);
+
+    fsck_pass0_fini (fs);
+}
+
diff --git a/utils/fsck/pass1.c b/utils/fsck/pass1.c
new file mode 100644
index 0000000..32434a4
--- /dev/null
+++ b/utils/fsck/pass1.c
@@ -0,0 +1,859 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README 
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/unaligned.h"
+#include "misc/malloc.h"
+#include "util/device.h"
+#include "util/misc.h"
+
+#include <time.h>
+
+reiserfs_bitmap_t * bad_unfm_in_tree_once_bitmap;
+#define is_bad_unfm_in_tree_once(block)		\
+	reiserfs_bitmap_test_bit(bad_unfm_in_tree_once_bitmap, block)
+#define mark_bad_unfm_in_tree_once(block) \
+	reiserfs_bitmap_set_bit(bad_unfm_in_tree_once_bitmap, block)
+
+static void stat_data_in_tree (reiserfs_bh_t *bh,
+			       reiserfs_ih_t * ih)
+{
+#if 0
+    __u32 objectid;
+    
+    objectid = reiserfs_key_get_oid (&ih->ih_key);
+    
+    if (mark_objectid_really_used (proper_id_map (fs), objectid)) {
+	stat_shared_objectid_found (fs);
+	mark_objectid_really_used (shared_id_map (fs), objectid);
+    }
+#endif
+    
+    zero_nlink (ih, reiserfs_item_by_ih (bh, ih));
+}
+
+static char *still_bad_unfm_ptr_to_string (int val) {
+    switch (val) {
+	case 1:
+	    return "a leaf";
+	case 2:
+	    return "shared between a few files";
+	case 3:
+	    return "not a data block";
+	case 4:
+	    return "not used in on-disk bitmap";
+	case 5:
+	    return "out of partition boundary";
+    }
+    return "";
+}
+
+static int still_bad_unfm_ptr (unsigned long block) {
+    if (!block)
+	return 0;
+    
+    if (pass0_block_isleaf (block))
+	return 1;
+    
+    if (pass0_block_isbad_unfm (block) && 
+	!is_bad_unfm_in_tree_once (block))
+    {
+	return 2;
+    }
+    
+    if (reiserfs_fs_block(fs, block) != BT_UNKNOWN)
+	return 3;
+    
+/*  if (!was_block_used (block))
+	return 4; */
+    
+    if (block >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb))
+	return 5;
+    
+    return 0;
+}
+
+
+/* this just marks blocks pointed by an extent item as used in the
+   new bitmap */
+static void extent_in_tree (reiserfs_bh_t * bh,
+			    reiserfs_ih_t * ih)
+{
+    unsigned int i;
+    __u32 * unp;
+    __u32 unfm_ptr;
+    int ret;
+
+    unp = (__u32 *)reiserfs_item_by_ih (bh, ih);
+    
+    for (i = 0; i < reiserfs_ext_count (ih); i ++) {
+	unfm_ptr = d32_get (unp, i);
+	if (unfm_ptr == 0)
+	    continue;
+	if ((ret = still_bad_unfm_ptr (unfm_ptr)))
+	    reiserfs_panic ("%s: block %lu: The file %k points to the "
+			    "block (%u) which is %s", __FUNCTION__, 
+			    bh->b_blocknr, &ih->ih_key, unfm_ptr, 
+			    still_bad_unfm_ptr_to_string(ret));
+
+	mark_block_used (unfm_ptr, 1);
+    }
+}
+
+static void cb_mkunreach(reiserfs_ih_t *ih) {
+	fsck_item_mkunreach(ih);
+}
+
+static void leaf_is_in_tree_now (reiserfs_bh_t * bh) {
+    item_func_t actions[] = {stat_data_in_tree, extent_in_tree, 0, 0};
+
+    mark_block_used ((bh)->b_blocknr, 1);
+
+    reiserfs_leaf_traverse (bh, cb_mkunreach, actions);
+
+    pass_1_stat (fs)->inserted_leaves ++;
+
+    reiserfs_buffer_mkdirty (bh);
+}
+
+
+static void insert_pointer (reiserfs_bh_t * bh, reiserfs_path_t * path) {
+    reiserfs_ih_t * ih;
+    char * body;
+    int retval;
+    reiserfs_tb_t tb;
+    
+    reiserfs_tb_init (&tb, fs, path, 0x7fff);
+
+    /* reiserfs_fix_nodes & reiserfs_tb_balance must work 
+       for internal nodes only */
+    ih = 0;
+
+    retval = reiserfs_fix_nodes (M_INTERNAL, &tb, ih);
+    if (retval != CARRY_ON)
+	misc_die ("insert_pointer: reiserfs_fix_nodes failed with retval == %d",
+		  retval);
+    
+    /* child_pos: we insert after position child_pos: this feature of 
+       the insert_child; there is special case: we insert pointer after
+       (-1)-st key (before 0-th key) in the parent */
+    if (REISERFS_PATH_LEAF_POS (path) == 0 && path->pos_in_item == 0)
+	REISERFS_PATH_UPPARENT_POS (path, 0) = -1;
+    else if (REISERFS_PATH_UPPARENT (path, 0) == 0) {
+	REISERFS_PATH_UPPARENT_POS (path, 0) = 0;
+    }
+    
+    ih = 0;
+    body = (char *)bh;
+
+    reiserfs_tb_balance (&tb, ih, body, M_INTERNAL, 0);
+    leaf_is_in_tree_now (bh);
+}
+
+
+/* return 1 if new can be joined with last node on the path or with
+   its right neighbor, 0 otherwise */
+static int balance_condition_2_fails (reiserfs_bh_t * new, 
+				      reiserfs_path_t * path)
+{
+    const reiserfs_key_t *right_dkey;
+    int pos, used_space;
+    reiserfs_bh_t *bh;
+    reiserfs_ih_t *ih;
+    
+    bh = REISERFS_PATH_LEAF (path);
+    
+    if (reiserfs_tree_node_mergeable (bh, new))
+	/* new node can be joined with last buffer on the path */
+	return 1;
+    
+    /* new node can not be joined with its left neighbor */
+    
+    right_dkey = reiserfs_tree_rkey (path, fs);
+    if (!reiserfs_key_comp (right_dkey, &MAX_KEY))
+	/* there is no right neighbor */
+	return 0;
+    
+    pos = REISERFS_PATH_UPPOS (path, 1);
+    if (pos == reiserfs_node_items (bh = REISERFS_PATH_UPBUFFER (path, 1))) {
+	/* we have to read parent of right neighbor. For simplicity we
+	   call search_item, which will read right neighbor as well */
+	REISERFS_PATH_INIT(path_to_right_neighbor);
+	
+	if (reiserfs_tree_search_item (fs, right_dkey, &path_to_right_neighbor) 
+	    != ITEM_FOUND)
+	{
+	    reiserfs_panic("%s: block %lu, pointer %d: The left delimiting "
+			   "key %k of the block (%lu) is wrong, the item "
+			   "cannot be found", __FUNCTION__,
+			    REISERFS_PATH_UPBUFFER(path, 1)->b_blocknr, 
+			    pos, right_dkey,
+			    reiserfs_dc_get_nr(reiserfs_int_at (bh, pos + 1)));
+	}
+	
+	used_space = reiserfs_node_used
+		(REISERFS_PATH_LEAF(&path_to_right_neighbor));
+	
+	reiserfs_tree_pathrelse (&path_to_right_neighbor);
+    } else {
+	used_space = reiserfs_dc_get_size (reiserfs_int_at (bh, pos + 1));
+    }
+    
+    ih = reiserfs_ih_at (new, reiserfs_node_items (new) - 1);
+    if (reiserfs_node_free (new) >= used_space -
+	(reiserfs_leaf_mergeable (ih, (reiserfs_ih_t *)right_dkey, new->b_size)
+	 ? REISERFS_IH_SIZE : 0))
+    {
+	return 1;
+    }
+
+    return 0;
+}
+
+
+static void get_max_buffer_key (reiserfs_bh_t * bh, 
+				reiserfs_key_t * key)
+{
+    reiserfs_ih_t * ih;
+
+    ih = reiserfs_ih_at (bh, reiserfs_node_items (bh) - 1);
+    reiserfs_key_copy (key, &(ih->ih_key));
+
+    if (reiserfs_key_dir (key)) {
+	/* copy deh_offset 3-rd and 4-th key components of the last entry */
+	reiserfs_key_set_off (KEY_FORMAT_1, key, 
+		reiserfs_deh_get_off (reiserfs_deh (bh, ih) + 
+				      reiserfs_ih_get_entries (ih) - 1));
+
+    } else if (!reiserfs_key_stat (key))
+	/* get key of the last byte, which is contained in the item */
+	reiserfs_key_set_off (reiserfs_key_format (key), key, 
+			      reiserfs_key_get_off (key) + 
+			      reiserfs_leaf_ibytes (ih, bh->b_size) - 1);
+}
+
+static int tree_is_empty (void)
+{
+    return (reiserfs_sb_get_root (fs->fs_ondisk_sb) == ~(__u32)0 || 
+	    reiserfs_sb_get_root (fs->fs_ondisk_sb) == 0) ? 1 : 0;
+}
+
+
+static void make_single_leaf_tree (reiserfs_bh_t * bh) {
+    /* tree is empty, make tree root */
+    reiserfs_sb_set_root (fs->fs_ondisk_sb, bh->b_blocknr);
+    reiserfs_sb_set_height (fs->fs_ondisk_sb, 2);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+    leaf_is_in_tree_now (bh);
+}
+
+
+/* inserts pointer to leaf into tree if possible. If not, marks node as
+   uninsertable in special bitmap */
+static int try_to_insert_pointer_to_leaf (reiserfs_bh_t * new_bh) {
+    /* first and last keys of new buffer */
+    reiserfs_key_t * first_bh_key, last_bh_key;	
+    reiserfs_key_t last_path_buffer_last_key;
+    const reiserfs_key_t *dkey;
+    REISERFS_PATH_INIT (path);
+    reiserfs_bh_t * bh;			/* last path buffer */
+    int ret_value;
+
+    if (tree_is_empty () == 1) {
+	make_single_leaf_tree (new_bh);
+	return 0;
+    }
+
+    first_bh_key = reiserfs_ih_key_at (new_bh, 0);
+    
+    /* try to find place in the tree for the first key of the coming node */
+    ret_value = reiserfs_tree_search_item (fs, first_bh_key, &path);
+    if (ret_value == ITEM_FOUND)
+	goto cannot_insert;
+
+    /* get max key in the new node */
+    get_max_buffer_key (new_bh, &last_bh_key);
+
+    bh = REISERFS_PATH_LEAF (&path);
+    if (reiserfs_key_comp (reiserfs_ih_key_at (bh, 0), 
+			   &last_bh_key) == 1/* first is greater*/) 
+    {
+	/* new buffer falls before the leftmost leaf */
+	if (reiserfs_tree_node_mergeable (new_bh, bh))
+	    goto cannot_insert;
+	
+	dkey = reiserfs_tree_lkey (&path, fs);
+	if ((dkey && reiserfs_key_comp (dkey, &MIN_KEY) != 0) || 
+	    REISERFS_PATH_LEAF_POS (&path) != 0)
+	{
+	    misc_die ("try_to_insert_pointer_to_leaf: bad search result");
+	}
+	
+	path.pos_in_item = 0;
+	goto insert;
+    }
+    
+    /* get max key of buffer, that is in tree */
+    get_max_buffer_key (bh, &last_path_buffer_last_key);
+    if (reiserfs_key_comp (&last_path_buffer_last_key, 
+			   first_bh_key) != -1/* second is greater */)
+    {
+	/* first key of new buffer falls in the middle of node that is in tree */
+	goto cannot_insert;
+    }
+    
+    dkey = reiserfs_tree_rkey (&path, fs);
+    if (dkey && reiserfs_key_comp (dkey, &last_bh_key) != 1 
+	/* first is greater */)
+    {
+	goto cannot_insert;
+    }
+    
+    if (balance_condition_2_fails (new_bh, &path))
+	goto cannot_insert;
+
+
+ insert:
+    insert_pointer (new_bh, &path);
+    reiserfs_tree_pathrelse (&path);
+    return 0;
+    
+ cannot_insert:
+    reiserfs_tree_pathrelse (&path);
+    return 1;
+}
+
+
+
+/* everything should be correct already in the leaf but contents of extent
+   items. So we only
+   1. zero slots pointing to a leaf
+   2. zero pointers to blocks which are pointed already
+   3. what we should do with directory entries hashed by another hash?
+   they are deleted for now
+*/
+static void pass1_correct_leaf (reiserfs_filsys_t * fs,
+				reiserfs_bh_t * bh)
+{
+    unsigned int i, j;
+    reiserfs_ih_t * ih;
+    __u32 * ind_item;
+    __u32 unfm_ptr;
+    int dirty = 0;
+
+
+    ih = reiserfs_ih_at (bh, 0);
+    for (i = 0; i < reiserfs_node_items (bh); i ++, ih ++) {
+	if (reiserfs_ih_dir (ih)) {
+	    reiserfs_deh_t * deh;
+	    __u32 offset;
+	    char * name;
+	    int name_len;
+	    unsigned int hash_code;
+
+	    deh = reiserfs_deh (bh, ih);
+	    offset = 0;
+	    for (j = 0; j < reiserfs_ih_get_entries (ih); j ++) {
+		name = reiserfs_deh_name (deh + j, j);
+		name_len = reiserfs_direntry_name_len (ih, deh + j, j);
+
+		if ((j == 0 && is_dot (name, name_len)) ||
+		    (j == 1 && is_dot_dot (name, name_len))) {
+		    continue;
+		}
+
+		hash_code = reiserfs_hash_find (
+			name, name_len, reiserfs_deh_get_off (deh + j),
+			reiserfs_sb_get_hash (fs->fs_ondisk_sb));
+		
+		if (hash_code != reiserfs_sb_get_hash (fs->fs_ondisk_sb)) {
+		    fsck_log ("pass1: block %lu, item %d, entry %d: The "
+			      "entry \"%.*s\" of the %k is hashed with %s "
+			      "whereas proper hash is %s", bh->b_blocknr, 
+			      i, j, name_len, name, &ih->ih_key,
+			      reiserfs_hash_name (hash_code), 
+			      reiserfs_hash_name (
+				reiserfs_sb_get_hash (fs->fs_ondisk_sb)));
+		    
+		    if (reiserfs_ih_get_entries (ih) == 1) {
+			reiserfs_leaf_delete_item (fs, bh, i);
+			fsck_log(" - the only entry - item was deleted\n");
+			i --;
+			ih --;
+			break;
+		    } else {
+			reiserfs_leaf_delete_entry (fs, bh, i, j, 1);
+			fsck_log(" - deleted\n");
+			j --;
+			deh = reiserfs_deh (bh, ih);
+			continue;
+		    }
+		}
+
+		if (j && offset >= reiserfs_deh_get_off (deh + j)) {
+		    fsck_log ("pass1: block %lu, item %d, entry %d: The entry "
+			      "\"%.*s\" of the %k has hash offset %lu not "
+			      "larger smaller than the previous one %lu. The "
+			      "entry is deleted.\n", bh->b_blocknr, 
+			      i, j, name_len, name, &ih->ih_key, 
+			      reiserfs_deh_get_off(deh + j), offset);
+		    reiserfs_leaf_delete_entry (fs, bh, i, j, 1);
+		    j --;
+		    deh = reiserfs_deh (bh, ih);
+		    continue;
+		}
+
+		offset = reiserfs_deh_get_off (deh + j);
+	    }
+	    continue;
+	}
+
+
+	if (!reiserfs_ih_ext (ih))
+	    continue;
+
+	/* correct extent items */
+	ind_item = (__u32 *)reiserfs_item_by_ih (bh, ih);
+
+	for (j = 0; j < reiserfs_ext_count (ih); j ++) {
+	    unfm_ptr = d32_get (ind_item, j);
+
+	    if (!unfm_ptr)
+		continue;
+
+	    /* this corruption of extent item had to be fixed in pass0 */
+	    if (reiserfs_fs_block(fs, unfm_ptr) != BT_UNKNOWN)
+		/*!was_block_used (unfm_ptr))*/
+		reiserfs_panic ("%s: block %lu, item %d, pointer %d: The "
+				"wrong pointer (%u) in the file %K. Must "
+				"be fixed on pass0.",  __FUNCTION__, 
+				bh->b_blocknr, i, j, unfm_ptr, &ih->ih_key);
+
+	    /* 1. zero slots pointing to a leaf */
+	    if (pass0_block_isleaf (unfm_ptr)) {
+		dirty ++;
+		d32_put (ind_item, j, 0);
+		pass_1_stat (fs)->pointed_leaves ++;
+		continue;
+	    }
+
+	    /* 2. zero pointers to blocks which are pointed already */
+	    if (pass0_block_isbad_unfm (unfm_ptr)) {
+		/* this unformatted pointed more than once. Did we see 
+		   it already? */
+		if (!is_bad_unfm_in_tree_once (unfm_ptr)) {
+		    /* keep first reference to it and mark about that in
+                       special bitmap */
+		    mark_bad_unfm_in_tree_once (unfm_ptr);
+		} else {
+		    /* Yes, we have seen this pointer already, zero other 
+		       pointers to it. */
+		    dirty ++;
+		    d32_put (ind_item, j, 0);
+		    pass_1_stat (fs)->non_unique_pointers ++;
+		    continue;
+		}
+	    } else {
+		pass_1_stat (fs)->correct_pointers ++;
+	    }
+	}
+    }
+
+    if (dirty)
+	reiserfs_buffer_mkdirty (bh);
+}
+
+/* fsck starts creating of this bitmap on pass 1. It will then become
+   on-disk bitmap */
+static void init_new_bitmap (reiserfs_filsys_t * fs)
+{
+    unsigned int i;
+    unsigned long block;
+    unsigned long reserved;
+    unsigned long count, bmap_nr;
+    
+    count = reiserfs_sb_get_blocks (fs->fs_ondisk_sb);
+    
+    fsck_new_bitmap (fs) = reiserfs_bitmap_create(count);
+
+    /* mark_block_used skips 0, set the bit explicitly */
+    reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), 0);
+
+    /* mark other skipped blocks and super block used */
+    for (i = 1; i <= fs->fs_super_bh->b_blocknr; i ++)
+	mark_block_used (i, 1);
+
+    /* mark bitmap blocks as used */
+    block = fs->fs_super_bh->b_blocknr + 1;
+    
+    bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize);
+
+    for (i = 0; i < bmap_nr; i ++) {
+	mark_block_used (block, 1);
+	if (reiserfs_bitmap_spread (fs)) {
+	    block = (block / (fs->fs_blocksize * 8) + 1) * 
+		    (fs->fs_blocksize * 8);
+	} else {
+	    block ++;
+	}
+    }
+
+    reserved = reiserfs_journal_hostsize (fs->fs_ondisk_sb);
+    /* where does journal area (or reserved journal area) start from */
+
+    if (!reiserfs_new_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) &&
+    	!reiserfs_old_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize))
+    {
+	misc_die ("init_new_bitmap: Wrong super block location, "
+		  "you must run --rebuild-sb.");
+    }
+
+    block = reiserfs_journal_start_must (fs);
+
+    for (i = block; i < reserved + block; i ++)
+	mark_block_used (i, 1);
+	
+
+    if (fs->fs_badblocks_bm)
+    	for (i = 0; i < count; i ++) {
+	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) {
+	    	if (reiserfs_bitmap_test_bit (fsck_new_bitmap (fs), i))
+	    	    reiserfs_panic ("%s: The block pointer to not data area, "
+				    "must be fixed on the pass0.\n",
+				    __FUNCTION__);
+		
+		reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), i);
+	    }
+    	}
+}
+
+
+/* this makes a map of blocks which can be allocated when fsck will
+   continue */
+static void find_allocable_blocks (reiserfs_filsys_t * fs) {
+    unsigned long i;
+
+    fsck_progress ("Looking for allocable blocks .. ");
+
+    fsck_allocable_bitmap (fs) = reiserfs_bitmap_create 
+	    (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    reiserfs_bitmap_fill (fsck_allocable_bitmap (fs));
+
+    /* find how many leaves are not pointed by any extent items */
+    for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
+	if (reiserfs_fs_block(fs, i) != BT_UNKNOWN) {
+	    /* journal (or reserved for it area), bitmaps, super block and
+	       blocks before it */
+	    continue;
+	}
+
+	if (pass0_block_isgood_unfm (i) && pass0_block_isbad_unfm (i)) {
+	    misc_die ("%s: The block (%lu) is marked as good and "
+		      "as bad at once.", __FUNCTION__, i);
+	}
+
+	if (pass0_block_isgood_unfm (i) || pass0_block_isbad_unfm (i)) {
+	    /* blocks which were pointed once or more then once 
+	       from extent items - they will not be allocated */
+	    continue;
+	}
+
+	/* make allocable not leaves, not bad blocks */
+	if (!pass0_block_isleaf (i))
+	    if (!fs->fs_badblocks_bm || 
+		!reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))
+	    {
+		/* this is not leaf and it is not pointed by found extent 
+		   items, so it does not contains anything valuable */
+		make_allocable (i);
+		pass_1_stat (fs)->allocable_blocks ++;
+	    }
+    }
+    
+    fsck_progress ("finished\n");
+
+    fs->block_allocator = reiserfsck_new_blocknrs;
+    fs->block_deallocator = reiserfsck_free_block;
+}
+
+static void fsck_pass1_prep (reiserfs_filsys_t * fs) {
+    /* this will become an on-disk bitmap */
+    init_new_bitmap (fs);
+
+    /* bitmap of leaves which could not be inserted on pass 1. 
+       FIXME: no need to have 1 bit per block */
+    fsck_uninsertables (fs) = reiserfs_bitmap_create
+	    (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    reiserfs_bitmap_fill (fsck_uninsertables (fs));
+    
+    /* find blocks which can be allocated */
+    find_allocable_blocks (fs);
+
+    /* bitmap of bad unformatted nodes which are in the tree already */
+    bad_unfm_in_tree_once_bitmap = reiserfs_bitmap_create 
+	    (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+
+    /* pass 1 does not deal with objectid */
+}
+
+static void fsck_pass1_save_result (reiserfs_filsys_t * fs) {
+    FILE * file;
+    int retval;
+
+    if (!(file = util_file_open("temp_fsck_file.deleteme", "w+")))
+	return;
+
+        
+    /* to be able to restart with pass 2 we need bitmap of
+       uninsertable blocks and bitmap of alocable blocks */
+    fsck_stage_start_put (file, PASS_1_DONE);
+    reiserfs_bitmap_save (file,  fsck_uninsertables (fs));
+    reiserfs_bitmap_save (file,  fsck_allocable_bitmap(fs));
+    reiserfs_bitmap_save (file,  fsck_new_bitmap(fs));
+    fsck_stage_end_put (file);
+    fclose (file);
+    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
+    if (retval != 0)
+	fsck_progress ("pass 1: Could not rename the temporary file "
+		       "temp_fsck_file.deleteme to %s",
+		       state_dump_file (fs));
+
+    /* to be able to pack/unpack metadata after pass2 in stage-by-stage mode, 
+       save into on-disk bitmap all blocks that are involved. 
+       it should not be flushed on disk not in stage-by-stage mode, as if fsck 
+       fails on pass1 we get wrong bitmap on the next fsck start */
+    reiserfs_bitmap_flush (fsck_allocable_bitmap(fs), fs);
+}
+
+
+void fsck_pass1_load_result (FILE * fp, reiserfs_filsys_t * fs) {
+    fsck_uninsertables (fs) = reiserfs_bitmap_load (fp);
+    fsck_allocable_bitmap (fs) = reiserfs_bitmap_load (fp);
+    fsck_new_bitmap (fs) = reiserfs_bitmap_load(fp);
+    
+    fs->block_allocator = reiserfsck_new_blocknrs;
+    fs->block_deallocator = reiserfsck_free_block;
+
+    if (!fsck_new_bitmap (fs) || !fsck_allocable_bitmap (fs) ||
+	!fsck_allocable_bitmap (fs))
+    {
+	fsck_exit ("State dump file seems corrupted. Run without -d");
+    }
+
+    /* we need objectid map on pass 2 to be able to relocate files */
+    proper_id_map (fs) = id_map_init();
+    fetch_objectid_map (proper_id_map (fs), fs);
+
+    fsck_progress ("Pass 1 result loaded. %d blocks used, %d allocable, "
+		   "still to be inserted %d\n",
+		   reiserfs_bitmap_ones (fsck_new_bitmap (fs)),
+		   reiserfs_bitmap_zeros (fsck_allocable_bitmap (fs)),
+		   reiserfs_bitmap_zeros (fsck_uninsertables (fs)));
+}
+
+
+extern reiserfs_bitmap_t * leaves_bitmap;
+
+/* reads blocks marked in leaves_bitmap and tries to insert them into
+   tree */
+static void do_pass_1 (reiserfs_filsys_t * fs)
+{
+    unsigned long done = 0, total;
+    reiserfs_bh_t * bh;
+    unsigned long i, n; 
+    int what_node;
+
+
+    /* on pass0 we have found that amount of leaves */
+    total = reiserfs_bitmap_ones (leaves_bitmap);
+
+    /* read all leaves found on the pass 0 */
+    for (n = 0; n < 2; n++) {
+	for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
+	    if (!pass0_block_isleaf (i))
+		continue;
+
+	    if (n && !fsck_bitmap_isuninsert(i))
+		continue;
+	    
+	    if (!fsck_quiet(fs)) {
+		util_misc_progress (fsck_progress_file (fs), 
+				    &done, total, 1, 0);
+	    }
+
+	    /* at least one of nr_to_read blocks is to be checked */
+	    bh = reiserfs_buffer_read (fs->fs_dev, i, fs->fs_blocksize);
+	    if (!bh) {
+		/* we were reading one block at time, and failed, so mark
+		    block bad */
+		fsck_progress ("pass1: Reading of the block %lu failed\n", i);
+		continue;
+	    }
+
+	    what_node = reiserfs_node_type (bh);
+	    if ( what_node != NT_LEAF ) {
+		fsck_info_checkmem();
+		misc_die ("build_the_tree: Nothing but leaves "
+			  "are expected. Block %lu - %s\n", 
+			  i, reiserfs_node_type_name(what_node));
+	    }
+
+	    if (is_block_used (i))
+		if (!(reiserfs_journal_block (fs, i) &&
+		      fsck_data(fs)->rebuild.use_journal_area))
+		{
+		    /* block is in new tree already */
+		    misc_die ("build_the_tree: The leaf (%lu) "
+			      "is in the tree already\n", i);
+		}
+
+	    /* fprintf (block_list, "leaf %d\n", i + j);*/
+	    if (n == 0) {
+		pass_1_stat (fs)->leaves ++;
+
+		/* the leaf may still contain extent items with wrong
+		   slots. Fix that */
+		pass1_correct_leaf (fs, bh);
+
+		if (reiserfs_nh_get_items (NODE_HEAD (bh)) == 0) {
+		    /* all items were deleted on pass 0 or pass 1 */
+		    reiserfs_buffer_mkclean (bh);
+		    reiserfs_buffer_close (bh);
+		    make_allocable (i);
+		    pass_1_stat (fs)->allocable_blocks ++;
+		    continue;
+		}
+	    
+		if (fsck_leaf_check(bh)) {
+		    /* FIXME: will die */
+		    fsck_log ("%s: WARNING: The leaf (%lu) is formatted "
+			      "badly. Will be handled on the the pass2.\n",
+			      __FUNCTION__, bh->b_blocknr);
+
+		    fsck_bitmap_mkuninsert (bh->b_blocknr);
+		    reiserfs_buffer_close (bh);
+		    continue;
+		}
+	    }
+
+	    if (reiserfs_journal_block (fs, i) && 
+		fsck_data(fs)->rebuild.use_journal_area) 
+	    {
+		/* FIXME: temporary thing */
+		if (tree_is_empty ()) {
+		    /* we insert inot tree only first leaf of journal */
+		    unsigned long block;
+		    reiserfs_bh_t * new_bh;
+
+		    block = alloc_block ();
+		    if (!block)
+			misc_die ("could not allocate block");
+			
+		    new_bh = reiserfs_buffer_open (bh->b_dev, block, 
+						   bh->b_size);
+		    
+		    memcpy (new_bh->b_data, bh->b_data, bh->b_size);
+		    reiserfs_buffer_mkuptodate (new_bh, 1);
+		    reiserfs_buffer_mkdirty (new_bh);
+		    make_single_leaf_tree (new_bh);
+		    reiserfs_buffer_close (new_bh);
+		    reiserfs_buffer_close (bh);
+		    continue;
+		}
+
+		/* other blocks of journal will be inserted in pass 2 */
+		fsck_bitmap_mkuninsert (bh->b_blocknr);
+		reiserfs_buffer_close (bh);
+		continue;
+	    }
+
+	    if (!try_to_insert_pointer_to_leaf(bh)) {
+		/* Inserted successfully. */
+		if (n) {
+		    fsck_bitmap_cluninsert (i);
+		}
+	    } else {
+		if (!n) {
+		    /* Not inserted on the 1st pass. */
+		    fsck_bitmap_mkuninsert (i);
+		    done--;
+		}
+	    }
+	    
+	    reiserfs_buffer_close (bh);
+	}
+    }
+
+    if (!fsck_quiet(fs))
+	fsck_progress ("\n");
+}
+
+
+static void fsck_pass1_fini (reiserfs_filsys_t * fs) {
+    time_t t;
+
+    /* update fsck_state */
+    
+    /* we  should not flush bitmaps on disk after pass1, because
+       new_bitmap contains only those blocks which are good leaves or 
+       just allocated internal blocks. */
+       
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, PASS_1_DONE);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+
+    /* write all dirty blocks */
+    fsck_progress ("Flushing..");
+    fs->fs_dirt = 1;
+    reiserfs_fs_flush (fs);
+    fsck_progress ("finished\n");
+
+    fsck_stage_report (FS_PASS1, fs);
+
+    /* we do not need this anymore */
+    fsck_pass0_aux_fini();
+    reiserfs_bitmap_delete (bad_unfm_in_tree_once_bitmap);
+
+    if (!fsck_run_one_step (fs)) {
+	if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1))
+	    /* reiserfsck continues */
+	    return;
+    } else
+	fsck_pass1_save_result (fs);
+
+    if (proper_id_map (fs)) {
+	/* when we run pass 1 only - we do not have proper_id_map */
+	id_map_free(proper_id_map (fs));
+	proper_id_map (fs) = 0;
+    }
+    
+    time (&t);
+    fsck_progress ("###########\n"
+		   "reiserfsck finished pass 1 at %s"
+		   "###########\n", ctime (&t));
+    fs->fs_dirt = 1;
+    reiserfs_fs_close (fs);
+    exit(0);
+}
+
+
+void fsck_pass1 (reiserfs_filsys_t * fs) {
+    fsck_progress ("Pass 1 (will try to insert %lu leaves):\n",
+		   reiserfs_bitmap_ones (fsck_source_bitmap (fs)));
+    if (fsck_log_file (fs) != stderr)
+	fsck_log ("####### Pass 1 #######\n");
+
+
+    fsck_pass1_prep (fs);
+
+    /* try to insert leaves found during pass 0 */
+    do_pass_1 (fs);
+
+    fsck_pass1_fini (fs);
+}
+
diff --git a/utils/fsck/pass2.c b/utils/fsck/pass2.c
new file mode 100644
index 0000000..faf31f6
--- /dev/null
+++ b/utils/fsck/pass2.c
@@ -0,0 +1,248 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+#include "util/device.h"
+#include "util/misc.h"
+
+#include <time.h>
+
+/* on pass2 we take leaves which could not be inserted into tree
+   during pass1 and insert each item separately. It is possible that
+   items of different objects with the same key can be found. We treat
+   that in the following way: we put it into tree with new key and
+   link it into /lost+found directory with name made of dir,oid. When
+   coming item is a directory - we delete object from the tree, put it
+   back with different key, link it to /lost+found directory and
+   insert directory as it is */
+
+static void fsck_pass2_save_result (reiserfs_filsys_t * fs) {
+    FILE * file;
+    int retval;
+
+    file = util_file_open("temp_fsck_file.deleteme", "w+");
+    if (!file)
+	return;
+    
+    /* to be able to restart from semantic we do not need to save
+       anything here, but two magic values */
+    fsck_stage_start_put (file, TREE_IS_BUILT);
+    fsck_stage_end_put (file);
+    fclose (file);
+    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
+    if (retval != 0)
+	fsck_progress ("%s: Could not rename the temporary file "
+		       "temp_fsck_file.deleteme to %s",
+		        __FUNCTION__, state_dump_file (fs));
+}
+
+/* we have nothing to load from a state file, but we have to fetch
+   on-disk bitmap, copy it to allocable bitmap, and fetch objectid
+   map */
+void fsck_pass2_load_result (reiserfs_filsys_t * fs) {
+    fsck_new_bitmap (fs) = 
+	    reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
+    
+    fsck_allocable_bitmap (fs) = 
+	    reiserfs_bitmap_create (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
+
+    fs->block_allocator = reiserfsck_new_blocknrs;
+    fs->block_deallocator = reiserfsck_free_block;
+
+    /* we need objectid map on semantic pass to be able to relocate files */
+    proper_id_map (fs) = id_map_init();
+    fetch_objectid_map (proper_id_map (fs), fs);    
+}
+
+#include <unistd.h>
+
+/* uninsertable blocks are marked by 0s in uninsertable_leaf_bitmap
+   during the pass 1. They must be not in the tree */
+static void do_pass_2 (reiserfs_filsys_t * fs) {
+
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+    unsigned long total;
+    unsigned long done;
+    unsigned long b;
+    int i, n, ntype;
+
+    done = 0;
+    if (!(total = reiserfs_bitmap_zeros(fsck_uninsertables(fs)) * 2))
+	return;
+
+    fsck_progress ("Pass 2:\n");
+
+    /* 2 loops for SD items and others. */
+    for (n = 0; n < 2; n++) {
+        b = 0;
+        while ((b < fsck_uninsertables(fs)->bm_bit_size) && 
+	       reiserfs_bitmap_find_zero_bit(fsck_uninsertables(fs), &b) == 0) 
+	{
+	    bh = reiserfs_buffer_read (fs->fs_dev, b, fs->fs_blocksize);
+	    if (bh == 0) {
+	        fsck_log ("pass_2: Reading of the block (%lu) failed on "
+			  "the device 0x%x\n", b, fs->fs_dev);
+                goto cont;
+            }
+	
+            if (is_block_used (bh->b_blocknr) && 
+		!(reiserfs_journal_block (fs, bh->b_blocknr) &&
+		  fsck_data(fs)->rebuild.use_journal_area)) 
+	    {
+		fsck_log("%s: The block (%lu) is in the tree already. "
+			 "Should not happen.\n", __FUNCTION__, bh->b_blocknr);
+		goto cont;
+            }
+	    
+            /* this must be leaf */
+            ntype = reiserfs_node_type (bh);
+	    if (ntype != NT_LEAF) { // || B_IS_KEYS_LEVEL(bh)) {
+	        fsck_log ("%s: The block (%b), marked as a leaf on "
+			  "the first two passes, is not a leaf! Will "
+			  "be skipped.\n", __FUNCTION__, bh);
+	        goto cont;
+	    }
+
+	    /* Item-by-item loop. */
+	    for (i = 0, ih = reiserfs_ih_at (bh, 0); 
+		 i < reiserfs_node_items (bh); i ++, ih ++)
+	    {
+		/* Only SD items are inserted initially. */
+		if (n == 0 && !reiserfs_ih_stat (ih))
+		    continue;
+		
+		/* All other items are inserted later. */
+		if (n && reiserfs_ih_stat (ih))
+		    continue;
+		
+		if (fsck_leaf_item_check (bh, ih, reiserfs_item_by_ih (bh, ih)))
+		    continue;
+		    
+		fsck_tree_insert_item (ih, reiserfs_item_by_ih (bh, ih), 1);
+	    }
+
+	    if (n) {
+		pass_2_stat (fs)->leaves ++;
+		make_allocable (b);
+	    }
+
+	    if (!fsck_quiet(fs)) {
+		util_misc_progress (fsck_progress_file (fs), 
+				    &done, total, 1, 0);
+	    }
+        cont:
+	    reiserfs_buffer_close (bh);
+	    b++;
+        }   
+    }
+
+    if (!fsck_quiet(fs))	
+	fsck_progress ("\n");
+}
+
+
+static void fsck_pass2_fini (reiserfs_filsys_t * fs) {
+    time_t t;
+
+    /* we can now flush new_bitmap on disk as tree is built and 
+       contains all data, which were found on dik at start in 
+       used bitmaps */
+    reiserfs_bitmap_copy (fs->fs_bitmap2, fsck_new_bitmap (fs));
+    
+    /* we should copy new_bitmap to allocable bitmap, becuase evth what is 
+       used for now (marked as used in new_bitmap) should not be allocable;
+       and what is not in tree for now should be allocable.
+       these bitmaps differ because on pass2 we skip those blocks, whose 
+       SD's are not in the tree, and therefore extent items of such bad 
+       leaves points to not used and not allocable blocks. */
+
+    /* DEBUG only
+    if (reiserfs_bitmap_compare (fsck_allocable_bitmap (fs), 
+				 fsck_new_bitmap(fs))) 
+    {
+        fsck_log ("Allocable bitmap differs from the new bitmap after pass2\n");
+	reiserfs_bitmap_copy (fsck_allocable_bitmap(fs), fsck_new_bitmap (fs));
+    } */
+
+    /* update super block: objectid map, fsck state */
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, TREE_IS_BUILT);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+  
+    /* write all dirty blocks */
+    fsck_progress ("Flushing..");
+    id_map_flush(proper_id_map (fs), fs);
+    fs->fs_dirt = 1;
+    reiserfs_bitmap_flush (fs->fs_bitmap2, fs);
+    reiserfs_fs_flush (fs);
+    fsck_progress ("finished\n");
+    
+    /* fixme: should be optional */
+/*    fsck_progress ("Tree is built. Checking it - ");
+    reiserfsck_check_pass1 ();
+    fsck_progress ("finished\n");*/
+
+    fsck_stage_report (FS_PASS2, fs);
+
+    /* free what we do not need anymore */
+    reiserfs_bitmap_delete (fsck_uninsertables (fs));
+
+    if (!fsck_run_one_step (fs)) {
+	if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1))
+	    /* reiserfsck continues */
+	    return;
+    } else
+	fsck_pass2_save_result (fs);
+
+    
+    id_map_free(proper_id_map (fs));
+    proper_id_map (fs) = 0;
+    
+    reiserfs_bitmap_delete (fsck_new_bitmap (fs));
+    reiserfs_bitmap_delete (fsck_allocable_bitmap (fs));
+    
+    time (&t);
+    fsck_progress ("###########\n"
+		   "reiserfsck finished pass 2 at %s"
+		   "###########\n", ctime (&t));
+    fs->fs_dirt = 1;
+    reiserfs_fs_close (fs);
+    exit(0);
+}
+
+
+
+void fsck_pass2 (reiserfs_filsys_t * fs) {
+    if (fsck_log_file (fs) != stderr)
+	fsck_log ("####### Pass 2 #######\n");
+    
+    /* take blocks which were not inserted into tree yet and put each
+	item separately */
+    do_pass_2 (fs);
+    
+    fsck_pass2_fini (fs);
+
+    if (reiserfs_sb_get_root (fs->fs_ondisk_sb) == ~(__u32)0 || 
+	reiserfs_sb_get_root (fs->fs_ondisk_sb) == 0)
+	misc_die ( "\nNo reiserfs metadata found.  If you are sure that you had the reiserfs\n"
+		"on this partition,  then the start  of the partition  might be changed\n"
+		"or all data were wiped out. The start of the partition may get changed\n"
+		"by a partitioner  if you have used one.  Then you probably rebuilt the\n"
+		"superblock as there was no one.  Zero the block at 64K offset from the\n"
+		"start of the partition (a new super block you have just built) and try\n"
+	        "to move the start of the partition a few cylinders aside  and check if\n" 
+		"debugreiserfs /dev/xxx detects a reiserfs super block. If it does this\n"
+	        "is likely to be the right super block version.                        \n"
+		"If this makes you nervous, try  www.namesys.com/support.html,  and for\n"
+		"$25 the author of fsck,  or a colleague  if he is out,  will  step you\n"
+		"through it all.\n");
+}
diff --git a/utils/fsck/pass4.c b/utils/fsck/pass4.c
new file mode 100644
index 0000000..da01664
--- /dev/null
+++ b/utils/fsck/pass4.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "util/misc.h"
+
+static int fsck_squeeze(reiserfs_filsys_t *fs, reiserfs_path_t *path) {
+	reiserfs_bh_t *bh_left, *bh;
+	REISERFS_PATH_INIT(lpath);
+	reiserfs_key_t key;
+	__u64 off;
+	__u32 oid;
+	int res;
+	
+	bh = REISERFS_PATH_LEAF(path);
+	
+	key = *(reiserfs_ih_key_at(bh, 0));
+	if ((off = reiserfs_key_get_off(&key)) == 0) {
+		if ((oid = reiserfs_key_get_oid(&key)) == 0) 
+			reiserfs_panic("Object id 0 found in the tree.");
+		
+		reiserfs_key_set_oid(&key, reiserfs_key_get_oid(&key) - 1);
+		reiserfs_key_set_off(reiserfs_key_format(&key), &key, -1ull);
+	} else {
+		reiserfs_key_set_off(reiserfs_key_format(&key), &key, 
+				     reiserfs_key_get_off(&key) - 1);
+	}
+	
+	reiserfs_tree_search_item (fs, &key, &lpath);
+	bh_left = REISERFS_PATH_LEAF (&lpath);
+	
+	if (bh->b_blocknr == bh_left->b_blocknr || 
+	    !reiserfs_tree_node_mergeable(bh_left, bh))
+	{
+		reiserfs_tree_pathrelse(&lpath);
+		return 0;
+	}
+
+	/* Mergeable leaves must be merged. */
+	res = reiserfs_tree_merge(fs, &lpath, path);
+	reiserfs_tree_pathrelse(&lpath);
+	reiserfs_bitmap_clear_bit(fsck_new_bitmap (fs), bh->b_blocknr);
+	return res;
+}
+
+void fsck_cleanup (void) {
+    const reiserfs_key_t * rdkey;
+    reiserfs_path_t path;
+    reiserfs_key_t key;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+    unsigned long items;
+    int i, res;
+
+    path.path_length = REISERFS_PATH_OFFILL;
+    key = root_dir_key;
+    
+    fsck_progress ("Pass 4 - ");
+    items = 0;
+
+    while (1) {
+	res = reiserfs_tree_search_item (fs, &key, &path);
+	
+	bh = REISERFS_PATH_LEAF (&path);
+	ih = REISERFS_PATH_IH (&path);
+	
+	if (res != ITEM_FOUND) {
+	    if (REISERFS_PATH_LEAF_POS (&path) == 0)
+		    break;
+	    
+	    REISERFS_PATH_LEAF_POS (&path) --;
+	    ih = REISERFS_PATH_IH (&path);
+
+	    if (reiserfs_key_comp2(&key, &ih->ih_key))
+		    break;
+            
+	    /* Position found. */
+	    //fsck_log("Warning: Node %lu, item %u, %k: item start is expected, "
+	    //	     "not a unit.\n", bh->b_blocknr, 
+	    //	     REISERFS_PATH_LEAF_POS (&path), &ih->ih_key);
+	}
+	
+	/* print ~ how many leaves were scanned and how fast it was */
+	if (!fsck_quiet (fs))
+	    util_misc_speed (fsck_progress_file(fs), items++, 0, 50, 0);
+
+	for (i = REISERFS_PATH_LEAF_POS (&path); 
+	     i < reiserfs_node_items (bh); i ++, ih ++)
+	{
+	    if (!fsck_item_reach(ih)) {
+		REISERFS_PATH_LEAF_POS (&path) = i;
+		rdkey = reiserfs_tree_next_key(&path, fs);
+		if (rdkey)
+		    key = *rdkey;
+		else
+		    memset (&key, 0xff, REISERFS_KEY_SIZE);
+		
+		pass_4_stat (fs)->deleted_items ++;
+	
+		/* fsck_log("Node %lu, item %u, %k: delete.\n", 
+			 bh->b_blocknr, i, &ih->ih_key); */
+		reiserfs_tree_delete (fs, &path, 0);
+		goto cont;
+	    }
+	
+	    if (reiserfs_ih_get_flags(ih) != 0) {
+		reiserfs_ih_clflags(ih);
+		reiserfs_buffer_mkdirty(bh);
+	    }
+	    
+	    /* Merge mergeable items. */
+	    if (i == 0)
+		continue;
+	    
+	    if (reiserfs_ih_stat(ih))
+		    continue;
+	    
+	    /* If not stat data and types match, try to merge items. */
+	    if (reiserfs_key_get_type(&ih->ih_key) != 
+		reiserfs_key_get_type(&(ih - 1)->ih_key))
+	    {
+		continue;
+	    }
+	    
+	    if (reiserfs_ih_dir(ih) || 
+		must_there_be_a_hole(ih - 1, &ih->ih_key) == 0)
+	    {
+		REISERFS_PATH_LEAF_POS (&path) = i;
+		rdkey = reiserfs_tree_next_key(&path, fs);
+		if (rdkey)
+		    key = *rdkey;
+		else
+		    memset (&key, 0xff, REISERFS_KEY_SIZE);
+		
+		/* fsck_log ("%s: 2 items of the same type %k, %k are found "
+			  "in the same node (%d), pos (%u). Merged.\n", 
+			  __FUNCTION__, &ih->ih_key, &(ih + 1)->ih_key,
+			  bh->b_blocknr, REISERFS_PATH_LEAF_POS(&path)); */
+		fsck_tree_merge(&path);
+		goto cont;
+	    }
+	}
+	
+	REISERFS_PATH_LEAF_POS(&path) = i - 1;
+	rdkey = reiserfs_tree_next_key (&path, fs);
+	if (rdkey)
+	    key = *rdkey;
+	else
+	    memset (&key, 0xff, REISERFS_KEY_SIZE);	
+	
+	fsck_squeeze(fs, &path);
+	
+	reiserfs_tree_pathrelse (&path);
+    cont:
+	/* to make gcc 3.2 do not sware here */;
+    }
+
+    reiserfs_tree_pathrelse (&path);
+
+    fsck_progress ("finished\n");
+    fsck_stage_report (FS_CLEANUP, fs);
+
+    /* after pass 4 */
+
+    /* put bitmap on place */
+    reiserfs_bitmap_copy (fs->fs_bitmap2, fsck_new_bitmap (fs));
+
+    /* update super block */
+    reiserfs_sb_set_free (fs->fs_ondisk_sb, 
+			  reiserfs_bitmap_zeros (fsck_new_bitmap (fs)));
+    
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+
+    /* write all dirty blocks */
+    fsck_progress ("Flushing..");
+    fs->fs_dirt = 1;
+    reiserfs_bitmap_flush (fs->fs_bitmap2, fs);
+    reiserfs_fs_flush (fs);
+    fsck_progress ("finished\n");
+
+    
+    return;
+}
diff --git a/utils/fsck/relocate.c b/utils/fsck/relocate.c
new file mode 100644
index 0000000..8ce32ac
--- /dev/null
+++ b/utils/fsck/relocate.c
@@ -0,0 +1,212 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+
+/* relocation rules: we have an item (it is taken from "non-insertable"
+   leaf). It has original key yet. We check to see if object with this
+   key is remapped. Object can be only remapped if it is not a piece
+   of directory */
+
+/* in list of this structures we store what has been relocated. */
+struct relocated {
+    unsigned long old_dir_id;
+    unsigned long old_objectid;
+    
+    unsigned long new_objectid;
+    
+    struct relocated * next;
+};
+
+/* all relocated files will be linked into lost+found directory at the
+   beginning of semantic pass */
+static struct relocated * relocated_list = NULL;
+
+__u32 fsck_relocate_get_oid (reiserfs_key_t * key) {
+    struct relocated *cur = relocated_list;
+
+    while (cur) {
+	if (cur->old_dir_id == reiserfs_key_get_did (key) &&
+	    cur->old_objectid == reiserfs_key_get_oid (key))
+	    /* object is relocated already */
+	    return cur->new_objectid;
+	cur = cur->next;
+    }
+    return 0;
+}
+
+/* return objectid the object has to be remapped with */
+__u32 fsck_relocate_oid(reiserfs_key_t * key) {
+    struct relocated * cur;
+    __u32 cur_id;
+
+    if ((cur_id = fsck_relocate_get_oid (key)) != 0)
+    	return cur_id;
+
+    cur = misc_getmem (sizeof (struct relocated));
+    cur->old_dir_id = reiserfs_key_get_did (key);
+    cur->old_objectid = reiserfs_key_get_oid (key);
+    cur->new_objectid = id_map_alloc(proper_id_map(fs));
+    cur->next = relocated_list;
+    relocated_list = cur;
+    pass_2_stat (fs)->relocated ++;
+    /*
+    fsck_log ("relocation: %K is relocated to [%lu, %lu]\n",
+	      key, reiserfs_key_get_did (key), cur->new_objectid);
+    */
+    return cur->new_objectid;
+}
+
+/* relocated files get added into lost+found with slightly different names */
+static __u64 link_one (struct relocated * file) {
+    char name[REISERFS_NAME_MAX];
+    reiserfs_key_t obj_key;
+    __u64 len = 0;
+    int entry_len;
+
+    name[0] = '\0';
+    sprintf(name, "%lu,%lu", file->old_dir_id, file->new_objectid);
+    reiserfs_key_set_did (&obj_key, file->old_dir_id);
+    reiserfs_key_set_oid (&obj_key, file->new_objectid);
+
+    /* 0 for fsck_need does not mean too much - it would make effect if there 
+     * were no this directory yet. But /lost_found is there already */
+    entry_len = reiserfs_direntry_entry_estimate(name, fs->lost_format);
+    len = reiserfs_tree_insert_entry (fs, &lost_found_dir_key, name, entry_len,
+				      &obj_key, 0/*fsck_need*/);
+    return len;
+}
+
+void fsck_relocate_mklinked(reiserfs_key_t *new_key) {
+    struct relocated *cur = relocated_list;
+    struct relocated *prev = NULL;
+
+    while (cur) {
+	if (cur->old_dir_id == reiserfs_key_get_did(new_key) && 
+	    cur->new_objectid == reiserfs_key_get_oid(new_key))
+	    break;
+
+	prev = cur;
+	cur = cur->next;
+    }
+
+    if (cur) {	
+	/* len = link_func(cur); */
+
+	if (prev) 
+	    prev->next = cur->next;
+	else
+	    relocated_list = cur->next;
+
+	misc_freemem (cur);
+    }
+}
+
+void fsck_relocate_link_all (void) {
+    struct relocated * tmp;
+    
+    while (relocated_list) {
+	link_one (relocated_list);
+	tmp = relocated_list;
+	relocated_list = relocated_list->next;
+	misc_freemem (tmp);
+    }
+}
+
+/* check whether there are any directory items with this key 
+   Returns:
+   0 is relocation is not needed;
+   1 is the whole file relocation is needed;
+   2 if a new item only relocation is needed. 
+ */
+__u32 fsck_relocate_check (reiserfs_ih_t * ih, int isdir) {
+    const reiserfs_key_t * rkey;
+    reiserfs_ih_t * path_ih;
+    reiserfs_path_t path;
+    reiserfs_key_t key;
+    int found_dir;
+
+    /* starting with the leftmost item with this key */
+    key = ih->ih_key;
+    reiserfs_key_set_sec (KEY_FORMAT_1, &key, OFFSET_SD, TYPE_STAT_DATA);
+
+    while (1) {
+	reiserfs_tree_search_item (fs, &key, &path);
+	
+	if (REISERFS_PATH_LEAF_POS (&path) == 
+	    reiserfs_node_items (REISERFS_PATH_LEAF (&path))) 
+	{
+	    rkey = reiserfs_tree_rkey (&path, fs);
+	    if (rkey && !reiserfs_key_comp2 (&key, rkey)) {
+		/* file continues in the right neighbor */
+		key = *rkey;
+		reiserfs_tree_pathrelse (&path);
+		continue;
+	    }
+	    
+	    /* there is no more items with this key */
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+	}
+
+	path_ih = REISERFS_PATH_IH (&path);
+	if (reiserfs_key_comp2 (&key, &(path_ih->ih_key))) {
+	    /* there are no more item with this key */
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+	}
+
+	found_dir = reiserfs_dir(path_ih, REISERFS_PATH_ITEM (&path));
+	
+	if (reiserfs_ih_stat (path_ih)) {
+	    if (reiserfs_ih_ischeck (path_ih)) {
+		/* we have checked it already */
+		reiserfs_tree_pathrelse (&path);
+
+		if ((found_dir && isdir) || (!found_dir && !isdir)) {
+		    /* If the item being inserted and the found one are 
+		       both either directory ones of not directory ones, 
+		       no relocation is needed. */
+		    return 0;
+		}
+		
+		/* If new one is a dirrectory one, relocate file in the tree. */
+		if (isdir) return 1;
+		
+		/* If new one is file and there is a directory in the tree, return
+		   id for the relocation, allocate it if needed. */
+		return fsck_relocate_oid (&path_ih->ih_key);
+	    } else {
+		reiserfs_ih_mkcheck (path_ih);
+		reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(&path));
+	    }
+	}
+	
+	reiserfs_tree_pathrelse (&path);
+	
+	if (isdir) {
+	    /* If directory, force relocate as it costs nothing for 
+	       the directory, and do not spend time on this check. */
+	    return 1;
+	}
+	
+	/* ok, item found, but make sure that it is not a directory one */
+	if (found_dir) {
+	    /* item of directory found. so, we have to relocate the file */
+	    return 1;
+	}
+	
+	key = path_ih->ih_key;
+	reiserfs_key_set_off (KEY_FORMAT_1, &key, 
+			      reiserfs_key_get_off (&key) + 1);
+    }
+
+    return 0;
+}
diff --git a/utils/fsck/rollback.c b/utils/fsck/rollback.c
new file mode 100644
index 0000000..1611f56
--- /dev/null
+++ b/utils/fsck/rollback.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+#include "util/misc.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define ROLLBACK_FILE_START_MAGIC       "_RollBackFileForReiserfsFSCK"
+
+static struct block_handler * rollback_blocks_array;
+static __u32 rollback_blocks_number = 0;
+static FILE * s_rollback_file = 0;
+static FILE * log_file;
+static int do_rollback = 0;
+
+static char * rollback_data;
+static unsigned int rollback_blocksize;
+
+void fsck_rollback_init (char * rollback_file, unsigned int *blocksize, FILE * log) {
+    char * string;
+    struct stat buf;
+    
+    if (rollback_file == NULL)
+        return;
+        
+    stat(rollback_file, &buf);
+    
+    s_rollback_file = fopen (rollback_file, "w+");    
+    if (s_rollback_file == NULL) {
+	fprintf (stderr, "Cannot create file %s, work without "
+		 "a rollback file\n", rollback_file);
+        return;
+    }
+
+    rollback_blocksize = *blocksize;
+
+    string = ROLLBACK_FILE_START_MAGIC;
+    fwrite (string, 28, 1, s_rollback_file);
+    fwrite (&rollback_blocksize, sizeof(rollback_blocksize), 
+	    1, s_rollback_file);
+    
+    fwrite (&rollback_blocks_number, sizeof(rollback_blocks_number), 
+	    1, s_rollback_file);
+    
+    fflush(s_rollback_file);
+        
+    rollback_data = misc_getmem(rollback_blocksize);
+    
+//    printf("\ncheckmem1");
+//    fflush (stdout);
+//    checkmem (rollback_data, misc_memsize((char *)rollback_data));
+//    printf(" OK");
+    
+    log_file = log;
+    if (log_file)
+        fprintf (log_file, "rollback: file (%s) initialize\n", rollback_file);
+
+    do_rollback = 0;
+}
+
+#if 0
+static void erase_rollback_file (char * rollback_file) {
+    close_rollback_file ();
+    unlink (rollback_file);    
+}
+#endif
+
+int fsck_rollback_prep (char * rollback_file, FILE * log) {
+    char string [28];
+    struct stat buf;
+    
+    if (rollback_file == NULL)
+        return -1;
+    
+    if (stat(rollback_file, &buf)) {
+	fprintf (stderr, "Cannot stat rollback file (%s)\n", rollback_file);
+	return -1;
+    }
+        
+    s_rollback_file = fopen (rollback_file, "r+");
+    if (s_rollback_file == NULL) {
+	fprintf (stderr, "Cannot open file (%s)\n", rollback_file);
+	return -1;
+    }
+    
+    fread (string, 28, 1, s_rollback_file);
+    if (!strcmp (string, ROLLBACK_FILE_START_MAGIC)) {
+        fprintf (stderr, "Specified file (%s) does not look like "
+		 "a rollback file\n", rollback_file);
+	
+        fclose (s_rollback_file);
+        s_rollback_file = 0;
+        return -1;
+    }
+    
+    fread (&rollback_blocksize, sizeof (rollback_blocksize), 
+	   1, s_rollback_file);
+    
+    if (rollback_blocksize <= 0) {
+        fprintf(stderr, "rollback: wrong rollback blocksize, exit\n");
+        return -1;
+    }
+    
+    log_file = log;
+    if (log_file)
+        fprintf (log_file, "rollback: file (%s) opened\n", rollback_file);
+    
+    do_rollback = 1;
+    return 0;
+}
+
+void fsck_rollback_fini () {
+    if (s_rollback_file == 0)
+        return;   
+
+    if (!do_rollback) {
+        if (fseek (s_rollback_file, 28 + sizeof(int), SEEK_SET) == (off_t)-1)
+            return;
+	
+        fwrite (&rollback_blocks_number, 
+		sizeof (rollback_blocksize), 
+		1, s_rollback_file);
+	
+        if (log_file != 0) {
+            fprintf (log_file, "rollback: %d blocks backed up\n", 
+		     rollback_blocks_number);
+	}
+    }
+        
+    fclose (s_rollback_file);
+
+    misc_freemem (rollback_data);
+    misc_freemem (rollback_blocks_array);
+/*
+    fprintf (stdout, "rollback: (%u) blocks saved, \n", 
+	     rollback_blocks_number);
+    
+    for (i = 0; i < rollback_blocks_number; i++) 
+        fprintf(stdout, "device (%Lu), block number (%u)\n", 
+                rollback_blocks_array [i].device, 
+                rollback_blocks_array [i].blocknr);
+    fprintf(stdout, "\n");
+*/
+
+}
+
+void fsck_rollback (int fd_device, int fd_journal_device, FILE * progress) {
+    long long int offset;
+    
+    struct stat buf;
+    int descriptor;
+    ssize_t retval;
+    int count_failed = 0;
+    int count_rollbacked = 0;
+    
+    int b_dev;
+    int n_dev = 0;
+    int n_journal_dev = 0;
+    unsigned long total, done = 0;
+
+    if (fd_device == 0) {
+        fprintf(stderr, "rollback: unspecified device, exit\n");
+        return;
+    }
+        
+    if (fd_journal_device) {
+        if (!fstat (fd_journal_device, &buf)) {
+            n_journal_dev = buf.st_rdev;
+        } else {
+            fprintf(stderr, "rollback: specified journal device "
+		    "cannot be stated\n");
+        }
+    }
+    
+    if (!fstat (fd_device, &buf)) {
+        n_dev = buf.st_rdev;
+    } else {
+        fprintf(stderr, "rollback: specified device cannot "
+		"be stated, exit\n");
+        return;
+    }
+    
+    rollback_data = misc_getmem (rollback_blocksize);
+//    printf("\ncheckmem2");
+//    fflush (stdout);
+//    checkmem (rollback_data, misc_memsize((char *)rollback_data));
+//   printf(" OK");
+    
+    fread (&rollback_blocks_number, 
+	   sizeof (rollback_blocks_number), 
+	   1, s_rollback_file);
+
+    total = rollback_blocks_number;
+    
+    while (1) {
+	if (!fsck_quiet(fs)) {
+	    util_misc_progress (progress, &done, 
+				rollback_blocks_number, 
+				1, 0);
+	}
+	
+        descriptor = 0;
+        if ((retval = fread (&b_dev, sizeof (b_dev), 
+			     1, s_rollback_file)) <= 0) 
+	{
+            if (retval) 
+                fprintf (stderr, "rollback: fread: %s\n", strerror (errno));
+            
+	    break;            
+        }
+	
+        if ((retval = fread (&offset, sizeof (offset), 
+			     1, s_rollback_file)) <= 0) 
+	{
+            if (retval) 
+                fprintf (stderr, "rollback: fread: %s\n", strerror (errno));
+        
+	    break;
+        }
+
+        if ((retval = fread (rollback_data, rollback_blocksize, 
+			     1, s_rollback_file)) <= 0) 
+	{
+            if (retval) 
+                fprintf (stderr, "rollback: fread: %s\n", strerror (errno));
+            
+	    break;
+        }
+                
+        if (n_dev == b_dev)
+            descriptor = fd_device;
+        
+	if ((n_journal_dev) && (n_journal_dev == b_dev))
+            descriptor = fd_journal_device;
+        
+        if (descriptor == 0) {
+            fprintf(stderr, "rollback: block from unknown "
+		    "device, skip block\n");
+            count_failed ++;
+            continue;
+        }
+        
+        if (lseek (descriptor, offset, SEEK_SET) == (off_t)-1) {
+            fprintf(stderr, "device cannot be lseeked, skip block\n");
+            count_failed ++;
+            continue;
+        }
+        
+        if (write (descriptor, rollback_data, rollback_blocksize) == -1) {
+            fprintf (stderr, "rollback: write %d bytes returned error "
+		"(block=%lld, dev=%d): %s\n", rollback_blocksize, 
+		offset/rollback_blocksize, b_dev, strerror (errno));
+            count_failed ++;
+        } else {
+            count_rollbacked ++;
+              /*if you want to know what gets rollbacked, uncomment it*/
+/*            if (log_file != 0 && log_file != stdout) 
+                fprintf (log_file, "rollback: block %Lu of "
+			 "device %Lu was restored\n",
+                        (unsigned long long)offset/rollback_blocksize, b_dev);
+
+	    
+            fprintf (stdout, "rollback: block (%Ld) written\n", 
+		     (long long int)offset/rollback_blocksize);
+*/
+        }
+    }
+    
+    printf ("\n");
+    
+    if (log_file != 0) {
+        fprintf (log_file, "rollback: (%u) blocks restored\n", 
+		 count_rollbacked);
+    }
+}
+
+
+/*
+static void rollback__mark_block_saved (struct block_handler * rb_e) {
+    if (rollback_blocks_array == NULL)
+        rollback_blocks_array = 
+		misc_getmem (ROLLBACK__INCREASE_BLOCK_NUMBER * sizeof (*rb_e));
+    
+    if (rollback_blocks_number == 
+	misc_memsize ((void *)rollback_blocks_array) / sizeof (*rb_e))
+    {
+        rollback_blocks_array = 
+		misc_expandmem (rollback_blocks_array, 
+				misc_memsize((void *)rollback_blocks_array),
+				ROLLBACK__INCREASE_BLOCK_NUMBER * 
+				sizeof (*rb_e));
+    }
+
+//    checkmem ((char *)rollback_blocks_array, 
+		misc_memsize((char *)rollback_blocks_array));
+
+    rollback_blocks_array[rollback_blocks_number] = *rb_e;
+    rollback_blocks_number ++;
+    qsort (rollback_blocks_array, rollback_blocks_number, 
+	   sizeof (*rb_e), rollback_compare);
+    
+//    printf("\ncheckmem3");
+//    fflush (stdout);
+//    checkmem ((char *)rollback_blocks_array, 
+		misc_memsize((char *)rollback_blocks_array));
+//    printf(" OK");
+}
+*/
+
diff --git a/utils/fsck/semantic_check.c b/utils/fsck/semantic_check.c
new file mode 100644
index 0000000..b611b90
--- /dev/null
+++ b/utils/fsck/semantic_check.c
@@ -0,0 +1,870 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+#include "misc/unaligned.h"
+#include "misc/misc.h"
+#include "util/misc.h"
+
+#include <sys/stat.h>
+
+static reiserfs_key_t *trunc_links = NULL;
+static __u32 links_num = 0;
+
+int wrong_mode (reiserfs_key_t * key, __u16 * mode, __u64 real_size, int symlink);
+int wrong_fdb (reiserfs_key_t * key, int blocksize, __u32 * first_direct_byte,
+			     __u32 sd_fdb, __u32 size);
+void get_object_key (reiserfs_deh_t * deh, reiserfs_key_t * key, 
+		     reiserfs_key_t * entry_key, reiserfs_ih_t * ih);
+
+struct path_key {
+    struct short_key {
+        __u32 k_dir_id;
+        __u32 k_objectid;
+    } key;
+    struct path_key * next, * prev;
+};
+
+struct path_key * head_key = NULL;
+struct path_key * tail_key = NULL;
+
+static int check_path_key(reiserfs_key_t * key) {
+    struct path_key * cur = head_key;
+
+    while(cur != NULL) {
+        if (!reiserfs_key_comp2(&cur->key, key)) {
+            fsck_log("\nsemantic check: The directory %k has 2 names.", key);
+            return LOOP_FOUND;
+        }
+	
+        cur = cur->next;
+    }
+    
+    return 0;
+}
+
+static int add_path_key(reiserfs_key_t * key) {
+    if (check_path_key(key))
+    	return LOOP_FOUND;
+
+    if (tail_key == NULL) {
+        tail_key = misc_getmem(sizeof(struct path_key));
+        head_key = tail_key;
+        tail_key->prev = NULL;
+    } else {
+        tail_key->next = misc_getmem(sizeof(struct path_key));
+        tail_key->next->prev = tail_key;
+        tail_key = tail_key->next;
+    }
+    
+    reiserfs_key_copy2 ((reiserfs_key_t *)&tail_key->key, key);
+    tail_key->next = NULL;
+
+    return 0;
+}
+
+static void del_path_key() {
+    if (tail_key == NULL)
+        misc_die("Wrong path_key structure");
+
+    if (tail_key->prev == NULL) {
+        misc_freemem(tail_key);
+        tail_key = head_key = NULL;
+    } else {
+        tail_key = tail_key->prev;
+        misc_freemem(tail_key->next);
+        tail_key->next = NULL;
+    }
+}
+
+/* path is path to stat data. If file will be relocated - new_ih will contain
+   a key file was relocated with */
+static int check_check_regular_file (reiserfs_path_t * path, void * sd,
+                                     reiserfs_ih_t * new_ih)
+{
+    int is_new_file;
+//    reiserfs_key_t key, sd_key;
+    __u16 mode;
+    __u32 nlink;
+    __u64 real_size, sd_size;
+    __u32 blocks, sd_blocks;	/* proper values and value in stat data */
+    __u32 first_direct_byte, sd_fdb;
+
+    reiserfs_ih_t * ih, sd_ih;
+    int fix_sd;
+    int symlnk = 0;
+    int retval = OK;
+    int tmp_position;
+
+
+    ih = REISERFS_PATH_IH (path);
+
+    if (new_ih) {
+	/* this objectid is used already */
+	*new_ih = *ih;
+	reiserfs_tree_pathrelse (path);
+	fsck_file_relocate (&new_ih->ih_key, 1);
+	fsck_relocate_mklinked(&new_ih->ih_key);
+	one_less_corruption (fs, FIXABLE);
+	sem_pass_stat (fs)->oid_sharing_files_relocated ++;
+	retval = RELOCATED;
+	
+	if (reiserfs_tree_search_item (fs, &(new_ih->ih_key), path) == 
+	    ITEM_NOT_FOUND)
+	{
+	    reiserfs_panic ("%s: Could not find a StatData of the relocated "
+			    "file %K", __FUNCTION__, &new_ih->ih_key);
+	}
+	
+	/* stat data is marked unreachable again due to relocation, fix that */
+	ih = REISERFS_PATH_IH (path);
+	sd = REISERFS_PATH_ITEM (path);
+    }
+    
+
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE)
+	is_new_file = 1;
+    else
+	is_new_file = 0;
+
+
+    reiserfs_stat_get_nlink (ih, sd, &nlink);
+    reiserfs_stat_get_mode (ih, sd, &mode);
+    reiserfs_stat_get_size (ih, sd, &sd_size);
+    reiserfs_stat_get_blocks (ih, sd, &sd_blocks);
+
+/*	
+    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+    	// check and set nlink first 
+    	nlink ++;
+    	reiserfs_stat_set_nlink (ih, sd, &nlink);
+    	reiserfs_buffer_mkdirty (bh);
+
+    	if (nlink > 1)
+	    return OK;
+    }
+*/
+
+    if (!is_new_file)
+	reiserfs_stat_get_fdb (ih, sd, &sd_fdb);
+
+    if (S_ISLNK (mode)) 	
+	symlnk = 1;
+    
+    sd_ih = *ih;
+//    sd_key = sd_ih.ih_key;
+    reiserfs_tree_pathrelse (path);
+
+    if (are_file_items_correct (&sd_ih, sd, &real_size, &blocks, 
+				0/* do not mark reachable */, &symlnk) != 1)
+    {
+	one_more_corruption (fs, FATAL);
+	fsck_log ("check_regular_file: The file %K with the corrupted "
+		  "structure found\n", &sd_ih.ih_key);
+    } else {
+	fix_sd = 0;
+    
+	fix_sd += wrong_mode (&sd_ih.ih_key, &mode, real_size, symlnk);
+	if (!is_new_file)
+	    fix_sd += wrong_fdb (&sd_ih.ih_key, fs->fs_blocksize,
+		&first_direct_byte, sd_fdb, real_size);
+	
+	if (misc_bin_search(&sd_ih.ih_key, trunc_links, links_num, 
+				sizeof(sd_ih.ih_key), &tmp_position, 
+				reiserfs_key_comp2) != 1) 
+	{
+	    fix_sd += wrong_st_size (&sd_ih.ih_key, is_new_file ? 
+				     REISERFS_SD_SIZE_MAX_V2 : 
+				     REISERFS_SD_SIZE_MAX_V1,
+				     fs->fs_blocksize, &real_size, 
+				     sd_size, symlnk ? TYPE_SYMLINK : 0);
+	} else {
+	    real_size = sd_size;
+	}
+	
+	fix_sd += wrong_st_blocks (&sd_ih.ih_key, &blocks, 
+				   sd_blocks, mode, is_new_file);
+
+	if (fix_sd) {
+	    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+    		reiserfs_bh_t * bh;
+  	        /* find stat data and correct it */
+  	        reiserfs_key_set_sec (KEY_FORMAT_1, &sd_ih.ih_key, 
+				      OFFSET_SD, TYPE_STAT_DATA);
+		
+	        if (reiserfs_tree_search_item (fs, &sd_ih.ih_key, path) != 
+		    ITEM_FOUND) 
+		{
+		    fsck_log ("check_regular_file: A StatData of the file %K "
+			      "cannot be found\n", &sd_ih.ih_key);
+		    
+                    one_more_corruption (fs, FATAL);
+                    return STAT_DATA_NOT_FOUND;
+	        }
+	    
+	        bh = REISERFS_PATH_LEAF (path);
+	        ih = REISERFS_PATH_IH (path);
+	        sd = REISERFS_PATH_ITEM (path);
+	        reiserfs_stat_set_size (ih, sd, &real_size);
+	        reiserfs_stat_set_blocks (ih, sd, &blocks);
+	        reiserfs_stat_set_mode (ih, sd, &mode);
+	        if (!is_new_file)
+		    reiserfs_stat_set_fdb (ih, sd, &first_direct_byte);
+		reiserfs_buffer_mkdirty (bh);
+	    } else {
+		fsck_check_stat (fs)->fixable_corruptions += fix_sd;
+	    }
+	}
+    }
+    
+    return retval;
+}
+
+/* returns buffer, containing found directory item.*/
+static char * get_next_directory_item (
+	/* on return this will contain key of next item in the tree */
+	reiserfs_key_t * key, 
+	const reiserfs_key_t * parent, 
+	reiserfs_ih_t * ih, 
+	__u32 * pos_in_item, 
+	int dir_format)
+{
+    const reiserfs_key_t * rdkey;
+    REISERFS_PATH_INIT (path);
+    reiserfs_deh_t * deh;
+    reiserfs_bh_t * bh;
+    char * dir_item;
+    int entry_len;
+    int retval;
+    int i;
+
+
+start_again:
+
+    retval = reiserfs_tree_search_entry (fs, key, &path);
+
+    if (retval != POSITION_FOUND && 
+	reiserfs_key_get_off (key) != OFFSET_DOT)
+    {
+	reiserfs_panic ("get_next_directory_item: The current "
+			"directory %k cannot be found", key);
+    }
+
+    /* leaf containing directory item */
+    bh = REISERFS_PATH_LEAF (&path);
+    *pos_in_item = path.pos_in_item;
+    *ih = *REISERFS_PATH_IH (&path);
+    deh = reiserfs_deh (bh, ih);
+
+    /* position was not found for '.' or there is no '..' */
+    if (retval != POSITION_FOUND || 
+	((reiserfs_key_get_off (key) == OFFSET_DOT) &&
+	 (reiserfs_ih_get_entries (ih) < 2 || 
+	  reiserfs_direntry_name_len (ih, deh + 1, 1) != 2 ||
+	  strncmp (reiserfs_deh_name (deh + 1, 1), "..", 2)))) 
+    {
+	fsck_log ("get_next_directory_item: The %s %k cannot be found in %k",
+		  (retval == POSITION_NOT_FOUND) ? "entry" : "directory", 
+		  key, &ih->ih_key);
+	
+	if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+	    /* add "." and ".." exist */
+	    reiserfs_tree_pathrelse (&path);
+	    
+	    entry_len = reiserfs_direntry_entry_estimate (".", dir_format);
+	    reiserfs_tree_insert_entry (fs, key, ".",  entry_len, key, 0);
+	    entry_len = reiserfs_direntry_entry_estimate ("..", dir_format);
+	    reiserfs_tree_insert_entry (fs, key, "..", entry_len, parent, 0);
+	    
+	    fsck_log (" - entry was added\n");
+	    goto start_again;
+	} else {
+	    one_more_corruption (fs, FIXABLE);
+	    fsck_log ("\n");
+	    if (retval == DIRECTORY_NOT_FOUND)
+	        return 0;
+	}
+    }
+
+    /* mark hidden entries as visible, set "." and ".." correctly */
+    deh += *pos_in_item;
+    for (i = *pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	if (reiserfs_deh_get_off (deh) == OFFSET_DOT) {
+	    if (reiserfs_key_comp2 (&(deh->deh2_dir_id), key)) {
+		/* "." must point to the directory it is in */
+		
+		//deh->deh_objectid != REISERFS_ROOT_PARENT_OBJECTID)/*????*/ {
+		fsck_log ("get_next_directory_item: The entry \".\" of the "
+			  "directory %K points to %K, instead of %K", key, 
+			  (reiserfs_key_t *)(&(deh->deh2_dir_id)), key);
+		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+		    reiserfs_deh_set_did (deh, reiserfs_key_get_did (key));
+		    reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (key));
+		    reiserfs_buffer_mkdirty (bh);
+		    fsck_log (" - corrected\n");
+		} else {
+		    one_more_corruption (fs, FIXABLE);
+		    fsck_log ("\n");
+		}
+	    }
+	}
+
+	if (reiserfs_deh_get_off (deh) == OFFSET_DOT_DOT) {
+	    /* set ".." so that it points to the correct parent directory */
+	    if (reiserfs_key_comp2 (&(deh->deh2_dir_id), parent)) {
+		fsck_log ("get_next_directory_item: The entry \"..\" of the "
+			  "directory %K points to %K, instead of %K", key, 
+			  (reiserfs_key_t *)(&(deh->deh2_dir_id)), parent);
+		
+		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+		    reiserfs_deh_set_did (deh, reiserfs_key_get_did (parent));
+		    reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (parent));
+		    reiserfs_buffer_mkdirty (bh);
+		    fsck_log (" - corrected\n");
+		} else {
+		    one_more_corruption (fs, FIXABLE);
+		    fsck_log ("\n");
+		}
+	    }
+	}
+    }
+
+    /* copy directory item to the temporary buffer */
+    dir_item = misc_getmem (reiserfs_ih_get_len (ih));
+    memcpy (dir_item, reiserfs_item_by_ih (bh, ih), reiserfs_ih_get_len (ih));
+
+
+    /* next item key */
+    if (REISERFS_PATH_LEAF_POS (&path) == (reiserfs_node_items (bh) - 1) &&
+	(rdkey = reiserfs_tree_rkey (&path, fs)))
+	reiserfs_key_copy (key, rdkey);
+    else {
+	reiserfs_key_set_did (key, 0);
+	reiserfs_key_set_oid (key, 0);
+    }
+
+    if (fsck_mode (fs) == FSCK_REBUILD)
+        fsck_item_mkreach (REISERFS_PATH_IH (&path), bh);
+    reiserfs_tree_pathrelse (&path);
+
+    return dir_item;
+}
+
+/* semantic pass of --check */
+static int check_semantic_pass (const reiserfs_key_t * key, 
+				const reiserfs_key_t * parent, 
+				int dot_dot, 
+				reiserfs_ih_t * new_ih)
+{
+    reiserfs_path_t path;
+    void * sd;
+    __u32 nlink;
+    int is_new_dir;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+    int retval;
+    char * dir_item;
+    __u32 pos_in_item;
+    reiserfs_ih_t tmp_ih;
+    reiserfs_key_t next_item_key, entry_key, object_key;
+    __u64 dir_size = 0;
+    __u32 blocks;
+    __u64 sd_size;
+    __u32 sd_blocks;
+    int fix_sd;
+    /*int relocate;*/
+    int dir_format = 0;
+    __u16 mode;
+    	
+    retval = OK;
+
+ /* start_again: when directory was relocated */
+
+    if (!reiserfs_key_stat (key)) {
+	fsck_log ("%s: The key %k must be key of a StatData\n", 
+		  __FUNCTION__, key);
+	one_more_corruption (fs, FATAL);
+        return STAT_DATA_NOT_FOUND;
+    }
+
+    /* look for stat data of an object */
+    if (reiserfs_tree_search_item (fs, key, &path) == ITEM_NOT_FOUND) {
+	reiserfs_tree_pathrelse (&path);
+	return STAT_DATA_NOT_FOUND;
+    }
+
+    /* stat data has been found */
+    ih = REISERFS_PATH_IH (&path);
+    sd = REISERFS_PATH_ITEM(&path);
+
+    reiserfs_stat_get_nlink (ih, sd, &nlink);
+
+    /* It seems quite difficult to relocate objects on fix-fixable - 
+     * rewrite_file calls reiserfs_file_write which can convert tails 
+     * to unfm, plus unreachable, was_tail flags, etc. */
+#if 0
+    if ((/* relocate = */ should_be_relocated(&ih->ih_key))) {
+	/*
+	if (fsck_mode(fs) == FSCK_CHECK)
+	    relocate = 0;
+	*/
+	one_more_corruption(fs, FATAL);
+    }
+#endif
+
+    if (fix_obviously_wrong_sd_mode (&path)) {
+        one_more_corruption (fs, FIXABLE);
+	reiserfs_tree_pathrelse (&path);
+        return OK;
+    }
+    
+    if (nlink == 0) {
+	fsck_log ("%s: block %lu: The StatData %k has "
+		  "bad nlink number (%u)\n", __FUNCTION__,
+		  REISERFS_PATH_LEAF(&path)->b_blocknr, 
+		  &ih->ih_key, nlink);
+	
+	one_more_corruption (fs, FATAL); 
+    }
+    
+    if (not_a_directory (sd)) {
+	fsck_check_stat (fs)->files ++;
+	
+	retval = check_check_regular_file (&path, sd, 0);
+	reiserfs_tree_pathrelse (&path);
+	return retval;
+    }
+    
+/*
+    if (relocate) {
+	if (!new_ih)
+	    reiserfs_panic ("%s: Memory is not prepared for relocation of %K", 
+			    __FUNCTION__, &ih->ih_key);
+	*new_ih = *ih;
+	reiserfs_tree_pathrelse (&path);
+	sem_pass_stat (fs)->oid_sharing_dirs_relocated ++;
+	relocate_dir (new_ih, 1);
+	fsck_relocate_mklinked(&new_ih->ih_key);
+	one_less_corruption (fs, FIXABLE);
+	*key = new_ih->ih_key;
+	retval = RELOCATED;
+	goto start_again;
+    }
+*/
+
+/* 
+    if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+    	// it looks like stat data of a directory found 
+    	if (nlink) {
+	    // we saw this directory already 
+	    if (!dot_dot) {
+	    	// this name is not ".."  - and hard links are not 
+		// allowed on directories 
+	    	reiserfs_tree_pathrelse (&path);
+	    	return STAT_DATA_NOT_FOUND;
+	    } else {
+	    	// ".." found 
+	    	nlink ++;
+	    	reiserfs_stat_set_nlink (ih, sd, &nlink);
+	    	reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path));
+	    	reiserfs_tree_pathrelse (&path);
+	    	return OK;
+	    }
+    	} // do not run it for dot_dot on check at all
+    	
+     	nlink = 2;
+    	if (reiserfs_key_get_oid (key) == REISERFS_ROOT_OBJECTID)
+	    nlink ++;
+    	reiserfs_stat_set_nlink (ih, sd, &nlink);
+    	reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path));    
+    }
+*/
+
+    /* directory stat data found */
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE)
+	is_new_dir = 1;
+    else
+	is_new_dir = 0;
+
+    /* save stat data's size and st_blocks */
+    reiserfs_stat_get_size (ih, sd, &sd_size);
+    reiserfs_stat_get_blocks (ih, sd, &sd_blocks);
+    reiserfs_stat_get_mode (ih, sd, &mode);
+
+    dir_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == 
+		  REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
+
+    /* release path pointing to stat data */
+    reiserfs_tree_pathrelse (&path);
+
+    fsck_check_stat (fs)->dirs ++;
+
+    reiserfs_key_set_did (&next_item_key, reiserfs_key_get_did (key));
+    reiserfs_key_set_oid (&next_item_key, reiserfs_key_get_oid (key));
+    reiserfs_key_set_off1 (&next_item_key, OFFSET_DOT);
+    reiserfs_key_set_uni (&next_item_key, UNI_DE);
+
+    dir_size = 0;
+    while ((dir_item = get_next_directory_item (&next_item_key, parent, &tmp_ih, 
+						&pos_in_item, dir_format)) != 0)
+    {
+	/* dir_item is copy of the item in separately allocated memory,
+	   item_key is a key of next item in the tree */
+	int i;
+	char name[REISERFS_NAME_MAX];
+	int namelen, entry_len;
+	reiserfs_deh_t * deh = (reiserfs_deh_t *)dir_item + pos_in_item;
+	
+	for (i = pos_in_item; 
+	     i < reiserfs_ih_get_entries (&tmp_ih); 
+	     i ++, deh ++) 
+	{
+	    reiserfs_ih_t relocated_ih;
+	    int ret = OK;
+	    
+	    name[0] = '\0';
+	
+	    namelen = reiserfs_direntry_name_len (&tmp_ih, deh, i);
+	    sprintf(name, "%.*s", namelen, reiserfs_deh_name (deh, i));
+	    entry_len = reiserfs_direntry_entry_len (&tmp_ih, deh, i);
+	
+	    get_object_key (deh, &object_key, &entry_key, &tmp_ih);
+
+	    if ((dir_format == KEY_FORMAT_2) && (entry_len % 8 != 0)) {
+		/* not alighed directory of new format - delete it */
+		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+		    fsck_log ("Entry %K (\"%.*s\") in the directory %K is not "
+			      "formated properly - deleted\n",
+			      (reiserfs_key_t *)&(deh->deh2_dir_id), namelen, 
+			      name, &tmp_ih.ih_key);
+		    
+		    reiserfs_tree_delete_entry (fs, &entry_key);
+		    
+		    entry_len = 
+			reiserfs_direntry_entry_estimate (name, dir_format);
+
+		    reiserfs_tree_insert_entry (fs, key, name, entry_len,
+			(reiserfs_key_t *)&(deh->deh2_dir_id), 0);
+		} else {
+		    fsck_log ("Entry %K (\"%.*s\") in the directory %K is "
+			      "not formated properly.\n", 
+			      (reiserfs_key_t *)&(deh->deh2_dir_id), 
+			      namelen, name, &tmp_ih.ih_key);
+		    
+		    one_more_corruption (fs, FIXABLE);
+		}
+	    }
+	
+	    if (!reiserfs_hash_correct (&fs->hash, name, 
+					namelen, reiserfs_deh_get_off (deh))) 
+	    {
+		one_more_corruption (fs, FATAL);
+		fsck_log ("%s: Hash mismatch detected for (%.*s) in directory "
+			  "%K\n", __FUNCTION__, namelen, name, &tmp_ih.ih_key);
+	    }
+	
+	    if (is_dot (name, namelen) || (is_dot_dot (name, namelen))) {
+		/* do not go through "." and ".." */
+		ret = OK;
+	    } else {
+		if (!fsck_quiet(fs)) {
+			util_misc_print_name (fsck_progress_file(fs), 
+					      name, namelen);
+		}
+	    
+		if ((ret = add_path_key (&object_key)) == 0) {
+		    ret = check_semantic_pass (&object_key, key, 
+					       is_dot_dot(name, namelen), 
+					       &relocated_ih);
+		    del_path_key ();
+		}
+
+		if (!fsck_quiet(fs)) {
+		    util_misc_erase_name (fsck_progress_file(fs), 
+					  namelen);
+		}
+	    }
+	    
+	    /* check what check_semantic_tree returned */
+	    switch (ret) {
+	    case OK:
+		dir_size += REISERFS_DEH_SIZE + entry_len;
+		break;
+		
+	    case STAT_DATA_NOT_FOUND:
+		fsck_log ("%s: Name \"%.*s\" in directory %K points to "
+			  "nowhere\n", __FUNCTION__, namelen, name, 
+			  &tmp_ih.ih_key);
+	    case LOOP_FOUND:
+		if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+		    reiserfs_tree_delete_entry (fs, &entry_key);
+		    fsck_log (" - removed");
+		} else {
+		    one_more_corruption (fs, FIXABLE);
+		}
+		fsck_log ("\n");
+		break;
+		    
+	    case DIRECTORY_HAS_NO_ITEMS:
+		fsck_log ("%s: Name \"%.*s\" in directory %K points a "
+			  "directory without body\n", __FUNCTION__, 
+			  namelen, name, &tmp_ih.ih_key);
+		
+		/* fixme: stat data should be deleted as well */
+		/*
+		  if (fsck_fix_fixable (fs)) {
+		  reiserfs_tree_delete_entry (fs, &entry_key);
+		  fsck_data(fs)->deleted_entries ++;
+		  fsck_log (" - removed");
+		  }
+		  fsck_log ("\n");*/
+		break;
+		
+	    case RELOCATED:
+		/* file was relocated, update key in corresponding direntry */
+		if (reiserfs_tree_search_entry (fs, &entry_key, &path) != 
+		    POSITION_FOUND) 
+		{
+		    fsck_log("Cannot find a name of the relocated file %K in "
+			     "the directory %K\n", &entry_key, &tmp_ih.ih_key);
+		} else {
+		    /* update key dir entry points to */
+		    reiserfs_deh_t * tmp_deh;
+		    
+		    tmp_deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), 
+					    REISERFS_PATH_IH (&path)) + 
+			      path.pos_in_item;
+		    
+		    fsck_log ("The directory %K pointing to %K (\"%.*s\") "
+			      "updated to point to ", &tmp_ih.ih_key, 
+			      &tmp_deh->deh2_dir_id, namelen, name);
+		    
+		    reiserfs_deh_set_did (tmp_deh, 
+			reiserfs_key_get_did (&relocated_ih.ih_key));
+		    reiserfs_deh_set_obid (tmp_deh, 
+			reiserfs_key_get_oid (&relocated_ih.ih_key));
+
+		    fsck_log ("%K (\"%.*s\")\n",  &tmp_deh->deh2_dir_id, 
+			      namelen, name);
+		    
+		    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path));
+		}
+		
+		dir_size += REISERFS_DEH_SIZE + entry_len;
+		reiserfs_tree_pathrelse (&path);
+		break;
+	    }
+	} /* for */
+	
+	misc_freemem (dir_item);
+
+	if (reiserfs_key_comp2 (&next_item_key, key))
+	    /* next key is not of this directory */
+	    break;
+    } /* while (dir_item) */
+    
+    
+    if (dir_size == 0)
+	/* FIXME: is it possible? */
+	return DIRECTORY_HAS_NO_ITEMS;
+    
+    /* calc correct value of sd_blocks field of stat data */
+    blocks = REISERFS_DIR_BLOCKS (dir_size);
+    
+    fix_sd = 0;
+    fix_sd += wrong_st_blocks (key, &blocks, sd_blocks, mode, is_new_dir);
+    fix_sd += wrong_st_size (key, is_new_dir ? REISERFS_SD_SIZE_MAX_V2 : 
+			     REISERFS_SD_SIZE_MAX_V1, fs->fs_blocksize, 
+			     &dir_size, sd_size, TYPE_DIRENTRY);
+
+    if (fix_sd) {
+	if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
+	    /* we have to fix either sd_size or sd_blocks, look for SD again */
+	    if (reiserfs_tree_search_item (fs, key, &path) != ITEM_FOUND) {
+		fsck_log ("%s: The StatData of the file %K was not found\n",
+			  __FUNCTION__, key);
+		one_more_corruption(fs, FATAL);
+                return STAT_DATA_NOT_FOUND;
+	    }
+	
+	    bh = REISERFS_PATH_LEAF (&path);
+	    ih = REISERFS_PATH_IH (&path);
+	    sd = REISERFS_PATH_ITEM (&path);
+	
+	    reiserfs_stat_set_size (ih, sd, &dir_size);
+	    reiserfs_stat_set_blocks (ih, sd, &blocks);
+	    reiserfs_buffer_mkdirty (bh);
+	    reiserfs_tree_pathrelse (&path);
+	} else {
+	    fsck_check_stat (fs)->fixable_corruptions += fix_sd;
+	}
+    }
+    
+    return retval;
+}
+
+int check_safe_links ()
+{
+    reiserfs_path_t safe_link_path, path;
+    reiserfs_key_t safe_link_key = {-1, 0, {{0, 0}}};
+    reiserfs_key_t key = {0, 0, {{0, 0}}};
+    const reiserfs_key_t * rkey;
+    reiserfs_ih_t * tmp_ih;
+
+    while (1) {
+        if (reiserfs_key_get_did (&safe_link_key) == 0)
+            break;
+
+	reiserfs_tree_search_item (fs, &safe_link_key, &safe_link_path);
+	
+	if (reiserfs_nh_get_items( NODE_HEAD(REISERFS_PATH_LEAF(&safe_link_path))) <= 
+	    REISERFS_PATH_LEAF_POS (&safe_link_path)) 
+	{
+	    reiserfs_tree_pathrelse (&safe_link_path);
+            break;
+	}	
+	
+	tmp_ih = REISERFS_PATH_IH(&safe_link_path);
+	
+        if (reiserfs_key_get_did(&tmp_ih->ih_key) != (__u32)-1 ||
+	    reiserfs_key_get_oid(&tmp_ih->ih_key) == (__u32)-1) {
+	    reiserfs_tree_pathrelse (&safe_link_path);
+            break;
+	}
+
+        if (reiserfs_ih_get_len (tmp_ih) != 4)
+	    reiserfs_panic ("Safe Link %k cannot be of the size %d", 
+		&tmp_ih->ih_key, reiserfs_ih_get_len (tmp_ih));
+	
+	reiserfs_key_set_did(&key, d32_get((__u32 *)REISERFS_PATH_ITEM(&safe_link_path), 0));
+	reiserfs_key_set_oid(&key, reiserfs_key_get_oid(&tmp_ih->ih_key));
+	if ((rkey = reiserfs_tree_next_key(&safe_link_path, fs)) == NULL)
+	    reiserfs_key_set_did (&safe_link_key, 0);
+	else
+	    safe_link_key = *rkey;
+	
+	if (reiserfs_tree_search_item (fs, &key, &path) == ITEM_NOT_FOUND) {
+	    /*sware on check, delete on fix-fixable*/
+	    if (fsck_mode(fs) == FSCK_CHECK) {
+		fsck_log ("Invalid safe link %k: cannot find the pointed "
+			  "object (%K)\n", &tmp_ih->ih_key, &key);
+		
+		one_more_corruption (fs, FIXABLE);
+	    } else if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
+		fsck_log ("Invalid safe link %k: cannot find the pointed "
+			  "object (%K) - safe link was deleted\n", 
+			  &tmp_ih->ih_key, &key);
+		
+		d32_put((__u32 *)REISERFS_PATH_ITEM(&safe_link_path), 0, 0);
+		reiserfs_tree_pathrelse (&path);
+		reiserfs_tree_delete (fs, &safe_link_path, 0);		
+		continue;
+	    }
+	} else if (reiserfs_key_get_off(&tmp_ih->ih_key) == 0x1) {
+	    /* Truncate */
+	    if (!not_a_directory (REISERFS_PATH_ITEM(&path))) {
+		/*truncate on directory should not happen*/
+		/*sware on check, delete on fix-fixable*/
+		if (fsck_mode(fs) == FSCK_CHECK) {
+		    fsck_log ("Invalid 'truncate' safe link %k, cannot happen "
+			      "for directory (%K)\n", &tmp_ih->ih_key, &key);
+		    one_more_corruption (fs, FIXABLE);
+		} else if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
+		    fsck_log ("Invalid 'truncate' safe link %k, cannot happen "
+			      "for a directory (%K) - safe link was deleted\n", 
+			      &tmp_ih->ih_key, &key);
+		    
+		    d32_put((__u32 *)REISERFS_PATH_ITEM(&safe_link_path), 0, 0);
+		    reiserfs_tree_pathrelse (&path);
+		    reiserfs_tree_delete (fs, &safe_link_path, 0);		
+		    continue;
+		}
+	    } else {
+		/* save 'safe truncate links' to avoid wrong sizes swaring. */
+		int position;
+		
+		if (misc_bin_search (&key, trunc_links, links_num, 
+					 sizeof(key), &position, 
+					 reiserfs_key_comp2) != 1)
+		{
+		    blocklist__insert_in_position(&key, (void *)&trunc_links, 
+						  &links_num, sizeof(key), 
+						  &position);
+		}
+	    }
+	}
+	
+	reiserfs_tree_pathrelse (&path);
+	reiserfs_tree_pathrelse (&safe_link_path);
+    }
+
+    return OK;
+}
+
+void release_safe_links () {
+    misc_freemem(trunc_links);
+}
+
+/* called when --check is given */
+void fsck_semantic_check (void) {
+    if (fsck_data (fs)->check.bad_nodes) {
+        fsck_progress ("Bad nodes were found, Semantic pass skipped\n");
+        goto clean;
+    }
+
+    if (fsck_data (fs)->check.fatal_corruptions) {
+        fsck_progress ("Fatal corruptions were found, Semantic pass skipped\n");
+        goto clean;
+    }
+ 
+    fsck_progress ("Checking Semantic tree...\n");
+    
+    if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
+        /*create new_bitmap, and initialize new_bitmap & allocable bitmap*/
+        fsck_new_bitmap (fs) = 
+		reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb));
+	
+        reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
+        fsck_allocable_bitmap (fs) = 
+		reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb));
+	
+        reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
+	fs->block_allocator = reiserfsck_new_blocknrs;
+	fs->block_deallocator = reiserfsck_free_block;
+    }
+    
+    check_safe_links ();
+    
+    if (check_semantic_pass (&root_dir_key, &parent_root_dir_key, 0, 0) != OK) {
+        fsck_log ("check_semantic_tree: No root directory found");
+        one_more_corruption (fs, FATAL);
+    }
+
+    release_safe_links ();
+
+    if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
+        reiserfs_bitmap_delete (fs->fs_bitmap2);
+	reiserfs_bitmap_delta (fsck_new_bitmap (fs), fsck_deallocate_bitmap (fs));	
+        fs->fs_bitmap2 = fsck_new_bitmap (fs);
+        reiserfs_bitmap_delete (fsck_allocable_bitmap (fs));	
+        fsck_allocable_bitmap (fs) = NULL;
+        reiserfs_sb_set_free (fs->fs_ondisk_sb, 
+			    reiserfs_bitmap_zeros (fs->fs_bitmap2));
+	
+        reiserfs_buffer_mkdirty (fs->fs_super_bh);
+	reiserfs_badblock_flush(fs, 1);
+    }
+   
+    if (!fsck_quiet(fs))
+	util_misc_fini_name(fsck_progress_file(fs));
+    
+clean:
+    if (fsck_deallocate_bitmap (fs))
+	reiserfs_bitmap_delete (fsck_deallocate_bitmap (fs));
+}
diff --git a/utils/fsck/semantic_rebuild.c b/utils/fsck/semantic_rebuild.c
new file mode 100644
index 0000000..013c1f9
--- /dev/null
+++ b/utils/fsck/semantic_rebuild.c
@@ -0,0 +1,1321 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+#include "misc/device.h"
+#include "util/device.h"
+#include "util/misc.h"
+
+#include <sys/stat.h>
+
+#define MIN(a, b) (((a)>(b))?(b):(a))
+
+/* *size is "real" file size, sd_size - size from stat data */
+int wrong_st_size (const reiserfs_key_t * key, 
+		   unsigned long long max_file_size, 
+		   int blocksize, 
+		   __u64 * size, 
+		   __u64 sd_size, int type)
+{
+    if (sd_size <= max_file_size) {
+	if (sd_size == *size)
+	    return 0;
+
+	if (type == TYPE_DIRENTRY) {
+	    /* directory size must match to the sum of length of its entries */
+	    fsck_log ("vpf-10650: The directory %K has the wrong size in the StatData "
+		"(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? 
+		", should be " : " - corrected to ", *size);
+	    return 1;
+	}
+	
+	if (sd_size > *size) {
+	    /* size in stat data can be bigger than size calculated by items */
+	    if (fsck_adjust_file_size (fs) || type == TYPE_SYMLINK) {
+		/* but it -o is given - fix that */
+		fsck_log ("vpf-10660: The file %K has too big size in the StatData "
+		    "(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? 
+		    ", should be " : " - corrected to ", *size);
+		sem_pass_stat (fs)->fixed_sizes ++;
+		return 1;
+	    }
+	    *size = sd_size;
+	    return 0;
+	}
+	
+	if (!(*size % blocksize)) {
+	    /* last item is extent */
+	    if (((sd_size & ~(blocksize - 1)) == (*size - blocksize)) && 
+		sd_size % blocksize) 
+	    {
+		/* size in stat data is correct */
+		*size = sd_size;
+		return 0;
+	    }
+	} else {
+	    /* last item is a direct one */
+	    if (!(*size % 8)) {
+		if (((sd_size & ~7) == (*size - 8)) && sd_size % 8) {
+		    /* size in stat data is correct */
+		    *size = sd_size;
+		    return 0;
+		}
+	    }
+	}
+    }
+
+    fsck_log ("vpf-10670: The file %K has the wrong size in the StatData (%Lu)%s(%Lu)\n", key, 
+	sd_size, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", 
+	*size);
+    sem_pass_stat (fs)->fixed_sizes ++;
+    return 1;
+}
+
+
+/* sd_blocks is 32 bit only */
+/* old stat data shares sd_block and sd_dev - do not wipe sd_rdev out */
+/* we should fix it as following:
+|------------------------------------------------------------------|
+|                    |        3.6                   |       3.5    |
+|---------------------------------------------------|              |
+|                    |  blocks |  r_dev|generation  | blocks/r_dev |
+|------------------------------------------------------------------|
+|   fifo, sockets    |    0    |    generation      |      0       |
+|   chr/blk_dev      |    0    |     maj:min        |   maj:min    |
+|   file, dir, link  |  blocks |    generation      |   blocks     |
+|------------------------------------------------------------------|
+*/
+int wrong_st_blocks (const reiserfs_key_t * key, 
+		     __u32 * blocks, 
+		     __u32 sd_blocks, 
+		     __u16 mode, 
+		     int new_format)
+{
+    int ret = 0;
+
+    if (S_ISREG (mode) || S_ISLNK (mode) || S_ISDIR (mode)) {
+	if ((!S_ISLNK(mode) && *blocks != sd_blocks) ||
+	    (S_ISLNK(mode) && *blocks != sd_blocks && (MISC_ROUND_UP(*blocks) != sd_blocks))) {
+	    fsck_log ("vpf-10680: The %s %K has the wrong block count in the StatData "
+		"(%u)%s(%u)\n", S_ISDIR (mode) ? "directory" : S_ISREG (mode) ? "file" : "link",  key, sd_blocks, 
+		fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", *blocks);
+	    ret = 1;
+	}
+    } else if (new_format || (S_ISFIFO (mode) || S_ISSOCK (mode))) {
+	if (sd_blocks != 0) {
+	    fsck_log ("vpf-10690: The object %K has the wrong block count in the StatData "
+		"(%u)%s(%u)\n",	key, sd_blocks, fsck_mode(fs) == FSCK_CHECK ? 
+		", should be " : " - corrected to ", 0);
+	    *blocks = 0;	
+	    ret = 1;
+	}
+    }
+
+    return ret;
+}
+/*
+int wrong_st_rdev (reiserfs_key_t * key, __u32 * sd_rdev, __u16 mode, int new_format)
+{
+    int ret = 0;
+
+    if (!new_format)
+	return 0;
+
+    if (!S_ISCHR (mode) && !S_ISBLK (mode)) {
+	if (*sd_rdev != 0) {
+	    fsck_log ("%s %K has wrong sd_rdev %u, has to be 0\n",
+		S_ISDIR (mode) ? "dir" : "file", key, *sd_rdev);
+	    *sd_rdev = 0;
+	    ret = 1;
+	}
+    }
+    return ret;
+}
+*/
+/* only regular files and symlinks may have items but stat
+   data. Symlink should have body */
+int wrong_mode (reiserfs_key_t * key, __u16 * mode, __u64 real_size, int symlink)
+{
+    int retval = 0;
+    if (S_ISLNK (*mode) && !symlink) {
+	fsck_log ("The file %K (%M) is too big to be the symlink%s regfile\n", 
+	    key, *mode, fsck_mode(fs) == FSCK_CHECK ? ", should be the" : " - corrected "
+	    "to the");
+	*mode &= ~S_IFMT;
+	*mode |= S_IFREG;
+	retval = 1;
+    }
+
+    if (misc_device_typec (*mode) != '?') {
+	/* mode looks reasonable */
+	if (S_ISREG (*mode) || S_ISLNK (*mode))
+	    return retval;
+	
+	/* device, pipe, socket have no items */
+	if (!real_size)
+	    return retval;
+    }
+    /* there are items, so change file mode to regular file. Otherwise
+       - file bodies do not get deleted */
+    if (fsck_mode(fs) == FSCK_CHECK) {
+	fsck_log ("The object %K has wrong mode (%M)\n", key, *mode);
+    } else {
+	fsck_log("The object %K has wrong mode (%M) - corrected to %M\n", 
+	    key, *mode, (S_IFREG | 0600));
+    }
+    *mode = (S_IFREG | 0600);
+    return 1;
+}
+
+
+/* key is a key of last file item */
+int wrong_fdb (reiserfs_key_t * key, int blocksize, 
+	       __u32 * first_direct_byte,
+	       __u32 sd_fdb, __u32 size)
+{
+    if (!size || reiserfs_key_ext (key)) {
+	/* there is no direct item */
+	*first_direct_byte = REISERFS_SD_NODIRECT;
+	if (sd_fdb != REISERFS_SD_NODIRECT) {
+	    if (fsck_mode(fs) == FSCK_CHECK) {
+		fsck_log ("The file %K: The wrong info about the tail in the StatData, "
+		    "first_direct_byte (%d) - should be (%d)\n", key, 
+		    sd_fdb, *first_direct_byte);
+	    } else {
+		fsck_log ("The file %K: The wrong info about the tail in the StatData, "
+		    "first_direct_byte (%d) - corrected to (%d)\n", key, 
+		    sd_fdb, *first_direct_byte);
+	    }
+	    return 1;
+	}
+	return 0;
+    }
+
+    /* there is direct item */
+    *first_direct_byte = (reiserfs_key_get_off (key) & ~(blocksize - 1)) + 1;
+    if (*first_direct_byte != sd_fdb) {
+	if (fsck_mode(fs) == FSCK_CHECK) {
+	    fsck_log ("The file %K: The wrong info about the tail in the StatData, "
+		"first_direct_byte (%d) - should be (%d)\n", key, sd_fdb, 
+		*first_direct_byte);
+	} else {
+	    fsck_log ("The file %K: The wrong info about the tail in the StatData, "
+		"first_direct_byte (%d) - corrected to (%d)\n", key, sd_fdb, 
+		*first_direct_byte);
+	}
+	    
+	return 1;
+    }
+    return 0;
+}
+
+
+/* delete all items (but directory ones) with the same key 'ih' has
+   (including stat data of not a directory) and put them back at the
+   other place */
+void relocate_dir (reiserfs_ih_t * ih) {
+    const reiserfs_key_t * rkey;
+    reiserfs_ih_t * path_ih;
+    reiserfs_path_t path;
+    __u32 new_objectid;
+    reiserfs_key_t key;
+    saveitem_t * si;
+    int moved;
+
+    /* starting with the leftmost one - look for all items of file,
+       store them and delete */
+    key = ih->ih_key;
+    reiserfs_key_set_sec (KEY_FORMAT_1, &key, OFFSET_SD, TYPE_STAT_DATA);
+
+    si = 0;
+    while (1) {
+	reiserfs_tree_search_item (fs, &key, &path);
+	
+	if (REISERFS_PATH_LEAF_POS (&path) == 
+	    reiserfs_node_items (REISERFS_PATH_LEAF (&path))) 
+	{
+	    rkey = reiserfs_tree_rkey (&path, fs);
+	    if (rkey && !reiserfs_key_comp2 (&key, rkey)) {
+		/* file continues in the right neighbor */
+		key = *rkey;
+		reiserfs_tree_pathrelse (&path);
+		continue;
+	    }
+	    /* there is no more items of a directory */
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+	}
+
+	path_ih = REISERFS_PATH_IH (&path);
+	if (reiserfs_key_comp2 (&key, &(path_ih->ih_key))) {
+	    /* there are no more item with this key */
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+	}
+
+	/* ok, item found, but make sure that it is not a directory one */
+	if ((reiserfs_ih_stat (path_ih) && 
+	     not_a_directory (REISERFS_PATH_ITEM (&path))) ||
+	    reiserfs_ih_direct (path_ih) || reiserfs_ih_ext (path_ih)) 
+	{
+	    /* item of not a directory found. Leave it in the
+               tree. FIXME: should not happen */
+	    key = path_ih->ih_key;
+	    reiserfs_key_set_off (KEY_FORMAT_1, &key, 
+				  reiserfs_key_get_off (&key) + 1);
+	    reiserfs_tree_pathrelse (&path);
+	    continue;
+	}
+
+	/* directory stat data ro directory item */
+	fsck_item_save(&path, &si);
+	reiserfs_tree_delete(fs, &path, 1);
+    }
+
+    if (!si) {
+	fsck_log ("%s: WARNING: No one item of the directory "
+		  "%K found\n", __FUNCTION__, &key);
+	return;
+    }
+
+    /* get new objectid for relocation or get objectid with which file
+       was relocated already */
+    new_objectid = fsck_relocate_oid (&ih->ih_key);
+    moved = 0;
+
+    /* put all items removed back into tree */
+    while (si) {
+	reiserfs_key_set_oid (&si->si_ih.ih_key, new_objectid);
+	
+	if (reiserfs_key_get_off (&(si->si_ih.ih_key)) == OFFSET_DOT) {
+	    /* fix "." entry to point to a directtory properly */
+	    reiserfs_deh_t * deh;
+
+	    deh = (reiserfs_deh_t *)si->si_dnm_data;
+	    reiserfs_deh_set_obid (deh, new_objectid);
+	}
+	
+	fsck_tree_insert_item (&(si->si_ih), si->si_dnm_data, 0);
+	si = fsck_item_free(si);
+	moved++;
+    }
+    
+    if (moved) {
+	fsck_log("%s: %d items of dir %K are moved to %u oid\n",
+		 __FUNCTION__, moved, &ih->ih_key, new_objectid);
+    }
+    
+    reiserfs_key_set_oid (&ih->ih_key, new_objectid);
+}
+
+
+
+/* path is path to stat data. If file will be relocated - new_ih will contain
+   a key file was relocated with */
+int rebuild_check_regular_file (reiserfs_path_t * path, void * sd,
+				reiserfs_ih_t * new_ih)
+{
+    int is_new_file;
+//    reiserfs_key_t sd_key;
+    __u16 mode;
+    __u32 nlink;
+    __u64 real_size, saved_size;
+    __u32 blocks, saved_blocks;	/* proper values and value in stat data */
+    __u32 first_direct_byte, saved_fdb;
+
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih, sd_ih;
+    int fix_sd;
+    int symlnk = 0;
+    int retval;
+
+    retval = OK;
+
+    /* stat data of a file */
+    ih = REISERFS_PATH_IH (path);
+    bh = REISERFS_PATH_LEAF (path);
+
+    if (new_ih) {
+	/* this objectid is used already */
+	*new_ih = *ih;
+	reiserfs_tree_pathrelse (path);
+	fsck_file_relocate (&new_ih->ih_key, 1);
+	fsck_relocate_mklinked(&new_ih->ih_key);
+	sem_pass_stat (fs)->oid_sharing_files_relocated ++;
+	retval = RELOCATED;
+	if (reiserfs_tree_search_item (fs, &(new_ih->ih_key), path) == ITEM_NOT_FOUND)
+	    reiserfs_panic ("%s: Could not find the StatData of the relocated file %k", 
+		__FUNCTION__, &(new_ih->ih_key));
+	/* stat data is marked unreachable again due to relocation, fix that */
+	ih = REISERFS_PATH_IH (path);
+	bh = REISERFS_PATH_LEAF (path);
+	fsck_item_mkreach (ih, bh);
+	sd = REISERFS_PATH_ITEM (path);
+	
+    }
+	
+    id_map_mark(semantic_id_map(fs), reiserfs_key_get_oid (&ih->ih_key));
+
+    /* check and set nlink first */
+    reiserfs_stat_get_nlink (ih, sd, &nlink);
+    nlink ++;
+    reiserfs_stat_set_nlink (ih, sd, &nlink);
+    reiserfs_buffer_mkdirty (bh);
+
+    if (nlink > 1)
+	return retval;
+
+    /* firts name of a file found */
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE)
+	is_new_file = 1;
+    else
+	is_new_file = 0;
+
+    reiserfs_stat_get_mode (ih, sd, &mode);
+    reiserfs_stat_get_size (ih, sd, &saved_size);
+    reiserfs_stat_get_blocks (ih, sd, &saved_blocks);
+    if (!is_new_file)
+	reiserfs_stat_get_fdb (ih, sd, &saved_fdb);
+    
+    /* we met this file first time */
+    if (S_ISREG (mode)) {
+	sem_pass_stat(fs)->regular_files ++;
+    } else if (S_ISLNK (mode)) {
+	symlnk = 1;
+	sem_pass_stat (fs)->symlinks ++;
+    } else {
+	sem_pass_stat (fs)->others ++;
+    }
+
+
+    sd_ih = *ih;
+//    sd_key = sd_ih.ih_key;
+    reiserfs_tree_pathrelse (path);
+    
+    if (are_file_items_correct (&sd_ih, sd, &real_size, 
+				&blocks, 1/*mark reachable*/, 
+				&symlnk) != 1)
+    {
+	/* unpassed items will be deleted in pass 4 as they left unaccessed */
+	fsck_log("%s: some items of %K are left unaccessed.\n", 
+		 __FUNCTION__, &sd_ih.ih_key);
+	sem_pass_stat (fs)->broken_files ++;
+    }
+    
+    fix_sd = 0;
+    
+    fix_sd += wrong_mode (/*&sd_key, */ &sd_ih.ih_key, &mode, real_size, symlnk);
+
+    if (!is_new_file)
+	fix_sd += wrong_fdb (&sd_ih.ih_key, fs->fs_blocksize,
+	    &first_direct_byte, saved_fdb, real_size);
+
+    fix_sd += wrong_st_size (/*&sd_key,*/ &sd_ih.ih_key, 
+	is_new_file ? REISERFS_SD_SIZE_MAX_V2 : REISERFS_SD_SIZE_MAX_V1,
+	fs->fs_blocksize, &real_size, saved_size, symlnk ? TYPE_SYMLINK : 0);
+
+    fix_sd += wrong_st_blocks (&sd_ih.ih_key, &blocks, saved_blocks, mode, is_new_file);
+
+    if (fix_sd) {
+	/* find stat data and correct it */
+	reiserfs_key_set_sec (KEY_FORMAT_1, &sd_ih.ih_key, 
+			      OFFSET_SD, TYPE_STAT_DATA);
+	if (reiserfs_tree_search_item (fs, &sd_ih.ih_key, path) != ITEM_FOUND)
+	    reiserfs_panic ("%s: The StatData of the file %k could not be found", 
+		__FUNCTION__, &sd_ih.ih_key);
+	
+	bh = REISERFS_PATH_LEAF (path);
+	ih = REISERFS_PATH_IH (path);
+	sd = REISERFS_PATH_ITEM (path);
+	reiserfs_stat_set_size (ih, sd, &real_size);
+	reiserfs_stat_set_blocks (ih, sd, &blocks);
+	reiserfs_stat_set_mode (ih, sd, &mode);
+	if (!is_new_file)
+	    reiserfs_stat_set_fdb (ih, sd, &first_direct_byte);
+	reiserfs_buffer_mkdirty (bh);
+    }
+
+    return retval;
+}
+
+
+static int is_rootdir_key (const reiserfs_key_t * key)
+{
+    if (reiserfs_key_comp (key, &root_dir_key))
+	return 0;
+    return 1;
+}
+
+
+/* returns buffer, containing found directory item.*/
+static char * get_next_directory_item (reiserfs_key_t * key, /* on return this will
+								contain key of next item
+								in the tree */
+				       const reiserfs_key_t * parent,
+				       reiserfs_ih_t * ih,/*not in tree*/
+				       __u32 * pos_in_item)
+{
+    const reiserfs_key_t * rdkey;
+    REISERFS_PATH_INIT (path);
+    reiserfs_deh_t * deh;
+    reiserfs_bh_t * bh;
+    char * dir_item;
+    int retval;
+    int i;
+
+
+    if ((retval = reiserfs_tree_search_entry (fs, key, &path)) != POSITION_FOUND)
+	reiserfs_panic ("get_next_directory_item: The current directory %k cannot be "
+	    "found", key);
+
+    /* leaf containing directory item */
+    bh = REISERFS_PATH_LEAF (&path);
+    *pos_in_item = path.pos_in_item;
+    *ih = *REISERFS_PATH_IH (&path);
+    deh = reiserfs_deh (bh, ih);
+
+    /* make sure, that ".." exists as well */
+    if (reiserfs_key_get_off (key) == OFFSET_DOT) {
+	if (reiserfs_ih_get_entries (ih) < 2 ||
+	    reiserfs_direntry_name_len (ih, deh + 1, 1) != 2 ||
+	    strncmp (reiserfs_deh_name (deh + 1, 1), "..", 2))
+	{
+	    fsck_log ("get_next_directory_item: The entry \"..\" cannot be "
+		      "found in %k\n", &ih->ih_key);
+	    
+	    reiserfs_tree_pathrelse (&path);
+	    return 0;
+	}
+    }
+
+    /* mark hidden entries as visible, set "." and ".." correctly */
+    deh += *pos_in_item; 
+    for (i = *pos_in_item; i < reiserfs_ih_get_entries (ih); i ++, deh ++) {
+	int namelen;
+	char * name;
+
+	name = reiserfs_deh_name (deh, i);
+	namelen = reiserfs_direntry_name_len (ih, deh, i);
+
+	if (reiserfs_deh_get_off (deh) == OFFSET_DOT) {
+	    if (reiserfs_key_comp2 (&(deh->deh2_dir_id), key)) {
+		/* "." must point to the directory it is in */
+		
+		//deh->deh_objectid != REISERFS_ROOT_PARENT_OBJECTID)/*????*/ {
+		fsck_log ("get_next_directory_item: The entry \".\" of the "
+			  "directory %K points to %K, instead of %K", 
+			  key, (reiserfs_key_t *)(&(deh->deh2_dir_id)), key);
+		
+		reiserfs_deh_set_did (deh, reiserfs_key_get_did (key));
+		reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (key));
+		reiserfs_buffer_mkdirty (bh);
+		fsck_log (" - corrected\n");
+	    }
+	}
+
+	if (reiserfs_deh_get_off (deh) == OFFSET_DOT_DOT) {
+	    /* set ".." so that it points to the correct parent directory */
+	    if (reiserfs_key_comp2 (&(deh->deh2_dir_id), parent)) {
+		fsck_log ("get_next_directory_item: The entry \"..\" of the "
+			  "directory %K points to %K, instead of %K", 
+		    key, (reiserfs_key_t *)(&(deh->deh2_dir_id)), parent);
+		reiserfs_deh_set_did (deh, reiserfs_key_get_did (parent));
+		reiserfs_deh_set_obid (deh, reiserfs_key_get_oid (parent));
+		reiserfs_buffer_mkdirty (bh);
+		fsck_log (" - corrected\n");
+	    }
+	}
+    }
+
+    /* copy directory item to the temporary buffer */
+    dir_item = misc_getmem (reiserfs_ih_get_len (ih)); 
+    memcpy (dir_item, reiserfs_item_by_ih (bh, ih), reiserfs_ih_get_len (ih));
+
+
+    /* next item key */
+    if ((rdkey = reiserfs_tree_next_key (&path, fs)))
+	reiserfs_key_copy (key, rdkey);
+    else {
+	reiserfs_key_set_did (key, 0);
+	reiserfs_key_set_oid (key, 0);
+    }
+
+    if (fsck_mode (fs) == FSCK_REBUILD)
+        fsck_item_mkreach (REISERFS_PATH_IH (&path), bh);
+    reiserfs_tree_pathrelse (&path);
+
+    return dir_item;
+}
+
+
+// get key of an object pointed by direntry and the key of the entry itself
+void get_object_key (reiserfs_deh_t * deh, reiserfs_key_t * key, 
+		     reiserfs_key_t * entry_key, reiserfs_ih_t * ih)
+{
+    /* entry points to this key */
+    reiserfs_key_set_did (key, reiserfs_deh_get_did (deh));
+    reiserfs_key_set_oid (key, reiserfs_deh_get_obid (deh));
+    reiserfs_key_set_off1 (key, OFFSET_SD);
+    reiserfs_key_set_uni (key, 0);
+
+    /* key of entry */
+    reiserfs_key_set_did (entry_key, reiserfs_key_get_did (&ih->ih_key));
+    reiserfs_key_set_oid (entry_key, reiserfs_key_get_oid (&ih->ih_key));
+    reiserfs_key_set_off1 (entry_key, reiserfs_deh_get_off (deh));
+    reiserfs_key_set_uni (entry_key, UNI_DE);
+}
+
+int fix_obviously_wrong_sd_mode (reiserfs_path_t * path) {
+    const reiserfs_key_t * next_key;
+    __u16 mode;
+    int retval = 0;
+
+    next_key = reiserfs_tree_next_key (path, fs);
+
+    if (!next_key)
+    	return 0;
+	    
+    if (reiserfs_key_comp2 (next_key, &REISERFS_PATH_IH(path)->ih_key))
+	return 0;
+    	
+    /* next item exists and of the same file. Fix the SD mode */
+
+    if (not_a_directory (REISERFS_PATH_ITEM (path)) && 
+	reiserfs_key_dir (next_key)) 
+    {
+        /* make SD mode SD of dir */
+	reiserfs_stat_get_mode (REISERFS_PATH_IH (path), 
+				REISERFS_PATH_ITEM (path), &mode);
+	
+	fsck_log ("The directory %K had wrong mode %M", 
+		  &REISERFS_PATH_IH(path)->ih_key, mode);
+
+	if (fsck_mode(fs) != FSCK_CHECK) {
+	    mode &= ~S_IFMT;
+	    mode |= S_IFDIR;
+	    fsck_log (" - corrected to %M\n", mode);	
+	    reiserfs_stat_set_mode (REISERFS_PATH_IH (path), 
+				    REISERFS_PATH_ITEM (path), &mode);
+	    
+	    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(path));
+	} else {
+	    fsck_log ("\n");
+	    retval = 1;
+	}
+    } else if (!not_a_directory (REISERFS_PATH_ITEM (path)) && 
+	       !reiserfs_key_dir (next_key)) 
+    {
+        /* make SD mode SD of regular file */
+	reiserfs_stat_get_mode (REISERFS_PATH_IH (path), 
+				REISERFS_PATH_ITEM (path), &mode);
+	
+	fsck_log ("The file %K had wrong mode %M", 
+		  &REISERFS_PATH_IH(path)->ih_key, mode);
+	
+	if (fsck_mode(fs) != FSCK_CHECK) {
+	    mode &= ~S_IFMT;
+	    mode |= S_IFREG;
+	    fsck_log (" - corrected to %M\n", mode);
+	    reiserfs_stat_set_mode (REISERFS_PATH_IH (path), 
+				    REISERFS_PATH_ITEM (path), &mode);
+	    
+	    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(path));
+	} else {
+	    fsck_log ("\n");
+	    retval = 1;
+	}
+	    
+    }
+
+    return retval;
+}
+
+static int is_lost_found (char * name, int namelen)
+{
+    return (namelen == 10 && !memcmp(name, "lost+found", 10)) ? 1 : 0;
+}
+
+void cb_item_modify (reiserfs_ih_t *ih, void *item) {
+    zero_nlink (ih, item);
+    reiserfs_ih_mkunreach (ih);
+}
+
+/* check recursively the semantic tree. Returns OK if entry points to good
+   object, STAT_DATA_NOT_FOUND if stat data was not found or RELOCATED when
+   file was relocated because its objectid was already marked as used by
+   another file */
+int rebuild_semantic_pass (reiserfs_key_t * key, 
+			   const reiserfs_key_t * parent, 
+			   int etype, reiserfs_ih_t * new_ih)
+{
+    reiserfs_path_t path;
+    void * sd;
+    int is_new_dir;
+    __u32 nlink;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+    int retval, retval1;
+    char * dir_item;
+    __u32 pos_in_item;
+    reiserfs_ih_t tmp_ih;
+    reiserfs_key_t item_key, entry_key, object_key, *found;
+    __u64 dir_size;
+    __u32 blocks;
+    __u64 saved_size;
+    __u32 saved_blocks;
+    int fix_sd;
+    int relocate;
+    int dir_format = 0;
+    __u16 mode;
+    int entry_len;
+
+
+    retval = OK;
+
+ start_again: /* when directory was relocated */
+
+    if (!reiserfs_key_stat (key))
+	reiserfs_panic ("rebuild_semantic_pass: The key %k must "
+			"be key of a StatData", key);
+
+    /* look for stat data of an object */
+    if (reiserfs_tree_search_item (fs, key, &path) == ITEM_NOT_FOUND) {
+	if (is_rootdir_key (key))
+	    /* root directory has to exist at this point */
+	    reiserfs_panic ("rebuild_semantic_pass: The root directory "
+			    "StatData was not found");
+	/* If an item of the same object is found, create a stat item. */
+	found = &REISERFS_PATH_IH(&path)->ih_key;
+	if (!reiserfs_key_comp2(key, found)) {
+	    if (reiserfs_key_dir (found) || reiserfs_key_get_off (key) == 1) {
+		sem_pass_stat(fs)->added_sd ++;
+		reiserfs_tree_create_stat (fs, &path, key, cb_item_modify);
+		reiserfs_tree_pathrelse (&path);
+		goto start_again;
+	    }
+	}
+	
+	reiserfs_tree_pathrelse (&path);
+	return STAT_DATA_NOT_FOUND;
+    }
+
+    if ((etype == ET_NAME) && !reiserfs_key_comp2(key, &lost_found_dir_key)) {
+	/* This is not "lost+found" entry that points to "lost+found" object. */
+	reiserfs_tree_pathrelse (&path);
+	return DIRECTORY_HAS_NO_ITEMS;
+    }
+
+    /* stat data has been found */
+    bh = REISERFS_PATH_LEAF (&path);
+    ih = REISERFS_PATH_IH (&path);
+    sd = REISERFS_PATH_ITEM(&path);
+
+    /* */
+    reiserfs_stat_get_nlink (ih, sd, &nlink);
+
+    relocate = 0;
+    if (!nlink) {
+	/* we reached the stat data for the first time */
+	if (id_map_mark(semantic_id_map(fs), reiserfs_key_get_oid (&ih->ih_key))) {
+	    /* calculate number of found files/dirs who are using objectid
+	       which is used by another file */
+	    sem_pass_stat (fs)->oid_sharing ++;
+	    relocate = 1;
+	}
+
+	fsck_item_mkreach (ih, bh);
+    }
+
+    fix_obviously_wrong_sd_mode (&path);
+
+    if (not_a_directory (sd)) {
+	retval = rebuild_check_regular_file (&path, sd, relocate ? new_ih : 0);
+	reiserfs_tree_pathrelse (&path);
+	return retval;
+    }
+
+    if (relocate) {
+	if (!new_ih)
+	    reiserfs_panic ("rebuild_semantic_pass: Memory is not "
+			    "prepared for relocation of %K", &ih->ih_key);
+	*new_ih = *ih;
+	reiserfs_tree_pathrelse (&path);
+	sem_pass_stat (fs)->oid_sharing_dirs_relocated ++;
+	relocate_dir (new_ih);
+	fsck_relocate_mklinked(&new_ih->ih_key);
+	*key = new_ih->ih_key;	
+	retval = RELOCATED;
+	
+	goto start_again;
+    }
+
+    /* it looks like stat data of a directory found */
+    if (nlink) {
+	/* we saw this directory already */
+	if (etype != ET_DOT_DOT) {
+	    /* this name is not ".."  - and hard links are not allowed on
+               directories */
+	    reiserfs_tree_pathrelse (&path);
+	    return STAT_DATA_NOT_FOUND;
+	} else {
+	    /* ".." found */
+	    nlink ++;
+	    reiserfs_stat_set_nlink (ih, sd, &nlink);
+	    reiserfs_buffer_mkdirty (bh);
+	    reiserfs_tree_pathrelse (&path);
+	    return OK;
+	}
+    }
+
+
+    /* we see the directory first time */
+    sem_pass_stat (fs)->directories ++;
+    nlink = 2;
+    if (reiserfs_key_get_oid (key) == REISERFS_ROOT_OBJECTID)
+	nlink ++;
+    reiserfs_stat_set_nlink (ih, sd, &nlink);
+    reiserfs_buffer_mkdirty (bh);
+    
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE)
+	is_new_dir = 1;
+    else
+	is_new_dir = 0;
+
+
+/*
+    {
+	reiserfs_key_t * tmp;
+
+	// check next item: if it is not a directory item of the same file
+	// therefore sd_mode is corrupted so we just reset it to regular file
+	// mode
+	tmp = reiserfs_tree_next_key (&path);
+	if (tmp && !reiserfs_key_comp2 (tmp, key) && !reiserfs_key_dir (tmp)) {
+	    __u16 mode;
+
+	    reiserfs_stat_get_mode (ih, sd, &mode);
+	    fsck_log ("file %K had broken mode %M, ", key, mode);
+	    mode &= ~S_IFMT;
+	    mode |= S_IFREG;
+	    fsck_log ("fixed to %M\n", mode);
+	    reiserfs_stat_set_mode (ih, sd, &mode);
+
+	    nlink = 0;
+	    reiserfs_stat_set_nlink (ih, sd, &nlink);
+	    
+	    retval = rebuild_check_regular_file (&path, sd, 0); //no relocate
+	    reiserfs_tree_pathrelse (&path);
+	    return retval;
+	}
+    }
+*/
+
+
+    dir_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == REISERFS_SD_SIZE) ? 
+	    KEY_FORMAT_2 : KEY_FORMAT_1;
+    
+    /* save stat data's size and st_blocks */
+    reiserfs_stat_get_size (ih, sd, &saved_size);
+    reiserfs_stat_get_blocks (ih, sd, &saved_blocks);	
+    reiserfs_stat_get_mode (ih, sd, &mode);
+
+    /* release path pointing to stat data */
+    reiserfs_tree_pathrelse (&path);
+
+    /* make sure that "." and ".." exist */
+    entry_len = reiserfs_direntry_entry_estimate (".", dir_format);
+    reiserfs_tree_insert_entry (fs, key, ".",  entry_len, key, 
+				1 << IH_Unreachable);
+    
+    entry_len = reiserfs_direntry_entry_estimate ("..", dir_format);
+    reiserfs_tree_insert_entry (fs, key, "..", entry_len, 
+				parent, 1 << IH_Unreachable);
+
+    reiserfs_key_set_did (&item_key, reiserfs_key_get_did (key));
+    reiserfs_key_set_oid (&item_key, reiserfs_key_get_oid (key));
+    reiserfs_key_set_off1 (&item_key, OFFSET_DOT);
+    reiserfs_key_set_uni (&item_key, UNI_DE);
+
+
+    dir_size = 0;
+    while ((dir_item = get_next_directory_item (&item_key, parent, 
+						&tmp_ih, &pos_in_item)) != 0) 
+    {
+	/* dir_item is copy of the item in separately allocated memory,
+	   item_key is a key of next item in the tree */
+	int i;
+	char name[REISERFS_NAME_MAX];
+	int namelen, entry_len;
+	reiserfs_deh_t * deh = (reiserfs_deh_t *)dir_item + pos_in_item;	
+	
+	for (i = pos_in_item; i < reiserfs_ih_get_entries (&tmp_ih); i ++, deh ++) {
+	    reiserfs_ih_t relocated_ih;
+	
+	    name[0] = '\0';
+	
+	    namelen = reiserfs_direntry_name_len (&tmp_ih, deh, i);
+	    sprintf(name, "%.*s", namelen, reiserfs_deh_name (deh, i));
+	
+	    entry_len = reiserfs_direntry_entry_len (&tmp_ih, deh, i);
+	
+	    get_object_key (deh, &object_key, &entry_key, &tmp_ih);
+	
+	    if ((dir_format == KEY_FORMAT_2) && (entry_len % 8 != 0)) {
+	    	/* not alighed directory of new format - delete it */
+		fsck_log ("Entry %K (\"%.*s\") in the directory %K is not "
+			  "formated properly - fixed.\n", 
+			  (reiserfs_key_t *)&(deh->deh2_dir_id), 
+			  namelen, name, &tmp_ih.ih_key);
+		
+		reiserfs_tree_delete_entry (fs, &entry_key);
+		entry_len = reiserfs_direntry_entry_estimate (name, dir_format);
+		reiserfs_tree_insert_entry (fs, key, name, entry_len,
+                                (reiserfs_key_t *)&(deh->deh2_dir_id), 0);
+	    }
+	    
+	    /*	
+	    if ((dir_format == KEY_FORMAT_1) && (namelen != entry_len)) {
+	    	// aligned entry in directory of old format - remove and 
+		// insert it back 
+		fsck_log ("Entry %K (\"%.*s\") in the directory %K is not "
+			  "formated properly - deleted\n",
+			  (reiserfs_key_t *)&(deh->deh2_dir_id), 
+			  namelen, name, &tmp_ih.ih_key);
+			  
+		reiserfs_tree_delete_entry (fs, &entry_key);
+		entry_len = reiserfs_direntry_entry_estimate (name, dir_format);
+		reiserfs_tree_insert_entry (fs, key, name, entry_len,
+				(reiserfs_key_t *)&(deh->deh2_dir_id), 0);
+	    }
+	    */	
+	    
+	    if (is_dot (name, namelen)) {
+		dir_size += REISERFS_DEH_SIZE + entry_len;
+		continue;
+	    }
+	
+	    if (!fsck_quiet(fs)) {
+		util_misc_print_name (fsck_progress_file(fs), 
+				      name, namelen);
+	    }
+	    
+	    if (!reiserfs_hash_correct (&fs->hash, name, namelen, 
+					reiserfs_deh_get_off (deh)))
+	    {
+		reiserfs_panic ("rebuild_semantic_pass: Hash mismatch "
+				"detected for (\"%.*s\") in directory %K\n", 
+				namelen, name, &tmp_ih.ih_key);
+	    }
+	
+	    retval1 = rebuild_semantic_pass (&object_key, key, 
+					     is_dot_dot (name, namelen) ? ET_DOT_DOT :
+					     reiserfs_key_get_oid (key) == REISERFS_ROOT_OBJECTID &&
+					     is_lost_found (name, namelen) ? ET_LOST_FOUND : 0, 
+					     &relocated_ih);
+	   
+	    if (!fsck_quiet(fs)) {
+		util_misc_erase_name (fsck_progress_file(fs), 
+				      namelen);
+	    }
+	    
+	    switch (retval1) {
+	    case OK:
+		dir_size += REISERFS_DEH_SIZE + entry_len;
+		break;
+
+	    case STAT_DATA_NOT_FOUND:
+	    case DIRECTORY_HAS_NO_ITEMS:
+		if (reiserfs_key_get_off (&entry_key) == OFFSET_DOT_DOT && 
+		    reiserfs_key_get_oid (&object_key) == 
+		    REISERFS_ROOT_PARENT_OBJECTID) 
+		{
+		    /* ".." of root directory can not be found */
+		    dir_size += REISERFS_DEH_SIZE + entry_len;
+		    continue;
+		}
+		
+		fsck_log ("%s: The entry %K (\"%.*s\") in directory %K "
+			  "points to nowhere - is removed\n", __FUNCTION__, 
+			  &object_key, namelen, name, &tmp_ih.ih_key);
+		
+		reiserfs_tree_delete_entry (fs, &entry_key);
+		sem_pass_stat (fs)->deleted_entries ++;
+		break;
+		
+	    case RELOCATED:
+		/* file was relocated, update key in directory entry */
+		
+		if (reiserfs_tree_search_entry (fs, &entry_key, &path) != 
+		    POSITION_FOUND) 
+		{
+		    fsck_log ("WARNING: Cannot find the name of the relocated "
+			      "file %K in the directory %K\n", &object_key, 
+			      &tmp_ih.ih_key);
+		} else {
+		    /* update key dir entry points to */
+		    reiserfs_deh_t * tmp_deh;
+		    
+		    tmp_deh = reiserfs_deh (REISERFS_PATH_LEAF (&path), 
+				       REISERFS_PATH_IH (&path)) + path.pos_in_item;
+		    
+		    fsck_log ("The entry %K (\"%.*s\") in directory %K "
+			      "updated to point to ", &object_key, namelen, 
+			      name, &tmp_ih.ih_key);
+		    
+		    reiserfs_deh_set_did (tmp_deh, reiserfs_key_get_did (&relocated_ih.ih_key));
+		    reiserfs_deh_set_obid (tmp_deh, 
+				      reiserfs_key_get_oid (&relocated_ih.ih_key));
+
+		    fsck_log ("%K\n",  &tmp_deh->deh2_dir_id);
+		    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (&path));
+		}
+		
+		dir_size += REISERFS_DEH_SIZE + entry_len;
+		reiserfs_tree_pathrelse (&path);
+		break;
+	    }
+	} /* for */
+	
+	misc_freemem (dir_item);
+	
+	if (reiserfs_key_comp2 (&item_key, key)  || !reiserfs_key_dir(&item_key))
+	    /* next key is not of this directory */
+	    break;
+	
+    } /* while (dir_item) */
+    
+    
+    if (dir_size == 0)
+	/* FIXME: is it possible? */
+	return DIRECTORY_HAS_NO_ITEMS;
+    
+    /* calc correct value of sd_blocks field of stat data */
+    blocks = REISERFS_DIR_BLOCKS (dir_size);
+    
+    fix_sd = 0;
+    fix_sd += wrong_st_blocks (key, &blocks, saved_blocks, mode, is_new_dir);
+    fix_sd += wrong_st_size (key, is_new_dir ? REISERFS_SD_SIZE_MAX_V2 : 
+			     REISERFS_SD_SIZE_MAX_V1, fs->fs_blocksize, 
+			     &dir_size, saved_size, TYPE_DIRENTRY);
+
+    if (fix_sd) {
+	/* we have to fix either sd_size or sd_blocks, so look for SD again */
+	if (reiserfs_tree_search_item (fs, key, &path) != ITEM_FOUND)
+	    reiserfs_panic ("rebuild_semantic_pass: The StatData of the "
+			    "file %K was not found", key);
+	    
+	bh = REISERFS_PATH_LEAF (&path);
+	ih = REISERFS_PATH_IH (&path);
+	sd = REISERFS_PATH_ITEM (&path);
+	
+	reiserfs_stat_set_size (ih, sd, &dir_size);
+	reiserfs_stat_set_blocks (ih, sd, &blocks);
+	reiserfs_buffer_mkdirty (bh);
+	reiserfs_tree_pathrelse (&path);
+    }
+    
+    return retval;
+}
+
+
+int is_dot (char * name, int namelen)
+{
+    return (namelen == 1 && name[0] == '.') ? 1 : 0;
+}
+
+
+int is_dot_dot (char * name, int namelen)
+{
+    return (namelen == 2 && name[0] == '.' && name[1] == '.') ? 1 : 0;
+}
+
+int not_a_directory (void * sd)
+{
+    /* mode is at the same place and of the same size in both stat
+       datas (v1 and v2) */
+    reiserfs_sd_v1_t * sd_v1 = sd;
+
+    return !(S_ISDIR (le16_to_cpu (sd_v1->sd_mode)));
+}
+
+int not_a_regfile (void * sd)
+{
+    /* mode is at the same place and of the same size in both stat
+       datas (v1 and v2) */
+    reiserfs_sd_v1_t * sd_v1 = sd;
+
+    return !(S_ISREG (le16_to_cpu (sd_v1->sd_mode)));
+}
+
+
+
+void zero_nlink (reiserfs_ih_t * ih, void * sd)
+{
+    int zero = 0;
+
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE_V1 && reiserfs_ih_get_format (ih) != 
+	KEY_FORMAT_1) 
+    {
+	fsck_log ("zero_nlink: The StatData %k of the wrong format version "
+		  "(%d) - corrected to (%d)\n", ih, reiserfs_ih_get_format (ih), 
+		  KEY_FORMAT_1);
+	
+	reiserfs_ih_set_format (ih, KEY_FORMAT_1);
+    }
+    
+    if (reiserfs_ih_get_len (ih) == REISERFS_SD_SIZE && reiserfs_ih_get_format (ih) != 
+	KEY_FORMAT_2) 
+    {
+	fsck_log ("zero_nlink: The StatData %k of the wrong format version "
+		  "(%d) - corrected to (%d)\n", ih, reiserfs_ih_get_format (ih), 
+		  KEY_FORMAT_2);
+	
+	reiserfs_ih_set_format (ih, KEY_FORMAT_2);
+    }
+
+    reiserfs_stat_set_nlink (ih, sd, &zero);
+}
+
+/* mkreiserfs should have created this */
+static void make_sure_lost_found_exists (reiserfs_filsys_t * fs, 
+					 __u16 root_format)
+{
+    int retval;
+    REISERFS_PATH_INIT (path);
+    unsigned int gen_counter;
+    __u32 objectid;
+    __u64 sd_size;
+    __u32 sd_blocks;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+    void * sd;
+    int item_len;
+    int entry_len;
+
+
+    /* look for "lost+found" in the root directory */
+    retval = reiserfs_tree_search_name (fs, &root_dir_key,
+					"lost+found", &gen_counter,
+					&lost_found_dir_key);
+    if (!retval) {
+	objectid = id_map_alloc(proper_id_map(fs));
+	if (!objectid) {
+	    fsck_progress ("Could not allocate an objectid for '/lost+found'",
+			   "lost files will not be linked\n");
+	    return;
+	}
+	reiserfs_key_set_did (&lost_found_dir_key, REISERFS_ROOT_OBJECTID);
+	reiserfs_key_set_oid (&lost_found_dir_key, objectid);
+    }
+
+
+    /* look for stat data of "lost+found" */
+    retval = reiserfs_tree_search_item (fs, &lost_found_dir_key, &path);
+    if (retval == ITEM_NOT_FOUND) {
+	fs->lost_format = reiserfs_tree_create_stat 
+		(fs, &path, &lost_found_dir_key, cb_item_modify);
+    } else {
+    	reiserfs_ih_t * ih = REISERFS_PATH_IH (&path);
+	
+    	if (!reiserfs_ih_stat (ih))
+	    reiserfs_panic ("It must be lost+found's stat data %k\n", 
+			    &ih->ih_key);
+	
+	fix_obviously_wrong_sd_mode (&path);
+	
+	if (not_a_directory (REISERFS_PATH_ITEM (&path))) {
+	    fsck_progress ("\"/lost+found\" exists, but it is not a "
+			   "directory, lost files will not be linked\n");
+	    reiserfs_key_set_oid (&lost_found_dir_key, 0);
+	    reiserfs_tree_pathrelse (&path);
+	    return;
+	}
+    	
+        fs->lost_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == 
+			   REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
+        	
+	reiserfs_tree_pathrelse (&path);
+    }
+
+    /* add "." and ".." if any of them do not exist */
+    entry_len = reiserfs_direntry_entry_estimate (".", fs->lost_format);
+    reiserfs_tree_insert_entry (fs, &lost_found_dir_key, ".", entry_len,
+				&lost_found_dir_key, 1 << IH_Unreachable);
+    
+    entry_len = reiserfs_direntry_entry_estimate ("..", fs->lost_format);
+    reiserfs_tree_insert_entry (fs, &lost_found_dir_key, "..", entry_len,
+				&root_dir_key, 1 << IH_Unreachable);
+
+    entry_len = reiserfs_direntry_entry_estimate ("lost+found", root_format);
+    item_len = reiserfs_tree_insert_entry (fs, &root_dir_key, "lost+found",
+					   entry_len, &lost_found_dir_key, 
+					   1 << IH_Unreachable);
+
+    if (item_len) {
+	if (reiserfs_tree_search_item (fs, &root_dir_key, &path) == 
+	    ITEM_NOT_FOUND)
+	{
+	    reiserfs_panic ("%s: StatData of the root directory must exists", 
+			    __FUNCTION__);
+	}
+	
+	bh = REISERFS_PATH_LEAF (&path);
+	ih = REISERFS_PATH_IH (&path);
+	sd = REISERFS_PATH_ITEM(&path);
+	
+	reiserfs_stat_get_size (ih, sd, &sd_size);
+	sd_size += item_len;
+	reiserfs_stat_set_size (ih, sd, &sd_size);
+	sd_blocks = REISERFS_DIR_BLOCKS (sd_size);
+	reiserfs_stat_set_blocks (ih, sd, &sd_blocks);
+	reiserfs_buffer_mkdirty (bh);
+	reiserfs_tree_pathrelse (&path);
+    }
+			
+    return;
+}
+
+/* Result of the rebuild pass will be saved in the state file 
+   which is needed to start fsck again from the next pass. */
+static void fsck_semantic_save_result (reiserfs_filsys_t * fs) {
+    FILE * file;
+    int retval;
+
+    file = util_file_open ("temp_fsck_file.deleteme", "w+");
+    if (!file)
+	return;
+
+    fsck_stage_start_put (file, SEMANTIC_DONE);
+    reiserfs_objectid_map_save (file, semantic_id_map (fs));
+    fsck_stage_end_put (file);
+    fclose (file);
+    retval = rename ("temp_fsck_file.deleteme", state_dump_file (fs));
+    if (retval != 0) {
+	fsck_progress ("%s: Could not rename the temporary file "
+		       "temp_fsck_file.deleteme to %s",
+		       __FUNCTION__, state_dump_file (fs));
+    }
+}
+
+/* we have nothing to load from a state file, but we have to fetch
+   on-disk bitmap, copy it to allocable bitmap, and fetch objectid
+   map */
+void fsck_semantic_load_result (FILE * file, reiserfs_filsys_t * fs) {
+    unsigned int gen_counter;
+    REISERFS_PATH_INIT(path);
+    
+    fsck_new_bitmap (fs) = reiserfs_bitmap_create 
+	    (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    
+    reiserfs_bitmap_copy (fsck_new_bitmap (fs), fs->fs_bitmap2);
+
+    fsck_allocable_bitmap (fs) = reiserfs_bitmap_create 
+	    (reiserfs_sb_get_blocks (fs->fs_ondisk_sb));
+    
+    reiserfs_bitmap_copy (fsck_allocable_bitmap (fs), fs->fs_bitmap2);
+
+    fs->block_allocator = reiserfsck_new_blocknrs;
+    fs->block_deallocator = reiserfsck_free_block;
+
+    /* we need objectid map on semantic pass to be able to relocate files */
+    proper_id_map (fs) = id_map_init();
+    
+    fetch_objectid_map (proper_id_map (fs), fs);
+    semantic_id_map (fs) = reiserfs_objectid_map_load (file);
+
+    /* get the lost_found key. */
+    if (!(reiserfs_tree_search_name (fs, &root_dir_key,
+				     "lost+found", &gen_counter,
+				     &lost_found_dir_key)))
+    {
+	    reiserfs_panic("Lost&found entry cannot be found in the root dir.");
+    }
+
+    if (reiserfs_tree_search_item (fs, &lost_found_dir_key, 
+				   &path) == ITEM_NOT_FOUND)
+    {
+	    reiserfs_panic("Lost&found StatData item cannot be found.");
+    }
+
+    fs->lost_format = (reiserfs_ih_get_len (REISERFS_PATH_IH (&path)) == 
+		       REISERFS_SD_SIZE) ? KEY_FORMAT_2 : KEY_FORMAT_1;
+    reiserfs_tree_pathrelse (&path);
+}
+
+static void before_pass_3 (reiserfs_filsys_t * fs) {
+    semantic_id_map (fs) = id_map_init();
+}
+
+static void after_pass_3 (reiserfs_filsys_t * fs) {
+    /* update super block: objectid map, fsck state */
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, SEMANTIC_DONE);
+    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+
+    /* write all dirty blocks */
+    fsck_progress ("Flushing..");
+    id_map_flush(proper_id_map (fs), fs);
+    fs->fs_dirt = 1;
+    reiserfs_bitmap_flush (fsck_new_bitmap(fs), fs);
+    reiserfs_fs_flush (fs);
+    fsck_progress ("finished\n");
+
+    fsck_stage_report (FS_SEMANTIC, fs);
+
+    if (!fsck_run_one_step (fs)) {
+	if (fsck_info_ask (fs, "Continue? (Yes):", "Yes\n", 1))
+	    /* reiserfsck continues */
+	    return;
+    }
+
+    fsck_semantic_save_result (fs);
+
+    id_map_free(proper_id_map (fs));
+    proper_id_map (fs) = 0;
+
+    fs->fs_dirt = 1;
+    reiserfs_fs_close (fs);
+    exit(0);
+}
+
+/* this is part of rebuild tree */
+void fsck_semantic (reiserfs_filsys_t * fs) {
+    __u16 root_format;
+    
+    before_pass_3 (fs);
+
+    fsck_progress ("Pass 3 (semantic):\n");
+
+    /* when warnings go not to stderr - separate them in the log */
+    if (fsck_log_file (fs) != stderr)
+	fsck_log ("####### Pass 3 #########\n");
+
+
+    if (!fs->hash)
+	reiserfs_panic ("Hash function should be selected already");
+
+    root_format = reiserfs_tree_root (fs, cb_item_modify, 1 << IH_Unreachable);
+    make_sure_lost_found_exists (fs, root_format);
+
+    id_map_mark(proper_id_map(fs), reiserfs_key_get_oid(&root_dir_key));
+    id_map_mark(proper_id_map(fs), reiserfs_key_get_oid(&lost_found_dir_key));
+    
+    /* link all relocated files into /lost+found directory */
+    fsck_relocate_link_all();
+
+    rebuild_semantic_pass ((reiserfs_key_t *)&root_dir_key, 
+			   &parent_root_dir_key, ET_NAME, 0/*reloc_ih*/);
+
+    if (!fsck_quiet(fs))
+	util_misc_fini_name(fsck_progress_file(fs));
+    
+    reiserfs_badblock_flush(fs, 1);
+
+    after_pass_3 (fs);
+}
diff --git a/utils/fsck/stage.c b/utils/fsck/stage.c
new file mode 100644
index 0000000..69dd57e
--- /dev/null
+++ b/utils/fsck/stage.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include <errno.h>
+
+#define FSCK_DUMP_START_MAGIC 374033
+#define FSCK_DUMP_END_MAGIC 7786470
+
+void fsck_stage_start_put (FILE * file, unsigned long stage) {
+    __u32 v = FSCK_DUMP_START_MAGIC;
+    fwrite (&v, 4, 1, file);
+    fwrite (&stage, 4, 1, file);
+}
+
+
+void fsck_stage_end_put (FILE * file) {
+    __u32 v = FSCK_DUMP_END_MAGIC;
+    fwrite (&v, 4, 1, file);
+}
+
+/*return last passed stage*/
+int fsck_stage_magic_check (FILE * fp)
+{
+    __u32 v;
+
+    if (fseek (fp, -4, SEEK_END)) {
+	reiserfs_warning (stderr, "%s: fseek failed: %s\n", 
+			  __FUNCTION__, strerror(errno));
+	return -1;
+    }
+
+    fread (&v, 4, 1, fp);
+    if (v != FSCK_DUMP_END_MAGIC) {
+	reiserfs_warning (stderr, "%s: no magic found\n", __FUNCTION__);
+	return -1;
+    }
+
+    if (fseek (fp, 0, SEEK_SET)) {
+	reiserfs_warning (stderr, "%s: fseek failed: %s\n", 
+			  __FUNCTION__, strerror(errno));
+	return -1;
+    }
+
+    fread (&v, 4, 1, fp);
+    if (v != FSCK_DUMP_START_MAGIC) {
+	reiserfs_warning (stderr, "%s: no magic found\n", __FUNCTION__);
+	return -1;
+    }
+
+    fread (&v, 4, 1, fp);
+    if (v != PASS_0_DONE && 
+	v != PASS_1_DONE && 
+	v != TREE_IS_BUILT && 
+	v != SEMANTIC_DONE && 
+	v != LOST_FOUND_DONE) 
+    {
+	reiserfs_warning (stderr, "%s: wrong pass found", __FUNCTION__);
+	return -1;
+    }
+
+    return (__u16)v;
+}
+
diff --git a/utils/fsck/super.c b/utils/fsck/super.c
new file mode 100644
index 0000000..40ac14b
--- /dev/null
+++ b/utils/fsck/super.c
@@ -0,0 +1,894 @@
+/*
+ * Copyright 2001-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+#include "misc/device.h"
+#include "util/print.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
+#    include <uuid/uuid.h>
+#endif
+
+#define fsck_conditional_log(sb_found, fmt, list...) {	\
+    if (sb_found)					\
+    	fsck_log(fmt, ## list);				\
+}
+
+int what_fs_version ()
+{
+    char answer[256];
+    int version;
+    printf("\nwhat the version of ReiserFS do you use[1-4]\n"
+        "\t(1)   3.6.x\n"
+        "\t(2) >=3.5.9 (introduced in the middle of 1999) (if you use linux 2.2, choose this one)\n"
+        "\t(3) < 3.5.9 converted to new format (don't choose if unsure)\n"
+        "\t(4) < 3.5.9 (this is very old format, don't choose if unsure)\n"
+        "\t(X)   exit\n");
+    fgets(answer, sizeof(answer), stdin);
+    version = atoi (answer);
+    if (version < 1 || version > 4)
+        misc_die ("rebuild_sb: wrong version");
+    return version;
+}
+
+/*
+#define super_error(exit_code, text) {	\
+    fsck_log(text);			\
+    return exit_code;			\
+}
+    
+int check_sb (reiserfs_filsys_t * fs) {
+    int magic = 0, version = 0;
+    
+    if (!reiserfs_fs_blksize_check (fs->fs_blocksize)) 
+	super_error(-1, "Wrong blocksize found in the super block\n");
+
+    if (reiserfs_super_36_magic (sb))
+	magic = 2;
+    else if (reiserfs_super_35_magic (sb))
+	magic = 1;
+    else if (reiserfs_super_jr_magic (sb))
+	magic = 3;
+    else 
+	super_error(-1, "Invalid magic found in the super block.\n");
+    
+    if (magic == 1 || magic == 2) {
+	if (fsck_data (fs)->journal_dev_name)
+            fsck_log("Reiserfs with standard journal found, but there was specified a "
+		"journal dev\n");
+	
+	standard_journal = 1;
+    } else {
+	if (!fsck_data (fs)->journal_dev_name) 
+            super_error(-1, "Reiserfs with non standard journal found, but there was not "
+		"specified any journal dev\n");
+	
+	standard_journal = 0;
+    }
+    
+    if (reiserfs_sb_get_version (sb) != REISERFS_FORMAT_3_6 && reiserfs_sb_get_version (sb) != REISERFS_FORMAT_3_5) 
+	super_error(-1, "Invalid format found in the super block.\n");
+	
+    if (reiserfs_new_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) 
+    {
+	if (magic == 3) 
+	    version = reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6 ? 1 : 2;
+	else
+	    version = magic == 2 ? 1 : 2;	
+    } else if (reiserfs_old_location(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) {
+	if (magic == 3) 
+	    version = reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6 ? 3 : 4;
+	else 
+	    version = magic == 2 ? 3 : 4;	
+    } else 
+	misc_die("Super block in the wong block(%d).\n", fs->fs_super_bh->b_blocknr);
+    
+    if (version == 0) 
+	misc_die ("FS format must be figured out here.\n");
+
+    if (reiserfs_sb_get_blocks (sb) > misc_device_count_blocks (filename, fs->fs_blocksize)) 
+	super_error(-1, "Invalid block count found in the super block.\n");
+
+    if (reiserfs_sb_get_blksize (sb) != fs->fs_blocksize) 
+        super_error(-1, "Invalid block size found in the super block (%lu).\n", 
+	    reiserfs_sb_get_blksize (sb));
+
+//Non needed from here
+    p_oid_maxsize = (fs->fs_blocksize - reiserfs_super_size (sb)) / sizeof(__u32) / 2 * 2;    
+    if (reiserfs_sb_get_mapmax (sb) != p_oid_maxsize) 
+	super_error(-1, "Invalid objectid map max size found in the super block (%lu).\n", 
+	    reiserfs_sb_get_mapmax (sb));
+
+    if (reiserfs_sb_get_mapcur (sb) == 1 || reiserfs_sb_get_mapcur (sb) > reiserfs_sb_get_mapmax (sb))
+        super_error(-1, "Invalid objectid map found in the super block (%lu).\n", 
+	    reiserfs_sb_get_mapcur (sb));
+
+    if (reiserfs_sb_get_root (sb) > block_count && reiserfs_sb_get_root (sb) != ~0) 
+	fsck_log("Invalid root block found in the super block (%lu).\n", 
+	    reiserfs_sb_get_root (sb));
+
+    if (reiserfs_sb_get_free (sb) > block_count) 
+	fsck_log ("Invalid free block count found in the super block (%lu).\n", 
+	    reiserfs_sb_get_free (sb));
+
+    if (reiserfs_sb_get_height (sb) && ((reiserfs_sb_get_height (sb) < LEAF_LEVEL + 1) ||
+	(reiserfs_sb_get_height (sb) > REISERFS_TREE_HEIGHT_MAX) && (reiserfs_sb_get_height (sb) != ~0))) 
+	super_error(-1, "Invalid tree height found in the super block (%lu).\n", 
+	    reiserfs_sb_get_height (sb));
+
+    if (reiserfs_sb_get_hash (sb) && reiserfs_hash_name (reiserfs_sb_get_hash (sb)) == 0) 
+	super_error(-1, "Invalid hash found in the super block (%lu).\n", 
+	    reiserfs_sb_get_hash (sb));
+
+    if (version == 1 || version == 3) {
+        if (!uuid_is_correct(sb->s_uuid)) 
+	    fsck_log ("Invalid uuid found, you should generate a new one.\n");
+
+	if (sb->s_flags & 0xfffffffe)
+	    fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n", sb->s_flags);
+    }
+
+//Not needed till here.
+
+    p_bmap_nr = (block_count + (fs->fs_blocksize * 8 - 1)) / (fs->fs_blocksize * 8);
+    if (reiserfs_sb_get_bmaps (sb) != p_bmap_nr) 
+	super_error(-1, "Invalid bitmap number found in the super block (%lu).\n", 
+	    reiserfs_sb_get_bmaps (sb));
+
+    if (!fsck_skip_journal (fs) && standard_journal == 1) {
+        if (reiserfs_jp_get_dev (reiserfs_sb_jp(sb)) != 0)
+ 	    super_error(-1, "Invalid journal device found (%lu).\n", reiserfs_jp_get_dev (reiserfs_sb_jp(sb)));
+
+        if (reiserfs_jp_get_start (reiserfs_sb_jp(sb)) != reiserfs_journal_start_must (fs)) 
+            super_error(-1, "Invalid journal first block found (%lu).\n", reiserfs_jp_get_start (reiserfs_sb_jp(sb)));
+
+        if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) != reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) 
+	    super_error(-1, "Invalid journal size found (%lu).\n", reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + 1);
+        
+        
+	
+	if (reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)) != reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))) {
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max batch size occured (%lu), fixed (%d)\n",
+ 	        reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb))));
+ 	    reiserfs_jp_set_max_batch (reiserfs_sb_jp(sb), reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb))));
+        }
+        if (reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)) != reiserfs_journal_commit_age()) {
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal  max commit age occured (%lu), fixed (%d)\n",
+ 	        reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)), reiserfs_journal_commit_age());
+ 	    reiserfs_jp_set_commit_age (reiserfs_sb_jp(sb), reiserfs_journal_commit_age());
+        }
+        if (reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)) != reiserfs_journal_trans_age()) {
+ 	    fsck_log ("rebuild-sb: wrong journal  max commit age occured (%lu), fixed (0)\n",
+ 	        reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)), reiserfs_journal_trans_age());
+ 	    reiserfs_jp_set_trans_age (reiserfs_sb_jp(sb), reiserfs_journal_trans_age());
+        }
+
+        
+}
+*/
+
+void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * data)
+{
+    struct reiserfs_journal_header *j_head;
+    __u32 p_jp_journal_1st_block = 0;
+    int retval, exit_code = EXIT_OK;
+    reiserfs_sb_t * ondisk_sb = 0;
+    unsigned long block_count = 0;
+    char * journal_dev_name = 0;
+    int standard_journal = -1;
+    int magic_was_found = 0;
+    __u32 p_jp_dev_size = 0;
+    reiserfs_sb_t * sb = 0;
+    struct stat stat_buf;
+    __u16 p_oid_maxsize;
+    char answer[256];
+    __u32 p_bmap_nr;
+    int version = 0;
+    int sb_size;
+    char * tmp;
+
+#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
+    char uuid[37];
+    
+    uuid[36] = '\0';
+#endif
+
+    if (fs != NULL) {
+        sb = misc_getmem (sizeof (*sb));
+        if (!reiserfs_fs_rw (fs)) {
+            close (fs->fs_dev);
+            fs->fs_dev = open (fs->fs_file_name, O_RDWR 
+#ifdef O_LARGEFILE
+			       | O_LARGEFILE
+#endif
+			       );
+        }
+
+	if (!reiserfs_fs_blksize_check (fs->fs_blocksize)) {
+	    printf("\nCannot find a proper blocksize, enter block size [4096]: \n");
+	    fgets(answer, sizeof(answer), stdin);
+	    if (strcmp(answer, "\n")) {
+		retval = (int) strtol (answer, &tmp, 0);
+		if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
+		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified\n");
+		if (!reiserfs_fs_blksize_check (retval))
+		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified, "
+			"only power of 2 from 512-8192 interval are supported.\n");
+	    } else
+		retval = 4096;
+	
+	    fs->fs_blocksize = retval;
+	}
+
+        if (!(block_count = misc_device_count_blocks (filename, fs->fs_blocksize)))
+		exit(EXIT_OPER);
+
+        /* save ondisk_sb somewhere and work in temp area */
+        ondisk_sb = fs->fs_ondisk_sb;
+        memcpy (sb, fs->fs_ondisk_sb, sizeof (*sb));
+        fs->fs_ondisk_sb = sb;
+
+        if (reiserfs_super_36_magic (sb)) {
+            /* 3_6 magic */
+            if (fsck_data (fs)->journal_dev_name)
+                /* journal dev must not be specified with standard journal */
+                reiserfs_exit (EXIT_USER, "ReiserFS with default journal "
+		    "is found, but there was specified a journal device.");
+
+            if (fs->fs_super_bh->b_blocknr ==
+		REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                version = 1;
+	    else if (fs->fs_super_bh->b_blocknr ==
+		REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                version = 3;
+	    
+            magic_was_found = 2;
+        } else if (reiserfs_super_35_magic (sb)) {
+            if (fsck_data (fs)->journal_dev_name)
+                /* journal dev must not be specified with standard journal */
+                reiserfs_exit (EXIT_USER, "ReiserFS with default journal "
+		    "is found, but there was specified a journal device.");
+
+            /* 3_5 magic */
+            if (fs->fs_super_bh->b_blocknr ==
+		REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                version = 2;
+	    else if (fs->fs_super_bh->b_blocknr ==
+		REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                version = 4;
+	    
+	    magic_was_found = 1;
+        } else if (reiserfs_super_jr_magic (sb)) {
+            if (reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6) {
+                /*non-standard magic + sb_format == 3_6*/
+		if (fs->fs_super_bh->b_blocknr ==
+		    REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                    version = 1;
+		else if (fs->fs_super_bh->b_blocknr == 
+		    REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                    version = 3;
+		
+                magic_was_found = 3;
+            } else if (reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_5) {
+                /* non-standard magic + sb_format == 3_5 */
+                if (fs->fs_super_bh->b_blocknr ==
+		    REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                    version = 2;
+		else if (fs->fs_super_bh->b_blocknr ==
+		    REISERFS_OLD_DISK_OFFSET_IN_BYTES / fs->fs_blocksize)
+                    version = 4;
+		
+                magic_was_found = 3;
+            } else {
+                /* non-standard magic + bad sb_format */
+                version = 0;
+                magic_was_found = 3;
+            }
+        } else
+            reiserfs_exit (EXIT_USER, "We opened device but there is no magic "
+		"and there is no correct superblock format found.");
+
+        if (magic_was_found == 1 || magic_was_found == 2)
+            standard_journal = 1;
+        else
+            standard_journal = 0;
+
+        if (version == 0)
+            version = what_fs_version ();
+
+        if (reiserfs_sb_get_blocks (sb) != block_count) {
+            do {
+                printf("\nDid you use resizer(y/n)[n]: ");
+                fgets(answer, sizeof(answer), stdin);
+            } while(strcmp ("y\n", answer) && 
+		    strcmp ("n\n", answer) && 
+		    strcmp ("\n", answer));
+
+            if (!strcmp ("y\n", answer)) {
+                printf("\nEnter partition size [%lu]: ", block_count);
+                fgets(answer, sizeof(answer), stdin);
+                if (strcmp ("\n", answer))
+                    block_count = atoi (answer);
+            } else {
+                fsck_conditional_log (magic_was_found, "rebuild-sb: wrong block count "
+		    "occured (%lu), fixed (%lu)\n", reiserfs_sb_get_blocks(sb), block_count);
+            }
+
+	    reiserfs_sb_set_blocks (sb, block_count);
+        }
+
+        if (reiserfs_sb_get_blksize (sb) != fs->fs_blocksize) {
+            fsck_log("rebuild-sb: wrong block size occured (%lu), fixed (%lu)\n", 
+		    reiserfs_sb_get_blksize (sb), fs->fs_blocksize);
+  	    reiserfs_sb_set_blksize (sb, fs->fs_blocksize);
+        }
+    }
+
+    /* if no reiserfs_found or bad data found in that SB, what was checked in previous 
+     * clause */
+    if (fs == NULL) {
+        int fd;
+
+        fd = open (filename, O_RDWR 
+#ifdef O_LARGEFILE
+		   | O_LARGEFILE
+#endif
+		   );
+
+        if (fd == -1) {
+            reiserfs_exit (EXIT_OPER, "rebuils_sb: cannot open device %s", 
+		filename);
+	}
+
+        version = what_fs_version ();
+
+        if (version == 3 || version == 4) {
+            retval = 4096;
+        } else {
+	    printf("\nEnter block size [4096]: \n");
+	    fgets(answer, sizeof(answer), stdin);
+	    if (strcmp(answer, "\n")) {
+		retval = (int) strtol (answer, &tmp, 0);
+		if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
+		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified\n");
+		if (!reiserfs_fs_blksize_check (retval))
+		    reiserfs_exit (EXIT_USER, "rebuild_sb: wrong block size specified, "
+			"only divisible by 1024 are supported currently\n");
+	    } else
+		retval = 4096;
+	}
+
+        if (!(block_count = misc_device_count_blocks (filename, retval)))
+		exit(EXIT_OPER);
+
+        switch(version){
+        case 1:
+            fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_6, 
+				     block_count, retval, 1, 1);
+            break;
+        case 2:
+            fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_5, 
+				     block_count, retval, 1, 1);
+            break;
+        case 3:
+            fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_6, 
+				     block_count, retval, 1, 0);
+            break;
+        case 4:
+            fs = reiserfs_fs_create (filename, REISERFS_FORMAT_3_5, 
+				     block_count, retval, 1, 0);
+            break;
+        }
+
+	if (fs == NULL)
+	    return;
+	
+        sb = fs->fs_ondisk_sb;
+        fs->fs_vp = data;
+
+        if (!fsck_skip_journal (fs)) {
+            if (!fsck_data (fs)->journal_dev_name) {
+                do {
+                    printf("\nNo journal device was specified. (If journal is not "
+			"available, re-run with --no-journal-available option specified).\n"
+                        "Is journal default? (y/n)[y]: ");
+		    
+                    fgets(answer, sizeof(answer), stdin);
+                } while(strcmp ("y\n", answer) && 
+			strcmp ("n\n", answer) && 
+			strcmp ("\n", answer));
+		
+                if (!strcmp ("n\n", answer)) {
+                    printf("\nSpecify journal device with -j option.\n");
+                    exit(EXIT_USER);
+                }
+                standard_journal = 1;
+            } else {
+                standard_journal = 0;
+                memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING,
+                    strlen (REISERFS_JR_SUPER_MAGIC_STRING));
+            }
+        }
+
+        do {
+            printf("\nDid you use resizer(y/n)[n]: ");
+            fgets(answer, sizeof(answer), stdin);
+        } while (strcmp ("y\n", answer) && 
+		 strcmp ("n\n", answer) && 
+		 strcmp ("\n", answer));
+	
+        if (!strcmp ("y\n", answer)) {
+            printf("\nEnter partition size [%lu]: ", block_count);
+            fgets(answer, sizeof(answer), stdin);
+            if (strcmp ("\n", answer))
+                block_count = atoi (answer);
+            reiserfs_sb_set_blocks (sb, block_count);
+        }
+	
+	reiserfs_sb_set_state (sb, FS_ERROR);
+    }
+
+
+    if (version == 1 || version == 3) {
+        if (reiserfs_super_format (sb) != REISERFS_FORMAT_3_6) {
+            fsck_log("rebuild-sb: wrong reiserfs version occured (%lu), fixed (%lu)\n", 
+		    reiserfs_super_format (sb), REISERFS_FORMAT_3_6);
+            reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_6);
+        }
+    } else if (version == 2 || version == 4) {
+        if (reiserfs_super_format (sb) != REISERFS_FORMAT_3_5) {
+            fsck_log("rebuild-sb: wrong reiserfs version occured (%lu), fixed (%lu)\n", 
+		    reiserfs_super_format (sb), REISERFS_FORMAT_3_5);
+            reiserfs_sb_set_version (sb, REISERFS_FORMAT_3_5);
+        }
+    }
+
+    p_oid_maxsize = (fs->fs_blocksize - reiserfs_super_size (sb)) / 
+	sizeof(__u32) / 2 * 2;
+    
+    if (reiserfs_sb_get_mapmax (sb) != p_oid_maxsize) {
+	fsck_log("rebuild-sb: wrong objectid map max size occured (%lu), fixed (%lu)\n", 
+		reiserfs_sb_get_mapmax (sb), p_oid_maxsize);
+	reiserfs_sb_set_mapmax (sb, p_oid_maxsize);
+    }
+
+    p_bmap_nr = reiserfs_bmap_nr(block_count, fs->fs_blocksize);
+    p_bmap_nr = reiserfs_bmap_over(p_bmap_nr) ? 0 : p_bmap_nr;
+    
+    if (reiserfs_sb_get_bmaps (sb) != p_bmap_nr) {
+	fsck_log("rebuild-sb: wrong bitmap number occured (%lu), fixed (%lu)\n", 
+		reiserfs_sb_get_bmaps (sb), p_bmap_nr);
+	reiserfs_sb_set_bmaps (sb, (__u16)p_bmap_nr);
+    }
+
+    if (reiserfs_sb_get_root (sb) > block_count) {
+	fsck_log("rebuild-sb: wrong root block occured (%lu), zeroed\n", 
+		reiserfs_sb_get_root (sb));
+	reiserfs_sb_set_root (sb, 0);
+    }
+
+    if (reiserfs_sb_get_free (sb) > block_count) {
+	fsck_log ("rebuild-sb: wrong free block count occured (%lu), zeroed\n", 
+		reiserfs_sb_get_free (sb));
+        reiserfs_sb_set_free (sb, 0);
+    }
+
+    if (reiserfs_sb_get_umount (sb) != FS_CLEANLY_UMOUNTED && 
+	reiserfs_sb_get_umount (sb) != FS_NOT_CLEANLY_UMOUNTED) 
+    {
+	fsck_conditional_log (magic_was_found, "rebuild-sb: wrong umount state (%u), "
+	    "fixed to (FS_NOT_CLEANLY_UMOUNTED)\n", reiserfs_sb_get_umount (sb));
+        reiserfs_sb_set_umount (sb, FS_NOT_CLEANLY_UMOUNTED);
+    }
+
+    if (reiserfs_sb_get_mapcur (sb) == 1 || 
+	reiserfs_sb_get_mapcur (sb) > reiserfs_sb_get_mapmax (sb)) 
+    {
+        fsck_log("rebuild-sb: wrong objectid map occured (%lu), zeroed\n", 
+	    reiserfs_sb_get_mapcur (sb));
+	
+        reiserfs_sb_set_mapcur (sb, 0);
+    }
+
+    if ( reiserfs_sb_get_height (sb) &&
+        ((reiserfs_sb_get_height (sb) < LEAF_LEVEL + 1) ||
+	(reiserfs_sb_get_height (sb) > REISERFS_TREE_HEIGHT_MAX)) ) {
+	fsck_log("rebuild-sb: wrong tree height occured (%u), zeroed\n", 
+	    reiserfs_sb_get_height (sb));
+
+	reiserfs_sb_set_height (sb, 0);
+    }
+
+    if (reiserfs_sb_get_hash (sb) && 
+	reiserfs_hash_name (reiserfs_sb_get_hash (sb)) == 0) 
+    {
+	fsck_log("rebuild-sb: wrong hash occured (%lu), zeroed\n", 
+	    reiserfs_sb_get_hash (sb));
+	
+	reiserfs_sb_set_hash (sb, 0);
+    }
+
+    if (version == 1 || version == 3) {
+#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
+        if (uuid_is_null(sb->s_uuid)) {
+	    uuid_generate(sb->s_uuid);
+	    fsck_log ("rebuild-sb: no uuid found, a new uuid was "
+		      "generated (%U)\n", sb->s_uuid);
+        }
+#endif
+	if (sb->s_flags != 0 && sb->s_flags != 1) {
+	    fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n",
+                  sb->s_flags);
+	    sb->s_flags = 0;
+	}
+    }
+
+
+    /*
+    if we have a standard journal
+        reserved = 0
+        dev - same
+        size = reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs)
+        offset = reiserfs_journal_default(fs)
+    if we have a non standard journal
+        if we found magic string
+            try to find a jhead and comare dev, size, offset there
+            if params are not equal move to "if we did not find a magic string" clause
+        if we did not find a magic string
+            ask user about his journal
+            try to find a jhead and comare dev, size, offset there
+            if params are not equal exit with error
+    */
+
+
+    p_jp_journal_1st_block = reiserfs_journal_start_must (fs);
+
+    if (standard_journal == 1) {
+	if (reiserfs_jp_get_dev (reiserfs_sb_jp(sb)) != 0) {
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal device "
+		"occured (%lu), fixed (0)\n", reiserfs_jp_get_dev (reiserfs_sb_jp(sb)));
+ 	    reiserfs_jp_set_dev (reiserfs_sb_jp(sb), 0);
+        }
+        if (reiserfs_sb_get_reserved (sb) != 0) {
+ 	    fsck_log ("rebuild-sb: wrong size reserved for default journal occured "
+		"(%lu), fixed (0)\n", reiserfs_sb_get_reserved (sb));
+            reiserfs_sb_set_reserved (sb, 0);
+        }
+        if (reiserfs_jp_get_start (reiserfs_sb_jp(sb)) != p_jp_journal_1st_block) {
+            fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal first "
+		"block occured (%lu), fixed (%lu)\n", reiserfs_jp_get_start (reiserfs_sb_jp(sb)),
+		p_jp_journal_1st_block);
+	    
+            reiserfs_jp_set_start (reiserfs_sb_jp(sb) , p_jp_journal_1st_block);
+        }
+        if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) != 
+	    reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize)) 
+	{
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal size "
+		"occured (%lu), fixed (%lu)\n", reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + 1,
+ 	        reiserfs_journal_default (fs->fs_super_bh->b_blocknr, 
+		fs->fs_blocksize) + 1);
+	    
+            reiserfs_jp_set_size (reiserfs_sb_jp(sb), 
+		reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize));
+        }
+
+	if ((retval = reiserfs_journal_open(fs, filename, O_RDWR 
+#ifdef O_LARGEFILE
+					    | O_LARGEFILE
+#endif
+					    ))) 
+	{
+	    fsck_log("\nrebuild-sb: Failed to open the journal device (%s).\n", 
+		filename);
+
+	    exit(retval < 0 ? EXIT_OPER : EXIT_USER);
+	}	
+    } else if (!fsck_skip_journal(fs)) {
+	/* Check that specified non-standard journal device exists. */
+	    
+	journal_dev_name = fsck_data (fs)->journal_dev_name;	    
+		
+	retval = 0;
+	if (magic_was_found) {
+	    /* Super block was found. Try to open the journal on the base of its 
+	     * journal parameters. */
+	    
+	    retval = reiserfs_journal_open(fs, journal_dev_name, O_RDWR 
+#ifdef O_LARGEFILE
+					   | O_LARGEFILE
+#endif
+					   );
+	    
+	    if (retval == 0) {
+		journal_dev_name = fs->fs_j_file_name;
+		
+		j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
+		retval = memcmp(&j_head->jh_journal, reiserfs_sb_jp(sb), 
+		    sizeof(reiserfs_journal_param_t));
+	    
+		if (retval) {
+		    /* journal parameters from the SB and from the J_Header does not 
+		     * match. Close the jouranl, ask the user about correct journal 
+		     * parameters. */
+		    reiserfs_journal_close(fs);
+		}
+	    }
+
+	    if (!reiserfs_journal_opened(fs)) {
+		fsck_log ("Journal cannot be opened, assuming the "
+			  "journal device %s is correct\n", journal_dev_name);
+	    }
+	}
+	
+	if (!reiserfs_journal_opened(fs)) {
+	    __u64 default_value;
+
+	    /* journal was not found or SB and J_Header parameters does not match. */
+	    if (magic_was_found == 0)
+                default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ? 
+		    p_jp_journal_1st_block : 0;
+            else
+                default_value = reiserfs_jp_get_start (reiserfs_sb_jp(sb));
+
+            printf("\nEnter journal offset on %s in blocks [%Lu]: \n",
+            		journal_dev_name, (unsigned long long)default_value);
+
+            fgets(answer, sizeof(answer), stdin);
+            if (strcmp(answer, "\n")) {
+                retval = (int) strtol (answer, &tmp, 0);
+                if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
+                    reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n");
+
+                reiserfs_jp_set_start (reiserfs_sb_jp(sb), retval);
+            } else
+                reiserfs_jp_set_start (reiserfs_sb_jp(sb), default_value);
+
+            if (!(p_jp_dev_size = misc_device_count_blocks (journal_dev_name, fs->fs_blocksize)))
+		    exit(EXIT_OPER);
+
+            /* some checks for journal offset */
+            if (strcmp(fs->fs_file_name, journal_dev_name) != 0) {
+                if (p_jp_dev_size < reiserfs_jp_get_start (reiserfs_sb_jp(sb)) + 1)
+        	    reiserfs_exit(EXIT_USER, "rebuild_sb: offset is much than device size\n");
+            }
+
+            /* default size if magic was not found is device size - journal_1st_block;
+               default size if magic was found is found value + 1 block for journal 
+	       header */
+            if (magic_was_found == 0)
+                default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ?
+                    reiserfs_journal_default (fs->fs_super_bh->b_blocknr,
+					  fs->fs_blocksize) + 1 :
+                    p_jp_dev_size - reiserfs_jp_get_start (reiserfs_sb_jp(sb));
+            else
+                default_value = reiserfs_jp_get_size (reiserfs_sb_jp(sb)) + 1;
+		
+
+            printf("\nEnter journal size (including 1 block for journal header) on "
+		"%s in blocks [%Lu]: \n", journal_dev_name, 
+		(unsigned long long)default_value);
+
+            fgets(answer, sizeof(answer), stdin);
+            if (strcmp(answer, "\n")) {
+                retval = (int) strtol (answer, &tmp, 0);
+                if ((*tmp && strcmp(tmp, "\n")) || retval < 0)
+        	    reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n");
+
+                reiserfs_jp_set_size (reiserfs_sb_jp(sb), retval - 1);
+            } else {
+                reiserfs_jp_set_size (reiserfs_sb_jp(sb), default_value - 1);
+            }
+
+            /* some checks for journal size */
+            if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) +
+                reiserfs_jp_get_start (reiserfs_sb_jp(sb)) + 1 > p_jp_dev_size)
+        	    reiserfs_exit(EXIT_USER, "rebuild_sb: journal offset + journal size is "
+			"greater than device size\n");
+            
+	    /* some checks for journal size */
+            if (reiserfs_jp_get_size (reiserfs_sb_jp(sb)) < JOURNAL_MIN_SIZE)
+        	    reiserfs_exit(EXIT_USER, "rebuild_sb: journal size cannot be less than "
+			"%lu blocks.\n", JOURNAL_MIN_SIZE + 1);
+
+	    if ((retval = reiserfs_journal_open(fs, journal_dev_name, O_RDWR 
+#ifdef O_LARGEFILE
+						| O_LARGEFILE
+#endif
+						)))
+	    {
+		fsck_log("\nrebuild-sb: Failed to open a journal device (%s).", 
+		    journal_dev_name);
+		
+		exit(retval < 0 ? EXIT_OPER : EXIT_USER);
+	    }
+	
+	    /* SB was found, but journal params were broken and have been recovered. 
+	     * Futher work goes as SB would not be found. */
+	    magic_was_found = 0;
+	}
+	
+	retval = stat(journal_dev_name, &stat_buf);
+	    
+	if (retval == -1)
+	    reiserfs_exit (EXIT_USER, "rebuild_sb: error while detecting the "
+		"specified journal device (%s): %s\n", journal_dev_name,
+		strerror(errno));
+
+	if (strcmp (fs->fs_file_name, journal_dev_name))
+	    reiserfs_jp_set_dev (reiserfs_sb_jp(sb), stat_buf.st_rdev);
+	else
+	    reiserfs_jp_set_dev (reiserfs_sb_jp(sb), 0);
+
+    } else {
+	fsck_log ("\nJournal was specified as not available. reiserfstune is "
+	    "needed.\n\n");
+	
+	reiserfs_jp_set_magic (reiserfs_sb_jp(sb), NEED_TUNE);
+    }
+
+    if (reiserfs_journal_opened(fs)) {
+	/* Journal was openned. Check/fix journal parameters and copy it the journal 
+	 * header. */
+	
+        if (reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)) !=
+	    reiserfs_journal_tlen(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)),
+				  reiserfs_jp_get_size (reiserfs_sb_jp(sb)), 
+				  fs->fs_blocksize, 0))
+	{
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max "
+		"transaction length occured (%lu), fixed (%d)\n",
+		reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)),
+		reiserfs_journal_tlen(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)),
+				      reiserfs_jp_get_size (reiserfs_sb_jp(sb)),
+				      fs->fs_blocksize, 0));
+	    
+ 	    reiserfs_jp_set_tlen (reiserfs_sb_jp(sb),
+		reiserfs_journal_tlen(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)),
+				      reiserfs_jp_get_size (reiserfs_sb_jp(sb)),
+				      fs->fs_blocksize, 0));
+        }
+	
+        if (reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)) != 
+	    reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb)))) 
+	{
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max "
+		"batch size occured (%lu), fixed (%d)\n", 
+		reiserfs_jp_get_max_batch (reiserfs_sb_jp(sb)), 
+		reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb))));
+	    
+ 	    reiserfs_jp_set_max_batch (reiserfs_sb_jp(sb), 
+		reiserfs_journal_batch(reiserfs_jp_get_tlen (reiserfs_sb_jp(sb))));
+        }
+
+        if (reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)) != 
+	    reiserfs_journal_commit_age()) 
+	{
+ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal "
+		"max commit age occured (%lu), fixed (%d)\n", 
+ 	        reiserfs_jp_get_commit_age (reiserfs_sb_jp(sb)), reiserfs_journal_commit_age());
+	    
+ 	    reiserfs_jp_set_commit_age (reiserfs_sb_jp(sb), reiserfs_journal_commit_age());
+        }
+	
+        if (reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)) != reiserfs_journal_trans_age()) {
+ 	    fsck_log ("rebuild-sb: wrong journal transaction age occured (%u), "
+		"fixed (%u)\n", reiserfs_jp_get_trans_age (reiserfs_sb_jp(sb)), 
+		reiserfs_journal_trans_age());
+	    
+ 	    reiserfs_jp_set_trans_age (reiserfs_sb_jp(sb), reiserfs_journal_trans_age());
+        }
+		
+	j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
+
+	if (standard_journal == 0) {
+	    if (reiserfs_jp_get_magic (reiserfs_sb_jp(sb)) == 0 || 
+		reiserfs_jp_get_magic (reiserfs_sb_jp(sb)) == NEED_TUNE) 
+	    {
+		int magic;
+		
+		magic = random();
+		fsck_log ("rebuild-sb: genarate the new journal magic (%d)\n", magic);
+		reiserfs_jp_set_magic (reiserfs_sb_jp(sb), magic);
+		reiserfs_jp_set_magic (&j_head->jh_journal, magic);
+
+	    }
+	}
+	
+	retval = memcmp(&j_head->jh_journal, reiserfs_sb_jp(sb), sizeof(reiserfs_journal_param_t));
+	
+	if (retval) {
+	    if (standard_journal == 1) {
+		fsck_log("\nrebuild-sb: You either have a corrupted journal or have just "
+		    "changed\nthe start of the partition with some partition table editor. "
+		    "If you are\nsure that the start of the partition is ok, rebuild the "
+		    "journal header.\n");
+	    } else if (!magic_was_found) {
+		fsck_log("\nrebuild-sb: journal header is not found. You either have "
+		    "a corrupted,\nbad configured(device/offset/size), not available "
+		    "journal or have just changed\nthe start of the journal partition "
+		    "with some partition table editor. In the \ncase of corrupted "
+		    "journal you need to use --no-journal-available. If you are\n"
+		    "sure that the start of the partition is ok and journal is "
+		    "available, rebuild\nthe journal header.\n");
+	    }
+	    
+	    if (standard_journal || !magic_was_found) {
+		if (!util_user_confirmed (stdout, "Do you want to rebuild the journal header? "
+		    "(y/n)[n]: ", "y\n"))
+		{
+		    exit(EXIT_USER);
+		} else 
+		    exit_code = EXIT_FIXED;
+	    }
+	    
+	    memcpy(&j_head->jh_journal, reiserfs_sb_jp(sb), sizeof(reiserfs_journal_param_t));
+	    reiserfs_buffer_mkdirty(fs->fs_jh_bh);
+	    reiserfs_buffer_write (fs->fs_jh_bh);
+	}
+    }
+    
+    /*  whether journal header contains params with the same dev, offset, size will be 
+	checked in open_journal */
+
+    if (version == 1 || version == 3)
+        sb_size = REISERFS_SB_SIZE;
+    else
+        sb_size = REISERFS_SB_SIZE_V1;
+
+    if (ondisk_sb == NULL || 
+	memcmp(ondisk_sb, sb, sb_size - ((sb_size == REISERFS_SB_SIZE) ? 
+	    sizeof(fs->fs_ondisk_sb->s_unused) : 0))) 
+    {
+        /* smth was changed in SB or a new one has been built */
+	reiserfs_sb_set_state (sb, reiserfs_sb_get_state (sb) | FS_ERROR);
+	
+	if (ondisk_sb) {
+	    /* if super_block was found, we keep sb in ondisk_sb */
+	    fs->fs_ondisk_sb = ondisk_sb;
+	    memcpy (ondisk_sb, sb, sb_size);
+	    misc_freemem(sb);
+	}
+
+	fflush(stdout); 
+	reiserfs_node_print (stderr, fs, fs->fs_super_bh);
+	
+	if (util_user_confirmed (stderr, "Is this ok ? (y/n)[n]: ", "y\n")) {
+	    reiserfs_buffer_mkuptodate (fs->fs_super_bh, 1);
+	    reiserfs_buffer_mkdirty (fs->fs_super_bh);
+	    reiserfs_buffer_write (fs->fs_super_bh);
+	    fsck_progress ("The fs may still be unconsistent. Run reiserfsck --check.\n\n");
+	    exit_code = EXIT_FIXED;
+	} else {
+	    reiserfs_buffer_mkclean (fs->fs_super_bh);
+	    fsck_progress ("Super block was not written\n");
+	}
+    } else {
+	reiserfs_node_print (stderr, fs, fs->fs_super_bh);
+	
+	reiserfs_buffer_mkclean (fs->fs_super_bh);
+	fsck_progress ("\nSuper block seems to be correct\n\n");
+    }
+
+    exit(exit_code);
+}
+
+/*	if (version == 0) {
+	    reiserfs_buffer_close (fs->fs_super_bh);
+            misc_freemem (fs);
+            close (fs->fs_dev);
+            fs = NULL;
+	}
+*/
diff --git a/utils/fsck/ubitmap.c b/utils/fsck/ubitmap.c
new file mode 100644
index 0000000..a5a660a
--- /dev/null
+++ b/utils/fsck/ubitmap.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/malloc.h"
+
+#include <assert.h>
+
+/* g_disk_bitmap initially contains copy of disk bitmaps
+   (cautious version of it);
+
+   g_new_bitmap initially has marked only super block, bitmap blocks
+   and bits after the end of bitmap
+
+   in pass 1 we go through g_disk_bitmap. 
+
+   If block does not look like formatted node, we skip it.
+
+   If block contains internal node, put 0 in g_disk_bitmap if block is
+   not used in new tree yet.
+
+   If block contains leaf and is used already (by an extent item
+   handled already to this time) save all items. They will be inserted
+   into tree after pass 1.
+
+   If block looking like leaf is not used in the new tree, try to
+   insert in into tree. If it is not possible, mark block in
+   g_uninsertable_leaf_bitmap. Blocks marked in this bitmap will be inserted into tree in pass 2. They can not be
+
+  This means, that in pass 1 when we have
+   found block containing the internal nodes we mark it in
+   g_disk_bitmap as free (reiserfs_free_internal_block). When block
+   gets into new tree it is marked in g_new_bitmap (mark_block_used)
+   When collecting resources for reiserfs_tb_balance, we mark new blocks with
+   mark_block_used. After reiserfs_tb_balance we unmark unused new blocks in
+   g_new_bitmap (bitmap.c:/reiserfs_free_block)
+
+   Allocating of new blocks: look for 0 bit in g_disk_bitmap
+   (find_zero_bit_in_bitmap), make sure, that g_new_bitmap contains 0
+   at the corresponding bit (is_block_used).
+      
+ */
+
+
+
+/* is blocks used (marked by 1 in new bitmap) in the tree which is being built
+   (as leaf, internal, bitmap, or unformatted node) */
+int is_block_used (unsigned long block) {
+    return reiserfs_bitmap_test_bit (fsck_new_bitmap (fs), block);
+}
+
+void mark_block_used (unsigned long block, int check_hardware) {
+    if (!block)
+	return;
+    if (is_block_used (block)) {
+	if (check_hardware)
+	    fsck_info_checkmem();
+	misc_die ("mark_block_used: (%lu) used already", block);
+    }
+
+    reiserfs_bitmap_set_bit (fsck_new_bitmap (fs), block);
+}
+
+
+void mark_block_free (unsigned long block) {
+    if (!is_block_used (block))
+	misc_die ("mark_block_free: (%lu) is free already", block);
+
+    reiserfs_bitmap_clear_bit (fsck_new_bitmap (fs), block);
+}
+
+
+int fsck_bitmap_isuninsert (unsigned long block) {
+    return !reiserfs_bitmap_test_bit (fsck_uninsertables (fs), block);
+}
+
+void fsck_bitmap_cluninsert (unsigned long block) {
+    reiserfs_bitmap_set_bit (fsck_uninsertables (fs), block);
+    pass_1_stat (fs)->uninsertable_leaves --;
+}
+
+/* uninsertable block is marked by bit clearing */
+void fsck_bitmap_mkuninsert (unsigned long block) {
+    if (fsck_bitmap_isuninsert (block))
+	misc_die ("%s: (%lu) is uninsertable already", 
+		  __FUNCTION__, block);
+
+    reiserfs_bitmap_clear_bit (fsck_uninsertables (fs), block);
+    
+    /* we do not need thsi actually */
+    pass_1_stat (fs)->uninsertable_leaves ++;
+}
+
+/* FIXME: should be able to work around no disk space */
+int reiserfsck_new_blocknrs (reiserfs_filsys_t * fs,
+			     unsigned long * free_blocknrs,
+			     unsigned long start, 
+			     int amount_needed)
+{
+    int i;
+
+    if (!are_there_allocable_blocks (amount_needed))
+	misc_die ("out of disk space");
+    for (i = 0; i < amount_needed; i ++) {
+	free_blocknrs[i] = alloc_block ();
+	if (!free_blocknrs[i])
+	    misc_die ("reiserfsck_new_blocknrs: 0 is allocated");
+	mark_block_used (free_blocknrs[i], 0);
+    }
+    return CARRY_ON;
+}
+
+
+// FIXME: do you check readability of a block? If f_read fails - you
+// free block in bitmap or if you mark bad blocks used to avoid their
+// allocation in future you should have bad block counter in a super
+// block. Another minor issue: users of _get_new_buffer expect buffer
+// to be filled with 0s
+reiserfs_bh_t * reiserfsck_get_new_buffer (unsigned long start) {
+    unsigned long blocknr = 0;
+    reiserfs_bh_t * bh = NULL;
+
+    assert(fs->block_allocator != NULL);
+    fs->block_allocator(fs, &blocknr, start, 1);
+    
+    bh = reiserfs_buffer_open (fs->fs_dev, blocknr, fs->fs_blocksize);
+    return bh;
+}
+
+
+/* free block in new bitmap */
+int reiserfsck_free_block (reiserfs_filsys_t * fs, unsigned long block) {
+    mark_block_free (block);
+
+    /* put it back to pool of blocks for allocation */
+    make_allocable (block);
+    return 0;
+}
+
+/* these are used to allocate blocks for tree building */
+int are_there_allocable_blocks (unsigned int amout_needed) {
+    if (reiserfs_bitmap_zeros (fsck_allocable_bitmap (fs)) < amout_needed) {
+	unsigned int zeros = 0, i;
+	
+	fsck_progress ("Not enough allocable blocks, checking bitmap...");
+	for (i = 0; i < fsck_allocable_bitmap (fs)->bm_bit_size; i ++) {
+	    if (!reiserfs_bitmap_test_bit (fsck_allocable_bitmap (fs), i))
+		zeros ++;
+	}
+	
+	fsck_progress ("there are %u allocable blocks, btw\n", zeros);
+	return 0;
+    }
+    
+    return 1;
+}
+
+void make_allocable (unsigned long block) {
+    reiserfs_bitmap_clear_bit (fsck_allocable_bitmap (fs), block);
+}
+
+unsigned long alloc_block (void) {
+    unsigned long block = 0; /* FIXME: start point could be used */
+
+    if (reiserfs_bitmap_find_zero_bit (fsck_allocable_bitmap (fs), &block)) {
+	misc_die ("alloc_block: Allocable blocks counter is wrong");
+	return 0;
+    }
+    reiserfs_bitmap_set_bit (fsck_allocable_bitmap (fs), block);
+    return block;
+}
diff --git a/utils/fsck/ufile.c b/utils/fsck/ufile.c
new file mode 100644
index 0000000..9743777
--- /dev/null
+++ b/utils/fsck/ufile.c
@@ -0,0 +1,464 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include "misc/unaligned.h"
+#include "misc/malloc.h"
+
+#include <sys/stat.h>
+
+static void cut_last_unfm_pointer (reiserfs_path_t * path, 
+				   reiserfs_ih_t * ih)
+{
+    reiserfs_ih_set_free(ih, 0);
+    if (reiserfs_ext_count (ih) == 1)
+	reiserfs_tree_delete (fs, path, 0);
+    else
+	reiserfs_tree_delete_unit (fs, path, -((int)REISERFS_EXT_SIZE));
+}
+
+/*
+    if this is not a symlink - make it of_this_size;
+    otherwise find a size and return it in symlink_size;
+*/
+static unsigned long extent2direct (reiserfs_path_t * path, 
+				    __u64 len, int symlink)
+{
+    reiserfs_bh_t * bh = REISERFS_PATH_LEAF (path);
+    reiserfs_ih_t * ih = REISERFS_PATH_IH (path);
+    __u32 unfm_ptr;
+    reiserfs_bh_t * unfm_bh = 0;
+    reiserfs_ih_t ins_ih;
+    char * buf;
+    char bad_drct[fs->fs_blocksize];
+
+    /* direct item to insert */
+    memset (&ins_ih, 0, sizeof (ins_ih));
+    if (symlink) {
+	reiserfs_ih_set_format (&ins_ih, KEY_FORMAT_1);
+    } else {
+	reiserfs_ih_set_format (&ins_ih, reiserfs_ih_get_format (ih));
+    }
+    reiserfs_key_set_did (&ins_ih.ih_key, reiserfs_key_get_did (&ih->ih_key));
+    reiserfs_key_set_oid (&ins_ih.ih_key, reiserfs_key_get_oid (&ih->ih_key));
+    reiserfs_key_set_sec (reiserfs_ih_get_format (&ins_ih), &ins_ih.ih_key,
+			  reiserfs_key_get_off (&ih->ih_key) + 
+			  (reiserfs_ext_count (ih) - 1) * bh->b_size, 
+			  TYPE_DIRECT);
+
+    // we do not know what length this item should be
+    unfm_ptr = d32_get ((__u32 *)REISERFS_PATH_ITEM (path), 
+			reiserfs_ext_count (ih) - 1);
+    
+    if (unfm_ptr && (unfm_bh = reiserfs_buffer_read(bh->b_dev, unfm_ptr, 
+						    bh->b_size)))
+    {
+	/* we can read the block */
+	buf = unfm_bh->b_data;
+    } else {
+        /* we cannot read the block */
+ 	if (unfm_ptr) {
+	    fsck_log ("%s: Reading of the block (%lu), pointed to by the "
+		      "file %K, failed\n", __FUNCTION__, unfm_ptr, &ih->ih_key);
+	}
+	
+	memset (bad_drct, 0, fs->fs_blocksize);
+	buf = bad_drct;
+    }
+    
+    reiserfs_ih_set_len (&ins_ih, (reiserfs_ih_get_format (ih) == KEY_FORMAT_2) 
+			 ? MISC_ROUND_UP(len) : len);
+    
+    reiserfs_ih_set_free (&ins_ih, MAX_US_INT);
+    reiserfs_ih_cltail(ih);
+    reiserfs_buffer_mkdirty(bh);
+    
+    // last last unformatted node pointer
+    path->pos_in_item = reiserfs_ext_count (ih) - 1;
+    cut_last_unfm_pointer (path, ih);
+
+    /* insert direct item */
+    if (reiserfs_tree_search_item (fs, &(ins_ih.ih_key), path) == ITEM_FOUND) {
+	reiserfs_panic ("%s: The direct item %k should not exist yet.", 
+			__FUNCTION__, &(ins_ih.ih_key));
+    }
+    
+    reiserfs_tree_insert (fs, path, &ins_ih, (const char *)(buf));
+
+    reiserfs_buffer_close (unfm_bh);
+
+    /* put to stat data offset of first byte in direct item */
+    return reiserfs_key_get_off (&ins_ih.ih_key); //offset;
+}
+
+/* returns 1 when file looks correct, -1 if directory items appeared
+   there, 0 - only holes in the file found */
+/* when it returns, key->k_offset is offset of the last item of file */
+/* sd_size is zero if we do not need to convert any extent to direct */
+int are_file_items_correct (reiserfs_ih_t * sd_ih, 
+			    void * sd, 
+			    __u64 * size, 
+			    __u32 * blocks,
+			    int mark_passed_items, 
+			    int * symlink)
+{
+    const reiserfs_key_t *next_key;
+    reiserfs_key_t *key;
+    reiserfs_path_t path;
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t * ih;
+
+    int next_is_another_object = 0;
+    __u64 last_unfm_offset = 0;
+    int retval, was_tail = 0;
+    int will_convert = 0;
+    int should_convert;
+    int had_direct = 0;
+    long long int gap;
+    __u32 sd_fdb = 0;
+    int key_version;
+    unsigned int i;
+    __u64 sd_size;
+
+    key_version = reiserfs_ih_get_format (sd_ih);
+    should_convert = (fsck_mode (fs) != FSCK_REBUILD) || mark_passed_items;
+    key = &sd_ih->ih_key;
+    reiserfs_stat_get_size (sd_ih, sd, &sd_size);
+
+    if (key_version == KEY_FORMAT_1)
+    	reiserfs_stat_get_fdb (sd_ih, sd, &sd_fdb);
+
+    reiserfs_key_set_off (key_version, key, 1);
+    reiserfs_key_set_type (key_version, key, TYPE_DIRECT);
+
+    /* correct size and st_blocks */
+    *size = 0;
+    *blocks = 0;
+
+    path.path_length = REISERFS_PATH_OFFILL;
+
+    do {
+	retval = reiserfs_tree_search_position (fs, key, &path);
+	if (retval == POSITION_FOUND && path.pos_in_item != 0)
+	    reiserfs_panic ("%s: We look for %k, found %k. Must be found "
+		    "first item byte (position 0).", __FUNCTION__,
+		    key, &(REISERFS_PATH_IH (&path)->ih_key));
+
+	switch (retval) {
+	case POSITION_FOUND:/**/
+
+	    ih = REISERFS_PATH_IH (&path);
+	    bh = REISERFS_PATH_LEAF (&path);
+
+	    if (reiserfs_ih_wastail (ih)) {
+	    	was_tail = 1;
+	    }
+	
+	    reiserfs_key_set_type (key_version, key, 
+				   reiserfs_key_get_type (&ih->ih_key));
+	
+	    if (mark_passed_items == 1) {
+		fsck_item_mkreach (ih, bh);
+	    }
+	    
+	    // does not change path
+	    next_key = reiserfs_tree_next_key(&path, fs);
+
+	    if (next_key == 0 || reiserfs_key_comp2 (key, next_key) || 
+		(!reiserfs_key_ext (next_key) && 
+		 !reiserfs_key_direct(next_key)))
+	    {
+		next_is_another_object = 1;
+		will_convert = (reiserfs_ih_ext (ih) && sd_size && 
+				(reiserfs_ext_count (ih) > 0));
+		
+		if (will_convert) {
+		    last_unfm_offset = reiserfs_key_get_off (key) + 
+			    fs->fs_blocksize * (reiserfs_ext_count (ih) - 1);
+		    
+		    /* if symlink or
+		       [ 1. sd_size points somewhere into last unfm block
+		         2. one item of the file was direct before for 3_6 ||
+			    FDB points to the tail correctly for 3_5
+		         3. we can have a tail in the file of a such size ] */
+		    will_convert = will_convert && 
+			    (sd_size >= last_unfm_offset) && 
+			    (sd_size < last_unfm_offset + fs->fs_blocksize) &&
+			    !reiserfs_policy_ext (sd_size, sd_size - 
+						  last_unfm_offset + 1, 
+						  fs->fs_blocksize);
+		    
+		    will_convert = will_convert &&
+			    (*symlink || 
+			     ((key_version == KEY_FORMAT_1) &&
+			      (sd_fdb == last_unfm_offset)) ||
+			     ((key_version == KEY_FORMAT_2) && was_tail));
+		}
+	    }
+
+	    if (should_convert) {
+		*symlink = *symlink && 
+			(will_convert || reiserfs_key_direct(&ih->ih_key));
+	    
+		if (!(*symlink) && key_version != reiserfs_ih_get_format (ih)) {
+		    if (fsck_mode(fs) == FSCK_CHECK) {
+			fsck_log("%s: vpf-10250: block %lu, item (%d): The "
+				 "item format (%H) is not equal to SD format "
+				 "(%d)\n", __FUNCTION__, bh->b_blocknr, 
+				 REISERFS_PATH_LEAF_POS(&path),ih, key_version);
+			
+			one_more_corruption (fs, FIXABLE);
+		    } else {
+			fsck_log("%s: vpf-10280: block %lu, item (%d): The "
+				 "item format (%H) is not equal to SD format "
+				 "(%d) - fixed.\n", __FUNCTION__, bh->b_blocknr,
+				 REISERFS_PATH_LEAF_POS(&path),ih, key_version);
+
+			reiserfs_key_set_sec (key_version, &ih->ih_key, 
+					      reiserfs_key_get_off (&ih->ih_key), 
+					      reiserfs_key_get_type (&ih->ih_key));
+			
+			reiserfs_ih_set_format(ih, key_version);
+			reiserfs_buffer_mkdirty(bh);
+		    }
+		}
+
+		if (*symlink && reiserfs_key_direct(&ih->ih_key)) {
+		    /* symlink. Check that it is of KEY_FORMAT_1 */
+		    if (fsck_mode(fs) == FSCK_CHECK) {
+			if ((reiserfs_ih_get_format(ih) != KEY_FORMAT_1) || 
+			    (reiserfs_key_format(&ih->ih_key) != KEY_FORMAT_1)) 
+			{
+			    fsck_log("%s: vpf-10732: block %lu, item (%d): "
+				     "The symlink format (%H) is not equal "
+				     "to 3.5 format (%d)\n", 
+				     __FUNCTION__, bh->b_blocknr, 
+				     REISERFS_PATH_LEAF_POS(&path),
+				     ih, KEY_FORMAT_1);
+			    
+			    one_more_corruption (fs, FIXABLE);
+			}
+		    } else {
+			if ((reiserfs_ih_get_format(ih) != KEY_FORMAT_1) || 
+			    (reiserfs_key_format(&ih->ih_key) != KEY_FORMAT_1)) 
+			{
+			    fsck_log("%s: vpf-10732: block %lu, item (%d): "
+				     "The symlink format (%H) is not equal "
+				     "to 3.5 format (%d)\n", 
+				     __FUNCTION__, bh->b_blocknr,
+				     REISERFS_PATH_LEAF_POS(&path),
+				     ih, KEY_FORMAT_1);
+			    
+			    reiserfs_key_set_sec(KEY_FORMAT_1, &ih->ih_key, 
+						 reiserfs_key_get_off(&ih->ih_key), 
+						 reiserfs_key_get_type(&ih->ih_key));
+			    
+			    reiserfs_ih_set_format(ih, KEY_FORMAT_1);
+			    reiserfs_buffer_mkdirty(bh);
+			}
+		    }
+		}
+		
+		if (will_convert)
+		    *size = sd_size;
+		else
+		    *size = reiserfs_key_get_off (&ih->ih_key) + 
+			    reiserfs_leaf_ibytes (ih, fs->fs_blocksize) - 1;
+	    
+		if (reiserfs_key_get_type (&ih->ih_key) == TYPE_EXTENT) {
+		    if (*symlink) /* symlinks must be calculated as dirs */
+			*blocks = REISERFS_DIR_BLOCKS (*size);
+		    else
+			for (i = 0; i < reiserfs_ext_count (ih); i ++) {
+			    __u32 * ind = (__u32 *)REISERFS_PATH_ITEM(&path);
+
+			    if (d32_get(ind, i) != 0)
+				*blocks += (fs->fs_blocksize >> 9);
+			}
+		} else if (reiserfs_key_get_type (&ih->ih_key) == TYPE_DIRECT) {
+		    if (*symlink) /* symlinks must be calculated as dirs */
+			*blocks = REISERFS_DIR_BLOCKS (*size);
+		    else if (!had_direct)
+			*blocks += (fs->fs_blocksize >> 9);
+
+		    /* calculate only the first direct byte */
+		    had_direct++;
+		}
+	    }
+
+	    if (next_is_another_object) {
+		/* next item does not exists or is of another object,
+                   therefore all items of file are correct */
+		if (will_convert) {
+		    if (fsck_mode (fs) == FSCK_CHECK) {
+			/* here it can be symlink only */
+			fsck_log ("%s: The extent item should be converted "
+				  "back to direct %K\n", __FUNCTION__, 
+				  &ih->ih_key);
+			one_more_corruption (fs, FIXABLE);
+			reiserfs_tree_pathrelse (&path);
+		    } else {
+			__u32 * ind = (__u32 *)REISERFS_PATH_ITEM(&path);
+			
+			if (d32_get(ind, reiserfs_ext_count (ih) - 1) == 0)
+			    *blocks += (fs->fs_blocksize >> 9);
+
+			/* path is released here. */
+			sd_fdb = extent2direct (&path, sd_size - 
+						last_unfm_offset + 1,
+						*symlink);
+			
+			/* last item of the file is direct item */
+			reiserfs_key_set_off (key_version, key, 
+					      sd_fdb);
+			
+			reiserfs_key_set_type (key_version, key, TYPE_DIRECT);
+		    }
+		} else {
+		    reiserfs_tree_pathrelse (&path);
+		}
+		
+		return 1;
+	    }
+
+	    /* next item is item of this file */
+	    if ((gap = must_there_be_a_hole(ih, next_key))) {
+		/* next item has incorrect offset (hole or overlapping) */
+		reiserfs_tree_pathrelse (&path);
+
+		if (reiserfs_ih_ext(ih) &&
+		    fsck_mode (fs) == FSCK_REBUILD && 
+		    gap < FSCK_MAX_GAP(fs->fs_blocksize)) 
+		{
+			if (gap < 0) {
+			    reiserfs_panic("%s: found items %k, %k are "
+					   "overlapped.\n", __FUNCTION__, 
+					   &ih->ih_key, next_key);
+			}
+
+			reiserfs_key_set_off(key_version, key, 
+				reiserfs_key_get_off(&ih->ih_key) +
+				reiserfs_leaf_ibytes(ih, fs->fs_blocksize));
+			
+			fsck_tree_rewrite(fs, key, 
+				reiserfs_key_get_off(next_key), 
+				1 << IH_Unreachable);
+			
+			break;
+		}
+		
+		return 0;
+	    }
+
+	    /* next item exists */
+	    reiserfs_key_set_sec(key_version, key, 
+				 reiserfs_key_get_off (next_key), 
+				 reiserfs_key_get_type(next_key));
+	
+	    if (reiserfs_key_comp (key, next_key))
+		reiserfs_panic ("%s: Internal tree is in inconsistent state, "
+				"the current item key %K and the next key %K "
+				"must match\n", __FUNCTION__, key, next_key);
+	    
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+
+	case POSITION_NOT_FOUND:
+	    /* We always must have next key found. Exception is first byte. 
+	       It does not have to exist */
+	    if (reiserfs_key_get_off (key) != 1)
+		reiserfs_panic ("%s: Position (offset == %llu) in the middle "
+				"of the file %K was not found.", __FUNCTION__, 
+				reiserfs_key_get_off(key), key);
+
+	    bh = REISERFS_PATH_LEAF (&path);
+	    
+	    if (reiserfs_node_items(bh) <= REISERFS_PATH_LEAF_POS(&path))
+		next_key = reiserfs_tree_next_key(&path, fs);
+	    else
+		next_key = &REISERFS_PATH_IH(&path)->ih_key;
+	    
+	    reiserfs_tree_pathrelse (&path);
+	    
+	    gap = reiserfs_key_get_off(next_key);
+	    
+	    if (fsck_mode(fs) == FSCK_REBUILD && 
+		gap < FSCK_MAX_GAP(fs->fs_blocksize) + 1) 
+	    {
+		fsck_tree_rewrite(fs, key, gap, 1 << IH_Unreachable);
+		break;
+	    }
+	    
+	    return 0;
+      
+	case FILE_NOT_FOUND:
+	    if (reiserfs_key_get_off (key) != 1)
+		reiserfs_panic ("%s: File %K must be found as we found its "
+				"StatData.", __FUNCTION__, key);
+	    reiserfs_tree_pathrelse (&path);
+	    return 1;
+
+	case DIRECTORY_FOUND:
+	    reiserfs_tree_pathrelse (&path);
+	    return -1;
+	}
+    } while (1);
+
+    misc_die ("%s: Cannot reach here", __FUNCTION__);
+    return 0;
+}
+
+static int cb_relocate(reiserfs_path_t *path, void *data) {
+    return 1;
+}
+
+/* delete all items and put them back (after that file should have
+   correct sequence of items.
+   if @relocate is specified then it relocates items to a new id.
+   if @adjust_ih is specified then the key in ih is changed also. */
+void fsck_file_relocate(reiserfs_key_t *key, int update_key) {
+    reiserfs_key_t start;
+    saveitem_t *si;
+    __u32 oid;
+    int count;
+    int moved;
+    
+    /* Find all items of the file, remove, relocate, insert them. */
+    oid = 0;
+    moved = 0;
+    si = NULL;
+    start = *key;
+    reiserfs_key_set_sec(KEY_FORMAT_1, &start, OFFSET_SD, TYPE_STAT_DATA);
+
+    while ((count = fsck_tree_delete(&start, &si, 1, cb_relocate, NULL))) {
+	if (oid == 0)
+	    oid = fsck_relocate_oid(key);
+
+	reiserfs_key_set_oid(&(si->si_ih.ih_key), oid);
+	fsck_tree_insert_item(&(si->si_ih), si->si_dnm_data, 0);
+	
+	si = fsck_item_free(si);
+	moved += count;
+    }
+
+    if (moved) {
+	fsck_log ("%s: %d items of file %K moved to %u oid\n",
+              __FUNCTION__, moved, key, oid);
+    }
+    
+    if (update_key) {
+	/* If nothing has been relocated but ih needs to be adjusted,
+	  allocate a new oid for relocation. */
+
+	if (oid == 0)
+	    oid = fsck_relocate_oid(key);
+
+	reiserfs_key_set_oid (key, oid);
+    }
+}
diff --git a/fsck/uobjectid.c b/utils/fsck/uobjectid.c
similarity index 61%
rename from fsck/uobjectid.c
rename to utils/fsck/uobjectid.c
index 118cc6b..6cbe96c 100644
--- a/fsck/uobjectid.c
+++ b/utils/fsck/uobjectid.c
@@ -3,7 +3,12 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include "fsck.h"
+#include "misc/malloc.h"
 
 
 /* when --check fsck builds a map of objectids of files it finds in the tree
@@ -32,8 +37,8 @@
     id_map_t *map;
     __u32 i;
  
-    map = getmem(sizeof(id_map_t));
-    map->index = mem_alloc(INDEX_COUNT * sizeof(void *));
+    map = misc_getmem(sizeof(id_map_t));
+    map->index = misc_malloc(INDEX_COUNT * sizeof(void *));
 
     for (i = 0; i < INDEX_COUNT; i++) {
 	if (map->index[i] != (void *)0)
@@ -54,11 +59,11 @@
  
     for (i = 0; i < INDEX_COUNT; i++) {
 	if (map->index[i] != (void *)0 && map->index[i] != (void *)1)
-	    freemem(map->index[i]);
+	    misc_freemem(map->index[i]);
     }
     
-    freemem(map->index);
-    freemem(map);
+    misc_freemem(map->index);
+    misc_freemem(map);
 }
 
 int id_map_test(id_map_t *map, __u32 id) {
@@ -77,7 +82,7 @@
     void **interval = id_map_interval(map, id);
 
     if (*interval == (void *)0)
-	*interval = getmem(ALLOC_SIZE);
+	*interval = misc_getmem(ALLOC_SIZE);
 
     if (*interval == (void *)1)
 	return 1;
@@ -92,7 +97,7 @@
 
     if ((*(__u16 *)id_map_local_count(*interval)) == BM_INTERVAL) {
 	/* Dealloc fully used bitmap */
-	freemem(*interval);
+	misc_freemem(*interval);
 	*interval = (void *)1;
     }
 
@@ -120,7 +125,7 @@
     if (map->index[i] != (void *)1 && map->index[i] != (void *)0) {
 	id = misc_find_first_zero_bit(map->index[i], BM_INTERVAL);
 	if (id >= BM_INTERVAL)
-	    die ("Id is out of interval size, interval looks corrupted.");
+	    misc_die ("Id is out of interval size, interval looks corrupted.");
 	
 	id += i * BM_INTERVAL;
     } else if (first != ~(__u32)0) {
@@ -128,7 +133,7 @@
 	if (id == 0) 
 	    id = 2;
     } else 
-	die ("%s: No more free objectid is available.", __FUNCTION__);
+	misc_die ("%s: No more free objectid is available.", __FUNCTION__);
 
     id_map_mark(map, id);
 
@@ -145,23 +150,25 @@
 
 static __u32 id_map_next_bound(id_map_t *map, __u32 start) {
     __u32 index = start / BM_INTERVAL;
-    __u32 offset = start % BM_INTERVAL;
+    __u32 offset = 0;
     int look_for;
     
     if (map->index[index] == (void *)0)
 	look_for = 1;
     else if (map->index[index] == (void *)1)
 	look_for = 0;
-    else 
+    else {
+	offset = start % BM_INTERVAL;
 	look_for = !misc_test_bit(offset, map->index[index]);
-
-    offset++;
+	offset++;
+    }
 
 start_again:
     
     if (look_for) {	
-	while (index < INDEX_COUNT && map->index[index] == (void *)0)
+	while (index < INDEX_COUNT && map->index[index] == (void *)0) {
 	    index++;
+	}
 	
 	if (index == INDEX_COUNT)
 	    return 0;
@@ -169,15 +176,14 @@
 	if (map->index[index] == (void *)1)
 	    return index * BM_INTERVAL;
 	
-	offset = misc_find_next_set_bit(map->index[index], BM_INTERVAL, offset);
+	offset = misc_find_next_set_bit(map->index[index], 
+					BM_INTERVAL, offset);
 
 	if (offset >= BM_INTERVAL) {
 	    offset = 0;
 	    index++;
 	    goto start_again;
 	}
-	
-	return index * BM_INTERVAL + offset;
     } else {
 	while (index < INDEX_COUNT && map->index[index] == (void *)1)
 	    index++;
@@ -188,16 +194,17 @@
 	if (map->index[index] == (void *)0)
 	    return index * BM_INTERVAL;
 
-	offset = misc_find_next_zero_bit(map->index[index], BM_INTERVAL, offset);
+	offset = misc_find_next_zero_bit(map->index[index], 
+					 BM_INTERVAL, offset);
 	
 	if (offset >= BM_INTERVAL) {
 	    offset = 0;
 	    index++;
 	    goto start_again;
 	}
-	
-	return index * BM_INTERVAL + offset;
     }
+
+    return index * BM_INTERVAL + offset;
 }
 
 void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs) {
@@ -205,33 +212,40 @@
     __u32 id, prev_id;
     __u32 * sb_objectid_map;
 
-    size = reiserfs_super_block_size (fs->fs_ondisk_sb);
+    size = reiserfs_super_size (fs->fs_ondisk_sb);
     sb_objectid_map = (__u32 *)((char *)(fs->fs_ondisk_sb) + size);
 
     max = ((fs->fs_blocksize - size) >> 3 << 1);
-    set_sb_oid_maxsize (fs->fs_ondisk_sb, max);
+    reiserfs_sb_set_mapmax (fs->fs_ondisk_sb, max);
     
     id = 1;
-    sb_objectid_map[0] = cpu_to_le32(1);
+    sb_objectid_map[0] = cpu_to_le32(0);
 
     for (i = 1; i < max - 1; i++) {
 	id = id_map_next_bound(map, id);
 	sb_objectid_map[i] = cpu_to_le32(id);
 	if (id == 0) {
-	    if (i % 2)
-		die ("%s: Used interval is not closed on flushing.", __FUNCTION__);
+	    if (i % 2) {
+		misc_die ("%s: Used interval is not closed "
+			  "on flushing.", __FUNCTION__);
+	    }
+	    
 	    break;
 	}
     }
 
-    if (map->index[map->last_used] == (void *)0)
-	die ("Object id map looks corrupted - last used interval cannot be zeroed.");
+    if (map->index[map->last_used] == (void *)0) {
+	misc_die ("Object id map looks corrupted - last "
+		  "used interval cannot be zeroed.");
+    }
     
     i++;
     
     if (i == max) {
-	if (id == 0)
-	    die ("Objectid interval does not contain any set bit what is expected.");
+	if (id == 0) {
+	    misc_die ("Objectid interval does not contain "
+		      "any set bit what is expected.");
+	}
 	
 	if (map->index[map->last_used] == (void *)1) {
 	    prev_id = BM_INTERVAL - 1;
@@ -252,103 +266,130 @@
 		prev_id = id;
 	    }
 
-	    if (prev_id == ~(__u32)0)
-		die ("Objectid interval does not contain any set bit what is expected.");
+	    if (prev_id == ~(__u32)0) {
+		misc_die ("Objectid interval does not contain "
+			  "any set bit what is expected.");
+	    }
 
 	    prev_id++;
 	}
 	
-	sb_objectid_map[max - 1] = cpu_to_le32(prev_id + map->last_used * BM_INTERVAL);
-    } else { 
+	sb_objectid_map[max - 1] = 
+		cpu_to_le32(prev_id + map->last_used * BM_INTERVAL);
+    } else {
 	i--;
 	memset(sb_objectid_map + i, 0, (max - i) * sizeof (__u32));
     }
 
-    set_sb_oid_cursize (fs->fs_ondisk_sb, i);
+    reiserfs_sb_set_mapcur (fs->fs_ondisk_sb, i);
 }
 
-/* FIXME: these 3 methods must be implemented also.
 
-void fetch_objectid_map (struct id_map * map, reiserfs_filsys_t * fs)
+void fetch_objectid_map (struct id_map * map, 
+			 reiserfs_filsys_t * fs) 
 {
-    int sb_size;
+    __u32 i, j, sb_size;
     __u32 * sb_objectid_map;
 
-    sb_size = reiserfs_super_block_size (fs->fs_ondisk_sb);
+    sb_size = reiserfs_super_size (fs->fs_ondisk_sb);
     sb_objectid_map = (__u32 *)((char *)(fs->fs_ondisk_sb) + sb_size);
 
-    if (map->m_page_count != 1)
-	die ("fetch_objectid_map: can not fetch long map");
+    if (map == NULL)
+	misc_die ("Not map given");
     
-    make_id_space(map, 0);
-    memcpy (map->m_begin, sb_objectid_map, get_sb_oid_cursize (fs->fs_ondisk_sb) * sizeof (__u32));
-    map->m_used_slot_count = get_sb_oid_cursize (fs->fs_ondisk_sb);
+    for (i = 0; i < reiserfs_sb_get_mapcur(fs->fs_ondisk_sb); i+=2) {
+	    for (j = sb_objectid_map[i]; j <  sb_objectid_map[i + 1]; j++) {
+		    id_map_mark(map, j);
+		    if (j == 0)
+			    map->count--;
+	    }
+    }
 }
 
 #define OBJMAP_START_MAGIC 375331
 #define OBJMAP_END_MAGIC 7700472
 
-void reiserfs_objectid_map_save (FILE * fp, struct id_map * id_map)
-{
-    __u32 v;
-    int i;
+void reiserfs_objectid_map_save (FILE * fp, struct id_map * id_map) {
+    __u32 v, count;
 
     v = OBJMAP_START_MAGIC;
     fwrite (&v, 4, 1, fp);
 
-    v = id_map->m_used_slot_count;
+    v = 0;
+    count = 0;
+    /* Write 0. */
     fwrite (&v, 4, 1, fp);
-
-    for (i = 0; i < id_map->m_page_count - 1; i++) {
-	fwrite ((char *)id_map->m_begin + MAP_SIZE * i, 4, 1, fp);
+    count++;
+    while ((v = id_map_next_bound(id_map, v))) {
+	    fwrite (&v, 4, 1, fp);
+	    count++;
     }
-
-    for (i = 0; i < id_map->m_used_slot_count * sizeof(__u32) - (id_map->m_page_count - 1) * MAP_SIZE; i++) {
-	fwrite ((char *)id_map->m_begin + MAP_SIZE * (id_map->m_page_count - 1) + i, 4, 1, fp);
-    }
-
+    
+    fwrite (&count, 4, 1, fp);
+    
     v = OBJMAP_END_MAGIC;
     fwrite (&v, 4, 1, fp);
 }
 
-struct id_map * reiserfs_objectid_map_load (FILE * fp)
-{
-    __u32 v;
-    int i;
+struct id_map * reiserfs_objectid_map_load (FILE * fp) {
+    __u32 v, count, i, prev, next;
     struct id_map * id_map;
+    int skip, odd;
 
+    id_map = id_map_init();
+    
     fread (&v, 4, 1, fp);
     if (v != OBJMAP_START_MAGIC) {
-	reiserfs_warning (stderr, "reiserfs_objectid_map_load: no objectid map begin magic found");
-	return 0;
-    }
-	
-    // read bit size of objectid map 
-    fread (&v, 4, 1, fp);
-
-    id_map = init_id_map (MAP_NOT_PACKED);
-
-    id_map->m_used_slot_count = v;
-    id_map->m_page_count = v / MAP_SIZE + 1;
-
-    id_map->m_begin = expandmem (id_map->m_begin, 0, id_map->m_page_count * MAP_SIZE);
-
-    for (i = 0; i < id_map->m_page_count - 1; i++) {
-	fread ((char *)id_map->m_begin + MAP_SIZE * i, 4, 1, fp);
+	reiserfs_warning (stderr, "reiserfs_objectid_map_load: no "
+			  "objectid map begin magic found");
+	goto error;
     }
 
-    for (i = 0; i < id_map->m_used_slot_count * sizeof(__u32) - (id_map->m_page_count - 1) * MAP_SIZE; i++) {
-	fread ((char *)id_map->m_begin + MAP_SIZE * (id_map->m_page_count - 1) + i, 4, 1, fp);
+    count = 0;
+    skip = 0;
+    odd = 0;
+    prev = 0;
+    while (1) {
+	    if (skip) {
+		    skip = 0;
+		    v = next;
+	    } else if (fread(&v, 4, 1, fp) != 1) {
+		    reiserfs_warning (stderr, "%s: failed to read the given", 
+				      __FUNCTION__);
+		    goto error;
+	    }
+	    
+	    if (v == count) {
+		    /* Check if the magic goes after. */
+		    if (fread(&next, 4, 1, fp) != 1) {
+			    reiserfs_warning (stderr, "%s: failed to read the given", 
+				      __FUNCTION__);
+			    goto error;
+		    }
+
+		    if (next != OBJMAP_END_MAGIC)
+			    skip = 1;
+		    else break;
+	    }
+
+	    if (odd) {
+		    for (i = prev; i < v; i++) {
+			    id_map_mark(id_map, i);
+			    if (i == 0)
+				    id_map->count--;
+		    }
+	    } 
+	    
+	    prev = v;
+	    
+	    odd = odd ? 0 : 1;
+	    count++;
     }
-
-    fread (&v, 4, 1, fp);
-
-    if (v != OBJMAP_END_MAGIC) {
-	reiserfs_warning (stderr, "reiserfs_objectid_map_load: no objectid map end magic found");
-	return 0;
-    }
-
-    fflush (stderr);
+    
     return id_map;
+    
+ error:
+    fflush (stderr);
+    id_map_free(id_map);
+    return NULL;
 }
-*/
diff --git a/utils/fsck/utree.c b/utils/fsck/utree.c
new file mode 100644
index 0000000..2621c83
--- /dev/null
+++ b/utils/fsck/utree.c
@@ -0,0 +1,1166 @@
+/*
+ * Copyright 1996-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "fsck.h"
+#include <sys/stat.h>
+#include "misc/unaligned.h"
+#include "misc/malloc.h"
+#include "util/misc.h"
+
+/* this works for both new and old stat data */
+#define st_mode(sd) le16_to_cpu(((reiserfs_sd_t *)(sd))->sd_mode)
+
+#define st_mtime_v1(sd) le32_to_cpu(((reiserfs_sd_v1_t *)(sd))->sd_mtime)
+#define st_mtime_v2(sd) le32_to_cpu(((reiserfs_sd_t *)(sd))->sd_mtime)
+
+
+static int fsck_tree_insert_file (reiserfs_ih_t * ih, 
+				  char * item, int check);
+
+/* either both sd-s are new of both are old */
+static void fsck_tree_overwrite_stat (reiserfs_ih_t * new_ih,
+				      void * new_item, 
+				      reiserfs_path_t * path)
+{
+    __u16 new_mode, old_mode;
+
+    reiserfs_stat_get_mode (new_ih, new_item, &new_mode);
+    reiserfs_stat_get_mode (REISERFS_PATH_IH (path), 
+			    REISERFS_PATH_ITEM (path), &old_mode);
+
+
+    if ((S_ISREG (new_mode) && S_ISDIR (old_mode)) ||
+	(S_ISDIR (new_mode) && S_ISREG (old_mode)))
+    {
+	reiserfs_panic("Cannot overwrite SD [%H] with SD [%H].\n", 
+		       REISERFS_PATH_IH (path), new_ih);
+    }
+    
+    if (S_ISREG (new_mode) && !S_ISREG (old_mode)) {
+	/* in tree we have not regular file - overwrite its stat data
+           with stat data of regular file */
+	memcpy (REISERFS_PATH_ITEM (path), new_item, 
+		reiserfs_ih_get_len (REISERFS_PATH_IH (path)));
+	reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (path));
+	return;
+    }
+
+    if (S_ISREG (old_mode) && !S_ISREG (new_mode)) {
+	/* new stat data is not a stat data of regular file, keep
+           regular file stat data in tree */
+	return;
+    }
+    
+    /* if coming stat data has newer mtime - use that */
+    if (reiserfs_ih_format_v1 (new_ih)) {	
+	if (st_mtime_v1 (new_item) > st_mtime_v1 (REISERFS_PATH_ITEM (path))) {
+	    memcpy (REISERFS_PATH_ITEM (path), new_item, REISERFS_SD_SIZE_V1);
+	    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (path));
+	}
+    } else {
+	if (st_mtime_v2 (new_item) > st_mtime_v2 (REISERFS_PATH_ITEM (path))) {
+	    memcpy (REISERFS_PATH_ITEM (path), new_item, REISERFS_SD_SIZE);
+	    reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF (path));
+	}
+    }
+    return;
+}
+
+/* insert sd item if it does not exist, overwrite it otherwise */
+static void fsck_tree_insert_stat (reiserfs_ih_t * new_ih, 
+				   char * new_item, int check)
+{
+    reiserfs_path_t path;
+    __u32 oid;
+
+    if (check) {
+	oid = fsck_relocate_check (new_ih, !not_a_directory(new_item));
+    
+	if (oid == 1) {
+	    fsck_file_relocate (&new_ih->ih_key, 
+				not_a_directory(new_item) ? 1 : 0);
+	} else if (oid) {
+	    reiserfs_key_set_oid (&new_ih->ih_key, oid);
+	}
+    }
+    
+    /* if we will have to insert item into tree - it is ready */
+    zero_nlink (new_ih, new_item);
+    fsck_item_mkunreach (new_ih);
+    
+    /* we are sure now that if we are inserting stat data of a
+       directory - there are no items with the same key which are not
+       items of a directory, and that if we are inserting stat data is
+       of not a directory - it either has new key already or there are
+       no items with this key which are items of a directory */
+    if (reiserfs_tree_search_item (fs, &(new_ih->ih_key), &path) == ITEM_FOUND) {
+	/* this stat data is found */
+        if (reiserfs_ih_get_format (REISERFS_PATH_IH(&path)) != 
+	    reiserfs_ih_get_format (new_ih)) 
+	{
+	    /* in tree stat data and a new one are of different
+               formats */
+	    fsck_log ("%s: Inserting the StatData %K, mode (%M)...", 
+		      __FUNCTION__, &(new_ih->ih_key), st_mode (new_item));
+	    
+	    if (reiserfs_ih_format_v1 (new_ih)) {
+		/* sd to be inserted is of V1, where as sd in 
+		   the tree is of V2 */
+		fsck_log ("found newer in the tree, mode (%M), insersion was "
+			  "skipped.\n", st_mode (REISERFS_PATH_ITEM (&path)));
+	    	reiserfs_tree_pathrelse (&path);
+	    } else {
+		/* the stat data in the tree is sd_v1 */
+		fsck_log ("older sd, mode (%M), is replaced with it.\n",
+			  st_mode (REISERFS_PATH_ITEM (&path)));
+		
+		reiserfs_tree_delete (fs, &path, 0/*not temporary*/);
+		reiserfs_tree_search_item (fs, &new_ih->ih_key, &path);
+		reiserfs_tree_insert (fs, &path, new_ih, new_item);
+	    }
+	} else {
+	    /* both stat data are of the same version */
+	    fsck_tree_overwrite_stat (new_ih, new_item, &path);
+	    reiserfs_tree_pathrelse (&path);
+	}
+	
+	return;
+    }
+    
+    /* item not found, insert a new one */
+    reiserfs_tree_insert (fs, &path, new_ih, new_item);
+}
+
+static int fsck_tree_insert_prep (reiserfs_filsys_t *fs, 
+				  reiserfs_ih_t *ih, 
+				  int directory) 
+{
+    reiserfs_path_t path;
+    reiserfs_key_t key;
+    __u32 oid = 0;
+    int step = 0;
+
+    /* Check if the ois has been already relocated. */
+    if (!directory && (oid = fsck_relocate_get_oid(&ih->ih_key)))
+	reiserfs_key_set_oid(&ih->ih_key, oid);
+    
+    memset(&key, 0, sizeof(key));
+    
+    while (1) {
+	reiserfs_key_copy2(&key, &ih->ih_key);
+	
+	/* Check if the StatData item presents. */
+	if ((reiserfs_tree_search_item (fs, &key, &path) != ITEM_FOUND) ||
+	    (directory && not_a_directory(REISERFS_PATH_ITEM(&path))) || 
+	    (!directory && !not_a_directory(REISERFS_PATH_ITEM(&path))))
+	{
+	    fsck_log ("vpf-10260: The file we are inserting the new item "
+		      "(%H) into has no StatData, insertion is skipped\n", ih);
+
+	    reiserfs_tree_pathrelse (&path);
+	    return 1;
+	}
+	
+	reiserfs_tree_pathrelse(&path);
+	
+	if (!step && !oid) {
+	    oid = fsck_relocate_check(ih, directory);
+	    
+	    if (oid == 1) {
+		fsck_file_relocate (&ih->ih_key, directory ? 0 : 1);
+	    } else if (oid) {
+		reiserfs_key_set_oid(&ih->ih_key, oid);
+	    } else {
+		return 0;
+	    }
+	    
+	    step = 1;
+	    continue;
+	}
+	
+	
+	/* Check/Fix the format. */
+#if 0
+	format = reiserfs_ih_get_format (REISERFS_PATH_IH(&path));
+	reiserfs_stat_get_mode (REISERFS_PATH_IH(&path), 
+				REISERFS_PATH_ITEM(&path), &mode);
+
+	if (format != reiserfs_ih_get_format (ih)) {
+	    /* Not for symlinks and not for items which should be relocted. */
+	    if (((S_ISDIR(mode) && reiserfs_ih_dir(ih)) || 
+		 (!S_ISDIR(mode) && !reiserfs_ih_dir(ih))) && 
+		!S_ISLNK(mode))
+	    {
+		reiserfs_key_set_sec (format, &ih->ih_key, 
+				      reiserfs_key_get_off (&ih->ih_key), 
+				      reiserfs_key_get_type (&ih->ih_key));
+
+		reiserfs_ih_set_format(ih, file_format);		
+	    }
+	}
+#endif
+	
+	return 0;
+    }
+}
+
+/* this tries to put each item entry to the tree, if there is no items
+   of the directory, insert item containing 1 entry */
+static void fsck_tree_insert_entry (reiserfs_ih_t * comingih, 
+				    char * item, int check)
+{
+    char buf[REISERFS_NAME_MAX];
+    reiserfs_deh_t *deh;
+    char *name;
+    int namelen;
+    int i, step;
+
+    step = 0;
+    
+    /* Check if the SD item exists */
+    if (check) {
+	if (fsck_relocate_check (comingih, 1))
+	    fsck_file_relocate (&comingih->ih_key, 0);
+    }
+    
+    deh = (reiserfs_deh_t *)item;
+    
+    for (i = 0; i < reiserfs_ih_get_entries (comingih); i ++, deh ++) {
+	name = reiserfs_deh_name (deh, i);
+	namelen = reiserfs_direntry_name_len (comingih, deh, i);
+
+	if (!reiserfs_hash_correct (&fs->hash, name, namelen, 
+				    reiserfs_deh_get_off (deh)))
+	{
+	    reiserfs_panic ("%s: The entry (%d) \"%.*s\" of the directory "
+			    "%k has badly hashed entry", __FUNCTION__, i, 
+			    namelen, name, &comingih->ih_key);
+	}
+
+	buf[0] = '\0';
+	sprintf (buf, "%.*s", namelen, name);
+	/* 1 for fsck is important: if there is no any items of this
+           directory in the tree yet - new item will be inserted
+           marked not reached */
+	reiserfs_tree_insert_entry (fs, &(comingih->ih_key), buf, 
+				    reiserfs_direntry_entry_len (comingih, deh, i),
+				    (reiserfs_key_t *)&(deh->deh2_dir_id), 
+				    1 << IH_Unreachable);
+    }
+}
+
+/*  start_key is the key after which N items need to be deleted
+    save_here is a pointer where deleted items need to be saved if save is set.
+    start_key is the first undeleted item.
+    return whether we are sure there is nothing else of this file
+ */
+int fsck_tree_delete(reiserfs_key_t * start_key, 
+		     saveitem_t ** save_here, 
+		     int skip_dir_items, 
+		     tree_modify_t func,
+		     void *data)
+{
+    const reiserfs_key_t *rkey;
+    reiserfs_path_t path;
+    int count = 0;
+    int ret;
+
+    while (1) {
+	reiserfs_tree_search_body (fs, start_key, &path);
+	
+	if (REISERFS_PATH_LEAF_POS (&path) == 
+	    reiserfs_node_items (REISERFS_PATH_LEAF (&path))) 
+	{
+	    rkey = reiserfs_tree_rkey (&path, fs);
+	    if (rkey && !reiserfs_key_comp2 (start_key, rkey)) {
+		/* file continues in the right neighbor */
+		reiserfs_key_copy (start_key, rkey);
+		reiserfs_tree_pathrelse (&path);
+		continue;
+	    }
+	    /* there is no more items with this key */
+	    reiserfs_tree_pathrelse (&path);
+	    return count;
+	}
+
+	rkey = &(REISERFS_PATH_IH (&path))->ih_key;
+	if (reiserfs_key_comp2 (start_key, rkey)) {
+	    /* there are no more item with this key */
+	    reiserfs_tree_pathrelse (&path);
+	    return count;
+	}
+
+	reiserfs_key_copy (start_key, rkey);
+
+	/* Let it to be here to return either the last deleted key in 
+	   @start_key or the first not deleted. */
+/*	if (n_to_delete && count == n_to_delete) {
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+	}
+*/	
+	/* ok, item found, but make sure that it is not a directory one */
+	if ((reiserfs_key_stat (rkey) && 
+	     !not_a_directory (REISERFS_PATH_ITEM (&path))) ||
+	    (reiserfs_key_dir (rkey)))
+	{
+	    if (skip_dir_items) {
+	    	/* item of directory found. Leave it in the tree */
+		reiserfs_key_set_off(KEY_FORMAT_1, start_key, 
+				     reiserfs_key_get_off(start_key) + 1);
+	    	reiserfs_tree_pathrelse (&path);
+	    	continue;
+	    } else {
+	    	reiserfs_panic ("%s: No directory item of %K are expected", 
+				__FUNCTION__, rkey);
+	    }
+	}
+	
+	/* If removing not by the counter, break when it is save to do --
+	   an indirect item is encountered. */
+	if ((ret = func(&path, data)) < 0) {
+	    // if (n_to_delete == 0 && count && reiserfs_key_ext(rkey)) {
+	    reiserfs_tree_pathrelse (&path);
+	    break;
+	}
+	
+	if (save_here != NULL)
+	    fsck_item_save(&path, save_here);
+	
+	reiserfs_tree_delete (fs, &path, save_here ? 1 : 0);
+	
+	count++;
+
+	if (ret > 0)
+	    break;
+    }
+
+    return count;
+}
+
+/* this is for check only. With this we make sure that all pointers we
+   put into tree on pass 1 do not point to leaves (FIXME), do not
+   point to journal, bitmap, etc, do not point out of fs boundary (and
+   are marked used in on-disk bitmap - this condition skipped for now). */
+
+/* pointers to data block which get into tree are checked with this */
+static int still_bad_unfm_ptr (unsigned long block) {
+    if (!block)
+	return 0;
+    if (is_block_used (block))
+	return 1;
+    if (block >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb))
+	return 1;
+    return 0;
+}
+
+static int fsck_tree_create_item (reiserfs_filsys_t *fs, 
+				  reiserfs_path_t * path, 
+				  reiserfs_ih_t * ih, 
+				  char * item,
+				  int pos, 
+				  int alloc)
+{
+    reiserfs_ih_t newih;
+    __u32 body_off;
+    __u64 key_off;
+    int count, i;
+    int format;
+
+    body_off = pos * (reiserfs_ih_direct(ih) ? 1 : REISERFS_EXT_SIZE);
+    key_off  = pos * (reiserfs_ih_direct(ih) ? 1 : fs->fs_blocksize);
+    format = reiserfs_key_format(&ih->ih_key);
+    
+    memcpy(&newih, ih, sizeof(newih));
+    fsck_item_mkunreach (&newih);
+    reiserfs_ih_set_len (&newih, reiserfs_ih_get_len (ih) - body_off);
+    reiserfs_ih_set_format (&newih, reiserfs_ih_get_format (ih));
+    reiserfs_ih_set_loc(&newih, 0);
+    
+    reiserfs_key_set_off (format, &newih.ih_key, 
+			  reiserfs_key_get_off(&newih.ih_key) + key_off);
+    
+    if (alloc && reiserfs_ih_ext(ih)) {
+	count = reiserfs_ext_count (ih);
+	for (i = pos; i < count; i++) {
+	    if (still_bad_unfm_ptr (d32_get(item, i)))
+		reiserfs_panic ("%s: The file %K has a pointer to "
+				"the bad block (%u)", __FUNCTION__,
+				&ih->ih_key, d32_get(item, i));
+		
+	    mark_block_used (d32_get(item, i), 0);
+	}
+    }
+
+    reiserfs_tree_insert (fs, path, &newih, item + body_off);
+    return reiserfs_leaf_ibytes (ih, fs->fs_blocksize) - key_off;
+}
+
+int fsck_tree_insert_zero_ptr (reiserfs_filsys_t *fs,
+			       reiserfs_key_t *key,
+			       long long int p_count,
+			       __u16 flags)
+{
+    reiserfs_path_t path;
+    long long int count;
+    reiserfs_ih_t *ih;
+    int format;
+    __u32 * ni;
+    int ret;
+
+    ret = reiserfs_tree_search_position (fs, key, &path);
+    
+    if (ret == DIRECTORY_FOUND || ret == POSITION_FOUND) {
+	    reiserfs_panic("%s: The object [%k] must be a file and the "
+			   "position must be absent.\n", __FUNCTION__, 
+			   key);
+    }
+
+    count = REISERFS_ITEM_MAX(fs->fs_blocksize) / REISERFS_EXT_SIZE;
+
+    p_count = (p_count + fs->fs_blocksize - 1) / 
+	    fs->fs_blocksize * fs->fs_blocksize;
+    
+    if (p_count / fs->fs_blocksize <= count)
+	count = p_count / fs->fs_blocksize;
+
+    ni = misc_getmem (count * REISERFS_EXT_SIZE);
+
+    if (path.pos_in_item) {
+	/* Position is not found, append to the existent item. */
+	ih = REISERFS_PATH_IH (&path);
+	
+	if (reiserfs_item_count(ih) != path.pos_in_item) {
+	    reiserfs_panic("%s: not expected position (%u) in the "
+			   "middle of the item %k.\n", __FUNCTION__,
+			   path.pos_in_item, &ih->ih_key);
+	}
+
+	if ((flags & (1 << IH_Unreachable)) || 
+	    reiserfs_ih_direct(ih) || must_there_be_a_hole(ih, key))
+	{
+	    REISERFS_PATH_LEAF_POS (&path) ++;
+	    path.pos_in_item = 0;
+	} else {
+	    reiserfs_tree_insert_unit(fs, &path, ni, count * REISERFS_EXT_SIZE);
+	    
+	    if (path.pos_in_item == 0)
+		misc_die("Not expected position");
+	} 
+    } 
+    
+    if (path.pos_in_item == 0) {
+	/* Either file not found or position not found, create a new item. */
+	reiserfs_ih_t indih;
+	
+	memset(&indih, 0, sizeof(indih));
+	
+	reiserfs_ih_set_flags(&indih, flags);
+
+	reiserfs_key_copy (&(indih.ih_key), key);
+	reiserfs_ih_set_len (&indih, count * REISERFS_EXT_SIZE);
+
+	reiserfs_ih_set_free (&indih, 0);
+	format = reiserfs_key_format(key);
+	reiserfs_ih_set_format (&indih, format);
+	reiserfs_key_set_type (format, &indih.ih_key, TYPE_EXTENT);
+	reiserfs_tree_insert (fs, &path, &indih, ni);
+    }
+
+    misc_freemem(ni);
+    return count * fs->fs_blocksize;
+}
+
+long long int must_there_be_a_hole (const reiserfs_ih_t *ih, 
+				    const reiserfs_key_t *key)
+{
+    return (reiserfs_key_get_off (key) - 
+	    reiserfs_key_get_off(&ih->ih_key) - 
+	    reiserfs_leaf_ibytes(ih, fs->fs_blocksize));
+}
+
+void fsck_tree_merge(reiserfs_path_t *path) {
+    int start, len, next_start, next_len;
+    reiserfs_ih_t *next;
+    reiserfs_ih_t *ih;
+    reiserfs_bh_t *bh;
+    char *buf;
+    int pos;
+    
+    bh = REISERFS_PATH_LEAF(path);
+    pos = REISERFS_PATH_LEAF_POS(path);
+    
+    if (pos >= reiserfs_node_items(bh) || pos < 1)
+	misc_die("%s: block (%lu), item (%d), nothing to merge with.", 
+		 __FUNCTION__, bh->b_blocknr, pos);
+
+    ih = reiserfs_ih_at(bh, pos) - 1;
+    next = ih + 1;
+    
+    start = reiserfs_ih_get_loc(ih);
+    len = reiserfs_ih_get_len(ih);
+    
+    next_start = reiserfs_ih_get_loc(next);
+    next_len = reiserfs_ih_get_len(next);
+    
+    if (!(buf = misc_malloc(next_len)))
+	misc_die("%s: Failed to allocate %d bytes.", __FUNCTION__, next_len);
+
+    if (!reiserfs_ih_dir(ih)) {
+	memmove(buf, bh->b_data + next_start, next_len);
+	memmove(bh->b_data + next_start, bh->b_data + start, len);
+	memmove(bh->b_data + next_start + len, buf, next_len);
+	
+	reiserfs_ih_set_free(ih, reiserfs_ih_get_free(next));
+    } else {
+	reiserfs_deh_t *deh;
+	int move;
+	int i;
+	
+	move = reiserfs_ih_get_entries(ih) * REISERFS_DEH_SIZE;
+	memmove(buf, bh->b_data + next_start, next_len);
+	memmove(bh->b_data + next_start, bh->b_data + start, move);
+	memmove(bh->b_data + next_start + move, buf, next_len);
+	
+	move /= REISERFS_DEH_SIZE;
+	reiserfs_ih_set_entries(ih, reiserfs_ih_get_entries(next) + move);
+	deh = (reiserfs_deh_t *)(bh->b_data + next_start);
+	
+	for (i = 0; i < move; i++, deh++)
+	    reiserfs_deh_set_loc(deh, reiserfs_deh_get_loc(deh) + next_len);
+	
+	move *= REISERFS_DEH_SIZE;
+	for (i = 0; i < reiserfs_ih_get_entries(next); i++, deh++)
+	    reiserfs_deh_set_loc(deh, reiserfs_deh_get_loc(deh) + move);
+    }
+    
+    misc_freemem(buf);
+    
+    reiserfs_ih_set_loc(ih, next_start);
+    reiserfs_ih_set_len(ih, len + next_len);
+    reiserfs_ih_set_len(next, 0);
+    
+    reiserfs_tree_delete (fs, path, 0);
+}
+
+static int cb_tree_rewrite(reiserfs_path_t *path, void *data) {
+    reiserfs_ih_t *ih;
+    __u64 *off;
+
+    ih = REISERFS_PATH_IH(path);
+    off = (__u64 *)data;
+    
+    if (reiserfs_key_get_off(&ih->ih_key) >= *off)
+	return -1;
+
+    return 0;
+}
+
+void fsck_tree_rewrite(reiserfs_filsys_t *fs, 
+		       const reiserfs_key_t *start_key,
+		       __u64 end_offset, __u16 flags)
+{
+    reiserfs_key_t key;
+    saveitem_t *si;
+    __u64 start;
+    int format;
+    
+    si = NULL;
+    
+    start = reiserfs_key_get_off(start_key);
+    start = MISC_DOWN(start, fs->fs_blocksize) + 1;
+    
+    end_offset = MISC_UP(end_offset - 1, fs->fs_blocksize) + 1;
+    format = reiserfs_key_format(start_key);
+
+    reiserfs_key_copy(&key, start_key);
+    reiserfs_key_set_off (format, &key, start);
+    
+    fsck_tree_delete(&key, &si, 0, cb_tree_rewrite, &end_offset);
+    
+    /* Insert needed zero pointers. */
+    while (start < end_offset) {
+	reiserfs_key_set_off (format, &key, start);
+	
+	start += fsck_tree_insert_zero_ptr(fs, &key, 
+			end_offset - start, flags);
+    }
+    
+    /* Insert removed items back, over have inserted zero pointers. */
+    while (si) {
+	fsck_tree_insert_file(&si->si_ih, si->si_dnm_data, 0);
+	si = fsck_item_free (si);
+    }
+}
+
+/* Check if an overlapping exists and if it does delete all items overlapped 
+   with the one pointed by @ih, insert zeroes since @ih offset and insert have
+   removed items back. */
+static int fsck_tree_overwrite_prep(reiserfs_filsys_t *fs,
+				    const reiserfs_key_t *found_key,
+				    const reiserfs_key_t *start_key, 
+				    __u64 count)
+{
+    __u64 end;
+
+    if (reiserfs_key_comp2(found_key, start_key))
+	return 0;
+    
+    end = reiserfs_key_get_off (start_key) + count;
+    end = MISC_UP(end - 1, fs->fs_blocksize) + 1;
+    if (end <= reiserfs_key_get_off(found_key))
+	return 0;
+
+    fsck_tree_rewrite(fs, start_key, end, 1 << IH_Unreachable);
+    return 1;
+}
+
+/* put unformatted node pointers from incoming item over the in-tree ones */
+static int fsck_tree_overwrite_by_extent (reiserfs_ih_t * comingih, 
+					  __u32 * coming_item,
+					  reiserfs_path_t * path, 
+					  int pos, int check)
+{
+    reiserfs_bh_t * bh = REISERFS_PATH_LEAF (path);
+    reiserfs_ih_t * ih = REISERFS_PATH_IH (path);
+    int written;
+    __u32 * item_in_tree;
+    int src_unfm_ptrs, dest_unfm_ptrs, to_copy, i, dirty = 0;
+
+    item_in_tree = (__u32 *)reiserfs_item_by_ih (bh, ih) + path->pos_in_item;
+    coming_item += pos;
+
+    dest_unfm_ptrs = reiserfs_ext_count (ih) - path->pos_in_item;
+    src_unfm_ptrs = reiserfs_ext_count (comingih) - pos;
+  
+    if (dest_unfm_ptrs >= src_unfm_ptrs) {
+	/* whole coming item (comingih) fits into item in tree (ih) starting 
+	   with path->pos_in_item */
+
+	//free_sp = ih_get_free_space(0, comingih, (char *)coming_item);
+
+	written = reiserfs_leaf_ibytes (comingih, fs->fs_blocksize) -
+	    /* free_sp - */ pos * fs->fs_blocksize;
+	to_copy = src_unfm_ptrs;
+	if (dest_unfm_ptrs == src_unfm_ptrs)
+	    reiserfs_ih_set_free(ih, 0 /* free_sp */ );
+    } else {
+	/* only part of coming item overlaps item in the tree */
+	written = dest_unfm_ptrs * fs->fs_blocksize;
+	to_copy = dest_unfm_ptrs;
+	reiserfs_ih_set_free(ih, 0);
+    }
+
+    for (i = 0; i < to_copy; i ++) {
+	if (d32_get (coming_item, i) != 0 && d32_get (item_in_tree, i) == 0) {
+	    /* overwrite holes only by correct a pointer in the coming item
+               which must be correct */
+	    d32_put (item_in_tree, i, d32_get (coming_item, i));
+
+	    if (check) {
+		if (still_bad_unfm_ptr (d32_get (coming_item, i)))
+		    misc_die ("%s: The unformatted block pointer "
+			      "(%u) points to the bad area.",
+			      __FUNCTION__, d32_get (coming_item, i));
+		
+		mark_block_used (d32_get (coming_item, i), 0);
+	    }
+	    
+	    dirty ++;
+	}
+    }
+    
+    if (dirty)
+	reiserfs_buffer_mkdirty (bh);
+    
+    return written;
+}
+
+/* write direct item to unformatted node */
+/* coming item is direct */
+static int fsck_tree_overwrite_by_direct(reiserfs_ih_t * comingih, 
+					 char * item, 
+					 reiserfs_path_t * path)
+{
+    reiserfs_bh_t * unbh, * bh;
+    reiserfs_ih_t * ih;
+    __u64 coming_len;
+    __u32 unfm_ptr;
+    int offset;
+
+    bh = REISERFS_PATH_LEAF (path);
+    ih = REISERFS_PATH_IH (path);
+
+    unfm_ptr = d32_get ((__u32 *)reiserfs_item_by_ih(bh, ih), 
+			path->pos_in_item);
+    unbh = 0;
+
+    if (unfm_ptr != 0 && unfm_ptr < reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) {
+	unbh = reiserfs_buffer_read (fs->fs_dev, unfm_ptr, bh->b_size);
+	if (!is_block_used (unfm_ptr)) {
+	    misc_die ("%s: block %lu, item %d, pointer %d: The pointed "
+		      "block (%u) being overwritten is marked as unused.", 
+		      __FUNCTION__, bh->b_blocknr, 
+		      REISERFS_PATH_LEAF_POS(path),
+		      path->pos_in_item, unfm_ptr);
+	}
+	
+	if (unbh == 0)
+	    unfm_ptr = 0;
+    }
+    
+    if (unfm_ptr == 0 || 
+	unfm_ptr >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) 
+    {
+	if ((unbh = reiserfsck_get_new_buffer (bh->b_blocknr)) != NULL) {
+	    memset (unbh->b_data, 0, unbh->b_size);
+	    
+	    d32_put ((__u32 *)reiserfs_item_by_ih(bh, ih), 
+		     path->pos_in_item,  unbh->b_blocknr);
+	    
+	    reiserfs_buffer_mkdirty (bh);
+	} else {
+	    misc_die ("%s: Could not allocate a new block "
+		      "for new data", __FUNCTION__);
+	}
+
+	/* If zero extent is overwritten with the direct, mark WAS_TAIL. */
+	reiserfs_ih_mktail(ih);
+    }
+
+    coming_len = reiserfs_leaf_ibytes (comingih, fs->fs_blocksize);
+    offset = (reiserfs_key_get_off (&comingih->ih_key) % bh->b_size) - 1;
+    
+    if (offset + coming_len > bh->b_size) {
+    	misc_die ("%s: The length of the file after insertion "
+		  "(offset=%lu, length=%u) will exceed the maximal "
+		  "possible length.",  __FUNCTION__, 
+		  (long unsigned)reiserfs_key_get_off(&comingih->ih_key),
+		  (unsigned)coming_len);
+    }
+
+    memcpy (unbh->b_data + offset, item, coming_len);
+
+    if ((path->pos_in_item == (reiserfs_ext_count (ih) - 1)) && 
+	(bh->b_size - 0/*ih_free_space (ih)*/) < (offset + coming_len)) {
+	reiserfs_ih_set_free (ih, bh->b_size - (offset + coming_len)) ;
+	reiserfs_buffer_mkdirty (bh);
+    }
+    
+    reiserfs_buffer_mkdirty (unbh);
+    reiserfs_buffer_mkuptodate (unbh, 1);
+    reiserfs_buffer_close (unbh);
+    return coming_len;
+}
+
+static int fsck_tree_overwrite_file (reiserfs_ih_t * comingih, 
+				     char * item,
+				     reiserfs_path_t * path, 
+				     int pos, int check)
+{
+    reiserfs_ih_t * ih = REISERFS_PATH_IH (path);
+    reiserfs_key_t key;
+    int written = 0;
+    __u64 off;
+    int ret;
+
+    if (reiserfs_key_comp2 (ih, &(comingih->ih_key)))
+	    reiserfs_panic ("%s: The file to be overwritten %K must be of "
+			    "the same as the new data %K", __FUNCTION__, 
+			    &ih->ih_key, &comingih->ih_key);
+
+    if (reiserfs_ih_direct (ih)) {
+	reiserfs_key_copy(&key, &comingih->ih_key);
+	off = reiserfs_key_get_off(&comingih->ih_key);
+	off += pos * (reiserfs_ih_direct(comingih) ? 1 : fs->fs_blocksize);
+	reiserfs_key_set_off(reiserfs_key_format(&key), &key, off);
+
+	reiserfs_tree_pathrelse(path);
+	
+	fsck_tree_rewrite(fs, &ih->ih_key, 
+			  reiserfs_key_get_off(&ih->ih_key) + 1, 
+			  1 << IH_Unreachable);
+
+	ret = reiserfs_tree_search_position(fs, &key, path);
+	if (ret == DIRECTORY_FOUND || ret == FILE_NOT_FOUND ||
+	    !reiserfs_ih_ext(REISERFS_PATH_IH(path)))
+	{
+	    reiserfs_panic ("%s: The data %k, which are supposed to be "
+			    "converted, are not found", __FUNCTION__, &key);
+	}
+    }
+    
+    if (reiserfs_ih_direct (comingih)) {
+	written = fsck_tree_overwrite_by_direct(comingih, item, path);
+    } else {
+	written = fsck_tree_overwrite_by_extent(comingih, (__u32 *)item,
+						path, pos, check);
+    }
+
+    return written;
+}
+
+/* this appends file with one unformatted node pointer (since balancing
+   algorithm limitation). This pointer can be 0, or new allocated block or
+   pointer from extent item that is being inserted into tree */
+static int fsck_tree_append_file (reiserfs_ih_t * comingih, 
+				  char * item, int pos, 
+				  reiserfs_path_t * path,
+				  int check)
+{
+    __u32 * ni;
+    reiserfs_bh_t * unbh;
+    int retval;
+    reiserfs_ih_t * ih = REISERFS_PATH_IH (path);
+    __u32 bytes_number;
+    int i, count = 0;
+
+    if (!reiserfs_ih_ext (ih))
+	reiserfs_panic ("%s: Operation is not allowed for non-extent "
+			"item %k", __FUNCTION__, &ih->ih_key);
+
+    if (reiserfs_ih_direct (comingih)) {
+	unsigned int coming_len = 
+		reiserfs_leaf_ibytes (comingih, fs->fs_blocksize);
+
+	reiserfs_ih_mktail (ih);
+        reiserfs_buffer_mkdirty (REISERFS_PATH_LEAF(path));
+	
+	if (reiserfs_key_get_off (&comingih->ih_key) < 
+	    reiserfs_key_get_off (&ih->ih_key) + 
+	    fs->fs_blocksize * reiserfs_ext_count (ih)) 
+	{
+	    /* direct item fits to free space of extent item */
+	    reiserfs_panic("%s: inserting [%H], pos (%d) into [%H], "
+			   "should not get here.\n", __FUNCTION__, 
+			   comingih, pos, ih);
+	}
+
+	unbh = reiserfsck_get_new_buffer (REISERFS_PATH_LEAF (path)->b_blocknr);
+	memset (unbh->b_data, 0, unbh->b_size);
+	memcpy (unbh->b_data + reiserfs_key_get_off (&comingih->ih_key) % 
+		unbh->b_size - 1, item, coming_len);
+
+
+	reiserfs_buffer_mkdirty (unbh);
+	reiserfs_buffer_mkuptodate (unbh, 1);
+
+	ni = misc_getmem (REISERFS_EXT_SIZE);
+	d32_put (ni, 0, unbh->b_blocknr);
+	count = 1;
+	
+	reiserfs_buffer_close (unbh);
+	retval = coming_len;
+    } else {
+	/* coming item is extent item */
+
+	bytes_number = reiserfs_leaf_ibytes (ih, fs->fs_blocksize);
+	if (reiserfs_key_get_off (&comingih->ih_key) + 
+	    pos * fs->fs_blocksize != 
+	    reiserfs_key_get_off (&ih->ih_key) + bytes_number)
+	{
+	    reiserfs_panic ("%s: file %K: Cannot append extent pointers "
+			    "of the offset (%llu) at the position %llu\n", 
+			    __FUNCTION__, &comingih->ih_key, 
+			    reiserfs_key_get_off (&comingih->ih_key) + 
+			    pos * fs->fs_blocksize, 
+			    reiserfs_key_get_off (&ih->ih_key) + 
+			    bytes_number);
+	}
+	
+	/* take unformatted pointer from an extent item */
+	count = reiserfs_ext_count(comingih) - pos;
+	ni = misc_getmem (count * REISERFS_EXT_SIZE);
+	memcpy (ni, (item + pos * REISERFS_EXT_SIZE), count * REISERFS_EXT_SIZE);
+	
+	if (check) {
+	    for (i = 0; i < count; i++ ) {
+		if (still_bad_unfm_ptr (d32_get (ni, i)))
+		    misc_die ("%s: Trying to insert a pointer to illegal "
+			      "block (%u)", __FUNCTION__, d32_get (ni, i));
+		
+		mark_block_used (d32_get (ni, i), 0);
+	    }
+	}
+
+	retval = fs->fs_blocksize * count;
+    }
+
+    reiserfs_tree_insert_unit (fs, path, (const char *)ni, count * REISERFS_EXT_SIZE);
+    misc_freemem (ni);
+    return retval;
+}
+
+static int fsck_tree_insert_file (reiserfs_ih_t * ih, 
+				  char * item, 
+				  int check)
+{
+    long long int retval, written;
+    const reiserfs_key_t *p_key;
+    const reiserfs_ih_t *p_ih;
+    reiserfs_path_t path;
+    reiserfs_key_t key;
+    int count, pos;
+
+    /* Check if the SD item exists */
+    if (check && fsck_tree_insert_prep(fs, ih, 0))
+	return 0;
+    
+    pos = 0;
+    count = reiserfs_leaf_ibytes (ih, fs->fs_blocksize);
+    reiserfs_key_copy (&key, &(ih->ih_key));
+
+    while (count) {
+	if (count < 0) {
+	    reiserfs_panic ("%s: We wrote into the file %K more "
+			    "bytes than needed - count (%d) < 0.", 
+			    __FUNCTION__, &key, count);
+	}
+
+	retval = reiserfs_tree_search_position (fs, &key, &path);
+	
+	if (retval == DIRECTORY_FOUND) {
+	    reiserfs_panic ("The directory was found at the place of the file "
+			    "we are going to insert the item %k into", &key);
+	}
+
+	written = 0;
+
+	if (retval == POSITION_FOUND) {
+	    written = fsck_tree_overwrite_file (ih, item, &path, 
+						pos, check);
+	}
+
+	if (retval == POSITION_NOT_FOUND) {
+	    if (REISERFS_PATH_LEAF_POS (&path) >= 
+		reiserfs_node_items (REISERFS_PATH_LEAF(&path)))
+	    {
+		p_key = reiserfs_tree_next_key(&path, fs);
+	    } else {
+		p_key = &REISERFS_PATH_IH(&path)->ih_key;
+	    }
+	    
+	    if (path.pos_in_item == 0) {
+		/* There is nothing of this file before the found item. 
+		   Check the overlapping with the found/next item. */
+		if (fsck_tree_overwrite_prep(fs, p_key, &key, count)) {
+		    reiserfs_tree_pathrelse (&path);
+		    continue;
+		}
+		
+		/* No overlapping, insert a new item. */
+		written = fsck_tree_create_item(fs, &path, ih, 
+						item, pos, check);
+	    } else {
+		const reiserfs_key_t *next = reiserfs_tree_next_key(&path, fs);
+		
+		/* Check the overlapping with the next item. */
+		if (fsck_tree_overwrite_prep(fs, next, &key, count)) {
+		    reiserfs_tree_pathrelse (&path);
+		    continue;
+		}
+
+		/* No overlapping, convert the current into the extent and
+		   insert a new / append to the existent. */
+		p_ih = REISERFS_PATH_IH(&path);
+		written = must_there_be_a_hole (p_ih, &key);
+		
+		if (written <= 0 && reiserfs_key_direct(p_key)) {
+		    reiserfs_tree_pathrelse(&path);
+		    fsck_tree_rewrite(fs, &p_ih->ih_key, 
+				      reiserfs_key_get_off(&key) + 1, 
+				      1 << IH_Unreachable);
+		    continue;
+                }
+		
+		if (written > 0) {
+		    REISERFS_PATH_LEAF_POS (&path) ++;
+		    path.pos_in_item = 0;
+		    
+		    written = fsck_tree_create_item(fs, &path, ih, 
+						    item, pos, check);
+		} else {
+		    written = fsck_tree_append_file (ih, item, pos,
+                                                     &path, check);
+		}
+	    }
+	}
+	
+	if (retval == FILE_NOT_FOUND) {
+	    written = fsck_tree_create_item(fs, &path, ih, 
+					    item, pos, check);
+	}
+	
+	reiserfs_tree_pathrelse (&path);
+	count -= written;
+	pos += written / (reiserfs_ih_direct(ih) ? 1 : fs->fs_blocksize);
+	
+	reiserfs_key_set_off (reiserfs_key_format (&key), &key, 
+			      reiserfs_key_get_off (&key) + written);
+    }
+
+
+    /* This is a test for writing into the file. If not sure that file data 
+       are consistent after fsck_tree_insert_file - uncomment this clause: */
+
+/*    if (!check && are_file_items_correct (&ih->ih_key,
+    	(format == KEY_FORMAT_UNDEFINED) ?	
+	reiserfs_ih_get_format (ih) : format,
+    	&size, &blocks, 0, symlink, 0) == 0)
+        reiserfs_panic ("%s: item was not inserted properly\n", __FUNCTION__);*/
+
+    return reiserfs_leaf_ibytes (ih, fs->fs_blocksize);
+}
+
+
+void fsck_tree_insert_item (reiserfs_ih_t * ih,
+			    char * item, int check)
+{
+    if (reiserfs_key_get_did (&ih->ih_key) == 
+	reiserfs_key_get_oid (&ih->ih_key))
+    {
+	reiserfs_panic ("%s: The item being inserted has "
+			"the bad key %H", __FUNCTION__, ih);
+    }
+	
+    if (reiserfs_ih_stat (ih)) {
+	fsck_tree_insert_stat (ih, item, check);
+    } else if (reiserfs_ih_dir (ih)) {
+	fsck_tree_insert_entry (ih, item, check);
+    } else {
+	fsck_tree_insert_file (ih, item, check);
+    }
+}
+
+
+void fsck_tree_trav (reiserfs_filsys_t * fs, 
+		     path_func_t action1,
+		     path_func_t action2, 
+		     int depth)
+{
+    reiserfs_path_t path;
+    reiserfs_bh_t *bh;
+    int total[REISERFS_PATH_MAX] = {0,};
+    unsigned long limit, done;
+    unsigned long block;
+    int problem;
+    int pos;
+
+    memset(&path, 0, sizeof(path));
+    path.path_length = REISERFS_PATH_OFFINIT;
+    
+    done = 0;
+    limit = 1;
+    block = reiserfs_sb_get_root (fs->fs_ondisk_sb);
+
+    if (reiserfs_fs_block(fs, block) != BT_UNKNOWN) {
+	misc_die ("\nBad root block %lu. (--rebuild-tree "
+		  "did not complete)\n", block);
+    }
+
+    while ( 1 ) {
+	problem = 0;
+
+        if (REISERFS_PATH_LEAF(&path))
+            misc_die ("%s: empty slot expected.\n", __FUNCTION__);
+
+	if (fs->fs_badblocks_bm && 
+	    reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, block)) 
+	{
+	    fsck_log ("%s: block %lu specified in badblock list found in "
+		      "tree, whole subtree skipped\n", __FUNCTION__, block);
+	    
+	    fsck_data (fs)->check.bad_nodes++;
+	    one_more_corruption (fs, FATAL);
+
+	    if (path.path_length == REISERFS_PATH_OFFINIT) {
+		reiserfs_buffer_close (REISERFS_PATH_LEAF(&path));
+		REISERFS_PATH_LEAF(&path) = 0;
+		break;
+	    }
+	    
+	    problem = 1;		
+	} else {
+	    REISERFS_PATH_LEAF(&path) = 
+		    reiserfs_buffer_read (fs->fs_dev, block, fs->fs_blocksize);
+	    
+	    if (REISERFS_PATH_LEAF(&path) == 0)
+		/* FIXME: handle case when read failed */
+		misc_die ("%s: unable to read %lu block on device 0x%x\n",
+			  __FUNCTION__, block, fs->fs_dev);
+
+	    if (action1)
+		if ((problem = action1 (fs, &path))) {
+		    fsck_log (" the problem in the internal node occured "
+			      "(%lu), whole subtree is skipped\n", block);
+		    
+		    fsck_check_stat(fs)->bad_nodes++;
+ 
+		    if (path.path_length == REISERFS_PATH_OFFINIT) {
+			reiserfs_buffer_close (REISERFS_PATH_LEAF(&path));
+			REISERFS_PATH_LEAF(&path) = 0;
+			break;
+		    }
+		}
+	}
+
+	/* Time to stop. */
+	if (path.path_length - REISERFS_PATH_OFFINIT == depth)
+	    problem ++;
+
+        if (problem || reiserfs_leaf_head(REISERFS_PATH_LEAF(&path))) {
+	    if ((path.path_length > REISERFS_PATH_OFFINIT) && 
+		!fsck_quiet(fs)) 
+	    {
+		util_misc_progress (fsck_progress_file (fs), 
+				    &done, limit, 1, 2);
+	    }
+	    
+            if (!problem && action2)
+                action2 (fs, &path);
+
+	    reiserfs_buffer_close (REISERFS_PATH_LEAF(&path));
+
+            while ((path.path_length > REISERFS_PATH_OFFINIT) && 
+		   (REISERFS_PATH_POS(&path, path.path_length - 1) == 
+		    total[path.path_length - 1] - 1 || problem)) 
+	    {
+                problem = 0;
+                REISERFS_PATH_LEAF(&path) = 0;
+                path.path_length --;
+                reiserfs_buffer_close (REISERFS_PATH_LEAF(&path));
+		limit /= total[path.path_length];
+		done /= total[path.path_length];
+	    }
+
+	    REISERFS_PATH_LEAF(&path) = 0;
+	    
+    	    if (path.path_length == REISERFS_PATH_OFFINIT)
+		break;
+
+	    bh = REISERFS_PATH_BUFFER(&path, path.path_length - 1);
+            REISERFS_PATH_POS(&path, path.path_length - 1) ++;
+	    
+	    pos = REISERFS_PATH_POS(&path, path.path_length - 1);
+            block = reiserfs_dc_get_nr(reiserfs_int_at(bh, pos));
+	    
+            continue;
+	}
+	
+        total[path.path_length] = 
+		reiserfs_node_items (REISERFS_PATH_LEAF(&path)) + 1;
+	
+	limit *= total[path.path_length];
+	done = done * total[path.path_length];
+	
+        REISERFS_PATH_LEAF_POS(&path) = 0;
+        block = reiserfs_dc_get_nr (reiserfs_int_at (REISERFS_PATH_LEAF(&path), 0)); 
+	path.path_length ++;
+    }
+}
diff --git a/utils/mkfs/Makefile.am b/utils/mkfs/Makefile.am
new file mode 100644
index 0000000..fbcd7f1
--- /dev/null
+++ b/utils/mkfs/Makefile.am
@@ -0,0 +1,27 @@
+sbin_PROGRAMS		= mkfs.reiserfs
+
+man_MANS		= mkfs.reiserfs.8
+EXTRA_DIST		= mkfs.reiserfs.8
+
+mkfs_reiserfs_SOURCES	= mkreiserfs.c
+mkfs_reiserfs_LDADD	= $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			  $(top_builddir)/libutil/libutil-static.a         \
+			  $(top_builddir)/libmisc/libmisc-static.a
+mkfs_reiserfs_LDFLAGS	= @PROGS_LDFLAGS@
+mkfs_reiserfs_CFLAGS	= @CFLAGS@
+
+INCLUDES		= -I$(top_srcdir)/include
+
+uninstall-mkreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/mkreiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \
+	fi;
+
+install-mkreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/mkfs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \
+		ln $(DESTDIR)$(sbindir)/mkfs.reiserfs $(DESTDIR)$(sbindir)/mkreiserfs; \
+	fi;
+
+install-data-local: install-mkreiserfs
+uninstall-local: uninstall-mkreiserfs
diff --git a/utils/mkfs/Makefile.in b/utils/mkfs/Makefile.in
new file mode 100644
index 0000000..37ab5cd
--- /dev/null
+++ b/utils/mkfs/Makefile.in
@@ -0,0 +1,501 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(mkfs_reiserfs_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+sbin_PROGRAMS = mkfs.reiserfs$(EXEEXT)
+subdir = utils/mkfs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(sbin_PROGRAMS)
+am_mkfs_reiserfs_OBJECTS = mkfs_reiserfs-mkreiserfs.$(OBJEXT)
+mkfs_reiserfs_OBJECTS = $(am_mkfs_reiserfs_OBJECTS)
+mkfs_reiserfs_DEPENDENCIES =  \
+	$(top_builddir)/libreiserfs/libreiserfs-static.a \
+	$(top_builddir)/libutil/libutil-static.a \
+	$(top_builddir)/libmisc/libmisc-static.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(mkfs_reiserfs_SOURCES)
+DIST_SOURCES = $(mkfs_reiserfs_SOURCES)
+man8dir = $(mandir)/man8
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+man_MANS = mkfs.reiserfs.8
+EXTRA_DIST = mkfs.reiserfs.8
+mkfs_reiserfs_SOURCES = mkreiserfs.c
+mkfs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			  $(top_builddir)/libutil/libutil-static.a         \
+			  $(top_builddir)/libmisc/libmisc-static.a
+
+mkfs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+mkfs_reiserfs_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/mkfs/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  utils/mkfs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+	done
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+mkfs.reiserfs$(EXEEXT): $(mkfs_reiserfs_OBJECTS) $(mkfs_reiserfs_DEPENDENCIES) 
+	@rm -f mkfs.reiserfs$(EXEEXT)
+	$(LINK) $(mkfs_reiserfs_LDFLAGS) $(mkfs_reiserfs_OBJECTS) $(mkfs_reiserfs_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+mkfs_reiserfs-mkreiserfs.o: mkreiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -MT mkfs_reiserfs-mkreiserfs.o -MD -MP -MF "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" -c -o mkfs_reiserfs-mkreiserfs.o `test -f 'mkreiserfs.c' || echo '$(srcdir)/'`mkreiserfs.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Po"; else rm -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mkreiserfs.c' object='mkfs_reiserfs-mkreiserfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -c -o mkfs_reiserfs-mkreiserfs.o `test -f 'mkreiserfs.c' || echo '$(srcdir)/'`mkreiserfs.c
+
+mkfs_reiserfs-mkreiserfs.obj: mkreiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -MT mkfs_reiserfs-mkreiserfs.obj -MD -MP -MF "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" -c -o mkfs_reiserfs-mkreiserfs.obj `if test -f 'mkreiserfs.c'; then $(CYGPATH_W) 'mkreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/mkreiserfs.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo" "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Po"; else rm -f "$(DEPDIR)/mkfs_reiserfs-mkreiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mkreiserfs.c' object='mkfs_reiserfs-mkreiserfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mkfs_reiserfs_CFLAGS) $(CFLAGS) -c -o mkfs_reiserfs-mkreiserfs.obj `if test -f 'mkreiserfs.c'; then $(CYGPATH_W) 'mkreiserfs.c'; else $(CYGPATH_W) '$(srcdir)/mkreiserfs.c'; fi`
+uninstall-info-am:
+install-man8: $(man8_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)"
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+uninstall-man8:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am: install-sbinPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man8
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-local uninstall-man \
+	uninstall-sbinPROGRAMS
+
+uninstall-man: uninstall-man8
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-sbinPROGRAMS ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-data-local install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-man8 install-sbinPROGRAMS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am uninstall-local uninstall-man \
+	uninstall-man8 uninstall-sbinPROGRAMS
+
+
+uninstall-mkreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/mkreiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \
+	fi;
+
+install-mkreiserfs:
+	if test -f $(DESTDIR)$(sbindir)/mkfs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/mkreiserfs; \
+		ln $(DESTDIR)$(sbindir)/mkfs.reiserfs $(DESTDIR)$(sbindir)/mkreiserfs; \
+	fi;
+
+install-data-local: install-mkreiserfs
+uninstall-local: uninstall-mkreiserfs
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/mkreiserfs/mkreiserfs.8 b/utils/mkfs/mkfs.reiserfs.8
similarity index 79%
rename from mkreiserfs/mkreiserfs.8
rename to utils/mkfs/mkfs.reiserfs.8
index f6b45ae..9c3db4d 100644
--- a/mkreiserfs/mkreiserfs.8
+++ b/utils/mkfs/mkfs.reiserfs.8
@@ -1,11 +1,11 @@
 .\" -*- nroff -*-
 .\" Copyright 1996-2004 Hans Reiser.
 .\" 
-.TH MKREISERFS 8 "February 2004" "Reiserfsprogs-3.6.19"
+.TH mkfs.reiserfs 8 "February 2004" "Reiserfsprogs-3.6.19"
 .SH NAME
-mkreiserfs \- The create tool for the Linux ReiserFS filesystem.
+mkfs.reiserfs \- The create tool for the Linux ReiserFS filesystem.
 .SH SYNOPSIS
-.B mkreiserfs
+.B mkfs.reiserfs
 [ \fB-dfV\fR ]
 [ \fB-b\fR | \fB--block-size \fIN\fR ]
 [ \fB-h\fR | \fB--hash \fIHASH\fR ]
@@ -20,7 +20,7 @@
 [ \fB-B\fR | \fB--badblocks\fR \fIfile\fR ] \fI device\fR
 [ \fIfilesystem-size\fR ]
 .SH DESCRIPTION
-\fBmkreiserfs\fR creates a Linux ReiserFS filesystem on a device (usually a disk
+\fBmkfs.reiserfs\fR creates a Linux ReiserFS filesystem on a device (usually a disk
 partition).
 .TP
 .I device
@@ -28,7 +28,7 @@
 /dev/hdXX for an IDE disk partition or /dev/sdXX for a SCSI disk partition).
 .TP
 .I filesystem-size
-is the size in blocks of the filesystem. If omitted, \fBmkreiserfs\fR will
+is the size in blocks of the filesystem. If omitted, \fBmkfs.reiserfs\fR will
 automatically set it.
 .SH OPTIONS
 .TP
@@ -42,7 +42,7 @@
 .TP
 \fB--format \fIFORMAT\fR
 \fIFORMAT\fR specifies the format for the new filsystem. Choose format 3.5 or
-3.6. If none is specified \fBmkreiserfs\fR will create format 3.6 if running
+3.6. If none is specified \fBmkfs.reiserfs\fR will create format 3.6 if running
 kernel is 2.4 or higher, and format 3.5 if kernel 2.2 is running, and will
 refuse creation under all other kernels.
 .TP
@@ -50,17 +50,17 @@
 Sets  the  Universally  Unique  IDentifier  of  the  filesystem  to  \fIUUID\fR 
 (see  also  \fBuuidgen(8)\fR).  The  format  of  the  \fIUUID\fR  is  a  series 
 of  hex  digits separated by hypthens, e.g.: "c1b9d5a2-f162-11cf-9ece-0020afc76f16".
-If  the option  is skipped,  \fBmkreiserfs\fR  will by default generate a new
+If  the option  is skipped,  \fBmkfs.reiserfs\fR  will by default generate a new
 \fIUUID\fR.
 .TP
 \fB-l\fR | \fB--label \fILABEL\fR
 Sets  the  volume  label  of  the filesystem. \fILABEL\fR can at most be 16
-characters long; if it is longer than 16 characters, \fBmkreiserfs\fR will 
+characters long; if it is longer than 16 characters, \fBmkfs.reiserfs\fR will 
 truncate it.
 .TP
 \fB-q\fR | \fB--quiet \fR
-Sets \fBmkreiserfs\fR to work quietly without producing messages, progress or
-questions. It is useful, but only for use by end users, if you run \fBmkreiserfs\fR 
+Sets \fBmkfs.reiserfs\fR to work quietly without producing messages, progress or
+questions. It is useful, but only for use by end users, if you run \fBmkfs.reiserfs\fR 
 in a script.
 .TP
 \fB-j\fR | \fB--journal-device \fIFILE\fR
@@ -91,25 +91,25 @@
 \fB/sbin/badblocks -b block-size device\fR.
 .TP
 \fB-f\fR
-Forces \fBmkreiserfs\fR to continue even when the device is the whole disk, 
+Forces \fBmkfs.reiserfs\fR to continue even when the device is the whole disk, 
 looks mounted, or is not a block device. If \fB-f\fR is specified more than
 once, it allows the user to avoid asking for confirmation.
 .TP
 \fB-d\fR
-Sets \fBmkreiserfs\fR to print debugging information during \fBmkreiserfs\fR.
+Sets \fBmkfs.reiserfs\fR to print debugging information during \fBmkfs.reiserfs\fR.
 .TP
 \fB-V\fR
 Prints the version and then exits.
 
 .SH AUTHOR
 This version of
-.B mkreiserfs
+.B mkfs.reiserfs
 has been written by Edward Shishkin <edward@namesys.com>.
 .SH BUGS
 Please report bugs to the ReiserFS developers <reiserfs-dev@namesys.com>, providing 
 as much information as possible--your hardware, kernel, patches, settings, all printed
 messages; check the syslog file for any related information.
 .SH SEE ALSO
-.BR reiserfsck (8),
-.BR debugreiserfs (8),
-.BR reiserfstune (8)
+.BR fsck.reiserfs (8),
+.BR debugfs.reiserfs (8),
+.BR tunefs.reiserfs (8)
diff --git a/mkreiserfs/mkreiserfs.c b/utils/mkfs/mkreiserfs.c
similarity index 70%
rename from mkreiserfs/mkreiserfs.c
rename to utils/mkfs/mkreiserfs.c
index 8a49317..fe49b84 100644
--- a/mkreiserfs/mkreiserfs.c
+++ b/utils/mkfs/mkreiserfs.c
@@ -11,23 +11,28 @@
    and root blocks. bitmap blocks are interleaved across the disk, 
    mainly to make resizing faster. */
 
-#define _GNU_SOURCE
-
-#ifndef HAVE_CONFIG_H
-#  include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
 #endif
 
-#include "io.h"
-#include "misc.h"
-#include "reiserfs_lib.h"
-
-#include "../version.h"
+#include "reiserfs/libreiserfs.h"
+#include "misc/device.h"
+#include "util/device.h"
+#include "util/misc.h"
+#include "util/credits.h"
+#include "util/print.h"
+#include "util/badblock.h"
 
 #include <getopt.h>
 #include <stdarg.h>
-#include <string.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
 #include <errno.h>
-#include <sys/utsname.h>
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif
 
 #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
 #  include <uuid/uuid.h>
@@ -40,17 +45,16 @@
 	__attribute__ ((format (printf, 1, 2)));
 
 static void message( const char * fmt, ... ) {
-    char *buf;
+    char buf[4096];
     va_list args;
 	
-    buf = NULL;
+    buf[0] = '\0';
     va_start( args, fmt );
-    vasprintf( &buf, fmt, args );
+    vsprintf( buf, fmt, args );
     va_end( args );
 
-    if( buf ) {
+    if( buf[0] != '\0') {
 	    fprintf( stderr, "%s: %s\n", program_name, buf );
-	    free( buf );
     }
 }
 
@@ -93,8 +97,8 @@
 int Hash = DEFAULT_HASH;
 int Offset = 0;
 char * Format;
-unsigned char UUID[16];
-unsigned char * LABEL = NULL;
+char UUID[16];
+char * LABEL = NULL;
 char * badblocks_file;
 
 enum mkfs_mode {
@@ -108,9 +112,9 @@
 /* form super block (old one) */
 static void make_super_block (reiserfs_filsys_t * fs)
 {
-    set_sb_umount_state (fs->fs_ondisk_sb, FS_CLEANLY_UMOUNTED);
-    set_sb_tree_height (fs->fs_ondisk_sb, 2);
-    set_sb_hash_code (fs->fs_ondisk_sb, Hash);
+    reiserfs_sb_set_umount (fs->fs_ondisk_sb, FS_CLEANLY_UMOUNTED);
+    reiserfs_sb_set_height (fs->fs_ondisk_sb, 2);
+    reiserfs_sb_set_hash (fs->fs_ondisk_sb, Hash);
     if (fs->fs_format == REISERFS_FORMAT_3_6) {
 #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
         if (uuid_is_null(UUID))
@@ -122,23 +126,23 @@
 	    if (strlen (LABEL) > 16)
 	        reiserfs_warning (stderr, "\nSpecified LABEL is longer then 16 "
 		"characters, will be truncated\n\n");
-	    strncpy (fs->fs_ondisk_sb->s_label, LABEL, 16);
+	    strncpy ((char *)fs->fs_ondisk_sb->s_label, LABEL, 16);
 	}
-	set_sb_v2_flag (fs->fs_ondisk_sb, reiserfs_attrs_cleared);
+	reiserfs_sb_mkflag (fs->fs_ondisk_sb, reiserfs_attrs_cleared);
     }
 
-    if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb) ||
+    if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb) ||
 	strcmp (fs->fs_file_name, fs->fs_j_file_name))
 	/* either standard journal (and we leave all new fields to be 0) or
 	   journal is created on separate device so there is no space on data
 	   device which can be used as a journal */
-	set_sb_reserved_for_journal (fs->fs_ondisk_sb, 0);
+	reiserfs_sb_set_reserved (fs->fs_ondisk_sb, 0);
     else
-	set_sb_reserved_for_journal (fs->fs_ondisk_sb,
-		get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)) + 1);
+	reiserfs_sb_set_reserved (fs->fs_ondisk_sb,
+		reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb)) + 1);
 
     if (fs->fs_badblocks_bm)
-	set_sb_free_blocks(fs->fs_ondisk_sb, get_sb_free_blocks(fs->fs_ondisk_sb) - 
+	reiserfs_sb_set_free(fs->fs_ondisk_sb, reiserfs_sb_get_free(fs->fs_ondisk_sb) - 
 			   fs->fs_badblocks_bm->bm_set_bits);
 }
 
@@ -146,9 +150,9 @@
 /* wipe out first 64 k of a device and both possible reiserfs super block */
 static void invalidate_other_formats (int dev)
 {
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     
-    bh = bread (dev, 0, 64 * 1024);
+    bh = reiserfs_buffer_read (dev, 0, 64 * 1024);
     if (!bh) {
 	    reiserfs_exit(1, "Unable to read first blocks of the device");
     }
@@ -157,36 +161,36 @@
 #else
     memset (bh->b_data, 0, bh->b_size);
 #endif
-    mark_buffer_uptodate (bh, 1);
-    mark_buffer_dirty (bh);
-    bwrite (bh);
-    brelse (bh);
+    reiserfs_buffer_mkuptodate (bh, 1);
+    reiserfs_buffer_mkdirty (bh);
+    reiserfs_buffer_write (bh);
+    reiserfs_buffer_close (bh);
 }
 
 
 void zero_journal (reiserfs_filsys_t * fs)
 {
     unsigned long start, len, done;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     unsigned int i;
 
     fprintf (stdout, "Initializing journal - ");
 
-    start = get_jp_journal_1st_block (sb_jp (fs->fs_ondisk_sb));
-    len = get_jp_journal_size (sb_jp (fs->fs_ondisk_sb));
+    start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb));
+    len = reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb));
 
     done = 0;
     for (i = 0; i < len; i ++) {
-        print_how_far (stdout, &done, len, 1, 1/*be quiet*/);
-        bh = getblk (fs->fs_journal_dev, start + i, fs->fs_blocksize);
+        util_misc_progress (stdout, &done, len, 1, 2);
+        bh = reiserfs_buffer_open (fs->fs_journal_dev, start + i, fs->fs_blocksize);
 	if (!bh) {
-		reiserfs_exit(1, "zero_journal: getblk failed");
+		reiserfs_exit(1, "zero_journal: reiserfs_buffer_open failed");
 	}
         memset (bh->b_data, 0, bh->b_size);
-        mark_buffer_dirty (bh);
-        mark_buffer_uptodate (bh, 1);
-        bwrite (bh);
-        brelse (bh);
+        reiserfs_buffer_mkdirty (bh);
+        reiserfs_buffer_mkuptodate (bh, 1);
+        reiserfs_buffer_write (bh);
+        reiserfs_buffer_close (bh);
     }
 
     fprintf (stdout, "\n");
@@ -197,11 +201,14 @@
 /* this only sets few first bits in bitmap block. Fills not initialized fields
    of super block (root block and bitmap block numbers) */
 static void make_bitmap (reiserfs_filsys_t * fs) {
-    struct reiserfs_super_block * sb = fs->fs_ondisk_sb;
+    reiserfs_sb_t * sb;
     unsigned int i;
     unsigned long block;
+    unsigned long count, bmap_nr;
     int marked;
     
+    sb = fs->fs_ondisk_sb;
+    count = reiserfs_sb_get_blocks (sb);
     marked = 0;
 
     /* mark skipped area and super block */
@@ -211,7 +218,7 @@
     }
     
     if (fs->fs_badblocks_bm) {
-	for (i = 0; i < get_sb_block_count (sb); i ++) {
+	for (i = 0; i < count; i ++) {
 	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) {
 		reiserfs_bitmap_set_bit (fs->fs_bitmap2, i);
 		marked ++;
@@ -221,99 +228,96 @@
 
     /* mark bitmaps as used */
     block = fs->fs_super_bh->b_blocknr + 1;
+    
+    bmap_nr = reiserfs_bmap_nr(count, fs->fs_blocksize);
 
-    for (i = 0; i < get_sb_bmap_nr (sb); i ++) {
+    for (i = 0; i < bmap_nr; i ++) {
 	reiserfs_bitmap_set_bit (fs->fs_bitmap2, block);
 	marked ++;
-	if (spread_bitmaps (fs))
+	if (reiserfs_bitmap_spread (fs))
 	    block = (block / (fs->fs_blocksize * 8) + 1) * 
 		    (fs->fs_blocksize * 8);
 	else
 	    block ++;
     }
 
-    if (!get_size_of_journal_or_reserved_area (fs->fs_ondisk_sb))
+    if (!reiserfs_journal_hostsize (fs->fs_ondisk_sb))
 	/* root block follows directly super block and first bitmap */
 	block = fs->fs_super_bh->b_blocknr + 1 + 1;
     else {
 	/* makr journal blocks as used */
-	for (i = 0; i <= get_jp_journal_size (sb_jp (sb)); i ++) {
+	for (i = 0; i <= reiserfs_jp_get_size (reiserfs_sb_jp (sb)); i ++) {
 	    reiserfs_bitmap_set_bit (fs->fs_bitmap2,
-				     i + get_jp_journal_1st_block (sb_jp (sb)));
+				     i + reiserfs_jp_get_start (reiserfs_sb_jp (sb)));
 	    marked ++;
 	}
-	block = get_jp_journal_1st_block (sb_jp (sb)) + i;
+	block = reiserfs_jp_get_start (reiserfs_sb_jp (sb)) + i;
     }
 
     /*get correct block - not journal nor bitmap*/
-    while (block_of_journal (fs, block) || block_of_bitmap (fs, block)) {
+    while (reiserfs_journal_block (fs, block) || reiserfs_bitmap_block (fs, block)) {
 	block++;
     }
 
-    while ((block < get_sb_block_count (sb)) && 
-	   reiserfs_bitmap_test_bit (fs->fs_bitmap2, block)) 
+    while ((block < count) && reiserfs_bitmap_test_bit (fs->fs_bitmap2, block))
     {
     	block++;
     }
 
-    if (block >= get_sb_block_count (sb))
+    if (block >= count)
     	reiserfs_exit(1, "mkreiserfs: too many bad blocks");
 
     reiserfs_bitmap_set_bit (fs->fs_bitmap2, block);
     marked ++;
 
-    set_sb_root_block (sb, block);
-    set_sb_free_blocks (sb, get_sb_block_count (sb) - marked);
+    reiserfs_sb_set_root (sb, block);
+    reiserfs_sb_set_free (sb, count - marked);
 }
 
-
-static void set_root_dir_nlink (struct item_head * ih, void * sd)
-{
+static void set_root_dir_nlink (reiserfs_ih_t *ih, void *sd) {
     __u32 nlink;
 
     nlink = 3;
-    set_sd_nlink (ih, sd, &nlink);
+    reiserfs_stat_set_nlink (ih, sd, &nlink);
 }
 
-
 /* form the root block of the tree (the block head, the item head, the
    root directory) */
 static void make_root_block (reiserfs_filsys_t * fs)
 {
-    struct reiserfs_super_block * sb;
-    struct buffer_head * bh;
+    reiserfs_sb_t * sb;
+    reiserfs_bh_t * bh;
 
 
     sb = fs->fs_ondisk_sb;
     /* get memory for root block */
-    bh = getblk (fs->fs_dev, get_sb_root_block (sb), get_sb_block_size (sb));
+    bh = reiserfs_buffer_open (fs->fs_dev, reiserfs_sb_get_root (sb), 
+			       reiserfs_sb_get_blksize (sb));
     
     if (!bh) {
-	    reiserfs_exit(1, "getblk failed");
+	    reiserfs_exit(1, "reiserfs_buffer_open failed");
     }
 
-    mark_buffer_uptodate (bh, 1);
+    reiserfs_buffer_mkuptodate (bh, 1);
 
-    make_empty_leaf (bh);
-    make_sure_root_dir_exists (fs, set_root_dir_nlink, 0);
-    brelse (bh);
+    reiserfs_leaf_mkempty (bh);
+    reiserfs_tree_root (fs, set_root_dir_nlink, 0);
+    reiserfs_buffer_close (bh);
 
-    mark_objectid_used (fs, REISERFS_ROOT_PARENT_OBJECTID);
-    mark_objectid_used (fs, REISERFS_ROOT_OBJECTID);
+    reiserfs_objmap_set (fs, REISERFS_ROOT_PARENT_OBJECTID);
+    reiserfs_objmap_set (fs, REISERFS_ROOT_OBJECTID);
 }
 
 
 
 static void report (reiserfs_filsys_t * fs, char * j_filename)
 {
-//    print_block (stdout, fs, fs->fs_super_bh);
-    struct reiserfs_super_block * sb = 
-	(struct reiserfs_super_block *)(fs->fs_super_bh->b_data);
+    reiserfs_sb_t * sb = (reiserfs_sb_t *)(fs->fs_super_bh->b_data);
 
     struct stat st;
     dev_t rdev;
 
-    if (!is_any_reiserfs_magic_string (sb))
+    if (!reiserfs_super_magic (sb))
 	    return;
 
     if (fstat (fs->fs_super_bh->b_dev, &st) == -1) {
@@ -326,7 +330,7 @@
 	    reiserfs_warning (stdout, "Block %lu (0x%x) contains super block. ",
 			      fs->fs_super_bh->b_blocknr, rdev);
     }
-    switch (get_reiserfs_format (sb)) {
+    switch (reiserfs_super_format (sb)) {
     case REISERFS_FORMAT_3_5:
 	    reiserfs_warning (stdout, " Format 3.5 with ");
 	    break;
@@ -334,57 +338,57 @@
 	    reiserfs_warning (stdout, "Format 3.6 with ");
 	    break;
     }
-    if (is_reiserfs_jr_magic_string (sb))
+    if (reiserfs_super_jr_magic (sb))
 	    reiserfs_warning (stdout, "non-");
     reiserfs_warning (stdout, "standard journal\n");
     reiserfs_warning (stdout, "Count of blocks on the device: %u\n", 
-		      get_sb_block_count (sb));
+		      reiserfs_sb_get_blocks (sb));
     reiserfs_warning (stdout, "Number of blocks consumed by mkreiserfs "
-		      "formatting process: %u\n", get_sb_block_count (sb) 
-		      - get_sb_free_blocks (sb));
+		      "formatting process: %u\n", reiserfs_sb_get_blocks (sb) 
+		      - reiserfs_sb_get_free (sb));
     if (mode & DEBUG_MODE)
 	    reiserfs_warning (stdout, "Free blocks: %u\n", 
-			      get_sb_free_blocks (sb));
-    reiserfs_warning (stdout, "Blocksize: %d\n", get_sb_block_size (sb));
+			      reiserfs_sb_get_free (sb));
+    reiserfs_warning (stdout, "Blocksize: %d\n", reiserfs_sb_get_blksize (sb));
     reiserfs_warning (stdout, "Hash function used to sort names: %s\n",
-		      code2name (get_sb_hash_code (sb)));
+		      reiserfs_hash_name (reiserfs_sb_get_hash (sb)));
     if (mode & DEBUG_MODE) {
-        reiserfs_warning (stdout, "Number of bitmaps: %u\n", get_sb_bmap_nr (sb));
-        reiserfs_warning (stdout, "Root block: %u\n", get_sb_root_block (sb));
-        reiserfs_warning (stdout, "Tree height: %d\n", get_sb_tree_height (sb));
+        reiserfs_warning (stdout, "Number of bitmaps: %u\n", reiserfs_sb_get_bmaps (sb));
+        reiserfs_warning (stdout, "Root block: %u\n", reiserfs_sb_get_root (sb));
+        reiserfs_warning (stdout, "Tree height: %d\n", reiserfs_sb_get_height (sb));
         reiserfs_warning (stdout, "Objectid map size %d, max %d\n", 
-			  get_sb_oid_cursize (sb), get_sb_oid_maxsize (sb));
+			  reiserfs_sb_get_mapcur (sb), reiserfs_sb_get_mapmax (sb));
         reiserfs_warning (stdout, "Journal parameters:\n");
-        print_journal_params (stdout, sb_jp (sb));
+        reiserfs_journal_print_params (stdout, reiserfs_sb_jp (sb));
     } else {
         if (j_filename && strcmp (j_filename, fs->fs_file_name)) 
 		reiserfs_warning (stdout, "Journal Device [0x%x]\n", 
-				  get_jp_journal_dev (sb_jp (sb)));
+				  reiserfs_jp_get_dev (reiserfs_sb_jp (sb)));
 	
         reiserfs_warning (stdout, "Journal Size %u blocks (first block %u)\n",
-			  get_jp_journal_size (sb_jp (sb)) + 1,
-			  get_jp_journal_1st_block (sb_jp (sb)));
+			  reiserfs_jp_get_size (reiserfs_sb_jp (sb)) + 1,
+			  reiserfs_jp_get_start (reiserfs_sb_jp (sb)));
         reiserfs_warning (stdout, "Journal Max transaction length %u\n", 
-			  get_jp_journal_max_trans_len (sb_jp (sb)));
+			  reiserfs_jp_get_tlen (reiserfs_sb_jp (sb)));
     }
 
     if (j_filename && strcmp (j_filename, fs->fs_file_name)) {
 	    reiserfs_warning (stdout, "Space on this device reserved by journal: "
-			      "%u\n", get_sb_reserved_for_journal (sb));
+			      "%u\n", reiserfs_sb_get_reserved (sb));
     }
     
     if (mode & DEBUG_MODE) {
 	reiserfs_warning (stdout, "Filesystem state 0x%x\n", 
-			  get_sb_fs_state (sb));
+			  reiserfs_sb_get_state (sb));
 	reiserfs_warning (stdout, "sb_version %u\n", 
-			  get_sb_version (sb));
+			  reiserfs_sb_get_version (sb));
     }
 
-    if (get_reiserfs_format (sb) == REISERFS_FORMAT_3_6) {
+    if (reiserfs_super_format (sb) == REISERFS_FORMAT_3_6) {
         reiserfs_warning (stdout, "inode generation number: %u\n", 
-			  get_sb_v2_inode_generation (sb));
+			  reiserfs_sb_get_gen (sb));
         reiserfs_warning (stdout, "UUID: %U\n", sb->s_uuid);
-        if (strcmp (sb->s_label, ""))
+        if (strcmp ((char *)sb->s_label, ""))
 		reiserfs_warning (stdout, "LABEL: %s\n", sb->s_label);
     }
 
@@ -397,11 +401,11 @@
 static void set_hash_function (char * str)
 {
     if (!strcmp (str, "tea"))
-	    Hash = TEA_HASH;
+	    Hash = REISERFS_HASH_TEA;
     else if (!strcmp (str, "rupasov"))
-	    Hash = YURA_HASH;
+	    Hash = REISERFS_HASH_YURA;
     else if (!strcmp (str, "r5"))
-	    Hash = R5_HASH;
+	    Hash = REISERFS_HASH_R5;
     else
 	    message("wrong hash type specified. Using default");
 }
@@ -439,7 +443,7 @@
 {
     *b_size = str2int (str);
       
-    if (!is_blocksize_correct (*b_size))
+    if (!reiserfs_fs_blksize_check (*b_size))
         reiserfs_exit (1, "%s: wrong blocksize %s specified, "
 		       "only power of 2 from 512-8192 interval "
 		       "are supported", program_name, str);
@@ -452,20 +456,20 @@
 }
 
 
-/* reiserfs_create_journal will check this */
+/* reiserfs_journal_create will check this */
 static void set_journal_device_size (char * str)
 {
     Journal_size = str2int (str);
 /*
     if (Journal_size < JOURNAL_MIN_SIZE)
-		die ("%s: wrong journal size specified: %lu. Should be at least %u",
+		misc_die ("%s: wrong journal size specified: %lu. Should be at least %u",
 			 program_name, 
 			 Journal_size + 1, JOURNAL_MIN_SIZE + 1);
 */
 }
 
 
-/* reiserfs_create_journal will check this */
+/* reiserfs_journal_create will check this */
 static void set_offset_in_journal_device (char * str)
 {
 	Offset = str2int( str );
@@ -478,8 +482,8 @@
 	return 0;
     
     if (Journal_size && Journal_size != 
-	journal_default_size(REISERFS_DISK_OFFSET_IN_BYTES / blocksize, 
-			     blocksize) + 1)
+	reiserfs_journal_default(REISERFS_DISK_OFFSET_IN_BYTES / blocksize, 
+				 blocksize) + 1)
 	/* journal size is set and it is not default size */
 	return 0;
     
@@ -495,8 +499,11 @@
    otherwise - mkreiserfs fails */
 static int select_format (void)
 {
+#ifdef HAVE_UNAME
 	struct utsname sysinfo;
-
+#endif
+	char *release = NULL;
+	
 	if (Format) {
 		if (!strcmp (Format, "3.5"))
 			return REISERFS_FORMAT_3_5;
@@ -508,6 +515,7 @@
 		return REISERFS_FORMAT_3_6;
 	}
 	
+#ifdef HAVE_UNAME
 	reiserfs_warning (stdout, "Guessing about desired format.. ");
 	
 	if (uname (&sysinfo) == -1) {
@@ -516,11 +524,20 @@
 	}
 	
 	reiserfs_warning(stdout, "Kernel %s is running.\n", sysinfo.release);
+	release = sysinfo.release;
+#endif
+	if (!release) {
+		message("Failed to detect the running kernel. To create "
+			"reiserfs filesystem\nspecify desired format with "
+			"--format. Choose 3.5 if you use 2.2 kernel;\n3.6 "
+			"if 2.4 or higher.");
+		exit(1);
+	}
 	
-	if (strncmp (sysinfo.release, "2.4", 3) >= 0)
+	if (strncmp (release, "2.4", 3) >= 0)
 		return REISERFS_FORMAT_3_6;
 
-	if (strncmp (sysinfo.release, "2.2", 3)) {
+	if (strncmp (release, "2.2", 3)) {
 		message( "You should run either 2.2 or 2.4 or higher to be able "
 		    "to create reiserfs filesystem or specify desired format with --format");
 		exit (1);
@@ -530,6 +547,27 @@
     return REISERFS_FORMAT_3_5;
 }
 
+/* Reads the "CREDITS" file and prints one paragraph from it. */
+static void mkfs_print_credit(FILE *out) {
+    char *line;
+    __u32 num1, num2;
+    
+    fprintf(out, "A pair of credits:\n");
+    
+    srandom (time (0));
+    
+    num1 = random() % CREDITS_COUNT;
+    line = credits[num1];
+    fprintf(out, "%s\n", line);
+    
+    while ((num1 == (num2 = random() % CREDITS_COUNT))) {}
+    
+    line = credits[num2];
+    
+    fprintf(out, "%s\n", line);
+}
+
+
 
 int main (int argc, char **argv)
 {
@@ -606,7 +644,7 @@
 			break;
 
 		case 'B': /* --badblock-list */
-			asprintf (&badblocks_file, "%s", optarg);			
+			badblocks_file = optarg;
 			break;
 		
 		case 'h': /* --hash */
@@ -654,9 +692,9 @@
 		}
     }
 
-    print_banner (program_name);
+    util_print_banner(program_name);
 
-    misc_print_credit(stdout);
+    mkfs_print_credit(stdout);
     printf("\n");
     
     if (mode & QUIET_MODE)
@@ -673,7 +711,7 @@
         fs_size = str2int (argv[optind + 1]);
     } else if (optind == argc - 1) {
         /* number of blocks is not specified */
-        if (!(fs_size = count_blocks (device_name, Block_size)))
+        if (!(fs_size = misc_device_count_blocks (device_name, Block_size)))
 		exit(1);
     } else {
         print_usage_and_exit ();
@@ -682,29 +720,28 @@
     if (is_journal_default (device_name, jdevice_name, Block_size))
         Create_default_journal = 1;
     
-    if (!(mode & QUIET_MODE) && !can_we_format_it (device_name, force))
+    if (!(mode & QUIET_MODE) && !util_device_formatable (device_name, force))
         return 1;
 	
     if (jdevice_name)
-        if (!(mode & QUIET_MODE) && !can_we_format_it (jdevice_name, force))
+        if (!(mode & QUIET_MODE) && !util_device_formatable (jdevice_name, force))
             return 1;
 
-    fs = reiserfs_create (device_name, select_format(), fs_size, Block_size, 
+    fs = reiserfs_fs_create (device_name, select_format(), fs_size, Block_size, 
 	Create_default_journal, 1);
     
     if (!fs) {
         return 1;
     }
 		
-    if (!reiserfs_create_journal (fs, jdevice_name, Offset, Journal_size, 
+    if (!reiserfs_journal_create (fs, jdevice_name, Offset, Journal_size, 
 	Max_trans_size)) 
     {
         return 1;
     }
 
-    if (!reiserfs_create_ondisk_bitmap (fs)) {
+    if (!(fs->fs_bitmap2 = reiserfs_bitmap_create(fs_size)))
         return 1;
-    }
 
     /* these fill buffers (super block, first bitmap, root block) with
        reiserfs structures */
@@ -716,15 +753,14 @@
 #endif
 
     if (badblocks_file) {
-	if (create_badblock_bitmap (fs, badblocks_file))
+	if (util_badblock_load (fs, badblocks_file))
 	    exit(1);
     }
 
-
     make_super_block (fs);
     make_bitmap (fs);
     make_root_block (fs);
-    add_badblock_list (fs, 1);
+    reiserfs_badblock_flush (fs, 1);
 
     report (fs, jdevice_name);
 
@@ -734,7 +770,7 @@
         if (jdevice_name && strcmp (jdevice_name, device_name))
             fprintf (stderr, " AND ON JOURNAL DEVICE '%s'", jdevice_name);
 
-        if (!user_confirmed (stderr, "!\nContinue (y/n):", "y\n"))
+        if (!util_user_confirmed (stderr, "!\nContinue (y/n):", "y\n"))
             return 1;
     }
 
@@ -743,7 +779,7 @@
 
     zero_journal (fs);
 
-    reiserfs_close (fs);
+    reiserfs_fs_close (fs);
 
     printf ("Syncing.."); fflush (stdout);
     sync ();
diff --git a/utils/resizer/Makefile.am b/utils/resizer/Makefile.am
new file mode 100644
index 0000000..950dffc
--- /dev/null
+++ b/utils/resizer/Makefile.am
@@ -0,0 +1,27 @@
+sbin_PROGRAMS	          = resizefs.reiserfs
+
+man_MANS                  = resizefs.reiserfs.8
+EXTRA_DIST                = resizefs.reiserfs.8
+
+resizefs_reiserfs_SOURCES = fe.c resize_reiserfs.c do_shrink.c resize.h
+resizefs_reiserfs_LDADD	  = $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			    $(top_builddir)/libutil/libutil-static.a \
+			    $(top_builddir)/libmisc/libmisc-static.a
+resizefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+resizefs_reiserfs_CFLAGS  = @CFLAGS@
+
+INCLUDES		  = -I$(top_srcdir)/include
+
+uninstall-resize_reiserfs:
+	if test -f $(DESTDIR)$(sbindir)/resize_reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \
+	fi;
+
+install-resize_reiserfs:
+	if test -f $(DESTDIR)$(sbindir)/resizefs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \
+		ln $(DESTDIR)$(sbindir)/resizefs.reiserfs $(DESTDIR)$(sbindir)/resize_reiserfs; \
+	fi;
+
+install-data-local: install-resize_reiserfs
+uninstall-local: uninstall-resize_reiserfs
diff --git a/utils/resizer/Makefile.in b/utils/resizer/Makefile.in
new file mode 100644
index 0000000..85baccf
--- /dev/null
+++ b/utils/resizer/Makefile.in
@@ -0,0 +1,533 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(resizefs_reiserfs_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+sbin_PROGRAMS = resizefs.reiserfs$(EXEEXT)
+subdir = utils/resizer
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(sbin_PROGRAMS)
+am_resizefs_reiserfs_OBJECTS = resizefs_reiserfs-fe.$(OBJEXT) \
+	resizefs_reiserfs-resize_reiserfs.$(OBJEXT) \
+	resizefs_reiserfs-do_shrink.$(OBJEXT)
+resizefs_reiserfs_OBJECTS = $(am_resizefs_reiserfs_OBJECTS)
+resizefs_reiserfs_DEPENDENCIES =  \
+	$(top_builddir)/libreiserfs/libreiserfs-static.a \
+	$(top_builddir)/libutil/libutil-static.a \
+	$(top_builddir)/libmisc/libmisc-static.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(resizefs_reiserfs_SOURCES)
+DIST_SOURCES = $(resizefs_reiserfs_SOURCES)
+man8dir = $(mandir)/man8
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+man_MANS = resizefs.reiserfs.8
+EXTRA_DIST = resizefs.reiserfs.8
+resizefs_reiserfs_SOURCES = fe.c resize_reiserfs.c do_shrink.c resize.h
+resizefs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			    $(top_builddir)/libutil/libutil-static.a \
+			    $(top_builddir)/libmisc/libmisc-static.a
+
+resizefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+resizefs_reiserfs_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/resizer/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  utils/resizer/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+	done
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+resizefs.reiserfs$(EXEEXT): $(resizefs_reiserfs_OBJECTS) $(resizefs_reiserfs_DEPENDENCIES) 
+	@rm -f resizefs.reiserfs$(EXEEXT)
+	$(LINK) $(resizefs_reiserfs_LDFLAGS) $(resizefs_reiserfs_OBJECTS) $(resizefs_reiserfs_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizefs_reiserfs-do_shrink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizefs_reiserfs-fe.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+resizefs_reiserfs-fe.o: fe.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-fe.o -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" -c -o resizefs_reiserfs-fe.o `test -f 'fe.c' || echo '$(srcdir)/'`fe.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" "$(DEPDIR)/resizefs_reiserfs-fe.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='fe.c' object='resizefs_reiserfs-fe.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-fe.o `test -f 'fe.c' || echo '$(srcdir)/'`fe.c
+
+resizefs_reiserfs-fe.obj: fe.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-fe.obj -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" -c -o resizefs_reiserfs-fe.obj `if test -f 'fe.c'; then $(CYGPATH_W) 'fe.c'; else $(CYGPATH_W) '$(srcdir)/fe.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo" "$(DEPDIR)/resizefs_reiserfs-fe.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-fe.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='fe.c' object='resizefs_reiserfs-fe.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-fe.obj `if test -f 'fe.c'; then $(CYGPATH_W) 'fe.c'; else $(CYGPATH_W) '$(srcdir)/fe.c'; fi`
+
+resizefs_reiserfs-resize_reiserfs.o: resize_reiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-resize_reiserfs.o -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" -c -o resizefs_reiserfs-resize_reiserfs.o `test -f 'resize_reiserfs.c' || echo '$(srcdir)/'`resize_reiserfs.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='resize_reiserfs.c' object='resizefs_reiserfs-resize_reiserfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-resize_reiserfs.o `test -f 'resize_reiserfs.c' || echo '$(srcdir)/'`resize_reiserfs.c
+
+resizefs_reiserfs-resize_reiserfs.obj: resize_reiserfs.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-resize_reiserfs.obj -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" -c -o resizefs_reiserfs-resize_reiserfs.obj `if test -f 'resize_reiserfs.c'; then $(CYGPATH_W) 'resize_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/resize_reiserfs.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo" "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-resize_reiserfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='resize_reiserfs.c' object='resizefs_reiserfs-resize_reiserfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-resize_reiserfs.obj `if test -f 'resize_reiserfs.c'; then $(CYGPATH_W) 'resize_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/resize_reiserfs.c'; fi`
+
+resizefs_reiserfs-do_shrink.o: do_shrink.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-do_shrink.o -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" -c -o resizefs_reiserfs-do_shrink.o `test -f 'do_shrink.c' || echo '$(srcdir)/'`do_shrink.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" "$(DEPDIR)/resizefs_reiserfs-do_shrink.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='do_shrink.c' object='resizefs_reiserfs-do_shrink.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-do_shrink.o `test -f 'do_shrink.c' || echo '$(srcdir)/'`do_shrink.c
+
+resizefs_reiserfs-do_shrink.obj: do_shrink.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -MT resizefs_reiserfs-do_shrink.obj -MD -MP -MF "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" -c -o resizefs_reiserfs-do_shrink.obj `if test -f 'do_shrink.c'; then $(CYGPATH_W) 'do_shrink.c'; else $(CYGPATH_W) '$(srcdir)/do_shrink.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo" "$(DEPDIR)/resizefs_reiserfs-do_shrink.Po"; else rm -f "$(DEPDIR)/resizefs_reiserfs-do_shrink.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='do_shrink.c' object='resizefs_reiserfs-do_shrink.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resizefs_reiserfs_CFLAGS) $(CFLAGS) -c -o resizefs_reiserfs-do_shrink.obj `if test -f 'do_shrink.c'; then $(CYGPATH_W) 'do_shrink.c'; else $(CYGPATH_W) '$(srcdir)/do_shrink.c'; fi`
+uninstall-info-am:
+install-man8: $(man8_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)"
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+uninstall-man8:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am: install-sbinPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man8
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-local uninstall-man \
+	uninstall-sbinPROGRAMS
+
+uninstall-man: uninstall-man8
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-sbinPROGRAMS ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-data-local install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-man8 install-sbinPROGRAMS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am uninstall-local uninstall-man \
+	uninstall-man8 uninstall-sbinPROGRAMS
+
+
+uninstall-resize_reiserfs:
+	if test -f $(DESTDIR)$(sbindir)/resize_reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \
+	fi;
+
+install-resize_reiserfs:
+	if test -f $(DESTDIR)$(sbindir)/resizefs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/resize_reiserfs; \
+		ln $(DESTDIR)$(sbindir)/resizefs.reiserfs $(DESTDIR)$(sbindir)/resize_reiserfs; \
+	fi;
+
+install-data-local: install-resize_reiserfs
+uninstall-local: uninstall-resize_reiserfs
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/resizer/do_shrink.c b/utils/resizer/do_shrink.c
new file mode 100644
index 0000000..3f96d21
--- /dev/null
+++ b/utils/resizer/do_shrink.c
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "resize.h"
+#include "misc/unaligned.h"
+#include "util/misc.h"
+
+#include <time.h>
+#include <fcntl.h>
+
+static unsigned long int_node_cnt   = 0, int_moved_cnt   = 0;
+static unsigned long leaf_node_cnt  = 0, leaf_moved_cnt  = 0;
+static unsigned long unfm_node_cnt  = 0, unfm_moved_cnt  = 0;
+static unsigned long total_node_cnt = 0;
+static unsigned long total_moved_cnt = 0;
+
+static unsigned long unused_block;
+static unsigned long blocks_used;
+static int block_count_mismatch = 0;
+
+static reiserfs_bitmap_t * bmp;
+static reiserfs_sb_t * ondisk_sb;
+
+/* abnornal exit from block reallocation process */
+static void quit_resizer(reiserfs_filsys_t * fs)
+{
+	/* save changes to bitmap blocks */
+	reiserfs_fs_close (fs);
+	/* leave fs in ERROR state */
+	reiserfs_exit(1, "fs shrinking was not completed successfully, "
+		      "run reiserfsck.");
+}
+
+/* block moving */
+static unsigned long move_generic_block(reiserfs_filsys_t * fs, 
+					unsigned long block, 
+					unsigned long bnd, int h)
+{
+    reiserfs_bh_t * bh, * bh2;
+
+	/* primitive fsck */
+	if (block > reiserfs_sb_get_blocks(ondisk_sb)) {
+		fprintf(stderr, "resize_reiserfs: invalid block number "
+			"(%lu) found.\n", block);
+		quit_resizer(fs);
+	}
+	
+	/* progress bar, 3D style :) */
+	if (opt_verbose)
+	    util_misc_progress(stderr, &total_node_cnt, blocks_used, 1, 0);
+	else
+	    total_node_cnt ++;
+
+	/* infinite loop check */
+	if( total_node_cnt > blocks_used && !block_count_mismatch) {
+		fputs("resize_reiserfs: warning: block count exeeded\n",stderr);
+		block_count_mismatch = 1;
+	}
+
+	if (block < bnd) /* block will not be moved */
+		return 0;
+	
+	/* move wrong block */ 
+	bh = reiserfs_buffer_read(fs->fs_dev, block, fs->fs_blocksize);
+
+	if (!bh)
+	    reiserfs_exit (1, "move_generic_block: reiserfs_buffer_read failed.\n");
+
+	reiserfs_bitmap_find_zero_bit(bmp, &unused_block);
+	if (unused_block == 0 || unused_block >= bnd) {
+		fputs ("resize_reiserfs: can\'t find free block\n", stderr);
+		quit_resizer(fs);
+	}
+
+	/* blocknr changing */
+	bh2 = reiserfs_buffer_open(fs->fs_dev, unused_block, fs->fs_blocksize);
+	memcpy(bh2->b_data, bh->b_data, bh2->b_size);
+	reiserfs_bitmap_clear_bit(bmp, block);
+	reiserfs_bitmap_set_bit(bmp, unused_block);
+
+	reiserfs_buffer_close(bh);
+	reiserfs_buffer_mkuptodate(bh2,1);
+	reiserfs_buffer_mkdirty(bh2);
+	reiserfs_buffer_write(bh2);
+	reiserfs_buffer_close(bh2);
+
+	total_moved_cnt++;
+	return unused_block;
+}
+
+static unsigned long move_unformatted_block(reiserfs_filsys_t * fs, unsigned long block, unsigned long bnd, int h)
+{
+	unsigned long b;
+	unfm_node_cnt++;
+	b = move_generic_block(fs, block, bnd, h);
+	if (b)
+		unfm_moved_cnt++;
+	return b;		
+}
+
+
+/* recursive function processing all tree nodes */
+static unsigned long move_formatted_block(reiserfs_filsys_t * fs, 
+					  unsigned long block, 
+					  unsigned long bnd, int h)
+{
+    reiserfs_bh_t * bh;
+    reiserfs_ih_t *ih;
+    unsigned long new_blocknr = 0;
+    int node_is_internal = 0;
+    unsigned int i, j;
+	
+    bh = reiserfs_buffer_read(fs->fs_dev, block, fs->fs_blocksize);
+    
+    if (!bh)
+	reiserfs_exit (1, "move_formatted_block: reiserfs_buffer_read failed");
+
+    if (reiserfs_leaf_head (bh)) {
+	leaf_node_cnt++;
+
+	for (i = 0; i < reiserfs_node_items(bh); i++) {
+	    ih = reiserfs_ih_at(bh, i);
+
+	    /* skip the bad blocks. */
+	    if (reiserfs_key_get_oid (&ih->ih_key) == REISERFS_BAD_OID &&
+		reiserfs_key_get_did (&ih->ih_key) == REISERFS_BAD_DID)
+	    {
+		continue;
+	    }
+
+	    if (reiserfs_ih_ext(ih)) {
+		__u32 * extent;
+
+		extent = (__u32 *)reiserfs_item_by_ih (bh, ih);
+		for (j = 0; j < reiserfs_ext_count(ih); j++) {
+		    unsigned long  unfm_block;
+
+		    /* hole */
+		    if (d32_get (extent, j) == 0) 
+			continue;
+
+		    unfm_block = move_unformatted_block(fs, d32_get (extent, j),
+							bnd, h + 1);
+		    if (unfm_block) {
+			d32_put (extent, j, unfm_block);
+			reiserfs_buffer_mkdirty(bh);
+		    }
+		}
+	    }	
+	}
+    } else if (reiserfs_int_head (bh)) { /* internal node */
+	int_node_cnt++;
+	node_is_internal = 1;
+
+	for (i=0; i <= reiserfs_node_items(bh); i++) {
+	    unsigned long moved_block;
+	    moved_block = 
+		    move_formatted_block(fs, reiserfs_dc_get_nr(
+				reiserfs_int_at (bh, i)), bnd, h+1);
+	    if (moved_block) {
+		reiserfs_dc_set_nr (reiserfs_int_at (bh, i), 
+				      moved_block);
+		reiserfs_buffer_mkdirty(bh);
+	    }
+	}
+    } else {
+	misc_die("Block (%lu) has invalid format\n", block);
+    }
+
+    if (reiserfs_buffer_isdirty(bh)) {
+	reiserfs_buffer_mkuptodate(bh,1);
+	reiserfs_buffer_write(bh);
+    }
+
+    reiserfs_buffer_close(bh);	
+
+    new_blocknr = move_generic_block(fs, block, bnd, h);
+    if (new_blocknr) {
+	if (node_is_internal)
+	    int_moved_cnt++;
+	else
+	    leaf_moved_cnt++;
+    }
+
+    return new_blocknr;
+}
+
+int shrink_fs(reiserfs_filsys_t * fs, long long int new_blocks)
+{
+	unsigned long n_root_block;
+	unsigned int bmap_nr_new;
+	unsigned int bmap_nr_old;
+	unsigned long bad_count;
+	unsigned long old_blocks;
+	
+	ondisk_sb = fs->fs_ondisk_sb;
+	
+	old_blocks = reiserfs_sb_get_blocks(ondisk_sb);
+	bmap_nr_old = reiserfs_bmap_nr(old_blocks, fs->fs_blocksize);
+	bmap_nr_new = reiserfs_bmap_nr(new_blocks, fs->fs_blocksize);
+
+	/* is shrinking possible ? */
+	if (old_blocks - new_blocks > 
+	    reiserfs_sb_get_free(ondisk_sb) + bmap_nr_old - bmap_nr_new) 
+	{
+	    fprintf(stderr, "resize_reiserfs: can\'t shrink fs; too many "
+		"blocks already allocated\n");
+	    return -1;
+	}
+
+	/* warn about alpha version */
+	{
+		int c;
+
+		printf(
+		    "You are running BETA version of reiserfs shrinker.\n"
+		    "This version is only for testing or VERY CAREFUL use.\n"
+		    "Backup of you data is recommended.\n\n"
+		    "Do you want to continue? [y/N]:"
+		);
+		fflush(stdout);
+		c = getchar();
+		if (c != 'y' && c != 'Y')
+			exit(1);
+	}
+
+	reiserfs_fs_reopen(fs, O_RDWR);
+	if (reiserfs_bitmap_open(fs))
+	    reiserfs_exit(1, "cannot open ondisk bitmap");
+	bmp = fs->fs_bitmap2;
+	ondisk_sb = fs->fs_ondisk_sb;
+
+	reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_ERROR);
+	reiserfs_buffer_mkuptodate(fs->fs_super_bh, 1);
+	reiserfs_buffer_mkdirty(fs->fs_super_bh);
+	reiserfs_buffer_write(fs->fs_super_bh);
+
+	/* calculate number of data blocks */		
+	blocks_used = 
+	    old_blocks
+	    - reiserfs_sb_get_free(fs->fs_ondisk_sb)
+	    - bmap_nr_old
+	    - reiserfs_jp_get_size(reiserfs_sb_jp (fs->fs_ondisk_sb))
+	    - REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize
+	    - 2; /* superblock itself and 1 descriptor after the journal */
+
+	unused_block = 1;
+
+	if (opt_verbose) {
+		printf("Processing the tree: ");
+		fflush(stdout);
+	}
+
+	n_root_block = move_formatted_block(fs, reiserfs_sb_get_root(ondisk_sb), 
+	    new_blocks, 0);
+	
+	if (n_root_block)
+	    reiserfs_sb_set_root (ondisk_sb, n_root_block);
+
+	if (opt_verbose)
+	    printf ("\n\nnodes processed (moved):\n"
+		    "int        %lu (%lu),\n"
+		    "leaves     %lu (%lu),\n" 
+		    "unfm       %lu (%lu),\n"
+		    "total      %lu (%lu).\n\n",
+		    int_node_cnt, int_moved_cnt,
+		    leaf_node_cnt, leaf_moved_cnt, 
+		    unfm_node_cnt, unfm_moved_cnt,
+		    (unsigned long)total_node_cnt, total_moved_cnt);
+
+	if (block_count_mismatch) {
+	    fprintf(stderr, "resize_reiserfs: data block count %lu"
+		    " doesn\'t match data block count %lu from super block\n",
+		    (unsigned long)total_node_cnt, blocks_used);
+	}
+
+	{
+	    unsigned long l;
+
+	    /* make sure that none of truncated block are in use */
+	    printf("check for used blocks in truncated region\n");
+	    for (l = new_blocks; l < fs->fs_bitmap2->bm_bit_size; l ++) {
+		if ((l % (fs->fs_blocksize * 8)) == 0)
+		    continue;
+		if (reiserfs_bitmap_test_bit (fs->fs_bitmap2, l))
+		    printf ("<%lu>", l);
+	    }
+	    printf("\n");
+	}
+
+	reiserfs_badblock_traverse(fs, reiserfs_badblock_extract, NULL);
+	
+	if (fs->fs_badblocks_bm) {
+		bad_count = reiserfs_bitmap_ones(fs->fs_badblocks_bm);
+		reiserfs_bitmap_shrink (fs->fs_badblocks_bm, new_blocks);
+		reiserfs_badblock_flush(fs, 1);
+		bad_count -= reiserfs_bitmap_ones(fs->fs_badblocks_bm);
+	} else
+		bad_count = 0;
+	
+	reiserfs_bitmap_shrink (fs->fs_bitmap2, new_blocks);
+
+	reiserfs_sb_set_free (ondisk_sb, reiserfs_sb_get_free(ondisk_sb)
+			    - (old_blocks - new_blocks)
+			    + (bmap_nr_old - bmap_nr_new)
+			    + bad_count);
+	reiserfs_sb_set_blocks (ondisk_sb, new_blocks);
+	reiserfs_sb_set_bmaps (ondisk_sb, bmap_nr_new);
+
+	return 0;
+}
diff --git a/resize_reiserfs/fe.c b/utils/resizer/fe.c
similarity index 60%
rename from resize_reiserfs/fe.c
rename to utils/resizer/fe.c
index 5b65117..351db47 100644
--- a/resize_reiserfs/fe.c
+++ b/utils/resizer/fe.c
@@ -3,23 +3,32 @@
  * reiserfsprogs/README
  */
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include "resize.h"
+#include "util/mntent.h"
+
+#include <errno.h>
+#include <sys/mount.h>
+#include <mntent.h>
 
 /* the front-end for kernel on-line resizer */
 int resize_fs_online(char * devname, long long int blocks) {
 	struct mntent *mnt;
-	char buf[40];
+	char buf[64];
 	
 	/* Find the mount entry. */
-	if ((mnt = misc_mntent(devname)) == NULL)
-		die ("resize_reiserfs: can't find mount entry\n");
+	if ((mnt = util_mntent(devname)) == NULL)
+		misc_die ("resize_reiserfs: can't find mount entry\n");
 
 	sprintf(buf,"resize=%lld", blocks);
 
 	if (mount(mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type,
 		  (unsigned long)(MS_MGC_VAL << 16 | MS_REMOUNT), buf)) 
 	{
-		die ("resize_reiserfs: remount failed: %s\n", 
+		misc_die ("resize_reiserfs: remount failed: %s\n", 
 		     strerror(errno));
 	}
 
diff --git a/utils/resizer/resize.h b/utils/resizer/resize.h
new file mode 100644
index 0000000..538f48e
--- /dev/null
+++ b/utils/resizer/resize.h
@@ -0,0 +1,26 @@
+/* 
+ * Copyright 2000-2004 by Hans Reiser, licensing governed by 
+ * reiserfsprogs/README
+ */
+
+#include "reiserfs/libreiserfs.h"
+
+#define print_usage_and_exit() {\
+ fprintf (stderr, "Usage: %s  [-s[+|-]#[G|M|K]] [-fqvV] device\n\n", argv[0]);\
+ exit(16);\
+}
+
+/* reiserfs_resize.c */
+extern reiserfs_bh_t * g_sb_bh;
+extern char * g_progname;
+
+extern int opt_force;
+extern int opt_verbose;
+extern int opt_nowrite;
+extern int opt_safe;
+
+/* fe.c */
+extern int resize_fs_online(char * devname, long long int blocks);
+
+/* do_shrink.c */
+extern int shrink_fs(reiserfs_filsys_t *, long long int blocks);
diff --git a/resize_reiserfs/resize_reiserfs.c b/utils/resizer/resize_reiserfs.c
similarity index 69%
rename from resize_reiserfs/resize_reiserfs.c
rename to utils/resizer/resize_reiserfs.c
index 691d855..37f9a98 100644
--- a/resize_reiserfs/resize_reiserfs.c
+++ b/utils/resizer/resize_reiserfs.c
@@ -3,17 +3,20 @@
  * reiserfsprogs/README
  */
 
-/*  
- * Written by Alexander Zarochentcev.
- * 
- * FS resize utility 
- *
- */
-
-#define _GNU_SOURCE
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
 
 #include "resize.h"
-#include <limits.h>
+#include "misc/device.h"
+#include "misc/malloc.h"
+#include "util/device.h"
+#include "util/print.h"
+
+#include <getopt.h>
+#include <errno.h>
+#include <fcntl.h>
+
 
 int opt_banner = 0;
 int opt_force = 0;
@@ -22,8 +25,6 @@
 int opt_safe = 0;
 int opt_skipj = 0;
 
-char * g_progname;
-
 /* calculate the new fs size (in blocks) from old fs size and the string
    representation of new size */
 static long long int calc_new_fs_size(unsigned long count, 
@@ -63,8 +64,8 @@
 }
 
 /* print some fs parameters */
-static void sb_report(struct reiserfs_super_block * sb1,
-		      struct reiserfs_super_block * sb2)
+static void sb_report(reiserfs_sb_t * sb1,
+		      reiserfs_sb_t * sb2)
 {
     printf(
 	"ReiserFS report:\n"
@@ -72,19 +73,19 @@
 	"block count           %d (%d)\n"
 	"free blocks           %d (%d)\n"
 	"bitmap block count    %d (%d)\n", 
-	get_sb_block_size(sb1),
-	get_sb_block_count(sb1), get_sb_block_count(sb2),
-	get_sb_free_blocks(sb1), get_sb_free_blocks(sb2),
-	get_sb_bmap_nr(sb1), get_sb_bmap_nr(sb2));
+	reiserfs_sb_get_blksize(sb1),
+	reiserfs_sb_get_blocks(sb1), reiserfs_sb_get_blocks(sb2),
+	reiserfs_sb_get_free(sb1), reiserfs_sb_get_free(sb2),
+	reiserfs_sb_get_bmaps(sb1), reiserfs_sb_get_bmaps(sb2));
 };
 
 /* conditional bwrite */
-static int bwrite_cond (struct buffer_head * bh)
+static int bwrite_cond (reiserfs_bh_t * bh)
 {
     if(!opt_nowrite) { 
-	mark_buffer_uptodate(bh,1);
-	mark_buffer_dirty(bh);
-	bwrite(bh);
+	reiserfs_buffer_mkuptodate(bh,1);
+	reiserfs_buffer_mkdirty(bh);
+	reiserfs_buffer_write(bh);
     }
     return 0;
 }
@@ -93,35 +94,38 @@
 /* the first one of the most important functions */
 static int expand_fs (reiserfs_filsys_t * fs, long long int block_count_new) {
     unsigned int bmap_nr_new, bmap_nr_old;
-    struct reiserfs_super_block * sb;
+    unsigned int block_count_old;
+    reiserfs_sb_t * sb;
     unsigned int i;
 
 
-    reiserfs_reopen(fs, O_RDWR);
-    if (reiserfs_open_ondisk_bitmap (fs))
+    reiserfs_fs_reopen(fs, O_RDWR);
+    if (reiserfs_bitmap_open(fs))
 	reiserfs_exit(1, "cannot open ondisk bitmap");
 
     sb = fs->fs_ondisk_sb;
 
-    set_sb_fs_state (fs->fs_ondisk_sb, FS_ERROR);
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_ERROR);
 
     bwrite_cond(fs->fs_super_bh);
 
 
-    if (reiserfs_expand_bitmap(fs->fs_bitmap2, block_count_new))
+    if (reiserfs_bitmap_expand (fs->fs_bitmap2, block_count_new))
 	reiserfs_exit(1, "cannot expand bitmap\n");
 
 
     /* count bitmap blocks in new fs */
-    bmap_nr_new = (block_count_new - 1) / (fs->fs_blocksize * 8) + 1;
-    bmap_nr_old = get_sb_bmap_nr(sb);
-	
+    block_count_old = reiserfs_sb_get_blocks(sb);
+    bmap_nr_old = reiserfs_bmap_nr(block_count_old, fs->fs_blocksize);
+    bmap_nr_new = reiserfs_bmap_nr(block_count_new, fs->fs_blocksize);
+
     /* update super block buffer*/
-    set_sb_free_blocks (sb, get_sb_free_blocks(sb) + 
-			(block_count_new - get_sb_block_count(sb)) - 
+    reiserfs_sb_set_free (sb, reiserfs_sb_get_free(sb) + 
+			(block_count_new - reiserfs_sb_get_blocks(sb)) - 
 			(bmap_nr_new - bmap_nr_old));
-    set_sb_block_count (sb, block_count_new);
-    set_sb_bmap_nr (sb, bmap_nr_new);
+    reiserfs_sb_set_blocks (sb, block_count_new);
+    reiserfs_sb_set_bmaps (sb, reiserfs_bmap_over(bmap_nr_new) ? 
+			   0 : bmap_nr_new);
 
     /* mark new bitmap blocks as used */
     for (i = bmap_nr_old; i < bmap_nr_new; i++)
@@ -147,30 +151,30 @@
 	    return new_size;
     }
     
-    if (new_size == get_sb_block_count(fs->fs_ondisk_sb)) {
+    if (new_size == reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) {
 	reiserfs_warning (stderr, "%s already is of the needed size. "
 			  "Nothing to be done\n\n", fs->fs_file_name);
 	return 1;
     }
 
-    if (new_size < get_sb_block_count(fs->fs_ondisk_sb)) {
-	if (misc_device_mounted(fs->fs_file_name) > 0) {
+    if (new_size < reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) {
+	if (util_device_mounted(fs->fs_file_name) > 0) {
 	    reiserfs_warning (stderr, "Can't shrink filesystem on-line.\n\n");
 	    return 1;
 	}
     }
 
-    if (new_size >= get_sb_block_count(fs->fs_ondisk_sb)) {
-	loff_t offset = (loff_t)new_size * fs->fs_blocksize - 1;
+    if (new_size >= reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) {
+	unsigned long long offset = (unsigned long long)new_size * fs->fs_blocksize - 1;
 	
-	if(!valid_offset(fs->fs_dev, offset)) {
+	if(!misc_device_valid_offset(fs->fs_dev, offset)) {
 	    reiserfs_warning (stderr, "%s is of %lu blocks size only with "
 			      "reiserfs of %d blocks\nsize on it. You are "
 			      "trying to expand reiserfs up to %lu blocks "
 			      "size.\nYou probably forgot to expand your "
 			      "partition size.\n\n", fs->fs_file_name,
-			      count_blocks(fs->fs_file_name, fs->fs_blocksize),
-			      get_sb_block_count(fs->fs_ondisk_sb), new_size);
+			      misc_device_count_blocks(fs->fs_file_name, fs->fs_blocksize),
+			      reiserfs_sb_get_blocks(fs->fs_ondisk_sb), new_size);
 	    return 1;
 	}
     }
@@ -183,17 +187,15 @@
     char * devname;
     char * jdevice_name = NULL;
     reiserfs_filsys_t * fs;
-    struct reiserfs_super_block * sb;
+    reiserfs_sb_t * sb;
 
     int c;
     int error;
 
-    struct reiserfs_super_block *sb_old;
+    reiserfs_sb_t *sb_old;
 
     long long int block_count_new;
 
-    g_progname = basename(argv[0]);
-    
     if (argc < 2)
 	print_usage_and_exit();
 	
@@ -235,7 +237,7 @@
 	}
     }
 
-    print_banner (g_progname);
+    util_print_banner (argv[0]);
     
     if (opt_banner)
 	exit(0);
@@ -243,7 +245,7 @@
 
     devname = argv[optind];
 
-    fs = reiserfs_open(devname, O_RDONLY, &error, 0, 1);
+    fs = reiserfs_fs_open(devname, O_RDONLY, &error, 0, 1);
     if (!fs) {
 	if (error) {
 		reiserfs_exit(1, "cannot open '%s': %s", 
@@ -253,7 +255,12 @@
 	}
     }
 
-    if (reiserfs_open_journal (fs, jdevice_name, O_RDWR | O_LARGEFILE)) {
+    if (reiserfs_journal_open (fs, jdevice_name, O_RDWR 
+#ifdef O_LARGEFILE
+			       | O_LARGEFILE
+#endif
+			       )) 
+    {
 	reiserfs_exit(1, "Failed to open the journal device (%s).", 
 		      jdevice_name);
     }
@@ -263,17 +270,17 @@
 	    reiserfs_exit(1, "Wrong journal parameters detected on (%s)", 
 			  jdevice_name);
 	} else {
-	    reiserfs_close_journal(fs);
+	    reiserfs_journal_close(fs);
 	}
     }
 
     /* forced to continue without journal available/specified */
 
-    if (no_reiserfs_found (fs)) {
+    if (fs == NULL) {
 	reiserfs_exit(1, "no reiserfs found on the device.");
     }
     
-    if (!spread_bitmaps (fs)) {
+    if (!reiserfs_bitmap_spread (fs)) {
 	reiserfs_exit(1, "cannot resize reiserfs in old (not spread "
 		      "bitmap) format.");
     }
@@ -283,29 +290,31 @@
     /* If size change was specified by user, calculate it, 
        otherwise take the whole device. */
     block_count_new = bytes_count_str ? 
-	    calc_new_fs_size(get_sb_block_count(sb), 
+	    calc_new_fs_size(reiserfs_sb_get_blocks(sb), 
 			     fs->fs_blocksize, bytes_count_str) :
-	    count_blocks(devname, fs->fs_blocksize);
+	    misc_device_count_blocks(devname, fs->fs_blocksize);
 
     if (resizer_check_fs_size(fs, block_count_new))
 	return 1;
 
-    if (misc_device_mounted(devname) > 0) {
-	reiserfs_close(fs);
+    if (util_device_mounted(devname) > 0) {
+	reiserfs_fs_close(fs);
+	fs = NULL;
 	error = resize_fs_online(devname, block_count_new);
 	reiserfs_warning(stderr, "\n\nresize_reiserfs: On-line resizing %s.\n\n",
 			 error ? "failed" : "finished successfully");
 	return error;
     }
 
-    if (!reiserfs_is_fs_consistent (fs)) {
+    if (!reiserfs_sb_state_ok (fs)) {
 	reiserfs_warning (stderr, "\n\nresize_reiserfs: run reiserfsck --check "
 	    "first\n\n");
-	reiserfs_close (fs);
+	reiserfs_fs_close (fs);
+	fs = NULL;
 	return 1;
     }
 
-    if (get_sb_umount_state(sb) != FS_CLEANLY_UMOUNTED)
+    if (reiserfs_sb_get_umount(sb) != FS_CLEANLY_UMOUNTED)
 	/* fixme: shouldn't we check for something like: fsck guarantees: fs is ok */
 	reiserfs_exit(1, "the file system isn't in valid state.");
 		
@@ -314,11 +323,11 @@
     
     /* save SB for reporting */
     if(opt_verbose) {
-	sb_old = getmem(SB_SIZE);
-	memcpy(sb_old, fs->fs_ondisk_sb, SB_SIZE);
+	sb_old = misc_getmem(REISERFS_SB_SIZE);
+	memcpy(sb_old, fs->fs_ondisk_sb, REISERFS_SB_SIZE);
     }
 
-    error = (block_count_new > get_sb_block_count(fs->fs_ondisk_sb)) ? 
+    error = (block_count_new > reiserfs_sb_get_blocks(fs->fs_ondisk_sb)) ? 
 	expand_fs(fs, block_count_new) : shrink_fs(fs, block_count_new);
     if (error) {
 	reiserfs_warning(stderr, "\n\nresize_reiserfs: Resizing failed.\n\n ");
@@ -327,17 +336,17 @@
 
     if(opt_verbose) {
 	sb_report(fs->fs_ondisk_sb, sb_old);
-	freemem(sb_old);
+	misc_freemem(sb_old);
     }
 
-    set_sb_fs_state (fs->fs_ondisk_sb, FS_CONSISTENT);
+    reiserfs_sb_set_state (fs->fs_ondisk_sb, FS_CONSISTENT);
     bwrite_cond(fs->fs_super_bh);
 	
     if (opt_verbose) {
 	printf("\nSyncing..");
 	fflush(stdout);
     }
-    reiserfs_close (fs);
+    reiserfs_fs_close (fs);
     if (opt_verbose)
 	printf("done\n");
 	
diff --git a/resize_reiserfs/resize_reiserfs.8 b/utils/resizer/resizefs.reiserfs.8
similarity index 86%
rename from resize_reiserfs/resize_reiserfs.8
rename to utils/resizer/resizefs.reiserfs.8
index 7db59bf..9f7ff0e 100644
--- a/resize_reiserfs/resize_reiserfs.8
+++ b/utils/resizer/resizefs.reiserfs.8
@@ -1,11 +1,11 @@
 .\" -*- nroff -*-
 .\" Copyright 1996-2004 Hans Reiser.
 .\" 
-.TH RESIZE_REISERFS 8 "January 2004" "Reiserfsprogs-3.6.19"
+.TH resizefs.reiserfs 8 "January 2004" "Reiserfsprogs-3.6.19"
 .SH NAME
-resize_reiserfs \- resizer tool for the ReiserFS filesystem
+resizefs.reiserfs \- resizer tool for the ReiserFS filesystem
 .SH SYNOPSIS
-.BR resize_reiserfs
+.BR resizefs.reiserfs
 [
 .B \-s
 .IR \fR[\fB+\fR|\fB\- ]\fIsize\fB[\fBK\fR|\fBM\fR|\fBG\fR]
@@ -18,7 +18,7 @@
 .I device
 .SH DESCRIPTION
 The
-.B resize_reiserfs
+.B resizefs.reiserfs
 tool resizes an unmounted reiserfs file system.  It enlarges or shrinks an
 reiserfs file system located on a
 .I device
@@ -40,7 +40,7 @@
 parameter is given in kilo\-, mega\-, gigabytes respectively.
 .PP
 The
-.B resize_reiserfs
+.B resizefs.reiserfs
 program does not manipulate the size of the device. If you wish to
 enlarge a filesystem, you must make sure you expand the underlying
 device first. This can be done using
@@ -53,14 +53,14 @@
 will certainly not work, and you may lose your entire filesystem.
 .PP
 The
-.B resize_reiserfs
+.B resizefs.reiserfs
 program allows to grow a reiserfs on-line if there is a free
 space on block
 .I device.
 
 .PP
 If you wish to shrink a reiserfs partition, first use
-.B resize_reiserfs
+.B resizefs.reiserfs
 to shrink the file system. You may then use
 .BR cfdisk (8)
 to shrink the device. When shrinking the size of the device, make sure
@@ -90,11 +90,11 @@
 
 .SH EXAMPLES
 The following example shows how to test
-.B resize_reiserfs\fR.
+.B resizefs.reiserfs\fR.
 Suppose 2Gb reiserfs filesystem is created on the device /dev/hda8
 and is mounted on /mnt. 
 For shrinking the device we need to unmount it first, then run
-.B resize_reiserfs
+.B resizefs.reiserfs
 with a
 .I size \fR parameter (in this case -1Gb):
 .PP
@@ -102,7 +102,7 @@
 .br
 \	umount /mnt
 .br
-\	resize_reiserfs -s -1G /dev/hda8
+\	resizefs.reiserfs -s -1G /dev/hda8
 .br
 \	mount /dev/hda8 /mnt
 .br
@@ -110,7 +110,7 @@
 
 .SH AUTHOR
 This version of
-.B resize_reiserfs
+.B resizefs.reiserfs
 has been written by Alexander Zarochentcev <zam@namesys.com>.
 .SH BUGS
 Please report bugs to the ReiserFS developers <reiserfs-dev@namesys.com>, providing
@@ -118,5 +118,5 @@
 messages; check the syslog file for any related information.
 .SH SEE ALSO
 .BR cfdisk (8),
-.BR reiserfsck (8),
-.BR debugreiserfs (8)
+.BR fsck.reiserfs (8),
+.BR debugfs.reiserfs (8)
diff --git a/utils/tune/Makefile.am b/utils/tune/Makefile.am
new file mode 100644
index 0000000..92485b1
--- /dev/null
+++ b/utils/tune/Makefile.am
@@ -0,0 +1,27 @@
+sbin_PROGRAMS		= tunefs.reiserfs
+
+man_MANS		= tunefs.reiserfs.8
+EXTRA_DIST		= tunefs.reiserfs.8
+
+tunefs_reiserfs_SOURCES	= tune.c tune.h
+tunefs_reiserfs_LDADD	= $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			  $(top_builddir)/libutil/libutil-static.a \
+			  $(top_builddir)/libmisc/libmisc-static.a
+tunefs_reiserfs_LDFLAGS	= @PROGS_LDFLAGS@
+tunefs_reiserfs_CFLAGS	= @CFLAGS@
+
+INCLUDES		= -I$(top_srcdir)/include
+
+uninstall-reiserfstune:
+	if test -f $(DESTDIR)$(sbindir)/reiserfstune; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfstune; \
+	fi;
+
+install-reiserfstune:
+	if test -f $(DESTDIR)$(sbindir)/tunefs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfstune; \
+		ln $(DESTDIR)$(sbindir)/tunefs.reiserfs $(DESTDIR)$(sbindir)/reiserfstune; \
+	fi;
+
+install-data-local: install-reiserfstune
+uninstall-local: uninstall-reiserfstune
diff --git a/utils/tune/Makefile.in b/utils/tune/Makefile.in
new file mode 100644
index 0000000..e386b43
--- /dev/null
+++ b/utils/tune/Makefile.in
@@ -0,0 +1,501 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(tunefs_reiserfs_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+sbin_PROGRAMS = tunefs.reiserfs$(EXEEXT)
+subdir = utils/tune
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(sbin_PROGRAMS)
+am_tunefs_reiserfs_OBJECTS = tunefs_reiserfs-tune.$(OBJEXT)
+tunefs_reiserfs_OBJECTS = $(am_tunefs_reiserfs_OBJECTS)
+tunefs_reiserfs_DEPENDENCIES =  \
+	$(top_builddir)/libreiserfs/libreiserfs-static.a \
+	$(top_builddir)/libutil/libutil-static.a \
+	$(top_builddir)/libmisc/libmisc-static.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(tunefs_reiserfs_SOURCES)
+DIST_SOURCES = $(tunefs_reiserfs_SOURCES)
+man8dir = $(mandir)/man8
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROGS_LDFLAGS = @PROGS_LDFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+man_MANS = tunefs.reiserfs.8
+EXTRA_DIST = tunefs.reiserfs.8
+tunefs_reiserfs_SOURCES = tune.c tune.h
+tunefs_reiserfs_LDADD = $(top_builddir)/libreiserfs/libreiserfs-static.a \
+			  $(top_builddir)/libutil/libutil-static.a \
+			  $(top_builddir)/libmisc/libmisc-static.a
+
+tunefs_reiserfs_LDFLAGS = @PROGS_LDFLAGS@
+tunefs_reiserfs_CFLAGS = @CFLAGS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/tune/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  utils/tune/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+	done
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+tunefs.reiserfs$(EXEEXT): $(tunefs_reiserfs_OBJECTS) $(tunefs_reiserfs_DEPENDENCIES) 
+	@rm -f tunefs.reiserfs$(EXEEXT)
+	$(LINK) $(tunefs_reiserfs_LDFLAGS) $(tunefs_reiserfs_OBJECTS) $(tunefs_reiserfs_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tunefs_reiserfs-tune.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+tunefs_reiserfs-tune.o: tune.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -MT tunefs_reiserfs-tune.o -MD -MP -MF "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" -c -o tunefs_reiserfs-tune.o `test -f 'tune.c' || echo '$(srcdir)/'`tune.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" "$(DEPDIR)/tunefs_reiserfs-tune.Po"; else rm -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tune.c' object='tunefs_reiserfs-tune.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -c -o tunefs_reiserfs-tune.o `test -f 'tune.c' || echo '$(srcdir)/'`tune.c
+
+tunefs_reiserfs-tune.obj: tune.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -MT tunefs_reiserfs-tune.obj -MD -MP -MF "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" -c -o tunefs_reiserfs-tune.obj `if test -f 'tune.c'; then $(CYGPATH_W) 'tune.c'; else $(CYGPATH_W) '$(srcdir)/tune.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo" "$(DEPDIR)/tunefs_reiserfs-tune.Po"; else rm -f "$(DEPDIR)/tunefs_reiserfs-tune.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tune.c' object='tunefs_reiserfs-tune.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tunefs_reiserfs_CFLAGS) $(CFLAGS) -c -o tunefs_reiserfs-tune.obj `if test -f 'tune.c'; then $(CYGPATH_W) 'tune.c'; else $(CYGPATH_W) '$(srcdir)/tune.c'; fi`
+uninstall-info-am:
+install-man8: $(man8_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)"
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+uninstall-man8:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    8*) ;; \
+	    *) ext='8' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man8dir)/$$inst"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am: install-sbinPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man8
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-local uninstall-man \
+	uninstall-sbinPROGRAMS
+
+uninstall-man: uninstall-man8
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-sbinPROGRAMS ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-data-local install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-man8 install-sbinPROGRAMS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-info-am uninstall-local uninstall-man \
+	uninstall-man8 uninstall-sbinPROGRAMS
+
+
+uninstall-reiserfstune:
+	if test -f $(DESTDIR)$(sbindir)/reiserfstune; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfstune; \
+	fi;
+
+install-reiserfstune:
+	if test -f $(DESTDIR)$(sbindir)/tunefs.reiserfs; then \
+		rm -f $(DESTDIR)$(sbindir)/reiserfstune; \
+		ln $(DESTDIR)$(sbindir)/tunefs.reiserfs $(DESTDIR)$(sbindir)/reiserfstune; \
+	fi;
+
+install-data-local: install-reiserfstune
+uninstall-local: uninstall-reiserfstune
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tune/tune.c b/utils/tune/tune.c
similarity index 67%
rename from tune/tune.c
rename to utils/tune/tune.c
index 869c7ba..2f074fd 100644
--- a/tune/tune.c
+++ b/utils/tune/tune.c
@@ -3,14 +3,28 @@
  * reiserfsprogs/README
  */
 
-#define _GNU_SOURCE
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
 
 #include "tune.h"
+#include "misc/unaligned.h"
+#include "util/misc.h"
+#include "util/badblock.h"
+#include "util/device.h"
+#include "util/print.h"
 
+#include <stdarg.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#if 0
 #include <getopt.h>
 #include <stdarg.h>
 #include <string.h>
 #include <errno.h>
+#endif
 
 char *program_name;
 
@@ -19,17 +33,16 @@
 
 static void message( const char * fmt, ... )
 {
-    char *buf;
+    char buf[4096];
     va_list args;
 	
-    buf = NULL;
+    buf[0] = '\0';
     va_start( args, fmt );
-    vasprintf( &buf, fmt, args );
+    vsprintf( buf, fmt, args );
     va_end( args );
 
-    if( buf ) {
+    if( buf[0] != '\0' ) {
 	fprintf( stderr, "%s: %s\n", program_name, buf );
-	free( buf );
     }
 }
 
@@ -71,10 +84,10 @@
 /* If specified paramenters defines the standard journal, make it standard. */
 static int should_make_journal_standard (reiserfs_filsys_t * fs, char * j_new_dev_name)
 {
-    if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb))
+    if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb))
 	return 0;
 /*    
-    if (!user_confirmed (stderr, "ATTENTION! Filesystem with non-standard journal "
+    if (!util_user_confirmed (stderr, "ATTENTION! Filesystem with non-standard journal "
 			 "found. Continue? (y/n):", "y\n")) {
 	exit(1);
     }
@@ -88,7 +101,7 @@
 	    return 0;
 	
 	if (Journal_size && Journal_size != 
-	    journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1) 
+	    reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1) 
 	    return 0;
 	
 	if (Max_trans_size && (Max_trans_size != JOURNAL_TRANS_MAX))
@@ -96,11 +109,11 @@
     } else {
 	/* new journal was not specified - check ondisk journal params */
 	
-	if (get_sb_reserved_for_journal(fs->fs_ondisk_sb) < 
-	    journal_default_size (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1)
+	if (reiserfs_sb_get_reserved(fs->fs_ondisk_sb) < 
+	    reiserfs_journal_default (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1)
 	{
 	    message ("Can not create standard journal of the size %llu",
-		     journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1);
+		     reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1);
 	    return 0;
 	}
     }
@@ -110,50 +123,50 @@
 
 static int set_standard_journal_params (reiserfs_filsys_t * fs)
 {
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
 
     /* ondisk superblock update */
 
-    if (get_sb_version(fs->fs_ondisk_sb) == 0)
+    if (reiserfs_sb_get_version(fs->fs_ondisk_sb) == 0)
 	memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING,
 		strlen (REISERFS_3_5_SUPER_MAGIC_STRING));
-    else if (get_sb_version(fs->fs_ondisk_sb) == 2)
+    else if (reiserfs_sb_get_version(fs->fs_ondisk_sb) == 2)
 	memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING,
 		strlen (REISERFS_3_6_SUPER_MAGIC_STRING));
     else {
 	message ("Can not set standard reiserfs magic: unknown format found %u,"
-		 " try reiserfsck first", get_sb_version(fs->fs_ondisk_sb));
+		 " try reiserfsck first", reiserfs_sb_get_version(fs->fs_ondisk_sb));
 	return 0;
     }
     
-    set_jp_journal_1st_block (sb_jp(fs->fs_ondisk_sb), get_journal_start_must (fs));
-    set_jp_journal_dev (sb_jp(fs->fs_ondisk_sb), 0);
-    set_jp_journal_size (sb_jp(fs->fs_ondisk_sb), journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize));
+    reiserfs_jp_set_start (reiserfs_sb_jp(fs->fs_ondisk_sb), reiserfs_journal_start_must (fs));
+    reiserfs_jp_set_dev (reiserfs_sb_jp(fs->fs_ondisk_sb), 0);
+    reiserfs_jp_set_size (reiserfs_sb_jp(fs->fs_ondisk_sb), reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize));
 
-    if (get_jp_journal_max_trans_len(sb_jp(fs->fs_ondisk_sb)) != JOURNAL_TRANS_MAX)
-	set_jp_journal_max_trans_len(sb_jp(fs->fs_ondisk_sb), JOURNAL_TRANS_MAX);
-    if (get_jp_journal_max_batch(sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_BATCH)
-	set_jp_journal_max_batch(sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_BATCH);
-    if (get_jp_journal_max_commit_age(sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_COMMIT_AGE)
-	set_jp_journal_max_commit_age(sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_COMMIT_AGE);
-    if (get_jp_journal_max_trans_age(sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_TRANS_AGE)
-	set_jp_journal_max_trans_age(sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_TRANS_AGE);
-    set_sb_reserved_for_journal (fs->fs_ondisk_sb, 0);
+    if (reiserfs_jp_get_tlen(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_TRANS_MAX)
+	reiserfs_jp_set_tlen(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_TRANS_MAX);
+    if (reiserfs_jp_get_max_batch(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_BATCH)
+	reiserfs_jp_set_max_batch(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_BATCH);
+    if (reiserfs_jp_get_commit_age(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_COMMIT_AGE)
+	reiserfs_jp_set_commit_age(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_COMMIT_AGE);
+    if (reiserfs_jp_get_trans_age(reiserfs_sb_jp(fs->fs_ondisk_sb)) != JOURNAL_MAX_TRANS_AGE)
+	reiserfs_jp_set_trans_age(reiserfs_sb_jp(fs->fs_ondisk_sb), JOURNAL_MAX_TRANS_AGE);
+    reiserfs_sb_set_reserved (fs->fs_ondisk_sb, 0);
     
     /* journal_header update */
-    bh = getblk(fs->fs_journal_dev, 
-	    get_jp_journal_1st_block(sb_jp(fs->fs_ondisk_sb)) + 
-	    get_jp_journal_size(sb_jp(fs->fs_ondisk_sb)), fs->fs_blocksize);
+    bh = reiserfs_buffer_open(fs->fs_journal_dev, 
+	    reiserfs_jp_get_start(reiserfs_sb_jp(fs->fs_ondisk_sb)) + 
+	    reiserfs_jp_get_size(reiserfs_sb_jp(fs->fs_ondisk_sb)), fs->fs_blocksize);
     
     if (!bh) {
-	message ("Cannot get the journal header block. getblk failed.\n");
+	message ("Cannot get the journal header block. reiserfs_buffer_open failed.\n");
 	return 0;
     }
-    ((struct reiserfs_journal_header *)(bh->b_data))->jh_journal = *(sb_jp(fs->fs_ondisk_sb));
-    mark_buffer_uptodate (bh, 1);
-    mark_buffer_dirty (bh);
-    bwrite(bh);
-    brelse(bh);
+    ((struct reiserfs_journal_header *)(bh->b_data))->jh_journal = *(reiserfs_sb_jp(fs->fs_ondisk_sb));
+    reiserfs_buffer_mkuptodate (bh, 1);
+    reiserfs_buffer_mkdirty (bh);
+    reiserfs_buffer_write(bh);
+    reiserfs_buffer_close(bh);
 
     return 1;
 }
@@ -161,26 +174,26 @@
 void zero_journal (reiserfs_filsys_t * fs)
 {
     unsigned int i;
-    struct buffer_head * bh;
+    reiserfs_bh_t * bh;
     unsigned long done;
     unsigned long start, len;
 
 
     fprintf (stderr, "Initializing journal - ");
 
-    start = get_jp_journal_1st_block (sb_jp (fs->fs_ondisk_sb));
-    len = get_jp_journal_size (sb_jp (fs->fs_ondisk_sb));
+    start = reiserfs_jp_get_start (reiserfs_sb_jp (fs->fs_ondisk_sb));
+    len = reiserfs_jp_get_size (reiserfs_sb_jp (fs->fs_ondisk_sb));
     done = 0;
     for (i = 0; i < len; i ++) {
-        print_how_far (stderr, &done, len, 1, 1/*be quiet*/);
-        bh = getblk (fs->fs_journal_dev, start + i, fs->fs_blocksize);
+        util_misc_progress (stderr, &done, len, 1, 2);
+        bh = reiserfs_buffer_open (fs->fs_journal_dev, start + i, fs->fs_blocksize);
 	if (!bh)
-	    die ("zero_journal: getblk failed");
+	    misc_die ("zero_journal: reiserfs_buffer_open failed");
         memset (bh->b_data, 0, bh->b_size);
-        mark_buffer_dirty (bh);
-        mark_buffer_uptodate (bh, 1);
-        bwrite (bh);
-        brelse (bh);
+        reiserfs_buffer_mkdirty (bh);
+        reiserfs_buffer_mkuptodate (bh, 1);
+        reiserfs_buffer_write (bh);
+        reiserfs_buffer_close (bh);
     }
 
     fprintf (stderr, "\n");
@@ -195,7 +208,7 @@
 
     val = (int) strtol (str, &tmp, 0);
     if (*tmp)
-	die ("%s: strtol is unable to make an integer of %s\n", program_name, str);
+	misc_die ("%s: strtol is unable to make an integer of %s\n", program_name, str);
     return val;
 }
 
@@ -220,16 +233,16 @@
 
 
 static void callback_new_badblocks(reiserfs_filsys_t *fs, 
-				   struct path *badblock_path, 
+				   reiserfs_path_t *badblock_path, 
 				   void *data) 
 {
-	struct item_head *tmp_ih;
+	reiserfs_ih_t *tmp_ih;
 	__u32 *ind_item, i;
 
-	tmp_ih = get_ih(badblock_path);
-	ind_item = (__u32 *)get_item(badblock_path);
+	tmp_ih = REISERFS_PATH_IH(badblock_path);
+	ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path);
 
-	for (i = 0; i < I_UNFM_NUM(tmp_ih); i++) {
+	for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) {
 		if (reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, 
 					     d32_get (ind_item, i)))
 		{
@@ -241,48 +254,48 @@
 		}
 	}
 	
-	pathrelse (badblock_path);
+	reiserfs_tree_pathrelse (badblock_path);
 }
 
 static void callback_clear_badblocks(reiserfs_filsys_t *fs, 
-				     struct path *badblock_path, 
+				     reiserfs_path_t *badblock_path, 
 				     void *data) 
 {
-	struct item_head *tmp_ih;
+	reiserfs_ih_t *tmp_ih;
 	__u32 *ind_item, i;
 
-	tmp_ih = get_ih(badblock_path);
-	ind_item = (__u32 *)get_item(badblock_path);
+	tmp_ih = REISERFS_PATH_IH(badblock_path);
+	ind_item = (__u32 *)REISERFS_PATH_ITEM(badblock_path);
 
-	for (i = 0; i < I_UNFM_NUM(tmp_ih); i++) {
+	for (i = 0; i < reiserfs_ext_count(tmp_ih); i++) {
 		reiserfs_bitmap_clear_bit(fs->fs_bitmap2, 
 					  d32_get(ind_item, i));
 	}
 	
-	pathrelse (badblock_path);
+	reiserfs_tree_pathrelse (badblock_path);
 }
 
 static void add_badblocks(reiserfs_filsys_t *fs) {
 	unsigned long i, marked = 0;
 	
-	if (reiserfs_open_ondisk_bitmap (fs) < 0) {
+	if (reiserfs_bitmap_open (fs) < 0) {
 	    message("Failed to open reiserfs ondisk bitmap.\n");
-	    reiserfs_close(fs);
+	    reiserfs_fs_close(fs);
 	    exit(1);
 	}
 	
-	if (create_badblock_bitmap (fs, badblocks_file)) {
+	if (util_badblock_load (fs, badblocks_file)) {
 	    message("Failed to initialize the bad block bitmap.\n");
-	    reiserfs_close(fs);
+	    reiserfs_fs_close(fs);
 	    exit(1);
 	}
 	
 	if (Bads == 1)
-		badblock_list(fs, callback_new_badblocks, NULL);
+		reiserfs_badblock_traverse(fs, callback_new_badblocks, NULL);
 	else
-		badblock_list(fs, callback_clear_badblocks, NULL);
+		reiserfs_badblock_traverse(fs, callback_clear_badblocks, NULL);
 	
-	for (i = 0; i < get_sb_block_count (fs->fs_ondisk_sb); i ++) {
+	for (i = 0; i < reiserfs_sb_get_blocks (fs->fs_ondisk_sb); i ++) {
 	    if (reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)) {
 		if (!reiserfs_bitmap_test_bit (fs->fs_bitmap2, i)) {
 		    reiserfs_bitmap_set_bit (fs->fs_bitmap2, i);
@@ -299,19 +312,19 @@
 	}
 	
 	if (marked) {
-		set_sb_free_blocks(fs->fs_ondisk_sb, get_sb_free_blocks(fs->fs_ondisk_sb) - 
+		reiserfs_sb_set_free(fs->fs_ondisk_sb, reiserfs_sb_get_free(fs->fs_ondisk_sb) - 
 				   fs->fs_badblocks_bm->bm_set_bits);
-		mark_buffer_dirty(fs->fs_super_bh);
+		reiserfs_buffer_mkdirty(fs->fs_super_bh);
 	}
 	
 	if (Bads == 1) {
 		/* fs->fs_badblocks_bm contains blocks which are not in the bad 
 		   block list yet. Merge it with what is in the tree already. */
-		badblock_list(fs, mark_badblock, NULL);
+		reiserfs_badblock_traverse(fs, reiserfs_badblock_extract, NULL);
 	}
 	
 	if (marked) {
-		add_badblock_list(fs, 1);
+		reiserfs_badblock_flush(fs, 1);
 	}
 	
 	message("%lu blocks were marked as bad.", marked);
@@ -408,11 +421,11 @@
 	    Force ++;
 	    break;
 	case 'b': /* --add-badblocks */
-	    asprintf (&badblocks_file, "%s", optarg);
+	    badblocks_file = optarg;
 	    Bads = 1;
 	    break;
 	case 'B': /* --badblocks */
-	    asprintf (&badblocks_file, "%s", optarg);
+	    badblocks_file = optarg;
 	    Bads = 2;
 	    break;
 	case 'u':
@@ -437,7 +450,7 @@
 	    LABEL = optarg;
             break;
 	case 'V':
-	    print_banner("reiserfstune");
+	    util_print_banner("reiserfstune");
 	    exit(0);
 #if 0
 	case 'J': /* --journal-new-device */
@@ -464,8 +477,8 @@
     /* device to be formatted */
     device_name = argv [optind];
 
-    fs = reiserfs_open (device_name, O_RDONLY, 0, NULL, 1);
-    if (no_reiserfs_found(fs)) {
+    fs = reiserfs_fs_open (device_name, O_RDONLY, 0, NULL, 1);
+    if (fs == NULL) {
 	message ("Cannot open reiserfs on %s", device_name);
         return 1;
     }
@@ -474,25 +487,25 @@
        --no-journal-available has been specified by user */
 
     /* make sure filesystem is not mounted */
-    if (misc_device_mounted(fs->fs_file_name) > 0) {
+    if (util_device_mounted(fs->fs_file_name) > 0) {
 	/* fixme: it can not be mounted, btw */
         message ("Reiserfstune is not allowed to be run on mounted filesystem.");
-	reiserfs_close (fs);
+	reiserfs_fs_close (fs);
         return 1;
     }
     
-    if (!reiserfs_is_fs_consistent (fs)) {
+    if (!reiserfs_sb_state_ok (fs)) {
 	message ("Filesystem looks not cleanly umounted, check the consistency first.\n");
-	reiserfs_close (fs);
+	reiserfs_fs_close (fs);
 	return 1;
     }
 
-    reiserfs_reopen (fs, O_RDWR);
+    reiserfs_fs_reopen (fs, O_RDWR);
     
     if (badblocks_file) {
 	add_badblocks(fs);
 	
-	reiserfs_close(fs);
+	reiserfs_fs_close(fs);
 	exit(0);
     }
     
@@ -518,10 +531,10 @@
     /* now we try to open journal, it makes sence if there is no the flag
        NEED_TUNE  in ondisk superblock and --no-journal available is not 
        specified. */
-    if (get_jp_journal_magic(sb_jp(fs->fs_ondisk_sb)) != NEED_TUNE && 
+    if (reiserfs_jp_get_magic(reiserfs_sb_jp(fs->fs_ondisk_sb)) != NEED_TUNE && 
 	!(Options & OPT_SKIP_J)) 
     {
-	if (reiserfs_open_journal (fs, jdevice_name, O_RDWR 
+	if (reiserfs_journal_open (fs, jdevice_name, O_RDWR 
 #if defined(O_LARGEFILE)
 				   | O_LARGEFILE
 #endif
@@ -533,7 +546,7 @@
 
 	if (reiserfs_journal_params_check(fs)) {
 	    message ("Unable to open old journal. Wrong journal parameters.");
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    return 1;
 	}
     }
@@ -541,20 +554,20 @@
     /* in spite of journal was opened, the file system can be non-consistent or
        there are non-replayed transaction in journal, 
        make sure it isn't (if there is no the flag NEED_TUNE in ondisk superblock */
-    if (get_jp_journal_magic(sb_jp(fs->fs_ondisk_sb)) != NEED_TUNE &&
+    if (reiserfs_jp_get_magic(reiserfs_sb_jp(fs->fs_ondisk_sb)) != NEED_TUNE &&
 	reiserfs_journal_opened (fs)) {
 	j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
-	if (get_boundary_transactions(fs, &old, &new)) {
-	    if (new.trans_id != get_jh_last_flushed(j_head)) {
+	if (reiserfs_journal_get_transactions(fs, &old, &new)) {
+	    if (new.trans_id != reiserfs_jh_get_flushed(j_head)) {
 		message ("There are non-replayed transaction in old journal,"
 			 " check filesystem consistency first");
-		reiserfs_close (fs);
+		reiserfs_fs_close (fs);
 		return 1;
 	    }
 	}
-	if (!reiserfs_is_fs_consistent (fs)) {
+	if (!reiserfs_sb_state_ok (fs)) {
 	    message ("Check filesystem consistency first");
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    return 1;
 	} 
     }
@@ -564,15 +577,15 @@
 #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
         if (!uuid_is_null(UUID)) {
 	    memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16);
-	    mark_buffer_dirty (fs->fs_super_bh);
+	    reiserfs_buffer_mkdirty (fs->fs_super_bh);
 	    fs->fs_dirt = 1;
 	}
 #endif	
 	if (LABEL != NULL) {
 	    if (strlen (LABEL) > 16)
 	        message ("Specified LABEL is longer then 16 characters, will be truncated\n");
-	    strncpy (fs->fs_ondisk_sb->s_label, LABEL, 16);
-	    mark_buffer_dirty (fs->fs_super_bh);
+	    strncpy ((char *)fs->fs_ondisk_sb->s_label, LABEL, 16);
+	    reiserfs_buffer_mkdirty (fs->fs_super_bh);
 	    fs->fs_dirt = 1;
 	}
     } else {
@@ -588,13 +601,13 @@
 	
 	/* new journal device hasn't been specified */
 	printf ("Current parameters:\n");
-	print_filesystem_state (stdout, fs);
-	print_block (stdout, fs, fs->fs_super_bh);
+	reiserfs_super_print_state (stdout, fs);
+	reiserfs_node_print (stdout, fs, fs->fs_super_bh);
 
 	if ((Options & OPT_STANDARD)
 	    && should_make_journal_standard(fs, j_new_device_name)) 
 	{
-	    if (!user_confirmed (stderr, "ATTENTION! Filesystem with "
+	    if (!util_user_confirmed (stderr, "ATTENTION! Filesystem with "
 		"non-standard journal found. Continue? (y/n):", "y\n")) 
 	    {
 		exit(1);
@@ -603,13 +616,13 @@
 	    fs->fs_journal_dev = fs->fs_dev;
 	    if (set_standard_journal_params (fs)) {
 		printf ("\nNew parameters:\n");
-		print_filesystem_state (stdout, fs);
-		print_block (stdout, fs, fs->fs_super_bh);
+		reiserfs_super_print_state (stdout, fs);
+		reiserfs_node_print (stdout, fs, fs->fs_super_bh);
 		printf ("New journal parameters:\n");
-		print_journal_params (stdout, sb_jp (fs->fs_ondisk_sb));
-		mark_buffer_dirty (fs->fs_super_bh);
-		mark_buffer_uptodate (fs->fs_super_bh, 1);
-		reiserfs_close (fs);
+		reiserfs_journal_print_params (stdout, reiserfs_sb_jp (fs->fs_ondisk_sb));
+		reiserfs_buffer_mkdirty (fs->fs_super_bh);
+		reiserfs_buffer_mkuptodate (fs->fs_super_bh, 1);
+		reiserfs_fs_close (fs);
 		printf ("Syncing.."); fflush (stdout);
 		sync ();
 		printf ("ok\n");
@@ -630,15 +643,15 @@
 	} else {	
 	    /* the only parameter has been specified is device_name, so
 	       there is nothing to do */
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    return 0;
 	}
     }
 		    
     /* new journal device has been specified */
     /* make sure new journal device is block device file */
-    if (!can_we_format_it (j_new_device_name, Force)) {
-	reiserfs_close (fs);
+    if (!util_device_formatable (j_new_device_name, Force)) {
+	reiserfs_fs_close (fs);
         return 1;
     }
 
@@ -647,72 +660,67 @@
 	/* we have to put journal on main device. It is only possible if there
 	   is enough space reserved by mkreiserfs */
 
-	if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb))
+	if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb))
 	    /* standard journal */
-	    reserved = get_jp_journal_size(sb_jp(fs->fs_ondisk_sb)) + 1;
+	    reserved = reiserfs_jp_get_size(reiserfs_sb_jp(fs->fs_ondisk_sb)) + 1;
 	else
 	    /* non-standard journal */
-	    reserved = get_sb_reserved_for_journal (fs->fs_ondisk_sb);
+	    reserved = reiserfs_sb_get_reserved (fs->fs_ondisk_sb);
 		
 	journal_size = Journal_size;
 	
 	if (!journal_size) {
-	    journal_size = journal_default_size(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1;
+	    journal_size = reiserfs_journal_default(fs->fs_super_bh->b_blocknr, fs->fs_blocksize) + 1;
 	    message("Journal size has not been specified. Assuming it is the default size (%lu)", 
 		journal_size);
 	}
 	
-/*	journal_size = (Journal_size ? Journal_size : // specified
-			(fs->fs_blocksize == 1024 ? (fs->fs_blocksize) * 8 - 3 -
-			 REISERFS_DISK_OFFSET_IN_BYTES / fs->fs_blocksize :
-			 JOURNAL_DEFAULT_SIZE + 1));	// default
-*/
-	if (journal_size + Offset > get_journal_start_must (fs) + reserved) {
+	if (journal_size + Offset > reiserfs_journal_start_must (fs) + reserved) {
 		message ("There is no enough space reserved for journal on main "
 			 "device (journal_size=%lu, reserved=%lu)\n", journal_size,
 			 reserved);
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    return 1;
 	}
     }
 
     message ("Current journal parameters:");
-    print_journal_params (stdout, sb_jp (fs->fs_ondisk_sb));
+    reiserfs_journal_print_params (stdout, reiserfs_sb_jp (fs->fs_ondisk_sb));
 
-    if (!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb)) {
+    if (!reiserfs_super_jr_magic (fs->fs_ondisk_sb)) {
 	/* we have standard journal, so check if we can convert it
 	   to non-standard one */
 	
 	/*
 	if (!should_make_journal_non_standard (Force)) {
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
 	    return 1;
 	}
 	*/
 	
-        if (is_reiserfs_3_6_magic_string (fs->fs_ondisk_sb))
-	    set_sb_version (fs->fs_ondisk_sb, REISERFS_FORMAT_3_6);
-        else if (is_reiserfs_3_5_magic_string (fs->fs_ondisk_sb))
-	    set_sb_version (fs->fs_ondisk_sb, REISERFS_FORMAT_3_5);
+        if (reiserfs_super_36_magic (fs->fs_ondisk_sb))
+	    reiserfs_sb_set_version (fs->fs_ondisk_sb, REISERFS_FORMAT_3_6);
+        else if (reiserfs_super_35_magic (fs->fs_ondisk_sb))
+	    reiserfs_sb_set_version (fs->fs_ondisk_sb, REISERFS_FORMAT_3_5);
         else {
             message ("Could not convert from unknown version, try reiserfsck first");
-	    reiserfs_close (fs);
+	    reiserfs_fs_close (fs);
             return 1;
         }
         
 	memcpy (fs->fs_ondisk_sb->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING,
 		strlen (REISERFS_JR_SUPER_MAGIC_STRING));
-	set_sb_reserved_for_journal (fs->fs_ondisk_sb,
-		get_jp_journal_size (sb_jp(fs->fs_ondisk_sb)) + 1);
+	reiserfs_sb_set_reserved (fs->fs_ondisk_sb,
+		reiserfs_jp_get_size (reiserfs_sb_jp(fs->fs_ondisk_sb)) + 1);
     }
 
     /* now we are going to close old journal and to create a new one */
-    reiserfs_close_journal (fs);
+    reiserfs_journal_close (fs);
 
-    if (!reiserfs_create_journal (fs, j_new_device_name, Offset,
+    if (!reiserfs_journal_create (fs, j_new_device_name, Offset,
 				  Journal_size, Max_trans_size)) {
 	message ("Could not create new journal");
-	reiserfs_close (fs);
+	reiserfs_fs_close (fs);
         return 1;
     }
 
@@ -720,22 +728,22 @@
 	set_standard_journal_params (fs);
 
     message ("New journal parameters:");
-    print_journal_params (stdout, sb_jp (fs->fs_ondisk_sb));
+    reiserfs_journal_print_params (stdout, reiserfs_sb_jp (fs->fs_ondisk_sb));
 
-    print_block (stdout, fs, fs->fs_super_bh);
+    reiserfs_node_print (stdout, fs, fs->fs_super_bh);
 
     if (Force < 2) {
         message ("ATTENTION: YOU ARE ABOUT TO SETUP THE NEW JOURNAL FOR THE \"%s\"!\n"
                  "AREA OF \"%s\" DEDICATED FOR JOURNAL WILL BE ZEROED!",
 		 device_name, j_new_device_name);
         
-        if (!user_confirmed (stderr, "Continue (y/n):", "y\n")) {
+        if (!util_user_confirmed (stderr, "Continue (y/n):", "y\n")) {
             return 1;
 	}
     }
 
     zero_journal (fs);    
-    reiserfs_close (fs);
+    reiserfs_fs_close (fs);
     
     printf ("Syncing.."); fflush (stdout);
     sync ();
diff --git a/tune/tune.h b/utils/tune/tune.h
similarity index 92%
rename from tune/tune.h
rename to utils/tune/tune.h
index 7a854e7..56a9a01 100644
--- a/tune/tune.h
+++ b/utils/tune/tune.h
@@ -3,16 +3,16 @@
  * reiserfsprogs/README
  */
 
-#ifndef HAVE_CONFIG_H
-#  include "config.h"
-#endif
+#include "reiserfs/libreiserfs.h"
 
+#if 0
 #include "io.h"
 #include "misc.h"
 #include "reiserfs_lib.h"
 
 #include "../version.h"
 
+#endif
 #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
 #  include <uuid/uuid.h>
 #endif
diff --git a/tune/reiserfstune.8 b/utils/tune/tunefs.reiserfs.8
similarity index 80%
rename from tune/reiserfstune.8
rename to utils/tune/tunefs.reiserfs.8
index 38ad85b..a4e4d6c 100644
--- a/tune/reiserfstune.8
+++ b/utils/tune/tunefs.reiserfs.8
@@ -1,11 +1,11 @@
 .\" -*- nroff -*-
 .\" Copyright 1996-2004 Hans Reiser.
 .\" 
-.TH REISERFSTUNE 8 "February 2004" "Reiserfsprogs-3.6.19"
+.TH tunefs.reiserfs 8 "February 2004" "Reiserfsprogs-3.6.19"
 .SH NAME
-reiserfstune \- The tunning tool for the ReiserFS filesystem.
+tune.reiserfs \- The tuning tool for the ReiserFS filesystem.
 .SH SYNOPSIS
-.B reiserfstune
+.B tune.reiserfs
 [ \fB-f\fR ]
 [ \fB-j\fR | \fB--journal-device\fR \fIFILE\fR ]
 [ \fB--no-journal-available\fR ]
@@ -19,11 +19,11 @@
 [ \fB-l\fR | \fB--label \fILABEL\fR ]
 .I device
 .SH DESCRIPTION
-\fBreiserfstune\fR is used for tuning the ReiserFS. It can change two journal 
+\fBtune.reiserfs\fR is used for tuning the ReiserFS. It can change two journal 
 parameters (the journal size and the maximum transaction size), and it can move 
 the journal's location to a new specified block device. (The old ReiserFS's 
 journal may be kept unused, or discarded at the user's option.) Besides that
-\fBreiserfstune\fR can store the bad block list to the ReiserFS and set UUID
+\fBtune.reiserfs\fR can store the bad block list to the ReiserFS and set UUID
 and LABEL.
 Note: At the time of writing the relocated journal was implemented for a special 
 release of ReiserFS, and was not expected to be put into the mainstream kernel
@@ -42,27 +42,27 @@
 .TP
 \fB-j\fR | \fB--journal-device\fR \fIFILE
 \fIFILE\fR is the file name of the block device the file system has
-the current journal (the one prior to running reiserfstune) on. This option is required when the journal is
+the current journal (the one prior to running tune.reiserfs) on. This option is required when the journal is
 already on a separate device from the main data device (although it
 can be avoided with \fB--no-journal-available\fR). If you don't
-specify journal device by this option, reiserfstune suppose that
+specify journal device by this option, tune.reiserfs suppose that
 journal is on main device.
 .TP
 \fB--no-journal-available
-allows \fBreiserfstune\fR to continue when the current journal's block
+allows \fBtune.reiserfs\fR to continue when the current journal's block
 device is no longer available.  This might happen if a disk goes bad
 and you remove it (and run fsck).
 .TP
 \fB--journal-new-device \fIFILE
 \fIFILE\fR is the file name of the block device which will contain the
 new journal for the file system. If you don't specify this,
-reiserfstune supposes that journal device remains the same.				
+tune.reiserfs supposes that journal device remains the same.				
 .TP	
 \fB \-s\fR | \fB\--journal-new-size \fIN
 \fIN\fR is the size parameter for the new journal. When journal is to
 be on a separate device - its size defaults to number of blocks that
 device has. When journal is to be on the same device as the filesytem - its size defaults
-to amount of blocks allocated for journal by \fImkreiserfs\fR when it
+to amount of blocks allocated for journal by \fImkfs.reiserfs\fR when it
 created the filesystem. Minimum is 513 for
 both cases.
 .TP
@@ -90,7 +90,7 @@
 in the \fIFile\fR is added to the fs.
 .TP
 \fB\-f\fR | \fB--force\fR 
-Normally \fBreiserfstune\fR will refuse to change a journal of a
+Normally \fBtune.reiserfs\fR will refuse to change a journal of a
 file system that was created before this journal relocation code. This
 is because if you change the journal, you cannot go back (without special
 option \fB--make-journal-standard\fR) to an old kernel that lacks this feature and be able to use your filesytem.  This option forces it to do that. Specified more
@@ -113,21 +113,21 @@
 .TP
 \fB-l\fR | \fB--label \fILABEL\fR
 Set  the  volume  label  of  the filesystem. \fILABEL\fR can be at most 16
-characters long; if it is longer than 16 characters, reiserfstune will truncate it.
+characters long; if it is longer than 16 characters, tune.reiserfs will truncate it.
 .SH POSSIBLE SCENARIOS OF USING REISERFSTUNE:
 1. You have ReiserFS on /dev/hda1, and you wish to have
 it working with its journal on the device /dev/journal
 .nf
 .IP
 boot kernel patched with special "relocatable journal support" patch
-reiserfstune /dev/hda1 --journal-new-device /dev/journal -f
+tune.reiserfs /dev/hda1 --journal-new-device /dev/journal -f
 mount /dev/hda1 and use.
 You would like to change max transaction size to 512 blocks
-reiserfstune -t 512 /dev/hda1
+tune.reiserfs -t 512 /dev/hda1
 You would like to use your file system on another kernel that doesn't 
 contain relocatable journal support.
 umount /dev/hda1
-reiserfstune /dev/hda1 -j /dev/journal --journal-new-device /dev/hda1 --make-journal-standard
+tune.reiserfs /dev/hda1 -j /dev/journal --journal-new-device /dev/hda1 --make-journal-standard
 mount /dev/hda1 and use.
 .LP
 2. You would like to have ReiserFS on /dev/hda1 and to be able to
@@ -136,26 +136,26 @@
 .nf
 .IP
 boot kernel patched with special "relocatable journal support" patch
-mkreiserfs /dev/hda1
+mkfs.reiserfs /dev/hda1
 you got solid state disk (perhaps /dev/sda, they typically look like scsi disks)
-reiserfstune --journal-new-device /dev/sda1 -f /dev/hda1
+tune.reiserfs --journal-new-device /dev/sda1 -f /dev/hda1
 Your scsi device dies, it is three in the morning, you have an extra IDE device
 lying around
-reiserfsck --no-journal-available /dev/hda1
+fsck.reiserfs --no-journal-available /dev/hda1
 or
-reiserfsck --rebuild-tree --no-journal-available /dev/hda1
-reiserfstune --no-journal-available --journal-new-device /dev/hda1 /dev/hda1
+fsck.reiserfs --rebuild-tree --no-journal-available /dev/hda1
+tune.reiserfs --no-journal-available --journal-new-device /dev/hda1 /dev/hda1
 using /dev/hda1 under patched kernel
 .SH AUTHOR
-This version of \fBreiserfstune\fR has been written by Vladimir
+This version of \fBtune.reiserfs\fR has been written by Vladimir
 Demidov <vova@namesys.com> and Edward Shishkin <edward@namesys.com>.
 .SH BUGS
 Please report bugs to the ReiserFS developers <reiserfs-dev@namesys.com>, providing
 as much information as possible--your hardware, kernel, patches, settings, all printed
 messages; check the syslog file for any related information.
 .SH SEE ALSO
-.BR reiserfsck (8),
-.BR debugreiserfs (8),
-.BR mkreiserfs (8)
+.BR fsck.reiserfs (8),
+.BR debugfs.reiserfs (8),
+.BR mkfs.reiserfs (8)
 
  
diff --git a/version.h b/version.h
deleted file mode 100644
index dd8dd95..0000000
--- a/version.h
+++ /dev/null
@@ -1,6 +0,0 @@
-/*
- * Copyright 2002-2004 Hans Reiser, licensing governed by reiserfsprogs/README
- */
-
-#define print_banner(prog) \
-fprintf(stderr, "%s %s (2003 www.namesys.com)\n\n", prog, VERSION)
