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