procfs.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- linux-c -*- */
  2. /* fs/reiserfs/procfs.c */
  3. /*
  4.  * Copyright 2000-2002 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/sched.h>
  11. #include <asm/uaccess.h>
  12. #include <linux/reiserfs_fs.h>
  13. #include <linux/reiserfs_fs_sb.h>
  14. #include <linux/smp_lock.h>
  15. #include <linux/locks.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 struct super_block *procinfo_prologue( kdev_t dev )
  26. {
  27. struct super_block *result;
  28. /* get super-block by device */
  29. result = get_super( dev );
  30. if( result != NULL ) {
  31. if( !reiserfs_is_super( result ) ) {
  32. printk( KERN_DEBUG "reiserfs: procfs-52: "
  33. "non-reiserfs super foundn" );
  34. drop_super( result );
  35. result = NULL;
  36. }
  37. } else
  38. printk( KERN_DEBUG "reiserfs: procfs-74: "
  39. "race between procinfo and umountn" );
  40. return result;
  41. }
  42. int procinfo_epilogue( struct super_block *super )
  43. {
  44. drop_super( super );
  45. return 0;
  46. }
  47. int reiserfs_proc_tail( int len, char *buffer, char **start, 
  48. off_t offset, int count, int *eof )
  49. {
  50. /* this is black procfs magic */
  51. if( offset >= len ) {
  52. *start = buffer;
  53. *eof = 1;
  54. return 0;
  55. }
  56. *start = buffer + offset;
  57. if( ( len -= offset ) > count ) {
  58. return count;
  59. }
  60. *eof = 1;
  61. return len;
  62. }
  63. int reiserfs_version_in_proc( char *buffer, char **start, off_t offset,
  64.       int count, int *eof, void *data )
  65. {
  66. int len = 0;
  67. struct super_block *sb;
  68. char *format;
  69.     
  70. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  71. if( sb == NULL )
  72. return -ENOENT;
  73. if ( sb->u.reiserfs_sb.s_properties & (1 << REISERFS_3_6) ) {
  74. format = "3.6";
  75. } else if ( sb->u.reiserfs_sb.s_properties & (1 << REISERFS_3_5) ) {
  76. format = "3.5";
  77. } else {
  78. format = "unknown";
  79. }
  80. len += sprintf( &buffer[ len ], "%s formattwith checks %sn",
  81. format,
  82. #if defined( CONFIG_REISERFS_CHECK )
  83. "on"
  84. #else
  85. "off"
  86. #endif
  87. );
  88. procinfo_epilogue( sb );
  89. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  90. }
  91. int reiserfs_global_version_in_proc( char *buffer, char **start, off_t offset,
  92.      int count, int *eof, void *data )
  93. {
  94. int len = 0;
  95.     
  96. len += sprintf( &buffer[ len ], "%s [%s]n", 
  97. reiserfs_get_version_string(),
  98. #if defined( CONFIG_REISERFS_FS_MODULE )
  99. "as module"
  100. #else
  101. "built into kernel"
  102. #endif
  103. );
  104. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  105. }
  106. #define SF( x ) ( r -> x )
  107. #define SFP( x ) SF( s_proc_info_data.x )
  108. #define SFPL( x ) SFP( x[ level ] )
  109. #define SFPF( x ) SFP( scan_bitmap.x )
  110. #define SFPJ( x ) SFP( journal.x )
  111. #define D2C( x ) le16_to_cpu( x )
  112. #define D4C( x ) le32_to_cpu( x )
  113. #define DF( x ) D2C( rs -> x )
  114. #define DFL( x ) D4C( rs -> x )
  115. #define objectid_map( s, rs ) (old_format_only (s) ?
  116.                          (__u32 *)((struct reiserfs_super_block_v1 *)rs + 1) :
  117.  (__u32 *)(rs + 1))
  118. #define MAP( i ) D4C( objectid_map( sb, rs )[ i ] )
  119. #define DJF( x ) le32_to_cpu( rs -> x )
  120. #define JF( x ) ( r -> s_journal -> x )
  121. int reiserfs_super_in_proc( char *buffer, char **start, off_t offset,
  122.     int count, int *eof, void *data )
  123. {
  124. struct super_block *sb;
  125. struct reiserfs_sb_info *r;
  126. int len = 0;
  127.     
  128. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  129. if( sb == NULL )
  130. return -ENOENT;
  131. r = &sb->u.reiserfs_sb;
  132. len += sprintf( &buffer[ len ], 
  133. "state: t%sn"
  134. "mount options: t%s%s%s%s%s%s%s%s%s%s%s%sn"
  135. "gen. counter: t%in"
  136. "s_kmallocs: t%in"
  137. "s_disk_reads: t%in"
  138. "s_disk_writes: t%in"
  139. "s_fix_nodes: t%in"
  140. "s_do_balance: t%in"
  141. "s_unneeded_left_neighbor: t%in"
  142. "s_good_search_by_key_reada: t%in"
  143. "s_bmaps: t%in"
  144. "s_bmaps_without_search: t%in"
  145. "s_direct2indirect: t%in"
  146. "s_indirect2direct: t%in"
  147. "n"
  148. "max_hash_collisions: t%in"
  149. "breads: t%lun"
  150. "bread_misses: t%lun"
  151. "search_by_key: t%lun"
  152. "search_by_key_fs_changed: t%lun"
  153. "search_by_key_restarted: t%lun"
  154. "insert_item_restarted: t%lun"
  155. "paste_into_item_restarted: t%lun"
  156. "cut_from_item_restarted: t%lun"
  157. "delete_solid_item_restarted: t%lun"
  158. "delete_item_restarted: t%lun"
  159. "leaked_oid: t%lun"
  160. "leaves_removable: t%lun",
  161. SF( s_mount_state ) == REISERFS_VALID_FS ?
  162. "REISERFS_VALID_FS" : "REISERFS_ERROR_FS",
  163. reiserfs_r5_hash( sb ) ? "FORCE_R5 " : "",
  164. reiserfs_rupasov_hash( sb ) ? "FORCE_RUPASOV " : "",
  165. reiserfs_tea_hash( sb ) ? "FORCE_TEA " : "",
  166. reiserfs_hash_detect( sb ) ? "DETECT_HASH " : "",
  167. reiserfs_no_border( sb ) ? "NO_BORDER " : "BORDER ",
  168. reiserfs_no_unhashed_relocation( sb ) ? "NO_UNHASHED_RELOCATION " : "",
  169. reiserfs_hashed_relocation( sb ) ? "UNHASHED_RELOCATION " : "",
  170. reiserfs_test4( sb ) ? "TEST4 " : "",
  171. have_large_tails( sb ) ? "TAILS " : have_small_tails(sb)?"SMALL_TAILS ":"NO_TAILS ",
  172. replay_only( sb ) ? "REPLAY_ONLY " : "",
  173. reiserfs_dont_log( sb ) ? "DONT_LOG " : "LOG ",
  174. convert_reiserfs( sb ) ? "CONV " : "",
  175. atomic_read( &r -> s_generation_counter ),
  176. SF( s_kmallocs ),
  177. SF( s_disk_reads ),
  178. SF( s_disk_writes ),
  179. SF( s_fix_nodes ),
  180. SF( s_do_balance ),
  181. SF( s_unneeded_left_neighbor ),
  182. SF( s_good_search_by_key_reada ),
  183. SF( s_bmaps ),
  184. SF( s_bmaps_without_search ),
  185. SF( s_direct2indirect ),
  186. SF( s_indirect2direct ),
  187. SFP( max_hash_collisions ),
  188. SFP( breads ),
  189. SFP( bread_miss ),
  190. SFP( search_by_key ),
  191. SFP( search_by_key_fs_changed ),
  192. SFP( search_by_key_restarted ),
  193. SFP( insert_item_restarted ),
  194. SFP( paste_into_item_restarted ),
  195. SFP( cut_from_item_restarted ),
  196. SFP( delete_solid_item_restarted ),
  197. SFP( delete_item_restarted ),
  198. SFP( leaked_oid ),
  199. SFP( leaves_removable ) );
  200. procinfo_epilogue( sb );
  201. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  202. }
  203. int reiserfs_per_level_in_proc( char *buffer, char **start, off_t offset,
  204. int count, int *eof, void *data )
  205. {
  206. struct super_block *sb;
  207. struct reiserfs_sb_info *r;
  208. int len = 0;
  209. int level;
  210. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  211. if( sb == NULL )
  212. return -ENOENT;
  213. r = &sb->u.reiserfs_sb;
  214. len += sprintf( &buffer[ len ],
  215. "levelt"
  216. "     balances"
  217. " [sbk:  reads"
  218. "   fs_changed"
  219. "   restarted]"
  220. "   free space"
  221. "        items"
  222. "   can_remove"
  223. "         lnum"
  224. "         rnum"
  225. "       lbytes"
  226. "       rbytes"
  227. "     get_neig"
  228. " get_neig_res"
  229. "  need_l_neig"
  230. "  need_r_neig"
  231. "n"
  232. );
  233. for( level = 0 ; level < MAX_HEIGHT ; ++ level ) {
  234. if( len > PAGE_SIZE - 240 ) {
  235. len += sprintf( &buffer[ len ], "... and moren" );
  236. break;
  237. }
  238. len += sprintf( &buffer[ len ], 
  239. "%it"
  240. " %12lu"
  241. " %12lu"
  242. " %12lu"
  243. " %12lu"
  244. " %12lu"
  245. " %12lu"
  246. " %12lu"
  247. " %12li"
  248. " %12li"
  249. " %12li"
  250. " %12li"
  251. " %12lu"
  252. " %12lu"
  253. " %12lu"
  254. " %12lu"
  255. "n",
  256. level, 
  257. SFPL( balance_at ),
  258. SFPL( sbk_read_at ),
  259. SFPL( sbk_fs_changed ),
  260. SFPL( sbk_restarted ),
  261. SFPL( free_at ),
  262. SFPL( items_at ),
  263. SFPL( can_node_be_removed ),
  264. SFPL( lnum ),
  265. SFPL( rnum ),
  266. SFPL( lbytes ),
  267. SFPL( rbytes ),
  268. SFPL( get_neighbors ),
  269. SFPL( get_neighbors_restart ),
  270. SFPL( need_l_neighbor ),
  271. SFPL( need_r_neighbor )
  272. );
  273. }
  274. procinfo_epilogue( sb );
  275. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  276. }
  277. int reiserfs_bitmap_in_proc( char *buffer, char **start, off_t offset,
  278.      int count, int *eof, void *data )
  279. {
  280. struct super_block *sb;
  281. struct reiserfs_sb_info *r = &sb->u.reiserfs_sb;
  282. int len = 0;
  283.     
  284. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  285. if( sb == NULL )
  286. return -ENOENT;
  287. r = &sb->u.reiserfs_sb;
  288. len += sprintf( &buffer[ len ], "free_block: %lun"
  289. "  scan_bitmap:"
  290. "          wait"
  291. "          bmap"
  292. "         retry"
  293. "        stolen"
  294. "  journal_hint"
  295. "journal_nohint"
  296. "n"
  297. " %14lu"
  298. " %14lu"
  299. " %14lu"
  300. " %14lu"
  301. " %14lu"
  302. " %14lu"
  303. " %14lu"
  304. "n",
  305. SFP( free_block ),
  306. SFPF( call ), 
  307. SFPF( wait ), 
  308. SFPF( bmap ),
  309. SFPF( retry ),
  310. SFPF( stolen ),
  311. SFPF( in_journal_hint ),
  312. SFPF( in_journal_nohint ) );
  313. procinfo_epilogue( sb );
  314. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  315. }
  316. int reiserfs_on_disk_super_in_proc( char *buffer, char **start, off_t offset,
  317.     int count, int *eof, void *data )
  318. {
  319. struct super_block *sb;
  320. struct reiserfs_sb_info *sb_info;
  321. struct reiserfs_super_block *rs;
  322. int hash_code;
  323. __u32 flags;
  324. int len = 0;
  325.     
  326. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  327. if( sb == NULL )
  328. return -ENOENT;
  329. sb_info = &sb->u.reiserfs_sb;
  330. rs = sb_info -> s_rs;
  331. hash_code = DFL( s_hash_function_code );
  332. flags = DFL( s_flags );
  333. len += sprintf( &buffer[ len ], 
  334. "block_count: t%in"
  335. "free_blocks: t%in"
  336. "root_block: t%in"
  337. "blocksize: t%in"
  338. "oid_maxsize: t%in"
  339. "oid_cursize: t%in"
  340. "state: t%in"
  341. "magic: t%12.12sn"
  342. "hash: t%sn"
  343. "tree_height: t%in"
  344. "bmap_nr: t%in"
  345. "version: t%in"
  346. "flags: t%x[%s]n",
  347. DFL( s_block_count ),
  348. DFL( s_free_blocks ),
  349. DFL( s_root_block ),
  350. DF( s_blocksize ),
  351. DF( s_oid_maxsize ),
  352. DF( s_oid_cursize ),
  353. DF( s_state ),
  354. rs -> s_magic,
  355. hash_code == TEA_HASH ? "tea" :
  356. ( hash_code == YURA_HASH ) ? "rupasov" :
  357. ( hash_code == R5_HASH ) ? "r5" :
  358. ( hash_code == UNSET_HASH ) ? "unset" : "unknown",
  359. DF( s_tree_height ),
  360. DF( s_bmap_nr ),
  361. DF( s_version ),
  362. flags, 
  363. ( flags & reiserfs_attrs_cleared ) 
  364. ? "attrs_cleared" : "" );
  365. procinfo_epilogue( sb );
  366. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  367. }
  368. int reiserfs_oidmap_in_proc( char *buffer, char **start, off_t offset,
  369.      int count, int *eof, void *data )
  370. {
  371. struct super_block *sb;
  372. struct reiserfs_sb_info *sb_info;
  373. struct reiserfs_super_block *rs;
  374. int i;
  375. unsigned int mapsize;
  376. unsigned long total_used;
  377. int len = 0;
  378. int exact;
  379.     
  380. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  381. if( sb == NULL )
  382. return -ENOENT;
  383. sb_info = &sb->u.reiserfs_sb;
  384. rs = sb_info -> s_rs;
  385. mapsize = le16_to_cpu( rs -> s_oid_cursize );
  386. total_used = 0;
  387. for( i = 0 ; i < mapsize ; ++i ) {
  388. __u32 right;
  389. right = ( i == mapsize - 1 ) ? MAX_KEY_OBJECTID : MAP( i + 1 );
  390. len += sprintf( &buffer[ len ], "%s: [ %x .. %x )n",
  391. ( i & 1 ) ? "free" : "used", MAP( i ), right );
  392. if( ! ( i & 1 ) ) {
  393. total_used += right - MAP( i );
  394. }
  395. if( len > PAGE_SIZE - 100 ) {
  396. len += sprintf( &buffer[ len ], "... and moren" );
  397. break;
  398. }
  399. }
  400. #if defined( REISERFS_USE_OIDMAPF )
  401. if( sb_info -> oidmap.use_file && ( sb_info -> oidmap.mapf != NULL ) ) {
  402. loff_t size;
  403. size = sb_info -> oidmap.mapf -> f_dentry -> d_inode -> i_size;
  404. total_used += size / sizeof( reiserfs_oidinterval_d_t );
  405. exact = 1;
  406. } else
  407. #endif
  408. {
  409. exact = ( i == mapsize );
  410. }
  411. len += sprintf( &buffer[ len ], "total: t%i [%i/%i] used: %lu [%s]n", 
  412. i, 
  413. mapsize, le16_to_cpu( rs -> s_oid_maxsize ),
  414. total_used, exact ? "exact" : "estimation" );
  415. procinfo_epilogue( sb );
  416. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  417. }
  418. int reiserfs_journal_in_proc( char *buffer, char **start, off_t offset,
  419.       int count, int *eof, void *data )
  420. {
  421. struct super_block *sb;
  422. struct reiserfs_sb_info *r;
  423. struct reiserfs_super_block *rs;
  424. int len = 0;
  425.     
  426. sb = procinfo_prologue( ( kdev_t ) ( long ) data );
  427. if( sb == NULL )
  428. return -ENOENT;
  429. r = &sb->u.reiserfs_sb;
  430. rs = r -> s_rs;
  431. len += sprintf( &buffer[ len ], 
  432. /* on-disk fields */
  433. "s_journal_block: t%in"
  434. "s_journal_dev: t%s[%x]n"
  435. "s_orig_journal_size: t%in"
  436. "s_journal_trans_max: t%in"
  437. "s_journal_block_count: t%in"
  438. "s_journal_max_batch: t%in"
  439. "s_journal_max_commit_age: t%in"
  440. "s_journal_max_trans_age: t%in"
  441. /* incore fields */
  442. "j_state: t%lin"
  443. "j_trans_id: t%lun"
  444. "j_mount_id: t%lun"
  445. "j_start: t%lun"
  446. "j_len: t%lun"
  447. "j_len_alloc: t%lun"
  448. "j_wcount: t%in"
  449. "j_bcount: t%lun"
  450. "j_first_unflushed_offset: t%lun"
  451. "j_last_flush_trans_id: t%lun"
  452. "j_trans_start_time: t%lin"
  453. "j_journal_list_index: t%in"
  454. "j_list_bitmap_index: t%in"
  455. "j_must_wait: t%in"
  456. "j_next_full_flush: t%in"
  457. "j_next_async_flush: t%in"
  458. "j_cnode_used: t%in"
  459. "j_cnode_free: t%in"
  460. "n"
  461. /* reiserfs_proc_info_data_t.journal fields */
  462. "in_journal: t%12lun"
  463. "in_journal_bitmap: t%12lun"
  464. "in_journal_reusable: t%12lun"
  465. "lock_journal: t%12lun"
  466. "lock_journal_wait: t%12lun"
  467. "journal_begin: t%12lun"
  468. "journal_relock_writers: t%12lun"
  469. "journal_relock_wcount: t%12lun"
  470. "mark_dirty: t%12lun"
  471. "mark_dirty_already: t%12lun"
  472. "mark_dirty_notjournal: t%12lun"
  473. "restore_prepared: t%12lun"
  474. "prepare: t%12lun"
  475. "prepare_retry: t%12lun",
  476. DJF( s_journal_block ),
  477. DJF( s_journal_dev ) == 0 ? "none" : bdevname( DJF( s_journal_dev ) ), 
  478. DJF( s_journal_dev ),
  479. DJF( s_orig_journal_size ),
  480. DJF( s_journal_trans_max ),
  481. DJF( s_journal_block_count ),
  482. DJF( s_journal_max_batch ),
  483. DJF( s_journal_max_commit_age ),
  484. DJF( s_journal_max_trans_age ),
  485. JF( j_state ),
  486. JF( j_trans_id ),
  487. JF( j_mount_id ),
  488. JF( j_start ),
  489. JF( j_len ),
  490. JF( j_len_alloc ),
  491. atomic_read( & r -> s_journal -> j_wcount ),
  492. JF( j_bcount ),
  493. JF( j_first_unflushed_offset ),
  494. JF( j_last_flush_trans_id ),
  495. JF( j_trans_start_time ),
  496. JF( j_journal_list_index ),
  497. JF( j_list_bitmap_index ),
  498. JF( j_must_wait ),
  499. JF( j_next_full_flush ),
  500. JF( j_next_async_flush ),
  501. JF( j_cnode_used ),
  502. JF( j_cnode_free ),
  503. SFPJ( in_journal ),
  504. SFPJ( in_journal_bitmap ),
  505. SFPJ( in_journal_reusable ),
  506. SFPJ( lock_journal ),
  507. SFPJ( lock_journal_wait ),
  508. SFPJ( journal_being ),
  509. SFPJ( journal_relock_writers ),
  510. SFPJ( journal_relock_wcount ),
  511. SFPJ( mark_dirty ),
  512. SFPJ( mark_dirty_already ),
  513. SFPJ( mark_dirty_notjournal ),
  514. SFPJ( restore_prepared ),
  515. SFPJ( prepare ),
  516. SFPJ( prepare_retry )
  517. );
  518. procinfo_epilogue( sb );
  519. return reiserfs_proc_tail( len, buffer, start, offset, count, eof );
  520. }
  521. static struct proc_dir_entry *proc_info_root = NULL;
  522. static const char *proc_info_root_name = "fs/reiserfs";
  523. int reiserfs_proc_info_init( struct super_block *sb )
  524. {
  525. spin_lock_init( & __PINFO( sb ).lock );
  526. sb->u.reiserfs_sb.procdir = proc_mkdir( bdevname( sb -> s_dev ), 
  527. proc_info_root );
  528. if( sb->u.reiserfs_sb.procdir ) {
  529. sb->u.reiserfs_sb.procdir -> owner = THIS_MODULE;
  530. return 0;
  531. }
  532. reiserfs_warning( "reiserfs: cannot create /proc/%s/%sn",
  533.   proc_info_root_name, bdevname( sb -> s_dev ) );
  534. return 1;
  535. }
  536. int reiserfs_proc_info_done( struct super_block *sb )
  537. {
  538. spin_lock( & __PINFO( sb ).lock );
  539. __PINFO( sb ).exiting = 1;
  540. spin_unlock( & __PINFO( sb ).lock );
  541. if ( proc_info_root ) {
  542. remove_proc_entry( bdevname( sb -> s_dev ), proc_info_root );
  543. sb->u.reiserfs_sb.procdir = NULL;
  544. }
  545. return 0;
  546. }
  547. /* Create /proc/fs/reiserfs/DEV/name and attach read procedure @func
  548.    to it.  Other parts of reiserfs use this function to make their
  549.    per-device statistics available via /proc */
  550. struct proc_dir_entry *reiserfs_proc_register( struct super_block *sb, 
  551.        char *name, read_proc_t *func )
  552. {
  553. return ( sb->u.reiserfs_sb.procdir ) ? create_proc_read_entry
  554. ( name, 0, sb->u.reiserfs_sb.procdir, func, 
  555.   ( void * ) ( long ) sb -> s_dev ) : NULL;
  556. }
  557. void reiserfs_proc_unregister( struct super_block *sb, const char *name )
  558. {
  559. remove_proc_entry( name, sb->u.reiserfs_sb.procdir );
  560. }
  561. struct proc_dir_entry *reiserfs_proc_register_global( char *name, 
  562.       read_proc_t *func )
  563. {
  564. return ( proc_info_root ) ? create_proc_read_entry( name, 0, 
  565.     proc_info_root, 
  566.     func, NULL ) : NULL;
  567. }
  568. void reiserfs_proc_unregister_global( const char *name )
  569. {
  570. remove_proc_entry( name, proc_info_root );
  571. }
  572. int reiserfs_proc_info_global_init( void )
  573. {
  574. if( proc_info_root == NULL ) {
  575. proc_info_root = proc_mkdir( proc_info_root_name, 0 );
  576. if( proc_info_root ) {
  577. proc_info_root -> owner = THIS_MODULE;
  578. } else {
  579. reiserfs_warning( "reiserfs: cannot create /proc/%sn",
  580.   proc_info_root_name );
  581. return 1;
  582. }
  583. }
  584. return 0;
  585. }
  586. int reiserfs_proc_info_global_done( void )
  587. {
  588. if ( proc_info_root != NULL ) {
  589. proc_info_root = NULL;
  590. remove_proc_entry( proc_info_root_name, 0 );
  591. }
  592. return 0;
  593. }
  594. /* REISERFS_PROC_INFO */
  595. #else
  596. int reiserfs_proc_info_init( struct super_block *sb ) { return 0; }
  597. int reiserfs_proc_info_done( struct super_block *sb ) { return 0; }
  598. struct proc_dir_entry *reiserfs_proc_register( struct super_block *sb, 
  599.        char *name, 
  600.        read_proc_t *func ) 
  601. { return NULL; }
  602. void reiserfs_proc_unregister( struct super_block *sb, const char *name ) 
  603. {;}
  604. struct proc_dir_entry *reiserfs_proc_register_global( char *name, 
  605.       read_proc_t *func )
  606. { return NULL; }
  607. void reiserfs_proc_unregister_global( const char *name ) {;}
  608. int reiserfs_proc_info_global_init( void ) { return 0; }
  609. int reiserfs_proc_info_global_done( void ) { return 0; }
  610. int reiserfs_global_version_in_proc( char *buffer, char **start, 
  611.      off_t offset,
  612.      int count, int *eof, void *data )
  613. { return 0; }
  614. int reiserfs_version_in_proc( char *buffer, char **start, off_t offset,
  615.       int count, int *eof, void *data )
  616. { return 0; }
  617. int reiserfs_super_in_proc( char *buffer, char **start, off_t offset,
  618.     int count, int *eof, void *data )
  619. { return 0; }
  620. int reiserfs_per_level_in_proc( char *buffer, char **start, off_t offset,
  621. int count, int *eof, void *data )
  622. { return 0; }
  623. int reiserfs_bitmap_in_proc( char *buffer, char **start, off_t offset,
  624.      int count, int *eof, void *data )
  625. { return 0; }
  626. int reiserfs_on_disk_super_in_proc( char *buffer, char **start, off_t offset,
  627.     int count, int *eof, void *data )
  628. { return 0; }
  629. int reiserfs_oidmap_in_proc( char *buffer, char **start, off_t offset,
  630.      int count, int *eof, void *data )
  631. { return 0; }
  632. int reiserfs_journal_in_proc( char *buffer, char **start, off_t offset,
  633.       int count, int *eof, void *data )
  634. { return 0; }
  635. /* REISERFS_PROC_INFO */
  636. #endif
  637. /*
  638.  * $Log: procfs.c,v $
  639.  * Revision 1.1.8.2  2001/07/15 17:08:42  god
  640.  *  . use get_super() in procfs.c
  641.  *  . remove remove_save_link() from reiserfs_do_truncate()
  642.  *
  643.  * I accept terms and conditions stated in the Legal Agreement
  644.  * (available at http://www.namesys.com/legalese.html)
  645.  *
  646.  * Revision 1.1.8.1  2001/07/11 16:48:50  god
  647.  * proc info support
  648.  *
  649.  * I accept terms and conditions stated in the Legal Agreement
  650.  * (available at http://www.namesys.com/legalese.html)
  651.  *
  652.  */
  653. /* 
  654.  * Make Linus happy.
  655.  * Local variables:
  656.  * c-indentation-style: "K&R"
  657.  * mode-name: "LC"
  658.  * c-basic-offset: 8
  659.  * tab-width: 8
  660.  * End:
  661.  */