Imported reiserfsprogs-3.6.20

This commit is contained in:
Jeff Mahoney committed 2012-10-11 11:32:09 -04:00
1 parent 0ed773997f
commit dac518d099
189 files changed
+43353 -29787

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
noinst_HEADERS = badblock.h bitmap.h buffer.h direntry.h extent.h \
filesystem.h fix_node.h hash.h internal.h \
internal_balance.h journal.h key.h leaf.h \
leaf_balance.h node.h objmap.h policy.h print.h \
stat.h super.h tree.h tree_balance.h libreiserfs.h \
types.h
+343
View File
@@ -0,0 +1,343 @@
# Makefile.in generated by automake 1.9.5 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ../..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = include/reiserfs
DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
HEADERS = $(noinst_HEADERS)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PROGS_LDFLAGS = @PROGS_LDFLAGS@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
UUID_LIBS = @UUID_LIBS@
VERSION = @VERSION@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
noinst_HEADERS = badblock.h bitmap.h buffer.h direntry.h extent.h \
filesystem.h fix_node.h hash.h internal.h \
internal_balance.h journal.h key.h leaf.h \
leaf_balance.h node.h objmap.h policy.h print.h \
stat.h super.h tree.h tree_balance.h libreiserfs.h \
types.h
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/reiserfs/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu include/reiserfs/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
uninstall-info-am:
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(HEADERS)
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am:
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
ctags distclean distclean-generic distclean-tags distdir dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-exec install-exec-am \
install-info install-info-am install-man install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
+29
View File
@@ -0,0 +1,29 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_BADBLOCK_H
#define REISERFS_BADBLOCK_H
#include "reiserfs/types.h"
#define REISERFS_BAD_DID 1
#define REISERFS_BAD_OID (__u32)-1
typedef void (*badblock_func_t) (reiserfs_filsys_t *fs,
reiserfs_path_t *badblock_path,
void *data);
extern void reiserfs_badblock_extract(reiserfs_filsys_t *fs,
reiserfs_path_t *badblock_path,
void *data);
extern void reiserfs_badblock_flush (reiserfs_filsys_t * fs,
int no_badblock_in_tree_yet);
extern void reiserfs_badblock_traverse(reiserfs_filsys_t * fs,
badblock_func_t action,
void *data);
#endif
+89
View File
@@ -0,0 +1,89 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_BITMAP_H
#define REISERFS_BITMAP_H
#include "reiserfs/types.h"
#include <stdio.h>
#define reiserfs_bmap_nr(count, blk_size) \
((count - 1) / (blk_size * 8) + 1)
#define reiserfs_bmap_over(nr) (nr > ((1ll << 16) - 1))
extern reiserfs_bitmap_t *reiserfs_bitmap_create (unsigned int bit_count);
extern int reiserfs_bitmap_open(reiserfs_filsys_t *);
extern void reiserfs_bitmap_delete (reiserfs_bitmap_t * bm);
extern void reiserfs_bitmap_free (reiserfs_filsys_t *);
extern void reiserfs_bitmap_close (reiserfs_filsys_t *);
extern int reiserfs_bitmap_flush (reiserfs_bitmap_t * bm,
reiserfs_filsys_t * fs);
extern int reiserfs_bitmap_expand (reiserfs_bitmap_t * bm,
unsigned int bit_count);
extern void reiserfs_bitmap_shrink (reiserfs_bitmap_t * bm,
unsigned int bit_count);
extern void reiserfs_bitmap_copy (reiserfs_bitmap_t * to,
reiserfs_bitmap_t * from);
extern int reiserfs_bitmap_compare (reiserfs_bitmap_t * bm1,
reiserfs_bitmap_t * bm2);
extern void reiserfs_bitmap_disjunction (reiserfs_bitmap_t * disk,
reiserfs_bitmap_t * cont);
extern void reiserfs_bitmap_delta (reiserfs_bitmap_t * base,
reiserfs_bitmap_t * exclude);
extern void reiserfs_bitmap_set_bit (reiserfs_bitmap_t * bm,
unsigned int bit_number);
extern void reiserfs_bitmap_clear_bit (reiserfs_bitmap_t * bm,
unsigned int bit_number);
extern int reiserfs_bitmap_test_bit (reiserfs_bitmap_t * bm,
unsigned int bit_number);
extern int reiserfs_bitmap_find_zero_bit (reiserfs_bitmap_t * bm,
unsigned long * start);
extern void reiserfs_bitmap_zero (reiserfs_bitmap_t * bm);
extern void reiserfs_bitmap_fill (reiserfs_bitmap_t * bm);
extern void reiserfs_bitmap_invert (reiserfs_bitmap_t * bm);
extern unsigned int reiserfs_bitmap_ones (reiserfs_bitmap_t * bm);
extern unsigned int reiserfs_bitmap_zeros (reiserfs_bitmap_t * bm);
extern int reiserfs_bitmap_spread (reiserfs_filsys_t *);
extern int reiserfs_bitmap_block (reiserfs_filsys_t *,
unsigned long block);
/* Backup copies. */
extern void reiserfs_bitmap_save (FILE * fp,
reiserfs_bitmap_t *bm);
extern reiserfs_bitmap_t * reiserfs_bitmap_load (FILE * fp);
extern void reiserfs_bitmap_print (FILE * fp, reiserfs_filsys_t * fs,
int silent);
extern void reiserfs_print_bmap_block (FILE * fp, int i,
unsigned long block,
char * map, int blocks,
int silent, int blocksize);
#endif
+44
View File
@@ -0,0 +1,44 @@
/*
* Copyright 1996-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_BUFFER_H
#define REISERFS_BUFFER_H
#include "reiserfs/types.h"
#define BH_Uptodate 0
#define BH_Dirty 1
#define BH_Lock 2
#define BH_Do_not_flush 3
#define reiserfs_buffer_uptodate(bh) misc_test_bit(BH_Uptodate, &(bh)->b_state)
#define reiserfs_buffer_mkuptodate(bh,i) misc_set_bit(BH_Uptodate, &(bh)->b_state)
#define reiserfs_buffer_isdirty(bh) misc_test_bit(BH_Dirty, &(bh)->b_state)
#define reiserfs_buffer_isclean(bh) !misc_test_bit(BH_Dirty, &(bh)->b_state)
#define reiserfs_buffer_mkdirty(bh) misc_set_bit(BH_Dirty, &(bh)->b_state)
#define reiserfs_buffer_mkclean(bh) misc_clear_bit(BH_Dirty, &(bh)->b_state)
#define reiserfs_buffer_noflush(bh) misc_test_bit(BH_Do_not_flush, &(bh)->b_state)
#define reiserfs_buffer_mknoflush(bh) misc_set_bit(BH_Do_not_flush, &(bh)->b_state)
#define reiserfs_buffer_clnoflush(bh) misc_clear_bit(BH_Do_not_flush, &(bh)->b_state)
extern reiserfs_bh_t * reiserfs_buffer_open (int, unsigned long, unsigned long);
extern reiserfs_bh_t * reiserfs_buffer_find (int, unsigned long, unsigned long);
extern reiserfs_bh_t * reiserfs_buffer_read (int, unsigned long, unsigned long);
extern int reiserfs_buffer_write (reiserfs_bh_t *);
extern void reiserfs_buffer_close (reiserfs_bh_t *);
extern void reiserfs_buffer_forget (reiserfs_bh_t *);
extern void reiserfs_buffer_flush_all(int);
extern void reiserfs_buffer_free_all (void);
extern void reiserfs_buffer_invalidate_all (int);
#endif
+158
View File
@@ -0,0 +1,158 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_DIRENTRY_H
#define REISERFS_DIRENTRY_H
#include "reiserfs/types.h"
/***************************************************************************/
/* DIRECTORY STRUCTURE */
/***************************************************************************/
/*
Picture represents the structure of directory items
________________________________________________
| Array of | | | | | |
| directory |N-1| N-2 | .... | 1st |0th|
| entry headers | | | | | |
|_______________|___|_____|________|_______|___|
<---- directory entries ------>
First directory item has k_offset component 1. We store "." and ".."
in one item, always, we never split "." and ".." into differing
items. This makes, among other things, the code for removing
directories simpler. */
/* Each directory entry has its header. This header has deh_dir_id and
deh_objectid fields, those are key of object, entry points to */
/* NOT IMPLEMENTED:
Directory will someday contain stat data of object */
struct reiserfs_de_head
{
__u32 deh2_offset; /* third component of the directory entry key */
__u32 deh2_dir_id; /* objectid of the parent directory of the object,
that is referenced by directory entry */
__u32 deh2_objectid;/* objectid of the object, that is referenced by
directory entry */
__u16 deh2_location;/* offset of name in the whole item */
__u16 deh2_state; /* whether 1) entry contains stat data (for future),
and 2) whether entry is hidden (unlinked) */
} __attribute__ ((__packed__));
typedef struct reiserfs_de_head reiserfs_deh_t;
#define REISERFS_DEH_SIZE sizeof(reiserfs_deh_t)
/* set/get fields of dir entry head these defines */
#define reiserfs_deh_get_off(deh) get_le32 (deh, deh2_offset)
#define reiserfs_deh_set_off(deh,val) set_le32 (deh, deh2_offset, val)
#define reiserfs_deh_get_did(deh) get_le32 (deh, deh2_dir_id)
#define reiserfs_deh_set_did(deh,val) set_le32 (deh, deh2_dir_id, val)
#define reiserfs_deh_get_obid(deh) get_le32 (deh, deh2_objectid)
#define reiserfs_deh_set_obid(deh,val) set_le32 (deh, deh2_objectid, val)
#define reiserfs_deh_get_loc(deh) get_le16 (deh, deh2_location)
#define reiserfs_deh_set_loc(deh,val) set_le16 (deh, deh2_location, val)
#define reiserfs_deh_get_state(deh) get_le16 (deh, deh2_state)
#define reiserfs_deh_set_state(deh,val) set_le16 (deh, deh2_state, val)
#define reiserfs_deh_name(deh, pos) \
((char *)(deh - pos) + reiserfs_deh_get_loc(deh))
/* empty directory contains two entries "." and ".." and their headers */
#define REISERFS_DIR_MIN \
(REISERFS_DEH_SIZE * 2 + \
MISC_ROUND_UP (strlen (".")) + \
MISC_ROUND_UP (strlen ("..")))
/* old format directories have this size when empty */
#define REISERFS_DIR_MIN_V1 (REISERFS_DEH_SIZE * 2 + 3)
#define DEH_Statdata 0 /* not used now */
#define DEH_Visible2 2
#define DEH_Bad_offset 4 /* fsck marks entries to be deleted with this flag */
#define DEH_Bad_location 5
#define reiserfs_deh_state_bit(deh,bit) \
(reiserfs_deh_get_state (deh) & (1 << bit))
#define reiserfs_deh_state_set_bit(deh,bit) \
{ \
__u16 state; \
state = reiserfs_deh_get_state (deh); \
state |= (1 << bit); \
reiserfs_deh_set_state(deh, state); \
}
#define reiserfs_deh_state_clear_bit(deh,bit) \
{ \
__u16 state; \
state = reiserfs_deh_get_state (deh); \
state &= ~(1 << bit); \
reiserfs_deh_set_state(deh, state); \
}
/* Bad means "hashed unproperly or/and invalid location" */
#define reiserfs_deh_locbad(deh) \
reiserfs_deh_state_bit (deh, DEH_Bad_location)
#define reiserfs_deh_set_locbad(deh) \
reiserfs_deh_state_set_bit (deh, DEH_Bad_location)
#define reiserfs_deh_set_locok(deh) \
reiserfs_deh_state_clear_bit (deh, DEH_Bad_location)
#define reiserfs_deh_offbad(deh) \
reiserfs_deh_state_bit (deh, DEH_Bad_offset)
#define reiserfs_deh_set_offbad(deh) \
reiserfs_deh_state_set_bit (deh, DEH_Bad_offset)
#define reiserfs_deh_bad(deh) \
(reiserfs_deh_locbad(deh) || reiserfs_deh_offbad(deh))
/* for directories st_blocks is number of 512 byte units which fit into dir
size round up to blocksize */
#define REISERFS_DIR_BLOCKS(size) ((size + 511) / 512)
/* array of the entry headers */
#define reiserfs_deh(bh,ih) ((reiserfs_deh_t *)(reiserfs_item_by_ih(bh,ih)))
#define REISERFS_NAME_MAX 256
/* #define REISERFS_NAME_MAX(block_size) \
(block_size - REISERFS_NODEH_SIZE - \
REISERFS_IH_SIZE - REISERFS_DEH_SIZE)
*/
/* -REISERFS_SD_SIZE when entry will contain stat data */
extern int reiserfs_direntry_loc_check (reiserfs_deh_t * deh,
reiserfs_ih_t * ih,
int first);
extern int reiserfs_direntry_entry_len (reiserfs_ih_t * ih,
reiserfs_deh_t * deh,
int pos_in_item);
extern int reiserfs_direntry_name_len (reiserfs_ih_t * ih,
reiserfs_deh_t * deh,
int pos_in_item);
extern int reiserfs_direntry_entry_estimate (char * name,
int key_format);
extern int reiserfs_direntry_check (reiserfs_filsys_t * fs,
reiserfs_ih_t * ih,
char * item,
int bad_dir);
extern void reiserfs_direntry_print (FILE * fp,
reiserfs_filsys_t * fs,
reiserfs_bh_t * bh,
reiserfs_ih_t * ih);
#endif
+26
View File
@@ -0,0 +1,26 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_EXTENT_H
#define REISERFS_EXTENT_H
#include "reiserfs/types.h"
/* Size of pointer to the unformatted node. */
#define REISERFS_EXT_SIZE (sizeof(__u32))
/* number of blocks pointed to by the extent item */
#define reiserfs_ext_count(p_s_ih) \
(reiserfs_ih_get_len(p_s_ih) / REISERFS_EXT_SIZE)
extern int reiserfs_ext_check (reiserfs_filsys_t * fs,
reiserfs_ih_t * ih, char * item,
unfm_func_t func);
extern void reiserfs_ext_print(FILE * fp,
reiserfs_bh_t * bh,
int item_num);
#endif
+73
View File
@@ -0,0 +1,73 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_FS_H
#define REISERFS_FS_H
#include <reiserfs/types.h>
/* ReiserFS leaves the first 64k unused, so that partition labels have enough
space. If someone wants to write a fancy bootloader that needs more than
64k, let us know, and this will be increased in size. This number must be
larger than than the largest block size on any platform, or code will
break. -Hans */
#define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)
/*#define MD_RAID_SUPERBLOCKS_IN_BYTES (128 * 1024)*/
/* the spot for the super in versions 3.5 - 3.5.11 (inclusive) */
#define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)
#define reiserfs_ondisk_offset(block_of_super_block, block_size) \
(block_of_super_block * block_size)
#define reiserfs_new_location(block_of_super_block, block_size) \
((reiserfs_ondisk_offset(block_of_super_block, block_size) == \
REISERFS_DISK_OFFSET_IN_BYTES) ? 1 : 0)
/*only 4k blocks for old location*/
#define reiserfs_old_location(block_of_super_block, block_size) \
((reiserfs_ondisk_offset(block_of_super_block, 4096) == \
REISERFS_OLD_DISK_OFFSET_IN_BYTES) ? 1 : 0)
enum reiserfs_blktype {
BT_INVAL = 0x1,
BT_SUPER = 0x2,
BT_JOURNAL = 0x3,
BT_BITMAP = 0x4,
BT_UNKNOWN
};
typedef enum reiserfs_blktype reiserfs_blktype_t;
extern reiserfs_filsys_t * reiserfs_fs_open (char * filename,
int flags,
int * error,
void * vp,
int skip_check);
extern reiserfs_filsys_t * reiserfs_fs_create (char * filename,
int version,
unsigned long block_count,
int block_size,
int default_journal,
int new_format);
extern void reiserfs_fs_flush (reiserfs_filsys_t *);
extern void reiserfs_fs_free (reiserfs_filsys_t *);
extern void reiserfs_fs_close (reiserfs_filsys_t *);
extern void reiserfs_fs_reopen (reiserfs_filsys_t *, int flags);
extern int reiserfs_fs_rw (reiserfs_filsys_t * fs);
extern int reiserfs_fs_blksize_check (unsigned int blocksize);
extern reiserfs_blktype_t reiserfs_fs_block(reiserfs_filsys_t *fs,
unsigned long block);
#endif
+76
View File
@@ -0,0 +1,76 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_FIX_NODE_H
#define REISERFS_FIX_NODE_H
#include <reiserfs/types.h>
#include <reiserfs/tree_balance.h>
/* maximum number of FEB blocknrs on a single level */
#define FN_AMOUNT_MAX 2
/* To make any changes in the tree we always first find node, that contains
item to be changed/deleted or place to insert a new item. We call this node
S. To do balancing we need to decide what we will shift to left/right
neighbor, or to a new node, where new item will be etc. To make this
analysis simpler we build virtual node. Virtual node is an array of items,
that will replace items of node S. (For instance if we are going to delete
an item, virtual node does not contain it). Virtual node keeps information
about item sizes and types, mergeability of first and last items, sizes of
all entries in directory item. We use this array of items when calculating
what we can shift to neighbors and how many nodes we have to have if we do
not any shiftings, if we shift to left/right neighbor or to both. */
struct reiserfs_virtual_item
{
/* item type, mergeability */
unsigned short vi_type;
/* length of item that it will have after balancing */
unsigned short vi_item_len;
/* offset of item that it have before balancing */
__u64 vi_item_offset;
/* number of entries in directory item (including the new one if any,
or excluding entry if it must be cut) */
short vi_entry_count;
/* array of entry lengths for directory item */
unsigned short * vi_entry_sizes;
};
struct reiserfs_virtual_node
{
/* this is a pointer to the free space in the buffer */
char * vn_free_ptr;
/* number of items in virtual node */
unsigned short vn_nr_item;
/* size of node , that node would have if it has unlimited size and no
balancing is performed */
short vn_size;
/* mode of balancing (paste, insert, delete, cut) */
short vn_mode;
short vn_affected_item_num;
short vn_pos_in_item;
/* item header of inserted item, 0 for other modes */
reiserfs_ih_t * vn_ins_ih;
/* array of items (including a new one, excluding item to be deleted) */
struct reiserfs_virtual_item * vn_vi;
};
extern int reiserfs_fix_nodes (int n_op_mode,
reiserfs_tb_t * p_s_tb,
reiserfs_ih_t * p_s_ins_ih);
extern void reiserfs_unfix_nodes (reiserfs_tb_t *);
/* FIXME: move these 2 into tree.h when get rid of search_by_key */
extern reiserfs_bh_t * reiserfs_tree_right_neighbor (reiserfs_filsys_t * s,
reiserfs_path_t * path);
extern reiserfs_bh_t * reiserfs_tree_left_neighbor (reiserfs_filsys_t * s,
reiserfs_path_t * path);
extern void reiserfs_fix_node_print(struct reiserfs_virtual_node * vn);
#endif
+52
View File
@@ -0,0 +1,52 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_HASH_H
#define REISERFS_HASH_H
#include "misc/types.h"
#define UNSET_HASH 0 // read_super will guess about, what hash names
// in directories were sorted with
enum {
REISERFS_HASH_TEA = 0x1,
REISERFS_HASH_YURA = 0x2,
REISERFS_HASH_R5 = 0x3,
REISERFS_HASH_LAST
};
#define DEFAULT_HASH REISERFS_HASH_R5
/* hashes.c */
extern __u32 reiserfs_hash_keyed (const char *msg, int len);
extern __u32 reiserfs_hash_yura (const char *msg, int len);
extern __u32 reiserfs_hash_r5 (const char *msg, int len);
extern int reiserfs_hash_count (void);
extern int reiserfs_hash_correct (hashf_t *func,
char * name,
int namelen,
__u32 offset);
extern int reiserfs_hash_find (char * name,
int namelen,
__u32 deh_offset,
unsigned int code_to_try_first);
extern char *reiserfs_hash_name (unsigned int code);
extern int reiserfs_hash_code (hashf_t func);
extern hashf_t reiserfs_hash_func (unsigned int code);
extern hashf_t reiserfs_hash_get (char * hash);
extern __u32 reiserfs_hash_value (hashf_t func, char * name, int namelen);
#endif
+78
View File
@@ -0,0 +1,78 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_INTERNAL_H
#define REISERFS_INTERNAL_H
/*
* Picture represents an internal node of the reiserfs tree
* ______________________________________________________
* | | Array of | Array of | Free |
* |block | keys | pointers | space |
* | head | N | N+1 | |
* |______|_______________|___________________|___________|
*/
/* Disk child pointer: The pointer from an internal node of the tree
to a node that is on disk. */
struct reiserfs_dc {
__u32 dc2_block_number; /* Disk child's block number. */
__u16 dc2_size; /* Disk child's used space. */
__u16 dc2_reserved;
} __attribute__ ((__packed__));
typedef struct reiserfs_dc reiserfs_dc_t;
#define REISERFS_DC_SIZE (sizeof(reiserfs_dc_t))
/* set/get fields of disk_child with these defines */
#define reiserfs_dc_get_nr(dc) get_le32 (dc, dc2_block_number)
#define reiserfs_dc_set_nr(dc,val) set_le32 (dc, dc2_block_number, val)
#define reiserfs_dc_get_size(dc) get_le16 (dc, dc2_size)
#define reiserfs_dc_set_size(dc,val) set_le16 (dc, dc2_size, val)
#define reiserfs_dc_init(dc, size, blocknr) \
({ \
reiserfs_dc_set_nr(dc, blocknr); \
reiserfs_dc_set_size(dc, size); \
set_le16(dc, dc2_reserved, 0); \
})
/* max and min number of keys in internal node */
#define REISERFS_INT_MAX(bh) \
((REISERFS_NODE_SPACE(bh->b_size) - REISERFS_DC_SIZE) / \
(REISERFS_KEY_SIZE+REISERFS_DC_SIZE))
#define REISERFS_INT_MIN(bh) (REISERFS_INT_MAX(bh) / 2)
/* get key */
#define reiserfs_int_key_at(bh,item_num) \
((reiserfs_key_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + \
(item_num) )
/* Get disk child by buffer header and position in the tree node. */
#define reiserfs_int_at(p_s_bh,n_pos) \
((reiserfs_dc_t *) ((p_s_bh)->b_data + REISERFS_NODEH_SIZE + \
reiserfs_node_items(p_s_bh) * REISERFS_KEY_SIZE +\
REISERFS_DC_SIZE * (n_pos)))
#define reiserfs_int_head(bh) \
((reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) > \
LEAF_LEVEL) && \
(reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) <= \
REISERFS_TREE_HEIGHT_MAX))
extern int reiserfs_internal_correct (reiserfs_bh_t *bh);
extern int reiserfs_internal_print (FILE * fp,
reiserfs_bh_t * bh,
int first, int last);
extern int reiserfs_internal_get_pos (reiserfs_bh_t * bh,
unsigned long block);
#endif
+14
View File
@@ -0,0 +1,14 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_IB_H
#define REISERFS_IB_H
extern int reiserfs_ib_balance (reiserfs_tb_t * tb,
int h, int child_pos,
reiserfs_ih_t * insert_key,
reiserfs_bh_t ** insert_ptr);
#endif
+211
View File
@@ -0,0 +1,211 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_JOURNAL_H
#define REISERFS_JOURNAL_H
#define reiserfs_jp_get_start(jp) get_le32(jp, jp_start)
#define reiserfs_jp_set_start(jp,val) set_le32(jp, jp_start, val)
#define reiserfs_jp_get_dev(jp) get_le32 (jp, jp_dev)
#define reiserfs_jp_set_dev(jp,val) set_le32 (jp, jp_dev, val)
#define reiserfs_jp_get_size(jp) get_le32 (jp, jp_size)
#define reiserfs_jp_set_size(jp,val) set_le32 (jp, jp_size, val)
#define reiserfs_jp_get_tlen(jp) get_le32 (jp, jp_tlen)
#define reiserfs_jp_set_tlen(jp,val) set_le32 (jp, jp_tlen, val)
#define reiserfs_jp_get_magic(jp) get_le32 (jp, jp_magic)
#define reiserfs_jp_set_magic(jp,val) set_le32 (jp, jp_magic, val)
#define NEED_TUNE 0xffffffff
#define reiserfs_jp_get_max_batch(jp) get_le32 (jp, jp_max_batch)
#define reiserfs_jp_set_max_batch(jp,val) set_le32 (jp, jp_max_batch, val)
#define reiserfs_jp_get_commit_age(jp) get_le32 (jp, jp_commit_age)
#define reiserfs_jp_set_commit_age(jp,val) set_le32 (jp, jp_commit_age, val)
#define reiserfs_jp_get_trans_age(jp) get_le32 (jp, jp_trans_age)
#define reiserfs_jp_set_trans_age(jp,val) set_le32 (jp, jp_trans_age, val)
/* must be correct to keep the desc and commit structs at 4k */
/* first block written in a commit. BUG, not 64bit safe */
struct reiserfs_journal_desc {
/* id of commit */
__u32 j2_trans_id ;
/* length of commit. len +1 is the commit block */
__u32 j2_len ;
/* mount id of this trans*/
__u32 j2_mount_id ;
/* real locations for each block */
__u32 j2_realblock[1] ;
};
#define reiserfs_jd_magic(bh) (bh->b_data + bh->b_size - 12)
#define reiserfs_jd_head(bh) ((struct reiserfs_journal_desc *)bh->b_data)
#define reiserfs_jd_get_trans(bh) get_le32 (reiserfs_jd_head (bh), j2_trans_id)
#define reiserfs_jd_set_trans(bh,val) set_le32 (reiserfs_jd_head (bh), j2_trans_id, val)
#define reiserfs_jd_get_len(bh) get_le32 (reiserfs_jd_head (bh), j2_len)
#define reiserfs_jd_set_len(bh,val) set_le32 (reiserfs_jd_head (bh), j2_len, val)
#define reiserfs_jd_get_mount(bh) get_le32 (reiserfs_jd_head (bh), j2_mount_id)
#define reiserfs_jd_set_mount(bh,val) set_le32 (reiserfs_jd_head (bh), j2_mount_id, val)
/* last block written in a commit BUG, not 64bit safe */
struct reiserfs_journal_commit {
__u32 j3_trans_id ; /* must match j_trans_id from the desc block */
__u32 j3_len ; /* ditto */
__u32 j3_realblock[1] ; /* real locations for each block */
} ;
#define reiserfs_jc_head(bh) ((struct reiserfs_journal_commit *)bh->b_data)
#define reiserfs_jc_get_trans(bh) get_le32 (reiserfs_jc_head(bh), j3_trans_id)
#define reiserfs_jc_set_trans(bh,val) set_le32 (reiserfs_jc_head(bh), j3_trans_id, val)
#define reiserfs_jc_get_len(bh) get_le32 (reiserfs_jc_head(bh), j3_len)
#define reiserfs_jc_set_len(bh,val) set_le32 (reiserfs_jc_head(bh), j3_len, val)
/* set/get fields of journal header with these defines */
#define reiserfs_jh_get_mount(jh) get_le32 (jh, jh_mount_id)
#define reiserfs_jh_set_mount(jh,val) set_le32 (jh, jh_mount_id, val)
#define reiserfs_jh_get_flushed(jh) get_le32 (jh, jh_last_flush_trans_id)
#define reiserfs_jh_set_flushed(jh,val) set_le32 (jh, jh_last_flush_trans_id, val)
#define reiserfs_jh_get_start(jh) get_le32 (jh, jh_flush_offset)
#define reiserfs_jh_set_start(jh,val) set_le32 (jh, jh_flush_offset, val)
/* Journal Transaction Half */
#define reiserfs_jt_half(blocksize) \
((blocksize - sizeof (struct reiserfs_journal_desc) + \
sizeof (__u32) - 12) / sizeof (__u32))
/* journal default settings */
#define JOURNAL_MIN_SIZE 512
/* biggest possible single transaction, don't change for now (8/3/99) */
#define JOURNAL_TRANS_MAX 1024
/* need to check whether it works */
#define JOURNAL_TRANS_MIN 256
/* default journal size / max trans length */
#define JOURNAL_DEFAULT_RATIO 8
#define JOURNAL_MIN_RATIO 2
/* max blocks to batch into one transaction, don't make this
any bigger than 900 */
#define JOURNAL_MAX_BATCH 900
#define JOURNAL_MAX_COMMIT_AGE 30
#define JOURNAL_MAX_TRANS_AGE 30
/* journal max size is a maximum number of blocks pointed by first bitmap -
REISERFS_DISK_OFFSET - superblock - first bitmap - journal herader */
#define reiserfs_journal_max(sb_nr,blocksize) \
blocksize * 8 - (sb_nr + 1 + 1 + 1)
#define reiserfs_journal_default(sb_nr,blocksize) \
(unsigned long long) \
((8192 > reiserfs_journal_max (sb_nr,blocksize)) ? \
reiserfs_journal_max (sb_nr,blocksize) : 8192)
struct reiserfs_trans {
unsigned long mount_id;
unsigned long trans_id;
unsigned long desc_blocknr;
unsigned long trans_len;
unsigned long commit_blocknr;
unsigned long next_trans_offset;
};
typedef struct reiserfs_trans reiserfs_trans_t;
extern unsigned long reiserfs_journal_hostsize (reiserfs_sb_t *sb);
extern int reiserfs_journal_block (reiserfs_filsys_t *,
unsigned long block);
extern int reiserfs_journal_desc_valid (reiserfs_bh_t *);
extern int reiserfs_journal_get_transactions (reiserfs_filsys_t *,
reiserfs_trans_t *,
reiserfs_trans_t *);
typedef void (*action_on_trans_t) (reiserfs_filsys_t *,
reiserfs_trans_t *);
extern void reiserfs_journal_by_transaction (reiserfs_filsys_t *,
action_on_trans_t);
typedef void (*action_on_block_t) (reiserfs_filsys_t *,
reiserfs_trans_t *,
unsigned int index,
unsigned long in_journal,
unsigned long in_place);
extern void reiserfs_journal_foreach (reiserfs_filsys_t * fs,
reiserfs_trans_t * trans,
action_on_block_t action);
extern int reiserfs_journal_open (reiserfs_filsys_t *,
char *, int flags);
extern int reiserfs_journal_params_check(reiserfs_filsys_t *fs);
extern int reiserfs_journal_create (reiserfs_filsys_t * fs,
char * j_filename,
unsigned long offset,
unsigned long len,
int transaction_max_size);
extern int reiserfs_journal_opened (reiserfs_filsys_t *);
extern void reiserfs_journal_flush (reiserfs_filsys_t * fs);
extern void reiserfs_journal_free (reiserfs_filsys_t * fs);
extern void reiserfs_journal_close (reiserfs_filsys_t *);
extern void reiserfs_journal_reopen (reiserfs_filsys_t * fs, int flag);
extern int reiserfs_journal_replay (reiserfs_filsys_t * fs);
extern __u32 reiserfs_journal_trans_age (void);
extern __u32 reiserfs_journal_commit_age (void);
extern __u32 reiserfs_journal_batch (unsigned long journal_trans_max);
extern __u32 reiserfs_journal_tlen (__u32 desired,
__u32 journal_size,
int blocksize,
int verbose);
extern unsigned int reiserfs_journal_start_must (reiserfs_filsys_t * fs);
extern int reiserfs_journal_fits (unsigned long sb_nr,
unsigned int block_size,
unsigned long block_count,
unsigned long journal_size);
extern void reiserfs_journal_print_params (FILE * fp,
reiserfs_journal_param_t * jp);
extern void reiserfs_journal_print_header (reiserfs_filsys_t * fs);
extern void reiserfs_journal_print (reiserfs_filsys_t *);
extern int reiserfs_print_jdesc (FILE * fp, reiserfs_bh_t * bh);
#endif
+126
View File
@@ -0,0 +1,126 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_KEY_H
#define REISERFS_KEY_H
/* set/get fields of keys on disk with these defines */
#define reiserfs_key_get_did(k) get_le32 (k, k2_dir_id)
#define reiserfs_key_set_did(k,val) set_le32 (k, k2_dir_id, val)
#define reiserfs_key_get_oid(k) get_le32 (k, k2_objectid)
#define reiserfs_key_set_oid(k,val) set_le32 (k, k2_objectid, val)
#define reiserfs_key_get_off1(k) get_le32 (k, u.k2_offset_v1.k_offset)
#define reiserfs_key_set_off1(k,val) set_le32 (k, u.k2_offset_v1.k_offset, val)
#define reiserfs_key_get_uni(k) get_le32 (k, u.k2_offset_v1.k_uniqueness)
#define reiserfs_key_set_uni(k,val) set_le32 (k, u.k2_offset_v1.k_uniqueness, val)
#define REISERFS_KEY_SIZE (sizeof(reiserfs_key_t))
#define REISERFS_KEY_SHSIZE 8
// values for k_uniqueness field of the reiserfs_key_t
#define UNI_SD 0
#define UNI_DE 500
#define UNI_DE 500
#define UNI_DIRECT 0xffffffff
#define UNI_EXT 0xfffffffe
#define UNI_UNKN 555
/* values for k_type field of the reiserfs_key_t */
#define TYPE_STAT_DATA 0x0
#define TYPE_EXTENT 0x1
#define TYPE_DIRECT 0X2
#define TYPE_DIRENTRY 0X3
#define TYPE_LAST 0x4
#define TYPE_UNKNOWN 0xf
#define KEY_FORMAT_1 0
#define KEY_FORMAT_2 1
#define KEY_FORMAT_UNDEFINED 15
/* Our function for comparing keys can compare keys of different lengths.
It takes as a parameter the length of the keys it is to compare. These
defines are used in determining what is to be passed to it as that
parameter. */
#define REISERFS_KEY_LEN 4
#define REISERFS_KEY_SHORT_LEN 2
/* there are 4 types of items: stat data, directory item, extent, direct.
FIXME: This table does not describe new key format
+-------------------+------------+--------------+------------+
| | k_offset | k_uniqueness | mergeable? |
+-------------------+------------+--------------+------------+
| stat data | 0 | 0 | no |
+-------------------+------------+--------------+------------+
| 1st directory item| OFFSET_DOT |DIRENTRY_UNIQU| no |
| non 1st directory | hash value | | yes |
| item | | | |
+-------------------+------------+--------------+------------+
| extent item | offset + 1 |TYPE_EXTENT | if not the first object EXT item
+-------------------+------------+--------------+------------+
| direct item | offset + 1 |TYPE_DIRECT | if not the first object direct item
+-------------------+------------+--------------+------------+
*/
#define reiserfs_key_stat(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_STAT_DATA )
#define reiserfs_key_dir(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_DIRENTRY )
#define reiserfs_key_direct(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_DIRECT )
#define reiserfs_key_ext(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_EXTENT )
#define reiserfs_key_unkn(p_s_key) \
(reiserfs_key_get_type (p_s_key) >= TYPE_LAST)
#define MAX_KEY1_OFFSET 0xffffffff
#define MAX_KEY2_OFFSET 0xfffffffffffffffLL
/* hash value occupies 24 bits starting from 7 up to 30 */
#define OFFSET_HASH(offset) ((offset) & 0x7fffff80)
/* generation number occupies 7 bits starting from 0 up to 6 */
#define OFFSET_GEN(offset) ((offset) & 0x0000007f)
#define OFFSET_SD 0
#define OFFSET_DOT 1
#define OFFSET_DOT_DOT 2
extern const reiserfs_key_t MIN_KEY;
extern const reiserfs_key_t MAX_KEY;
extern const reiserfs_key_t root_dir_key;
extern const reiserfs_key_t parent_root_dir_key;
extern reiserfs_key_t lost_found_dir_key;
extern void reiserfs_key_copy (reiserfs_key_t * to, const reiserfs_key_t * from);
extern void reiserfs_key_copy2 (reiserfs_key_t * to, const reiserfs_key_t * from);
extern int reiserfs_key_comp (const void * k1, const void * k2);
extern int reiserfs_key_comp3 (const void * k1, const void * k2);
extern int reiserfs_key_comp2 (const void * p_s_key1, const void * p_s_key2);
extern int reiserfs_key_format (const reiserfs_key_t * key);
extern unsigned long long reiserfs_key_get_off (const reiserfs_key_t * key);
extern int reiserfs_key_get_type (const reiserfs_key_t * key);
extern char * reiserfs_key_name (const reiserfs_key_t * key);
extern void reiserfs_key_set_type (int format,
reiserfs_key_t * key,
int type);
extern void reiserfs_key_set_off (int format,
reiserfs_key_t * key,
unsigned long long offset);
extern void reiserfs_key_set_sec (int format,
reiserfs_key_t * key,
unsigned long long offset,
int type);
#endif
+197
View File
@@ -0,0 +1,197 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*
* Leaf balancing method declarations.
*
*/
#ifndef REISERFS_LEAF_H
#define REISERFS_LEAF_H
#include <reiserfs/types.h>
#include <misc/bitops.h>
/* size of item header */
#define REISERFS_IH_SIZE (sizeof(reiserfs_ih_t))
/* set/get fields of item head on disk with these defines */
#define reiserfs_ih_get_entries(ih) get_le16 (ih, u.ih2_entry_count)
#define reiserfs_ih_set_entries(ih,val) set_le16 (ih, u.ih2_entry_count, val)
#define reiserfs_ih_get_free(ih) get_le16 (ih, u.ih2_free_space)
#define reiserfs_ih_set_free(ih,val) set_le16 (ih, u.ih2_free_space, 0)
#define reiserfs_ih_get_len(ih) get_le16 (ih, ih2_item_len)
#define reiserfs_ih_set_len(ih,val) set_le16 (ih, ih2_item_len, val)
#define reiserfs_ih_get_loc(ih) get_le16 (ih, ih2_item_location)
#define reiserfs_ih_set_loc(ih,val) set_le16 (ih, ih2_item_location, val)
#define reiserfs_ih_format_v1(ih) (reiserfs_ih_get_format (ih) == KEY_FORMAT_1)
#define IH_Unreachable 0
#define IH_Was_Tail 1
#define IH_Checked 2
#define IH_Writable 3
/* Unreachable bit is set on tree rebuilding and is cleared in semantic pass */
#define reiserfs_ih_clflags(ih) reiserfs_ih_set_flags (ih, 0)
#define reiserfs_ih_isreach(ih) \
(!(reiserfs_ih_get_flags (ih) & (1 << IH_Unreachable)))
#define reiserfs_ih_clunreach(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Unreachable))
#define reiserfs_ih_mkunreach(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Unreachable))
#define reiserfs_ih_wastail(ih) \
(reiserfs_ih_get_flags (ih) & (1 << IH_Was_Tail))
#define reiserfs_ih_mktail(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Was_Tail))
#define reiserfs_ih_cltail(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Was_Tail))
#define reiserfs_ih_ischeck(ih) \
(reiserfs_ih_get_flags (ih) & (1 << IH_Checked))
#define reiserfs_ih_mkcheck(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Checked))
#define reiserfs_ih_clcheck(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Checked))
#define reiserfs_ih_iswrite(ih) \
(reiserfs_ih_get_flags (ih) & (1 << IH_Writable))
#define reiserfs_ih_mkwrite(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Writable))
#define reiserfs_ih_clwrite(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Writable))
#define reiserfs_ih_stat(p_s_ih) reiserfs_key_stat(&((p_s_ih)->ih_key))
#define reiserfs_ih_dir(p_s_ih) reiserfs_key_dir(&((p_s_ih)->ih_key))
#define reiserfs_ih_direct(p_s_ih) reiserfs_key_direct(&((p_s_ih)->ih_key))
#define reiserfs_ih_ext(p_s_ih) reiserfs_key_ext(&((p_s_ih)->ih_key))
/* maximal length of item */
#define REISERFS_ITEM_MAX(block_size) \
(block_size - REISERFS_NODEH_SIZE - REISERFS_IH_SIZE)
#define REISERFS_ITEM_MIN 1
#define REISERFS_DIRECT_MAX(size) \
((size) - REISERFS_NODEH_SIZE - 2 * REISERFS_IH_SIZE - \
REISERFS_SD_SIZE - REISERFS_EXT_SIZE)
/* get the item header */
#define reiserfs_ih_at(bh,item_num) \
((reiserfs_ih_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + (item_num))
/* get the key */
#define reiserfs_ih_key_at(bh,item_num) \
(&(reiserfs_ih_at(bh,item_num)->ih_key))
/* get item body */
#define reiserfs_item_at(bh,item_num) \
( (bh)->b_data + reiserfs_ih_get_loc (reiserfs_ih_at((bh),(item_num))))
/* following defines use reiserfs buffer header and item header */
/* get item body */
#define reiserfs_item_by_ih(bh,ih) ((bh)->b_data + reiserfs_ih_get_loc(ih))
#define reiserfs_leaf_head(bh) \
(reiserfs_nh_get_level ((reiserfs_node_head_t *)((bh)->b_data)) \
== LEAF_LEVEL)
/* check whether byte number 'offset' is in this item */
#define reiserfs_item_has_off(p_s_ih, n_offset, n_blocksize) \
(reiserfs_key_get_off(&(p_s_ih)->ih_key) <= (n_offset) && \
reiserfs_key_get_off(&(p_s_ih)->ih_key) + \
reiserfs_leaf_ibytes(p_s_ih,n_blocksize) > (n_offset) )
#define reiserfs_item_has_key(p_s_ih, p_s_key, n_blocksize) \
(!reiserfs_key_comp2(p_s_ih, p_s_key) && \
reiserfs_item_has_off(p_s_ih, reiserfs_key_get_off (p_s_key), \
n_blocksize))
#define reiserfs_item_off_at(ih, pos, bs) \
(reiserfs_key_get_off (&(ih)->ih_key) + \
(pos) * (reiserfs_ih_direct(ih) ? 1 : (bs)))
#define reiserfs_dir(ih, item) \
((reiserfs_ih_stat(ih) && !not_a_directory(item)) || \
reiserfs_ih_dir(ih))
#define reiserfs_item_count(ih) \
(reiserfs_ih_ext(ih) ? reiserfs_ext_count(ih) : \
reiserfs_ih_direct(ih) ? reiserfs_ih_get_len(ih) : \
reiserfs_ih_dir(ih) ? reiserfs_ih_get_entries(ih) : \
reiserfs_ih_stat(ih) ? 1 : 0)
extern void reiserfs_leaf_mkempty (reiserfs_bh_t *bh);
extern int reiserfs_leaf_mergeable (reiserfs_ih_t *left,
reiserfs_ih_t *right,
int bsize);
extern int reiserfs_leaf_count_items(reiserfs_bh_t *bh);
extern int reiserfs_leaf_free_count(reiserfs_bh_t *bh);
extern int reiserfs_leaf_estimate_items(reiserfs_bh_t * bh);
extern int reiserfs_leaf_valid(reiserfs_bh_t *bh);
typedef void (*ih_func_t) (reiserfs_ih_t * ih);
typedef void (*item_func_t) (reiserfs_bh_t * bh,
reiserfs_ih_t * ih);
extern void reiserfs_leaf_traverse(reiserfs_bh_t * bh,
ih_func_t action,
item_func_t * actions);
extern void reiserfs_leaf_delete_item (reiserfs_filsys_t *,
reiserfs_bh_t * bh,
int item_num);
extern void reiserfs_leaf_delete_entry (reiserfs_filsys_t *,
reiserfs_bh_t * bh,
int item_num,
int entry_num,
int del_count);
extern int reiserfs_leaf_correct_at (reiserfs_filsys_t *,
reiserfs_ih_t *, char *,
unfm_func_t, int);
extern __u32 reiserfs_leaf_ibytes (const reiserfs_ih_t * ih,
int blocksize);
extern int reiserfs_leaf_print(FILE * fp,
reiserfs_filsys_t * fs,
reiserfs_bh_t * bh,
int print_mode,
int first,
int last);
/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
extern __u16 reiserfs_ih_get_format(const reiserfs_ih_t *ih);
extern void reiserfs_ih_set_format(reiserfs_ih_t *ih, __u16 val);
extern __u16 reiserfs_ih_get_flags(const reiserfs_ih_t *ih);
extern void reiserfs_ih_set_flags(reiserfs_ih_t *ih, __u16 val);
enum leaf_print {
LP_LEAF_DETAILS = 0x1,
LP_DIRECT_ITEMS = 0x2,
LP_LAST
};
#endif
+42
View File
@@ -0,0 +1,42 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_LB_H
#define REISERFS_LB_H
extern void reiserfs_lb_delete_item (reiserfs_filsys_t * fs,
reiserfs_bufinfo_t * bi,
int first,
int del_num);
extern void reiserfs_lb_delete_unit (reiserfs_filsys_t * fs,
reiserfs_bufinfo_t * bi,
int cut_item_num,
int pos_in_item,
int cut_size);
extern void reiserfs_lb_delete (reiserfs_filsys_t * fs,
reiserfs_bufinfo_t * cur_bi,
int last_first,
int first,
int del_num,
int del_bytes);
extern int reiserfs_lb_balance (reiserfs_tb_t * tb,
reiserfs_ih_t * ih,
const char * body,
int flag,
int zeros_number,
reiserfs_ih_t * insert_key,
reiserfs_bh_t ** insert_ptr);
extern int reiserfs_lb_copy (reiserfs_filsys_t * fs,
reiserfs_bufinfo_t * dest_bi,
reiserfs_bh_t * src,
int last_first,
int cpy_num,
int cpy_bytes);
#endif
+46
View File
@@ -0,0 +1,46 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_LIBREISER4_H
#define REISERFS_LIBREISER4_H
#ifdef __cplusplus
extern "C" {
#endif
#include <reiserfs/types.h>
#include <reiserfs/bitmap.h>
#include <reiserfs/buffer.h>
#include <reiserfs/filesystem.h>
#include <reiserfs/journal.h>
#include <reiserfs/super.h>
#include <reiserfs/tree.h>
#include <reiserfs/key.h>
#include <reiserfs/node.h>
#include <reiserfs/leaf.h>
#include <reiserfs/direntry.h>
#include <reiserfs/internal.h>
#include <reiserfs/extent.h>
#include <reiserfs/stat.h>
#include <reiserfs/fix_node.h>
#include <reiserfs/tree_balance.h>
#include <reiserfs/internal_balance.h>
#include <reiserfs/leaf_balance.h>
#include <reiserfs/badblock.h>
#include <reiserfs/objmap.h>
#include <reiserfs/policy.h>
#include <reiserfs/print.h>
#include <reiserfs/hash.h>
#ifdef LIBREISERFS_READY
extern const char *libreiserfs_version(void);
extern int libreiserfs_max_interface_version(void);
extern int libreiserfs_min_interface_version(void);
#endif
#ifdef __cplusplus
}
#endif
#endif
+92
View File
@@ -0,0 +1,92 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_NODE_H
#define REISERFS_NODE_H
/*
* Picture represents a leaf of internal tree
* ______________________________________________________
* | | Array of | | |
* |Block | Object-Item | F r e e | Objects- |
* | head | Headers | S p a c e | Items |
* |______|_______________|___________________|___________|
*/
/* Header of a disk block. More precisely, header of a formatted leaf
or internal node, and not the header of an unformatted node. */
struct reiserfs_node_head {
__u16 blk2_level; /* Level of a block in the tree. */
__u16 blk2_nr_item; /* Number of keys/items in a block. */
__u16 blk2_free_space; /* Block free space in bytes. */
__u16 blk_reserved;
__u32 reserved [4];
};
typedef struct reiserfs_node_head reiserfs_node_head_t;
#define REISERFS_NODEH_SIZE (sizeof(reiserfs_node_head_t))
/* set/get fields of block head on disk with these defines */
#define reiserfs_nh_get_level(blkh) get_le16 (blkh, blk2_level)
#define reiserfs_nh_set_level(blkh,val) set_le16 (blkh, blk2_level, val)
#define reiserfs_nh_get_items(blkh) get_le16 (blkh, blk2_nr_item)
#define reiserfs_nh_set_items(blkh,val) set_le16 (blkh, blk2_nr_item, val)
#define reiserfs_nh_get_free(blkh) get_le16 (blkh, blk2_free_space)
#define reiserfs_nh_set_free(blkh,val) set_le16 (blkh, blk2_free_space, val)
/*
* values for blk_type field
*/
#define FREE_LEVEL 0 /* Node of this level is out of the tree. */
#define LEAF_LEVEL 1 /* Leaf node level. */
/* Given the buffer head of a formatted node, resolve to the block head of that node. */
#define NODE_HEAD(p_s_bh) ((reiserfs_node_head_t *)((p_s_bh)->b_data))
#define reiserfs_node_items(bh) reiserfs_nh_get_items (NODE_HEAD(bh))
#define reiserfs_node_level(bh) reiserfs_nh_get_level (NODE_HEAD(bh))
#define reiserfs_node_free(bh) reiserfs_nh_get_free (NODE_HEAD(bh))
/* Does the buffer contain a disk block which is in the tree. */
#define REISERFS_NODE_INTREE(p_s_bh) \
(reiserfs_nh_get_level(NODE_HEAD (p_s_bh)) != FREE_LEVEL)
#define REISERFS_NODE_SPACE(blocksize) ((blocksize) - REISERFS_NODEH_SIZE)
/* amount of used space in buffer (not including block head) */
#define reiserfs_node_used(cur) (REISERFS_NODE_SPACE(cur->b_size) - \
(reiserfs_node_free(cur)))
enum node_type {
NT_LEAF = 0x1,
NT_INTERNAL = 0x2,
NT_SUPER = 0x3,
NT_JDESC = 0x4,
NT_IH_ARRAY = 0x5,
NT_UNKNOWN
};
typedef enum node_type node_type_t;
extern void reiserfs_node_replace_key (reiserfs_bh_t * dest, int n_dest,
reiserfs_bh_t * src, int n_src);
extern void reiserfs_node_forget(reiserfs_filsys_t *fs,
unsigned long blk);
extern int reiserfs_node_formatted (reiserfs_bh_t * bh, int level);
extern int reiserfs_node_type (reiserfs_bh_t *bh);
extern char *reiserfs_node_type_name(int code);
extern void reiserfs_node_print (FILE * fp,
reiserfs_filsys_t *,
reiserfs_bh_t * bh, ...);
#endif
+19
View File
@@ -0,0 +1,19 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_OBJMAP_H
#define REISERFS_OBJMAP_H
/* object identifier for root dir */
#define REISERFS_ROOT_OBJECTID 2
#define REISERFS_ROOT_PARENT_OBJECTID 1
extern int reiserfs_objmap_test (reiserfs_filsys_t * fs, __u32 objectid);
extern void reiserfs_objmap_set (reiserfs_filsys_t * fs, __u32 objectid);
extern void reiserfs_objmap_print (FILE * fp, reiserfs_filsys_t * fs);
#endif
+25
View File
@@ -0,0 +1,25 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_POLICY_H
#define REISERFS_POLICY_H
/* this is aggressive tail suppression policy taken from the kernel */
/* It should be REISERFS_DIRECT_MAX used here, but sometimes it is not enough,
* and items got deleted. */
#define reiserfs_policy_ext(n_file_size,n_tail_size,n_block_size) \
( \
(!(n_tail_size)) || \
(((n_tail_size) > REISERFS_ITEM_MAX(n_block_size)) || \
( (n_file_size) >= (n_block_size) * 4 ) || \
( ( (n_file_size) >= (n_block_size) * 3 ) && \
( (n_tail_size) >= (REISERFS_ITEM_MAX(n_block_size))/4) ) || \
( ( (n_file_size) >= (n_block_size) * 2 ) && \
( (n_tail_size) >= (REISERFS_ITEM_MAX(n_block_size))/2) ) || \
( ( (n_file_size) >= (n_block_size) ) && \
( (n_tail_size) >= (REISERFS_ITEM_MAX(n_block_size) * 3)/4) ) ) \
)
#endif
+29
View File
@@ -0,0 +1,29 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_PRINT_H
#define REISERFS_PRINT_H
#include <stdlib.h>
extern void reiserfs_warning (FILE * fp, const char * fmt, ...);
#define reiserfs_panic(fmt, list...) \
{\
fflush (stdout);\
fprintf (stderr, "%s %d %s\n", __FILE__, __LINE__, __FUNCTION__);\
reiserfs_warning (stderr, (const char *)fmt, ## list);\
reiserfs_warning (stderr, "\n" );\
abort ();\
}
#define reiserfs_exit(val, fmt, list...) \
{\
fflush (stdout);\
reiserfs_warning (stderr, (const char *)fmt, ## list);\
reiserfs_warning (stderr, "\n" );\
exit (val);\
}
#endif
+192
View File
@@ -0,0 +1,192 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_STAT_H
#define REISERFS_STAT_H
/* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */
/* The sense of adding union to stat data is to keep a value of real number of
blocks used by file. The necessity of adding such information is caused by
existing of files with holes. Reiserfs should keep number of used blocks
for file, but not calculate it from file size (that is not correct for
holed files). Thus we have to add additional information to stat data.
When we have a device special file, there is no need to get number of used
blocks for them, and, accordingly, we doesn't need to keep major and minor
numbers for regular files, which might have holes. So this field is being
overloaded. */
struct reiserfs_sd_v1 {
__u16 sd_mode; /* file type, permissions */
__u16 sd_nlink; /* number of hard links */
__u16 sd_uid; /* owner */
__u16 sd_gid; /* group */
__u32 sd_size; /* file size */
__u32 sd_atime; /* time of last access */
__u32 sd_mtime; /* time file was last modified */
__u32 sd_ctime; /* time inode (stat data) was last changed (except
changes to sd_atime and sd_mtime) */
union {
__u32 sd_rdev;
__u32 sd_blocks; /* number of blocks file uses */
} __attribute__ ((__packed__)) u;
__u32 sd_fdb; /* first byte of file which is stored
in a direct item: except that if it
equals 1 it is a symlink and if it
equals MAX_KEY_OFFSET there is no
direct item. The existence of this
field really grates on me. Let's
replace it with a macro based on
sd_size and our tail suppression
policy. Someday. -Hans */
} __attribute__ ((__packed__));
typedef struct reiserfs_sd_v1 reiserfs_sd_v1_t;
#define REISERFS_SD_SIZE_V1 (sizeof(reiserfs_sd_v1_t))
/* this is used to check sd_size of stat data v1 */
#define REISERFS_SD_SIZE_MAX_V1 0x7fffffff
// sd_fdb is set to this when there are no direct items in a file
#define REISERFS_SD_NODIRECT 0xffffffff
/* Stat Data on disk (reiserfs version of UFS disk inode minus the
address blocks) */
struct reiserfs_sd {
__u16 sd_mode; /* file type, permissions */
__u16 sd_attrs;
__u32 sd_nlink; /* 32 bit nlink! */
__u64 sd_size; /* 64 bit size!*/
__u32 sd_uid; /* 32 bit uid! */
__u32 sd_gid; /* 32 bit gid! */
__u32 sd_atime; /* time of last access */
__u32 sd_mtime; /* time file was last modified */
__u32 sd_ctime; /* time inode (stat data) was last changed (except
changes to sd_atime and sd_mtime) */
__u32 sd_blocks;
union {
__u32 sd_rdev;
__u32 sd_generation;
//__u32 sd_fdb;
/* first byte of file which is stored in a direct item: except that if
it equals 1 it is a symlink and if it equals ~(__u32)0 there is no
direct item. The existence of this field really grates on me. Let's
replace it with a macro based on sd_size and our tail suppression
policy? */
} __attribute__ ((__packed__)) u;
} __attribute__ ((__packed__));
//
// this is 44 bytes long
//
typedef struct reiserfs_sd reiserfs_sd_t;
#define REISERFS_SD_SIZE (sizeof(reiserfs_sd_t))
/* this is used to check sd_size of stat data v2: max offset which can
be reached with a key of format 2 is 60 bits */
#define REISERFS_SD_SIZE_MAX_V2 0xfffffffffffffffLL
/* reiserfs_sd_v1_t* access macros */
#define reiserfs_sd_v1_mode(sd) (le16_to_cpu((sd)->sd_mode))
#define reiserfs_set_sd_v1_mode(sd,n) ((sd)->sd_mode = cpu_to_le16((n)))
#define reiserfs_sd_v1_nlink(sd) (le16_to_cpu((sd)->sd_nlink))
#define reiserfs_set_sd_v1_nlink(sd,n) ((sd)->sd_nlink = cpu_to_le16((n)))
#define reiserfs_sd_v1_uid(sd) (le16_to_cpu((sd)->sd_uid))
#define reiserfs_set_sd_v1_uid(sd,n) ((sd)->sd_uid = cpu_to_le16((n)))
#define reiserfs_sd_v1_gid(sd) (le16_to_cpu((sd)->sd_gid))
#define reiserfs_set_sd_v1_gid(sd,n) ((sd)->sd_gid = cpu_to_le16((n)))
#define reiserfs_sd_v1_size(sd) (le32_to_cpu((sd)->sd_size))
#define reiserfs_set_sd_v1_size(sd,n) ((sd)->sd_size = cpu_to_le32((n)))
#define reiserfs_sd_v1_atime(sd) (le32_to_cpu((sd)->sd_atime))
#define reiserfs_set_sd_v1_atime(sd,n) ((sd)->sd_atime = cpu_to_le32((n)))
#define reiserfs_sd_v1_mtime(sd) (le32_to_cpu((sd)->sd_mtime))
#define reiserfs_set_sd_v1_mtime(sd,n) ((sd)->sd_mtime = cpu_to_le32((n)))
#define reiserfs_sd_v1_ctime(sd) (le32_to_cpu((sd)->sd_ctime))
#define reiserfs_set_sd_v1_ctime(sd,n) ((sd)->sd_ctime = cpu_to_le32((n)))
#define reiserfs_sd_v1_blocks(sd) (le32_to_cpu((sd)->u.sd_blocks))
#define reiserfs_set_sd_v1_blocks(sd,n) ((sd)->u.sd_blocks = cpu_to_le32((n)))
#define reiserfs_sd_v1_rdev(sd) (le32_to_cpu((sd)->u.sd_rdev))
#define reiserfs_set_sd_v1_rdev(sd,n) ((sd)->u.sd_rdev = cpu_to_le32((n)))
#define reiserfs_sd_v1_fdb(sd) (le32_to_cpu((sd)->sd_fdb))
#define reiserfs_set_sd_v1_fdb(sd,n) ((sd)->sd_fdb = cpu_to_le32((n)))
/* reiserfs_sd_t */
#define reiserfs_sd_v2_mode(sd) (le16_to_cpu((sd)->sd_mode))
#define reiserfs_set_sd_v2_mode(sd,n) ((sd)->sd_mode = cpu_to_le16((n)))
#define reiserfs_sd_v2_attrs(sd) (le16_to_cpu((sd)->sd_attrs))
#define reiserfs_set_sd_v2_attrs(sd,n) ((sd)->sd_attrs = cpu_to_le16((n)))
#define reiserfs_sd_v2_nlink(sd) (le32_to_cpu((sd)->sd_nlink))
#define reiserfs_set_sd_v2_nlink(sd,n) ((sd)->sd_nlink = cpu_to_le32((n)))
#define reiserfs_sd_v2_size(sd) (le64_to_cpu((sd)->sd_size))
#define reiserfs_set_sd_v2_size(sd,n) ((sd)->sd_size = cpu_to_le64((n)))
#define reiserfs_sd_v2_uid(sd) (le32_to_cpu((sd)->sd_uid))
#define reiserfs_set_sd_v2_uid(sd,n) ((sd)->sd_uid = cpu_to_le32((n)))
#define reiserfs_sd_v2_gid(sd) (le32_to_cpu((sd)->sd_gid))
#define reiserfs_set_sd_v2_gid(sd,n) ((sd)->sd_gid = cpu_to_le32((n)))
#define reiserfs_sd_v2_atime(sd) (le32_to_cpu((sd)->sd_atime))
#define reiserfs_set_sd_v2_atime(sd,n) ((sd)->sd_atime = cpu_to_le32((n)))
#define reiserfs_sd_v2_mtime(sd) (le32_to_cpu((sd)->sd_mtime))
#define reiserfs_set_sd_v2_mtime(sd,n) ((sd)->sd_mtime = cpu_to_le32((n)))
#define reiserfs_sd_v2_ctime(sd) (le32_to_cpu((sd)->sd_ctime))
#define reiserfs_set_sd_v2_ctime(sd,n) ((sd)->sd_ctime = cpu_to_le32((n)))
#define reiserfs_sd_v2_blocks(sd) (le32_to_cpu((sd)->sd_blocks))
#define reiserfs_set_sd_v2_blocks(sd,n) ((sd)->sd_blocks = cpu_to_le32((n)))
#define reiserfs_sd_v2_rdev(sd) (le32_to_cpu((sd)->u.sd_rdev))
#define reiserfs_set_sd_v2_rdev(sd,n) ((sd)->u.sd_rdev = cpu_to_le32((n)))
extern void reiserfs_stat_init (int blocksize, int key_format,
__u32 dirid, __u32 objectid,
reiserfs_ih_t * ih, void * sd);
extern void reiserfs_stat_set (int field, reiserfs_ih_t * ih,
void * sd, void * value);
extern void reiserfs_stat_get (int field, reiserfs_ih_t * ih,
void * sd, void * value);
/* access to stat data fields */
#define STAT_MODE 0
#define STAT_SIZE 1
#define STAT_NLINK 2
#define STAT_BLOCKS 3
#define STAT_FDB 4
#define reiserfs_stat_get_mode(ih, sd, pmode) \
reiserfs_stat_get(STAT_MODE, ih, sd, pmode)
#define reiserfs_stat_set_mode(ih, sd, pmode) \
reiserfs_stat_set(STAT_MODE, ih, sd, pmode)
#define reiserfs_stat_get_size(ih, sd, psize) \
reiserfs_stat_get(STAT_SIZE, ih, sd, psize)
#define reiserfs_stat_set_size(ih, sd, psize) \
reiserfs_stat_set(STAT_SIZE, ih, sd, psize)
#define reiserfs_stat_get_blocks(ih, sd, pblocks) \
reiserfs_stat_get(STAT_BLOCKS, ih, sd, pblocks)
#define reiserfs_stat_set_blocks(ih, sd, pblocks) \
reiserfs_stat_set(STAT_BLOCKS, ih, sd, pblocks)
#define reiserfs_stat_get_nlink(ih, sd, pnlink) \
reiserfs_stat_get(STAT_NLINK, ih, sd, pnlink)
#define reiserfs_stat_set_nlink(ih, sd, pnlink) \
reiserfs_stat_set(STAT_NLINK, ih, sd, pnlink)
#define reiserfs_stat_get_fdb(ih, sd, pfdb) \
reiserfs_stat_get(STAT_FDB, ih, sd, pfdb)
#define reiserfs_stat_set_fdb(ih, sd, pfdb) \
reiserfs_stat_set(STAT_FDB, ih, sd, pfdb)
extern int reiserfs_print_stat_data (FILE * fp,
reiserfs_bh_t * bh,
reiserfs_ih_t * ih,
int alltimes);
#endif
+156
View File
@@ -0,0 +1,156 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_SUPER_H
#define REISERFS_SUPER_H
#define REISERFS_SB_SIZE_V1 (sizeof(reiserfs_sb_v1_t)) /* 76 bytes */
#define reiserfs_sb_jp(sb) (&((sb)->s_v1.sb_journal))
/* values for sb_version field of struct reiserfs_super_block. sb_version is
only reliable on filesystem with non-standard journal */
#define REISERFS_FORMAT_3_5 0
#define REISERFS_FORMAT_3_6 2
#define REISERFS_FORMAT_UNKNOWN -1
/* values for sb_mount_state field */
#define FS_CLEANLY_UMOUNTED 1 /* this was REISERFS_VALID_FS */
#define FS_NOT_CLEANLY_UMOUNTED 2 /* this was REISERFS_ERROR. It
means that filesystem was not
cleanly unmounted */
typedef enum {
reiserfs_attrs_cleared = 0x00000001,
} reiserfs_super_block_flags;
#define REISERFS_SB_SIZE (sizeof(reiserfs_sb_t)) /* 204 bytes */
/* set/get fields of super block with these defines */
#define reiserfs_sb_get_blocks(sb) get_le32 (sb, s_v1.sb_block_count)
#define reiserfs_sb_set_blocks(sb,val) set_le32 (sb, s_v1.sb_block_count, val)
#define reiserfs_sb_get_free(sb) get_le32 (sb, s_v1.sb_free_blocks)
#define reiserfs_sb_set_free(sb,val) set_le32 (sb, s_v1.sb_free_blocks, val)
#define reiserfs_sb_get_root(sb) get_le32 (sb,s_v1.sb_root_block)
#define reiserfs_sb_set_root(sb,val) set_le32 (sb, s_v1.sb_root_block, val)
#if 0
#define get_sb_mount_id(sb) get_le32 (sb,s_v1.sb_mountid)
#define set_sb_mount_id(sb,val) set_le32 (sb, s_v1.sb_mountid, val)
#define get_sb_journal_magic(sb) get_le32 (sb, s_v1.sb_journal_magic)
#define set_sb_journal_magic(sb,val) set_le32 (sb, s_v1.sb_journal_magic, val)
#endif
#define reiserfs_sb_get_blksize(sb) get_le16 (sb, s_v1.sb_blocksize)
#define reiserfs_sb_set_blksize(sb,val) set_le16 (sb, s_v1.sb_blocksize, val)
#define reiserfs_sb_get_mapmax(sb) get_le16 (sb, s_v1.sb_oid_maxsize)
#define reiserfs_sb_set_mapmax(sb,val) set_le16 (sb, s_v1.sb_oid_maxsize, val)
#define reiserfs_sb_get_mapcur(sb) get_le16 (sb, s_v1.sb_oid_cursize)
#define reiserfs_sb_set_mapcur(sb,val) set_le16 (sb, s_v1.sb_oid_cursize, val)
#define reiserfs_sb_get_umount(sb) get_le16 (sb, s_v1.sb_umount_state)
#define reiserfs_sb_set_umount(sb,val) set_le16 (sb, s_v1.sb_umount_state, val)
#define reiserfs_sb_get_state(sb) get_le16 (sb, s_v1.sb_fs_state)
#define reiserfs_sb_set_state(sb,flag) set_le16 (sb, s_v1.sb_fs_state, flag)
#define reiserfs_sb_get_hash(sb) get_le32 (sb, s_v1.sb_hash_function_code)
#define reiserfs_sb_set_hash(sb,val) set_le32 (sb, s_v1.sb_hash_function_code, val)
#define reiserfs_sb_get_height(sb) get_le16 (sb, s_v1.sb_tree_height)
#define reiserfs_sb_set_height(sb,val) set_le16 (sb, s_v1.sb_tree_height, val)
#define reiserfs_sb_get_bmaps(sb) get_le16 (sb, s_v1.sb_bmap_nr)
#define reiserfs_sb_set_bmaps(sb,val) set_le16 (sb, s_v1.sb_bmap_nr, val)
#define reiserfs_sb_get_version(sb) get_le16 (sb, s_v1.sb_version)
#define reiserfs_sb_set_version(sb,val) set_le16 (sb, s_v1.sb_version, val)
#define reiserfs_sb_get_reserved(sb) \
get_le16 (sb, s_v1.sb_reserved_for_journal)
#define reiserfs_sb_set_reserved(sb,val) \
set_le16 (sb, s_v1.sb_reserved_for_journal, val)
#define reiserfs_sb_get_gen(sb) get_le32 (sb, sb_inode_generation)
#define reiserfs_sb_set_gen(sb,val) set_le32 (sb, sb_inode_generation, val)
#define reiserfs_sb_get_flags(sb) get_le32 (sb, s_flags)
#define reiserfs_sb_set_flags(sb, val) set_le32 (sb, s_flags, val)
#define reiserfs_sb_isflag(sb, flag) \
(get_le32 (sb, s_flags) & flag)
#define reiserfs_sb_mkflag(sb, flag) \
set_le32 (sb, s_flags, get_le32 (sb, s_flags) | flag)
#define reiserfs_sb_clflag(sb, flag) \
set_le32 (sb, s_flags, get_le32 (sb, s_flags) & ~(flag))
/* 0 does not guarantee that fs is consistent */
#define reiserfs_sb_state_ok(fs) \
((reiserfs_sb_get_umount (fs->fs_ondisk_sb) == FS_CLEANLY_UMOUNTED) && \
(reiserfs_sb_get_state (fs->fs_ondisk_sb) == FS_CONSISTENT))
/* prejournalled reiserfs had signature in the other place in super block */
#define REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ 20
/* f_type of struct statfs will be set at this value by statfs(2) */
#define REISERFS_SUPER_MAGIC 0x52654973
/* various reiserfs signatures. We have 3 so far. ReIsErFs for 3.5 format with
standard journal, ReIsEr2Fs for 3.6 (or converted 3.5) and ReIsEr3Fs for
filesystem with non-standard journal (formats are distinguished by
sb_version in that case). Those signatures should be looked for at the
64-th and at the 8-th 1k block of the device */
#define REISERFS_3_5_SUPER_MAGIC_STRING "ReIsErFs"
#define REISERFS_3_6_SUPER_MAGIC_STRING "ReIsEr2Fs"
#define REISERFS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" /* JR stands for Journal
Relocation */
/* these are possible values for sb_fs_state */
enum reiserfs_state_flags {
/* this is set by mkreiserfs and by reiserfsck */
FS_CONSISTENT = 0x0,
/* this is set by the kernel when fsck is wanted. */
FS_ERROR = 0x1,
/* this is set by fsck when fatal corruption is found */
FS_FATAL = 0x2,
/* this is set by kernel when io error occures */
/* IO_ERROR = 0x4, */
FS_STATE_LAST = 0x5
};
extern int reiserfs_super_35_magic (reiserfs_sb_t * rs);
extern int reiserfs_super_36_magic (reiserfs_sb_t * rs);
extern int reiserfs_super_jr_magic (reiserfs_sb_t * rs);
extern int reiserfs_super_magic (reiserfs_sb_t * rs);
extern int reiserfs_super_format (reiserfs_sb_t * sb);
extern int reiserfs_super_size (reiserfs_sb_t * rs);
extern int reiserfs_super_prejournaled (reiserfs_sb_t * rs);
extern void reiserfs_super_print_state (FILE * fp,
reiserfs_filsys_t * fs);
extern int reiserfs_super_print (FILE * fp,
reiserfs_filsys_t *,
char * file_name,
reiserfs_bh_t * bh,
int short_print);
extern int reiserfs_super_valid(reiserfs_bh_t *bh);
#endif
+160
View File
@@ -0,0 +1,160 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_TREE_H
#define REISERFS_TREE_H
#include <reiserfs/types.h>
/* Search_by_key fills up the path from the root to the leaf as it
descends the tree looking for the key. It uses reiserfs_buffer_read to
try to find buffers in the cache given their block number. If it
does not find them in the cache it reads them from disk. For each
node reiserfs_tree_search_item finds using reiserfs_buffer_read it then uses
bin_search to look through that node. bin_search will find the
position of the block_number of the next node if it is looking
through an internal node. If it is looking through a leaf node
bin_search will find the position of the item which has key either
equal to given key, or which is the maximal key less than the given
key. */
#define REISERFS_PATH_INIT(var) \
reiserfs_path_t var = {REISERFS_PATH_OFFILL, }
/* Get path element by path and path position. */
#define REISERFS_PATH_ELEM(p_s_path,nr_elem) \
((p_s_path)->path_elements + (nr_elem))
/* Get buffer header at the path by path and path position. */
#define REISERFS_PATH_BUFFER(p_s_path,nr_elem) \
(REISERFS_PATH_ELEM(p_s_path, nr_elem)->pe_buffer)
/* Get position in the element at the path by path and path position. */
#define REISERFS_PATH_POS(p_s_path,nr_elem) \
(REISERFS_PATH_ELEM(p_s_path, nr_elem)->pe_position)
#define REISERFS_PATH_LEAF(p_s_path) \
(REISERFS_PATH_BUFFER((p_s_path), (p_s_path)->path_length))
#define REISERFS_PATH_LEAF_POS(p_s_path) \
(REISERFS_PATH_POS((p_s_path), (p_s_path)->path_length))
#define REISERFS_PATH_IH(p_s_path) \
reiserfs_ih_at(REISERFS_PATH_LEAF(p_s_path), \
REISERFS_PATH_LEAF_POS(p_s_path))
/* in reiserfs_tb_balance leaf has h == 0 in contrast with path structure,
where root has level == 0. That is why we need these defines */
#define REISERFS_PATH_UPBUFFER(p_s_path, h) \
(REISERFS_PATH_BUFFER (p_s_path, p_s_path->path_length - (h)))
/* tb->F[h] or tb->S[0]->b_parent */
#define REISERFS_PATH_UPPARENT(path, h) \
REISERFS_PATH_UPBUFFER (path, (h) + 1)
#define REISERFS_PATH_UPPOS(path, h) \
REISERFS_PATH_POS (path, path->path_length - (h))
/* tb->S[h]->b_item_order */
#define REISERFS_PATH_UPPARENT_POS(path, h) \
REISERFS_PATH_UPPOS(path, h + 1)
#define REISERFS_PATH_LEVEL(p_s_path, n_h) \
((p_s_path)->path_length - (n_h))
#define REISERFS_PATH_ITEM(path) \
((void *) reiserfs_item_at(REISERFS_PATH_LEAF(path), \
REISERFS_PATH_LEAF_POS (path)))
extern int reiserfs_tree_search_entry (reiserfs_filsys_t *fs,
const reiserfs_key_t * key,
reiserfs_path_t * path);
extern int reiserfs_tree_search_position (reiserfs_filsys_t *fs,
const reiserfs_key_t * key,
reiserfs_path_t * path);
extern const reiserfs_key_t * reiserfs_tree_lkey (reiserfs_path_t * path,
reiserfs_filsys_t *fs);
extern const reiserfs_key_t * reiserfs_tree_rkey (reiserfs_path_t * path,
reiserfs_filsys_t *fs);
extern const reiserfs_key_t *reiserfs_tree_next_key (reiserfs_path_t * path,
reiserfs_filsys_t *fs);
extern int reiserfs_tree_delete_entry (reiserfs_filsys_t *,
reiserfs_key_t *);
extern void reiserfs_tree_delete (reiserfs_filsys_t *,
reiserfs_path_t *, int);
extern void reiserfs_tree_delete_unit (reiserfs_filsys_t *,
reiserfs_path_t *, int);
extern void reiserfs_tree_insert_unit (reiserfs_filsys_t *,
reiserfs_path_t * path,
const void * body,
int size);
extern void reiserfs_tree_insert (reiserfs_filsys_t *,
reiserfs_path_t * ,
reiserfs_ih_t *,
const void *);
extern int reiserfs_tree_search_name (reiserfs_filsys_t *,
const reiserfs_key_t * dir,
char * name,
unsigned int * min_gen_counter,
reiserfs_key_t * key);
extern int reiserfs_tree_search_body (reiserfs_filsys_t * fs,
const reiserfs_key_t * key,
reiserfs_path_t * path);
extern int reiserfs_tree_search_item (reiserfs_filsys_t * fs,
const reiserfs_key_t * key,
reiserfs_path_t * path);
extern int reiserfs_tree_scan_name (reiserfs_filsys_t *,
reiserfs_key_t * dir,
char * name,
reiserfs_path_t * path);
extern int reiserfs_tree_insert_entry (reiserfs_filsys_t *,
const reiserfs_key_t * dir,
char * name,
int name_len,
const reiserfs_key_t * key,
__u16 fsck_need);
typedef void (*item_modify_t) (reiserfs_ih_t *, void *item);
extern __u16 reiserfs_tree_root (reiserfs_filsys_t * fs,
item_modify_t modify,
__u16 ih_flags);
extern int reiserfs_tree_create_stat (reiserfs_filsys_t * fs,
reiserfs_path_t * path,
const reiserfs_key_t * key,
item_modify_t modify);
extern void reiserfs_tree_pathrelse (reiserfs_path_t * p_s_search_path);
extern int reiserfs_tree_left_mergeable (reiserfs_filsys_t * s,
reiserfs_path_t * path);
extern int reiserfs_tree_right_mergeable (reiserfs_filsys_t * s,
reiserfs_path_t * path);
extern int reiserfs_tree_node_mergeable (reiserfs_bh_t *left,
reiserfs_bh_t *right);
extern int reiserfs_tree_merge(reiserfs_filsys_t *fs,
reiserfs_path_t *dst_path,
reiserfs_path_t *src_path);
#endif
+202
View File
@@ -0,0 +1,202 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_TB_H
#define REISERFS_TB_H
/* This temporary structure is used in tree balance algorithms, and
constructed as we go to the extent that its various parts are needed. It
contains arrays of nodes that can potentially be involved in the balancing
of node S, and parameters that define how each of the nodes must be
balanced. Note that in these algorithms for balancing the worst case is to
need to balance the current node S and the left and right neighbors and all
of their parents plus create a new node. We implement S1 balancing for the
leaf nodes and S0 balancing for the internal nodes (S1 and S0 are defined
in our papers.)*/
/* size of the array of buffers to free at end of reiserfs_tb_balance */
#define TB_2FREE_MAX 7
#define TB_FEB_MAX (REISERFS_TREE_HEIGHT_MAX + 1)
/* someday somebody will prefix every field in this struct with tb_ */
struct reiserfs_tb {
reiserfs_filsys_t * tb_fs;
reiserfs_path_t * tb_path;
/* array of left neighbors of nodes in the path */
reiserfs_bh_t * L[REISERFS_TREE_HEIGHT_MAX];
/* array of right neighbors of nodes in the path*/
reiserfs_bh_t * R[REISERFS_TREE_HEIGHT_MAX];
/* array of fathers of the left neighbors */
reiserfs_bh_t * FL[REISERFS_TREE_HEIGHT_MAX];
/* array of fathers of the right neighbors */
reiserfs_bh_t * FR[REISERFS_TREE_HEIGHT_MAX];
/* array of common parents of center node and its left neighbor */
reiserfs_bh_t * CFL[REISERFS_TREE_HEIGHT_MAX];
/* array of common parents of center node and its right neighbor */
reiserfs_bh_t * CFR[REISERFS_TREE_HEIGHT_MAX];
/* array of blocknr's that are free and are the nearest to the left
node that are usable for writing dirty formatted leaves, using
the write_next_to algorithm. */
/*unsigned long free_and_near[MAX_DIRTIABLE];*/
/* array of empty buffers. Number of buffers in array equals cur_blknum. */
reiserfs_bh_t * FEB[TB_FEB_MAX];
reiserfs_bh_t * used[TB_FEB_MAX];
/* array of number of items which must be shifted to the left in order to
balance the current node; for leaves includes item that will be partially
shifted; for internal nodes, it is the number of child pointers rather
than items. It includes the new item being created. For preserve_shifted
purposes the code sometimes subtracts one from this number to get the
number of currently existing items being shifted, and even more often
for leaves it subtracts one to get the number of wholly shifted items
for other purposes. */
short int lnum[REISERFS_TREE_HEIGHT_MAX];
/* substitute right for left in comment above */
short int rnum[REISERFS_TREE_HEIGHT_MAX];
/* array indexed by height h mapping the key delimiting L[h] and
S[h] to its item number within the node CFL[h] */
short int lkey[REISERFS_TREE_HEIGHT_MAX];
/* substitute r for l in comment above */
short int rkey[REISERFS_TREE_HEIGHT_MAX];
/* the number of bytes by we are trying to add or remove from S[h].
A negative value means removing. */
short int insert_size[REISERFS_TREE_HEIGHT_MAX];
/* number of nodes that will replace node S[h] after balancing on the level
h of the tree. If 0 then S is being deleted, if 1 then S is remaining
and no new nodes are being created, if 2 or 3 then 1 or 2 new nodes is
being created */
short int blknum[REISERFS_TREE_HEIGHT_MAX];
/* fields that are used only for balancing leaves of the tree */
/* number of empty blocks having been already allocated */
short int cur_blknum;
/* number of items that fall into left most node when S[0] splits */
short int s0num;
/* number of items that fall into first new node when S[0] splits */
short int s1num;
/* number of items that fall into second new node when S[0] splits */
short int s2num;
/* number of bytes which can flow to the left neighbor from the left */
short int lbytes;
/* most liquid item that cannot be shifted from S[0] entirely
if -1 then nothing will be partially shifted */
/* number of bytes which will flow to the right neighbor from the right */
short int rbytes;
/* number of bytes which flow to the first new node when S[0] splits
note: if S[0] splits into 3 nodes, then items do not need to be cut */
short int s1bytes;
short int s2bytes;
/* buffers which are to be freed after reiserfs_tb_balance finishes
by reiserfs_unfix_nodes */
reiserfs_bh_t * buf_to_free[TB_2FREE_MAX];
/* kmalloced memory. Used to create virtual node and keep map of dirtied
bitmap blocks */
char * vn_buf;
/* size of the vn_buf */
int vn_buf_size;
/* VN starts after bitmap of bitmap blocks */
struct reiserfs_virtual_node * tb_vn;
};
typedef struct reiserfs_tb reiserfs_tb_t;
enum tb_return {
CARRY_ON = 0x0,
NO_DISK_SPACE = 0x3,
IO_ERROR = 0x4,
NO_BALANCING_NEEDED = 0x5,
ITEM_FOUND = 0x6,
ITEM_NOT_FOUND = 0x7,
POSITION_FOUND = 0x8,
POSITION_NOT_FOUND = 0x9,
GOTO_PREVIOUS_ITEM = 0xa,
POSITION_FOUND_INVISIBLE= 0xb,
FILE_NOT_FOUND = 0xc,
DIRECTORY_NOT_FOUND = 0xd,
DIRECTORY_FOUND = 0xf,
LAST_SEARCH
};
/* These are modes of balancing */
/* When inserting an item. */
#define M_INSERT 'i'
/* When inserting into (directories only) or appending onto an already
existant item. */
#define M_PASTE 'p'
/* When deleting an item. */
#define M_DELETE 'd'
/* When truncating an item or removing an entry from a (directory) item. */
#define M_CUT 'c'
/* used when balancing on leaf level skipped (in reiserfsck) */
#define M_INTERNAL 'n'
#define FIRST_TO_LAST 0
#define LAST_TO_FIRST 1
/* used in reiserfs_tb_balance for passing parent of node information that
has been gotten from tb struct */
struct reiserfs_bufinfo {
reiserfs_bh_t * bi_bh;
reiserfs_bh_t * bi_parent;
int bi_position;
};
typedef struct reiserfs_bufinfo reiserfs_bufinfo_t;
extern void reiserfs_tb_attach_new (reiserfs_bufinfo_t * bi);
extern reiserfs_bh_t * reiserfs_tb_FEB (reiserfs_tb_t *tb);
extern int reiserfs_tb_lpos (reiserfs_tb_t * tb, int h);
extern int reiserfs_tb_rpos (reiserfs_tb_t * tb, int h);
extern void reiserfs_tb_balance (reiserfs_tb_t * tb,
reiserfs_ih_t * ih,
const char * body,
int flag,
int zeros_num);
extern void reiserfs_tb_init (reiserfs_tb_t * tb,
reiserfs_filsys_t *,
reiserfs_path_t * path,
int size);
extern void reiserfs_tb_print_path (reiserfs_tb_t * tb,
reiserfs_path_t * path);
#endif
+297
View File
@@ -0,0 +1,297 @@
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_TYPES_H
#define REISERFS_TYPES_H
#include "misc/types.h"
#include "misc/swab.h"
struct reiserfs_bitmap {
unsigned long bm_byte_size;
unsigned long bm_bit_size;
char * bm_map;
unsigned long bm_set_bits;
int bm_dirty; /* used for fetched bitmap */
unsigned long bm_first_zero;
};
typedef struct reiserfs_bitmap reiserfs_bitmap_t;
typedef struct reiserfs_bh reiserfs_bh_t;
struct reiserfs_bh {
unsigned long b_blocknr;
int b_dev;
unsigned long b_size;
char * b_data;
unsigned long b_state;
unsigned int b_count;
unsigned int b_list ;
void (*b_start_io) (unsigned long);
void (*b_end_io)(reiserfs_bh_t *bh, int uptodate);
reiserfs_bh_t * b_next;
reiserfs_bh_t * b_prev;
reiserfs_bh_t * b_hash_next;
reiserfs_bh_t * b_hash_prev;
};
/* magic string to find desc blocks in the journal */
#define JOURNAL_DESC_MAGIC "ReIsErLB"
struct reiserfs_journal_param {
/* where does journal start from on its device */
__u32 jp_start;
/* journal device st_rdev */
__u32 jp_dev;
/* size of the journal on FS creation. used to make sure
they don't overflow it */
__u32 jp_size;
/* max number of blocks in a transaction. */
__u32 jp_tlen;
/* random value made on fs creation (this was sb_journal_block_count) */
__u32 jp_magic;
/* max number of blocks to batch into a trans */
__u32 jp_max_batch;
/* in seconds, how old can an async commit be */
__u32 jp_commit_age;
/* in seconds, how old can a transaction be */
__u32 jp_trans_age;
};
typedef struct reiserfs_journal_param reiserfs_journal_param_t;
/* this header block gets written whenever a transaction is considered fully
** flushed, and is more recent than the last fully flushed transaction. fully
** flushed means all the log blocks and all the real blocks are on disk, and
** this transaction does not need to be replayed. */
struct reiserfs_journal_header {
/* id of last fully flushed transaction */
__u32 jh_last_flush_trans_id ;
/* offset in the log of where to start replay after a crash */
__u32 jh_flush_offset ;
__u32 jh_mount_id ;
reiserfs_journal_param_t jh_journal;
/* the mount id of the fs during the last reiserfsck --check. */
__u32 jh_last_check_mount_id;
};
/* this is the super from 3.5.X */
struct reiserfs_super_block_v1
{
__u32 sb_block_count; /* 0 number of block on data device */
__u32 sb_free_blocks; /* 4 free blocks count */
__u32 sb_root_block; /* 8 root of the tree */
reiserfs_journal_param_t sb_journal; /* 12 */
__u16 sb_blocksize; /* 44 */
__u16 sb_oid_maxsize; /* 46 max size of object id array, see
get_objectid() commentary */
__u16 sb_oid_cursize; /* 48 current size of object id array */
__u16 sb_umount_state; /* 50 this is set to 1 when filesystem was
umounted, to 2 - when not */
char s_magic[10]; /* 52 reiserfs magic string indicates that
file system is reiserfs: "ReIsErFs" or
"ReIsEr2Fs" or "ReIsEr3Fs" */
__u16 sb_fs_state; /* 62 it is set to used by fsck to mark which phase of
rebuilding is done (used for fsck debugging) */
__u32 sb_hash_function_code;/* 64 code of fuction which was/is/will be
used to sort names in a directory. See
codes in above */
__u16 sb_tree_height; /* 68 height of filesytem tree. Tree
consisting of only one root block has 2
here */
__u16 sb_bmap_nr; /* 70 amount of bitmap blocks needed to
address each block of file system */
__u16 sb_version; /* 72 this field is only reliable on
filesystem with non-standard journal */
__u16 sb_reserved_for_journal; /* 74 size in blocks of journal area on
main device, we need to keep after
non-standard journal relocation */
};
typedef struct reiserfs_super_block_v1 reiserfs_sb_v1_t;
/* Structure of super block on disk */
struct reiserfs_super_block {
/* 0 */ reiserfs_sb_v1_t s_v1;
/* 76 */ __u32 sb_inode_generation;
/* Right now used only by inode-attributes, if enabled */
/* 80 */ __u32 s_flags;
/* filesystem unique identifier */
/* 84 */ unsigned char s_uuid[16];
/* filesystem volume label */
/*100 */ unsigned char s_label[16];
/* zero filled by mkreiserfs and reiserfs_convert_objectid_map_v1()
* so any additions must be updated there as well. */
/*116 */ char s_unused[88];
/*204*/
} __attribute__ ((__packed__));;
typedef struct reiserfs_super_block reiserfs_sb_t;
typedef __u32 (*hashf_t) (const char *, int);
typedef struct reiserfs_filsys reiserfs_filsys_t;
struct reiserfs_filsys {
unsigned int fs_blocksize;
int fs_format; /* on-disk format version */
hashf_t hash; /* pointer to function which is used to sort
names in directory. It is set by
reiserfs_fs_open if it is set in the super
block, otherwise it is set by first
reiserfs_hash_correct */
char fs_file_name[4096]; /* file name of underlying device */
int fs_dev; /* descriptor of opened block device file */
reiserfs_bh_t * fs_super_bh; /* buffer containing super block */
reiserfs_sb_t * fs_ondisk_sb; /* pointer to its b_data */
reiserfs_bitmap_t * fs_bitmap2; /* ondisk bitmap after
reiserfs_bitmap_open */
/* opened journal fields */
char fs_j_file_name[4096]; /* file name of relocated journal device */
int fs_journal_dev; /* descriptor of opened journal device */
reiserfs_bh_t * fs_jh_bh; /* buffer containing journal header */
/* badblocks */
reiserfs_bitmap_t * fs_badblocks_bm;
int fs_dirt;
int fs_flags;
void * fs_vp;
int (*block_allocator) (reiserfs_filsys_t * fs,
unsigned long * free_blocknrs,
unsigned long start, int amount_needed);
int (*block_deallocator) (reiserfs_filsys_t * fs, unsigned long block);
__u16 lost_format;
};
#define REISERFS_TREE_HEIGHT_MAX 6
#define REISERFS_PATH_OFFINIT 2
#define REISERFS_PATH_OFFILL 1
#define REISERFS_PATH_MAX (REISERFS_TREE_HEIGHT_MAX + \
REISERFS_PATH_OFFINIT)
struct reiserfs_path_element {
/* Pointer to the buffer at the path in the tree. */
reiserfs_bh_t * pe_buffer;
/* Position in the tree node which is placed in the buffer above. */
int pe_position;
};
typedef struct reiserfs_path_element reiserfs_path_element_t;
/* We need to keep track of who the ancestors of nodes are. When we
perform a search we record which nodes were visited while
descending the tree looking for the node we searched for. This list
of nodes is called the path. This information is used while
performing balancing. Note that this path information may become
invalid, and this means we must check it when using it to see if it
is still valid. You'll need to read reiserfs_tree_search_item and the
comments in it, especially about decrement_counters_in_path(),
to understand this structure. */
struct reiserfs_path {
/* Length of the array above. */
unsigned int path_length;
/* Array of the path elements. */
reiserfs_path_element_t path_elements[REISERFS_PATH_MAX];
int pos_in_item;
};
typedef struct reiserfs_path reiserfs_path_t;
struct reiserfs_koff_v1 {
__u32 k_offset;
__u32 k_uniqueness;
} __attribute__ ((__packed__));
struct reiserfs_koff_v2 {
#if __BYTE_ORDER == __LITTLE_ENDIAN
__u64 k_offset:60;
__u64 k_type: 4;
#elif __BYTE_ORDER == __BIG_ENDIAN
__u64 k_type: 4;
__u64 k_offset:60;
#else
# error "nuxi/pdp-endian archs are not supported"
#endif
} __attribute__ ((__packed__));
/* Key of the object determines object's location in the tree,
composed of 4 components */
struct reiserfs_key {
/* packing locality: by default parent directory object id */
__u32 k2_dir_id;
/* object identifier */
__u32 k2_objectid;
union {
struct reiserfs_koff_v1 k2_offset_v1;
struct reiserfs_koff_v2 k2_offset_v2;
} __attribute__ ((__packed__)) u;
} __attribute__ ((__packed__));
typedef struct reiserfs_key reiserfs_key_t;
/* Everything in the filesystem is stored as a set of items. The item head
contains the key of the item, its free space (for extent items) and
specifies the location of the item itself within the block. */
struct reiserfs_ih {
reiserfs_key_t ih_key; /* Everything in the tree is found by searching for it
based on its key.*/
union {
__u16 ih2_free_space; /* The free space in the last unformatted node
of an extent item if this is an extent
item. This equals 0xFFFF iff this is a direct
item or stat data item. Note that the key, not
this field, is used to determine the item
type, and thus which field this union
contains. */
__u16 ih2_entry_count; /* Iff this is a directory item, this field
equals the number of directory entries in
the directory item. */
} __attribute__ ((__packed__)) u;
__u16 ih2_item_len; /* total size of the item body */
__u16 ih2_item_location; /* an offset to the item body within the
block */
__u16 ih_format; /* key format is stored in bits 0-11 of this item
flags are stored in bits 12-15 */
#if 0
struct {
__u16 key_format : 12; /* KEY_FORMAT_1 or KEY_FORMAT_2. This is not
necessary, but we have space, let use it */
__u16 flags : 4; /* fsck set here its flag (reachable/unreachable) */
} __attribute__ ((__packed__)) ih2_format;
#endif
} __attribute__ ((__packed__));
typedef struct reiserfs_ih reiserfs_ih_t;
typedef int (*unfm_func_t) (reiserfs_filsys_t *, __u32);
#endif