162306a36Sopenharmony_ci/* -*- linux-c -*- */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* fs/reiserfs/procfs.c */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* proc info support a la one created by Sizif@Botik.RU for PGC */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/time.h> 1362306a36Sopenharmony_ci#include <linux/seq_file.h> 1462306a36Sopenharmony_ci#include <linux/uaccess.h> 1562306a36Sopenharmony_ci#include "reiserfs.h" 1662306a36Sopenharmony_ci#include <linux/init.h> 1762306a36Sopenharmony_ci#include <linux/proc_fs.h> 1862306a36Sopenharmony_ci#include <linux/blkdev.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* 2162306a36Sopenharmony_ci * LOCKING: 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * These guys are evicted from procfs as the very first step in ->kill_sb(). 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic int show_version(struct seq_file *m, void *unused) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci struct super_block *sb = m->private; 3062306a36Sopenharmony_ci char *format; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_6)) { 3362306a36Sopenharmony_ci format = "3.6"; 3462306a36Sopenharmony_ci } else if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_5)) { 3562306a36Sopenharmony_ci format = "3.5"; 3662306a36Sopenharmony_ci } else { 3762306a36Sopenharmony_ci format = "unknown"; 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci seq_printf(m, "%s format\twith checks %s\n", format, 4162306a36Sopenharmony_ci#if defined( CONFIG_REISERFS_CHECK ) 4262306a36Sopenharmony_ci "on" 4362306a36Sopenharmony_ci#else 4462306a36Sopenharmony_ci "off" 4562306a36Sopenharmony_ci#endif 4662306a36Sopenharmony_ci ); 4762306a36Sopenharmony_ci return 0; 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define SF( x ) ( r -> x ) 5162306a36Sopenharmony_ci#define SFP( x ) SF( s_proc_info_data.x ) 5262306a36Sopenharmony_ci#define SFPL( x ) SFP( x[ level ] ) 5362306a36Sopenharmony_ci#define SFPF( x ) SFP( scan_bitmap.x ) 5462306a36Sopenharmony_ci#define SFPJ( x ) SFP( journal.x ) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define D2C( x ) le16_to_cpu( x ) 5762306a36Sopenharmony_ci#define D4C( x ) le32_to_cpu( x ) 5862306a36Sopenharmony_ci#define DF( x ) D2C( rs -> s_v1.x ) 5962306a36Sopenharmony_ci#define DFL( x ) D4C( rs -> s_v1.x ) 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define objectid_map( s, rs ) (old_format_only (s) ? \ 6262306a36Sopenharmony_ci (__le32 *)((struct reiserfs_super_block_v1 *)rs + 1) : \ 6362306a36Sopenharmony_ci (__le32 *)(rs + 1)) 6462306a36Sopenharmony_ci#define MAP( i ) D4C( objectid_map( sb, rs )[ i ] ) 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define DJF( x ) le32_to_cpu( rs -> x ) 6762306a36Sopenharmony_ci#define DJP( x ) le32_to_cpu( jp -> x ) 6862306a36Sopenharmony_ci#define JF( x ) ( r -> s_journal -> x ) 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic int show_super(struct seq_file *m, void *unused) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci struct super_block *sb = m->private; 7362306a36Sopenharmony_ci struct reiserfs_sb_info *r = REISERFS_SB(sb); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci seq_printf(m, "state: \t%s\n" 7662306a36Sopenharmony_ci "mount options: \t%s%s%s%s%s%s%s%s%s%s%s\n" 7762306a36Sopenharmony_ci "gen. counter: \t%i\n" 7862306a36Sopenharmony_ci "s_disk_reads: \t%i\n" 7962306a36Sopenharmony_ci "s_disk_writes: \t%i\n" 8062306a36Sopenharmony_ci "s_fix_nodes: \t%i\n" 8162306a36Sopenharmony_ci "s_do_balance: \t%i\n" 8262306a36Sopenharmony_ci "s_unneeded_left_neighbor: \t%i\n" 8362306a36Sopenharmony_ci "s_good_search_by_key_reada: \t%i\n" 8462306a36Sopenharmony_ci "s_bmaps: \t%i\n" 8562306a36Sopenharmony_ci "s_bmaps_without_search: \t%i\n" 8662306a36Sopenharmony_ci "s_direct2indirect: \t%i\n" 8762306a36Sopenharmony_ci "s_indirect2direct: \t%i\n" 8862306a36Sopenharmony_ci "\n" 8962306a36Sopenharmony_ci "max_hash_collisions: \t%i\n" 9062306a36Sopenharmony_ci "breads: \t%lu\n" 9162306a36Sopenharmony_ci "bread_misses: \t%lu\n" 9262306a36Sopenharmony_ci "search_by_key: \t%lu\n" 9362306a36Sopenharmony_ci "search_by_key_fs_changed: \t%lu\n" 9462306a36Sopenharmony_ci "search_by_key_restarted: \t%lu\n" 9562306a36Sopenharmony_ci "insert_item_restarted: \t%lu\n" 9662306a36Sopenharmony_ci "paste_into_item_restarted: \t%lu\n" 9762306a36Sopenharmony_ci "cut_from_item_restarted: \t%lu\n" 9862306a36Sopenharmony_ci "delete_solid_item_restarted: \t%lu\n" 9962306a36Sopenharmony_ci "delete_item_restarted: \t%lu\n" 10062306a36Sopenharmony_ci "leaked_oid: \t%lu\n" 10162306a36Sopenharmony_ci "leaves_removable: \t%lu\n", 10262306a36Sopenharmony_ci SF(s_mount_state) == REISERFS_VALID_FS ? 10362306a36Sopenharmony_ci "REISERFS_VALID_FS" : "REISERFS_ERROR_FS", 10462306a36Sopenharmony_ci reiserfs_r5_hash(sb) ? "FORCE_R5 " : "", 10562306a36Sopenharmony_ci reiserfs_rupasov_hash(sb) ? "FORCE_RUPASOV " : "", 10662306a36Sopenharmony_ci reiserfs_tea_hash(sb) ? "FORCE_TEA " : "", 10762306a36Sopenharmony_ci reiserfs_hash_detect(sb) ? "DETECT_HASH " : "", 10862306a36Sopenharmony_ci reiserfs_no_border(sb) ? "NO_BORDER " : "BORDER ", 10962306a36Sopenharmony_ci reiserfs_no_unhashed_relocation(sb) ? 11062306a36Sopenharmony_ci "NO_UNHASHED_RELOCATION " : "", 11162306a36Sopenharmony_ci reiserfs_hashed_relocation(sb) ? "UNHASHED_RELOCATION " : "", 11262306a36Sopenharmony_ci reiserfs_test4(sb) ? "TEST4 " : "", 11362306a36Sopenharmony_ci have_large_tails(sb) ? "TAILS " : have_small_tails(sb) ? 11462306a36Sopenharmony_ci "SMALL_TAILS " : "NO_TAILS ", 11562306a36Sopenharmony_ci replay_only(sb) ? "REPLAY_ONLY " : "", 11662306a36Sopenharmony_ci convert_reiserfs(sb) ? "CONV " : "", 11762306a36Sopenharmony_ci atomic_read(&r->s_generation_counter), 11862306a36Sopenharmony_ci SF(s_disk_reads), SF(s_disk_writes), SF(s_fix_nodes), 11962306a36Sopenharmony_ci SF(s_do_balance), SF(s_unneeded_left_neighbor), 12062306a36Sopenharmony_ci SF(s_good_search_by_key_reada), SF(s_bmaps), 12162306a36Sopenharmony_ci SF(s_bmaps_without_search), SF(s_direct2indirect), 12262306a36Sopenharmony_ci SF(s_indirect2direct), SFP(max_hash_collisions), SFP(breads), 12362306a36Sopenharmony_ci SFP(bread_miss), SFP(search_by_key), 12462306a36Sopenharmony_ci SFP(search_by_key_fs_changed), SFP(search_by_key_restarted), 12562306a36Sopenharmony_ci SFP(insert_item_restarted), SFP(paste_into_item_restarted), 12662306a36Sopenharmony_ci SFP(cut_from_item_restarted), 12762306a36Sopenharmony_ci SFP(delete_solid_item_restarted), SFP(delete_item_restarted), 12862306a36Sopenharmony_ci SFP(leaked_oid), SFP(leaves_removable)); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci return 0; 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic int show_per_level(struct seq_file *m, void *unused) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci struct super_block *sb = m->private; 13662306a36Sopenharmony_ci struct reiserfs_sb_info *r = REISERFS_SB(sb); 13762306a36Sopenharmony_ci int level; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci seq_printf(m, "level\t" 14062306a36Sopenharmony_ci " balances" 14162306a36Sopenharmony_ci " [sbk: reads" 14262306a36Sopenharmony_ci " fs_changed" 14362306a36Sopenharmony_ci " restarted]" 14462306a36Sopenharmony_ci " free space" 14562306a36Sopenharmony_ci " items" 14662306a36Sopenharmony_ci " can_remove" 14762306a36Sopenharmony_ci " lnum" 14862306a36Sopenharmony_ci " rnum" 14962306a36Sopenharmony_ci " lbytes" 15062306a36Sopenharmony_ci " rbytes" 15162306a36Sopenharmony_ci " get_neig" 15262306a36Sopenharmony_ci " get_neig_res" " need_l_neig" " need_r_neig" "\n"); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci for (level = 0; level < MAX_HEIGHT; ++level) { 15562306a36Sopenharmony_ci seq_printf(m, "%i\t" 15662306a36Sopenharmony_ci " %12lu" 15762306a36Sopenharmony_ci " %12lu" 15862306a36Sopenharmony_ci " %12lu" 15962306a36Sopenharmony_ci " %12lu" 16062306a36Sopenharmony_ci " %12lu" 16162306a36Sopenharmony_ci " %12lu" 16262306a36Sopenharmony_ci " %12lu" 16362306a36Sopenharmony_ci " %12li" 16462306a36Sopenharmony_ci " %12li" 16562306a36Sopenharmony_ci " %12li" 16662306a36Sopenharmony_ci " %12li" 16762306a36Sopenharmony_ci " %12lu" 16862306a36Sopenharmony_ci " %12lu" 16962306a36Sopenharmony_ci " %12lu" 17062306a36Sopenharmony_ci " %12lu" 17162306a36Sopenharmony_ci "\n", 17262306a36Sopenharmony_ci level, 17362306a36Sopenharmony_ci SFPL(balance_at), 17462306a36Sopenharmony_ci SFPL(sbk_read_at), 17562306a36Sopenharmony_ci SFPL(sbk_fs_changed), 17662306a36Sopenharmony_ci SFPL(sbk_restarted), 17762306a36Sopenharmony_ci SFPL(free_at), 17862306a36Sopenharmony_ci SFPL(items_at), 17962306a36Sopenharmony_ci SFPL(can_node_be_removed), 18062306a36Sopenharmony_ci SFPL(lnum), 18162306a36Sopenharmony_ci SFPL(rnum), 18262306a36Sopenharmony_ci SFPL(lbytes), 18362306a36Sopenharmony_ci SFPL(rbytes), 18462306a36Sopenharmony_ci SFPL(get_neighbors), 18562306a36Sopenharmony_ci SFPL(get_neighbors_restart), 18662306a36Sopenharmony_ci SFPL(need_l_neighbor), SFPL(need_r_neighbor) 18762306a36Sopenharmony_ci ); 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci return 0; 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic int show_bitmap(struct seq_file *m, void *unused) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci struct super_block *sb = m->private; 19562306a36Sopenharmony_ci struct reiserfs_sb_info *r = REISERFS_SB(sb); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci seq_printf(m, "free_block: %lu\n" 19862306a36Sopenharmony_ci " scan_bitmap:" 19962306a36Sopenharmony_ci " wait" 20062306a36Sopenharmony_ci " bmap" 20162306a36Sopenharmony_ci " retry" 20262306a36Sopenharmony_ci " stolen" 20362306a36Sopenharmony_ci " journal_hint" 20462306a36Sopenharmony_ci "journal_nohint" 20562306a36Sopenharmony_ci "\n" 20662306a36Sopenharmony_ci " %14lu" 20762306a36Sopenharmony_ci " %14lu" 20862306a36Sopenharmony_ci " %14lu" 20962306a36Sopenharmony_ci " %14lu" 21062306a36Sopenharmony_ci " %14lu" 21162306a36Sopenharmony_ci " %14lu" 21262306a36Sopenharmony_ci " %14lu" 21362306a36Sopenharmony_ci "\n", 21462306a36Sopenharmony_ci SFP(free_block), 21562306a36Sopenharmony_ci SFPF(call), 21662306a36Sopenharmony_ci SFPF(wait), 21762306a36Sopenharmony_ci SFPF(bmap), 21862306a36Sopenharmony_ci SFPF(retry), 21962306a36Sopenharmony_ci SFPF(stolen), 22062306a36Sopenharmony_ci SFPF(in_journal_hint), SFPF(in_journal_nohint)); 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci return 0; 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic int show_on_disk_super(struct seq_file *m, void *unused) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci struct super_block *sb = m->private; 22862306a36Sopenharmony_ci struct reiserfs_sb_info *sb_info = REISERFS_SB(sb); 22962306a36Sopenharmony_ci struct reiserfs_super_block *rs = sb_info->s_rs; 23062306a36Sopenharmony_ci int hash_code = DFL(s_hash_function_code); 23162306a36Sopenharmony_ci __u32 flags = DJF(s_flags); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci seq_printf(m, "block_count: \t%i\n" 23462306a36Sopenharmony_ci "free_blocks: \t%i\n" 23562306a36Sopenharmony_ci "root_block: \t%i\n" 23662306a36Sopenharmony_ci "blocksize: \t%i\n" 23762306a36Sopenharmony_ci "oid_maxsize: \t%i\n" 23862306a36Sopenharmony_ci "oid_cursize: \t%i\n" 23962306a36Sopenharmony_ci "umount_state: \t%i\n" 24062306a36Sopenharmony_ci "magic: \t%10.10s\n" 24162306a36Sopenharmony_ci "fs_state: \t%i\n" 24262306a36Sopenharmony_ci "hash: \t%s\n" 24362306a36Sopenharmony_ci "tree_height: \t%i\n" 24462306a36Sopenharmony_ci "bmap_nr: \t%i\n" 24562306a36Sopenharmony_ci "version: \t%i\n" 24662306a36Sopenharmony_ci "flags: \t%x[%s]\n" 24762306a36Sopenharmony_ci "reserved_for_journal: \t%i\n", 24862306a36Sopenharmony_ci DFL(s_block_count), 24962306a36Sopenharmony_ci DFL(s_free_blocks), 25062306a36Sopenharmony_ci DFL(s_root_block), 25162306a36Sopenharmony_ci DF(s_blocksize), 25262306a36Sopenharmony_ci DF(s_oid_maxsize), 25362306a36Sopenharmony_ci DF(s_oid_cursize), 25462306a36Sopenharmony_ci DF(s_umount_state), 25562306a36Sopenharmony_ci rs->s_v1.s_magic, 25662306a36Sopenharmony_ci DF(s_fs_state), 25762306a36Sopenharmony_ci hash_code == TEA_HASH ? "tea" : 25862306a36Sopenharmony_ci (hash_code == YURA_HASH) ? "rupasov" : 25962306a36Sopenharmony_ci (hash_code == R5_HASH) ? "r5" : 26062306a36Sopenharmony_ci (hash_code == UNSET_HASH) ? "unset" : "unknown", 26162306a36Sopenharmony_ci DF(s_tree_height), 26262306a36Sopenharmony_ci DF(s_bmap_nr), 26362306a36Sopenharmony_ci DF(s_version), flags, (flags & reiserfs_attrs_cleared) 26462306a36Sopenharmony_ci ? "attrs_cleared" : "", DF(s_reserved_for_journal)); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci return 0; 26762306a36Sopenharmony_ci} 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_cistatic int show_oidmap(struct seq_file *m, void *unused) 27062306a36Sopenharmony_ci{ 27162306a36Sopenharmony_ci struct super_block *sb = m->private; 27262306a36Sopenharmony_ci struct reiserfs_sb_info *sb_info = REISERFS_SB(sb); 27362306a36Sopenharmony_ci struct reiserfs_super_block *rs = sb_info->s_rs; 27462306a36Sopenharmony_ci unsigned int mapsize = le16_to_cpu(rs->s_v1.s_oid_cursize); 27562306a36Sopenharmony_ci unsigned long total_used = 0; 27662306a36Sopenharmony_ci int i; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci for (i = 0; i < mapsize; ++i) { 27962306a36Sopenharmony_ci __u32 right; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci right = (i == mapsize - 1) ? MAX_KEY_OBJECTID : MAP(i + 1); 28262306a36Sopenharmony_ci seq_printf(m, "%s: [ %x .. %x )\n", 28362306a36Sopenharmony_ci (i & 1) ? "free" : "used", MAP(i), right); 28462306a36Sopenharmony_ci if (!(i & 1)) { 28562306a36Sopenharmony_ci total_used += right - MAP(i); 28662306a36Sopenharmony_ci } 28762306a36Sopenharmony_ci } 28862306a36Sopenharmony_ci#if defined( REISERFS_USE_OIDMAPF ) 28962306a36Sopenharmony_ci if (sb_info->oidmap.use_file && (sb_info->oidmap.mapf != NULL)) { 29062306a36Sopenharmony_ci loff_t size = file_inode(sb_info->oidmap.mapf)->i_size; 29162306a36Sopenharmony_ci total_used += size / sizeof(reiserfs_oidinterval_d_t); 29262306a36Sopenharmony_ci } 29362306a36Sopenharmony_ci#endif 29462306a36Sopenharmony_ci seq_printf(m, "total: \t%i [%i/%i] used: %lu [exact]\n", 29562306a36Sopenharmony_ci mapsize, 29662306a36Sopenharmony_ci mapsize, le16_to_cpu(rs->s_v1.s_oid_maxsize), total_used); 29762306a36Sopenharmony_ci return 0; 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistatic time64_t ktime_mono_to_real_seconds(time64_t mono) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci ktime_t kt = ktime_set(mono, NSEC_PER_SEC/2); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci return ktime_divns(ktime_mono_to_real(kt), NSEC_PER_SEC); 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic int show_journal(struct seq_file *m, void *unused) 30862306a36Sopenharmony_ci{ 30962306a36Sopenharmony_ci struct super_block *sb = m->private; 31062306a36Sopenharmony_ci struct reiserfs_sb_info *r = REISERFS_SB(sb); 31162306a36Sopenharmony_ci struct reiserfs_super_block *rs = r->s_rs; 31262306a36Sopenharmony_ci struct journal_params *jp = &rs->s_v1.s_journal; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci seq_printf(m, /* on-disk fields */ 31562306a36Sopenharmony_ci "jp_journal_1st_block: \t%i\n" 31662306a36Sopenharmony_ci "jp_journal_dev: \t%pg[%x]\n" 31762306a36Sopenharmony_ci "jp_journal_size: \t%i\n" 31862306a36Sopenharmony_ci "jp_journal_trans_max: \t%i\n" 31962306a36Sopenharmony_ci "jp_journal_magic: \t%i\n" 32062306a36Sopenharmony_ci "jp_journal_max_batch: \t%i\n" 32162306a36Sopenharmony_ci "jp_journal_max_commit_age: \t%i\n" 32262306a36Sopenharmony_ci "jp_journal_max_trans_age: \t%i\n" 32362306a36Sopenharmony_ci /* incore fields */ 32462306a36Sopenharmony_ci "j_1st_reserved_block: \t%i\n" 32562306a36Sopenharmony_ci "j_state: \t%li\n" 32662306a36Sopenharmony_ci "j_trans_id: \t%u\n" 32762306a36Sopenharmony_ci "j_mount_id: \t%lu\n" 32862306a36Sopenharmony_ci "j_start: \t%lu\n" 32962306a36Sopenharmony_ci "j_len: \t%lu\n" 33062306a36Sopenharmony_ci "j_len_alloc: \t%lu\n" 33162306a36Sopenharmony_ci "j_wcount: \t%i\n" 33262306a36Sopenharmony_ci "j_bcount: \t%lu\n" 33362306a36Sopenharmony_ci "j_first_unflushed_offset: \t%lu\n" 33462306a36Sopenharmony_ci "j_last_flush_trans_id: \t%u\n" 33562306a36Sopenharmony_ci "j_trans_start_time: \t%lli\n" 33662306a36Sopenharmony_ci "j_list_bitmap_index: \t%i\n" 33762306a36Sopenharmony_ci "j_must_wait: \t%i\n" 33862306a36Sopenharmony_ci "j_next_full_flush: \t%i\n" 33962306a36Sopenharmony_ci "j_next_async_flush: \t%i\n" 34062306a36Sopenharmony_ci "j_cnode_used: \t%i\n" "j_cnode_free: \t%i\n" "\n" 34162306a36Sopenharmony_ci /* reiserfs_proc_info_data_t.journal fields */ 34262306a36Sopenharmony_ci "in_journal: \t%12lu\n" 34362306a36Sopenharmony_ci "in_journal_bitmap: \t%12lu\n" 34462306a36Sopenharmony_ci "in_journal_reusable: \t%12lu\n" 34562306a36Sopenharmony_ci "lock_journal: \t%12lu\n" 34662306a36Sopenharmony_ci "lock_journal_wait: \t%12lu\n" 34762306a36Sopenharmony_ci "journal_begin: \t%12lu\n" 34862306a36Sopenharmony_ci "journal_relock_writers: \t%12lu\n" 34962306a36Sopenharmony_ci "journal_relock_wcount: \t%12lu\n" 35062306a36Sopenharmony_ci "mark_dirty: \t%12lu\n" 35162306a36Sopenharmony_ci "mark_dirty_already: \t%12lu\n" 35262306a36Sopenharmony_ci "mark_dirty_notjournal: \t%12lu\n" 35362306a36Sopenharmony_ci "restore_prepared: \t%12lu\n" 35462306a36Sopenharmony_ci "prepare: \t%12lu\n" 35562306a36Sopenharmony_ci "prepare_retry: \t%12lu\n", 35662306a36Sopenharmony_ci DJP(jp_journal_1st_block), 35762306a36Sopenharmony_ci SB_JOURNAL(sb)->j_dev_bd, 35862306a36Sopenharmony_ci DJP(jp_journal_dev), 35962306a36Sopenharmony_ci DJP(jp_journal_size), 36062306a36Sopenharmony_ci DJP(jp_journal_trans_max), 36162306a36Sopenharmony_ci DJP(jp_journal_magic), 36262306a36Sopenharmony_ci DJP(jp_journal_max_batch), 36362306a36Sopenharmony_ci SB_JOURNAL(sb)->j_max_commit_age, 36462306a36Sopenharmony_ci DJP(jp_journal_max_trans_age), 36562306a36Sopenharmony_ci JF(j_1st_reserved_block), 36662306a36Sopenharmony_ci JF(j_state), 36762306a36Sopenharmony_ci JF(j_trans_id), 36862306a36Sopenharmony_ci JF(j_mount_id), 36962306a36Sopenharmony_ci JF(j_start), 37062306a36Sopenharmony_ci JF(j_len), 37162306a36Sopenharmony_ci JF(j_len_alloc), 37262306a36Sopenharmony_ci atomic_read(&r->s_journal->j_wcount), 37362306a36Sopenharmony_ci JF(j_bcount), 37462306a36Sopenharmony_ci JF(j_first_unflushed_offset), 37562306a36Sopenharmony_ci JF(j_last_flush_trans_id), 37662306a36Sopenharmony_ci ktime_mono_to_real_seconds(JF(j_trans_start_time)), 37762306a36Sopenharmony_ci JF(j_list_bitmap_index), 37862306a36Sopenharmony_ci JF(j_must_wait), 37962306a36Sopenharmony_ci JF(j_next_full_flush), 38062306a36Sopenharmony_ci JF(j_next_async_flush), 38162306a36Sopenharmony_ci JF(j_cnode_used), 38262306a36Sopenharmony_ci JF(j_cnode_free), 38362306a36Sopenharmony_ci SFPJ(in_journal), 38462306a36Sopenharmony_ci SFPJ(in_journal_bitmap), 38562306a36Sopenharmony_ci SFPJ(in_journal_reusable), 38662306a36Sopenharmony_ci SFPJ(lock_journal), 38762306a36Sopenharmony_ci SFPJ(lock_journal_wait), 38862306a36Sopenharmony_ci SFPJ(journal_being), 38962306a36Sopenharmony_ci SFPJ(journal_relock_writers), 39062306a36Sopenharmony_ci SFPJ(journal_relock_wcount), 39162306a36Sopenharmony_ci SFPJ(mark_dirty), 39262306a36Sopenharmony_ci SFPJ(mark_dirty_already), 39362306a36Sopenharmony_ci SFPJ(mark_dirty_notjournal), 39462306a36Sopenharmony_ci SFPJ(restore_prepared), SFPJ(prepare), SFPJ(prepare_retry) 39562306a36Sopenharmony_ci ); 39662306a36Sopenharmony_ci return 0; 39762306a36Sopenharmony_ci} 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic struct proc_dir_entry *proc_info_root = NULL; 40062306a36Sopenharmony_cistatic const char proc_info_root_name[] = "fs/reiserfs"; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic void add_file(struct super_block *sb, char *name, 40362306a36Sopenharmony_ci int (*func) (struct seq_file *, void *)) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci proc_create_single_data(name, 0, REISERFS_SB(sb)->procdir, func, sb); 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ciint reiserfs_proc_info_init(struct super_block *sb) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci char b[BDEVNAME_SIZE]; 41162306a36Sopenharmony_ci char *s; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci /* Some block devices use /'s */ 41462306a36Sopenharmony_ci strscpy(b, sb->s_id, BDEVNAME_SIZE); 41562306a36Sopenharmony_ci s = strchr(b, '/'); 41662306a36Sopenharmony_ci if (s) 41762306a36Sopenharmony_ci *s = '!'; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci spin_lock_init(&__PINFO(sb).lock); 42062306a36Sopenharmony_ci REISERFS_SB(sb)->procdir = proc_mkdir_data(b, 0, proc_info_root, sb); 42162306a36Sopenharmony_ci if (REISERFS_SB(sb)->procdir) { 42262306a36Sopenharmony_ci add_file(sb, "version", show_version); 42362306a36Sopenharmony_ci add_file(sb, "super", show_super); 42462306a36Sopenharmony_ci add_file(sb, "per-level", show_per_level); 42562306a36Sopenharmony_ci add_file(sb, "bitmap", show_bitmap); 42662306a36Sopenharmony_ci add_file(sb, "on-disk-super", show_on_disk_super); 42762306a36Sopenharmony_ci add_file(sb, "oidmap", show_oidmap); 42862306a36Sopenharmony_ci add_file(sb, "journal", show_journal); 42962306a36Sopenharmony_ci return 0; 43062306a36Sopenharmony_ci } 43162306a36Sopenharmony_ci reiserfs_warning(sb, "cannot create /proc/%s/%s", 43262306a36Sopenharmony_ci proc_info_root_name, b); 43362306a36Sopenharmony_ci return 1; 43462306a36Sopenharmony_ci} 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ciint reiserfs_proc_info_done(struct super_block *sb) 43762306a36Sopenharmony_ci{ 43862306a36Sopenharmony_ci struct proc_dir_entry *de = REISERFS_SB(sb)->procdir; 43962306a36Sopenharmony_ci if (de) { 44062306a36Sopenharmony_ci char b[BDEVNAME_SIZE]; 44162306a36Sopenharmony_ci char *s; 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci /* Some block devices use /'s */ 44462306a36Sopenharmony_ci strscpy(b, sb->s_id, BDEVNAME_SIZE); 44562306a36Sopenharmony_ci s = strchr(b, '/'); 44662306a36Sopenharmony_ci if (s) 44762306a36Sopenharmony_ci *s = '!'; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci remove_proc_subtree(b, proc_info_root); 45062306a36Sopenharmony_ci REISERFS_SB(sb)->procdir = NULL; 45162306a36Sopenharmony_ci } 45262306a36Sopenharmony_ci return 0; 45362306a36Sopenharmony_ci} 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ciint reiserfs_proc_info_global_init(void) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci if (proc_info_root == NULL) { 45862306a36Sopenharmony_ci proc_info_root = proc_mkdir(proc_info_root_name, NULL); 45962306a36Sopenharmony_ci if (!proc_info_root) { 46062306a36Sopenharmony_ci reiserfs_warning(NULL, "cannot create /proc/%s", 46162306a36Sopenharmony_ci proc_info_root_name); 46262306a36Sopenharmony_ci return 1; 46362306a36Sopenharmony_ci } 46462306a36Sopenharmony_ci } 46562306a36Sopenharmony_ci return 0; 46662306a36Sopenharmony_ci} 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ciint reiserfs_proc_info_global_done(void) 46962306a36Sopenharmony_ci{ 47062306a36Sopenharmony_ci if (proc_info_root != NULL) { 47162306a36Sopenharmony_ci proc_info_root = NULL; 47262306a36Sopenharmony_ci remove_proc_entry(proc_info_root_name, NULL); 47362306a36Sopenharmony_ci } 47462306a36Sopenharmony_ci return 0; 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci/* 47762306a36Sopenharmony_ci * Revision 1.1.8.2 2001/07/15 17:08:42 god 47862306a36Sopenharmony_ci * . use get_super() in procfs.c 47962306a36Sopenharmony_ci * . remove remove_save_link() from reiserfs_do_truncate() 48062306a36Sopenharmony_ci * 48162306a36Sopenharmony_ci * I accept terms and conditions stated in the Legal Agreement 48262306a36Sopenharmony_ci * (available at http://www.namesys.com/legalese.html) 48362306a36Sopenharmony_ci * 48462306a36Sopenharmony_ci * Revision 1.1.8.1 2001/07/11 16:48:50 god 48562306a36Sopenharmony_ci * proc info support 48662306a36Sopenharmony_ci * 48762306a36Sopenharmony_ci * I accept terms and conditions stated in the Legal Agreement 48862306a36Sopenharmony_ci * (available at http://www.namesys.com/legalese.html) 48962306a36Sopenharmony_ci * 49062306a36Sopenharmony_ci */ 491