procfs.c 16 KB

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