Imported reiserfsprogs-3.6.13

This commit is contained in:
Jeff Mahoney committed 2012-10-11 11:30:27 -04:00
1 parent cccefa4d84
commit 18057cdad6
78 files changed
+1630 -2159

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
Copyright 1996-2003 by Hans Reiser, licensing governed by Copyright 1996-2004 by Hans Reiser, licensing governed by
reiserfsprogs/README. reiserfsprogs/README.
*/ */
+56
View File
@@ -1,3 +1,59 @@
2004-02-17
3.6.13 release.
2004-02-13
reiserfsprogs
a few bugs were fixed in the mount entry detection code.
3.6.13-pre1 release.
2004-02-06
3.6.12 release.
2004-01-26
3.6.12-pre3 release.
2004-01-21
A few bugs were fixed:
*reiserfsck
- break from the pass2 loop correctly;
*resizer
- calculate the new fs size correctly;
- parse new size parameters correctly;
- checks for the new fs size are fixed;
2004-01-15
*reiserfsprogs
UUID support is rewritten -- link to libuuid instead of
our own UUID support.
2004-01-12
*reiserfsprogs
A fix for mount entry detection.
2003-12-17
*reiserfsck
A bug in rebuild-sb was fixed.
2003-11-24
*reiserfsck
Reboot is needed (0x2) return code was added.
2003-10-03
*reiserfs_resizer
Some checks before shrinking are added avoiding segfault in
some cases.
2003-09-29
*reiserfsprogs
bad block support is enabled and fixed.
2003-09-23
*reiserfsprogs
fix for counting block number on block devices with block
size greater then 4k.
2003-09-18
*reiserfsck
ro mounted filesystems are allowed to be checked.
2003-08-22i
*reiserfsck
fix for the journal of the minimal size
2003-08-01
*reiserfsprogs
3.6.11 release.
2003-07-30
*reiserfsck
2 bugs were fixed:
- 64bit architecture related;
- object attributes related.
2003-07-16 2003-07-16
*reiserfsprogs *reiserfsprogs
Credits were changed. Credits were changed.
+1 -1
View File
@@ -1,4 +1,4 @@
SUBDIRS = include lib reiserfscore fsck debugreiserfs resize_reiserfs mkreiserfs tune tests SUBDIRS = include lib reiserfscore fsck debugreiserfs resize_reiserfs mkreiserfs tune
noinst_DATA = reiserfsprogs.spec noinst_DATA = reiserfsprogs.spec
+2 -1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
@@ -104,7 +105,7 @@ sbindir = @sbindir@
sharedstatedir = @sharedstatedir@ sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@ sysconfdir = @sysconfdir@
target_alias = @target_alias@ target_alias = @target_alias@
SUBDIRS = include lib reiserfscore fsck debugreiserfs resize_reiserfs mkreiserfs tune tests SUBDIRS = include lib reiserfscore fsck debugreiserfs resize_reiserfs mkreiserfs tune
noinst_DATA = reiserfsprogs.spec noinst_DATA = reiserfsprogs.spec
Vendored
+86 -14
View File
@@ -308,7 +308,7 @@ ac_includes_default="\
# include <unistd.h> # include <unistd.h>
#endif" #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 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 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 RANLIB ac_ct_RANLIB 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 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 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 RANLIB ac_ct_RANLIB UUID_LIBS CPP EGREP LIBOBJS LTLIBOBJS'
ac_subst_files='' ac_subst_files=''
# Initialize some variables set by options. # Initialize some variables set by options.
@@ -1261,6 +1261,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
@@ -1528,7 +1531,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE=reiserfsprogs PACKAGE=reiserfsprogs
VERSION=3.6.9 VERSION=3.6.13
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@@ -2770,6 +2773,77 @@ fi
# Check for LIBUUID
echo "$as_me:$LINENO: checking for uuid_generate in -luuid" >&5
echo $ECHO_N "checking for uuid_generate in -luuid... $ECHO_C" >&6
if test "${ac_cv_lib_uuid_uuid_generate+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
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
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 uuid_generate ();
int
main ()
{
uuid_generate ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext 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='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_lib_uuid_uuid_generate=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_lib_uuid_uuid_generate=no
fi
rm -f 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
echo "${ECHO_T}$ac_cv_lib_uuid_uuid_generate" >&6
if test $ac_cv_lib_uuid_uuid_generate = yes; then
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBUUID 1
_ACEOF
LIBS="-luuid $LIBS"
else
{ echo "$as_me:$LINENO: WARNING: libuuid could not be found" >&5
echo "$as_me: WARNING: libuuid could not be found" >&2;}
fi
UUID_LIBS="$LIBS"
ac_ext=c ac_ext=c
ac_cpp='$CPP $CPPFLAGS' ac_cpp='$CPP $CPPFLAGS'
@@ -3249,7 +3323,8 @@ done
for ac_header in fcntl.h limits.h malloc.h sys/ioctl.h unistd.h
for ac_header in fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h
do do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then if eval "test \"\${$as_ac_Header+set}\" = set"; then
@@ -4252,11 +4327,8 @@ echo "$as_me:$LINENO: checking for CREDITS" >&5
echo $ECHO_N "checking for CREDITS... $ECHO_C" >&6 echo $ECHO_N "checking for CREDITS... $ECHO_C" >&6
if test "$cross_compiling" = yes; then if test "$cross_compiling" = yes; then
{ { echo "$as_me:$LINENO: error: cannot run test program while cross compiling echo $ac_n "cross compiling; assumed OK... $ac_c"
See \`config.log' for more details." >&5
echo "$as_me: error: cannot run test program while cross compiling
See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else else
cat >conftest.$ac_ext <<_ACEOF cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure" #line $LINENO "configure"
@@ -4266,7 +4338,6 @@ cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */ /* end confdefs.h. */
#define _GNU_SOURSE
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
@@ -4309,7 +4380,7 @@ int main (void) {
count++; count++;
} else { } else {
if (!start) if (!start)
fprintf(fout, "\t\\\" "\n"); fprintf(fout, "\\t\\\\\\n");
else if (start == 1) else if (start == 1)
fprintf(fout, ",\n\n"); fprintf(fout, ",\n\n");
@@ -4355,8 +4426,7 @@ fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi 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 include/Makefile mkreiserfs/Makefile resize_reiserfs/Makefile fsck/Makefile lib/Makefile Makefile reiserfscore/Makefile debugreiserfs/Makefile tune/Makefile tests/Makefile tests/PROGS/Makefile"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure # tests run on this system so they can be shared between configure
@@ -4914,8 +4984,6 @@ do
"reiserfscore/Makefile" ) CONFIG_FILES="$CONFIG_FILES reiserfscore/Makefile" ;; "reiserfscore/Makefile" ) CONFIG_FILES="$CONFIG_FILES reiserfscore/Makefile" ;;
"debugreiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES debugreiserfs/Makefile" ;; "debugreiserfs/Makefile" ) CONFIG_FILES="$CONFIG_FILES debugreiserfs/Makefile" ;;
"tune/Makefile" ) CONFIG_FILES="$CONFIG_FILES tune/Makefile" ;; "tune/Makefile" ) CONFIG_FILES="$CONFIG_FILES tune/Makefile" ;;
"tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
"tests/PROGS/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/PROGS/Makefile" ;;
"depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
"include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
*) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
@@ -5039,6 +5107,7 @@ s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
s,@RANLIB@,$RANLIB,;t t s,@RANLIB@,$RANLIB,;t t
s,@ac_ct_RANLIB@,$ac_ct_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,@CPP@,$CPP,;t t
s,@EGREP@,$EGREP,;t t s,@EGREP@,$EGREP,;t t
s,@LIBOBJS@,$LIBOBJS,;t t s,@LIBOBJS@,$LIBOBJS,;t t
@@ -5663,3 +5732,6 @@ if test "$no_create" != yes; then
$ac_cs_success || { (exit 1); exit 1; } $ac_cs_success || { (exit 1); exit 1; }
fi fi
echo
echo Type \'make\' to compile reiserfsprogs
+17 -9
View File
@@ -1,7 +1,9 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(version.h) AC_INIT(version.h)
AM_INIT_AUTOMAKE(reiserfsprogs, 3.6.9) AH_TEMPLATE([HAVE_LIBUUID], [Define for enable libuuid using.])
AM_INIT_AUTOMAKE(reiserfsprogs, 3.6.13)
dnl We install in /sbin, the utils are to be available on boot dnl We install in /sbin, the utils are to be available on boot
dnl AC_PREFIX(/) dnl AC_PREFIX(/)
@@ -24,9 +26,14 @@ dnl AC_PROG_LN_S
dnl Checks for libraries. dnl Checks for libraries.
# Check for LIBUUID
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. dnl Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/ioctl.h unistd.h) AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/ioctl.h unistd.h uuid/uuid.h)
dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST AC_C_CONST
@@ -56,7 +63,6 @@ AC_DEFUN(AC_PREPARE_CREDITS,
AC_MSG_CHECKING(for CREDITS) AC_MSG_CHECKING(for CREDITS)
AC_TRY_RUN([ AC_TRY_RUN([
#define _GNU_SOURSE
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
@@ -99,7 +105,7 @@ int main (void) {
count++; count++;
} else { } else {
if (!start) if (!start)
fprintf(fout, "\t\\\" "\n"); fprintf(fout, "\\t\\\\\\n");
else if (start == 1) else if (start == 1)
fprintf(fout, ",\n\n"); fprintf(fout, ",\n\n");
@@ -118,8 +124,9 @@ int main (void) {
return 0; return 0;
} }
], AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ; exit) ], AC_MSG_RESULT(yes), AC_MSG_RESULT(no) ; exit,
]) [echo $ac_n "cross compiling; assumed OK... $ac_c"]
)])
AC_PREPARE_CREDITS() AC_PREPARE_CREDITS()
@@ -132,6 +139,7 @@ AC_OUTPUT(
Makefile Makefile
reiserfscore/Makefile reiserfscore/Makefile
debugreiserfs/Makefile debugreiserfs/Makefile
tune/Makefile tune/Makefile)
tests/Makefile
tests/PROGS/Makefile) echo
echo Type \'make\' to compile reiserfsprogs
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+15 -12
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -621,8 +621,8 @@ void do_one_corruption_in_one_block (reiserfs_filsys_t * fs,
int do_one_ih_corrupt (struct item_head * ih, unsigned int nr_bytes) int do_one_ih_corrupt (struct item_head * ih, unsigned int nr_bytes)
{ {
if (nr_bytes > IH_SIZE) { if (nr_bytes > IH_SIZE) {
printf ("Bad byte number %u expected not more then %d\n", nr_bytes, printf ("Bad byte number %u expected not more then %lu\n", nr_bytes,
IH_SIZE); (unsigned long)IH_SIZE);
exit (1); exit (1);
} }
@@ -662,10 +662,13 @@ int do_one_ih_random_corrupt (struct item_head * ih)
} }
/* Corrupt n bytes in block header */ /* Corrupt n bytes in block header */
int corrupt_block_header (struct block_head * blkh, unsigned int offset, unsigned int bytes ) int corrupt_block_header (struct block_head * blkh, unsigned int offset,
unsigned int bytes)
{ {
if ((offset + bytes) > BLKH_SIZE) { if ((offset + bytes) > BLKH_SIZE) {
printf ("Bad offset number: %u or bad bytes number: %u, the suumary value expected not more then %d\n", 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); exit (1);
} }
@@ -685,7 +688,7 @@ void do_one_blkh_random_corrupt (struct buffer_head * bh)
struct block_head * blkh; struct block_head * blkh;
unsigned int from; unsigned int from;
unsigned int count; unsigned int count;
int i; unsigned int i;
from = get_rand (0, BLKH_SIZE - 1); from = get_rand (0, BLKH_SIZE - 1);
count = get_rand (1, BLKH_SIZE); count = get_rand (1, BLKH_SIZE);
@@ -777,7 +780,7 @@ void do_one_block_random_corrupt (struct buffer_head * bh)
{ {
unsigned int from = get_rand (0, bh->b_size - 1); unsigned int from = get_rand (0, bh->b_size - 1);
unsigned int count = get_rand (1, bh->b_size); unsigned int count = get_rand (1, bh->b_size);
int i; unsigned int i;
if (from + count > bh->b_size) if (from + count > bh->b_size)
count = bh->b_size - from; count = bh->b_size - from;
@@ -802,7 +805,7 @@ void do_bitmap_corruption (reiserfs_filsys_t * fs)
unsigned long nr_bitmap_to_corrupt; unsigned long nr_bitmap_to_corrupt;
unsigned long block; unsigned long block;
struct buffer_head * bh; struct buffer_head * bh;
int i; unsigned int i;
nr_bitmap_to_corrupt = (unsigned long)get_rand (1, get_sb_bmap_nr (fs->fs_ondisk_sb) - 1); nr_bitmap_to_corrupt = (unsigned long)get_rand (1, get_sb_bmap_nr (fs->fs_ondisk_sb) - 1);
@@ -834,7 +837,7 @@ void do_ih_random_corrupt (reiserfs_filsys_t * fs,
unsigned long nr_leaves_cr) unsigned long nr_leaves_cr)
{ {
unsigned int nr_ih_cr; unsigned int nr_ih_cr;
int i, j; unsigned int i, j;
struct buffer_head * bh; struct buffer_head * bh;
struct item_head * ih; struct item_head * ih;
unsigned long nr_leaves = 0; unsigned long nr_leaves = 0;
@@ -941,7 +944,7 @@ void do_dir_random_corrupt (reiserfs_filsys_t * fs,
unsigned long nr_leaves_cr) unsigned long nr_leaves_cr)
{ {
unsigned int nr_ih_cr; unsigned int nr_ih_cr;
int i, j; unsigned int i, j;
struct buffer_head * bh; struct buffer_head * bh;
struct item_head * ih; struct item_head * ih;
unsigned long nr_leaves = 0; unsigned long nr_leaves = 0;
@@ -1022,7 +1025,7 @@ void do_sd_random_corrupt (reiserfs_filsys_t * fs,
unsigned long nr_leaves_cr) unsigned long nr_leaves_cr)
{ {
unsigned int nr_ih_cr; unsigned int nr_ih_cr;
int i, j; unsigned int i, j;
struct buffer_head * bh; struct buffer_head * bh;
struct item_head * ih; struct item_head * ih;
unsigned long nr_leaves = 0; unsigned long nr_leaves = 0;
@@ -1103,7 +1106,7 @@ void do_ind_random_corrupt (reiserfs_filsys_t * fs,
unsigned long nr_leaves_cr) unsigned long nr_leaves_cr)
{ {
unsigned int nr_ih_cr; unsigned int nr_ih_cr;
int i, j; unsigned int i, j;
struct buffer_head * bh; struct buffer_head * bh;
struct item_head * ih; struct item_head * ih;
unsigned long nr_leaves = 0; unsigned long nr_leaves = 0;
+9 -4
View File
@@ -1,9 +1,9 @@
.\" -*- nroff -*- .\" -*- nroff -*-
.\" Copyright 1996-2003 Hans Reiser. .\" Copyright 1996-2004 Hans Reiser.
.\" .\"
.TH DEBUGREISERFS 8 "April 2003" "Reiserfsprogs 3.6.9" .TH DEBUGREISERFS 8 "February 2004" "Reiserfsprogs 3.6.13"
.SH NAME .SH NAME
debugreiserfs debugreiserfs \- debugging tool for the ReiserFS filesystem
.SH SYNOPSIS .SH SYNOPSIS
.B debugreiserfs .B debugreiserfs
[ [
@@ -11,7 +11,9 @@ debugreiserfs
] [ ] [
.B -j \fIdevice .B -j \fIdevice
] [ ] [
.B -B \fIblocknumber .B -B \fIfile
] [
.B -1 \fIN
] ]
.\" ] [ .\" ] [
@@ -47,6 +49,9 @@ print contents of bitmap (not very useful)
.B -o .B -o
print objectid map (not very useful) print objectid map (not very useful)
.TP .TP
\fB-B\fR \fIfile\fR
extract the filesystem list of bad blocks to the specified file.
.TP
\fB-1\fR \fIblocknumber\fR \fB-1\fR \fIblocknumber\fR
print specified block of the filesystem print specified block of the filesystem
.TP .TP
+63 -62
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -12,6 +12,7 @@ fprintf (stderr, "Usage: %s [options] device\n\n\
Options:\n\ Options:\n\
-d\t\tprint blocks details of the internal tree\n\ -d\t\tprint blocks details of the internal tree\n\
-D\t\tprint blocks details of all used blocks\n\ -D\t\tprint blocks details of all used blocks\n\
-B file\textract list of badblocks\n\
-m\t\tprint bitmap blocks\n\ -m\t\tprint bitmap blocks\n\
-o\t\tprint objectid map\n\n\ -o\t\tprint objectid map\n\n\
-J\t\tprint journal header\n\ -J\t\tprint journal header\n\
@@ -19,12 +20,12 @@ Options:\n\
-p\t\tsend filesystem metadata to stdout\n\ -p\t\tsend filesystem metadata to stdout\n\
-S\t\thandle all blocks, not only used\n\ -S\t\thandle all blocks, not only used\n\
-1 block\tblock to print\n\ -1 block\tblock to print\n\
-q\t\tno speed info (for -p, -s and -n)\n\n", argv[0]);\ -q\t\tno speed info (for -p, -s and -n)\n\
-V\t\tprint version and exit\n\n", argv[0]);\
exit (16);\ exit (16);\
} }
/* /*
-B file\textract list of badblocks\n\
Undocumented options: Undocumented options:
-a map_file\n\tstore to the file the map of file. Is used with -n, -N, -r, -f\n -a map_file\n\tstore to the file the map of file. Is used with -n, -N, -r, -f\n
@@ -55,7 +56,7 @@ struct reiserfs_fsstat {
static void print_disk_tree (reiserfs_filsys_t * fs, unsigned long block_nr) static void print_disk_tree (reiserfs_filsys_t * fs, unsigned long block_nr)
{ {
struct buffer_head * bh; struct buffer_head * bh;
int i, count; int i, j, count;
static int level = -1; static int level = -1;
if (level == -1) if (level == -1)
@@ -94,9 +95,18 @@ static void print_disk_tree (reiserfs_filsys_t * fs, unsigned long block_nr)
ih = B_N_PITEM_HEAD (bh, 0); ih = B_N_PITEM_HEAD (bh, 0);
count = leaf_item_number_estimate(bh); count = leaf_item_number_estimate(bh);
for (i = 0; i <= count; i++, ih++) { for (i = 0; i < count; i++, ih++) {
if (is_indirect_ih(ih)) if (is_indirect_ih(ih)) {
g_stat_info.nr_unformatted += I_UNFM_NUM(ih); __u32 * ind_item = (__u32 *)B_I_PITEM (bh, ih);
__u32 unfm_ptr;
for (j = 0; j < (int)I_UNFM_NUM (ih); j ++) {
unfm_ptr = le32_to_cpu (ind_item [j]);
if (unfm_ptr) {
g_stat_info.nr_unformatted += 1;
}
}
}
} }
} else { } else {
print_block (stdout, fs, bh, data (fs)->options & PRINT_TREE_DETAILS, -1, -1); print_block (stdout, fs, bh, data (fs)->options & PRINT_TREE_DETAILS, -1, -1);
@@ -202,6 +212,7 @@ static void print_one_block (reiserfs_filsys_t * fs, unsigned long block)
char * where_to_save; char * where_to_save;
char * badblocks_file; char * badblocks_file;
char * corruption_list_file; char * corruption_list_file;
char *program_name;
static char * parse_options (struct debugreiserfs_data * data, int argc, char * argv []) static char * parse_options (struct debugreiserfs_data * data, int argc, char * argv [])
{ {
@@ -211,7 +222,14 @@ static char * parse_options (struct debugreiserfs_data * data, int argc, char *
data->scan_area = USED_BLOCKS; data->scan_area = USED_BLOCKS;
data->mode = DO_DUMP; data->mode = DO_DUMP;
while ((c = getopt (argc, argv, "a:b:C:F:SU1:psn:Nfr:dDomj:J:qtZl:L")) != EOF) { program_name = strrchr( argv[ 0 ], '/' );
if (program_name)
program_name++;
else
program_name = argv[ 0 ];
while ((c = getopt (argc, argv, "a:b:C:F:SU1:psn:Nfr:dDomj:JqtZl:LVB:")) != EOF) {
switch (c) { switch (c) {
case 'a': /* -r will read this, -n and -N will write to it */ case 'a': /* -r will read this, -n and -N will write to it */
asprintf (&data->map_file, "%s", optarg); asprintf (&data->map_file, "%s", optarg);
@@ -314,7 +332,6 @@ static char * parse_options (struct debugreiserfs_data * data, int argc, char *
case 'J': case 'J':
data->options |= PRINT_JOURNAL_HEADER; data->options |= PRINT_JOURNAL_HEADER;
data->journal_device_name = optarg;
break; break;
case 'R': /* read block numbers from stdin and look for them in the case 'R': /* read block numbers from stdin and look for them in the
@@ -346,13 +363,23 @@ static char * parse_options (struct debugreiserfs_data * data, int argc, char *
/* random fs corruption */ /* random fs corruption */
data->mode = DO_RANDOM_CORRUPTION; data->mode = DO_RANDOM_CORRUPTION;
break; break;
case 'V':
data->mode = DO_NOTHING;
break;
} }
} }
if (data->mode == DO_NOTHING) {
print_banner(program_name);
exit(0);
}
if (optind != argc - 1) if (optind != argc - 1)
/* only one non-option argument is permitted */ /* only one non-option argument is permitted */
print_usage_and_exit(); print_usage_and_exit();
print_banner(program_name);
data->device_name = argv[optind]; data->device_name = argv[optind];
return argv[optind]; return argv[optind];
} }
@@ -473,74 +500,49 @@ static void do_dump_tree (reiserfs_filsys_t * fs)
init_bitmap (fs); init_bitmap (fs);
if (data (fs)->options & PRINT_DETAILS || data (fs)->options & PRINT_TREE_DETAILS) { if (data (fs)->options & PRINT_DETAILS || data (fs)->options & PRINT_TREE_DETAILS) {
if (data (fs)->options & PRINT_DETAILS) if (data (fs)->options & PRINT_DETAILS) {
print_disk_blocks (fs); print_disk_blocks (fs);
else 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)); print_disk_tree (fs, get_sb_root_block (fs->fs_ondisk_sb));
printf("The internal reiserfs tree has:\n");
}
/* print the statistic */ /* print the statistic */
printf ("File system uses %d internal + %d leaves + %d unformatted nodes = %d blocks\n", printf ("\t%d internal + %d leaves + %d unformatted nodes = %d blocks\n",
g_stat_info.nr_internals, g_stat_info.nr_leaves, g_stat_info.nr_unformatted, g_stat_info.nr_internals, g_stat_info.nr_leaves, g_stat_info.nr_unformatted,
g_stat_info.nr_internals + g_stat_info.nr_leaves + g_stat_info.nr_unformatted); g_stat_info.nr_internals + g_stat_info.nr_leaves + g_stat_info.nr_unformatted);
} }
} }
void extract_badblock_list () static void callback_badblock_print(reiserfs_filsys_t *fs,
struct path *badblock_path,
void *data)
{ {
FILE * fd; struct item_head *tmp_ih;
struct key badblock_key = {-1, -1, {{0, 0}}}; FILE *fd = (FILE *)data;
struct key * rdkey; __u32 *ind_item;
struct path badblock_path;
struct item_head * tmp_ih;
__u32 i; __u32 i;
__u32 * ind_item;
tmp_ih = get_ih(badblock_path);
ind_item = (__u32 *)get_item(badblock_path);
fd = fopen (badblocks_file, "w"); for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++)
fprintf (fd, "%u\n", le32_to_cpu (*ind_item));
if (fd == NULL) { pathrelse (badblock_path);
}
void extract_badblock_list () {
FILE *fd;
if (!(fd = fopen (badblocks_file, "w"))) {
reiserfs_warning (stderr, "debugreiserfs: could not open badblock file %s\n", reiserfs_warning (stderr, "debugreiserfs: could not open badblock file %s\n",
badblocks_file); badblocks_file);
exit (1); exit (1);
} }
badblock_path.path_length = ILLEGAL_PATH_ELEMENT_OFFSET; badblock_list(fs, callback_badblock_print, fd);
set_type_and_offset (KEY_FORMAT_2, &badblock_key, 1, TYPE_INDIRECT);
while (1) {
reiserfs_search_by_key_4 (fs, &badblock_key, &badblock_path);
if (get_blkh_nr_items ( B_BLK_HEAD (get_bh(&badblock_path))) <= PATH_LAST_POSITION (&badblock_path)) {
break;
}
tmp_ih = get_ih(&badblock_path);
if (get_key_dirid(&tmp_ih->ih_key) != (__u32)-1 ||
get_key_objectid(&tmp_ih->ih_key) != (__u32)-1) {
break;
}
/* even if offset or type are corrupted it could be a badblock list */
if (!is_indirect_ih (tmp_ih)) {
reiserfs_warning (stderr, "$s: a badblock item which was found has a wrong type.\n"
" It probable contains not correct bad block list, check it.\n", __FUNCTION__);
}
ind_item = (__u32 *)B_I_PITEM (get_bh (&badblock_path), tmp_ih);
for (i = 0; i < get_ih_item_len (tmp_ih) / UNFM_P_SIZE; i++, ind_item++)
fprintf (fd, "%u\n", le32_to_cpu (*ind_item));
if ((rdkey = get_next_key_2 (&badblock_path)) == NULL)
break;
else
badblock_key = *rdkey;
pathrelse (&badblock_path);
}
pathrelse (&badblock_path);
fclose (fd); fclose (fd);
} }
@@ -634,8 +636,6 @@ int main (int argc, char * argv[])
int error; int error;
struct debugreiserfs_data * data; struct debugreiserfs_data * data;
print_banner ("debugreiserfs");
data = getmem (sizeof (struct debugreiserfs_data)); data = getmem (sizeof (struct debugreiserfs_data));
file_name = parse_options (data, argc, argv); file_name = parse_options (data, argc, argv);
@@ -649,7 +649,6 @@ int main (int argc, char * argv[])
if (reiserfs_open_journal (fs, data (fs)->journal_device_name, O_RDONLY)) { if (reiserfs_open_journal (fs, data (fs)->journal_device_name, O_RDONLY)) {
fprintf(stderr, "\ndebugreiserfs: Failed to open the fs journal.\n"); fprintf(stderr, "\ndebugreiserfs: Failed to open the fs journal.\n");
exit(1);
} }
switch (debug_mode (fs)) { switch (debug_mode (fs)) {
@@ -706,7 +705,9 @@ int main (int argc, char * argv[])
/*do_test (fs);*/ /*do_test (fs);*/
break; break;
case DO_EXTRACT_BADBLOCKS: case DO_EXTRACT_BADBLOCKS:
reiserfs_warning (stderr, "Will try to extract list of bad blocks and save it to '%s' file\n", badblocks_file); reiserfs_warning (stderr, "Will try to extract list of bad blocks and "
"save it to '%s' file\n", badblocks_file);
extract_badblock_list (); extract_badblock_list ();
reiserfs_warning (stderr, "Done\n\n"); reiserfs_warning (stderr, "Done\n\n");
break; break;
+2 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -45,7 +45,7 @@ extern reiserfs_filsys_t * fs;
#define DO_EXTRACT_BADBLOCKS 13 #define DO_EXTRACT_BADBLOCKS 13
#define DO_FILE_MAP 14 #define DO_FILE_MAP 14
#define DO_ZERO_BITMAP 15 #define DO_ZERO_BITMAP 15
#define DO_NOTHING 16
/*first bits are in reiserfs_fs.b*/ /*first bits are in reiserfs_fs.b*/
+1 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -407,7 +407,6 @@ static void pack_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh)
return; return;
} }
/* start magic in low 8 bits, hash code in high 8 bits */ /* 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 | (func2code (fs->fs_hash_function) << 8));
fwrite_le16 (&v16); fwrite_le16 (&v16);
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -819,9 +819,9 @@ static void scan_for_key (struct buffer_head * bh, struct key * key)
i_num = leaf_item_number_estimate(bh); i_num = leaf_item_number_estimate(bh);
for (i = 0; i < i_num; i ++, ih ++) { for (i = 0; i < i_num; i ++, ih ++) {
if ((get_key_dirid(&ih->ih_key) == get_key_dirid(key) || if ((get_key_dirid(&ih->ih_key) == get_key_dirid(key) ||
get_key_dirid(key) == ~0ul) && get_key_dirid(key) == ~(__u32)0) &&
(get_key_objectid(&ih->ih_key) == get_key_objectid(key) || (get_key_objectid(&ih->ih_key) == get_key_objectid(key) ||
get_key_objectid(key) == ~0ul)) get_key_objectid(key) == ~(__u32)0))
{ {
reiserfs_warning(log_to, "%d-th item of block %lu is item of file %K: %H\n", reiserfs_warning(log_to, "%d-th item of block %lu is item of file %K: %H\n",
i, bh->b_blocknr, key, ih); i, bh->b_blocknr, key, ih);
+5 -3
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2003 by Hans Reiser, licensing governed by * Copyright 2002-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -205,8 +205,9 @@ void do_stat (reiserfs_filsys_t * fs)
brelse (bh); brelse (bh);
} }
reiserfs_warning (stderr, "\nThere were %lu leaves\n" reiserfs_warning (stderr, "\nThere were found on the '%s' device:\n"
"\ttotal number of items %lu there\n" "\tleaves %lu\n"
"\ttotal number of items %lu\n"
"\tblocks containing at least one unique item %lu\n" "\tblocks containing at least one unique item %lu\n"
"\tblocks which can be skipped %lu\n" "\tblocks which can be skipped %lu\n"
"\t\tstat data %lu\n" "\t\tstat data %lu\n"
@@ -220,6 +221,7 @@ void do_stat (reiserfs_filsys_t * fs)
"other items %lu\n" "other items %lu\n"
"blocks containing only 1 dir item %lu\n", "blocks containing only 1 dir item %lu\n",
*/ */
fs->fs_file_name,
fs_stat.leaves, fs_stat.leaves,
fs_stat.all, fs_stat.all,
fs_stat.leaves - fs_stat.blocks_to_skip, fs_stat.leaves - fs_stat.blocks_to_skip,
+5 -4
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -489,7 +489,8 @@ static void unpack_unformatted_bitmap (int dev, int blocksize)
// read packed reiserfs partition metadata from stdin // read packed reiserfs partition metadata from stdin
void unpack_partition (int fd, int jfd) void unpack_partition (int fd, int jfd)
{ {
__u32 magic32, position; __u32 magic32;
long position;
__u16 magic16; __u16 magic16;
__u16 blocksize; __u16 blocksize;
int dev = fd; int dev = fd;
@@ -567,7 +568,7 @@ void unpack_partition (int fd, int jfd)
default: default:
position = ftell(stdin); position = ftell(stdin);
if (position == ~0ul) if (position == ~(long)0)
die ("unpack_partition: bad magic found - %x", magic16 & 0xff); die ("unpack_partition: bad magic found - %x", magic16 & 0xff);
else else
die ("unpack_partition: bad magic found - %x, position %lu", die ("unpack_partition: bad magic found - %x, position %lu",
@@ -615,7 +616,7 @@ int main (int argc, char ** argv)
/* only one non-option argument is permitted */ /* only one non-option argument is permitted */
print_usage_and_exit(); print_usage_and_exit();
if (is_mounted (argv[optind])) if (misc_device_mounted(argv[optind]) > 0)
reiserfs_panic ("%s seems mounted, umount it first\n", argv[optind]); reiserfs_panic ("%s seems mounted, umount it first\n", argv[optind]);
fd = open (argv[optind], O_RDWR | O_LARGEFILE); fd = open (argv[optind], O_RDWR | O_LARGEFILE);
+1 -1
View File
@@ -7,5 +7,5 @@ ufile.c check_tree.c info.c super.c fsck.h
man_MANS = reiserfsck.8 man_MANS = reiserfsck.8
EXTRA_DIST = $(man_MANS) EXTRA_DIST = $(man_MANS)
LDADD = $(LDFLAGS) $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a reiserfsck_LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
+2 -2
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
@@ -114,7 +115,7 @@ ufile.c check_tree.c info.c super.c fsck.h
man_MANS = reiserfsck.8 man_MANS = reiserfsck.8
EXTRA_DIST = $(man_MANS) EXTRA_DIST = $(man_MANS)
LDADD = $(LDFLAGS) $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a reiserfsck_LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
subdir = fsck subdir = fsck
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_HEADER = $(top_builddir)/include/config.h
@@ -129,7 +130,6 @@ am_reiserfsck_OBJECTS = main.$(OBJEXT) pass0.$(OBJEXT) pass1.$(OBJEXT) \
ufile.$(OBJEXT) check_tree.$(OBJEXT) info.$(OBJEXT) \ ufile.$(OBJEXT) check_tree.$(OBJEXT) info.$(OBJEXT) \
super.$(OBJEXT) super.$(OBJEXT)
reiserfsck_OBJECTS = $(am_reiserfsck_OBJECTS) reiserfsck_OBJECTS = $(am_reiserfsck_OBJECTS)
reiserfsck_LDADD = $(LDADD)
reiserfsck_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \ reiserfsck_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
$(top_srcdir)/reiserfscore/libcore.a $(top_srcdir)/reiserfscore/libcore.a
reiserfsck_LDFLAGS = reiserfsck_LDFLAGS =
+200 -149
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1999-2003 by Hans Reiser, licensing governed by * Copyright 1999-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -141,17 +141,19 @@ static void init_control_bitmap (reiserfs_filsys_t * fs)
unsigned long reserved; unsigned long reserved;
control_bitmap = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb)); control_bitmap = reiserfs_create_bitmap(get_sb_block_count(fs->fs_ondisk_sb));
if (!control_bitmap) if (!control_bitmap)
die ("init_control_bitmap: Failed to allocate a 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));*/ /*printf ("Initially number of zeros in control bitmap %d\n",
reiserfs_bitmap_zeros (control_bitmap));*/
/* skipped and super block */ /* skipped and super block */
for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++) for (i = 0; i <= fs->fs_super_bh->b_blocknr; i ++)
we_met_it (i); we_met_it (i);
/*printf ("SKIPPED: %d blocks marked used (%d)\n", hits, reiserfs_bitmap_zeros (control_bitmap)); /*printf ("SKIPPED: %d blocks marked used (%d)\n", hits,
reiserfs_bitmap_zeros (control_bitmap));
hits = 0;*/ hits = 0;*/
/* bitmaps */ /* bitmaps */
@@ -160,11 +162,15 @@ static void init_control_bitmap (reiserfs_filsys_t * fs)
we_met_it (block); we_met_it (block);
if (spread_bitmaps (fs)) if (spread_bitmaps (fs))
block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize * 8); block = (block / (fs->fs_blocksize * 8) + 1) *
(fs->fs_blocksize * 8);
else else
block ++; block ++;
} }
/*printf ("BITMAPS: %d blocks marked used (%d)\n", hits, reiserfs_bitmap_zeros (control_bitmap));
/*printf ("BITMAPS: %d blocks marked used (%d)\n", hits,
reiserfs_bitmap_zeros (control_bitmap));
hits = 0;*/ hits = 0;*/
/* mark as used area of the main device either containing a journal or /* mark as used area of the main device either containing a journal or
@@ -176,7 +182,8 @@ static void init_control_bitmap (reiserfs_filsys_t * fs)
if (!is_new_sb_location (fs->fs_super_bh->b_blocknr, fs->fs_blocksize) && 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)) !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."); die ("init_control_bitmap: Wrong super block location. You must run "
"--rebuild-sb.");
block = get_journal_start_must (fs); block = get_journal_start_must (fs);
@@ -199,16 +206,20 @@ static void handle_bitmaps (reiserfs_filsys_t * fs)
int problem = 0; int problem = 0;
if (tree_scanning_failed) { if (tree_scanning_failed) {
fsck_progress ("Could not scan the internal tree. --rebuild-tree is required\n"); fsck_progress ("Could not scan the internal tree. --rebuild-tree "
"is required\n");
return; return;
} }
fsck_progress ("Comparing bitmaps.."); fsck_progress ("Comparing bitmaps..");
/* check free block counter */ /* check free block counter */
if (get_sb_free_blocks (fs->fs_ondisk_sb) != reiserfs_bitmap_zeros (control_bitmap)) { if (get_sb_free_blocks (fs->fs_ondisk_sb) !=
/* fsck_log ("vpf-10630: The count of free blocks in the on-disk bitmap (%lu) mismatches " reiserfs_bitmap_zeros (control_bitmap))
"with the correct one (%lu).\n", get_sb_free_blocks (fs->fs_ondisk_sb), {
/* 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)); reiserfs_bitmap_zeros (control_bitmap));
*/ */
problem++; problem++;
@@ -222,20 +233,25 @@ static void handle_bitmaps (reiserfs_filsys_t * fs)
fsck_log ("vpf-10630: The on-disk and the correct bitmaps differs. " fsck_log ("vpf-10630: The on-disk and the correct bitmaps differs. "
"Will be fixed later.\n"); "Will be fixed later.\n");
// fsck_progress ("Trying to fix bitmap ..\n"); // fsck_progress ("Trying to fix bitmap ..\n");
/* mark blocks as used in source bitmap if they are used in control bitmap */ /* mark blocks as used in source bitmap if they are used in
control bitmap */
reiserfs_bitmap_disjunction (source_bitmap, control_bitmap); reiserfs_bitmap_disjunction (source_bitmap, control_bitmap);
/* change used blocks count accordinly source bitmap, /* change used blocks count accordinly source bitmap, copy bitmap
copy bitmap changes to on_disk bitmap */ changes to on_disk bitmap */
set_sb_free_blocks (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (source_bitmap)); set_sb_free_blocks (fs->fs_ondisk_sb,
reiserfs_bitmap_zeros(source_bitmap));
reiserfs_bitmap_copy (fs->fs_bitmap2, source_bitmap); reiserfs_bitmap_copy (fs->fs_bitmap2, source_bitmap);
mark_buffer_dirty (fs->fs_super_bh); mark_buffer_dirty (fs->fs_super_bh);
/* /*
// check again // check again
if ((diff = reiserfs_bitmap_compare (source_bitmap, control_bitmap)) != 0) { if ((diff = reiserfs_bitmap_compare(source_bitmap,
// do not mark them as fatal or fixable because one can live with leaked space. control_bitmap)) != 0)
// So this is not a fatal corruption, and fix-fixable cannot fix it {
fsck_progress (" bitmaps were not recovered. \n" // do not mark them as fatal or fixable because one can live
"\tYou can either run rebuild-tree or live with %d leaked blocks\n", diff); // 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 { } else {
fsck_progress ("finished\n"); fsck_progress ("finished\n");
} }
@@ -243,7 +259,8 @@ static void handle_bitmaps (reiserfs_filsys_t * fs)
} else if (problem) { } else if (problem) {
fsck_log ("vpf-10640: The on-disk and the correct bitmaps differs.\n"); fsck_log ("vpf-10640: The on-disk and the correct bitmaps differs.\n");
while (problem) { while (problem) {
/* fixable corruptions because we can try to recover them without rebuilding the tree */ /* fixable corruptions because we can try to recover them
without rebuilding the tree */
one_more_corruption (fs, FIXABLE); one_more_corruption (fs, FIXABLE);
problem --; problem --;
} }
@@ -312,7 +329,9 @@ static int got_already (reiserfs_filsys_t * fs, unsigned long block)
} }
/* 1 if it does not look like reasonable stat data */ /* 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) static int bad_stat_data (reiserfs_filsys_t * fs,
struct buffer_head * bh,
struct item_head * ih)
{ {
unsigned long objectid; unsigned long objectid;
// __u32 links; // __u32 links;
@@ -320,8 +339,8 @@ static int bad_stat_data (reiserfs_filsys_t * fs, struct buffer_head * bh, struc
objectid = get_key_objectid (&ih->ih_key); objectid = get_key_objectid (&ih->ih_key);
if (!is_objectid_used (fs, objectid)) { if (!is_objectid_used (fs, objectid)) {
/* FIXME: this could be cured right here */ /* 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", fsck_log ("bad_stat_data: The objectid (%lu) is marked free, but used "
objectid, &ih->ih_key); "by an object %k\n", objectid, &ih->ih_key);
/* if it is FIX_FIXABLE we flush objectid map at the end /* if it is FIX_FIXABLE we flush objectid map at the end
no way to call one_less_corruption later no way to call one_less_corruption later
@@ -331,7 +350,9 @@ static int bad_stat_data (reiserfs_filsys_t * fs, struct buffer_head * bh, struc
} }
if (id_map_mark(proper_id_map (fs), objectid)) { if (id_map_mark(proper_id_map (fs), objectid)) {
fsck_log ("bad_stat_data: The objectid (%lu) is shared by at least two files\n", objectid); fsck_log ("bad_stat_data: The objectid (%lu) is shared by at least two "
"files\n", objectid);
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) if (fsck_mode (fs) == FSCK_FIX_FIXABLE)
to_be_relocated (&ih->ih_key); to_be_relocated (&ih->ih_key);
@@ -361,13 +382,18 @@ static int bad_stat_data (reiserfs_filsys_t * fs, struct buffer_head * bh, struc
/* it looks like we can check item length only */ /* 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) static int bad_direct_item (reiserfs_filsys_t * fs,
struct buffer_head * bh,
struct item_head * ih)
{ {
return 0; return 0;
} }
inline void handle_one_pointer (reiserfs_filsys_t * fs, struct buffer_head * bh, __u32 * ptr) { inline void handle_one_pointer (reiserfs_filsys_t * fs,
struct buffer_head * bh,
__u32 * ptr)
{
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
fsck_log (" - zeroed"); fsck_log (" - zeroed");
*ptr = 0; *ptr = 0;
@@ -377,31 +403,38 @@ inline void handle_one_pointer (reiserfs_filsys_t * fs, struct buffer_head * bh,
} }
} }
/*
static int bad_badblocks_item (reiserfs_filsys_t * fs, struct buffer_head * bh, static int bad_badblocks_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
struct item_head * ih) { struct item_head * ih) {
int i; __u32 i;
__u32 * ind = (__u32 *)B_I_PITEM (bh, ih); __u32 * ind = (__u32 *)B_I_PITEM (bh, ih);
if (get_ih_item_len (ih) % 4) { if (get_ih_item_len (ih) % 4) {
fsck_log ("%s: block %lu: item (%H) has bad length\n", __FUNCTION__, fsck_log ("%s: block %lu: item (%H) has bad length\n", __FUNCTION__,
bh->b_blocknr, ih); bh->b_blocknr, ih);
one_more_corruption (fs, fatal); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
for (i = 0; i < I_UNFM_NUM (ih); i ++) { /* All valid badblocks are given in badblock bitmap. Nothing to check anymore. */
// __u32 unfm_ptr; if (fs->fs_badblocks_bm)
return 0;
// unfm_ptr = le32_to_cpu (ind [i]); for (i = 0; i < I_UNFM_NUM (ih); i ++) {
if (!le32_to_cpu (ind [i])) { if (!le32_to_cpu (ind [i])) {
fsck_log ("%s: block %lu: badblocks item (%H) has zero pointer."); /* fsck_log ("%s: block %lu: badblocks item (%H) has zero pointer.",
fsck_log ("Not an error, but could be deleted with --fix-fixable\n",
__FUNCTION__, bh->b_blocknr, ih); __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; continue;
} }
// check list of badblocks pointers /* check list of badblocks pointers */
if (le32_to_cpu (ind [i]) >= get_sb_block_count (fs->fs_ondisk_sb)) { if (le32_to_cpu (ind [i]) >= get_sb_block_count (fs->fs_ondisk_sb)) {
fsck_log ("%s: badblock pointer (block %lu) points out of disk spase (%lu)", fsck_log ("%s: badblock pointer (block %lu) points out of disk spase (%lu)",
__FUNCTION__, bh->b_blocknr, le32_to_cpu (ind [i])); __FUNCTION__, bh->b_blocknr, le32_to_cpu (ind [i]));
@@ -410,12 +443,12 @@ static int bad_badblocks_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
} }
if (did_we_meet_it (le32_to_cpu (ind [i]))) { if (did_we_meet_it (le32_to_cpu (ind [i]))) {
// it can be /* it can be
// 1. not_data_block 1. not_data_block
// delete pointer delete pointer
// 2. ind [i] or internal/leaf 2. ind [i] or internal/leaf
// advice to run fix-fixable if there is no fatal errors advice to run fix-fixable if there is no fatal errors
// with list of badblocks, say that it could fix it. with list of badblocks, say that it could fix it. */
if (not_data_block (fs, le32_to_cpu (ind [i]))) { if (not_data_block (fs, le32_to_cpu (ind [i]))) {
fsck_log ("%s: badblock pointer (block %lu) points on fs metadata (%lu)", fsck_log ("%s: badblock pointer (block %lu) points on fs metadata (%lu)",
@@ -423,19 +456,21 @@ static int bad_badblocks_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
handle_one_pointer (fs, bh, &ind[i]); handle_one_pointer (fs, bh, &ind[i]);
fsck_log ("\n"); fsck_log ("\n");
} else { } else {
one_more_corruption (fs, badblocks); one_more_corruption(fs, FIXABLE);
fsck_log ("%s: badblock item points to a block" fsck_log ("%s: badblock pointer (block %lu) points to a block (%lu) "
" which in the tree already. Use --badblock-file option" "which is in the tree already. Use badblock option (-B) to"
" to fix the problem\n", __FUNCTION__); " fix the problem\n", __FUNCTION__, bh->b_blocknr,
le32_to_cpu(ind[i]));
} }
} else {
we_met_it (le32_to_cpu (ind [i])); continue;
} }
we_met_it(le32_to_cpu(ind[i]));
} }
return 0; return 0;
} }
*/
/* for each unformatted node pointer: make sure it points to data area and /* for each unformatted node pointer: make sure it points to data area and
that it is not in the tree yet */ that it is not in the tree yet */
@@ -465,16 +500,20 @@ static int bad_indirect_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
/* check unformatted node pointer and mark it used in the /* check unformatted node pointer and mark it used in the
control bitmap */ control bitmap */
if (bad_block_number (fs, le32_to_cpu (ind [i]))) { if (bad_block_number (fs, le32_to_cpu (ind [i]))) {
fsck_log ("%s: block %lu: The item %k has the bad pointer (%d) to the block (%lu)", fsck_log ("%s: block %lu: The item %k has the bad pointer (%d) to "
__FUNCTION__, bh->b_blocknr, &ih->ih_key, i, le32_to_cpu (ind [i])); "the block (%lu)", __FUNCTION__, bh->b_blocknr,
&ih->ih_key, i, le32_to_cpu (ind [i]));
handle_one_pointer (fs, bh, &ind[i]); handle_one_pointer (fs, bh, &ind[i]);
fsck_log ("\n"); fsck_log ("\n");
continue; continue;
} }
if (got_already (fs, le32_to_cpu (ind [i]))) { if (got_already (fs, le32_to_cpu (ind [i]))) {
fsck_log ("%s: block %lu: The item (%H) has the bad pointer (%d) to the block (%lu), " fsck_log ("%s: block %lu: The item (%H) has the bad pointer (%d) "
"which is in tree already", __FUNCTION__, bh->b_blocknr, ih, i, le32_to_cpu (ind [i])); "to the block (%lu), which is in tree already",
__FUNCTION__, bh->b_blocknr, ih, i, le32_to_cpu(ind[i]));
handle_one_pointer (fs, bh, &ind [i]); handle_one_pointer (fs, bh, &ind [i]);
fsck_log ("\n"); fsck_log ("\n");
continue; continue;
@@ -498,7 +537,9 @@ static int bad_indirect_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
/* FIXME: this was is_bad_directory from pass0.c */ /* 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) static int bad_directory_item (reiserfs_filsys_t * fs,
struct buffer_head * bh,
struct item_head * ih)
{ {
char * name; char * name;
int namelen; int namelen;
@@ -520,16 +561,20 @@ static int bad_directory_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
/* make sure item looks like a directory */ /* make sure item looks like a directory */
if (get_ih_item_len (ih) / (DEH_SIZE + min_entry_size) < count) { if (get_ih_item_len (ih) / (DEH_SIZE + min_entry_size) < count) {
/* entry count can not be that big */ /* entry count can not be that big */
fsck_log ("%s: block %lu: The directory item %k has the exsessively big entry count (%u)\n", fsck_log ("%s: block %lu: The directory item %k has the exsessively "
__FUNCTION__, bh->b_blocknr, &ih->ih_key, count); "big entry count (%u)\n", __FUNCTION__, bh->b_blocknr,
&ih->ih_key, count);
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
if (get_deh_location (&deh[count - 1]) != DEH_SIZE * count) { if (get_deh_location (&deh[count - 1]) != DEH_SIZE * count) {
/* last entry should start right after array of dir entry headers */ /* 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", fsck_log ("%s: block %lu: The directory item %k has the corrupted "
__FUNCTION__, bh->b_blocknr, &ih->ih_key); "entry structure\n", __FUNCTION__, bh->b_blocknr,
&ih->ih_key);
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
@@ -539,8 +584,10 @@ static int bad_directory_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
namelen = name_in_entry_length (ih, deh, i); namelen = name_in_entry_length (ih, deh, i);
name = name_in_entry (deh, i); name = name_in_entry (deh, i);
if (!is_properly_hashed (fs, name, namelen, get_deh_offset (deh))) { if (!is_properly_hashed (fs, name, namelen, get_deh_offset (deh))) {
fsck_log ("%s: block %lu: The directory item %k has a not properly hashed entry (%d)\n", fsck_log ("%s: block %lu: The directory item %k has a not properly "
__FUNCTION__, bh->b_blocknr, &ih->ih_key, i); "hashed entry (%d)\n", __FUNCTION__, bh->b_blocknr,
&ih->ih_key, i);
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
@@ -551,10 +598,12 @@ static int bad_directory_item (reiserfs_filsys_t * fs, struct buffer_head * bh,
/* ok, items looks like a directory */ /* ok, items looks like a directory */
for (i = 0; i < count; i ++, deh ++) { for (i = 0; i < count; i ++, deh ++) {
if (get_deh_state (deh) != state) { if (get_deh_state (deh) != state) {
fsck_log ("bad_directory_item: block %lu: The directory item %k has the entry (%d) " fsck_log ("bad_directory_item: block %lu: The directory item %k "
"\"%.*s\" with a not legal state (%o), (%o) expected", "has the entry (%d) \"%.*s\" with a not legal state "
bh->b_blocknr, &ih->ih_key, i, name_in_entry_length (ih, deh, i), "(%o), (%o) expected", bh->b_blocknr, &ih->ih_key, i,
name_in_entry (deh, i), get_deh_state (deh), state); name_in_entry_length (ih, deh, i), name_in_entry (deh, i),
get_deh_state (deh), state);
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
set_deh_state (deh, 1 << DEH_Visible2); set_deh_state (deh, 1 << DEH_Visible2);
mark_buffer_dirty (bh); mark_buffer_dirty (bh);
@@ -580,11 +629,12 @@ static int bad_item (reiserfs_filsys_t * fs, struct buffer_head * bh, int num)
if ((get_ih_flags(ih)) != 0) { if ((get_ih_flags(ih)) != 0) {
if (fsck_mode(fs) != FSCK_FIX_FIXABLE) { if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
one_more_corruption (fs, FIXABLE); one_more_corruption (fs, FIXABLE);
fsck_log ("%s: vpf-10570: block %lu: The item header (%d) has not cleaned flags.\n", fsck_log ("%s: vpf-10570: block %lu: The item header (%d) has not "
__FUNCTION__, bh->b_blocknr, num); "cleaned flags.\n", __FUNCTION__, bh->b_blocknr, num);
} else { } else {
fsck_log ("%s: vpf-10580: block %lu: Flags in the item header (%d) were cleaned\n", fsck_log ("%s: vpf-10580: block %lu: Flags in the item header "
__FUNCTION__, bh->b_blocknr, num); "(%d) were cleaned\n", __FUNCTION__, bh->b_blocknr, num);
clean_ih_flags(ih); clean_ih_flags(ih);
mark_buffer_dirty(bh); mark_buffer_dirty(bh);
} }
@@ -601,70 +651,52 @@ static int bad_item (reiserfs_filsys_t * fs, struct buffer_head * bh, int num)
if (format != get_ih_key_format(ih)) { if (format != get_ih_key_format(ih)) {
if (fsck_mode(fs) != FSCK_FIX_FIXABLE) { if (fsck_mode(fs) != FSCK_FIX_FIXABLE) {
one_more_corruption (fs, FIXABLE); one_more_corruption (fs, FIXABLE);
fsck_log ("%s: vpf-10710: block %lu: The format (%d) specified in the item header (%d) " fsck_log ("%s: vpf-10710: block %lu: The format (%d) specified "
"differs from the key format (%d).\n", __FUNCTION__, bh->b_blocknr, "in the item header (%d) differs from the key format "
"(%d).\n", __FUNCTION__, bh->b_blocknr,
get_ih_key_format(ih), num, format); get_ih_key_format(ih), num, format);
} else { } else {
fsck_log ("%s: vpf-10720: block %lu: The format (%d) specified in the item header (%d) " fsck_log ("%s: vpf-10720: block %lu: The format (%d) specified in "
"was fixed to the key format (%d).\n", __FUNCTION__, bh->b_blocknr, "the item header (%d) was fixed to the key format (%d).\n",
get_ih_key_format(ih), num, format); __FUNCTION__, bh->b_blocknr, get_ih_key_format(ih), num,
format);
set_ih_key_format(ih, format); set_ih_key_format(ih, format);
mark_buffer_dirty(bh); mark_buffer_dirty(bh);
} }
} }
if (get_key_dirid (&ih->ih_key) == (__u32)-1) { if (get_key_objectid (&ih->ih_key) == BADBLOCK_OBJID) {
if (get_key_objectid (&ih->ih_key) != (__u32)-1) { if (get_key_dirid (&ih->ih_key) == BADBLOCK_DIRID && is_indirect_ih (ih)) {
/* safe link can be /* Bad Block support. */
-1 object_id 0x1 INDIRECT (truncate) or return bad_badblocks_item (fs, bh, ih);
-1 object_id blocksize+1 DIRECT (unlink) }
*/
if (is_direct_ih(ih)) goto error;
if (get_offset(&ih->ih_key) == fs->fs_blocksize + 1) } 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) { if (get_ih_item_len (ih) == 4) {
/*fsck_log("vpf-00010: safe link found %k\n", &ih->ih_key);*/ /*fsck_log("vpf-00010: safe link found %k\n", &ih->ih_key);*/
fsck_check_stat(fs)->safe ++; fsck_check_stat(fs)->safe ++;
return 0; return 0;
} }
}
if (is_indirect_ih(ih)) if (is_indirect_ih(ih) && get_offset(&ih->ih_key) == 0x1) {
if(get_offset(&ih->ih_key) == 0x1)
if (get_ih_item_len (ih) == 4) { if (get_ih_item_len (ih) == 4) {
/*fsck_log("vpf-00020: safe link found %k\n", &ih->ih_key);*/ /*fsck_log("vpf-00020: safe link found %k\n", &ih->ih_key);*/
fsck_check_stat(fs)->safe ++; fsck_check_stat(fs)->safe ++;
return 0; return 0;
} }
}
/* it does not look like safe link */ /* it does not look like safe link */
goto error;
/* dir_id == -1 can be used only by safe links */
one_more_corruption (fs, FATAL);
fsck_log ("%s: vpf-10290: block %lu, item %d: The item has a wrong key %k\n",
__FUNCTION__, num, bh->b_blocknr, &ih->ih_key);
return 1;
} else {
/* BAD BLOCK LIST SUPPORT
if (is_indirect_ih (ih)) {
// it looks like badblocks item
if (fs->fs_badblocks_bm)
return 0;
else
return bad_badblocks_item (fs, bh, ih);
} else {*/
one_more_corruption (fs, FATAL);
fsck_log ("%s: vpf-10300: block %lu, item %d: The item has a wrong key %k\n",
__FUNCTION__, num, bh->b_blocknr, &ih->ih_key);
return 1;
} }
} else if (get_key_objectid (&ih->ih_key) == (__u32)-1) {
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;
} }
if (is_stat_data_ih (ih)) if (is_stat_data_ih (ih))
@@ -677,12 +709,17 @@ static int bad_item (reiserfs_filsys_t * fs, struct buffer_head * bh, int num)
return bad_indirect_item (fs, bh, ih); return bad_indirect_item (fs, bh, ih);
return bad_directory_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 */ /* 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) int bad_pair (reiserfs_filsys_t * fs, struct buffer_head * bh, int pos) {
{
struct item_head * ih; struct item_head * ih;
ih = B_N_PITEM_HEAD (bh, pos); ih = B_N_PITEM_HEAD (bh, pos);
@@ -701,15 +738,15 @@ int bad_pair (reiserfs_filsys_t * fs, struct buffer_head * bh, int pos)
return 1; return 1;
} }
if (get_key_dirid (&ih->ih_key) == (__u32)-1) { if (get_key_objectid (&ih->ih_key) == BADBLOCK_OBJID) {
if (get_key_objectid (&ih->ih_key) == (__u32)-1) { /* BAD BLOCK LIST SUPPORT. */
/* BAD BLOCK LIST SUPPORT if (get_key_dirid(&ih->ih_key) == BADBLOCK_DIRID &&
if (is_indirect_ih (ih) && comp_short_keys (&((ih - 1)->ih_key), &ih->ih_key) != 0) is_indirect_ih(ih) && comp_short_keys(&((ih - 1)->ih_key),
return 0; // badblocks item &ih->ih_key))
*/ return 0;
/* it does not look like badblocks item */
} else { } else {
/* safe link ? */ /* 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 (comp_short_keys (&((ih - 1)->ih_key), &ih->ih_key) == 0) {
if (is_indirect_ih (ih - 1) && is_direct_ih(ih)) if (is_indirect_ih (ih - 1) && is_direct_ih(ih))
return 0; /* safe link */ return 0; /* safe link */
@@ -723,20 +760,21 @@ int bad_pair (reiserfs_filsys_t * fs, struct buffer_head * bh, int pos)
} }
if (is_direct_ih(ih)) { if (is_direct_ih(ih)) {
/* left item must be indirect or stat data item of the same /* left item must be indirect or stat data item of the same file */
file */
if (not_of_one_file (&((ih - 1)->ih_key), &ih->ih_key)) { if (not_of_one_file (&((ih - 1)->ih_key), &ih->ih_key)) {
if (fsck_mode (fs) != FSCK_REBUILD) if (fsck_mode (fs) != FSCK_REBUILD)
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
if (!((is_stat_data_ih (ih - 1) && get_offset (&ih->ih_key) == 1) || if (!((is_stat_data_ih (ih - 1) && get_offset (&ih->ih_key) == 1) ||
(is_indirect_ih (ih - 1) && (is_indirect_ih (ih - 1) && get_offset (&(ih - 1)->ih_key) +
get_offset (&(ih - 1)->ih_key) + get_bytes_number (ih-1, bh->b_size) == get_bytes_number (ih-1, bh->b_size) == get_offset (&ih->ih_key))))
get_offset (&ih->ih_key)))) { {
if (fsck_mode (fs) != FSCK_REBUILD) if (fsck_mode (fs) != FSCK_REBUILD)
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
} }
@@ -764,13 +802,14 @@ static int bad_leaf (reiserfs_filsys_t * fs, struct buffer_head * bh)
for (i = 0; i < B_NR_ITEMS (bh); i ++) { for (i = 0; i < B_NR_ITEMS (bh); i ++) {
if (bad_item (fs, bh, i)) { if (bad_item (fs, bh, i)) {
fsck_log ("bad_leaf: block %lu, item %d: The corrupted item found (%H)\n", fsck_log ("bad_leaf: block %lu, item %d: The corrupted item found "
bh->b_blocknr, i, B_N_PITEM_HEAD (bh, i)); "(%H)\n", bh->b_blocknr, i, B_N_PITEM_HEAD (bh, i));
} }
if (i && bad_pair (fs, 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", fsck_log ("bad_leaf: block %lu, items %d and %d: The wrong order "
bh->b_blocknr, i-1, i, &B_N_PITEM_HEAD (bh, i-1)->ih_key, "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); &B_N_PITEM_HEAD (bh, i)->ih_key);
} }
} }
@@ -785,19 +824,24 @@ static int bad_internal (reiserfs_filsys_t * fs, struct buffer_head * bh)
for (i = 0; i <= B_NR_ITEMS (bh); i ++) { for (i = 0; i <= B_NR_ITEMS (bh); i ++) {
if (i != B_NR_ITEMS (bh) && i != B_NR_ITEMS (bh) - 1) if (i != B_NR_ITEMS (bh) && i != B_NR_ITEMS (bh) - 1)
/* make sure that keys are in increasing order */ /* 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) { if (comp_keys (B_N_PDELIM_KEY (bh, i),
fsck_log ("%s: vpf-10320: block %lu, items %d and %d: The wrong order " B_N_PDELIM_KEY (bh, i + 1)) != -1)
"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)); 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); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
/* make sure that the child is correct */ /* make sure that the child is correct */
if (bad_block_number (fs, get_dc_child_blocknr (B_N_CHILD (bh,i)))) { 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 " fsck_log ("%s: vpf-10330: block %lu, item %d: The internal item "
"not legal block (%lu)\n", __FUNCTION__, bh->b_blocknr, i, "points to the not legal block (%lu)\n", __FUNCTION__,
get_dc_child_blocknr (B_N_CHILD (bh,i))); bh->b_blocknr, i, get_dc_child_blocknr (B_N_CHILD (bh,i)));
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
@@ -819,22 +863,24 @@ static int bad_node (reiserfs_filsys_t * fs, struct buffer_head ** path, int h)
struct buffer_head ** pbh = &path[h]; struct buffer_head ** pbh = &path[h];
if (B_LEVEL (*pbh) != h_to_level (fs, 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", fsck_log ("block %lu: The level of the node (%d) is not correct, "
(*pbh)->b_blocknr, B_LEVEL (*pbh), h_to_level (fs, h)); "(%d) expected\n", (*pbh)->b_blocknr, B_LEVEL (*pbh),
h_to_level (fs, h));
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
if (bad_block_number (fs, (*pbh)->b_blocknr)) { if (bad_block_number (fs, (*pbh)->b_blocknr)) {
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
fsck_log ("%s: vpf-10340: The node in the wrong block number (%lu) found in the tree\n", fsck_log ("%s: vpf-10340: The node in the wrong block number (%lu) "
__FUNCTION__, (*pbh)->b_blocknr); "found in the tree\n", __FUNCTION__, (*pbh)->b_blocknr);
return 1; return 1;
} }
if (got_already (fs, (*pbh)->b_blocknr)) { if (got_already (fs, (*pbh)->b_blocknr)) {
fsck_log ("%s: vpf-10350: The block (%lu) is used more than once in the tree.\n", fsck_log ("%s: vpf-10350: The block (%lu) is used more than once "
__FUNCTION__, (*pbh)->b_blocknr); "in the tree.\n", __FUNCTION__, (*pbh)->b_blocknr);
one_more_corruption (fs, FATAL); one_more_corruption (fs, FATAL);
return 1; return 1;
} }
@@ -927,7 +973,7 @@ static int bad_path (reiserfs_filsys_t * fs, struct buffer_head ** path, int h1)
dk = rkey (path, h); dk = rkey (path, h);
if (dk && comp_keys (dk, B_N_PKEY (path[h], if (dk && comp_keys (dk, B_N_PKEY (path[h],
get_blkh_nr_items (B_BLK_HEAD (path[h])) - 1)) != 1) { get_blkh_nr_items (B_BLK_HEAD (path[h])) - 1)) != 1) {
/* right delimiting key must be greater than the key of the last item in the node */ /* 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 " 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", "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, dk, path[h]->b_blocknr, get_blkh_nr_items (B_BLK_HEAD (path[h])) - 1,
@@ -950,8 +996,11 @@ static int bad_path (reiserfs_filsys_t * fs, struct buffer_head ** path, int h1)
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) { if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
set_dc_child_size (B_N_CHILD(path[h-1],pos), path[h]->b_size - 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); get_blkh_free_space ((struct block_head *)path[h]->b_data)
fsck_log (" - corrected to (%lu)\n", get_dc_child_size (B_N_CHILD(path[h-1],pos))); - 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]); mark_buffer_dirty (path[h-1]);
} else { } else {
one_more_corruption (fs, FIXABLE); one_more_corruption (fs, FIXABLE);
@@ -1010,13 +1059,17 @@ void check_fs_tree (reiserfs_filsys_t * fs)
after_check_fs_tree (fs); after_check_fs_tree (fs);
} }
static int clean_attributes_handler (reiserfs_filsys_t * fs, struct buffer_head ** path, int h) { static int clean_attributes_handler (reiserfs_filsys_t * fs,
struct buffer_head ** path,
int h)
{
struct buffer_head * bh = path[h]; struct buffer_head * bh = path[h];
int i; int i;
if (B_LEVEL (bh) != h_to_level (fs, h)) { 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", reiserfs_panic ("The node (%lu) with wrong level (%d) found in the "
bh->b_blocknr, B_LEVEL (bh), h_to_level (fs, h)); "tree, (%d) expected\n", bh->b_blocknr, B_LEVEL (bh),
h_to_level (fs, h));
} }
if (!is_leaf_node (bh)) if (!is_leaf_node (bh))
@@ -1038,5 +1091,3 @@ void do_clean_attributes (reiserfs_filsys_t * fs) {
set_sb_v2_flag (fs->fs_ondisk_sb, reiserfs_attrs_cleared); set_sb_v2_flag (fs->fs_ondisk_sb, reiserfs_attrs_cleared);
mark_buffer_dirty (fs->fs_super_bh); mark_buffer_dirty (fs->fs_super_bh);
} }
+5 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -22,6 +22,8 @@
#include "misc.h" #include "misc.h"
#include "reiserfs_lib.h" #include "reiserfs_lib.h"
#include "../include/config.h"
#include "../version.h"
/* main.c */ /* main.c */
extern reiserfs_filsys_t * fs; extern reiserfs_filsys_t * fs;
@@ -30,6 +32,7 @@ int main (int argc, char * argv []);
/* Exit codes. */ /* Exit codes. */
#define EXIT_OK 0 #define EXIT_OK 0
#define EXIT_FIXED 1 #define EXIT_FIXED 1
#define EXIT_REBOOT 2
#define EXIT_FATAL 4 #define EXIT_FATAL 4
#define EXIT_FIXABLE 6 #define EXIT_FIXABLE 6
#define EXIT_OPER 8 /* Some operation returns error. */ #define EXIT_OPER 8 /* Some operation returns error. */
@@ -187,7 +190,6 @@ void pass_3a_look_for_lost (reiserfs_filsys_t *);
void load_lost_found_result (reiserfs_filsys_t *); void load_lost_found_result (reiserfs_filsys_t *);
/* pass4.c */ /* pass4.c */
//void get_next_key (struct path * path, int i, struct key * key);
void pass_4_check_unaccessed_items (void); void pass_4_check_unaccessed_items (void);
/* check.c */ /* check.c */
@@ -406,6 +408,7 @@ struct check_info {
struct fsck_data { struct fsck_data {
unsigned short mode; /* check, rebuild, etc*/ unsigned short mode; /* check, rebuild, etc*/
unsigned long options; unsigned long options;
unsigned long mounted;
struct rebuild_info rebuild; struct rebuild_info rebuild;
struct check_info check; struct check_info check;
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+141 -124
View File
@@ -1,14 +1,12 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
#include "fsck.h" #include "fsck.h"
#include <getopt.h> #include <getopt.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <sys/mman.h>
#include "../include/config.h"
#include "../version.h"
extern int screen_width; extern int screen_width;
extern int screen_savebuffer_len; extern int screen_savebuffer_len;
@@ -18,7 +16,7 @@ reiserfs_filsys_t * fs;
char * badblocks_file; char * badblocks_file;
#define print_usage_and_exit() { \ #define print_usage_and_exit() { \
fsck_progress ("\nUsage: %s [mode] [options] " \ fsck_progress ("Usage: %s [mode] [options] " \
" device\n" \ " device\n" \
"\n" \ "\n" \
"Modes:\n" \ "Modes:\n" \
@@ -32,6 +30,7 @@ fsck_progress ("\nUsage: %s [mode] [options] " \
" --clean-attributes\t\tclean garbage in reserved fields in StatDatas \n" \ " --clean-attributes\t\tclean garbage in reserved fields in StatDatas \n" \
"Options:\n" \ "Options:\n" \
" -j | --journal device\t\tspecify journal if relocated\n" \ " -j | --journal device\t\tspecify journal if relocated\n" \
" -B | --badblocks file\t\tfile with list of all bad blocks on the fs\n" \
" -l | --logfile file\t\tmake fsck to complain to specifed file\n" \ " -l | --logfile file\t\tmake fsck to complain to specifed file\n" \
" -n | --nolog\t\t\tmake fsck to not complain\n" \ " -n | --nolog\t\t\tmake fsck to not complain\n" \
" -z | --adjust-size\t\tfix file sizes to real size\n" \ " -z | --adjust-size\t\tfix file sizes to real size\n" \
@@ -49,9 +48,6 @@ fsck_progress ("\nUsage: %s [mode] [options] " \
} }
/* /*
" -B badblocks-file\n"\
" \t\t\tlist of all bad blocks on the fs\n"\
-B works with --fix-fixable -B works with --fix-fixable
fixes indirect pointers pointed to fixes indirect pointers pointed to
badblocks, adds badblocks to badblock list in fs. badblocks, adds badblocks to badblock list in fs.
@@ -101,6 +97,7 @@ static char * parse_options (struct fsck_data * data, int argc, char * argv [])
{"clean-attributes", no_argument, &mode, FSCK_CLEAN_ATTRIBUTES}, {"clean-attributes", no_argument, &mode, FSCK_CLEAN_ATTRIBUTES},
/* options */ /* options */
{"logfile", required_argument, 0, 'l'}, {"logfile", required_argument, 0, 'l'},
{"badblocks", required_argument, 0, 'B'},
{"interactive", no_argument, 0, 'i'}, {"interactive", no_argument, 0, 'i'},
{"adjust-size", no_argument, 0, 'z'}, {"adjust-size", no_argument, 0, 'z'},
{"quiet", no_argument, 0, 'q'}, {"quiet", no_argument, 0, 'q'},
@@ -124,7 +121,7 @@ static char * parse_options (struct fsck_data * data, int argc, char * argv [])
{"journal", required_argument, 0, 'j'}, {"journal", required_argument, 0, 'j'},
{"no-journal-available", no_argument, &flag, OPT_SKIP_JOURNAL}, {"no-journal-available", no_argument, &flag, OPT_SKIP_JOURNAL},
// {"bad-block-file", required_argument, 0, 'B'}, {"bad-block-file", required_argument, 0, 'B'},
/* start reiserfsck in background and exit */ /* start reiserfsck in background and exit */
{"background", no_argument, 0, 'g'}, {"background", no_argument, 0, 'g'},
@@ -133,7 +130,7 @@ static char * parse_options (struct fsck_data * data, int argc, char * argv [])
}; };
int option_index; int option_index;
c = getopt_long (argc, argv, "iql:nb:Szd:R:h:j:gafVrpyt:", c = getopt_long (argc, argv, "iql:nb:Szd:R:h:j:gafVrpyt:B:",
options, &option_index); options, &option_index);
if (c == -1) if (c == -1)
break; break;
@@ -280,9 +277,13 @@ static char * parse_options (struct fsck_data * data, int argc, char * argv [])
print_usage_and_exit(); print_usage_and_exit();
} }
if ((data->options & BADBLOCKS_FILE) && ((mode == FSCK_SB) if ((data->options & BADBLOCKS_FILE) && mode != FSCK_REBUILD &&
|| (mode == FSCK_CLEAN_ATTRIBUTES) || (mode == FSCK_CHECK))) mode != FSCK_FIX_FIXABLE)
{
fprintf(stderr, "Badblocks can be specified with --fix-fixable or "
"--rebuild-tree only.\n");
print_usage_and_exit(); print_usage_and_exit();
}
if ((mode == FSCK_REBUILD) && (data->options & OPT_YES)) if ((mode == FSCK_REBUILD) && (data->options & OPT_YES))
data->options &= ~OPT_YES; data->options &= ~OPT_YES;
@@ -296,36 +297,36 @@ static char * parse_options (struct fsck_data * data, int argc, char * argv [])
#define REBUILD_WARNING \ #define REBUILD_WARNING \
" *************************************************************\n\ "*************************************************************\n\
** Do not run the program with --rebuild-tree unless **\n\ ** Do not run the program with --rebuild-tree unless **\n\
** something is broken and MAKE A BACKUP before using it. **\n\ ** something is broken and MAKE A BACKUP before using it. **\n\
** If you have bad sectors on a drive it is usually a bad **\n\ ** If you have bad sectors on a drive it is usually a bad **\n\
** idea to continue using it. Then you probably should get **\n\ ** idea to continue using it. Then you probably should get **\n\
** a working hard drive, copy the file system from the bad **\n\ ** a working hard drive, copy the file system from the bad **\n\
** drive to the good one -- dd_rescue is a good tool for **\n\ ** drive to the good one -- dd_rescue is a good tool for **\n\
** that -- and only then run this program. **\n\ ** that -- and only then run this program. **\n\
** If you are using the latest reiserfsprogs and it fails **\n\ ** If you are using the latest reiserfsprogs and it fails **\n\
** please email bug reports to reiserfs-list@namesys.com, **\n\ ** please email bug reports to reiserfs-list@namesys.com, **\n\
** providing as much information as possible -- your **\n\ ** providing as much information as possible -- your **\n\
** hardware, kernel, patches, settings, all reiserfsck **\n\ ** hardware, kernel, patches, settings, all reiserfsck **\n\
** messages (including version), the reiserfsck logfile, **\n\ ** messages (including version), the reiserfsck logfile, **\n\
** check the syslog file for any related information. **\n\ ** check the syslog file for any related information. **\n\
** If you would like advice on using this program, support **\n\ ** If you would like advice on using this program, support **\n\
** is available for $25 at www.namesys.com/support.html. **\n\ ** is available for $25 at www.namesys.com/support.html. **\n\
*************************************************************\n\ *************************************************************\n\
\nWill rebuild the filesystem (%s) tree\n" \nWill rebuild the filesystem (%s) tree\n"
#define START_WARNING \ #define START_WARNING \
" *************************************************************\n\ "*************************************************************\n\
** If you are using the latest reiserfsprogs and it fails **\n\ ** If you are using the latest reiserfsprogs and it fails **\n\
** please email bug reports to reiserfs-list@namesys.com, **\n\ ** please email bug reports to reiserfs-list@namesys.com, **\n\
** providing as much information as possible -- your **\n\ ** providing as much information as possible -- your **\n\
** hardware, kernel, patches, settings, all reiserfsck **\n\ ** hardware, kernel, patches, settings, all reiserfsck **\n\
** messages (including version), the reiserfsck logfile, **\n\ ** messages (including version), the reiserfsck logfile, **\n\
** check the syslog file for any related information. **\n\ ** check the syslog file for any related information. **\n\
** If you would like advice on using this program, support **\n\ ** If you would like advice on using this program, support **\n\
** is available for $25 at www.namesys.com/support.html. **\n\ ** is available for $25 at www.namesys.com/support.html. **\n\
*************************************************************\n\ *************************************************************\n\
\n" \n"
@@ -530,7 +531,7 @@ static void reset_super_block (reiserfs_filsys_t * fs)
set_sb_reserved_for_journal (sb, 0); set_sb_reserved_for_journal (sb, 0);
set_jp_journal_dev (sb_jp(sb), 0); set_jp_journal_dev (sb_jp(sb), 0);
set_jp_journal_magic (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_1st_block (sb_jp(sb), get_journal_start_must (fs));
set_jp_journal_size (sb_jp(sb), set_jp_journal_size (sb_jp(sb),
journal_default_size (fs->fs_super_bh->b_blocknr, fs->fs_blocksize)); journal_default_size (fs->fs_super_bh->b_blocknr, fs->fs_blocksize));
@@ -545,7 +546,8 @@ static void reset_super_block (reiserfs_filsys_t * fs)
set_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());
set_jp_journal_dev (&jh->jh_journal, 0); set_jp_journal_dev (&jh->jh_journal, 0);
set_jp_journal_magic (&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, set_jp_journal_1st_block (&jh->jh_journal,
get_jp_journal_1st_block(sb_jp(sb))); 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_size (&jh->jh_journal, get_jp_journal_size(sb_jp(sb)));
@@ -722,9 +724,10 @@ static void reiserfsck_replay_journal (reiserfs_filsys_t * fs) {
fs->fs_ondisk_sb = on_place_sb; fs->fs_ondisk_sb = on_place_sb;
} }
static void the_end (reiserfs_filsys_t * fs) static int the_end (reiserfs_filsys_t * fs)
{ {
struct reiserfs_super_block * sb; struct reiserfs_super_block * sb;
int ret = EXIT_FIXED;
sb = fs->fs_ondisk_sb; sb = fs->fs_ondisk_sb;
@@ -744,40 +747,84 @@ static void the_end (reiserfs_filsys_t * fs)
mark_filesystem_consistent (fs); mark_filesystem_consistent (fs);
clear_buffer_do_not_flush (fs->fs_super_bh); clear_buffer_do_not_flush (fs->fs_super_bh);
if (fsck_data(fs)->mounted == MF_RO) {
reiserfs_warning(stderr, "\nThe partition is mounted ro. It "
"is better to umount and mount it again.\n\n");
ret = EXIT_REBOOT;
}
/* write all dirty blocks */ /* write all dirty blocks */
fsck_progress ("Syncing.."); fsck_progress ("Syncing..");
fs->fs_dirt = 1; fs->fs_dirt = 1;
clean_after_dma_check(fs->fs_dev, &dma_info); clean_after_dma_check(fs->fs_dev, &dma_info);
reiserfs_close (fs); reiserfs_close (fs);
fsck_progress ("finished\n"); fsck_progress ("finished\n");
return ret;
} }
/* check umounted or read-only mounted filesystems only */
static void prepare_fs_for_check(reiserfs_filsys_t * fs) {
/* The method could be called from auto_check already. */
if (fs->fs_flags == O_RDWR)
return;
static void rebuild_tree (reiserfs_filsys_t * fs) reiserfs_reopen (fs, O_RDWR);
{
time_t t;
int ret;
if (is_mounted (fs->fs_file_name)) { fsck_data(fs)->mounted = misc_device_mounted(fs->fs_file_name);
fsck_progress ("rebuild_tree: Cannot rebuild tree of mounted filesystem\n");
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);
exit(EXIT_USER); exit(EXIT_USER);
} }
/* If not CHECK mode, lock the process in the memory. */
if (fsck_mode (fs) != FSCK_CHECK) {
if (mlockall(MCL_CURRENT)) {
reiserfs_warning (stderr, "Failed to lock the process to "
"fsck the mounted ro partition. %s.\n",
strerror(errno));
exit(EXIT_OPER);
}
}
if (!reiserfs_journal_opened (fs)) {
/* just to make sure */
reiserfs_panic ("Journal is not opened");
} else if (reiserfs_journal_params_check(fs)) {
reiserfs_close (fs);
exit(EXIT_FATAL);
}
fsck_progress ("Filesystem seems mounted read-only. Skipping journal "
"replay.\n");
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
fsck_progress ("--fix-fixable ignored\n");
fsck_mode (fs) = FSCK_CHECK;
}
} else if (!fsck_skip_journal (fs)) {
if (reiserfs_journal_params_check(fs)) {
reiserfs_close (fs);
exit(EXIT_FATAL);
}
/* filesystem is not mounted, replay journal before checking */
reiserfsck_replay_journal (fs);
}
}
static void rebuild_tree (reiserfs_filsys_t * fs) {
time_t t;
int ret;
init_rollback_file (state_rollback_file(fs), &fs->fs_blocksize, init_rollback_file (state_rollback_file(fs), &fs->fs_blocksize,
fsck_data(fs)->log); fsck_data(fs)->log);
reiserfs_reopen (fs, O_RDWR); prepare_fs_for_check(fs);
if (!fsck_skip_journal (fs)) {
if (reiserfs_journal_params_check(fs)) {
reiserfs_close(fs);
exit(EXIT_FATAL);
}
/* rebuild starts with journal replaying */
if (!fsck_skip_journal (fs))
reiserfsck_replay_journal (fs);
}
ret = reiserfs_open_ondisk_bitmap (fs); ret = reiserfs_open_ondisk_bitmap (fs);
if (ret < 0) { if (ret < 0) {
@@ -818,7 +865,7 @@ static void rebuild_tree (reiserfs_filsys_t * fs)
/* 4. look for unaccessed items in the leaves */ /* 4. look for unaccessed items in the leaves */
pass_4_check_unaccessed_items (); pass_4_check_unaccessed_items ();
the_end (fs); ret = the_end (fs);
} }
close_rollback_file (); close_rollback_file ();
@@ -827,58 +874,7 @@ static void rebuild_tree (reiserfs_filsys_t * fs)
fsck_progress ("###########\n" fsck_progress ("###########\n"
"reiserfsck finished at %s" "reiserfsck finished at %s"
"###########\n", ctime (&t)); "###########\n", ctime (&t));
exit (EXIT_OK); exit (ret);
}
/* check umounted or read-only mounted filesystems only */
static void prepare_fs_for_check(reiserfs_filsys_t * fs)
{
/* The method could be called from auto_check already. */
if (fs->fs_flags == O_RDWR)
return;
reiserfs_reopen (fs, O_RDWR);
if (is_mounted (fs->fs_file_name)) {
/* filesystem seems mounted. */
if (fsck_mode (fs) == FSCK_CLEAN_ATTRIBUTES) {
fsck_progress ("Partition %s is mounted, cannot clean attributes "
"on mounted device\n", fs->fs_file_name);
reiserfs_close (fs);
exit(EXIT_USER);
}
if (!is_mounted_read_only (fs->fs_file_name)) {
fsck_progress ("Partition %s is mounted with write permissions, "
"cannot check it\n", fs->fs_file_name);
reiserfs_close (fs);
exit(EXIT_USER);
}
if (!reiserfs_journal_opened (fs)) {
/* just to make sure */
reiserfs_panic ("Journal is not opened");
} else if (reiserfs_journal_params_check(fs)) {
reiserfs_close (fs);
exit(EXIT_FATAL);
}
fsck_progress ("Filesystem seems mounted read-only. Skipping journal "
"replay.\n");
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
fsck_progress ("--fix-fixable ignored\n");
fsck_mode (fs) = FSCK_CHECK;
}
} else if (!fsck_skip_journal (fs)) {
if (reiserfs_journal_params_check(fs)) {
reiserfs_close (fs);
exit(EXIT_FATAL);
}
/* filesystem is not mounted, replay journal before checking */
reiserfsck_replay_journal (fs);
}
} }
static void clean_attributes (reiserfs_filsys_t * fs) { static void clean_attributes (reiserfs_filsys_t * fs) {
@@ -990,6 +986,7 @@ static int auto_check (reiserfs_filsys_t *fs) {
} }
check_fs_tree (fs); check_fs_tree (fs);
if (fsck_data (fs)->check.fatal_corruptions) { if (fsck_data (fs)->check.fatal_corruptions) {
fprintf(stderr, "%lu fatal corruption(s) found in the root block. Running " fprintf(stderr, "%lu fatal corruption(s) found in the root block. Running "
"with the --rebuild-tree is required.\n", "with the --rebuild-tree is required.\n",
@@ -1096,12 +1093,21 @@ static void check_fs (reiserfs_filsys_t * fs)
} else { } else {
fsck_progress ("No corruptions found\n"); fsck_progress ("No corruptions found\n");
stage_report (5, fs); stage_report (5, fs);
retval = fsck_mode(fs) == FSCK_CHECK ? EXIT_OK : EXIT_FIXED;
if (fsck_mode(fs) != FSCK_CHECK) {
if (misc_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;
} else
retval = EXIT_FIXED;
} else
retval = EXIT_OK;
mark_filesystem_consistent (fs); mark_filesystem_consistent (fs);
} }
if (fsck_mode (fs) == FSCK_FIX_FIXABLE) if (fsck_mode (fs) == FSCK_FIX_FIXABLE && !fsck_data (fs)->check.fatal_corruptions)
id_map_flush(proper_id_map (fs), fs); id_map_flush(proper_id_map (fs), fs);
id_map_free(proper_id_map (fs)); id_map_free(proper_id_map (fs));
@@ -1185,8 +1191,9 @@ int main (int argc, char * argv [])
char * file_name; char * file_name;
struct fsck_data * data; struct fsck_data * data;
struct rlimit rlim = {0xffffffff, 0xffffffff}; struct rlimit rlim = {0xffffffff, 0xffffffff};
int retval;
char *width; char *width;
int retval;
int errno;
width = getenv("COLUMNS"); width = getenv("COLUMNS");
if ( width ) if ( width )
@@ -1250,17 +1257,22 @@ int main (int argc, char * argv [])
if (open_devices_for_rollback (file_name, data) == -1) if (open_devices_for_rollback (file_name, data) == -1)
exit(EXIT_OPER); exit(EXIT_OPER);
} else { } else {
fs = reiserfs_open (file_name, O_RDONLY, 0, data, fs = reiserfs_open (file_name, O_RDONLY, &errno, data,
data->mode != FSCK_SB); data->mode != FSCK_SB);
if (data->mode != FSCK_SB) { if (data->mode != FSCK_SB) {
if (no_reiserfs_found (fs)) if (no_reiserfs_found (fs)) {
if (errno) {
die ("Failed to open the device '%s': %s\n\n",
file_name, strerror(errno));
} else {
die ("Failed to open the filesystem.\n\n" die ("Failed to open the filesystem.\n\n"
"If the partition table has not been changed, and the partition is\n" "If the partition table has not been changed, and the partition is\n"
"valid and it really contains a reiserfs partition, then the\n" "valid and it really contains a reiserfs partition, then the\n"
"superblock is corrupted and you need to run this utility with\n" "superblock is corrupted and you need to run this utility with\n"
"--rebuild-sb.\n"); "--rebuild-sb.\n");
}
}
if (fsck_skip_journal (fs) && if (fsck_skip_journal (fs) &&
!is_reiserfs_jr_magic_string (fs->fs_ondisk_sb)) !is_reiserfs_jr_magic_string (fs->fs_ondisk_sb))
{ {
@@ -1270,21 +1282,26 @@ int main (int argc, char * argv [])
} }
if (!fsck_skip_journal (fs)) { if (!fsck_skip_journal (fs)) {
if (reiserfs_open_journal(fs, data->journal_dev_name, O_RDONLY)) { retval = reiserfs_open_journal(fs, data->journal_dev_name, O_RDONLY);
if (retval) {
fsck_progress ("Failed to open the journal device (%s).\n", fsck_progress ("Failed to open the journal device (%s).\n",
data->journal_dev_name); data->journal_dev_name);
if (retval == 1) {
fsck_progress ("Run --rebuild-sb to rebuild journal parameters.\n");
}
reiserfs_close (fs); reiserfs_close (fs);
exit(EXIT_OPER); exit(EXIT_OPER);
} }
} }
if (data->options & BADBLOCKS_FILE) { if (data->options & BADBLOCKS_FILE) {
if (create_badblock_bitmap (fs, badblocks_file) != 0) { if (create_badblock_bitmap (fs, badblocks_file) != 0)
badblocks_file = NULL; exit(EXIT_OPER);
data->options &= ~BADBLOCKS_FILE;
}
} }
register_timer(); register_timer();
} }
} }
+7 -3
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -559,7 +559,7 @@ static __inline__ int does_it_fit_into_dev (__u64 offset, __u64 fs_size) {
static int is_wrong_short_key (struct key * key) { 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 || if (get_key_dirid (key) == 0 || get_key_objectid (key) == 0 || get_key_objectid (key) == 1 ||
get_key_dirid (key) == ~0ul || get_key_objectid (key) == ~0ul || get_key_dirid (key) == ~(__u32)0 || get_key_objectid (key) == ~(__u32)0 ||
get_key_dirid (key) == get_key_objectid (key) || get_key_dirid (key) == get_key_objectid (key) ||
(get_key_dirid (key) == 1 && get_key_objectid (key) != 2) || (get_key_dirid (key) == 1 && get_key_objectid (key) != 2) ||
(get_key_dirid (key) != 1 && get_key_objectid (key) == 2) ) (get_key_dirid (key) != 1 && get_key_objectid (key) == 2) )
@@ -642,7 +642,11 @@ static void pass0_correct_leaf (reiserfs_filsys_t * fs,
/* Delete all safe links. */ /* Delete all safe links. */
for (i = get_blkh_nr_items (B_BLK_HEAD (bh)) - 1; i >= 0; i--) { 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) == ~0ul) { 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); delete_item (fs, bh, i);
} }
} }
+8 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -28,10 +28,10 @@ struct buffer_head * make_buffer (int dev, unsigned long blocknr, int size, char
int find_not_of_one_file(struct key * to_find, struct key * key) { int find_not_of_one_file(struct key * to_find, struct key * key) {
if ((get_key_objectid (to_find) != ~0ul) && if ((get_key_objectid (to_find) != ~(__u32)0) &&
(get_key_objectid (to_find) != get_key_objectid (key))) (get_key_objectid (to_find) != get_key_objectid (key)))
return 1; return 1;
if ((get_key_dirid (to_find) != ~0ul) && if ((get_key_dirid (to_find) != ~(__u32)0) &&
(get_key_dirid (to_find) != get_key_dirid (key))) (get_key_dirid (to_find) != get_key_dirid (key)))
return 1; return 1;
return 0; return 0;
@@ -246,7 +246,8 @@ static void get_max_buffer_key (struct buffer_head * bh, struct key * key)
int tree_is_empty (void) int tree_is_empty (void)
{ {
return (get_sb_root_block (fs->fs_ondisk_sb) == ~0ul || get_sb_root_block (fs->fs_ondisk_sb) == 0) ? 1 : 0; return (get_sb_root_block (fs->fs_ondisk_sb) == ~(__u32)0 ||
get_sb_root_block (fs->fs_ondisk_sb) == 0) ? 1 : 0;
} }
@@ -543,8 +544,9 @@ static void find_allocable_blocks (reiserfs_filsys_t * fs)
} }
/* make allocable not leaves, not bad blocks */ /* make allocable not leaves, not bad blocks */
if (!is_used_leaf (i) && if (!is_used_leaf (i) && (!fs->fs_badblocks_bm ||
(!fs->fs_badblocks_bm || !reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i))) { !reiserfs_bitmap_test_bit (fs->fs_badblocks_bm, i)))
{
/* this is not leaf and it is not pointed by found indirect items, /* this is not leaf and it is not pointed by found indirect items,
so it does not contains anything valuable */ so it does not contains anything valuable */
make_allocable (i); make_allocable (i);
+8 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -483,7 +483,7 @@ static void do_pass_2 (reiserfs_filsys_t * fs) {
unsigned long done = 0, total; unsigned long done = 0, total;
total = reiserfs_bitmap_zeros (fsck_uninsertables (fs)) * 2; total = reiserfs_bitmap_zeros(fsck_uninsertables(fs)) * 2;
if (!total) if (!total)
return; return;
@@ -491,7 +491,9 @@ static void do_pass_2 (reiserfs_filsys_t * fs) {
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
j = 0; j = 0;
while (reiserfs_bitmap_find_zero_bit (fsck_uninsertables (fs), &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); bh = bread (fs->fs_dev, j, fs->fs_blocksize);
if (bh == 0) { if (bh == 0) {
fsck_log ("pass_2: Reading of the block (%lu) failed on the device 0x%x\n", fsck_log ("pass_2: Reading of the block (%lu) failed on the device 0x%x\n",
@@ -508,8 +510,8 @@ static void do_pass_2 (reiserfs_filsys_t * fs) {
/* this must be leaf */ /* this must be leaf */
what_node = who_is_this (bh->b_data, bh->b_size); what_node = who_is_this (bh->b_data, bh->b_size);
if (what_node != THE_LEAF) { // || B_IS_KEYS_LEVEL(bh)) { 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", fsck_log ("%s: The block (%b), marked as a leaf on the first two passes, "
__FUNCTION__, bh); "is not a leaf! Will be skipped.\n", __FUNCTION__, bh);
goto cont; goto cont;
} }
/* /*
@@ -622,7 +624,7 @@ void pass_2 (reiserfs_filsys_t * fs)
after_pass_2 (fs); after_pass_2 (fs);
if (get_sb_root_block (fs->fs_ondisk_sb) == ~0ul || if (get_sb_root_block (fs->fs_ondisk_sb) == ~(__u32)0 ||
get_sb_root_block (fs->fs_ondisk_sb) == 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" 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" "on this partition, then the start of the partition might be changed\n"
+2 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -31,7 +31,7 @@ void pass_4_check_unaccessed_items (void)
for (i = get_item_pos (&path), ih = get_ih (&path); i < B_NR_ITEMS (bh); i ++, ih ++) { for (i = get_item_pos (&path), ih = get_ih (&path); i < B_NR_ITEMS (bh); i ++, ih ++) {
if (!is_item_reachable (ih)) { if (!is_item_reachable (ih)) {
PATH_LAST_POSITION (&path) = i; PATH_LAST_POSITION (&path) = i;
rdkey = get_next_key_2 (&path); rdkey = reiserfs_next_key(&path);
if (rdkey) if (rdkey)
key = *rdkey; key = *rdkey;
else else
+27 -13
View File
@@ -1,9 +1,9 @@
.\" -*- nroff -*- .\" -*- nroff -*-
.\" Copyright 1996-2003 Hans Reiser. .\" Copyright 1996-2004 Hans Reiser.
.\" .\"
.TH REISERFSCK 8 "April 2003" "Reiserfsprogs-3.6.9" .TH REISERFSCK 8 "February 2004" "Reiserfsprogs-3.6.13"
.SH NAME .SH NAME
reiserfsck \- check a Linux Reiserfs file system reiserfsck \- checking tool for the ReiserFS filesystem
.SH SYNOPSIS .SH SYNOPSIS
.B reiserfsck .B reiserfsck
[ \fB-afprVy\fR ] [ \fB-afprVy\fR ]
@@ -13,6 +13,7 @@ reiserfsck \- check a Linux Reiserfs file system
[ \fB-j\fR | \fB--journal\fR \fIdevice\fR ] [ \fB-j\fR | \fB--journal\fR \fIdevice\fR ]
[ \fB-z\fR | \fB--adjust-size\fR ] [ \fB-z\fR | \fB--adjust-size\fR ]
[ \fB-n\fR | \fB--nolog\fR ] [ \fB-n\fR | \fB--nolog\fR ]
[ \fB-B\fR | \fB--badblocks \fIfile\fR ]
[ \fB-l\fR | \fB--logfile \fIfile\fR ] [ \fB-l\fR | \fB--logfile \fIfile\fR ]
[ \fB-q\fR | \fB--quiet\fR ] [ \fB-q\fR | \fB--quiet\fR ]
[ \fB-y\fR | \fB--yes\fR ] [ \fB-y\fR | \fB--yes\fR ]
@@ -51,11 +52,15 @@ zeroing invalid data-block pointers, correcting st_size and st_blocks
for directories, and deleting invalid directory entries. for directories, and deleting invalid directory entries.
.TP .TP
.B --rebuild-tree .B --rebuild-tree
This option rebuilds the entire file system tree using leaf nodes found This option rebuilds the entire filesystem tree using leaf nodes
on the device. Normally you only need this option if the \fB--check\fR found on the device. Normally you only need this option if the
option reports "corruption that can be fixed only during \fB--rebuild-tree\fR". \fBreiserfsck --check\fR reports "Running with \fB--rebuild-tree\fR
You are strongly encouraged to make a backup copy of the whole partition is required". You are strongly encouraged to make a backup copy
before attempting the \fB--rebuild-tree\fR option. of the whole partition before attempting the \fB--rebuild-tree\fR
option. Once \fBreiserfsck --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.
.TP .TP
.B --clean-attributes .B --clean-attributes
This option cleans reserved fields of Stat-Data items. This option cleans reserved fields of Stat-Data items.
@@ -76,6 +81,13 @@ implies that holes at the end of a file will be removed. File
sizes that are smaller than the offset of the last discovered sizes that are smaller than the offset of the last discovered
byte are corrected by --fix-fixable. byte are corrected by --fix-fixable.
.TP .TP
\fB--badblocks \fIfile\fR, \fB-B \fI file\fR
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. Can be used with \fB--fix-fixable\fR to fix the list of
badblocks (see debugreiserfs -B) and must be given with \fB--rebuild-tree\fR
option every time if the block device has bad blocks.
.TP
\fB--logfile \fIfile\fR, \fB-l \fI file\fR \fB--logfile \fIfile\fR, \fB-l \fI file\fR
This option causes \fBreiserfsck\fR to report any corruption it finds This option causes \fBreiserfsck\fR to report any corruption it finds
to the specified log file rather than stderr. to the specified log file rather than stderr.
@@ -89,7 +101,7 @@ This option prevents \fBreiserfsck\fR from reporting its rate of progress.
.B --yes, -y .B --yes, -y
This option inhibits \fBreiserfsck\fR from asking you for confirmation after This option inhibits \fBreiserfsck\fR from asking you for confirmation after
telling you what it is going to do, assuming yes. For safety, it does not telling you what it is going to do, assuming yes. For safety, it does not
work with the --rebuild-tree option. work with the \fB--rebuild-tree\fR option.
.TP .TP
\fB-a\fR, \fB-p\fR \fB-a\fR, \fB-p\fR
These options are usually passed by fsck -A during the automatic checking These options are usually passed by fsck -A during the automatic checking
@@ -140,9 +152,9 @@ If \fBreiserfsck --check\fR fails in some way you should also run \fBreiserfsck
the whole partition before proceeding. Then run \fBreiserfsck --rebuild-tree the whole partition before proceeding. Then run \fBreiserfsck --rebuild-tree
--logfile rebuild.log /dev/hda1\fR. --logfile rebuild.log /dev/hda1\fR.
6. If the \fB--rebuild-tree\fR step fails or does not recover what you expected, 6. If the \fBreiserfsck --rebuild-tree\fR step fails or does not recover what
please submit this as a bug report. Try to provide as much information as you expected, please submit this as a bug report. Try to provide as much
possible and we will try to help solve the problem. information as possible and we will try to help solve the problem.
.SH EXIT CODES .SH EXIT CODES
\fBreiserfsck\fR uses the following exit codes: \fBreiserfsck\fR uses the following exit codes:
.br .br
@@ -150,6 +162,8 @@ possible and we will try to help solve the problem.
.br .br
\ \fI1\fR \-\ File system errors corrected. \ \fI1\fR \-\ File system errors corrected.
.br .br
\ \fI2\fR \-\ Reboot is needed.
.br
\ \fI4\fR \-\ File system fatal errors left uncorrected, \ \fI4\fR \-\ File system fatal errors left uncorrected,
.br .br
\ \fBreiserfsck --rebuild-tree\fR needs to be launched. \ \fBreiserfsck --rebuild-tree\fR needs to be launched.
@@ -168,7 +182,7 @@ This version of \fBreiserfsck\fR has been written by Vitaly Fertman <vitaly@name
There are likely to be some bugs. Please report bugs to the ReiserFS mail-list There are likely to be some bugs. Please report bugs to the ReiserFS mail-list
<reiserfs-list@namesys.com>. <reiserfs-list@namesys.com>.
.SH TODO .SH TODO
Faster recovering, signal handling, i/o error handling, etc. Faster recovering, signal handling.
.SH SEE ALSO .SH SEE ALSO
.BR mkreiserfs (8), .BR mkreiserfs (8),
.BR reiserfstune (8) .BR reiserfstune (8)
+9 -5
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by reiserfsprogs/README * Copyright 1996-2004 by Hans Reiser, licensing governed by reiserfsprogs/README
*/ */
#include "fsck.h" #include "fsck.h"
@@ -303,10 +303,12 @@ start_again:
set_deh_objectid (deh, get_key_objectid (key)); set_deh_objectid (deh, get_key_objectid (key));
mark_buffer_dirty (bh); mark_buffer_dirty (bh);
fsck_log (" - corrected\n"); fsck_log (" - corrected\n");
} else } else {
one_more_corruption (fs, FIXABLE);
fsck_log ("\n"); fsck_log ("\n");
} }
} }
}
if (get_deh_offset (deh) == DOT_DOT_OFFSET) { if (get_deh_offset (deh) == DOT_DOT_OFFSET) {
/* set ".." so that it points to the correct parent directory */ /* set ".." so that it points to the correct parent directory */
@@ -318,11 +320,13 @@ start_again:
set_deh_objectid (deh, get_key_objectid (parent)); set_deh_objectid (deh, get_key_objectid (parent));
mark_buffer_dirty (bh); mark_buffer_dirty (bh);
fsck_log (" - corrected\n"); fsck_log (" - corrected\n");
} else } else {
one_more_corruption (fs, FIXABLE);
fsck_log ("\n"); fsck_log ("\n");
} }
} }
} }
}
/* copy directory item to the temporary buffer */ /* copy directory item to the temporary buffer */
dir_item = getmem (get_ih_item_len (ih)); dir_item = getmem (get_ih_item_len (ih));
@@ -697,7 +701,7 @@ int check_safe_links ()
set_key_dirid(&key, le32_to_cpu(*(__u32 *)get_item(&safe_link_path))); set_key_dirid(&key, le32_to_cpu(*(__u32 *)get_item(&safe_link_path)));
set_key_objectid(&key, get_key_objectid(&tmp_ih->ih_key)); set_key_objectid(&key, get_key_objectid(&tmp_ih->ih_key));
if ( (rkey = get_next_key_2 (&safe_link_path)) == NULL ) if ((rkey = reiserfs_next_key(&safe_link_path)) == NULL)
set_key_dirid (&safe_link_key, 0); set_key_dirid (&safe_link_key, 0);
else else
safe_link_key = *rkey; safe_link_key = *rkey;
@@ -799,7 +803,7 @@ void semantic_check (void)
fsck_allocable_bitmap (fs) = NULL; fsck_allocable_bitmap (fs) = NULL;
set_sb_free_blocks (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (fs->fs_bitmap2)); set_sb_free_blocks (fs->fs_ondisk_sb, reiserfs_bitmap_zeros (fs->fs_bitmap2));
mark_buffer_dirty (fs->fs_super_bh); mark_buffer_dirty (fs->fs_super_bh);
add_badblock_list(fs, 0); add_badblock_list(fs, 1);
} }
fsck_progress ("finished\n"); fsck_progress ("finished\n");
+4 -4
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -105,7 +105,7 @@ int wrong_st_size (struct key * key, unsigned long long max_file_size,
if (type == TYPE_DIRENTRY) { if (type == TYPE_DIRENTRY) {
/* directory size must match to the sum of length of its entries */ /* 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 " fsck_log ("vpf-10650: The directory %K has the wrong size in the StatData "
"(%Ld)%s(%Ld)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? "(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ?
", should be " : " - corrected to ", *size); ", should be " : " - corrected to ", *size);
return 1; return 1;
} }
@@ -115,7 +115,7 @@ int wrong_st_size (struct key * key, unsigned long long max_file_size,
if (fsck_adjust_file_size (fs) || type == TYPE_SYMLINK) { if (fsck_adjust_file_size (fs) || type == TYPE_SYMLINK) {
/* but it -o is given - fix that */ /* but it -o is given - fix that */
fsck_log ("vpf-10660: The file %K has too big size in the StatData " fsck_log ("vpf-10660: The file %K has too big size in the StatData "
"(%Ld)%s(%Ld)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ? "(%Lu)%s(%Lu)\n", key, sd_size, fsck_mode(fs) == FSCK_CHECK ?
", should be " : " - corrected to ", *size); ", should be " : " - corrected to ", *size);
sem_pass_stat (fs)->fixed_sizes ++; sem_pass_stat (fs)->fixed_sizes ++;
return 1; return 1;
@@ -145,7 +145,7 @@ int wrong_st_size (struct key * key, unsigned long long max_file_size,
} }
} }
fsck_log ("vpf-10670: The file %K has the wrong size in the StatData (%Ld)%s(%Ld)\n", key, 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 ", sd_size, fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ",
*size); *size);
sem_pass_stat (fs)->fixed_sizes ++; sem_pass_stat (fs)->fixed_sizes ++;
+21 -15
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2003 by Hans Reiser, licensing governed by * Copyright 2001-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -7,6 +7,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <errno.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...) { \ #define fsck_conditional_log(sb_found, fmt, list...) { \
if (sb_found) \ if (sb_found) \
fsck_log(fmt, ## list); \ fsck_log(fmt, ## list); \
@@ -189,6 +193,12 @@ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * dat
struct stat64 stat_buf; struct stat64 stat_buf;
int retval, exit_code = EXIT_OK; 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)) { if (!no_reiserfs_found (fs)) {
sb = getmem (sizeof (*sb)); sb = getmem (sizeof (*sb));
if (!is_opened_rw (fs)) { if (!is_opened_rw (fs)) {
@@ -305,14 +315,13 @@ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * dat
getline (&answer, &n, stdin); getline (&answer, &n, stdin);
if (strcmp ("\n", answer)) if (strcmp ("\n", answer))
block_count = atoi (answer); block_count = atoi (answer);
set_sb_block_count (sb, block_count);
} else { } else {
fsck_conditional_log (magic_was_found, "rebuild-sb: wrong block count " fsck_conditional_log (magic_was_found, "rebuild-sb: wrong block count "
"occured (%lu), fixed (%lu)\n", get_sb_block_count(sb), block_count); "occured (%lu), fixed (%lu)\n", get_sb_block_count(sb), block_count);
}
set_sb_block_count (sb, block_count); set_sb_block_count (sb, block_count);
} }
}
if (get_sb_block_size (sb) != fs->fs_blocksize) { if (get_sb_block_size (sb) != fs->fs_blocksize) {
fsck_log("rebuild-sb: wrong block size occured (%lu), fixed (%lu)\n", fsck_log("rebuild-sb: wrong block size occured (%lu), fixed (%lu)\n",
@@ -491,14 +500,13 @@ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * dat
} }
if (version == 1 || version == 3) { if (version == 1 || version == 3) {
if (!uuid_is_correct(sb->s_uuid)) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
if (generate_random_uuid (sb->s_uuid)) { if (uuid_is_null(sb->s_uuid)) {
fsck_log ("rebuild-sb: no uuid found, failed to genetate UUID\n"); uuid_generate(sb->s_uuid);
} else { fsck_log ("rebuild-sb: no uuid found, a new uuid was "
fsck_log ("rebuild-sb: no uuid found, a new uuid generated (%U)\n", "generated (%U)\n", sb->s_uuid);
sb->s_uuid);
}
} }
#endif
if (sb->s_flags != 0 && sb->s_flags != 1) { if (sb->s_flags != 0 && sb->s_flags != 1) {
fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n", fsck_log ("rebuild-sb: super block flags found (%u), zeroed\n",
sb->s_flags); sb->s_flags);
@@ -557,10 +565,10 @@ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * dat
} }
if ((retval = reiserfs_open_journal(fs, filename, O_RDWR | O_LARGEFILE))) { if ((retval = reiserfs_open_journal(fs, filename, O_RDWR | O_LARGEFILE))) {
fsck_log("\nrebuild-sb: Failed to open the journal device (%s).", fsck_log("\nrebuild-sb: Failed to open the journal device (%s).\n",
filename); filename);
exit(retval == 1 ? EXIT_USER : EXIT_OPER); exit(retval < 0 ? EXIT_OPER : EXIT_USER);
} }
} else if (!fsck_skip_journal(fs)) { } else if (!fsck_skip_journal(fs)) {
/* Check that specified non-standard journal device exists. */ /* Check that specified non-standard journal device exists. */
@@ -674,7 +682,7 @@ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * dat
fsck_log("\nrebuild-sb: Failed to open a journal device (%s).", fsck_log("\nrebuild-sb: Failed to open a journal device (%s).",
journal_dev_name); journal_dev_name);
exit(retval == 1 ? EXIT_USER : EXIT_OPER); exit(retval < 0 ? EXIT_OPER : EXIT_USER);
} }
/* SB was found, but journal params were broken and have been recovered. /* SB was found, but journal params were broken and have been recovered.
@@ -760,8 +768,6 @@ void rebuild_sb (reiserfs_filsys_t * fs, char * filename, struct fsck_data * dat
set_jp_journal_magic (&j_head->jh_journal, magic); set_jp_journal_magic (&j_head->jh_journal, magic);
} }
} else {
set_jp_journal_magic (sb_jp(sb), 0);
} }
retval = memcmp(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params)); retval = memcmp(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params));
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+2 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -225,7 +225,7 @@ int are_file_items_correct (struct item_head * sd_ih, void * sd, __u64 * size, _
} }
// does not change path // does not change path
next_key = get_next_key_2 (&path); next_key = reiserfs_next_key(&path);
if (next_key == 0 || not_of_one_file (key, next_key) || if (next_key == 0 || not_of_one_file (key, next_key) ||
(!is_indirect_key (next_key) && !is_direct_key(next_key))) (!is_indirect_key (next_key) && !is_direct_key(next_key)))
+8 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -10,7 +10,7 @@
when --rebuild-tree - fsck builds map of objectids it inserts into tree */ when --rebuild-tree - fsck builds map of objectids it inserts into tree */
#define ALLOC_SIZE 1024 #define ALLOC_SIZE 1024
#define MAX_ID (~0ul) #define MAX_ID (~(__u32)0)
/* 2 bytes for the counter */ /* 2 bytes for the counter */
#define BM_SIZE (ALLOC_SIZE - sizeof(__u16)) #define BM_SIZE (ALLOC_SIZE - sizeof(__u16))
@@ -21,10 +21,12 @@
#define id_map_local_count(interval) (interval + BM_SIZE) #define id_map_local_count(interval) (interval + BM_SIZE)
/*
typedef struct sb_id_map { typedef struct sb_id_map {
__u32 * m_begin; __u32 * m_begin;
__u32 m_size, m_used_slot_count; __u32 m_size, m_used_slot_count;
} sb_id_map_t; } sb_id_map_t;
*/
id_map_t *id_map_init() { id_map_t *id_map_init() {
id_map_t *map; id_map_t *map;
@@ -103,7 +105,7 @@ int id_map_mark(id_map_t *map, __u32 id) {
/* call this for proper_id_map only!! */ /* call this for proper_id_map only!! */
__u32 id_map_alloc(id_map_t *map) { __u32 id_map_alloc(id_map_t *map) {
__u32 i, zero_count; __u32 i, zero_count;
__u32 id = 0, first = ~0ul; __u32 id = 0, first = ~(__u32)0;
for (i = 0, zero_count = 0; zero_count < 10 && i < INDEX_COUNT - 1; i++) { for (i = 0, zero_count = 0; zero_count < 10 && i < INDEX_COUNT - 1; i++) {
if (map->index[i] == (void *)0) { if (map->index[i] == (void *)0) {
@@ -121,7 +123,7 @@ __u32 id_map_alloc(id_map_t *map) {
die ("Id is out of interval size, interval looks corrupted."); die ("Id is out of interval size, interval looks corrupted.");
id += i * BM_INTERVAL; id += i * BM_INTERVAL;
} else if (first != ~0ul) { } else if (first != ~(__u32)0) {
id = first * BM_INTERVAL; id = first * BM_INTERVAL;
if (id == 0) if (id == 0)
id = 2; id = 2;
@@ -232,7 +234,7 @@ void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs) {
if (map->index[map->last_used] == (void *)1) { if (map->index[map->last_used] == (void *)1) {
prev_id = BM_INTERVAL - 1; prev_id = BM_INTERVAL - 1;
} else { } else {
prev_id = ~0ul; prev_id = ~(__u32)0;
if (id < map->last_used * BM_INTERVAL) if (id < map->last_used * BM_INTERVAL)
id = 0; id = 0;
@@ -248,7 +250,7 @@ void id_map_flush(struct id_map * map, reiserfs_filsys_t * fs) {
prev_id = id; prev_id = id;
} }
if (prev_id == ~0ul) if (prev_id == ~(__u32)0)
die ("Objectid interval does not contain any set bit what is expected."); die ("Objectid interval does not contain any set bit what is expected.");
prev_id++; prev_id++;
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+6
View File
@@ -9,6 +9,9 @@
/* Define to 1 if you have the <inttypes.h> header file. */ /* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H #undef HAVE_INTTYPES_H
/* Define to 1 if you have the `uuid' library (-luuid). */
#undef HAVE_LIBUUID
/* Define to 1 if you have the <limits.h> header file. */ /* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H #undef HAVE_LIMITS_H
@@ -61,6 +64,9 @@
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H #undef HAVE_UNISTD_H
/* Define to 1 if you have the <uuid/uuid.h> header file. */
#undef HAVE_UUID_UUID_H
/* Define to 1 if you have the `vprintf' function. */ /* Define to 1 if you have the `vprintf' function. */
#undef HAVE_VPRINTF #undef HAVE_VPRINTF
+1 -5
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -55,7 +55,6 @@ struct buffer_head * find_buffer (int dev, unsigned long block, unsigned long si
struct buffer_head * get_hash_table(dev_t dev, unsigned long block, int 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 * bread (int dev, unsigned long block, size_t size);
struct buffer_head * reiserfs_bread (int dev, unsigned long block, int size, int *repeat); struct buffer_head * reiserfs_bread (int dev, unsigned long block, int size, int *repeat);
int valid_offset (int fd, loff_t offset);
int bwrite (struct buffer_head * bh); int bwrite (struct buffer_head * bh);
void brelse (struct buffer_head * bh); void brelse (struct buffer_head * bh);
void bforget (struct buffer_head * bh); void bforget (struct buffer_head * bh);
@@ -67,6 +66,3 @@ void do_fsck_rollback (int fd_device, int fd_journal_device, FILE * log);
void flush_buffers (int); void flush_buffers (int);
void free_buffers (void); void free_buffers (void);
void invalidate_buffers (int); void invalidate_buffers (int);
int user_confirmed (FILE * fp, char * q, char * yes);
+32 -16
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -13,10 +13,16 @@
#include <linux/major.h> #include <linux/major.h>
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#define POSITION_FOUND 8 #define POSITION_FOUND 8
#define POSITION_NOT_FOUND 9 #define POSITION_NOT_FOUND 9
#define INVAL_PTR (void *)-1
void check_memory_msg(void); void check_memory_msg(void);
void die (char * fmt, ...) __attribute__ ((format (printf, 1, 2))); void die (char * fmt, ...) __attribute__ ((format (printf, 1, 2)));
void * getmem (int size); void * getmem (int size);
@@ -25,11 +31,24 @@ void freemem (void * p);
void checkmem (char * p, int size); void checkmem (char * p, int size);
void * expandmem (void * p, int size, int by); void * expandmem (void * p, int size, int by);
unsigned int get_mem_size (char * p); unsigned int get_mem_size (char * p);
int is_mounted (char * device_name);
int is_mounted_read_only (char * device_name);
void check_and_free_mem (void); void check_and_free_mem (void);
char * kdevname (int dev); 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); void misc_print_credit(FILE *out);
typedef struct dma_info { typedef struct dma_info {
@@ -44,16 +63,15 @@ int prepare_dma_check(dma_info_t *dma_info);
int get_dma_info(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); 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_far (FILE * fp, unsigned long *passed, unsigned long total, unsigned int inc, int quiet);
void print_how_fast (unsigned long total, void print_how_fast (unsigned long total,
unsigned long passed, int cursor_pos, int reset_time); unsigned long passed, int cursor_pos, int reset_time);
__u32 get_random (void); __u32 get_random (void);
int uuid_is_null(unsigned char * uuid);
int generate_random_uuid (unsigned char * uuid);
int uuid_is_correct (unsigned char * uuid);
int set_uuid (const unsigned char * text, unsigned char * UUID);
//#include <asm/bitops.h> 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_set_bit (unsigned long long nr, void * addr);
extern inline int misc_clear_bit (unsigned long long nr, void * addr); extern inline int misc_clear_bit (unsigned long long nr, void * addr);
@@ -85,15 +103,13 @@ extern inline unsigned long long misc_find_first_set_bit (const void *vaddr, uns
# error "nuxi/pdp-endian archs are not supported" # error "nuxi/pdp-endian archs are not supported"
#endif #endif
#define STAT_FIELD_H(Field, Type) \
inline Type misc_device_##Field(char *device);
STAT_FIELD_H(mode, mode_t);
unsigned long count_blocks (char * filename, int blocksize); STAT_FIELD_H(rdev, dev_t);
STAT_FIELD_H(size, off64_t);
mode_t get_st_mode (char * file_name); STAT_FIELD_H(blocks, blkcnt64_t);
dev_t get_st_rdev (char * file_name);
off64_t get_st_size (char * file_name);
blkcnt64_t get_st_blocks (char * file_name);
/* these are to access bitfield in endian safe manner */ /* these are to access bitfield in endian safe manner */
__u16 mask16 (int from, int count); __u16 mask16 (int from, int count);
+7 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -1020,6 +1020,12 @@ struct disk_child {
#define get_dc_child_size(dc) get_le16 (dc, dc2_size) #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_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. */ /* Get disk child by buffer header and position in the tree node. */
#define B_N_CHILD(p_s_bh,n_pos) ((struct disk_child *)\ #define B_N_CHILD(p_s_bh,n_pos) ((struct disk_child *)\
+10 -5
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -7,8 +7,10 @@
#define REISERFS_LIB_H #define REISERFS_LIB_H
typedef struct reiserfs_filsys reiserfs_filsys_t; #define BADBLOCK_DIRID 1
#define BADBLOCK_OBJID (__u32)-1
typedef struct reiserfs_filsys reiserfs_filsys_t;
#include "reiserfs_fs.h" #include "reiserfs_fs.h"
@@ -86,8 +88,6 @@ void reiserfs_close (reiserfs_filsys_t *);
void reiserfs_reopen (reiserfs_filsys_t *, int flags); void reiserfs_reopen (reiserfs_filsys_t *, int flags);
int is_opened_rw (reiserfs_filsys_t * fs); int is_opened_rw (reiserfs_filsys_t * fs);
struct key * get_next_key_2 (struct path * path);
/* /*
void reiserfs_read_bitmap_blocks (reiserfs_filsys_t *); void reiserfs_read_bitmap_blocks (reiserfs_filsys_t *);
void reiserfs_free_bitmap_blocks (reiserfs_filsys_t *); void reiserfs_free_bitmap_blocks (reiserfs_filsys_t *);
@@ -146,9 +146,14 @@ void make_sure_root_dir_exists (reiserfs_filsys_t * fs,
void (*modyfy_item)(struct item_head *, void *), void (*modyfy_item)(struct item_head *, void *),
int ih_flags); 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); 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 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 root_dir_key;
extern struct key parent_root_dir_key; extern struct key parent_root_dir_key;
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2003 by Hans Reiser, licensing governed by * Copyright 2002-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+20 -55
View File
@@ -1,8 +1,9 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
#define _FILE_OFFSET_BITS 64
#define _GNU_SOURCE #define _GNU_SOURCE
#include <stdio.h> #include <stdio.h>
@@ -22,28 +23,25 @@
void check_memory_msg (void) { void check_memory_msg (void) {
fprintf(stderr, fprintf(stderr,
"\nThe problem has occurred looks like a hardware problem (perhaps memory).\n" "\nThe problem has occurred looks like a hardware problem (perhaps\n"
"Send us the bug report only if the second run dies at the same place with\n" "memory). Send us the bug report only if the second run dies at\n"
"the same block number.\n"); "the same place with the same block number.\n");
} }
void check_hd_msg (void) { void check_hd_msg (void) {
fprintf(stderr, fprintf(stderr,
"\nThe problem has occurred looks like a hardware problem.\n" "\nThe problem has occurred looks like a hardware problem. If you have\n"
"If you have bad blocks, we advise you to get a new hard\n" "bad blocks, we advise you to get a new hard drive, because once you\n"
"drive, because once you get one bad block that the disk\n" "get one bad block that the disk drive internals cannot hide from\n"
"drive internals cannot hide from your sight, the chances\n" "your sight,the chances of getting more are generally said to become\n"
"of getting more are generally said to become much higher\n" "much higher (precise statistics are unknown to us), and this disk\n"
"(precise statistics are unknown to us), and this disk drive\n" "drive is probably not expensive enough for you to you to risk your\n"
"is probably not expensive enough for you to risk your time\n" "time and data on it. If you don't want to follow that follow that\n"
"and data on it. If you don't want to follow that advice,\n" "advice then if you have just a few bad blocks, try writing to the\n"
"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"
"bad blocks and see if the drive remaps the bad blocks (that\n" "it takes a block it has in reserve and allocates it for use for\n"
"means it takes a block it has in reserve and allocates it\n" "of that block number). If it cannot remap the block, use badblock\n"
"for use for requests of that block number). If it cannot\n" "option (-B) with reiserfs utils to handle this block correctly.\n");
"remap the block, this could be quite bad, as it may mean\n"
"that so many blocks have gone bad that none remain in \n"
"reserve to allocate.\n");
} }
static int is_bad_block (unsigned long block) static int is_bad_block (unsigned long block)
@@ -514,7 +512,7 @@ struct buffer_head * bread (int dev, unsigned long block, size_t size)
ret = f_read(bh); ret = f_read(bh);
if (ret > 0) if (ret > 0)
die ("%s: End of file, cannot read the block (%lu).\n", __FUNCTION__, bh->b_blocknr); die ("%s: End of file, cannot read the block (%lu).\n", __FUNCTION__, block);
else if (ret < 0) { else if (ret < 0) {
/* BAD BLOCK LIST SUPPORT /* BAD BLOCK LIST SUPPORT
* die ("%s: Cannot read a block # %lu. Specify list of badblocks\n",*/ * die ("%s: Cannot read a block # %lu. Specify list of badblocks\n",*/
@@ -522,10 +520,10 @@ struct buffer_head * bread (int dev, unsigned long block, size_t size)
if (errno == EIO) { if (errno == EIO) {
check_hd_msg(); check_hd_msg();
die ("%s: Cannot read the block (%lu): (%s).\n", __FUNCTION__, die ("%s: Cannot read the block (%lu): (%s).\n", __FUNCTION__,
bh->b_blocknr, strerror(errno)); block, strerror(errno));
} else { } else {
fprintf (stderr, "%s: Cannot read the block (%lu): (%s).\n", __FUNCTION__, fprintf (stderr, "%s: Cannot read the block (%lu): (%s).\n", __FUNCTION__,
bh->b_blocknr, strerror(errno)); block, strerror(errno));
return NULL; return NULL;
} }
} }
@@ -534,26 +532,6 @@ struct buffer_head * bread (int dev, unsigned long block, size_t size)
return bh; return bh;
} }
int valid_offset( int fd, loff_t offset)
{
char ch;
loff_t res;
/*res = reiserfs_llseek (fd, offset, 0);*/
res = lseek64 (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;
}
#define ROLLBACK_FILE_START_MAGIC "_RollBackFileForReiserfsFSCK" #define ROLLBACK_FILE_START_MAGIC "_RollBackFileForReiserfsFSCK"
static struct block_handler * rollback_blocks_array; static struct block_handler * rollback_blocks_array;
@@ -986,16 +964,3 @@ void invalidate_buffers (int dev)
_invalidate_buffer_list(Buffer_list_head, dev) ; _invalidate_buffer_list(Buffer_list_head, dev) ;
_invalidate_buffer_list(g_free_buffers, dev) ; _invalidate_buffer_list(g_free_buffers, dev) ;
} }
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;
}
+221 -252
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -16,29 +16,34 @@
#include <stdlib.h> #include <stdlib.h>
#include <mntent.h> #include <mntent.h>
#include <sys/vfs.h> #include <sys/vfs.h>
#include <fcntl.h>
#include <time.h> #include <time.h>
#include <utime.h> #include <utime.h>
#include <ctype.h> #include <ctype.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <dirent.h> #include <dirent.h>
#include <assert.h>
#include <asm/ioctl.h>
#include <unistd.h>
#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
# define BLKGETSIZE64 _IOR(0x12, 114, sizeof(__u64))
#endif
#include "swab.h"
#include "io.h"
#include "misc.h" #include "misc.h"
/* Debian modifications by Ed Boraas <ed@debian.org> */ /* Debian modifications by Ed Boraas <ed@debian.org> */
#include <sys/mount.h> #include <sys/mount.h>
/* End Debian mods */ /* 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, off64_t);
STAT_FIELD(blocks, blkcnt64_t);
void die (char * fmt, ...) void die (char * fmt, ...)
{ {
@@ -173,144 +178,174 @@ void freemem (void * vp)
typedef int (*func_t) (char *); typedef int (*func_t) (char *);
static int is_readonly_dir (char * dir) /* 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 fsname)
{ {
/*
int fd;
char template [1024];
snprintf (template, 1024, "%s/testXXXXXX", dir);
fd = mkstemp (template);
if (fd >= 0) {
close (fd);
return 0;
}
*/
if (utime (dir, 0) != -1)
/* this is not ro mounted fs */
return 0;
return (errno == EROFS) ? 1 : 0;
}
#ifdef __i386__
#include <unistd.h>
#include <linux/unistd.h>
#define __NR_bad_stat64 195
_syscall2(long, bad_stat64, char *, filename, struct stat64 *, statbuf);
#else
#define bad_stat64 stat64
#endif
/* yes, I know how ugly it is */
#define return_stat_field(field) \
struct stat st;\
struct stat64 st64;\
\
if (bad_stat64 (file_name, &st64) == 0) {\
return st64.st_##field;\
} else if (stat (file_name, &st) == 0)\
return st.st_##field;\
\
perror ("stat failed");\
exit (8);\
mode_t get_st_mode (char * file_name)
{
return_stat_field (mode);
}
/* may I look at this undocumented (at least in the info of libc 2.3.1-58)
field? */
dev_t get_st_rdev (char * file_name)
{
return_stat_field (rdev);
}
off64_t get_st_size (char * file_name)
{
return_stat_field (size);
}
blkcnt64_t get_st_blocks (char * file_name)
{
return_stat_field (blocks);
}
static int _is_mounted (char * device_name, func_t f)
{
int retval;
FILE *fp;
struct mntent *mnt; struct mntent *mnt;
struct statfs stfs; struct stat st;
struct stat root_st; dev_t rdev = 0;
mode_t mode; dev_t dev = 0;
ino_t ino = 0;
FILE *fp;
if (stat ("/", &root_st) == -1) assert(mntfile != NULL);
die ("is_mounted: could not stat \"/\": %s\n", strerror(errno)); assert(file != NULL);
if (fsname && stat(file, &st) == 0) {
mode = get_st_mode (device_name); /* Devices is stated. */
if (S_ISREG (mode)) if (S_ISBLK(st.st_mode)) {
/* regular file can not be mounted */ rdev = st.st_rdev;
return 0; } else {
dev = st.st_dev;
if (!S_ISBLK (mode)) ino = st.st_ino;
die ("is_mounted: %s is neither regular file nor block device", device_name); }
if (root_st.st_dev == get_st_rdev (device_name)) {
/* device is mounted as root. Check whether it is mounted read-only */
return (f ? f ("/") : 1);
} }
/* if proc filesystem is mounted */ if ((fp = setmntent(mntfile, "r")) == NULL)
if (statfs ("/proc", &stfs) == -1 || stfs.f_type != 0x9fa0/*procfs magic*/ || return INVAL_PTR;
(fp = setmntent ("/proc/mounts", "r")) == NULL) {
/* proc filesystem is not mounted, or /proc/mounts does not while ((mnt = getmntent(fp)) != NULL) {
exist */ /* Check if names match. */
if (f) if (fsname) {
return (user_confirmed (stderr, if (strcmp(file, mnt->mnt_fsname) == 0)
" (could not figure out) Is filesystem mounted read-only? (Yes)", break;
"Yes\n")); } else {
else if (strcmp(file, mnt->mnt_dir) == 0)
return (user_confirmed (stderr, break;
" (could not figure out) Is filesystem mounted? (Yes)", "Yes\n"));
continue;
} }
retval = 0; /* Check if stats match. */
while ((mnt = getmntent (fp)) != NULL) if (stat(mnt->mnt_fsname, &st) == 0) {
if (strcmp (device_name, mnt->mnt_fsname) == 0) { if (rdev && S_ISBLK(st.st_mode)) {
retval = (f ? f (mnt->mnt_dir) : 1/*mounted*/); if (rdev == st.st_rdev)
break;
} else {
if (dev == st.st_dev &&
ino == st.st_ino)
break; break;
} }
}
}
endmntent (fp); endmntent (fp);
return mnt;
return retval;
} }
static int misc_root_mounted(char *device) {
struct stat rootst, devst;
int is_mounted_read_only (char * device_name) assert(device != NULL);
{
return _is_mounted (device_name, is_readonly_dir); 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;
}
int is_mounted (char * device_name) return 0;
{
return _is_mounted (device_name, 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", "/", 0);
} else {
/* Lookup the @device /proc/mounts */
mnt = misc_mntent_lookup("/proc/mounts", device, 1);
}
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, "/", 0);
} else {
mnt = misc_mntent_lookup(MOUNTED, device, 1);
}
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 buf1 [100];
char buf2 [100]; char buf2 [100];
@@ -407,19 +442,42 @@ void print_how_far (FILE * fp,
fflush (fp); fflush (fp);
} }
#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
# define BLKGETSIZE64 _IOR(0x12, 114, __u64)
#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 = lseek64 (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" /* calculates number of blocks in a file. Returns 0 for "sparse"
regular files and files other than regular files and block devices */ regular files and files other than regular files and block devices */
unsigned long count_blocks (char * filename, int blocksize) unsigned long count_blocks (char * filename, int blocksize)
{ {
loff_t high, low; loff_t high, low;
int fd;
unsigned long sz; unsigned long sz;
__u64 size; __u64 size;
int fd;
if (!S_ISBLK (get_st_mode (filename)) && !S_ISREG (get_st_mode (filename))) if (!S_ISBLK(misc_device_mode(filename)) &&
!S_ISREG(misc_device_mode(filename)))
return 0; return 0;
fd = open (filename, O_RDONLY); fd = open (filename, O_RDONLY);
@@ -429,10 +487,12 @@ unsigned long count_blocks (char * filename, int blocksize)
#ifdef BLKGETSIZE64 #ifdef BLKGETSIZE64
{ {
if (ioctl (fd, BLKGETSIZE64, &size) >= 0) { if (ioctl (fd, BLKGETSIZE64, &size) >= 0) {
size = (size / 4096) * 4096 / blocksize; size = (size / MAX_BS) * MAX_BS / blocksize;
sz = size; sz = size;
if ((__u64)sz != size) if ((__u64)sz != size)
die ("count_blocks: block device too large"); die ("count_blocks: block device too large");
close(fd);
return sz; return sz;
} }
} }
@@ -443,7 +503,9 @@ unsigned long count_blocks (char * filename, int blocksize)
{ {
if (ioctl (fd, BLKGETSIZE, &sz) >= 0) { if (ioctl (fd, BLKGETSIZE, &sz) >= 0) {
size = sz; size = sz;
return (size * 512 / 4096) * 4096 / blocksize;
close(fd);
return (size * 512 / MAX_BS) * MAX_BS / blocksize;
} }
} }
#endif #endif
@@ -459,15 +521,13 @@ unsigned long count_blocks (char * filename, int blocksize)
else else
high = mid; high = mid;
} }
valid_offset (fd, 0); valid_offset (fd, 0);
close (fd); close (fd);
return (low + 1) * MAX_BS / MAX_BS / blocksize;
return (low + 1) * 4096 / 4096 / blocksize ;
} }
/* there are masks for certain bits */ /* there are masks for certain bits */
__u16 mask16 (int from, int count) __u16 mask16 (int from, int count)
{ {
@@ -570,27 +630,6 @@ int blockdev_list_compare (const void * block1, const void * block2) {
return 0; return 0;
} }
/* return -1 if smth found, otherwise return position which new item should be inserted into */
/*
int blocklist__is_block_saved (struct block_handler ** base, __u32 * count,
__u32 blocknr, dev_t device, __u32 * position) {
struct block_handler block_h;
*position = 0;
if (*base == NULL)
return 0;
block_h.blocknr = blocknr;
block_h.device = device;
if (reiserfs_bin_search (&block_h, *base, *count, sizeof (block_h),
position, blocklist_compare) == POSITION_FOUND)
return 1;
return 0;
}
*/
void blocklist__insert_in_position (void *elem, void **base, __u32 *count, void blocklist__insert_in_position (void *elem, void **base, __u32 *count,
int elem_size, __u32 *position) int elem_size, __u32 *position)
{ {
@@ -614,93 +653,6 @@ void blocklist__insert_in_position (void *elem, void **base, __u32 *count,
*count+=1; *count+=1;
} }
static int get_random_bytes (void *out, int size) {
int fd;
if ((fd = open("/dev/urandom", O_RDONLY)) == -1)
return 1;
if (read(fd, out, size) <= 0) {
close (fd);
return 1;
}
close (fd);
return 0;
}
int generate_random_uuid (unsigned char * uuid)
{
if (get_random_bytes(uuid, 16)) {
return -1;
}
/* Set the UUID variant to DCE */
uuid[8] = (uuid[8] & 0x3F) | 0x80;
/* Set UUID version to 4 --- truely random generation */
uuid[6] = (uuid[6] & 0x0F) | 0x40;
return 0;
}
int uuid_is_correct (unsigned char * uuid)
{
int i;
for (i = 0; i < 16; i++)
if (uuid[i])
break;
if (i == 16)
return 0;
if (!misc_test_bit(7, &uuid[8]) || misc_test_bit(6, &uuid[8]))
return 0;
if (misc_test_bit(7, &uuid[6]) || !misc_test_bit(6, &uuid[6]) ||
misc_test_bit(5, &uuid[6]) || misc_test_bit(4, &uuid[6]))
return 0;
return 1;
}
static int parse_uuid (const unsigned char * in, unsigned char * uuid)
{
int i, j = 0;
unsigned char frame[3];
if (strlen(in) != 36)
return -1;
for (i = 0; i < 36; i++) {
if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) {
if (in[i] != '-')
return 0;
} else if (!isxdigit(in[i])) {
return -1;
}
}
frame[2] = 0;
for (i = 0; i < 36; i ++) {
if ((i == 8) || (i == 13) || (i == 18) || (i == 23))
continue;
frame[0] = in[i++];
frame[1] = in[i];
uuid[j++] = strtoul(frame, NULL, 16);
}
return 0;
}
int set_uuid (const unsigned char * text, unsigned char * UUID)
{
if (parse_uuid (text, UUID) || !uuid_is_correct(UUID))
return -1;
return 0;
}
/* 0 - dma is not supported, scsi or regular file */ /* 0 - dma is not supported, scsi or regular file */
/* 1 - xt drive */ /* 1 - xt drive */
/* 2 - ide drive */ /* 2 - ide drive */
@@ -971,13 +923,30 @@ inline unsigned long long misc_find_next_set_bit(const void *vaddr,
/* Reads the "CREDITS" file and prints one paragraph from it. */ /* Reads the "CREDITS" file and prints one paragraph from it. */
void misc_print_credit(FILE *out) { void misc_print_credit(FILE *out) {
char *line; char *line;
__u32 num1, num2;
fprintf(out, "\nA pair of credits:\n"); fprintf(out, "A pair of credits:\n");
line = credits[(random() % CREDITS_COUNT)]; srandom (time (0));
fprintf(out, "%s", line);
line = credits[(random() % CREDITS_COUNT)]; num1 = random() % CREDITS_COUNT;
fprintf(out, "%s", line); 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;
}
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+10 -4
View File
@@ -1,9 +1,9 @@
.\" -*- nroff -*- .\" -*- nroff -*-
.\" Copyright 1996-2003 Hans Reiser. .\" Copyright 1996-2004 Hans Reiser.
.\" .\"
.TH MKREISERFS 8 "April 2003" "Reiserfsprogs-3.6.9" .TH MKREISERFS 8 "February 2004" "Reiserfsprogs-3.6.13"
.SH NAME .SH NAME
mkreiserfs \- create a Linux ReiserFS file system mkreiserfs \- create tool for the Linux ReiserFS file system
.SH SYNOPSIS .SH SYNOPSIS
.B mkreiserfs .B mkreiserfs
[ \fB-dfV\fR ] [ \fB-dfV\fR ]
@@ -16,7 +16,8 @@ mkreiserfs \- create a Linux ReiserFS file system
[ \fB-j\fR | \fB--journal-device \fIFILE\fR ] [ \fB-j\fR | \fB--journal-device \fIFILE\fR ]
[ \fB-s\fR | \fB--journal-size \fIN\fR ] [ \fB-s\fR | \fB--journal-size \fIN\fR ]
[ \fB-o\fR | \fB--journal-offset \fIN\fR ] [ \fB-o\fR | \fB--journal-offset \fIN\fR ]
[ \fB-t\fR | \fB--transaction-max-size\fR \fIN\fR ] \fI device\fR [ \fB-t\fR | \fB--transaction-max-size\fR \fIN\fR ]
[ \fB-B\fR | \fB--badblocks\fR \fIfile\fR ] \fI device\fR
[ \fIfilesystem-size\fR ] [ \fIfilesystem-size\fR ]
.SH DESCRIPTION .SH DESCRIPTION
It creates a Linux ReiserFS file system on a device It creates a Linux ReiserFS file system on a device
@@ -83,6 +84,11 @@ default, and max possible, value is 1024 blocks. It should be less
than half the size of the journal. If specifed incorrectly, it will be than half the size of the journal. If specifed incorrectly, it will be
adjusted. adjusted.
.TP .TP
\fB-B\fR | \fB--badblocks \fIfile
\fIFile\fR is the file name of the file that contains the list of blocks
to be marked as bad on the filesystem. This list can be created by
\fB/sbin/badblocks -b block-size device\fR.
.TP
\fB-f\fR \fB-f\fR
This forces \fBmkreiserfs\fR to continue even if device is either whole This forces \fBmkreiserfs\fR to continue even if device is either whole
disk, or looks mounted or is not a block device. Specified more than disk, or looks mounted or is not a block device. Specified more than
+59 -36
View File
@@ -1,20 +1,16 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
/* mkreiserfs is very simple. It supports only 4k blocks. It skips /* mkreiserfs is very simple. It skips first 64k of device, and then
first 64k of device, and then writes the super writes the super block, the needed amount of bitmap blocks (this
block, the needed amount of bitmap blocks (this amount is calculated amount is calculated based on file system size), and root block.
based on file system size), and root block. Bitmap policy is Bitmap policy is primitive: it assumes, that device does not have
primitive: it assumes, that device does not have unreadable blocks, unreadable blocks, and it occupies first blocks for super, bitmap
and it occupies first blocks for super, bitmap and root blocks. and root blocks. bitmap blocks are interleaved across the disk,
bitmap blocks are interleaved across the disk, mainly to make mainly to make resizing faster. */
resizing faster. */
//
// FIXME: not 'not-i386' safe. ? Ed
//
#define _GNU_SOURCE #define _GNU_SOURCE
#include <stdio.h> #include <stdio.h>
@@ -40,6 +36,10 @@
#include "../include/config.h" #include "../include/config.h"
#include "../version.h" #include "../version.h"
#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
# include <uuid/uuid.h>
#endif
char *program_name; char *program_name;
@@ -73,6 +73,7 @@ static void print_usage_and_exit(void)
" -o | --journal-offset N offset of the journal from the start of\n" " -o | --journal-offset N offset of the journal from the start of\n"
" the separate device, in blocks\n" " the separate device, in blocks\n"
" -t | --transaction-max-size N maximal size of transaction, in blocks\n" " -t | --transaction-max-size N maximal size of transaction, in blocks\n"
" -B | --badblocks file store all bad blocks given in file on the fs\n"
" -h | --hash rupasov|tea|r5 hash function to use by default\n" " -h | --hash rupasov|tea|r5 hash function to use by default\n"
" -u | --uuid UUID store UUID in the superblock\n" " -u | --uuid UUID store UUID in the superblock\n"
" -l | --label LABEL store LABEL in the superblock\n" " -l | --label LABEL store LABEL in the superblock\n"
@@ -89,7 +90,6 @@ static void print_usage_and_exit(void)
exit (1); exit (1);
} }
// " -B badblocks-file list of all bad blocks on the fs\n"
int Create_default_journal = 1; int Create_default_journal = 1;
int Block_size = 4096; int Block_size = 4096;
@@ -106,7 +106,8 @@ char * badblocks_file;
enum mkfs_mode { enum mkfs_mode {
DEBUG_MODE = 1 << 0, DEBUG_MODE = 1 << 0,
QUIET_MODE = 1 << 1 QUIET_MODE = 1 << 1,
DO_NOTHING = 1 << 2
}; };
int mode; int mode;
@@ -118,10 +119,12 @@ static void make_super_block (reiserfs_filsys_t * fs)
set_sb_tree_height (fs->fs_ondisk_sb, 2); set_sb_tree_height (fs->fs_ondisk_sb, 2);
set_sb_hash_code (fs->fs_ondisk_sb, Hash); set_sb_hash_code (fs->fs_ondisk_sb, Hash);
if (fs->fs_format == REISERFS_FORMAT_3_6) { if (fs->fs_format == REISERFS_FORMAT_3_6) {
if (!uuid_is_correct (UUID) && generate_random_uuid (UUID)) #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
reiserfs_warning (stderr, "failed to genetate UUID\n"); if (uuid_is_null(UUID))
uuid_generate(UUID);
memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16); memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16);
#endif
if (LABEL != NULL) { if (LABEL != NULL) {
if (strlen (LABEL) > 16) if (strlen (LABEL) > 16)
reiserfs_warning (stderr, "\nSpecified LABEL is longer then 16 " reiserfs_warning (stderr, "\nSpecified LABEL is longer then 16 "
@@ -140,6 +143,10 @@ static void make_super_block (reiserfs_filsys_t * fs)
else else
set_sb_reserved_for_journal (fs->fs_ondisk_sb, set_sb_reserved_for_journal (fs->fs_ondisk_sb,
get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)) + 1); get_jp_journal_size (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) -
fs->fs_badblocks_bm->bm_set_bits);
} }
@@ -295,11 +302,9 @@ static void make_root_block (reiserfs_filsys_t * fs)
make_sure_root_dir_exists (fs, set_root_dir_nlink, 0); make_sure_root_dir_exists (fs, set_root_dir_nlink, 0);
brelse (bh); brelse (bh);
/**/ /**/
mark_objectid_used (fs, REISERFS_ROOT_PARENT_OBJECTID); mark_objectid_used (fs, REISERFS_ROOT_PARENT_OBJECTID);
mark_objectid_used (fs, REISERFS_ROOT_OBJECTID); mark_objectid_used (fs, REISERFS_ROOT_OBJECTID);
} }
@@ -543,12 +548,10 @@ int main (int argc, char **argv)
else else
program_name = argv[ 0 ]; program_name = argv[ 0 ];
if (argc < 2)
if (argc < 2) {
print_banner (program_name);
print_usage_and_exit (); print_usage_and_exit ();
}
memset(UUID, 0, 16);
while (1) { while (1) {
static struct option options[] = { static struct option options[] = {
@@ -557,6 +560,7 @@ int main (int argc, char **argv)
{"journal-size", required_argument, 0, 's'}, {"journal-size", required_argument, 0, 's'},
{"transaction-max-size", required_argument, 0, 't'}, {"transaction-max-size", required_argument, 0, 't'},
{"journal-offset", required_argument, 0, 'o'}, {"journal-offset", required_argument, 0, 'o'},
{"badblocks", required_argument, 0, 'B'},
{"hash", required_argument, 0, 'h'}, {"hash", required_argument, 0, 'h'},
{"uuid", required_argument, 0, 'u'}, {"uuid", required_argument, 0, 'u'},
{"label", required_argument, 0, 'l'}, {"label", required_argument, 0, 'l'},
@@ -614,7 +618,8 @@ int main (int argc, char **argv)
break; break;
case 'V': case 'V':
print_usage_and_exit (); mode = DO_NOTHING;
break;
case 'f': case 'f':
force ++; force ++;
@@ -625,11 +630,17 @@ int main (int argc, char **argv)
break; break;
case 'u': case 'u':
if (set_uuid (optarg, UUID)) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
reiserfs_warning(stderr, "wrong UUID specified\n"); if (uuid_parse(optarg, UUID) < 0) {
reiserfs_warning(stderr, "Invalid UUID '%s' is "
"specified\n", optarg);
return 1; return 1;
} }
#else
message ("Cannot set up the UUID, uuidlib was not "
"found by configure.\n");
return 1;
#endif
break; break;
case 'l': case 'l':
@@ -637,13 +648,22 @@ int main (int argc, char **argv)
break; break;
case 'q': case 'q':
mode |= QUIET_MODE; mode |= QUIET_MODE;
fclose(stdout);
break; break;
default: default:
print_usage_and_exit(); print_usage_and_exit();
} }
} }
print_banner (program_name);
misc_print_credit(stdout);
printf("\n");
if (mode & QUIET_MODE)
fclose(stdout);
if (mode == DO_NOTHING)
exit(0);
/* device to be formatted */ /* device to be formatted */
device_name = argv [optind]; device_name = argv [optind];
@@ -687,19 +707,23 @@ int main (int argc, char **argv)
/* these fill buffers (super block, first bitmap, root block) with /* these fill buffers (super block, first bitmap, root block) with
reiserfs structures */ reiserfs structures */
if (uuid_is_correct (UUID) && fs->fs_format != REISERFS_FORMAT_3_6) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
if (!uuid_is_null(UUID) && fs->fs_format != REISERFS_FORMAT_3_6) {
reiserfs_warning(stderr, "UUID can be specified only with 3.6 format\n"); reiserfs_warning(stderr, "UUID can be specified only with 3.6 format\n");
return 1; return 1;
} }
#endif
if (badblocks_file) if (badblocks_file) {
create_badblock_bitmap (fs, badblocks_file); if (create_badblock_bitmap (fs, badblocks_file))
exit(1);
}
make_super_block (fs); make_super_block (fs);
make_bitmap (fs); make_bitmap (fs);
make_root_block (fs); make_root_block (fs);
// add_badblock_list (fs, 1); add_badblock_list (fs, 1);
report (fs, jdevice_name); report (fs, jdevice_name);
@@ -716,7 +740,6 @@ int main (int argc, char **argv)
invalidate_other_formats (fs->fs_dev); invalidate_other_formats (fs->fs_dev);
zero_journal (fs); zero_journal (fs);
reiserfs_close (fs); reiserfs_close (fs);
@@ -728,9 +751,9 @@ int main (int argc, char **argv)
if (mode & DEBUG_MODE) if (mode & DEBUG_MODE)
return 0; return 0;
misc_print_credit(stdout); printf("\nTell your friends to use a kernel based on 2.4.18 or "
printf("\nTell your friends to use the kernel based on 2.4.18 or later " "later, and especially not a\nkernel based on 2.4.9, "
"when you use\nreiserFS. Have fun.\n\n"); "when you use reiserFS. Have fun.\n\n");
printf("ReiserFS is successfully created on %s.\n", device_name); printf("ReiserFS is successfully created on %s.\n", device_name);
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+9 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -56,12 +56,20 @@ 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_shrink_bitmap (reiserfs_bitmap_t * bm, unsigned int bit_count)
{ {
unsigned long i;
assert (bm->bm_bit_size >= bit_count); assert (bm->bm_bit_size >= bit_count);
bm->bm_byte_size = (bit_count + 7) / 8; bm->bm_byte_size = (bit_count + 7) / 8;
bm->bm_bit_size = bit_count; bm->bm_bit_size = bit_count;
bm->bm_set_bits = 0;
bm->bm_dirty = 1; 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 */ /* bitmap destructor */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+28 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -136,10 +136,14 @@ static void internal_insert_childs (reiserfs_filsys_t * fs,
/* make disk child array for insertion */ /* make disk child array for insertion */
for (i = 0; i < count; i ++) { 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, set_dc_child_size (new_dc + i,
MAX_CHILD_SIZE(bh[i]->b_size) - MAX_CHILD_SIZE(bh[i]->b_size) -
get_blkh_free_space (B_BLK_HEAD (bh[i]))); get_blkh_free_space (B_BLK_HEAD (bh[i])));
set_dc_child_blocknr (new_dc + i, bh[i]->b_blocknr); set_dc_child_blocknr (new_dc + i, bh[i]->b_blocknr);*/
} }
memcpy (dc, new_dc, DC_SIZE * count); memcpy (dc, new_dc, DC_SIZE * count);
@@ -667,10 +671,15 @@ int balance_internal (struct tree_balance * tb, /* tree_balance structure */
/* replace the first node-ptr in S[h] by node-ptr to insert_ptr[k] */ /* replace the first node-ptr in S[h] by node-ptr to insert_ptr[k] */
dc = B_N_CHILD(tbSh, 0); 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) - set_dc_child_size (dc, MAX_CHILD_SIZE(insert_ptr[k]->b_size) -
get_blkh_free_space (B_BLK_HEAD(insert_ptr[k]))); get_blkh_free_space (B_BLK_HEAD(insert_ptr[k])));
set_dc_child_blocknr (dc, insert_ptr[k]->b_blocknr); set_dc_child_blocknr (dc, insert_ptr[k]->b_blocknr);
*/
mark_buffer_dirty (tbSh); mark_buffer_dirty (tbSh);
k++; k++;
@@ -721,10 +730,14 @@ int balance_internal (struct tree_balance * tb, /* tree_balance structure */
/* replace the first node-ptr in R[h] by node-ptr insert_ptr[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); 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) - 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]))); 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); set_dc_child_blocknr (dc, insert_ptr[insert_num-k-1]->b_blocknr);
*/
mark_buffer_dirty (tb->R[h]); mark_buffer_dirty (tb->R[h]);
insert_num -= (k + 1); insert_num -= (k + 1);
@@ -754,9 +767,14 @@ int balance_internal (struct tree_balance * tb, /* tree_balance structure */
/* Put the unique node-pointer to S[h] that points to S[h-1]. */ /* Put the unique node-pointer to S[h] that points to S[h-1]. */
dc = B_N_CHILD(tbSh, 0); 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_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); set_dc_child_blocknr (dc, tbSh_1->b_blocknr);
*/
tb->insert_size[h] -= DC_SIZE; tb->insert_size[h] -= DC_SIZE;
set_blkh_free_space (B_BLK_HEAD(tbSh), set_blkh_free_space (B_BLK_HEAD(tbSh),
get_blkh_free_space (B_BLK_HEAD(tbSh)) - DC_SIZE); get_blkh_free_space (B_BLK_HEAD(tbSh)) - DC_SIZE);
@@ -835,10 +853,14 @@ int balance_internal (struct tree_balance * tb, /* tree_balance structure */
/* replace first node-ptr in S_new by node-ptr to insert_ptr[insert_num-k-1] */ /* replace first node-ptr in S_new by node-ptr to insert_ptr[insert_num-k-1] */
dc = B_N_CHILD(S_new,0); 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) - 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]))); 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); set_dc_child_blocknr (dc, insert_ptr[insert_num-k-1]->b_blocknr);
*/
mark_buffer_dirty (S_new); mark_buffer_dirty (S_new);
insert_num -= (k + 1); insert_num -= (k + 1);
+2 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -21,3 +21,4 @@
#include "reiserfs_lib.h" #include "reiserfs_lib.h"
#include "swab.h" #include "swab.h"
#include "../include/config.h"
+13 -13
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2003 by Hans Reiser, licensing governed by * Copyright 2002-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -481,10 +481,11 @@ int reiserfs_open_journal (reiserfs_filsys_t * fs, char * j_filename, int flags)
sb = fs->fs_ondisk_sb; sb = fs->fs_ondisk_sb;
if (!j_filename) { if (!j_filename) {
/*
if (is_reiserfs_jr_magic_string (sb)) { if (is_reiserfs_jr_magic_string (sb)) {
/* create a special file to access journal */ // create a special file to access journal
return 1; return 1;
} } */
j_filename = fs->fs_file_name; j_filename = fs->fs_file_name;
} else if (!is_reiserfs_jr_magic_string (sb)) { } else if (!is_reiserfs_jr_magic_string (sb)) {
@@ -492,7 +493,7 @@ int reiserfs_open_journal (reiserfs_filsys_t * fs, char * j_filename, int flags)
if (strcmp (j_filename, fs->fs_file_name)) { if (strcmp (j_filename, fs->fs_file_name)) {
reiserfs_warning (stderr, "Filesystem with standard journal found, " reiserfs_warning (stderr, "Filesystem with standard journal found, "
"wrong name of specified journal device %s \n", j_filename); "wrong name of specified journal device %s \n", j_filename);
return 1; return 2;
} }
} }
@@ -503,9 +504,9 @@ int reiserfs_open_journal (reiserfs_filsys_t * fs, char * j_filename, int flags)
asprintf (&fs->fs_j_file_name, "%s", j_filename); asprintf (&fs->fs_j_file_name, "%s", j_filename);
if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) { if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) {
reiserfs_warning (stderr, "Journal of (%lu) block size found on specified journal " reiserfs_warning (stderr, "Journal of (%lu) block size found on "
"device %s.\nMust be not less than (%lu).\nRun --rebuild-sb to rebuild journal " "specified journal device %s.\nMust be not less than (%lu).\n",
"parameters.\n", get_jp_journal_size (sb_jp (sb)) + 1, j_filename, get_jp_journal_size (sb_jp (sb)) + 1, j_filename,
JOURNAL_MIN_SIZE + 1); JOURNAL_MIN_SIZE + 1);
return 1; return 1;
} }
@@ -513,10 +514,9 @@ int reiserfs_open_journal (reiserfs_filsys_t * fs, char * j_filename, int flags)
count = count_blocks (j_filename, fs->fs_blocksize); count = count_blocks (j_filename, fs->fs_blocksize);
if (get_jp_journal_1st_block (sb_jp (sb)) + get_jp_journal_size (sb_jp (sb)) + 1 > count) { 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 " 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" "the device.\nStart block (%lu) + size (%lu) less than device size (%lu).\n",
"Run --rebuild-sb to rebuild journal parameters.\n", j_filename, get_jp_journal_1st_block(sb_jp (sb)),
get_jp_journal_1st_block(sb_jp (sb)), get_jp_journal_size(sb_jp (sb)) + 1, get_jp_journal_size(sb_jp (sb)) + 1, count);
count);
return 1; return 1;
} }
@@ -633,9 +633,9 @@ int reiserfs_create_journal(
asprintf (&fs->fs_j_file_name, "%s", j_device); asprintf (&fs->fs_j_file_name, "%s", j_device);
if (len < JOURNAL_MIN_SIZE) { if (len < JOURNAL_MIN_SIZE + 1) {
reiserfs_warning (stderr, "WARNING: Journal size (%u) is less, than " reiserfs_warning (stderr, "WARNING: Journal size (%u) is less, than "
"minimal supported journal size (%u).", len, JOURNAL_MIN_SIZE + 1); "minimal supported journal size (%u).\n", len, JOURNAL_MIN_SIZE + 1);
return 0; return 0;
} }
/* get journal header */ /* get journal header */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -1299,7 +1299,7 @@ void mark_objectid_used (reiserfs_filsys_t * fs, __u32 objectid)
int is_blocksize_correct (unsigned int blocksize) int is_blocksize_correct (unsigned int blocksize)
{ {
return ((blocksize == 0) || (((blocksize & -blocksize) == blocksize) return ((((blocksize & -blocksize) == blocksize)
&& (blocksize >=512) && (blocksize <= 8192))); && (blocksize >= 512) && (blocksize <= 8192)));
} }
+26 -23
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -8,6 +8,10 @@
#include <limits.h> #include <limits.h>
#include <printf.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_KEY (PA_LAST)
#define PA_BUFFER_HEAD (PA_LAST + 1) #define PA_BUFFER_HEAD (PA_LAST + 1)
#define PA_ITEM_HEAD (PA_LAST + 2) #define PA_ITEM_HEAD (PA_LAST + 2)
@@ -196,17 +200,16 @@ static int print_sd_uuid (FILE * stream,
const struct printf_info *info, const struct printf_info *info,
const void *const *args) const void *const *args)
{ {
int i; #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
const unsigned char * uuid; const unsigned char *uuid = *((const unsigned char **)(args[0]));
int len = 0; char buf[37];
uuid = *((const unsigned char **)(args[0])); buf[36] = '\0';
for (i = 0; i < 16; i++) { uuid_unparse(uuid, buf);
if (i == 4 || i == 6 || i == 8 || i == 10) return fprintf(stream, "%s", buf);
len += fprintf (stream, "-"); #else
len += fprintf(stream, "%02x", uuid[i]); return fprintf(stream, "<no libuuid installed>");
} #endif
return len;
} }
void reiserfs_warning (FILE * fp, const char * fmt, ...) void reiserfs_warning (FILE * fp, const char * fmt, ...)
@@ -509,34 +512,34 @@ static int print_leaf (FILE * fp, reiserfs_filsys_t * fs, struct buffer_head * b
struct item_head * ih; struct item_head * ih;
int i; int i;
int from, to; int from, to;
int nr; int real_nr, nr;
if (!is_tree_node (bh, DISK_LEAF_NODE_LEVEL)) if (!is_tree_node (bh, DISK_LEAF_NODE_LEVEL))
return 1; return 1;
blkh = B_BLK_HEAD (bh); blkh = B_BLK_HEAD (bh);
ih = B_N_PITEM_HEAD (bh,0); ih = B_N_PITEM_HEAD (bh,0);
nr = leaf_count_ih(bh->b_data, bh->b_size); 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, reiserfs_warning (fp,
"\n===================================================================\n"); "\n===================================================================\n");
reiserfs_warning (fp, "LEAF NODE (%ld) contains %b (real items %d)\n", reiserfs_warning (fp, "LEAF NODE (%ld) contains %b (real items %d)\n",
bh->b_blocknr, bh, nr); bh->b_blocknr, bh, real_nr);
if (!(print_mode & PRINT_TREE_DETAILS)) { if (!(print_mode & PRINT_TREE_DETAILS)) {
reiserfs_warning (fp, "FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n", reiserfs_warning (fp, "FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n",
&(ih->ih_key), &((ih + nr - 1)->ih_key)); &(ih->ih_key), &((ih + real_nr - 1)->ih_key));
return 0; return 0;
} }
if (first < 0 || first > nr - 1) if (first < 0 || first > real_nr - 1)
from = 0; from = 0;
else else
from = first; from = first;
if (last < 0 || last > nr) if (last < 0 || last > real_nr)
to = nr; to = real_nr;
else else
to = last; to = last;
@@ -548,7 +551,7 @@ static int print_leaf (FILE * fp, reiserfs_filsys_t * fs, struct buffer_head * b
for (i = from; i < to; i++) { for (i = from; i < to; i++) {
reiserfs_warning (fp, reiserfs_warning (fp,
"-------------------------------------------------------------------------------\n" "-------------------------------------------------------------------------------\n"
"|%3d|%30H|\n", i, ih + i); "|%3d|%30H|%s\n", i, ih + i, i >= nr ? " DELETED" : "");
if (I_IS_STAT_DATA_ITEM(ih+i)) { if (I_IS_STAT_DATA_ITEM(ih+i)) {
is_symlink = print_stat_data (fp, bh, ih + i, 0/*all times*/); is_symlink = print_stat_data (fp, bh, ih + i, 0/*all times*/);
@@ -612,7 +615,7 @@ int print_super_block (FILE * fp, reiserfs_filsys_t * fs, char * file_name,
if (!does_look_like_super_block (sb)) if (!does_look_like_super_block (sb))
return 1; return 1;
rdev = get_st_rdev (file_name); rdev = misc_device_rdev(file_name);
reiserfs_warning (fp, "Reiserfs super block in block %lu on 0x%x of ", reiserfs_warning (fp, "Reiserfs super block in block %lu on 0x%x of ",
bh->b_blocknr, rdev); bh->b_blocknr, rdev);
@@ -643,7 +646,7 @@ int print_super_block (FILE * fp, reiserfs_filsys_t * fs, char * file_name,
"bitmaps, data, reserved] blocks): %u\n", get_sb_free_blocks (sb)); "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, "Root block: %u\n", get_sb_root_block (sb));
} }
reiserfs_warning (fp, "Filesystem is %scleanly umounted\n", reiserfs_warning (fp, "Filesystem marked as %scleanly umounted\n",
(get_sb_umount_state (sb) == FS_CLEANLY_UMOUNTED) ? "" : "NOT "); (get_sb_umount_state (sb) == FS_CLEANLY_UMOUNTED) ? "" : "NOT ");
if (short_print) if (short_print)
@@ -967,7 +970,7 @@ void print_objectid_map (FILE * fp, reiserfs_filsys_t * fs)
} else { } else {
reiserfs_warning(fp, "free(%u-%u) ", le32_to_cpu (omap[i]), reiserfs_warning(fp, "free(%u-%u) ", le32_to_cpu (omap[i]),
((i+1) == get_sb_oid_cursize (sb)) ? ((i+1) == get_sb_oid_cursize (sb)) ?
~0ul : (le32_to_cpu (omap[i+1]) - 1)); ~(__u32)0 : (le32_to_cpu (omap[i+1]) - 1));
} }
} }
+145 -75
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -9,6 +9,7 @@
struct key root_dir_key = {0, 0, {{0, 0},}}; struct key root_dir_key = {0, 0, {{0, 0},}};
struct key parent_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 lost_found_dir_key = {0, 0, {{0, 0}, }};
struct key badblock_key = {BADBLOCK_DIRID, BADBLOCK_OBJID, {{0, 0},}};
__u16 root_dir_format = 0; __u16 root_dir_format = 0;
__u16 lost_found_dir_format = 0; __u16 lost_found_dir_format = 0;
@@ -59,6 +60,8 @@ reiserfs_filsys_t * reiserfs_open (char * filename, int flags, int *error, void
/* convert root dir key and parent root dir key to little endian format */ /* convert root dir key and parent root dir key to little endian format */
make_const_keys (); make_const_keys ();
if (error)
*error = 0;
fd = open (filename, flags | O_LARGEFILE); fd = open (filename, flags | O_LARGEFILE);
if (fd == -1) { if (fd == -1) {
@@ -92,8 +95,6 @@ reiserfs_filsys_t * reiserfs_open (char * filename, int flags, int *error, void
reiserfs_warning(stderr, reiserfs_warning(stderr,
"\nreiserfs_open: the reiserfs superblock cannot be found on %s.\n", filename); "\nreiserfs_open: the reiserfs superblock cannot be found on %s.\n", filename);
if (error)
*error = 0;
freemem (fs); freemem (fs);
close (fd); close (fd);
fs = NULL; fs = NULL;
@@ -101,10 +102,6 @@ reiserfs_filsys_t * reiserfs_open (char * filename, int flags, int *error, void
found: found:
if (check) {
/* A few checks of found super block. */
struct buffer_head *tmp_bh;
if (!is_blocksize_correct(get_sb_block_size(sb))) { if (!is_blocksize_correct(get_sb_block_size(sb))) {
reiserfs_warning(stderr, "reiserfs_open: a superblock with wrong parameters " reiserfs_warning(stderr, "reiserfs_open: a superblock with wrong parameters "
"was found in the block (%d).\n", i); "was found in the block (%d).\n", i);
@@ -114,6 +111,10 @@ reiserfs_filsys_t * reiserfs_open (char * filename, int flags, int *error, void
return NULL; 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)); tmp_bh = bread (fd, get_sb_block_count(sb) - 1, get_sb_block_size(sb));
if (!tmp_bh) { if (!tmp_bh) {
@@ -393,7 +394,9 @@ void reiserfs_close (reiserfs_filsys_t * fs)
int reiserfs_new_blocknrs (reiserfs_filsys_t * fs, int reiserfs_new_blocknrs (reiserfs_filsys_t * fs,
unsigned long * free_blocknrs, unsigned long start, int amount_needed) unsigned long * free_blocknrs,
unsigned long start,
int amount_needed)
{ {
if (fs->block_allocator) if (fs->block_allocator)
return fs->block_allocator (fs, free_blocknrs, start, amount_needed); return fs->block_allocator (fs, free_blocknrs, start, amount_needed);
@@ -432,6 +435,9 @@ static int reiserfs_search_by_key_x (reiserfs_filsys_t * fs, struct key * key,
block = get_sb_root_block (fs->fs_ondisk_sb); 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; path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
while (1) { while (1) {
curr = PATH_OFFSET_PELEMENT (path, ++ path->path_length); curr = PATH_OFFSET_PELEMENT (path, ++ path->path_length);
@@ -457,6 +463,8 @@ static int reiserfs_search_by_key_x (reiserfs_filsys_t * fs, struct key * key,
return ITEM_NOT_FOUND; return ITEM_NOT_FOUND;
} }
block = get_dc_child_blocknr (B_N_CHILD (bh, curr->pe_position)); 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"); printf ("search_by_key: you can not get here\n");
return ITEM_NOT_FOUND; return ITEM_NOT_FOUND;
@@ -648,15 +656,7 @@ struct key * uget_rkey (struct path * path)
return 0; return 0;
} }
struct key * get_next_key_2 (struct path * path) struct key * reiserfs_next_key (struct path * path) {
{
if (PATH_LAST_POSITION (path) < B_NR_ITEMS (get_bh (path)) - 1)
return B_N_PKEY (get_bh (path), PATH_LAST_POSITION (path) + 1);
return uget_rkey (path);
}
struct key * reiserfs_next_key (struct path * path)
{
if (get_item_pos (path) < B_NR_ITEMS (get_bh (path)) - 1) 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 B_N_PKEY (get_bh (path), get_item_pos (path) + 1);
@@ -1141,6 +1141,7 @@ int create_dir_sd (reiserfs_filsys_t * fs,
else else
key_format = KEY_FORMAT_2; key_format = KEY_FORMAT_2;
memset(&sd, 0, sizeof(sd));
make_dir_stat_data (fs->fs_blocksize, key_format, get_key_dirid (key), make_dir_stat_data (fs->fs_blocksize, key_format, get_key_dirid (key),
get_key_objectid (key), &ih, &sd); get_key_objectid (key), &ih, &sd);
@@ -1196,24 +1197,24 @@ int can_we_format_it (char * device_name, int force)
dev_t rdev; dev_t rdev;
if (is_mounted (device_name)) { if (misc_device_mounted(device_name) > 0) {
/* device looks mounted */ /* device looks mounted */
reiserfs_warning (stderr, "'%s' looks mounted.", device_name); reiserfs_warning (stderr, "'%s' looks mounted.", device_name);
check_forcing_ask_confirmation (force); check_forcing_ask_confirmation (force);
} }
mode = get_st_mode (device_name); mode = misc_device_mode(device_name);
rdev = get_st_rdev (device_name); rdev = misc_device_rdev(device_name);
if (!S_ISBLK (mode)) { if (!S_ISBLK (mode)) {
/* file is not a block device */ /* file is not a block device */
reiserfs_warning (stderr, "%s is not a block special device", device_name); reiserfs_warning (stderr, "%s is not a block special device\n", device_name);
check_forcing_ask_confirmation (force); check_forcing_ask_confirmation (force);
} else { } else {
if ((IDE_DISK_MAJOR (MAJOR(rdev)) && MINOR(rdev) % 64 == 0) || if ((IDE_DISK_MAJOR (MAJOR(rdev)) && MINOR(rdev) % 64 == 0) ||
(SCSI_BLK_MAJOR (MAJOR(rdev)) && MINOR(rdev) % 16 == 0)) { (SCSI_BLK_MAJOR (MAJOR(rdev)) && MINOR(rdev) % 16 == 0)) {
/* /dev/hda or similar */ /* /dev/hda or similar */
reiserfs_warning (stderr, "%s is entire device, not just one partition!", reiserfs_warning (stderr, "%s is entire device, not just one partition!\n",
device_name); device_name);
check_forcing_ask_confirmation (force); check_forcing_ask_confirmation (force);
} }
@@ -1228,16 +1229,20 @@ int create_badblock_bitmap (reiserfs_filsys_t * fs, char * badblocks_file) {
__u32 blocknr; __u32 blocknr;
int count; 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"); fd = fopen (badblocks_file, "r");
if (fd == NULL) { if (fd == NULL) {
fprintf (stderr, "%s: could not open badblock file %s, work without it\n", fprintf (stderr, "%s: Failed to open the given badblock file '%s'.\n\n",
__FUNCTION__, badblocks_file); __FUNCTION__, badblocks_file);
return 1; return 1;
} }
fs->fs_badblocks_bm = reiserfs_create_bitmap (get_sb_block_count (fs->fs_ondisk_sb));
reiserfs_bitmap_zero (fs->fs_badblocks_bm);
while (!feof (fd)) { while (!feof (fd)) {
if (fgets(buf, sizeof(buf), fd) == NULL) if (fgets(buf, sizeof(buf), fd) == NULL)
@@ -1247,11 +1252,17 @@ int create_badblock_bitmap (reiserfs_filsys_t * fs, char * badblocks_file) {
if (count <= 0) if (count <= 0)
continue; continue;
if (blocknr < get_sb_block_count (fs->fs_ondisk_sb) && !not_data_block (fs, blocknr)) { if (blocknr >= get_sb_block_count (fs->fs_ondisk_sb)) {
reiserfs_bitmap_set_bit (fs->fs_badblocks_bm, blocknr); fprintf (stderr, "%s: block number (%u) points out of fs size "
} else { "(%u).\n", __FUNCTION__, blocknr,
fprintf (stderr, "%s: block number %u belongs to internal reiserfs structures.\n", 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); __FUNCTION__, blocknr);
return 1;
} else {
reiserfs_bitmap_set_bit (fs->fs_badblocks_bm, blocknr);
} }
} }
@@ -1260,13 +1271,98 @@ int create_badblock_bitmap (reiserfs_filsys_t * fs, char * badblocks_file) {
return 0; return 0;
} }
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) {
struct tree_balance tb;
struct key badblock_key = {-1, -1, {{0, 0}}};
struct path badblock_path; 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; 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++, ind_item++) {
reiserfs_bitmap_set_bit(fs->fs_badblocks_bm,
le32_to_cpu(*ind_item));
}
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; struct item_head badblock_ih;
// char item[UNFM_P_SIZE];
__u32 ni; __u32 ni;
__u64 offset; __u64 offset;
@@ -1276,42 +1372,16 @@ void add_badblock_list (reiserfs_filsys_t * fs, int no_badblock_in_tree_yet) {
return; return;
/* delete all items with badblock_key */ /* delete all items with badblock_key */
while (1) { if (replace)
reiserfs_search_by_key_4 (fs, &badblock_key, &badblock_path); badblock_list(fs, callback_badblock_rm, NULL);
if (get_blkh_nr_items ( B_BLK_HEAD (get_bh(&badblock_path))) <= PATH_LAST_POSITION (&badblock_path)) {
pathrelse (&badblock_path);
break;
}
tmp_ih = get_ih(&badblock_path);
if (get_key_dirid(&tmp_ih->ih_key) != (__u32)-1 ||
get_key_objectid(&tmp_ih->ih_key) != (__u32)-1 || !is_indirect_ih (tmp_ih)) {
pathrelse (&badblock_path);
break;
}
if (no_badblock_in_tree_yet)
reiserfs_panic ("$s: bad block list found in the tree\n", __FUNCTION__);
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*/);
}
memset(&badblock_ih, 0, sizeof(badblock_ih));
set_ih_key_format (&badblock_ih, KEY_FORMAT_2); set_ih_key_format (&badblock_ih, KEY_FORMAT_2);
set_ih_item_len (&badblock_ih, UNFM_P_SIZE); set_ih_item_len (&badblock_ih, UNFM_P_SIZE);
set_ih_free_space (&badblock_ih, 0); set_ih_free_space (&badblock_ih, 0);
set_ih_location (&badblock_ih, 0); set_ih_location (&badblock_ih, 0);
set_key_dirid (&badblock_ih.ih_key, -1); set_key_dirid (&badblock_ih.ih_key, BADBLOCK_DIRID);
set_key_objectid (&badblock_ih.ih_key, -1); set_key_objectid (&badblock_ih.ih_key, BADBLOCK_OBJID);
set_type (KEY_FORMAT_2, &badblock_ih.ih_key, TYPE_INDIRECT); set_type (KEY_FORMAT_2, &badblock_ih.ih_key, TYPE_INDIRECT);
j = 0; j = 0;
@@ -1327,21 +1397,25 @@ void add_badblock_list (reiserfs_filsys_t * fs, int no_badblock_in_tree_yet) {
set_offset (KEY_FORMAT_2, &badblock_ih.ih_key, offset); set_offset (KEY_FORMAT_2, &badblock_ih.ih_key, offset);
ni = cpu_to_le32 (i); ni = cpu_to_le32 (i);
retval = usearch_by_position (fs, &badblock_ih.ih_key, key_format (&badblock_ih.ih_key), &badblock_path); retval = usearch_by_position (fs, &badblock_ih.ih_key,
key_format(&badblock_ih.ih_key),
&badblock_path);
switch (retval) { switch (retval) {
case (FILE_NOT_FOUND): case (FILE_NOT_FOUND):
init_tb_struct (&tb, fs, &badblock_path, IH_SIZE + get_ih_item_len(&badblock_ih)); init_tb_struct (&tb, fs, &badblock_path,
if (fix_nodes (/*tb.transaction_handle,*/ M_INSERT, &tb, &badblock_ih/*, body*/) != CARRY_ON) IH_SIZE + get_ih_item_len(&badblock_ih));
die ("reiserfsck_insert_item: fix_nodes failed");
do_balance (/*tb.transaction_handle,*/ &tb, &badblock_ih, (void *)&ni , M_INSERT, 0/*zero num*/);
// reiserfsck_insert_item (&badblock_path, &badblock_ih, item); 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; break;
case (POSITION_NOT_FOUND): case (POSITION_NOT_FOUND):
/* take unformatted pointer from an indirect item */ case (POSITION_FOUND):
/* Insert the new item to the found position. */
init_tb_struct (&tb, fs, &badblock_path, UNFM_P_SIZE); init_tb_struct (&tb, fs, &badblock_path, UNFM_P_SIZE);
@@ -1349,10 +1423,6 @@ void add_badblock_list (reiserfs_filsys_t * fs, int no_badblock_in_tree_yet) {
die ("reiserfsck_paste_into_item: fix_nodes failed"); die ("reiserfsck_paste_into_item: fix_nodes failed");
do_balance (&tb, 0, (const char *)&ni, M_PASTE, 0); do_balance (&tb, 0, (const char *)&ni, M_PASTE, 0);
// reiserfsck_file_write (&badblock_ih, item, 1 /* was in tree to avoid problems with bitmaps */);
// reiserfsck_paste_into_item (path, (const char *)&ni, UNFM_P_SIZE);
break; break;
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2003 by Hans Reiser, licensing governed by * Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
+2 -2
View File
@@ -1,10 +1,10 @@
%define reiserfsprogsversion 3.6.9 %define reiserfsprogsversion 3.6.13
Vendor: Hans Reiser Vendor: Hans Reiser
Distribution: Hans Reiser Distribution: Hans Reiser
Name: reiserfsprogs Name: reiserfsprogs
Release: 1 Release: 1
Copyright: 2003 Hans Reiser Copyright: 2004 Hans Reiser
Group: Unsorted Group: Unsorted
Packager: anthon@mnt.org Packager: anthon@mnt.org
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+34 -18
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -111,6 +111,12 @@ static unsigned long move_formatted_block(reiserfs_filsys_t * fs, unsigned long
for (i = 0; i < B_NR_ITEMS(bh); i++) { for (i = 0; i < B_NR_ITEMS(bh); i++) {
ih = B_N_PITEM_HEAD(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)) { if (is_indirect_ih(ih)) {
__u32 * indirect; __u32 * indirect;
@@ -163,14 +169,27 @@ static unsigned long move_formatted_block(reiserfs_filsys_t * fs, unsigned long
return new_blocknr; return new_blocknr;
} }
int shrink_fs(reiserfs_filsys_t * fs, unsigned long blocks) int shrink_fs(reiserfs_filsys_t * fs, long long int blocks)
{ {
unsigned long n_root_block; unsigned long n_root_block;
unsigned int bmap_nr_new; unsigned int bmap_nr_new;
unsigned long bad_count;
ondisk_sb = fs->fs_ondisk_sb; 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 */ /* warn about alpha version */
{ {
int c; int c;
@@ -187,18 +206,6 @@ int shrink_fs(reiserfs_filsys_t * fs, unsigned long blocks)
exit(1); exit(1);
} }
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;
}
reiserfs_reopen(fs, O_RDWR); reiserfs_reopen(fs, O_RDWR);
if (reiserfs_open_ondisk_bitmap (fs)) if (reiserfs_open_ondisk_bitmap (fs))
DIE("cannot open ondisk bitmap"); DIE("cannot open ondisk bitmap");
@@ -249,7 +256,6 @@ int shrink_fs(reiserfs_filsys_t * fs, unsigned long blocks)
(unsigned long)total_node_cnt, blocks_used); (unsigned long)total_node_cnt, blocks_used);
} }
#if 1
{ {
unsigned long l; unsigned long l;
@@ -263,13 +269,23 @@ int shrink_fs(reiserfs_filsys_t * fs, unsigned long blocks)
} }
printf("\n"); printf("\n");
} }
#endif
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); reiserfs_shrink_bitmap (fs->fs_bitmap2, blocks);
set_sb_free_blocks (ondisk_sb, get_sb_free_blocks(ondisk_sb) set_sb_free_blocks (ondisk_sb, get_sb_free_blocks(ondisk_sb)
- (get_sb_block_count(ondisk_sb) - blocks) - (get_sb_block_count(ondisk_sb) - blocks)
+ (get_sb_bmap_nr(ondisk_sb) - bmap_nr_new)); + (get_sb_bmap_nr(ondisk_sb) - bmap_nr_new)
+ bad_count);
set_sb_block_count (ondisk_sb, blocks); set_sb_block_count (ondisk_sb, blocks);
set_sb_bmap_nr (ondisk_sb, bmap_nr_new); set_sb_bmap_nr (ondisk_sb, bmap_nr_new);
+14 -23
View File
@@ -1,37 +1,28 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
#include "resize.h" #include "resize.h"
/* the front-end for kernel on-line resizer */ /* the front-end for kernel on-line resizer */
int resize_fs_online(char * devname, unsigned long blocks) int resize_fs_online(char * devname, long long int blocks) {
{ struct mntent *mnt;
static char buf[40]; char buf[40];
FILE * f;
struct mntent * mnt;
if ((f = setmntent (MOUNTED, "r")) == NULL) /* Find the mount entry. */
goto fail; if ((mnt = misc_mntent(devname)) == NULL)
die ("resize_reiserfs: can't find mount entry\n");
while ((mnt = getmntent (f)) != NULL) sprintf(buf,"resize=%lld", blocks);
if(strcmp(devname, mnt->mnt_fsname) == 0) {
if (strcmp(mnt->mnt_type,"reiserfs"))
die ("resize_reiserfs: can\'t resize fs other than reiserfs\n");
sprintf(buf,"resize=%lu", blocks);
if (mount(mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, if (mount(mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type,
(unsigned long)(MS_MGC_VAL | MS_REMOUNT), buf)) (unsigned long)(MS_MGC_VAL << 16 | MS_REMOUNT), buf))
die ("resize_reiserfs: remount failed: %s\n", strerror(errno)); {
die ("resize_reiserfs: remount failed: %s\n",
endmntent(f); strerror(errno));
return 0;
} }
fail:
die ("resize_reiserfs: can't find mount entry\n"); return 0;
return 1;
} }
+4 -4
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -31,7 +31,7 @@
#define print_usage_and_exit() {\ #define print_usage_and_exit() {\
fprintf (stderr, "Usage: %s [-s[+|-]#[G|M|K]] [-fqv] device\n\n", argv[0]);\ fprintf (stderr, "Usage: %s [-s[+|-]#[G|M|K]] [-fqvV] device\n\n", argv[0]);\
exit(16);\ exit(16);\
} }
@@ -47,7 +47,7 @@ extern int opt_nowrite;
extern int opt_safe; extern int opt_safe;
/* fe.c */ /* fe.c */
int resize_fs_online(char * devname, unsigned long blocks); extern int resize_fs_online(char * devname, long long int blocks);
/* do_shrink.c */ /* do_shrink.c */
int shrink_fs(reiserfs_filsys_t *, unsigned long blocks); extern int shrink_fs(reiserfs_filsys_t *, long long int blocks);
+3 -3
View File
@@ -1,9 +1,9 @@
.\" -*- nroff -*- .\" -*- nroff -*-
.\" Copyright 1996-2003 Hans Reiser. .\" Copyright 1996-2004 Hans Reiser.
.\" .\"
.TH RESIZE_REISERFS 8 "April 2003" "Reiserfsprogs-3.6.9" .TH RESIZE_REISERFS 8 "January 2004" "Reiserfsprogs-3.6.13"
.SH NAME .SH NAME
resize_reiserfs \- Reiserfs filesystem resizer resize_reiserfs \- resizer tool for the ReiserFS filesystem
.SH SYNOPSIS .SH SYNOPSIS
.BR resize_reiserfs .BR resize_reiserfs
[ [
+84 -51
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2003 by Hans Reiser, licensing governed by * Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -11,8 +11,9 @@
*/ */
#include "resize.h" #include "resize.h"
#include <libgen.h> #include <limits.h>
int opt_banner = 0;
int opt_force = 0; int opt_force = 0;
int opt_verbose = 1; /* now "verbose" option is default */ int opt_verbose = 1; /* now "verbose" option is default */
int opt_nowrite = 0; int opt_nowrite = 0;
@@ -23,17 +24,26 @@ char * g_progname;
/* calculate the new fs size (in blocks) from old fs size and the string /* calculate the new fs size (in blocks) from old fs size and the string
representation of new size */ representation of new size */
static unsigned long calc_new_fs_size(unsigned long count, int bs, static long long int calc_new_fs_size(unsigned long count,
unsigned int bs,
char *bytes_str) char *bytes_str)
{ {
long long int bytes; long long int bytes;
unsigned long blocks; long long int blocks;
int c; char *end;
int rel;
bytes = atoll(bytes_str); end = bytes_str + strlen(bytes_str) - 1;
c = bytes_str[strlen(bytes_str) - 1]; rel = bytes_str[0] == '+' || bytes_str[0] == '-';
bytes = strtoll(bytes_str, &bytes_str, 10);
switch (c) { /* Some error occured while convertion or the specified
string is not valid. */
if (bytes == LONG_LONG_MIN || bytes == LONG_LONG_MAX ||
(bytes_str != end && bytes_str != end + 1))
return -EINVAL;
switch (*end) {
case 'G': case 'G':
case 'g': case 'g':
bytes *= 1024; bytes *= 1024;
@@ -47,10 +57,7 @@ static unsigned long calc_new_fs_size(unsigned long count, int bs,
blocks = bytes / bs; blocks = bytes / bs;
if (bytes_str[0] == '+' || bytes_str[0] == '-') return rel ? count + blocks : blocks;
return (count + blocks);
return blocks;
} }
/* print some fs parameters */ /* print some fs parameters */
@@ -82,7 +89,7 @@ static int bwrite_cond (struct buffer_head * bh)
/* the first one of the most important functions */ /* the first one of the most important functions */
static int expand_fs (reiserfs_filsys_t * fs, unsigned long block_count_new) { static int expand_fs (reiserfs_filsys_t * fs, long long int block_count_new) {
unsigned int bmap_nr_new, bmap_nr_old; unsigned int bmap_nr_new, bmap_nr_old;
struct reiserfs_super_block * sb; struct reiserfs_super_block * sb;
unsigned int i; unsigned int i;
@@ -131,6 +138,43 @@ static int expand_fs (reiserfs_filsys_t * fs, unsigned long block_count_new) {
return 0; return 0;
} }
static int resizer_check_fs_size(reiserfs_filsys_t *fs, long long int new_size) {
if (new_size < 0) {
reiserfs_warning(stderr, "\nresizer_reiserfs: the new size "
"value is wrong.\n\n");
return new_size;
}
if (new_size == get_sb_block_count(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) {
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(!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);
return 1;
}
}
return 0;
}
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
char * bytes_count_str = NULL; char * bytes_count_str = NULL;
@@ -144,12 +188,14 @@ int main(int argc, char *argv[]) {
struct reiserfs_super_block *sb_old; struct reiserfs_super_block *sb_old;
unsigned long block_count_new; long long int block_count_new;
g_progname = basename(argv[0]); g_progname = basename(argv[0]);
print_banner (g_progname);
while ((c = getopt(argc, argv, "fvcqks:j:")) != EOF) { if (argc < 2)
print_usage_and_exit();
while ((c = getopt(argc, argv, "fvcqks:j:V")) != EOF) {
switch (c) { switch (c) {
case 's' : case 's' :
if (!optarg) if (!optarg)
@@ -179,13 +225,20 @@ int main(int argc, char *argv[]) {
case 'k': case 'k':
opt_skipj = 1; opt_skipj = 1;
break; break;
case 'V':
opt_banner++;
break;
default: default:
print_usage_and_exit (); print_usage_and_exit ();
} }
} }
if (optind == argc ) print_banner (g_progname);
print_usage_and_exit();
if (opt_banner)
exit(0);
devname = argv[optind]; devname = argv[optind];
fs = reiserfs_open(devname, O_RDONLY, &error, 0, 1); fs = reiserfs_open(devname, O_RDONLY, &error, 0, 1);
@@ -213,21 +266,21 @@ int main(int argc, char *argv[]) {
sb = fs->fs_ondisk_sb; sb = fs->fs_ondisk_sb;
if(bytes_count_str) { /* new fs size is specified by user */ /* If size change was specified by user, calculate it,
block_count_new = calc_new_fs_size(get_sb_block_count(sb), otherwise take the whole device. */
fs->fs_blocksize, bytes_count_str); block_count_new = bytes_count_str ?
} else { /* use whole device */ calc_new_fs_size(get_sb_block_count(sb),
block_count_new = count_blocks(devname, fs->fs_blocksize); fs->fs_blocksize, bytes_count_str) :
} count_blocks(devname, fs->fs_blocksize);
if (is_mounted (devname)) { if (resizer_check_fs_size(fs, block_count_new))
return 1;
if (misc_device_mounted(devname) > 0) {
reiserfs_close(fs); reiserfs_close(fs);
if ((error = resize_fs_online(devname, block_count_new))) error = resize_fs_online(devname, block_count_new);
reiserfs_warning(stderr, "\n\nresize_reiserfs: On-line resizing " reiserfs_warning(stderr, "\n\nresize_reiserfs: On-line resizing %s.\n\n",
"failed.\n\n "); error ? "failed" : "finished successfully");
else
reiserfs_warning(stderr, "\n\nresize_reiserfs: On-line resizing "
"finished successfully.\n\n ");
return error; return error;
} }
@@ -242,26 +295,6 @@ int main(int argc, char *argv[]) {
/* fixme: shouldn't we check for something like: fsck guarantees: fs is ok */ /* fixme: shouldn't we check for something like: fsck guarantees: fs is ok */
DIE ("the file system isn't in valid state."); DIE ("the file system isn't in valid state.");
if (block_count_new >= get_sb_block_count(sb)) {
if (block_count_new == get_sb_block_count(sb)) {
reiserfs_warning (stderr, "%s already is of the needed size. "
"Nothing to be done\n\n", devname);
exit (1);
}
if(!valid_offset(fs->fs_dev,
(loff_t)block_count_new * fs->fs_blocksize - 1))
{
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", devname,
count_blocks(devname, fs->fs_blocksize),
get_sb_block_count(sb), block_count_new);
exit (1);
}
}
/* Needed to keep idiot compiler from issuing false warning */ /* Needed to keep idiot compiler from issuing false warning */
sb_old = 0; sb_old = 0;
-4
View File
@@ -1,4 +0,0 @@
SUBDIRS = PROGS
sbin_PROGRAMS =
-418
View File
@@ -1,418 +0,0 @@
# Makefile.in generated by automake 1.7.2 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# 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 = :
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@
LTLIBOBJS = @LTLIBOBJS@
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@
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__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
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@
SUBDIRS = PROGS
sbin_PROGRAMS =
subdir = tests
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/include/config.h
CONFIG_CLEAN_FILES =
sbin_PROGRAMS =
PROGRAMS = $(sbin_PROGRAMS)
DIST_SOURCES =
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 = Makefile.am Makefile.in
DIST_SUBDIRS = $(SUBDIRS)
all: all-recursive
.SUFFIXES:
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu tests/Makefile
Makefile: $(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)
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):
@set fnord $$MAKEFLAGS; amf=$$2; \
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) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
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:
@set fnord $$MAKEFLAGS; amf=$$2; \
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) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
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
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: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -f $$subdir/TAGS && tags="$$tags -i $$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) \
$(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
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d $(distdir)/$$subdir \
|| mkdir $(distdir)/$$subdir \
|| exit 1; \
(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 $(PROGRAMS)
installdirs: installdirs-recursive
installdirs-am:
$(mkinstalldirs) $(DESTDIR)$(sbindir)
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_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-recursive
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
distclean: distclean-recursive
distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-recursive
dvi-am:
info: info-recursive
info-am:
install-data-am:
install-exec-am: install-sbinPROGRAMS
install-info: install-info-recursive
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
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-sbinPROGRAMS
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
clean-generic clean-recursive clean-sbinPROGRAMS ctags \
ctags-recursive distclean distclean-generic distclean-recursive \
distclean-tags distdir 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-sbinPROGRAMS 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 \
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:
-5
View File
@@ -1,5 +0,0 @@
sbin_PROGRAMS = reiserfs_corrupter
SOURCES = corrupter.c
LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
-382
View File
@@ -1,382 +0,0 @@
# Makefile.in generated by automake 1.7.2 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# 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 = :
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@
LTLIBOBJS = @LTLIBOBJS@
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@
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__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
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 = reiserfs_corrupter
SOURCES = corrupter.c
LDADD = $(top_srcdir)/lib/libmisc.a $(top_srcdir)/reiserfscore/libcore.a
subdir = tests/PROGS
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/include/config.h
CONFIG_CLEAN_FILES =
sbin_PROGRAMS = reiserfs_corrupter$(EXEEXT)
PROGRAMS = $(sbin_PROGRAMS)
reiserfs_corrupter_SOURCES = reiserfs_corrupter.c
reiserfs_corrupter_OBJECTS = reiserfs_corrupter.$(OBJEXT)
reiserfs_corrupter_LDADD = $(LDADD)
reiserfs_corrupter_DEPENDENCIES = $(top_srcdir)/lib/libmisc.a \
$(top_srcdir)/reiserfscore/libcore.a
reiserfs_corrupter_LDFLAGS =
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/reiserfs_corrupter.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 = reiserfs_corrupter.c
DIST_COMMON = Makefile.am Makefile.in
SOURCES = corrupter.c
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu tests/PROGS/Makefile
Makefile: $(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)
reiserfs_corrupter$(EXEEXT): $(reiserfs_corrupter_OBJECTS) $(reiserfs_corrupter_DEPENDENCIES)
@rm -f reiserfs_corrupter$(EXEEXT)
$(LINK) $(reiserfs_corrupter_LDFLAGS) $(reiserfs_corrupter_OBJECTS) $(reiserfs_corrupter_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT) core *.core
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reiserfs_corrupter.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 "$(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 "$(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 $(PROGRAMS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(sbindir)
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-exec-am: install-sbinPROGRAMS
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 uninstall-sbinPROGRAMS
.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-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-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:
-198
View File
@@ -1,198 +0,0 @@
#define _GNU_SOURCE
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <asm/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/resource.h>
#include <sys/vfs.h>
#include "io.h"
#include "misc.h"
#include "reiserfs_lib.h"
enum {
USED_BLOCKS,
ALL_BLOCKS,
EXTERN_BITMAP
};
typedef struct corrupter_options {
int bitmap_kind;
char * bm_name;
reiserfs_bitmap_t * bm;
int block_size;
int offset;
} corrupter_options_t;
#define print_usage_and_exit() {\
printf ("\nUsage: %s [options] device\n"\
"Options:\n"\
" -b bitmap\t\tscan blocks marked in bitmap\n"\
" -S\t\t\tscan-whole-partition\n"\
" -s blocksize\t\tfs blocksize\n"\
" -o bitmap\t\tskip offset blocks\n\n"\
, argv[0]);\
exit (16);\
}
static char * parse_options (corrupter_options_t * options, int argc, char * argv [])
{
int c;
options->bitmap_kind = USED_BLOCKS;
options->block_size = 4096;
options->offset = 0;
options->bm_name = NULL;
options->bm = NULL;
while (1) {
int option_index;
c = getopt_long (argc, argv, "Sb:s:o:",
NULL, &option_index);
if (c == -1)
break;
switch (c) {
case 0:
/* long-only options */
break;
case 'b': /* --scan-marked-in-bitmap */
options->bitmap_kind = EXTERN_BITMAP;
options->bm_name = optarg;
break;
case 'S': /* --scan-whole-partition */
options->bitmap_kind = ALL_BLOCKS;
break;
case 'o': /* --scan-marked-in-bitmap */
options->offset = atoi (optarg);
break;
case 's': /* --scan-marked-in-bitmap */
options->block_size = atoi (optarg);
break;
default:
print_usage_and_exit();
}
}
if (optind != argc - 1)
print_usage_and_exit();
return argv[optind];
}
void load_bitmap_from_file (corrupter_options_t * options) {
FILE * fd;
fd = fopen (options->bm_name, "r");
if (!fd)
reiserfs_panic ("%s: could not load bitmap: %s\n", __FUNCTION__, strerror(errno));
options->bm = reiserfs_bitmap_load (fd);
if (!options->bm)
reiserfs_panic ("could not load fitmap from \"%s\"", options->bm_name);
fclose (fd);
}
void warn_what_will_be_done (corrupter_options_t * options, char * file_name, int bl_count) {
printf ("====================\n");
printf ("\tprogram will corrupt %s\n", file_name);
printf ("\tblock size is %d\n", options->block_size);
printf ("\toffset is %d blocks\n", options->offset);
if (options->bitmap_kind == ALL_BLOCKS) {
printf ("\tall formatted blocks, bitmap and journal blocks will be corrupted\n");
} else if (options->bitmap_kind == USED_BLOCKS) {
printf ("\tall formatted blocks, bitmap and journal blocks which are used in fs bitmap will be corrupted\n");
} else if (options->bitmap_kind == EXTERN_BITMAP) {
printf ("\tall formatted blocks, bitmap and journal blocks from bitmap %s will be corrupted\n", options->bm_name);
}
printf ("\tblocks count %d\n", bl_count);
printf ("====================\n");
}
int main (int argc, char * argv []) {
corrupter_options_t options;
char * file_name;
unsigned int block_count, i;
reiserfs_filsys_t * fs;
file_name = parse_options (&options, argc, argv);
fs = reiserfs_open (file_name, O_RDONLY, 0, &options, 1);
if (no_reiserfs_found (fs))
die ("could not open filesystem on \"%s\"", file_name);
/* keep SB to separate memory */
fs->fs_ondisk_sb = getmem(fs->fs_blocksize);
memcpy (fs->fs_ondisk_sb, fs->fs_super_bh->b_data, fs->fs_blocksize);
block_count = get_sb_block_count (fs->fs_ondisk_sb);
if (options.bm_name) {
load_bitmap_from_file (&options);
} else {
if (reiserfs_open_ondisk_bitmap (fs))
die ("could not open bitmap\n");
options.bm = reiserfs_create_bitmap (fs->fs_bitmap2->bm_bit_size);
reiserfs_bitmap_copy (options.bm, fs->fs_bitmap2);
}
if (options.bm && block_count > options.bm->bm_bit_size) {
printf ("fs is larger (%d blocks) then bitmap (%ld blocks), work with %ld blocks only\n",
block_count, options.bm->bm_bit_size, options.bm->bm_bit_size);
block_count = options.bm->bm_bit_size;
}
warn_what_will_be_done (&options, file_name, block_count);
for (i = options.offset; i < block_count; i++) {
int who;
struct buffer_head * bh;
/* read every block and corrupt all formatted blocks */
if (!reiserfs_bitmap_test_bit (options.bm, i))
continue;
bh = bread (fs->fs_dev, i, fs->fs_blocksize);
who = who_is_this (bh->b_data, bh->b_size);
/*
if (block of bitmap || block of journal || leaf || internal)
take N random bytes and write them into N random place
within the block
*/
if (who != THE_SUPER && who != THE_LEAF && who != THE_INTERNAL && who != THE_JDESC &&
!block_of_bitmap (fs, i) && !block_of_journal (fs, i))
continue;
printf ("\ncorrupt %d ", i);
}
freemem(fs->fs_ondisk_sb);
reiserfs_close (fs);
printf ("\nDone\n");
return 0;
}
+1
View File
@@ -77,6 +77,7 @@ RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@ SHELL = @SHELL@
STRIP = @STRIP@ STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@ VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_RANLIB = @ac_ct_RANLIB@
+15 -4
View File
@@ -1,9 +1,9 @@
.\" -*- nroff -*- .\" -*- nroff -*-
.\" Copyright 1996-2003 Hans Reiser. .\" Copyright 1996-2004 Hans Reiser.
.\" .\"
.TH REISERFSTUNE 8 "April 2003" "Reiserfsprogs-3.6.9" .TH REISERFSTUNE 8 "February 2004" "Reiserfsprogs-3.6.13"
.SH NAME .SH NAME
reiserfstune reiserfstune \- tunning tool for the ReiserFS filesystem
.SH SYNOPSIS .SH SYNOPSIS
.B reiserfstune .B reiserfstune
[ \fB-f\fR ] [ \fB-f\fR ]
@@ -13,6 +13,8 @@ reiserfstune
[ \fB-s\fR | \fB--journal-new-size\fR \fIN\fR ] [ \fB-s\fR | \fB--journal-new-size\fR \fIN\fR ]
[ \fB-o\fR | \fB--journal-new-offset\fR \fIN\fR ] [ \fB-o\fR | \fB--journal-new-offset\fR \fIN\fR ]
[ \fB-t\fR | \fB--max-transaction-size\fR \fIN\fR ] [ \fB-t\fR | \fB--max-transaction-size\fR \fIN\fR ]
[ \fB-b\fR | \fB--add-badblocks\fR \fIfile\fR ]
[ \fB-B\fR | \fB--badblocks\fR \fIfile\fR ]
[ \fB-u\fR | \fB--uuid \fIUUID\fR ] [ \fB-u\fR | \fB--uuid \fIUUID\fR ]
[ \fB-l\fR | \fB--label \fILABEL\fR ] [ \fB-l\fR | \fB--label \fILABEL\fR ]
.I device .I device
@@ -72,11 +74,20 @@ multiple filesystems to reside on the same device, and you don't want
to or cannot partition that device. to or cannot partition that device.
.TP .TP
\fB \-t\fR | \fB\--maximal-transaction-size \fIN \fB \-t\fR | \fB\--maximal-transaction-size \fIN
\fI\fR is the maximum transaction size parameter for the new \fIN\fR is the maximum transaction size parameter for the new
journal. The default, and max possible, value is 1024 blocks. It journal. The default, and max possible, value is 1024 blocks. It
should be less than half the size of the journal. If specifed should be less than half the size of the journal. If specifed
incorrectly, it will be adjusted. incorrectly, it will be adjusted.
.TP .TP
\fB \-b\fR | \fB\--add-badblocks\fR \fIfile\fR
\fIFile\fR is the file name of the file that contains the list of blocks to be marked
as bad on the fs. The list is added to the fs list of bad blocks.
.TP
\fB \-B\fR | \fB\--badblocks\fR \fIfile\fR
\fIFile\fR is the file name of the file that contains the list of blocks to be marked
as bad on the fs. The bad block list on the fs is cleared before the list specified
in the \fIFile\fR is added to the fs.
.TP
\fB\-f\fR | \fB--force\fR \fB\-f\fR | \fB--force\fR
Normally \fBreiserfstune\fR will refuse to change a journal of a Normally \fBreiserfstune\fR will refuse to change a journal of a
file system that was created before this journal relocation code. This file system that was created before this journal relocation code. This
+147 -73
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2003 by Hans Reiser, licensing governed by * Copyright 2002-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -31,34 +31,32 @@ reiserfs_filsys_t * fs;
static void print_usage_and_exit(void) static void print_usage_and_exit(void)
{ {
message ("Usage: %s [options] " message ("Usage: %s [options] device [block-count]\n"
" device [block-count]\n"
"\n" "\n"
"Options:\n\n" "Options:\n\n"
" -j | --journal-device file\n" " -j | --journal-device file\tcurrent journal device\n"
" --journal-new-device file\n" " --journal-new-device file\tnew journal device\n"
" -o | --journal-new-offset N\n" " -o | --journal-new-offset N\tnew journal offset in blocks\n"
" -s | --journal-new-size N\n" " -s | --journal-new-size N\tnew journal size in blocks\n"
" -t | --transaction-max-size N\n" " -t | --trans-max-size N\tnew journal max transaction size in blocks\n"
" --no-journal-available\n" " --no-journal-available\tcurrent journal is not available\n"
" --make-journal-standard\n" " --make-journal-standard\tnew journal to be standard\n"
/*"\t-p | --keep-old-journal-param (keep parametrs from old journal to new one)\n"*/ /*"\t-p | --keep-old-journal-param (keep parametrs from old journal to new one)\n"*/
" -u | --uuid UUID|random\n" " -b | --add-badblocks file\tadd to bad block list\n"
" -l | --label LABEL\n" " -B | --badblocks file\t\tset the bad block list\n"
" -f | --force \n", program_name); " -u | --uuid UUID|random\tset new UUID\n"
" -l | --label LABEL\t\tset new label\n"
" -f | --force\t\t\tforce tuning, less confirmations\n"
" -V\t\t\t\tprint version and exit\n", program_name);
exit (1); exit (1);
} }
/*
Undocumented options:
-B badblock_file
*/
unsigned long Journal_size = 0; unsigned long Journal_size = 0;
int Max_trans_size = JOURNAL_TRANS_MAX; int Max_trans_size = JOURNAL_TRANS_MAX;
int Offset = 0; int Offset = 0;
__u16 Options = 0; __u16 Options = 0;
int Force = 0; int Force = 0;
int Bads = 0;
char * LABEL; char * LABEL;
unsigned char UUID[16]; unsigned char UUID[16];
char * badblocks_file; char * badblocks_file;
@@ -214,6 +212,104 @@ static void set_offset_in_journal_device (char * str)
} }
static void callback_new_badblocks(reiserfs_filsys_t *fs,
struct path *badblock_path,
void *data)
{
struct item_head *tmp_ih;
__u32 *ind_item, i;
tmp_ih = get_ih(badblock_path);
ind_item = (__u32 *)get_item(badblock_path);
for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++) {
if (reiserfs_bitmap_test_bit(fs->fs_badblocks_bm,
le32_to_cpu(*ind_item)))
{
message("Block %u is marked as bad already.",
le32_to_cpu(*ind_item));
reiserfs_bitmap_clear_bit(fs->fs_badblocks_bm,
le32_to_cpu(*ind_item));
}
}
pathrelse (badblock_path);
}
static void callback_clear_badblocks(reiserfs_filsys_t *fs,
struct path *badblock_path,
void *data)
{
struct item_head *tmp_ih;
__u32 *ind_item, i;
tmp_ih = get_ih(badblock_path);
ind_item = (__u32 *)get_item(badblock_path);
for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++) {
reiserfs_bitmap_clear_bit(fs->fs_bitmap2,
le32_to_cpu(*ind_item));
}
pathrelse (badblock_path);
}
static void add_badblocks(reiserfs_filsys_t *fs) {
unsigned long i, marked = 0;
if (reiserfs_open_ondisk_bitmap (fs) < 0) {
message("Failed to open reiserfs ondisk bitmap.\n");
reiserfs_close(fs);
exit(1);
}
if (create_badblock_bitmap (fs, badblocks_file)) {
message("Failed to initialize the bad block bitmap.\n");
reiserfs_close(fs);
exit(1);
}
if (Bads == 1)
badblock_list(fs, callback_new_badblocks, NULL);
else
badblock_list(fs, callback_clear_badblocks, NULL);
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 (fs->fs_bitmap2, i)) {
reiserfs_bitmap_set_bit (fs->fs_bitmap2, i);
marked++;
} else {
/* Check that this is a block */
message("Bad block %lu is used already in reiserfs tree. "
"To mark it as a bad block use reiserfsck\n"
"--fix-fixable with -B option.", i);
reiserfs_bitmap_clear_bit (fs->fs_badblocks_bm, i);
}
}
}
if (marked) {
set_sb_free_blocks(fs->fs_ondisk_sb, get_sb_free_blocks(fs->fs_ondisk_sb) -
fs->fs_badblocks_bm->bm_set_bits);
mark_buffer_dirty(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);
}
if (marked) {
add_badblock_list(fs, 1);
}
message("%lu blocks were marked as bad.", marked);
}
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
reiserfs_filsys_t * fs; reiserfs_filsys_t * fs;
@@ -233,8 +329,6 @@ int main (int argc, char **argv)
else else
program_name = argv[ 0 ]; program_name = argv[ 0 ];
print_banner (program_name);
if (argc < 2) if (argc < 2)
print_usage_and_exit (); print_usage_and_exit ();
@@ -242,25 +336,28 @@ int main (int argc, char **argv)
jdevice_name = 0; jdevice_name = 0;
j_new_device_name = 0; j_new_device_name = 0;
memset(UUID, 0, 16);
while (1) { while (1) {
static struct option options[] = { static struct option options[] = {
{"journal-device", required_argument, 0, 'j'}, {"journal-device", required_argument, 0, 'j'},
{"journal-new-device", required_argument, &flag, OPT_NEW_J}, {"journal-new-device", required_argument, &flag, OPT_NEW_J},
{"journal-new-size", required_argument, 0, 's'}, {"journal-new-size", required_argument, 0, 's'},
{"transaction-max-size", required_argument, 0, 't'}, {"trans-max-size", required_argument, 0, 't'},
{"journal-new-offset", required_argument, 0, 'o'}, {"journal-new-offset", required_argument, 0, 'o'},
{"no-journal-available", no_argument, &flag, OPT_SKIP_J}, {"no-journal-available", no_argument, &flag, OPT_SKIP_J},
/*{"keep-old-journal-param", no_argument, 0, 'p'},*/ /*{"keep-old-journal-param", no_argument, 0, 'p'},*/
{"uuid", required_argument, 0, 'u'}, {"uuid", required_argument, 0, 'u'},
{"label", required_argument, 0, 'l'}, {"label", required_argument, 0, 'l'},
{"add-badblocks", required_argument, 0, 'b'},
{"badblocks", required_argument, 0, 'B'},
{"force", no_argument, 0, 'f'}, {"force", no_argument, 0, 'f'},
{"really-force", no_argument, &flag, OPT_SUPER_FORCE},
{"make-journal-standard", no_argument, &flag, OPT_STANDARD}, {"make-journal-standard", no_argument, &flag, OPT_STANDARD},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
int option_index; int option_index;
c = getopt_long (argc, argv, "j:s:t:o:fu:l:B:", c = getopt_long (argc, argv, "j:s:t:o:fu:l:b:B:V",
options, &option_index); options, &option_index);
if (c == -1) if (c == -1)
break; break;
@@ -275,9 +372,6 @@ int main (int argc, char **argv)
if (flag == OPT_SKIP_J) { if (flag == OPT_SKIP_J) {
Options |= OPT_SKIP_J; Options |= OPT_SKIP_J;
} }
if (flag == OPT_SUPER_FORCE) {
Options |=OPT_SUPER_FORCE;
}
if (flag == OPT_STANDARD) { if (flag == OPT_STANDARD) {
Options |=OPT_STANDARD; Options |=OPT_STANDARD;
} }
@@ -291,7 +385,7 @@ int main (int argc, char **argv)
Is_journal_or_maxtrans_size_specified = 1; Is_journal_or_maxtrans_size_specified = 1;
break; break;
case 't': /* --transaction-max-size */ case 't': /* --trans-max-size */
set_transaction_max_size (optarg); set_transaction_max_size (optarg);
Is_journal_or_maxtrans_size_specified = 1; Is_journal_or_maxtrans_size_specified = 1;
break; break;
@@ -306,26 +400,38 @@ int main (int argc, char **argv)
confirmation */ confirmation */
Force ++; Force ++;
break; break;
case 'B': /* --badblock-list */ case 'b': /* --add-badblocks */
asprintf (&badblocks_file, "%s", optarg); asprintf (&badblocks_file, "%s", optarg);
Bads = 1;
break;
case 'B': /* --badblocks */
asprintf (&badblocks_file, "%s", optarg);
Bads = 2;
break; break;
case 'u': case 'u':
/* UUID */ /* UUID */
#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
if (!strcmp(optarg, "random")) { if (!strcmp(optarg, "random")) {
if (generate_random_uuid (UUID)) uuid_generate(UUID);
message ("failed to genetate UUID\n");
} else { } else {
if (set_uuid (optarg, UUID)) { if (uuid_parse(optarg, UUID) < 0) {
message ("wrong UUID specified\n"); message ("Invalid UUID '%s' was specified\n", optarg);
return 1; return 1;
} }
} }
#else
message ("Cannot set the UUID, uuidlib was not found "
"by configure.\n");
return 1;
#endif
break; break;
case 'l': case 'l':
/* LABEL */ /* LABEL */
LABEL = optarg; LABEL = optarg;
break; break;
case 'V':
print_banner("reiserfstune");
exit(0);
#if 0 #if 0
case 'J': /* --journal-new-device */ case 'J': /* --journal-new-device */
Options |= OPT_NEW_J; Options |= OPT_NEW_J;
@@ -361,7 +467,7 @@ int main (int argc, char **argv)
--no-journal-available has been specified by user */ --no-journal-available has been specified by user */
/* make sure filesystem is not mounted */ /* make sure filesystem is not mounted */
if (is_mounted (fs->fs_file_name)) { if (misc_device_mounted(fs->fs_file_name) > 0) {
/* fixme: it can not be mounted, btw */ /* fixme: it can not be mounted, btw */
message ("Reiserfstune is not allowed to be run on mounted filesystem."); message ("Reiserfstune is not allowed to be run on mounted filesystem.");
reiserfs_close (fs); reiserfs_close (fs);
@@ -377,40 +483,7 @@ int main (int argc, char **argv)
reiserfs_reopen (fs, O_RDWR); reiserfs_reopen (fs, O_RDWR);
if (badblocks_file) { if (badblocks_file) {
unsigned long i, marked = 0; add_badblocks(fs);
if (reiserfs_open_ondisk_bitmap (fs) < 0) {
message("Failed to open reiserfs ondisk bitmap.\n");
reiserfs_close(fs);
exit(1);
}
if (create_badblock_bitmap (fs, badblocks_file)) {
message("Failed to initialize the bad block bitmap.\n");
reiserfs_close(fs);
exit(1);
}
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 (fs->fs_bitmap2, i)) {
reiserfs_bitmap_set_bit (fs->fs_bitmap2, i);
marked++;
} else {
/* Check that this is a block */
if (not_data_block(fs, i)) {
message("Block %lu belongs to the internal reiserfs area "
"and cannot be reloacted.\n", i);
exit(1);
} else {
message("Block %lu is used already in reiserfs tree.\n", i);
}
}
}
}
message("%lu bad blocks were marked as used.\n", marked);
reiserfs_close(fs); reiserfs_close(fs);
exit(0); exit(0);
@@ -461,14 +534,12 @@ int main (int argc, char **argv)
j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data); j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);
if (get_boundary_transactions(fs, &old, &new)) { if (get_boundary_transactions(fs, &old, &new)) {
if (new.trans_id != get_jh_last_flushed(j_head)) { if (new.trans_id != get_jh_last_flushed(j_head)) {
if (!(Options & OPT_SUPER_FORCE)) {
message ("There are non-replayed transaction in old journal," message ("There are non-replayed transaction in old journal,"
" check filesystem consistency first"); " check filesystem consistency first");
reiserfs_close (fs); reiserfs_close (fs);
return 1; return 1;
} }
} }
}
if (!reiserfs_is_fs_consistent (fs)) { if (!reiserfs_is_fs_consistent (fs)) {
message ("Check filesystem consistency first"); message ("Check filesystem consistency first");
reiserfs_close (fs); reiserfs_close (fs);
@@ -478,12 +549,13 @@ int main (int argc, char **argv)
/* set UUID and LABEL if specified */ /* set UUID and LABEL if specified */
if (fs->fs_format == REISERFS_FORMAT_3_6) { if (fs->fs_format == REISERFS_FORMAT_3_6) {
if (uuid_is_correct (UUID)) { #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
if (!uuid_is_null(UUID)) {
memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16); memcpy (fs->fs_ondisk_sb->s_uuid, UUID, 16);
mark_buffer_dirty (fs->fs_super_bh); mark_buffer_dirty (fs->fs_super_bh);
fs->fs_dirt = 1; fs->fs_dirt = 1;
} }
#endif
if (LABEL != NULL) { if (LABEL != NULL) {
if (strlen (LABEL) > 16) if (strlen (LABEL) > 16)
message ("Specified LABEL is longer then 16 characters, will be truncated\n"); message ("Specified LABEL is longer then 16 characters, will be truncated\n");
@@ -492,8 +564,10 @@ int main (int argc, char **argv)
fs->fs_dirt = 1; fs->fs_dirt = 1;
} }
} else { } else {
if (uuid_is_correct (UUID)) #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
if (!uuid_is_null(UUID))
reiserfs_panic ("UUID cannot be specified for 3.5 format\n"); reiserfs_panic ("UUID cannot be specified for 3.5 format\n");
#endif
if (LABEL) if (LABEL)
reiserfs_panic ("LABEL cannot be specified for 3.5 format\n"); reiserfs_panic ("LABEL cannot be specified for 3.5 format\n");
} }
+4 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2003 by Hans Reiser, licensing governed by * Copyright 2002-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README * reiserfsprogs/README
*/ */
@@ -29,9 +29,9 @@
#include "../include/config.h" #include "../include/config.h"
#include "../version.h" #include "../version.h"
/* main.c */ #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H)
extern reiserfs_filsys_t * fs; # include <uuid/uuid.h>
#endif
/* /*
* options * options
@@ -46,5 +46,3 @@ extern reiserfs_filsys_t * fs;
#define OPT_KEEPO 0x4000 #define OPT_KEEPO 0x4000
#define OPT_FORCE 0x8000 #define OPT_FORCE 0x8000
#define OPT_STANDARD 0x0020 #define OPT_STANDARD 0x0020
extern char *program_name;
+2 -3
View File
@@ -1,7 +1,6 @@
/* /*
* Copyright 2002-2003 Hans Reiser, licensing governed by reiserfsprogs/README * Copyright 2002-2004 Hans Reiser, licensing governed by reiserfsprogs/README
*/ */
#define print_banner(prog) \ #define print_banner(prog) \
fprintf (stderr, "\n<-------------%s, 2003------------->\nreiserfsprogs %s\n\n", \ fprintf(stderr, "%s %s (2003 www.namesys.com)\n\n", prog, VERSION)
prog, VERSION)