xref: /OK3568_Linux_fs/kernel/fs/reiserfs/procfs.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* -*- linux-c -*- */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun /* fs/reiserfs/procfs.c */
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /* proc info support a la one created by Sizif@Botik.RU for PGC */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/time.h>
13*4882a593Smuzhiyun #include <linux/seq_file.h>
14*4882a593Smuzhiyun #include <linux/uaccess.h>
15*4882a593Smuzhiyun #include "reiserfs.h"
16*4882a593Smuzhiyun #include <linux/init.h>
17*4882a593Smuzhiyun #include <linux/proc_fs.h>
18*4882a593Smuzhiyun #include <linux/blkdev.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun  * LOCKING:
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * These guys are evicted from procfs as the very first step in ->kill_sb().
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  */
26*4882a593Smuzhiyun 
show_version(struct seq_file * m,void * unused)27*4882a593Smuzhiyun static int show_version(struct seq_file *m, void *unused)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	struct super_block *sb = m->private;
30*4882a593Smuzhiyun 	char *format;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_6)) {
33*4882a593Smuzhiyun 		format = "3.6";
34*4882a593Smuzhiyun 	} else if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_5)) {
35*4882a593Smuzhiyun 		format = "3.5";
36*4882a593Smuzhiyun 	} else {
37*4882a593Smuzhiyun 		format = "unknown";
38*4882a593Smuzhiyun 	}
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	seq_printf(m, "%s format\twith checks %s\n", format,
41*4882a593Smuzhiyun #if defined( CONFIG_REISERFS_CHECK )
42*4882a593Smuzhiyun 		   "on"
43*4882a593Smuzhiyun #else
44*4882a593Smuzhiyun 		   "off"
45*4882a593Smuzhiyun #endif
46*4882a593Smuzhiyun 	    );
47*4882a593Smuzhiyun 	return 0;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define SF( x ) ( r -> x )
51*4882a593Smuzhiyun #define SFP( x ) SF( s_proc_info_data.x )
52*4882a593Smuzhiyun #define SFPL( x ) SFP( x[ level ] )
53*4882a593Smuzhiyun #define SFPF( x ) SFP( scan_bitmap.x )
54*4882a593Smuzhiyun #define SFPJ( x ) SFP( journal.x )
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define D2C( x ) le16_to_cpu( x )
57*4882a593Smuzhiyun #define D4C( x ) le32_to_cpu( x )
58*4882a593Smuzhiyun #define DF( x ) D2C( rs -> s_v1.x )
59*4882a593Smuzhiyun #define DFL( x ) D4C( rs -> s_v1.x )
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define objectid_map( s, rs ) (old_format_only (s) ?				\
62*4882a593Smuzhiyun                          (__le32 *)((struct reiserfs_super_block_v1 *)rs + 1) :	\
63*4882a593Smuzhiyun 			 (__le32 *)(rs + 1))
64*4882a593Smuzhiyun #define MAP( i ) D4C( objectid_map( sb, rs )[ i ] )
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define DJF( x ) le32_to_cpu( rs -> x )
67*4882a593Smuzhiyun #define DJP( x ) le32_to_cpu( jp -> x )
68*4882a593Smuzhiyun #define JF( x ) ( r -> s_journal -> x )
69*4882a593Smuzhiyun 
show_super(struct seq_file * m,void * unused)70*4882a593Smuzhiyun static int show_super(struct seq_file *m, void *unused)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	struct super_block *sb = m->private;
73*4882a593Smuzhiyun 	struct reiserfs_sb_info *r = REISERFS_SB(sb);
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	seq_printf(m, "state: \t%s\n"
76*4882a593Smuzhiyun 		   "mount options: \t%s%s%s%s%s%s%s%s%s%s%s\n"
77*4882a593Smuzhiyun 		   "gen. counter: \t%i\n"
78*4882a593Smuzhiyun 		   "s_disk_reads: \t%i\n"
79*4882a593Smuzhiyun 		   "s_disk_writes: \t%i\n"
80*4882a593Smuzhiyun 		   "s_fix_nodes: \t%i\n"
81*4882a593Smuzhiyun 		   "s_do_balance: \t%i\n"
82*4882a593Smuzhiyun 		   "s_unneeded_left_neighbor: \t%i\n"
83*4882a593Smuzhiyun 		   "s_good_search_by_key_reada: \t%i\n"
84*4882a593Smuzhiyun 		   "s_bmaps: \t%i\n"
85*4882a593Smuzhiyun 		   "s_bmaps_without_search: \t%i\n"
86*4882a593Smuzhiyun 		   "s_direct2indirect: \t%i\n"
87*4882a593Smuzhiyun 		   "s_indirect2direct: \t%i\n"
88*4882a593Smuzhiyun 		   "\n"
89*4882a593Smuzhiyun 		   "max_hash_collisions: \t%i\n"
90*4882a593Smuzhiyun 		   "breads: \t%lu\n"
91*4882a593Smuzhiyun 		   "bread_misses: \t%lu\n"
92*4882a593Smuzhiyun 		   "search_by_key: \t%lu\n"
93*4882a593Smuzhiyun 		   "search_by_key_fs_changed: \t%lu\n"
94*4882a593Smuzhiyun 		   "search_by_key_restarted: \t%lu\n"
95*4882a593Smuzhiyun 		   "insert_item_restarted: \t%lu\n"
96*4882a593Smuzhiyun 		   "paste_into_item_restarted: \t%lu\n"
97*4882a593Smuzhiyun 		   "cut_from_item_restarted: \t%lu\n"
98*4882a593Smuzhiyun 		   "delete_solid_item_restarted: \t%lu\n"
99*4882a593Smuzhiyun 		   "delete_item_restarted: \t%lu\n"
100*4882a593Smuzhiyun 		   "leaked_oid: \t%lu\n"
101*4882a593Smuzhiyun 		   "leaves_removable: \t%lu\n",
102*4882a593Smuzhiyun 		   SF(s_mount_state) == REISERFS_VALID_FS ?
103*4882a593Smuzhiyun 		   "REISERFS_VALID_FS" : "REISERFS_ERROR_FS",
104*4882a593Smuzhiyun 		   reiserfs_r5_hash(sb) ? "FORCE_R5 " : "",
105*4882a593Smuzhiyun 		   reiserfs_rupasov_hash(sb) ? "FORCE_RUPASOV " : "",
106*4882a593Smuzhiyun 		   reiserfs_tea_hash(sb) ? "FORCE_TEA " : "",
107*4882a593Smuzhiyun 		   reiserfs_hash_detect(sb) ? "DETECT_HASH " : "",
108*4882a593Smuzhiyun 		   reiserfs_no_border(sb) ? "NO_BORDER " : "BORDER ",
109*4882a593Smuzhiyun 		   reiserfs_no_unhashed_relocation(sb) ?
110*4882a593Smuzhiyun 		   "NO_UNHASHED_RELOCATION " : "",
111*4882a593Smuzhiyun 		   reiserfs_hashed_relocation(sb) ? "UNHASHED_RELOCATION " : "",
112*4882a593Smuzhiyun 		   reiserfs_test4(sb) ? "TEST4 " : "",
113*4882a593Smuzhiyun 		   have_large_tails(sb) ? "TAILS " : have_small_tails(sb) ?
114*4882a593Smuzhiyun 		   "SMALL_TAILS " : "NO_TAILS ",
115*4882a593Smuzhiyun 		   replay_only(sb) ? "REPLAY_ONLY " : "",
116*4882a593Smuzhiyun 		   convert_reiserfs(sb) ? "CONV " : "",
117*4882a593Smuzhiyun 		   atomic_read(&r->s_generation_counter),
118*4882a593Smuzhiyun 		   SF(s_disk_reads), SF(s_disk_writes), SF(s_fix_nodes),
119*4882a593Smuzhiyun 		   SF(s_do_balance), SF(s_unneeded_left_neighbor),
120*4882a593Smuzhiyun 		   SF(s_good_search_by_key_reada), SF(s_bmaps),
121*4882a593Smuzhiyun 		   SF(s_bmaps_without_search), SF(s_direct2indirect),
122*4882a593Smuzhiyun 		   SF(s_indirect2direct), SFP(max_hash_collisions), SFP(breads),
123*4882a593Smuzhiyun 		   SFP(bread_miss), SFP(search_by_key),
124*4882a593Smuzhiyun 		   SFP(search_by_key_fs_changed), SFP(search_by_key_restarted),
125*4882a593Smuzhiyun 		   SFP(insert_item_restarted), SFP(paste_into_item_restarted),
126*4882a593Smuzhiyun 		   SFP(cut_from_item_restarted),
127*4882a593Smuzhiyun 		   SFP(delete_solid_item_restarted), SFP(delete_item_restarted),
128*4882a593Smuzhiyun 		   SFP(leaked_oid), SFP(leaves_removable));
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	return 0;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun 
show_per_level(struct seq_file * m,void * unused)133*4882a593Smuzhiyun static int show_per_level(struct seq_file *m, void *unused)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun 	struct super_block *sb = m->private;
136*4882a593Smuzhiyun 	struct reiserfs_sb_info *r = REISERFS_SB(sb);
137*4882a593Smuzhiyun 	int level;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	seq_printf(m, "level\t"
140*4882a593Smuzhiyun 		   "     balances"
141*4882a593Smuzhiyun 		   " [sbk:  reads"
142*4882a593Smuzhiyun 		   "   fs_changed"
143*4882a593Smuzhiyun 		   "   restarted]"
144*4882a593Smuzhiyun 		   "   free space"
145*4882a593Smuzhiyun 		   "        items"
146*4882a593Smuzhiyun 		   "   can_remove"
147*4882a593Smuzhiyun 		   "         lnum"
148*4882a593Smuzhiyun 		   "         rnum"
149*4882a593Smuzhiyun 		   "       lbytes"
150*4882a593Smuzhiyun 		   "       rbytes"
151*4882a593Smuzhiyun 		   "     get_neig"
152*4882a593Smuzhiyun 		   " get_neig_res" "  need_l_neig" "  need_r_neig" "\n");
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	for (level = 0; level < MAX_HEIGHT; ++level) {
155*4882a593Smuzhiyun 		seq_printf(m, "%i\t"
156*4882a593Smuzhiyun 			   " %12lu"
157*4882a593Smuzhiyun 			   " %12lu"
158*4882a593Smuzhiyun 			   " %12lu"
159*4882a593Smuzhiyun 			   " %12lu"
160*4882a593Smuzhiyun 			   " %12lu"
161*4882a593Smuzhiyun 			   " %12lu"
162*4882a593Smuzhiyun 			   " %12lu"
163*4882a593Smuzhiyun 			   " %12li"
164*4882a593Smuzhiyun 			   " %12li"
165*4882a593Smuzhiyun 			   " %12li"
166*4882a593Smuzhiyun 			   " %12li"
167*4882a593Smuzhiyun 			   " %12lu"
168*4882a593Smuzhiyun 			   " %12lu"
169*4882a593Smuzhiyun 			   " %12lu"
170*4882a593Smuzhiyun 			   " %12lu"
171*4882a593Smuzhiyun 			   "\n",
172*4882a593Smuzhiyun 			   level,
173*4882a593Smuzhiyun 			   SFPL(balance_at),
174*4882a593Smuzhiyun 			   SFPL(sbk_read_at),
175*4882a593Smuzhiyun 			   SFPL(sbk_fs_changed),
176*4882a593Smuzhiyun 			   SFPL(sbk_restarted),
177*4882a593Smuzhiyun 			   SFPL(free_at),
178*4882a593Smuzhiyun 			   SFPL(items_at),
179*4882a593Smuzhiyun 			   SFPL(can_node_be_removed),
180*4882a593Smuzhiyun 			   SFPL(lnum),
181*4882a593Smuzhiyun 			   SFPL(rnum),
182*4882a593Smuzhiyun 			   SFPL(lbytes),
183*4882a593Smuzhiyun 			   SFPL(rbytes),
184*4882a593Smuzhiyun 			   SFPL(get_neighbors),
185*4882a593Smuzhiyun 			   SFPL(get_neighbors_restart),
186*4882a593Smuzhiyun 			   SFPL(need_l_neighbor), SFPL(need_r_neighbor)
187*4882a593Smuzhiyun 		    );
188*4882a593Smuzhiyun 	}
189*4882a593Smuzhiyun 	return 0;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
show_bitmap(struct seq_file * m,void * unused)192*4882a593Smuzhiyun static int show_bitmap(struct seq_file *m, void *unused)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	struct super_block *sb = m->private;
195*4882a593Smuzhiyun 	struct reiserfs_sb_info *r = REISERFS_SB(sb);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	seq_printf(m, "free_block: %lu\n"
198*4882a593Smuzhiyun 		   "  scan_bitmap:"
199*4882a593Smuzhiyun 		   "          wait"
200*4882a593Smuzhiyun 		   "          bmap"
201*4882a593Smuzhiyun 		   "         retry"
202*4882a593Smuzhiyun 		   "        stolen"
203*4882a593Smuzhiyun 		   "  journal_hint"
204*4882a593Smuzhiyun 		   "journal_nohint"
205*4882a593Smuzhiyun 		   "\n"
206*4882a593Smuzhiyun 		   " %14lu"
207*4882a593Smuzhiyun 		   " %14lu"
208*4882a593Smuzhiyun 		   " %14lu"
209*4882a593Smuzhiyun 		   " %14lu"
210*4882a593Smuzhiyun 		   " %14lu"
211*4882a593Smuzhiyun 		   " %14lu"
212*4882a593Smuzhiyun 		   " %14lu"
213*4882a593Smuzhiyun 		   "\n",
214*4882a593Smuzhiyun 		   SFP(free_block),
215*4882a593Smuzhiyun 		   SFPF(call),
216*4882a593Smuzhiyun 		   SFPF(wait),
217*4882a593Smuzhiyun 		   SFPF(bmap),
218*4882a593Smuzhiyun 		   SFPF(retry),
219*4882a593Smuzhiyun 		   SFPF(stolen),
220*4882a593Smuzhiyun 		   SFPF(in_journal_hint), SFPF(in_journal_nohint));
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	return 0;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun 
show_on_disk_super(struct seq_file * m,void * unused)225*4882a593Smuzhiyun static int show_on_disk_super(struct seq_file *m, void *unused)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun 	struct super_block *sb = m->private;
228*4882a593Smuzhiyun 	struct reiserfs_sb_info *sb_info = REISERFS_SB(sb);
229*4882a593Smuzhiyun 	struct reiserfs_super_block *rs = sb_info->s_rs;
230*4882a593Smuzhiyun 	int hash_code = DFL(s_hash_function_code);
231*4882a593Smuzhiyun 	__u32 flags = DJF(s_flags);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	seq_printf(m, "block_count: \t%i\n"
234*4882a593Smuzhiyun 		   "free_blocks: \t%i\n"
235*4882a593Smuzhiyun 		   "root_block: \t%i\n"
236*4882a593Smuzhiyun 		   "blocksize: \t%i\n"
237*4882a593Smuzhiyun 		   "oid_maxsize: \t%i\n"
238*4882a593Smuzhiyun 		   "oid_cursize: \t%i\n"
239*4882a593Smuzhiyun 		   "umount_state: \t%i\n"
240*4882a593Smuzhiyun 		   "magic: \t%10.10s\n"
241*4882a593Smuzhiyun 		   "fs_state: \t%i\n"
242*4882a593Smuzhiyun 		   "hash: \t%s\n"
243*4882a593Smuzhiyun 		   "tree_height: \t%i\n"
244*4882a593Smuzhiyun 		   "bmap_nr: \t%i\n"
245*4882a593Smuzhiyun 		   "version: \t%i\n"
246*4882a593Smuzhiyun 		   "flags: \t%x[%s]\n"
247*4882a593Smuzhiyun 		   "reserved_for_journal: \t%i\n",
248*4882a593Smuzhiyun 		   DFL(s_block_count),
249*4882a593Smuzhiyun 		   DFL(s_free_blocks),
250*4882a593Smuzhiyun 		   DFL(s_root_block),
251*4882a593Smuzhiyun 		   DF(s_blocksize),
252*4882a593Smuzhiyun 		   DF(s_oid_maxsize),
253*4882a593Smuzhiyun 		   DF(s_oid_cursize),
254*4882a593Smuzhiyun 		   DF(s_umount_state),
255*4882a593Smuzhiyun 		   rs->s_v1.s_magic,
256*4882a593Smuzhiyun 		   DF(s_fs_state),
257*4882a593Smuzhiyun 		   hash_code == TEA_HASH ? "tea" :
258*4882a593Smuzhiyun 		   (hash_code == YURA_HASH) ? "rupasov" :
259*4882a593Smuzhiyun 		   (hash_code == R5_HASH) ? "r5" :
260*4882a593Smuzhiyun 		   (hash_code == UNSET_HASH) ? "unset" : "unknown",
261*4882a593Smuzhiyun 		   DF(s_tree_height),
262*4882a593Smuzhiyun 		   DF(s_bmap_nr),
263*4882a593Smuzhiyun 		   DF(s_version), flags, (flags & reiserfs_attrs_cleared)
264*4882a593Smuzhiyun 		   ? "attrs_cleared" : "", DF(s_reserved_for_journal));
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	return 0;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
show_oidmap(struct seq_file * m,void * unused)269*4882a593Smuzhiyun static int show_oidmap(struct seq_file *m, void *unused)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun 	struct super_block *sb = m->private;
272*4882a593Smuzhiyun 	struct reiserfs_sb_info *sb_info = REISERFS_SB(sb);
273*4882a593Smuzhiyun 	struct reiserfs_super_block *rs = sb_info->s_rs;
274*4882a593Smuzhiyun 	unsigned int mapsize = le16_to_cpu(rs->s_v1.s_oid_cursize);
275*4882a593Smuzhiyun 	unsigned long total_used = 0;
276*4882a593Smuzhiyun 	int i;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	for (i = 0; i < mapsize; ++i) {
279*4882a593Smuzhiyun 		__u32 right;
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 		right = (i == mapsize - 1) ? MAX_KEY_OBJECTID : MAP(i + 1);
282*4882a593Smuzhiyun 		seq_printf(m, "%s: [ %x .. %x )\n",
283*4882a593Smuzhiyun 			   (i & 1) ? "free" : "used", MAP(i), right);
284*4882a593Smuzhiyun 		if (!(i & 1)) {
285*4882a593Smuzhiyun 			total_used += right - MAP(i);
286*4882a593Smuzhiyun 		}
287*4882a593Smuzhiyun 	}
288*4882a593Smuzhiyun #if defined( REISERFS_USE_OIDMAPF )
289*4882a593Smuzhiyun 	if (sb_info->oidmap.use_file && (sb_info->oidmap.mapf != NULL)) {
290*4882a593Smuzhiyun 		loff_t size = file_inode(sb_info->oidmap.mapf)->i_size;
291*4882a593Smuzhiyun 		total_used += size / sizeof(reiserfs_oidinterval_d_t);
292*4882a593Smuzhiyun 	}
293*4882a593Smuzhiyun #endif
294*4882a593Smuzhiyun 	seq_printf(m, "total: \t%i [%i/%i] used: %lu [exact]\n",
295*4882a593Smuzhiyun 		   mapsize,
296*4882a593Smuzhiyun 		   mapsize, le16_to_cpu(rs->s_v1.s_oid_maxsize), total_used);
297*4882a593Smuzhiyun 	return 0;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun 
ktime_mono_to_real_seconds(time64_t mono)300*4882a593Smuzhiyun static time64_t ktime_mono_to_real_seconds(time64_t mono)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	ktime_t kt = ktime_set(mono, NSEC_PER_SEC/2);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	return ktime_divns(ktime_mono_to_real(kt), NSEC_PER_SEC);
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
show_journal(struct seq_file * m,void * unused)307*4882a593Smuzhiyun static int show_journal(struct seq_file *m, void *unused)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun 	struct super_block *sb = m->private;
310*4882a593Smuzhiyun 	struct reiserfs_sb_info *r = REISERFS_SB(sb);
311*4882a593Smuzhiyun 	struct reiserfs_super_block *rs = r->s_rs;
312*4882a593Smuzhiyun 	struct journal_params *jp = &rs->s_v1.s_journal;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	seq_printf(m,		/* on-disk fields */
315*4882a593Smuzhiyun 		   "jp_journal_1st_block: \t%i\n"
316*4882a593Smuzhiyun 		   "jp_journal_dev: \t%pg[%x]\n"
317*4882a593Smuzhiyun 		   "jp_journal_size: \t%i\n"
318*4882a593Smuzhiyun 		   "jp_journal_trans_max: \t%i\n"
319*4882a593Smuzhiyun 		   "jp_journal_magic: \t%i\n"
320*4882a593Smuzhiyun 		   "jp_journal_max_batch: \t%i\n"
321*4882a593Smuzhiyun 		   "jp_journal_max_commit_age: \t%i\n"
322*4882a593Smuzhiyun 		   "jp_journal_max_trans_age: \t%i\n"
323*4882a593Smuzhiyun 		   /* incore fields */
324*4882a593Smuzhiyun 		   "j_1st_reserved_block: \t%i\n"
325*4882a593Smuzhiyun 		   "j_state: \t%li\n"
326*4882a593Smuzhiyun 		   "j_trans_id: \t%u\n"
327*4882a593Smuzhiyun 		   "j_mount_id: \t%lu\n"
328*4882a593Smuzhiyun 		   "j_start: \t%lu\n"
329*4882a593Smuzhiyun 		   "j_len: \t%lu\n"
330*4882a593Smuzhiyun 		   "j_len_alloc: \t%lu\n"
331*4882a593Smuzhiyun 		   "j_wcount: \t%i\n"
332*4882a593Smuzhiyun 		   "j_bcount: \t%lu\n"
333*4882a593Smuzhiyun 		   "j_first_unflushed_offset: \t%lu\n"
334*4882a593Smuzhiyun 		   "j_last_flush_trans_id: \t%u\n"
335*4882a593Smuzhiyun 		   "j_trans_start_time: \t%lli\n"
336*4882a593Smuzhiyun 		   "j_list_bitmap_index: \t%i\n"
337*4882a593Smuzhiyun 		   "j_must_wait: \t%i\n"
338*4882a593Smuzhiyun 		   "j_next_full_flush: \t%i\n"
339*4882a593Smuzhiyun 		   "j_next_async_flush: \t%i\n"
340*4882a593Smuzhiyun 		   "j_cnode_used: \t%i\n" "j_cnode_free: \t%i\n" "\n"
341*4882a593Smuzhiyun 		   /* reiserfs_proc_info_data_t.journal fields */
342*4882a593Smuzhiyun 		   "in_journal: \t%12lu\n"
343*4882a593Smuzhiyun 		   "in_journal_bitmap: \t%12lu\n"
344*4882a593Smuzhiyun 		   "in_journal_reusable: \t%12lu\n"
345*4882a593Smuzhiyun 		   "lock_journal: \t%12lu\n"
346*4882a593Smuzhiyun 		   "lock_journal_wait: \t%12lu\n"
347*4882a593Smuzhiyun 		   "journal_begin: \t%12lu\n"
348*4882a593Smuzhiyun 		   "journal_relock_writers: \t%12lu\n"
349*4882a593Smuzhiyun 		   "journal_relock_wcount: \t%12lu\n"
350*4882a593Smuzhiyun 		   "mark_dirty: \t%12lu\n"
351*4882a593Smuzhiyun 		   "mark_dirty_already: \t%12lu\n"
352*4882a593Smuzhiyun 		   "mark_dirty_notjournal: \t%12lu\n"
353*4882a593Smuzhiyun 		   "restore_prepared: \t%12lu\n"
354*4882a593Smuzhiyun 		   "prepare: \t%12lu\n"
355*4882a593Smuzhiyun 		   "prepare_retry: \t%12lu\n",
356*4882a593Smuzhiyun 		   DJP(jp_journal_1st_block),
357*4882a593Smuzhiyun 		   SB_JOURNAL(sb)->j_dev_bd,
358*4882a593Smuzhiyun 		   DJP(jp_journal_dev),
359*4882a593Smuzhiyun 		   DJP(jp_journal_size),
360*4882a593Smuzhiyun 		   DJP(jp_journal_trans_max),
361*4882a593Smuzhiyun 		   DJP(jp_journal_magic),
362*4882a593Smuzhiyun 		   DJP(jp_journal_max_batch),
363*4882a593Smuzhiyun 		   SB_JOURNAL(sb)->j_max_commit_age,
364*4882a593Smuzhiyun 		   DJP(jp_journal_max_trans_age),
365*4882a593Smuzhiyun 		   JF(j_1st_reserved_block),
366*4882a593Smuzhiyun 		   JF(j_state),
367*4882a593Smuzhiyun 		   JF(j_trans_id),
368*4882a593Smuzhiyun 		   JF(j_mount_id),
369*4882a593Smuzhiyun 		   JF(j_start),
370*4882a593Smuzhiyun 		   JF(j_len),
371*4882a593Smuzhiyun 		   JF(j_len_alloc),
372*4882a593Smuzhiyun 		   atomic_read(&r->s_journal->j_wcount),
373*4882a593Smuzhiyun 		   JF(j_bcount),
374*4882a593Smuzhiyun 		   JF(j_first_unflushed_offset),
375*4882a593Smuzhiyun 		   JF(j_last_flush_trans_id),
376*4882a593Smuzhiyun 		   ktime_mono_to_real_seconds(JF(j_trans_start_time)),
377*4882a593Smuzhiyun 		   JF(j_list_bitmap_index),
378*4882a593Smuzhiyun 		   JF(j_must_wait),
379*4882a593Smuzhiyun 		   JF(j_next_full_flush),
380*4882a593Smuzhiyun 		   JF(j_next_async_flush),
381*4882a593Smuzhiyun 		   JF(j_cnode_used),
382*4882a593Smuzhiyun 		   JF(j_cnode_free),
383*4882a593Smuzhiyun 		   SFPJ(in_journal),
384*4882a593Smuzhiyun 		   SFPJ(in_journal_bitmap),
385*4882a593Smuzhiyun 		   SFPJ(in_journal_reusable),
386*4882a593Smuzhiyun 		   SFPJ(lock_journal),
387*4882a593Smuzhiyun 		   SFPJ(lock_journal_wait),
388*4882a593Smuzhiyun 		   SFPJ(journal_being),
389*4882a593Smuzhiyun 		   SFPJ(journal_relock_writers),
390*4882a593Smuzhiyun 		   SFPJ(journal_relock_wcount),
391*4882a593Smuzhiyun 		   SFPJ(mark_dirty),
392*4882a593Smuzhiyun 		   SFPJ(mark_dirty_already),
393*4882a593Smuzhiyun 		   SFPJ(mark_dirty_notjournal),
394*4882a593Smuzhiyun 		   SFPJ(restore_prepared), SFPJ(prepare), SFPJ(prepare_retry)
395*4882a593Smuzhiyun 	    );
396*4882a593Smuzhiyun 	return 0;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun static struct proc_dir_entry *proc_info_root = NULL;
400*4882a593Smuzhiyun static const char proc_info_root_name[] = "fs/reiserfs";
401*4882a593Smuzhiyun 
add_file(struct super_block * sb,char * name,int (* func)(struct seq_file *,void *))402*4882a593Smuzhiyun static void add_file(struct super_block *sb, char *name,
403*4882a593Smuzhiyun 		     int (*func) (struct seq_file *, void *))
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun 	proc_create_single_data(name, 0, REISERFS_SB(sb)->procdir, func, sb);
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
reiserfs_proc_info_init(struct super_block * sb)408*4882a593Smuzhiyun int reiserfs_proc_info_init(struct super_block *sb)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun 	char b[BDEVNAME_SIZE];
411*4882a593Smuzhiyun 	char *s;
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 	/* Some block devices use /'s */
414*4882a593Smuzhiyun 	strlcpy(b, sb->s_id, BDEVNAME_SIZE);
415*4882a593Smuzhiyun 	s = strchr(b, '/');
416*4882a593Smuzhiyun 	if (s)
417*4882a593Smuzhiyun 		*s = '!';
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	spin_lock_init(&__PINFO(sb).lock);
420*4882a593Smuzhiyun 	REISERFS_SB(sb)->procdir = proc_mkdir_data(b, 0, proc_info_root, sb);
421*4882a593Smuzhiyun 	if (REISERFS_SB(sb)->procdir) {
422*4882a593Smuzhiyun 		add_file(sb, "version", show_version);
423*4882a593Smuzhiyun 		add_file(sb, "super", show_super);
424*4882a593Smuzhiyun 		add_file(sb, "per-level", show_per_level);
425*4882a593Smuzhiyun 		add_file(sb, "bitmap", show_bitmap);
426*4882a593Smuzhiyun 		add_file(sb, "on-disk-super", show_on_disk_super);
427*4882a593Smuzhiyun 		add_file(sb, "oidmap", show_oidmap);
428*4882a593Smuzhiyun 		add_file(sb, "journal", show_journal);
429*4882a593Smuzhiyun 		return 0;
430*4882a593Smuzhiyun 	}
431*4882a593Smuzhiyun 	reiserfs_warning(sb, "cannot create /proc/%s/%s",
432*4882a593Smuzhiyun 			 proc_info_root_name, b);
433*4882a593Smuzhiyun 	return 1;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun 
reiserfs_proc_info_done(struct super_block * sb)436*4882a593Smuzhiyun int reiserfs_proc_info_done(struct super_block *sb)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun 	struct proc_dir_entry *de = REISERFS_SB(sb)->procdir;
439*4882a593Smuzhiyun 	if (de) {
440*4882a593Smuzhiyun 		char b[BDEVNAME_SIZE];
441*4882a593Smuzhiyun 		char *s;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 		/* Some block devices use /'s */
444*4882a593Smuzhiyun 		strlcpy(b, sb->s_id, BDEVNAME_SIZE);
445*4882a593Smuzhiyun 		s = strchr(b, '/');
446*4882a593Smuzhiyun 		if (s)
447*4882a593Smuzhiyun 			*s = '!';
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun 		remove_proc_subtree(b, proc_info_root);
450*4882a593Smuzhiyun 		REISERFS_SB(sb)->procdir = NULL;
451*4882a593Smuzhiyun 	}
452*4882a593Smuzhiyun 	return 0;
453*4882a593Smuzhiyun }
454*4882a593Smuzhiyun 
reiserfs_proc_info_global_init(void)455*4882a593Smuzhiyun int reiserfs_proc_info_global_init(void)
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun 	if (proc_info_root == NULL) {
458*4882a593Smuzhiyun 		proc_info_root = proc_mkdir(proc_info_root_name, NULL);
459*4882a593Smuzhiyun 		if (!proc_info_root) {
460*4882a593Smuzhiyun 			reiserfs_warning(NULL, "cannot create /proc/%s",
461*4882a593Smuzhiyun 					 proc_info_root_name);
462*4882a593Smuzhiyun 			return 1;
463*4882a593Smuzhiyun 		}
464*4882a593Smuzhiyun 	}
465*4882a593Smuzhiyun 	return 0;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun 
reiserfs_proc_info_global_done(void)468*4882a593Smuzhiyun int reiserfs_proc_info_global_done(void)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun 	if (proc_info_root != NULL) {
471*4882a593Smuzhiyun 		proc_info_root = NULL;
472*4882a593Smuzhiyun 		remove_proc_entry(proc_info_root_name, NULL);
473*4882a593Smuzhiyun 	}
474*4882a593Smuzhiyun 	return 0;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun /*
477*4882a593Smuzhiyun  * Revision 1.1.8.2  2001/07/15 17:08:42  god
478*4882a593Smuzhiyun  *  . use get_super() in procfs.c
479*4882a593Smuzhiyun  *  . remove remove_save_link() from reiserfs_do_truncate()
480*4882a593Smuzhiyun  *
481*4882a593Smuzhiyun  * I accept terms and conditions stated in the Legal Agreement
482*4882a593Smuzhiyun  * (available at http://www.namesys.com/legalese.html)
483*4882a593Smuzhiyun  *
484*4882a593Smuzhiyun  * Revision 1.1.8.1  2001/07/11 16:48:50  god
485*4882a593Smuzhiyun  * proc info support
486*4882a593Smuzhiyun  *
487*4882a593Smuzhiyun  * I accept terms and conditions stated in the Legal Agreement
488*4882a593Smuzhiyun  * (available at http://www.namesys.com/legalese.html)
489*4882a593Smuzhiyun  *
490*4882a593Smuzhiyun  */
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun /*
493*4882a593Smuzhiyun  * Make Linus happy.
494*4882a593Smuzhiyun  * Local variables:
495*4882a593Smuzhiyun  * c-indentation-style: "K&R"
496*4882a593Smuzhiyun  * mode-name: "LC"
497*4882a593Smuzhiyun  * c-basic-offset: 8
498*4882a593Smuzhiyun  * tab-width: 8
499*4882a593Smuzhiyun  * End:
500*4882a593Smuzhiyun  */
501