/* * 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