Imported reiserfsprogs-3.6.20
This commit is contained in:
1 parent
0ed773997f
commit
dac518d099
189 files changed
+43353
-29787
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user