buffer2.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README  
  3.  */
  4. #include <linux/config.h>
  5. #include <linux/sched.h>
  6. #include <linux/locks.h>
  7. #include <linux/reiserfs_fs.h>
  8. #include <linux/smp_lock.h>
  9. #include <linux/kernel_stat.h>
  10. /*
  11.  *  wait_buffer_until_released
  12.  *  reiserfs_bread
  13.  */
  14. /* when we allocate a new block (get_new_buffer, get_empty_nodes) and
  15.    get buffer for it, it is possible that it is held by someone else
  16.    or even by this process. In this function we wait until all other
  17.    holders release buffer. To make sure, that current process does not
  18.    hold we did free all buffers in tree balance structure
  19.    (get_empty_nodes and get_nodes_for_preserving) or in path structure
  20.    only (get_new_buffer) just before calling this */
  21. void wait_buffer_until_released (const struct buffer_head * bh)
  22. {
  23.   int repeat_counter = 0;
  24.   while (atomic_read (&(bh->b_count)) > 1) {
  25.     if ( !(++repeat_counter % 30000000) ) {
  26.       reiserfs_warning ("vs-3050: wait_buffer_until_released: nobody releases buffer (%b). Still waiting (%d) %cJDIRTY %cJWAITn",
  27. bh, repeat_counter, buffer_journaled(bh) ? ' ' : '!',
  28. buffer_journal_dirty(bh) ? ' ' : '!');
  29.     }
  30.     run_task_queue(&tq_disk);
  31.     current->policy |= SCHED_YIELD;
  32.     schedule();
  33.   }
  34.   if (repeat_counter > 30000000) {
  35.     reiserfs_warning("vs-3051: done waiting, ignore vs-3050 messages for (%b)n", bh) ;
  36.   }
  37. }
  38. /*
  39.  * reiserfs_bread() reads a specified block and returns the buffer that contains
  40.  * it. It returns NULL if the block was unreadable.
  41.  */
  42. /* It first tries to find the block in cache, and if it cannot do so
  43.    then it creates a new buffer and schedules I/O to read the
  44.    block. */
  45. /* The function is NOT SCHEDULE-SAFE! */
  46. struct buffer_head  * reiserfs_bread (struct super_block *super, int n_block, int n_size) 
  47. {
  48.     struct buffer_head  *result;
  49.     PROC_EXP( unsigned int ctx_switches = kstat.context_swtch );
  50.     result = bread (super -> s_dev, n_block, n_size);
  51.     PROC_INFO_INC( super, breads );
  52.     PROC_EXP( if( kstat.context_swtch != ctx_switches ) 
  53.       PROC_INFO_INC( super, bread_miss ) );
  54.     return result;
  55. }