summaryrefslogtreecommitdiffstats
path: root/sys/gnu/reiserfs/reiserfs_fs.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/gnu/reiserfs/reiserfs_fs.h')
-rw-r--r--sys/gnu/reiserfs/reiserfs_fs.h1298
1 files changed, 0 insertions, 1298 deletions
diff --git a/sys/gnu/reiserfs/reiserfs_fs.h b/sys/gnu/reiserfs/reiserfs_fs.h
deleted file mode 100644
index 5f88f0b..0000000
--- a/sys/gnu/reiserfs/reiserfs_fs.h
+++ /dev/null
@@ -1,1298 +0,0 @@
-/*-
- * Copyright 2000 Hans Reiser
- * See README for licensing and copyright details
- *
- * Ported to FreeBSD by Jean-Sébastien Pédron <jspedron@club-internet.fr>
- *
- * $FreeBSD$
- */
-
-#ifndef _GNU_REISERFS_REISERFS_FS_H
-#define _GNU_REISERFS_REISERFS_FS_H
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/endian.h>
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/mount.h>
-#include <sys/namei.h>
-#include <sys/proc.h>
-#include <sys/vnode.h>
-#include <sys/unistd.h>
-
-#include <sys/bio.h>
-#include <sys/buf.h>
-#include <sys/conf.h>
-#include <sys/fcntl.h>
-#include <sys/syslog.h>
-
-#include <sys/malloc.h>
-#include <sys/dirent.h>
-#include <sys/stat.h>
-//#include <sys/mutex.h>
-
-#include <sys/ctype.h>
-#include <sys/bitstring.h>
-
-#include <geom/geom.h>
-#include <geom/geom_vfs.h>
-
-#ifdef __i386__
-# include <gnu/fs/ext2fs/i386-bitops.h>
-#else
-# include <gnu/fs/ext2fs/ext2_bitops.h>
-#endif
-
-#include <gnu/reiserfs/reiserfs_mount.h>
-#include <gnu/reiserfs/reiserfs_fs_sb.h>
-#include <gnu/reiserfs/reiserfs_fs_i.h>
-
-/* n must be power of 2 */
-#define _ROUND_UP(x, n) (((x) + (n) - 1u) & ~((n) - 1u))
-
-/* To be ok for alpha and others we have to align structures to 8 byte
- * boundary. */
-#define ROUND_UP(x) _ROUND_UP(x, 8LL)
-
-/* -------------------------------------------------------------------
- * Global variables
- * -------------------------------------------------------------------*/
-
-extern struct vop_vector reiserfs_vnodeops;
-extern struct vop_vector reiserfs_specops;
-
-/* -------------------------------------------------------------------
- * Super block
- * -------------------------------------------------------------------*/
-
-#define REISERFS_BSIZE 1024
-
-/* 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 64
-#define REISERFS_DISK_OFFSET_IN_BYTES \
- ((REISERFS_DISK_OFFSET) * (REISERFS_BSIZE))
-
-/* The spot for the super in versions 3.5 - 3.5.10 (inclusive) */
-#define REISERFS_OLD_DISK_OFFSET 8
-#define REISERFS_OLD_DISK_OFFSET_IN_BYTES \
- ((REISERFS_OLD_DISK_OFFSET) * (REISERFS_BSIZE))
-
-/*
- * Structure of a super block on disk, a version of which in RAM is
- * often accessed as REISERFS_SB(s)->r_rs. The version in RAM is part of
- * a larger structure containing fields never written to disk.
- */
-
-#define UNSET_HASH 0 /* read_super will guess about, what hash names
- in directories were sorted with */
-#define TEA_HASH 1
-#define YURA_HASH 2
-#define R5_HASH 3
-#define DEFAULT_HASH R5_HASH
-
-struct journal_params {
- uint32_t jp_journal_1st_block; /* Where does journal start
- from on its device */
- uint32_t jp_journal_dev; /* Journal device st_rdev */
- uint32_t jp_journal_size; /* Size of the journal */
- uint32_t jp_journal_trans_max; /* Max number of blocks in
- a transaction */
- uint32_t jp_journal_magic; /* Random value made on
- fs creation (this was
- sb_journal_block_count) */
- uint32_t jp_journal_max_batch; /* Max number of blocks to
- batch into a
- transaction */
- uint32_t jp_journal_max_commit_age; /* In seconds, how old can
- an async commit be */
- uint32_t jp_journal_max_trans_age; /* In seconds, how old a
- transaction be */
-};
-
-struct reiserfs_super_block_v1 {
- uint32_t s_block_count; /* Blocks count */
- uint32_t s_free_blocks; /* Free blocks count */
- uint32_t s_root_block; /* Root block number */
-
- struct journal_params s_journal;
-
- uint16_t s_blocksize;
- uint16_t s_oid_maxsize;
- uint16_t s_oid_cursize;
- uint16_t s_umount_state;
-
- char s_magic[10];
-
- uint16_t s_fs_state;
- uint32_t s_hash_function_code;
- uint16_t s_tree_height;
- uint16_t s_bmap_nr;
- uint16_t s_version;
- uint16_t s_reserved_for_journal;
-} __packed;
-
-#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1))
-
-struct reiserfs_super_block {
- struct reiserfs_super_block_v1 s_v1;
- uint32_t s_inode_generation;
- uint32_t s_flags;
- unsigned char s_uuid[16];
- unsigned char s_label[16];
- char s_unused[88];
-} __packed;
-
-#define SB_SIZE (sizeof(struct reiserfs_super_block))
-
-#define REISERFS_VERSION_1 0
-#define REISERFS_VERSION_2 2
-
-#define REISERFS_SB(sbi) (sbi)
-#define SB_DISK_SUPER_BLOCK(sbi) (REISERFS_SB(sbi)->s_rs)
-#define SB_V1_DISK_SUPER_BLOCK(sbi) (&(SB_DISK_SUPER_BLOCK(sbi)->s_v1))
-
-#define SB_BLOCKSIZE(sbi) \
- le32toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_blocksize))
-#define SB_BLOCK_COUNT(sbi) \
- le32toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_block_count))
-#define SB_FREE_BLOCKS(s) \
- le32toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_free_blocks))
-
-#define SB_REISERFS_MAGIC(sbi) \
- (SB_V1_DISK_SUPER_BLOCK(sbi)->s_magic)
-
-#define SB_ROOT_BLOCK(sbi) \
- le32toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_root_block))
-
-#define SB_TREE_HEIGHT(sbi) \
- le16toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_tree_height))
-
-#define SB_REISERFS_STATE(sbi) \
- le16toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_umount_state))
-
-#define SB_VERSION(sbi) le16toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_version))
-#define SB_BMAP_NR(sbi) le16toh((SB_V1_DISK_SUPER_BLOCK(sbi)->s_bmap_nr))
-
-#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs"
-#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
-#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"
-
-extern const char reiserfs_3_5_magic_string[];
-extern const char reiserfs_3_6_magic_string[];
-extern const char reiserfs_jr_magic_string[];
-
-int is_reiserfs_3_5(struct reiserfs_super_block *rs);
-int is_reiserfs_3_6(struct reiserfs_super_block *rs);
-int is_reiserfs_jr(struct reiserfs_super_block *rs);
-
-/* ReiserFS internal error code (used by search_by_key and fix_nodes) */
-#define IO_ERROR -2
-
-typedef uint32_t b_blocknr_t;
-typedef uint32_t unp_t;
-
-struct unfm_nodeinfo {
- unp_t unfm_nodenum;
- unsigned short unfm_freespace;
-};
-
-/* There are two formats of keys: 3.5 and 3.6 */
-#define KEY_FORMAT_3_5 0
-#define KEY_FORMAT_3_6 1
-
-/* There are two stat datas */
-#define STAT_DATA_V1 0
-#define STAT_DATA_V2 1
-
-#define REISERFS_I(ip) (ip)
-
-#define get_inode_item_key_version(ip) \
- ((REISERFS_I(ip)->i_flags & i_item_key_version_mask) ? \
- KEY_FORMAT_3_6 : KEY_FORMAT_3_5)
-
-#define set_inode_item_key_version(ip, version) ({ \
- if ((version) == KEY_FORMAT_3_6) \
- REISERFS_I(ip)->i_flags |= i_item_key_version_mask; \
- else \
- REISERFS_I(ip)->i_flags &= ~i_item_key_version_mask; \
-})
-
-#define get_inode_sd_version(ip) \
- ((REISERFS_I(ip)->i_flags & i_stat_data_version_mask) ? \
- STAT_DATA_V2 : STAT_DATA_V1)
-
-#define set_inode_sd_version(inode, version) ({ \
- if((version) == STAT_DATA_V2) \
- REISERFS_I(ip)->i_flags |= i_stat_data_version_mask; \
- else \
- REISERFS_I(ip)->i_flags &= ~i_stat_data_version_mask; \
-})
-
-/* Values for s_umount_state field */
-#define REISERFS_VALID_FS 1
-#define REISERFS_ERROR_FS 2
-
-/* There are 5 item types currently */
-#define TYPE_STAT_DATA 0
-#define TYPE_INDIRECT 1
-#define TYPE_DIRECT 2
-#define TYPE_DIRENTRY 3
-#define TYPE_MAXTYPE 3
-#define TYPE_ANY 15
-
-/* -------------------------------------------------------------------
- * Key & item head
- * -------------------------------------------------------------------*/
-
-struct offset_v1 {
- uint32_t k_offset;
- uint32_t k_uniqueness;
-} __packed;
-
-struct offset_v2 {
-#if BYTE_ORDER == LITTLE_ENDIAN
- /* little endian version */
- uint64_t k_offset:60;
- uint64_t k_type:4;
-#else
- /* big endian version */
- uint64_t k_type:4;
- uint64_t k_offset:60;
-#endif
-} __packed;
-
-#if (BYTE_ORDER == BIG_ENDIAN)
-typedef union {
- struct offset_v2 offset_v2;
- uint64_t linear;
-} __packed offset_v2_esafe_overlay;
-
-static inline uint16_t
-offset_v2_k_type(const struct offset_v2 *v2)
-{
-
- offset_v2_esafe_overlay tmp = *(const offset_v2_esafe_overlay *)v2;
- tmp.linear = le64toh(tmp.linear);
- return ((tmp.offset_v2.k_type <= TYPE_MAXTYPE) ?
- tmp.offset_v2.k_type : TYPE_ANY);
-}
-
-static inline void
-set_offset_v2_k_type(struct offset_v2 *v2, int type)
-{
-
- offset_v2_esafe_overlay *tmp = (offset_v2_esafe_overlay *)v2;
- tmp->linear = le64toh(tmp->linear);
- tmp->offset_v2.k_type = type;
- tmp->linear = htole64(tmp->linear);
-}
-
-static inline off_t
-offset_v2_k_offset(const struct offset_v2 *v2)
-{
-
- offset_v2_esafe_overlay tmp = *(const offset_v2_esafe_overlay *)v2;
- tmp.linear = le64toh(tmp.linear);
- return (tmp.offset_v2.k_offset);
-}
-
-static inline void
-set_offset_v2_k_offset(struct offset_v2 *v2, off_t offset)
-{
-
- offset_v2_esafe_overlay *tmp = (offset_v2_esafe_overlay *)v2;
- tmp->linear = le64toh(tmp->linear);
- tmp->offset_v2.k_offset = offset;
- tmp->linear = htole64(tmp->linear);
-}
-#else /* BYTE_ORDER != BIG_ENDIAN */
-#define offset_v2_k_type(v2) ((v2)->k_type)
-#define set_offset_v2_k_type(v2, val) (offset_v2_k_type(v2) = (val))
-#define offset_v2_k_offset(v2) ((v2)->k_offset)
-#define set_offset_v2_k_offset(v2, val) (offset_v2_k_offset(v2) = (val))
-#endif /* BYTE_ORDER == BIG_ENDIAN */
-
-/*
- * Key of an item determines its location in the S+tree, and
- * is composed of 4 components
- */
-struct key {
- uint32_t k_dir_id; /* Packing locality: by default parent
- directory object id */
- uint32_t k_objectid; /* Object identifier */
- union {
- struct offset_v1 k_offset_v1;
- struct offset_v2 k_offset_v2;
- } __packed u;
-} __packed;
-
-struct cpu_key {
- struct key on_disk_key;
- int version;
- int key_length; /* 3 in all cases but direct2indirect
- and indirect2direct conversion */
-};
-
-/*
- * Our function for comparing keys can compare keys of different
- * lengths. It takes as a parameter the length of the keys it is to
- * compare. These defines are used in determining what is to be passed
- * to it as that parameter.
- */
-#define REISERFS_FULL_KEY_LEN 4
-#define REISERFS_SHORT_KEY_LEN 2
-
-#define KEY_SIZE (sizeof(struct key))
-#define SHORT_KEY_SIZE (sizeof(uint32_t) + sizeof(uint32_t))
-
-/* Return values for search_by_key and clones */
-#define ITEM_FOUND 1
-#define ITEM_NOT_FOUND 0
-#define ENTRY_FOUND 1
-#define ENTRY_NOT_FOUND 0
-#define DIRECTORY_NOT_FOUND -1
-#define REGULAR_FILE_FOUND -2
-#define DIRECTORY_FOUND -3
-#define BYTE_FOUND 1
-#define BYTE_NOT_FOUND 0
-#define FILE_NOT_FOUND -1
-
-#define POSITION_FOUND 1
-#define POSITION_NOT_FOUND 0
-
-/* Return values for reiserfs_find_entry and search_by_entry_key */
-#define NAME_FOUND 1
-#define NAME_NOT_FOUND 0
-#define GOTO_PREVIOUS_ITEM 2
-#define NAME_FOUND_INVISIBLE 3
-
-/*
- * Everything in the filesystem is stored as a set of items. The item
- * head contains the key of the item, its free space (for indirect
- * items) and specifies the location of the item itself within the
- * block.
- */
-struct item_head {
- /*
- * Everything in the tree is found by searching for it based on
- * its key.
- */
- struct key ih_key;
- union {
- /*
- * The free space in the last unformatted node of an
- * indirect item if this is an indirect item. This
- * equals 0xFFFF iff this is a direct item or stat data
- * item. Note that the key, not this field, is used to
- * determine the item type, and thus which field this
- * union contains.
- */
- uint16_t ih_free_space_reserved;
-
- /*
- * If this is a directory item, this field equals the number of
- * directory entries in the directory item.
- */
- uint16_t ih_entry_count;
- } __packed u;
- uint16_t ih_item_len; /* Total size of the item body */
- uint16_t ih_item_location; /* An offset to the item body within
- the block */
- uint16_t ih_version; /* 0 for all old items, 2 for new
- ones. Highest bit is set by fsck
- temporary, cleaned after all
- done */
-} __packed;
-
-/* Size of item header */
-#define IH_SIZE (sizeof(struct item_head))
-
-#define ih_free_space(ih) le16toh((ih)->u.ih_free_space_reserved)
-#define ih_version(ih) le16toh((ih)->ih_version)
-#define ih_entry_count(ih) le16toh((ih)->u.ih_entry_count)
-#define ih_location(ih) le16toh((ih)->ih_item_location)
-#define ih_item_len(ih) le16toh((ih)->ih_item_len)
-
-/*
- * These operate on indirect items, where you've got an array of ints at
- * a possibly unaligned location. These are a noop on IA32.
- *
- * p is the array of uint32_t, i is the index into the array, v is the
- * value to store there.
- */
-#define get_unaligned(ptr) \
- ({ __typeof__(*(ptr)) __tmp; \
- memcpy(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
-
-#define put_unaligned(val, ptr) \
- ({ __typeof__(*(ptr)) __tmp = (val); \
- memcpy((ptr), &__tmp, sizeof(*(ptr))); \
- (void)0; })
-
-#define get_block_num(p, i) le32toh(get_unaligned((p) + (i)))
-#define put_block_num(p, i, v) put_unaligned(htole32(v), (p) + (i))
-
-/* In old version uniqueness field shows key type */
-#define V1_SD_UNIQUENESS 0
-#define V1_INDIRECT_UNIQUENESS 0xfffffffe
-#define V1_DIRECT_UNIQUENESS 0xffffffff
-#define V1_DIRENTRY_UNIQUENESS 500
-#define V1_ANY_UNIQUENESS 555
-
-/* Here are conversion routines */
-static inline int uniqueness2type(uint32_t uniqueness);
-static inline uint32_t type2uniqueness(int type);
-
-static inline int
-uniqueness2type(uint32_t uniqueness)
-{
-
- switch ((int)uniqueness) {
- case V1_SD_UNIQUENESS:
- return (TYPE_STAT_DATA);
- case V1_INDIRECT_UNIQUENESS:
- return (TYPE_INDIRECT);
- case V1_DIRECT_UNIQUENESS:
- return (TYPE_DIRECT);
- case V1_DIRENTRY_UNIQUENESS:
- return (TYPE_DIRENTRY);
- default:
- log(LOG_NOTICE, "reiserfs: unknown uniqueness (%u)\n",
- uniqueness);
- case V1_ANY_UNIQUENESS:
- return (TYPE_ANY);
- }
-}
-
-static inline uint32_t
-type2uniqueness(int type)
-{
-
- switch (type) {
- case TYPE_STAT_DATA:
- return (V1_SD_UNIQUENESS);
- case TYPE_INDIRECT:
- return (V1_INDIRECT_UNIQUENESS);
- case TYPE_DIRECT:
- return (V1_DIRECT_UNIQUENESS);
- case TYPE_DIRENTRY:
- return (V1_DIRENTRY_UNIQUENESS);
- default:
- log(LOG_NOTICE, "reiserfs: unknown type (%u)\n", type);
- case TYPE_ANY:
- return (V1_ANY_UNIQUENESS);
- }
-}
-
-/*
- * Key is pointer to on disk key which is stored in le, result is cpu,
- * there is no way to get version of object from key, so, provide
- * version to these defines.
- */
-static inline off_t
-le_key_k_offset(int version, const struct key *key)
-{
-
- return ((version == KEY_FORMAT_3_5) ?
- le32toh(key->u.k_offset_v1.k_offset) :
- offset_v2_k_offset(&(key->u.k_offset_v2)));
-}
-
-static inline off_t
-le_ih_k_offset(const struct item_head *ih)
-{
-
- return (le_key_k_offset(ih_version(ih), &(ih->ih_key)));
-}
-
-static inline off_t
-le_key_k_type(int version, const struct key *key)
-{
-
- return ((version == KEY_FORMAT_3_5) ?
- uniqueness2type(le32toh(key->u.k_offset_v1.k_uniqueness)) :
- offset_v2_k_type(&(key->u.k_offset_v2)));
-}
-
-static inline off_t
-le_ih_k_type(const struct item_head *ih)
-{
- return (le_key_k_type(ih_version(ih), &(ih->ih_key)));
-}
-
-static inline void
-set_le_key_k_offset(int version, struct key *key, off_t offset)
-{
-
- (version == KEY_FORMAT_3_5) ?
- (key->u.k_offset_v1.k_offset = htole32(offset)) :
- (set_offset_v2_k_offset(&(key->u.k_offset_v2), offset));
-}
-
-static inline void
-set_le_ih_k_offset(struct item_head *ih, off_t offset)
-{
-
- set_le_key_k_offset(ih_version(ih), &(ih->ih_key), offset);
-}
-
-static inline void
-set_le_key_k_type(int version, struct key *key, int type)
-{
-
- (version == KEY_FORMAT_3_5) ?
- (key->u.k_offset_v1.k_uniqueness =
- htole32(type2uniqueness(type))) :
- (set_offset_v2_k_type(&(key->u.k_offset_v2), type));
-}
-
-static inline void
-set_le_ih_k_type(struct item_head *ih, int type)
-{
-
- set_le_key_k_type(ih_version(ih), &(ih->ih_key), type);
-}
-
-#define is_direntry_le_key(version, key) \
- (le_key_k_type(version, key) == TYPE_DIRENTRY)
-#define is_direct_le_key(version, key) \
- (le_key_k_type(version, key) == TYPE_DIRECT)
-#define is_indirect_le_key(version, key) \
- (le_key_k_type(version, key) == TYPE_INDIRECT)
-#define is_statdata_le_key(version, key) \
- (le_key_k_type(version, key) == TYPE_STAT_DATA)
-
-/* Item header has version. */
-#define is_direntry_le_ih(ih) \
- is_direntry_le_key(ih_version(ih), &((ih)->ih_key))
-#define is_direct_le_ih(ih) \
- is_direct_le_key(ih_version(ih), &((ih)->ih_key))
-#define is_indirect_le_ih(ih) \
- is_indirect_le_key(ih_version(ih), &((ih)->ih_key))
-#define is_statdata_le_ih(ih) \
- is_statdata_le_key(ih_version(ih), &((ih)->ih_key))
-
-static inline void
-set_cpu_key_k_offset(struct cpu_key *key, off_t offset)
-{
-
- (key->version == KEY_FORMAT_3_5) ?
- (key->on_disk_key.u.k_offset_v1.k_offset = offset) :
- (key->on_disk_key.u.k_offset_v2.k_offset = offset);
-}
-
-static inline void
-set_cpu_key_k_type(struct cpu_key *key, int type)
-{
-
- (key->version == KEY_FORMAT_3_5) ?
- (key->on_disk_key.u.k_offset_v1.k_uniqueness =
- type2uniqueness(type)):
- (key->on_disk_key.u.k_offset_v2.k_type = type);
-}
-
-#define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY)
-#define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT)
-#define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT)
-#define is_statdata_cpu_key(key) (cpu_key_k_type (key) == TYPE_STAT_DATA)
-
-/* Maximal length of item */
-#define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)
-#define MIN_ITEM_LEN 1
-
-/* Object identifier for root dir */
-#define REISERFS_ROOT_OBJECTID 2
-#define REISERFS_ROOT_PARENT_OBJECTID 1
-
-/* key is pointer to cpu key, result is cpu */
-static inline off_t
-cpu_key_k_offset(const struct cpu_key *key)
-{
-
- return ((key->version == KEY_FORMAT_3_5) ?
- key->on_disk_key.u.k_offset_v1.k_offset :
- key->on_disk_key.u.k_offset_v2.k_offset);
-}
-
-static inline off_t
-cpu_key_k_type(const struct cpu_key *key)
-{
-
- return ((key->version == KEY_FORMAT_3_5) ?
- uniqueness2type(key->on_disk_key.u.k_offset_v1.k_uniqueness) :
- key->on_disk_key.u.k_offset_v2.k_type);
-}
-
-/*
- * Header of a disk block. More precisely, header of a formatted leaf
- * or internal node, and not the header of an unformatted node.
- */
-struct block_head {
- uint16_t blk_level; /* Level of a block in the
- tree. */
- uint16_t blk_nr_item; /* Number of keys/items in a
- block. */
- uint16_t blk_free_space; /* Block free space in bytes. */
- uint16_t blk_reserved; /* Dump this in v4/planA */
- struct key blk_right_delim_key; /* Kept only for compatibility */
-};
-
-#define BLKH_SIZE (sizeof(struct block_head))
-#define blkh_level(p_blkh) (le16toh((p_blkh)->blk_level))
-#define blkh_nr_item(p_blkh) (le16toh((p_blkh)->blk_nr_item))
-#define blkh_free_space(p_blkh) (le16toh((p_blkh)->blk_free_space))
-
-#define FREE_LEVEL 0 /* When node gets removed from the tree its
- blk_level is set to FREE_LEVEL. It is then
- used to see whether the node is still in the
- tree */
-
-/* Values for blk_level field of the struct block_head */
-#define DISK_LEAF_NODE_LEVEL 1 /* Leaf node level.*/
-
-/*
- * Given the buffer head of a formatted node, resolve to the block head
- * of that node.
- */
-#define B_BLK_HEAD(p_s_bp) ((struct block_head *)((p_s_bp)->b_data))
-#define B_NR_ITEMS(p_s_bp) (blkh_nr_item(B_BLK_HEAD(p_s_bp)))
-#define B_LEVEL(p_s_bp) (blkh_level(B_BLK_HEAD(p_s_bp)))
-#define B_FREE_SPACE(p_s_bp) (blkh_free_space(B_BLK_HEAD(p_s_bp)))
-
-/* -------------------------------------------------------------------
- * Stat data
- * -------------------------------------------------------------------*/
-
-/*
- * Old stat data is 32 bytes long. We are going to distinguish new one
- * by different size.
- */
-struct stat_data_v1 {
- uint16_t sd_mode; /* File type, permissions */
- uint16_t sd_nlink; /* Number of hard links */
- uint16_t sd_uid; /* Owner */
- uint16_t sd_gid; /* Group */
- uint32_t sd_size; /* File size */
- uint32_t sd_atime; /* Time of last access */
- uint32_t sd_mtime; /* Time file was last modified */
- uint32_t sd_ctime; /* Time inode (stat data) was last changed
- (except changes to sd_atime and
- sd_mtime) */
- union {
- uint32_t sd_rdev;
- uint32_t sd_blocks; /* Number of blocks file uses */
- } __packed u;
- uint32_t sd_first_direct_byte; /* First byte of file which is
- stored in a direct item:
- except that if it equals 1
- it is a symlink and if it
- equals ~(uint32_t)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. Someday.
- -Hans */
-} __packed;
-
-#define SD_V1_SIZE (sizeof(struct stat_data_v1))
-#define stat_data_v1(ih) (ih_version (ih) == KEY_FORMAT_3_5)
-#define sd_v1_mode(sdp) (le16toh((sdp)->sd_mode))
-#define set_sd_v1_mode(sdp, v) ((sdp)->sd_mode = htole16(v))
-#define sd_v1_nlink(sdp) (le16toh((sdp)->sd_nlink))
-#define set_sd_v1_nlink(sdp, v) ((sdp)->sd_nlink = htole16(v))
-#define sd_v1_uid(sdp) (le16toh((sdp)->sd_uid))
-#define set_sd_v1_uid(sdp, v) ((sdp)->sd_uid = htole16(v))
-#define sd_v1_gid(sdp) (le16toh((sdp)->sd_gid))
-#define set_sd_v1_gid(sdp, v) ((sdp)->sd_gid = htole16(v))
-#define sd_v1_size(sdp) (le32toh((sdp)->sd_size))
-#define set_sd_v1_size(sdp, v) ((sdp)->sd_size = htole32(v))
-#define sd_v1_atime(sdp) (le32toh((sdp)->sd_atime))
-#define set_sd_v1_atime(sdp, v) ((sdp)->sd_atime = htole32(v))
-#define sd_v1_mtime(sdp) (le32toh((sdp)->sd_mtime))
-#define set_sd_v1_mtime(sdp, v) ((sdp)->sd_mtime = htole32(v))
-#define sd_v1_ctime(sdp) (le32toh((sdp)->sd_ctime))
-#define set_sd_v1_ctime(sdp, v) ((sdp)->sd_ctime = htole32(v))
-#define sd_v1_rdev(sdp) (le32toh((sdp)->u.sd_rdev))
-#define set_sd_v1_rdev(sdp, v) ((sdp)->u.sd_rdev = htole32(v))
-#define sd_v1_blocks(sdp) (le32toh((sdp)->u.sd_blocks))
-#define set_sd_v1_blocks(sdp, v) ((sdp)->u.sd_blocks = htole32(v))
-#define sd_v1_first_direct_byte(sdp) \
- (le32toh((sdp)->sd_first_direct_byte))
-#define set_sd_v1_first_direct_byte(sdp, v) \
- ((sdp)->sd_first_direct_byte = htole32(v))
-
-/*
- * We want common flags to have the same values as in ext2,
- * so chattr(1) will work without problems
- */
-#include <gnu/fs/ext2fs/ext2_fs.h>
-#define REISERFS_IMMUTABLE_FL EXT2_IMMUTABLE_FL
-#define REISERFS_APPEND_FL EXT2_APPEND_FL
-#define REISERFS_SYNC_FL EXT2_SYNC_FL
-#define REISERFS_NOATIME_FL EXT2_NOATIME_FL
-#define REISERFS_NODUMP_FL EXT2_NODUMP_FL
-#define REISERFS_SECRM_FL EXT2_SECRM_FL
-#define REISERFS_UNRM_FL EXT2_UNRM_FL
-#define REISERFS_COMPR_FL EXT2_COMPR_FL
-#define REISERFS_NOTAIL_FL EXT2_NOTAIL_FL
-
-/*
- * Stat Data on disk (reiserfs version of UFS disk inode minus the
- * address blocks)
- */
-struct stat_data {
- uint16_t sd_mode; /* File type, permissions */
- uint16_t sd_attrs; /* Persistent inode flags */
- uint32_t sd_nlink; /* Number of hard links */
- uint64_t sd_size; /* File size */
- uint32_t sd_uid; /* Owner */
- uint32_t sd_gid; /* Group */
- uint32_t sd_atime; /* Time of last access */
- uint32_t sd_mtime; /* Time file was last modified */
- uint32_t sd_ctime; /* Time inode (stat data) was last changed
- (except changes to sd_atime and
- sd_mtime) */
- uint32_t sd_blocks;
- union {
- uint32_t sd_rdev;
- uint32_t sd_generation;
- //uint32_t sd_first_direct_byte;
- /*
- * First byte of file which is stored in a
- * direct item: except that if it equals 1
- * it is a symlink and if it equals
- * ~(uint32_t)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?
- */
- } __packed u;
-} __packed;
-
-/* This is 44 bytes long */
-#define SD_SIZE (sizeof(struct stat_data))
-#define SD_V2_SIZE SD_SIZE
-#define stat_data_v2(ih) (ih_version (ih) == KEY_FORMAT_3_6)
-#define sd_v2_mode(sdp) (le16toh((sdp)->sd_mode))
-#define set_sd_v2_mode(sdp, v) ((sdp)->sd_mode = htole16(v))
-/* sd_reserved */
-/* set_sd_reserved */
-#define sd_v2_nlink(sdp) (le32toh((sdp)->sd_nlink))
-#define set_sd_v2_nlink(sdp, v) ((sdp)->sd_nlink = htole32(v))
-#define sd_v2_size(sdp) (le64toh((sdp)->sd_size))
-#define set_sd_v2_size(sdp, v) ((sdp)->sd_size = cpu_to_le64(v))
-#define sd_v2_uid(sdp) (le32toh((sdp)->sd_uid))
-#define set_sd_v2_uid(sdp, v) ((sdp)->sd_uid = htole32(v))
-#define sd_v2_gid(sdp) (le32toh((sdp)->sd_gid))
-#define set_sd_v2_gid(sdp, v) ((sdp)->sd_gid = htole32(v))
-#define sd_v2_atime(sdp) (le32toh((sdp)->sd_atime))
-#define set_sd_v2_atime(sdp, v) ((sdp)->sd_atime = htole32(v))
-#define sd_v2_mtime(sdp) (le32toh((sdp)->sd_mtime))
-#define set_sd_v2_mtime(sdp, v) ((sdp)->sd_mtime = htole32(v))
-#define sd_v2_ctime(sdp) (le32toh((sdp)->sd_ctime))
-#define set_sd_v2_ctime(sdp, v) ((sdp)->sd_ctime = htole32(v))
-#define sd_v2_blocks(sdp) (le32toh((sdp)->sd_blocks))
-#define set_sd_v2_blocks(sdp, v) ((sdp)->sd_blocks = htole32(v))
-#define sd_v2_rdev(sdp) (le32toh((sdp)->u.sd_rdev))
-#define set_sd_v2_rdev(sdp, v) ((sdp)->u.sd_rdev = htole32(v))
-#define sd_v2_generation(sdp) (le32toh((sdp)->u.sd_generation))
-#define set_sd_v2_generation(sdp, v) ((sdp)->u.sd_generation = htole32(v))
-#define sd_v2_attrs(sdp) (le16toh((sdp)->sd_attrs))
-#define set_sd_v2_attrs(sdp, v) ((sdp)->sd_attrs = htole16(v))
-
-/* -------------------------------------------------------------------
- * Directory structure
- * -------------------------------------------------------------------*/
-
-#define SD_OFFSET 0
-#define SD_UNIQUENESS 0
-#define DOT_OFFSET 1
-#define DOT_DOT_OFFSET 2
-#define DIRENTRY_UNIQUENESS 500
-
-#define FIRST_ITEM_OFFSET 1
-
-struct reiserfs_de_head {
- uint32_t deh_offset; /* Third component of the directory
- entry key */
- uint32_t deh_dir_id; /* Objectid of the parent directory of
- the object, that is referenced by
- directory entry */
- uint32_t deh_objectid; /* Objectid of the object, that is
- referenced by directory entry */
- uint16_t deh_location; /* Offset of name in the whole item */
- uint16_t deh_state; /* Whether 1) entry contains stat data
- (for future), and 2) whether entry
- is hidden (unlinked) */
-} __packed;
-
-#define DEH_SIZE sizeof(struct reiserfs_de_head)
-#define deh_offset(p_deh) (le32toh((p_deh)->deh_offset))
-#define deh_dir_id(p_deh) (le32toh((p_deh)->deh_dir_id))
-#define deh_objectid(p_deh) (le32toh((p_deh)->deh_objectid))
-#define deh_location(p_deh) (le16toh((p_deh)->deh_location))
-#define deh_state(p_deh) (le16toh((p_deh)->deh_state))
-
-#define put_deh_offset(p_deh, v) ((p_deh)->deh_offset = htole32((v)))
-#define put_deh_dir_id(p_deh, v) ((p_deh)->deh_dir_id = htole32((v)))
-#define put_deh_objectid(p_deh, v) ((p_deh)->deh_objectid = htole32((v)))
-#define put_deh_location(p_deh, v) ((p_deh)->deh_location = htole16((v)))
-#define put_deh_state(p_deh, v) ((p_deh)->deh_state = htole16((v)))
-
-/* Empty directory contains two entries "." and ".." and their headers */
-#define EMPTY_DIR_SIZE \
- (DEH_SIZE * 2 + ROUND_UP(strlen(".")) + ROUND_UP(strlen("..")))
-
-/* Old format directories have this size when empty */
-#define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3)
-
-#define DEH_Statdata 0 /* Not used now */
-#define DEH_Visible 2
-
-/* 64 bit systems (and the S/390) need to be aligned explicitly -jdm */
-#if BITS_PER_LONG == 64 || defined(__sparc64__)
-#define ADDR_UNALIGNED_BITS (3)
-#endif
-
-#ifdef ADDR_UNALIGNED_BITS
-#define aligned_address(addr) \
- ((void *)((long)(addr) & ~((1UL << ADDR_UNALIGNED_BITS) - 1)))
-#define unaligned_offset(addr) \
- (((int)((long)(addr) & ((1 << ADDR_UNALIGNED_BITS) - 1))) << 3)
-
-#define set_bit_unaligned(nr, addr) \
- set_bit((nr) + unaligned_offset(addr), aligned_address(addr))
-#define clear_bit_unaligned(nr, addr) \
- clear_bit((nr) + unaligned_offset(addr), aligned_address(addr))
-#define test_bit_unaligned(nr, addr) \
- test_bit((nr) + unaligned_offset(addr), aligned_address(addr))
-#else /* !defined ADDR_UNALIGNED_BITS */
-#define set_bit_unaligned(nr, addr) set_bit(nr, addr)
-#define clear_bit_unaligned(nr, addr) clear_bit(nr, addr)
-#define test_bit_unaligned(nr, addr) test_bit(nr, addr)
-#endif /* defined ADDR_UNALIGNED_BITS */
-
-#define mark_de_with_sd(deh) \
- set_bit_unaligned(DEH_Statdata, &((deh)->deh_state))
-#define mark_de_without_sd(deh) \
- clear_bit_unaligned(DEH_Statdata, &((deh)->deh_state))
-#define mark_de_visible(deh) \
- set_bit_unaligned (DEH_Visible, &((deh)->deh_state))
-#define mark_de_hidden(deh) \
- clear_bit_unaligned (DEH_Visible, &((deh)->deh_state))
-
-#define de_with_sd(deh) \
- test_bit_unaligned(DEH_Statdata, &((deh)->deh_state))
-#define de_visible(deh) \
- test_bit_unaligned(DEH_Visible, &((deh)->deh_state))
-#define de_hidden(deh) \
- !test_bit_unaligned(DEH_Visible, &((deh)->deh_state))
-
-/* Two entries per block (at least) */
-#define REISERFS_MAX_NAME(block_size) 255
-
-/*
- * This structure is used for operations on directory entries. It is not
- * a disk structure. When reiserfs_find_entry or search_by_entry_key
- * find directory entry, they return filled reiserfs_dir_entry structure
- */
-struct reiserfs_dir_entry {
- struct buf *de_bp;
- int de_item_num;
- struct item_head *de_ih;
- int de_entry_num;
- struct reiserfs_de_head *de_deh;
- int de_entrylen;
- int de_namelen;
- char *de_name;
- char *de_gen_number_bit_string;
-
- uint32_t de_dir_id;
- uint32_t de_objectid;
-
- struct cpu_key de_entry_key;
-};
-
-/* Pointer to file name, stored in entry */
-#define B_I_DEH_ENTRY_FILE_NAME(bp, ih, deh) \
- (B_I_PITEM(bp, ih) + deh_location(deh))
-
-/* Length of name */
-#define I_DEH_N_ENTRY_FILE_NAME_LENGTH(ih, deh, entry_num) \
- (I_DEH_N_ENTRY_LENGTH(ih, deh, entry_num) - \
- (de_with_sd(deh) ? SD_SIZE : 0))
-
-/* Hash value occupies bits from 7 up to 30 */
-#define GET_HASH_VALUE(offset) ((offset) & 0x7fffff80LL)
-
-/* Generation number occupies 7 bits starting from 0 up to 6 */
-#define GET_GENERATION_NUMBER(offset) ((offset) & 0x7fLL)
-#define MAX_GENERATION_NUMBER 127
-
-/* Get item body */
-#define B_I_PITEM(bp, ih) ((bp)->b_data + ih_location(ih))
-#define B_I_DEH(bp, ih) ((struct reiserfs_de_head *)(B_I_PITEM(bp, ih)))
-
-/*
- * Length of the directory entry in directory item. This define
- * calculates length of i-th directory entry using directory entry
- * locations from dir entry head. When it calculates length of 0-th
- * directory entry, it uses length of whole item in place of entry
- * location of the non-existent following entry in the calculation. See
- * picture above.
- */
-static inline int
-entry_length (const struct buf *bp, const struct item_head *ih,
- int pos_in_item)
-{
- struct reiserfs_de_head *deh;
-
- deh = B_I_DEH(bp, ih) + pos_in_item;
- if (pos_in_item)
- return (deh_location(deh - 1) - deh_location(deh));
-
- return (ih_item_len(ih) - deh_location(deh));
-}
-
-/*
- * Number of entries in the directory item, depends on ENTRY_COUNT
- * being at the start of directory dynamic data.
- */
-#define I_ENTRY_COUNT(ih) (ih_entry_count((ih)))
-
-/* -------------------------------------------------------------------
- * Disk child
- * -------------------------------------------------------------------*/
-
-/*
- * Disk child pointer: The pointer from an internal node of the tree
- * to a node that is on disk.
- */
-struct disk_child {
- uint32_t dc_block_number; /* Disk child's block number. */
- uint16_t dc_size; /* Disk child's used space. */
- uint16_t dc_reserved;
-};
-
-#define DC_SIZE (sizeof(struct disk_child))
-#define dc_block_number(dc_p) (le32toh((dc_p)->dc_block_number))
-#define dc_size(dc_p) (le16toh((dc_p)->dc_size))
-#define put_dc_block_number(dc_p, val) \
- do { (dc_p)->dc_block_number = htole32(val); } while (0)
-#define put_dc_size(dc_p, val) \
- do { (dc_p)->dc_size = htole16(val); } while (0)
-
-/* Get disk child by buffer header and position in the tree node. */
-#define B_N_CHILD(p_s_bp, n_pos) \
- ((struct disk_child *)((p_s_bp)->b_data + BLKH_SIZE + \
- B_NR_ITEMS(p_s_bp) * KEY_SIZE + \
- DC_SIZE * (n_pos)))
-
-/* Get disk child number by buffer header and position in the tree node. */
-#define B_N_CHILD_NUM(p_s_bp, n_pos) \
- (dc_block_number(B_N_CHILD(p_s_bp, n_pos)))
-#define PUT_B_N_CHILD_NUM(p_s_bp, n_pos, val) \
- (put_dc_block_number(B_N_CHILD(p_s_bp, n_pos), val))
-
-/* -------------------------------------------------------------------
- * Path structures and defines
- * -------------------------------------------------------------------*/
-
-struct path_element {
- struct buf *pe_buffer; /* Pointer to the buffer at the path in
- the tree. */
- int pe_position; /* Position in the tree node which is
- placed in the buffer above. */
-};
-
-#define MAX_HEIGHT 5 /* Maximal height of a tree. Don't
- change this without changing
- JOURNAL_PER_BALANCE_CNT */
-#define EXTENDED_MAX_HEIGHT 7 /* Must be equals MAX_HEIGHT +
- FIRST_PATH_ELEMENT_OFFSET */
-#define FIRST_PATH_ELEMENT_OFFSET 2 /* Must be equal to at least 2. */
-#define ILLEGAL_PATH_ELEMENT_OFFSET 1 /* Must be equal to
- FIRST_PATH_ELEMENT_OFFSET - 1 */
-#define MAX_FEB_SIZE 6 /* This MUST be MAX_HEIGHT + 1.
- See about FEB below */
-
-struct path {
- /* Length of the array below. */
- int path_length;
- /* Array of the path element */
- struct path_element path_elements[EXTENDED_MAX_HEIGHT];
- int pos_in_item;
-};
-
-#define pos_in_item(path) ((path)->pos_in_item)
-
-#define INITIALIZE_PATH(var) \
- struct path var = { ILLEGAL_PATH_ELEMENT_OFFSET, }
-
-/* Get path element by path and path position. */
-#define PATH_OFFSET_PELEMENT(p_s_path, n_offset) \
- ((p_s_path)->path_elements + (n_offset))
-
-/* Get buffer header at the path by path and path position. */
-#define PATH_OFFSET_PBUFFER(p_s_path, n_offset) \
- (PATH_OFFSET_PELEMENT(p_s_path, n_offset)->pe_buffer)
-
-/* Get position in the element at the path by path and path position. */
-#define PATH_OFFSET_POSITION(p_s_path, n_offset) \
- (PATH_OFFSET_PELEMENT(p_s_path, n_offset)->pe_position)
-
-#define PATH_PLAST_BUFFER(p_s_path) \
- (PATH_OFFSET_PBUFFER((p_s_path), (p_s_path)->path_length))
-
-#define PATH_LAST_POSITION(p_s_path) \
- (PATH_OFFSET_POSITION((p_s_path), (p_s_path)->path_length))
-
-#define PATH_PITEM_HEAD(p_s_path) \
- B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_path), PATH_LAST_POSITION(p_s_path))
-
-#define get_last_bp(path) PATH_PLAST_BUFFER(path)
-#define get_ih(path) PATH_PITEM_HEAD(path)
-
-/* -------------------------------------------------------------------
- * Misc.
- * -------------------------------------------------------------------*/
-
-/* Size of pointer to the unformatted node. */
-#define UNFM_P_SIZE (sizeof(unp_t))
-#define UNFM_P_SHIFT 2
-
-/* In in-core inode key is stored on le form */
-#define INODE_PKEY(ip) ((struct key *)(REISERFS_I(ip)->i_key))
-
-#define MAX_UL_INT 0xffffffff
-#define MAX_INT 0x7ffffff
-#define MAX_US_INT 0xffff
-
-/* The purpose is to detect overflow of an unsigned short */
-#define REISERFS_LINK_MAX (MAX_US_INT - 1000)
-
-#define fs_generation(sbi) (REISERFS_SB(sbi)->s_generation_counter)
-#define get_generation(sbi) (fs_generation(sbi))
-
-#define __fs_changed(gen, sbi) (gen != get_generation (sbi))
-/*#define fs_changed(gen, sbi) ({ cond_resched(); \
- __fs_changed(gen, sbi); })*/
-#define fs_changed(gen, sbi) (__fs_changed(gen, sbi))
-
-/* -------------------------------------------------------------------
- * Fixate node
- * -------------------------------------------------------------------*/
-
-/*
- * To make any changes in the tree we always first find node, that
- * contains item to be changed/deleted or place to insert a new item.
- * We call this node S. To do balancing we need to decide what we will
- * shift to left/right neighbor, or to a new node, where new item will
- * be etc. To make this analysis simpler we build virtual node. Virtual
- * node is an array of items, that will replace items of node S. (For
- * instance if we are going to delete an item, virtual node does not
- * contain it). Virtual node keeps information about item sizes and
- * types, mergeability of first and last items, sizes of all entries in
- * directory item. We use this array of items when calculating what we
- * can shift to neighbors and how many nodes we have to have if we do
- * not any shiftings, if we shift to left/right neighbor or to both.
- */
-struct virtual_item {
- int vi_index; /* Index in the array of item
- operations */
- unsigned short vi_type; /* Left/right mergeability */
- unsigned short vi_item_len; /* Length of item that it will
- have after balancing */
- struct item_head *vi_ih;
- const char *vi_item; /* Body of item (old or new) */
- const void *vi_new_data; /* 0 always but paste mode */
- void *vi_uarea; /* Item specific area */
-};
-
-struct virtual_node {
- char *vn_free_ptr; /* This is a pointer to the free space
- in the buffer */
- unsigned short vn_nr_item; /* Number of items in virtual node */
- short vn_size; /* Size of node , that node would have
- if it has unlimited size and no
- balancing is performed */
- short vn_mode; /* Mode of balancing (paste, insert,
- delete, cut) */
- short vn_affected_item_num;
- short vn_pos_in_item;
- struct item_head *vn_ins_ih; /* Item header of inserted item, 0 for
- other modes */
- const void *vn_data;
- struct virtual_item *vn_vi; /* Array of items (including a new one,
- excluding item to be deleted) */
-};
-
-/* Used by directory items when creating virtual nodes */
-struct direntry_uarea {
- int flags;
- uint16_t entry_count;
- uint16_t entry_sizes[1];
-} __packed;
-
-/* -------------------------------------------------------------------
- * Tree balance
- * -------------------------------------------------------------------*/
-
-struct reiserfs_iget_args {
- uint32_t objectid;
- uint32_t dirid;
-};
-
-struct item_operations {
- int (*bytes_number)(struct item_head * ih, int block_size);
- void (*decrement_key)(struct cpu_key *);
- int (*is_left_mergeable)(struct key * ih, unsigned long bsize);
- void (*print_item)(struct item_head *, char * item);
- void (*check_item)(struct item_head *, char * item);
-
- int (*create_vi)(struct virtual_node * vn,
- struct virtual_item * vi, int is_affected, int insert_size);
- int (*check_left)(struct virtual_item * vi, int free,
- int start_skip, int end_skip);
- int (*check_right)(struct virtual_item * vi, int free);
- int (*part_size)(struct virtual_item * vi, int from, int to);
- int (*unit_num)(struct virtual_item * vi);
- void (*print_vi)(struct virtual_item * vi);
-};
-
-extern struct item_operations *item_ops[TYPE_ANY + 1];
-
-#define op_bytes_number(ih, bsize) \
- item_ops[le_ih_k_type(ih)]->bytes_number(ih, bsize)
-
-#define COMP_KEYS comp_keys
-#define COMP_SHORT_KEYS comp_short_keys
-
-/* Get the item header */
-#define B_N_PITEM_HEAD(bp, item_num) \
- ((struct item_head *)((bp)->b_data + BLKH_SIZE) + (item_num))
-
-/* Get key */
-#define B_N_PDELIM_KEY(bp, item_num) \
- ((struct key *)((bp)->b_data + BLKH_SIZE) + (item_num))
-
-/* -------------------------------------------------------------------
- * Function declarations
- * -------------------------------------------------------------------*/
-
-/* reiserfs_stree.c */
-int B_IS_IN_TREE(const struct buf *p_s_bp);
-
-extern void copy_item_head(struct item_head * p_v_to,
- const struct item_head * p_v_from);
-
-extern int comp_keys(const struct key *le_key,
- const struct cpu_key *cpu_key);
-extern int comp_short_keys(const struct key *le_key,
- const struct cpu_key *cpu_key);
-
-extern int comp_le_keys(const struct key *, const struct key *);
-
-static inline int
-le_key_version(const struct key *key)
-{
- int type;
-
- type = offset_v2_k_type(&(key->u.k_offset_v2));
- if (type != TYPE_DIRECT && type != TYPE_INDIRECT &&
- type != TYPE_DIRENTRY)
- return (KEY_FORMAT_3_5);
-
- return (KEY_FORMAT_3_6);
-}
-
-static inline void
-copy_key(struct key *to, const struct key *from)
-{
-
- memcpy(to, from, KEY_SIZE);
-}
-
-const struct key *get_lkey(const struct path *p_s_chk_path,
- const struct reiserfs_sb_info *p_s_sbi);
-const struct key *get_rkey(const struct path *p_s_chk_path,
- const struct reiserfs_sb_info *p_s_sbi);
-inline int bin_search(const void * p_v_key, const void * p_v_base,
- int p_n_num, int p_n_width, int * p_n_pos);
-
-void pathrelse(struct path *p_s_search_path);
-int reiserfs_check_path(struct path *p);
-
-int search_by_key(struct reiserfs_sb_info *p_s_sbi,
- const struct cpu_key *p_s_key,
- struct path *p_s_search_path,
- int n_stop_level);
-#define search_item(sbi, key, path) \
- search_by_key(sbi, key, path, DISK_LEAF_NODE_LEVEL)
-int search_for_position_by_key(struct reiserfs_sb_info *p_s_sbi,
- const struct cpu_key *p_s_cpu_key,
- struct path *p_s_search_path);
-void decrement_counters_in_path(struct path *p_s_search_path);
-
-/* reiserfs_inode.c */
-vop_read_t reiserfs_read;
-vop_inactive_t reiserfs_inactive;
-vop_reclaim_t reiserfs_reclaim;
-
-int reiserfs_get_block(struct reiserfs_node *ip, long block,
- off_t offset, struct uio *uio);
-
-void make_cpu_key(struct cpu_key *cpu_key, struct reiserfs_node *ip,
- off_t offset, int type, int key_length);
-
-void reiserfs_read_locked_inode(struct reiserfs_node *ip,
- struct reiserfs_iget_args *args);
-int reiserfs_iget(struct mount *mp, const struct cpu_key *key,
- struct vnode **vpp, struct thread *td);
-
-void sd_attrs_to_i_attrs(uint16_t sd_attrs, struct reiserfs_node *ip);
-void i_attrs_to_sd_attrs(struct reiserfs_node *ip, uint16_t *sd_attrs);
-
-/* reiserfs_namei.c */
-vop_readdir_t reiserfs_readdir;
-vop_cachedlookup_t reiserfs_lookup;
-
-void set_de_name_and_namelen(struct reiserfs_dir_entry * de);
-int search_by_entry_key(struct reiserfs_sb_info *sbi,
- const struct cpu_key *key, struct path *path,
- struct reiserfs_dir_entry *de);
-
-/* reiserfs_prints.c */
-char *reiserfs_hashname(int code);
-void reiserfs_dump_buffer(caddr_t buf, off_t len);
-
-#if defined(REISERFS_DEBUG)
-#define reiserfs_log(lvl, fmt, ...) \
- log(lvl, "ReiserFS/%s: " fmt, __func__, ## __VA_ARGS__)
-#elif defined (REISERFS_DEBUG_CONS)
-#define reiserfs_log(lvl, fmt, ...) \
- printf("%s:%d: " fmt, __func__, __LINE__, ## __VA_ARGS__)
-#else
-#define reiserfs_log(lvl, fmt, ...)
-#endif
-
-#define reiserfs_log_0(lvl, fmt, ...) \
- printf("%s:%d: " fmt, __func__, __LINE__, ## __VA_ARGS__)
-
-/* reiserfs_hashes.c */
-uint32_t keyed_hash(const signed char *msg, int len);
-uint32_t yura_hash(const signed char *msg, int len);
-uint32_t r5_hash(const signed char *msg, int len);
-
-#define reiserfs_test_le_bit test_bit
-
-#endif /* !defined _GNU_REISERFS_REISERFS_FS_H */
OpenPOWER on IntegriCloud