LCOV - code coverage report
Current view: top level - include/linux - buffer_head.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 33 40 82.5 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 51 353 14.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * include/linux/buffer_head.h
       3                 :            :  *
       4                 :            :  * Everything to do with buffer_heads.
       5                 :            :  */
       6                 :            : 
       7                 :            : #ifndef _LINUX_BUFFER_HEAD_H
       8                 :            : #define _LINUX_BUFFER_HEAD_H
       9                 :            : 
      10                 :            : #include <linux/types.h>
      11                 :            : #include <linux/fs.h>
      12                 :            : #include <linux/linkage.h>
      13                 :            : #include <linux/pagemap.h>
      14                 :            : #include <linux/wait.h>
      15                 :            : #include <linux/atomic.h>
      16                 :            : 
      17                 :            : #ifdef CONFIG_BLOCK
      18                 :            : 
      19                 :            : enum bh_state_bits {
      20                 :            :         BH_Uptodate,    /* Contains valid data */
      21                 :            :         BH_Dirty,       /* Is dirty */
      22                 :            :         BH_Lock,        /* Is locked */
      23                 :            :         BH_Req,         /* Has been submitted for I/O */
      24                 :            :         BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise
      25                 :            :                           * IO completion of other buffers in the page
      26                 :            :                           */
      27                 :            : 
      28                 :            :         BH_Mapped,      /* Has a disk mapping */
      29                 :            :         BH_New,         /* Disk mapping was newly created by get_block */
      30                 :            :         BH_Async_Read,  /* Is under end_buffer_async_read I/O */
      31                 :            :         BH_Async_Write, /* Is under end_buffer_async_write I/O */
      32                 :            :         BH_Delay,       /* Buffer is not yet allocated on disk */
      33                 :            :         BH_Boundary,    /* Block is followed by a discontiguity */
      34                 :            :         BH_Write_EIO,   /* I/O error on write */
      35                 :            :         BH_Unwritten,   /* Buffer is allocated on disk but not written */
      36                 :            :         BH_Quiet,       /* Buffer Error Prinks to be quiet */
      37                 :            :         BH_Meta,        /* Buffer contains metadata */
      38                 :            :         BH_Prio,        /* Buffer should be submitted with REQ_PRIO */
      39                 :            :         BH_Defer_Completion, /* Defer AIO completion to workqueue */
      40                 :            : 
      41                 :            :         BH_PrivateStart,/* not a state bit, but the first bit available
      42                 :            :                          * for private allocation by other entities
      43                 :            :                          */
      44                 :            : };
      45                 :            : 
      46                 :            : #define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512)
      47                 :            : 
      48                 :            : struct page;
      49                 :            : struct buffer_head;
      50                 :            : struct address_space;
      51                 :            : typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate);
      52                 :            : 
      53                 :            : /*
      54                 :            :  * Historically, a buffer_head was used to map a single block
      55                 :            :  * within a page, and of course as the unit of I/O through the
      56                 :            :  * filesystem and block layers.  Nowadays the basic I/O unit
      57                 :            :  * is the bio, and buffer_heads are used for extracting block
      58                 :            :  * mappings (via a get_block_t call), for tracking state within
      59                 :            :  * a page (via a page_mapping) and for wrapping bio submission
      60                 :            :  * for backward compatibility reasons (e.g. submit_bh).
      61                 :            :  */
      62                 :            : struct buffer_head {
      63                 :            :         unsigned long b_state;          /* buffer state bitmap (see above) */
      64                 :            :         struct buffer_head *b_this_page;/* circular list of page's buffers */
      65                 :            :         struct page *b_page;            /* the page this bh is mapped to */
      66                 :            : 
      67                 :            :         sector_t b_blocknr;             /* start block number */
      68                 :            :         size_t b_size;                  /* size of mapping */
      69                 :            :         char *b_data;                   /* pointer to data within the page */
      70                 :            : 
      71                 :            :         struct block_device *b_bdev;
      72                 :            :         bh_end_io_t *b_end_io;          /* I/O completion */
      73                 :            :         void *b_private;                /* reserved for b_end_io */
      74                 :            :         struct list_head b_assoc_buffers; /* associated with another mapping */
      75                 :            :         struct address_space *b_assoc_map;      /* mapping this buffer is
      76                 :            :                                                    associated with */
      77                 :            :         atomic_t b_count;               /* users using this buffer_head */
      78                 :            : };
      79                 :            : 
      80                 :            : /*
      81                 :            :  * macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
      82                 :            :  * and buffer_foo() functions.
      83                 :            :  */
      84                 :            : #define BUFFER_FNS(bit, name)                                           \
      85                 :            : static inline void set_buffer_##name(struct buffer_head *bh)            \
      86                 :            : {                                                                       \
      87                 :            :         set_bit(BH_##bit, &(bh)->b_state);                               \
      88                 :            : }                                                                       \
      89                 :            : static inline void clear_buffer_##name(struct buffer_head *bh)          \
      90                 :            : {                                                                       \
      91                 :            :         clear_bit(BH_##bit, &(bh)->b_state);                             \
      92                 :            : }                                                                       \
      93                 :            : static inline int buffer_##name(const struct buffer_head *bh)           \
      94                 :            : {                                                                       \
      95                 :            :         return test_bit(BH_##bit, &(bh)->b_state);                       \
      96                 :            : }
      97                 :            : 
      98                 :            : /*
      99                 :            :  * test_set_buffer_foo() and test_clear_buffer_foo()
     100                 :            :  */
     101                 :            : #define TAS_BUFFER_FNS(bit, name)                                       \
     102                 :            : static inline int test_set_buffer_##name(struct buffer_head *bh)        \
     103                 :            : {                                                                       \
     104                 :            :         return test_and_set_bit(BH_##bit, &(bh)->b_state);               \
     105                 :            : }                                                                       \
     106                 :            : static inline int test_clear_buffer_##name(struct buffer_head *bh)      \
     107                 :            : {                                                                       \
     108                 :            :         return test_and_clear_bit(BH_##bit, &(bh)->b_state);             \
     109                 :            : }                                                                       \
     110                 :            : 
     111                 :            : /*
     112                 :            :  * Emit the buffer bitops functions.   Note that there are also functions
     113                 :            :  * of the form "mark_buffer_foo()".  These are higher-level functions which
     114                 :            :  * do something in addition to setting a b_state bit.
     115                 :            :  */
     116                 :    7831330 : BUFFER_FNS(Uptodate, uptodate)
     117                 :    3807101 : BUFFER_FNS(Dirty, dirty)
     118                 :    2562977 : TAS_BUFFER_FNS(Dirty, dirty)
     119                 :            : BUFFER_FNS(Lock, locked)
     120                 :    1708134 : BUFFER_FNS(Req, req)
     121                 :     138168 : TAS_BUFFER_FNS(Req, req)
     122                 :    4247046 : BUFFER_FNS(Mapped, mapped)
     123                 :   10874868 : BUFFER_FNS(New, new)
     124                 :       1336 : BUFFER_FNS(Async_Read, async_read)
     125                 :    1880193 : BUFFER_FNS(Async_Write, async_write)
     126                 :    5362944 : BUFFER_FNS(Delay, delay)
     127                 :          0 : BUFFER_FNS(Boundary, boundary)
     128                 :      27785 : BUFFER_FNS(Write_EIO, write_io_error)
     129                 :    2356105 : BUFFER_FNS(Unwritten, unwritten)
     130                 :   14875646 : BUFFER_FNS(Meta, meta)
     131                 :   14876343 : BUFFER_FNS(Prio, prio)
     132                 :          0 : BUFFER_FNS(Defer_Completion, defer_completion)
     133                 :            : 
     134                 :            : #define bh_offset(bh)           ((unsigned long)(bh)->b_data & ~PAGE_MASK)
     135                 :            : 
     136                 :            : /* If we *know* page->private refers to buffer_heads */
     137                 :            : #define page_buffers(page)                                      \
     138                 :            :         ({                                                      \
     139                 :            :                 BUG_ON(!PagePrivate(page));                     \
     140                 :            :                 ((struct buffer_head *)page_private(page));     \
     141                 :            :         })
     142                 :            : #define page_has_buffers(page)  PagePrivate(page)
     143                 :            : 
     144                 :            : void buffer_check_dirty_writeback(struct page *page,
     145                 :            :                                      bool *dirty, bool *writeback);
     146                 :            : 
     147                 :            : /*
     148                 :            :  * Declarations
     149                 :            :  */
     150                 :            : 
     151                 :            : void mark_buffer_dirty(struct buffer_head *bh);
     152                 :            : void init_buffer(struct buffer_head *, bh_end_io_t *, void *);
     153                 :            : void touch_buffer(struct buffer_head *bh);
     154                 :            : void set_bh_page(struct buffer_head *bh,
     155                 :            :                 struct page *page, unsigned long offset);
     156                 :            : int try_to_free_buffers(struct page *);
     157                 :            : struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
     158                 :            :                 int retry);
     159                 :            : void create_empty_buffers(struct page *, unsigned long,
     160                 :            :                         unsigned long b_state);
     161                 :            : void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
     162                 :            : void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
     163                 :            : void end_buffer_async_write(struct buffer_head *bh, int uptodate);
     164                 :            : 
     165                 :            : /* Things to do with buffers at mapping->private_list */
     166                 :            : void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode);
     167                 :            : int inode_has_buffers(struct inode *);
     168                 :            : void invalidate_inode_buffers(struct inode *);
     169                 :            : int remove_inode_buffers(struct inode *inode);
     170                 :            : int sync_mapping_buffers(struct address_space *mapping);
     171                 :            : void unmap_underlying_metadata(struct block_device *bdev, sector_t block);
     172                 :            : 
     173                 :            : void mark_buffer_async_write(struct buffer_head *bh);
     174                 :            : void __wait_on_buffer(struct buffer_head *);
     175                 :            : wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
     176                 :            : struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block,
     177                 :            :                         unsigned size);
     178                 :            : struct buffer_head *__getblk(struct block_device *bdev, sector_t block,
     179                 :            :                         unsigned size);
     180                 :            : void __brelse(struct buffer_head *);
     181                 :            : void __bforget(struct buffer_head *);
     182                 :            : void __breadahead(struct block_device *, sector_t block, unsigned int size);
     183                 :            : struct buffer_head *__bread(struct block_device *, sector_t block, unsigned size);
     184                 :            : void invalidate_bh_lrus(void);
     185                 :            : struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
     186                 :            : void free_buffer_head(struct buffer_head * bh);
     187                 :            : void unlock_buffer(struct buffer_head *bh);
     188                 :            : void __lock_buffer(struct buffer_head *bh);
     189                 :            : void ll_rw_block(int, int, struct buffer_head * bh[]);
     190                 :            : int sync_dirty_buffer(struct buffer_head *bh);
     191                 :            : int __sync_dirty_buffer(struct buffer_head *bh, int rw);
     192                 :            : void write_dirty_buffer(struct buffer_head *bh, int rw);
     193                 :            : int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags);
     194                 :            : int submit_bh(int, struct buffer_head *);
     195                 :            : void write_boundary_block(struct block_device *bdev,
     196                 :            :                         sector_t bblock, unsigned blocksize);
     197                 :            : int bh_uptodate_or_lock(struct buffer_head *bh);
     198                 :            : int bh_submit_read(struct buffer_head *bh);
     199                 :            : 
     200                 :            : extern int buffer_heads_over_limit;
     201                 :            : 
     202                 :            : /*
     203                 :            :  * Generic address_space_operations implementations for buffer_head-backed
     204                 :            :  * address_spaces.
     205                 :            :  */
     206                 :            : void block_invalidatepage(struct page *page, unsigned int offset,
     207                 :            :                           unsigned int length);
     208                 :            : int block_write_full_page(struct page *page, get_block_t *get_block,
     209                 :            :                                 struct writeback_control *wbc);
     210                 :            : int block_write_full_page_endio(struct page *page, get_block_t *get_block,
     211                 :            :                         struct writeback_control *wbc, bh_end_io_t *handler);
     212                 :            : int block_read_full_page(struct page*, get_block_t*);
     213                 :            : int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc,
     214                 :            :                                 unsigned long from);
     215                 :            : int block_write_begin(struct address_space *mapping, loff_t pos, unsigned len,
     216                 :            :                 unsigned flags, struct page **pagep, get_block_t *get_block);
     217                 :            : int __block_write_begin(struct page *page, loff_t pos, unsigned len,
     218                 :            :                 get_block_t *get_block);
     219                 :            : int block_write_end(struct file *, struct address_space *,
     220                 :            :                                 loff_t, unsigned, unsigned,
     221                 :            :                                 struct page *, void *);
     222                 :            : int generic_write_end(struct file *, struct address_space *,
     223                 :            :                                 loff_t, unsigned, unsigned,
     224                 :            :                                 struct page *, void *);
     225                 :            : void page_zero_new_buffers(struct page *page, unsigned from, unsigned to);
     226                 :            : int cont_write_begin(struct file *, struct address_space *, loff_t,
     227                 :            :                         unsigned, unsigned, struct page **, void **,
     228                 :            :                         get_block_t *, loff_t *);
     229                 :            : int generic_cont_expand_simple(struct inode *inode, loff_t size);
     230                 :            : int block_commit_write(struct page *page, unsigned from, unsigned to);
     231                 :            : int __block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
     232                 :            :                                 get_block_t get_block);
     233                 :            : int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
     234                 :            :                                 get_block_t get_block);
     235                 :            : /* Convert errno to return value from ->page_mkwrite() call */
     236                 :            : static inline int block_page_mkwrite_return(int err)
     237                 :            : {
     238 [ -  + ][ #  # ]:     264352 :         if (err == 0)
     239                 :            :                 return VM_FAULT_LOCKED;
     240         [ #  # ]:          0 :         if (err == -EFAULT)
     241                 :            :                 return VM_FAULT_NOPAGE;
     242         [ #  # ]:          0 :         if (err == -ENOMEM)
     243                 :            :                 return VM_FAULT_OOM;
     244         [ #  # ]:     264352 :         if (err == -EAGAIN)
     245                 :            :                 return VM_FAULT_RETRY;
     246                 :            :         /* -ENOSPC, -EDQUOT, -EIO ... */
     247                 :            :         return VM_FAULT_SIGBUS;
     248                 :            : }
     249                 :            : sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
     250                 :            : int block_truncate_page(struct address_space *, loff_t, get_block_t *);
     251                 :            : int nobh_write_begin(struct address_space *, loff_t, unsigned, unsigned,
     252                 :            :                                 struct page **, void **, get_block_t*);
     253                 :            : int nobh_write_end(struct file *, struct address_space *,
     254                 :            :                                 loff_t, unsigned, unsigned,
     255                 :            :                                 struct page *, void *);
     256                 :            : int nobh_truncate_page(struct address_space *, loff_t, get_block_t *);
     257                 :            : int nobh_writepage(struct page *page, get_block_t *get_block,
     258                 :            :                         struct writeback_control *wbc);
     259                 :            : 
     260                 :            : void buffer_init(void);
     261                 :            : 
     262                 :            : /*
     263                 :            :  * inline definitions
     264                 :            :  */
     265                 :            : 
     266                 :            : static inline void attach_page_buffers(struct page *page,
     267                 :            :                 struct buffer_head *head)
     268                 :            : {
     269                 :            :         page_cache_get(page);
     270                 :            :         SetPagePrivate(page);
     271                 :    1898759 :         set_page_private(page, (unsigned long)head);
     272                 :            : }
     273                 :            : 
     274                 :            : static inline void get_bh(struct buffer_head *bh)
     275                 :            : {
     276                 :     326229 :         atomic_inc(&bh->b_count);
     277                 :            : }
     278                 :            : 
     279                 :            : static inline void put_bh(struct buffer_head *bh)
     280                 :            : {
     281                 :   25807364 :         smp_mb__before_atomic_dec();
     282                 :   25807381 :         atomic_dec(&bh->b_count);
     283                 :            : }
     284                 :            : 
     285                 :            : static inline void brelse(struct buffer_head *bh)
     286                 :            : {
     287 [ #  # ][ +  + ]:   16195337 :         if (bh)
         [ +  + ][ +  - ]
         [ #  # ][ +  - ]
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ +  +  #  #  
           #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  +  
             #  #  #  # ]
           [ #  #  +  -  
           #  # ][ +  - ]
         [ #  # ][ +  - ]
           [ +  -  #  # ]
           [ +  -  #  # ]
           [ +  +  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ +  + ]
         [ #  # ][ #  # ]
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ +  - ]
         [ #  # ][ +  - ]
         [ +  - ][ #  # ]
                 [ #  # ]
           [ #  #  +  - ]
         [ #  # ][ +  - ]
         [ #  # ][ #  # ]
         [ #  # ][ +  - ]
           [ +  -  #  #  
           #  # ][ +  - ]
         [ #  # ][ #  # ]
            [ + ][ #  # ]
         [ #  # ][ +  -  
          #  #  #  #  #  
          #  #  #  #  #  
           #  # ][ #  #  
             #  #  #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
           [ #  #  #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
         [ #  # ][ #  # ]
     288                 :   14183351 :                 __brelse(bh);
     289                 :            : }
     290                 :            : 
     291                 :            : static inline void bforget(struct buffer_head *bh)
     292                 :            : {
     293 [ #  # ][ #  # ]:          0 :         if (bh)
         [ #  # ][ #  # ]
     294                 :          0 :                 __bforget(bh);
     295                 :            : }
     296                 :            : 
     297                 :            : static inline struct buffer_head *
     298                 :            : sb_bread(struct super_block *sb, sector_t block)
     299                 :            : {
     300                 :          0 :         return __bread(sb->s_bdev, block, sb->s_blocksize);
     301                 :            : }
     302                 :            : 
     303                 :            : static inline void
     304                 :            : sb_breadahead(struct super_block *sb, sector_t block)
     305                 :            : {
     306                 :       5128 :         __breadahead(sb->s_bdev, block, sb->s_blocksize);
     307                 :            : }
     308                 :            : 
     309                 :            : static inline struct buffer_head *
     310                 :            : sb_getblk(struct super_block *sb, sector_t block)
     311                 :            : {
     312                 :   14199088 :         return __getblk(sb->s_bdev, block, sb->s_blocksize);
     313                 :            : }
     314                 :            : 
     315                 :            : static inline struct buffer_head *
     316                 :            : sb_find_get_block(struct super_block *sb, sector_t block)
     317                 :            : {
     318                 :      49340 :         return __find_get_block(sb->s_bdev, block, sb->s_blocksize);
     319                 :            : }
     320                 :            : 
     321                 :            : static inline void
     322                 :            : map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block)
     323                 :            : {
     324                 :            :         set_buffer_mapped(bh);
     325                 :    2376685 :         bh->b_bdev = sb->s_bdev;
     326                 :    2376685 :         bh->b_blocknr = block;
     327                 :    2376685 :         bh->b_size = sb->s_blocksize;
     328                 :            : }
     329                 :            : 
     330                 :            : static inline void wait_on_buffer(struct buffer_head *bh)
     331                 :            : {
     332                 :            :         might_sleep();
     333 [ +  + ][ +  -  :    1189331 :         if (buffer_locked(bh))
             +  -  +  - ]
         [ +  + ][ -  + ]
         [ #  # ][ +  -  
          -  +  #  #  #  
                #  #  # ]
     334                 :      42037 :                 __wait_on_buffer(bh);
     335                 :            : }
     336                 :            : 
     337                 :            : static inline int trylock_buffer(struct buffer_head *bh)
     338                 :            : {
     339                 :   19036019 :         return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
     340                 :            : }
     341                 :            : 
     342                 :            : static inline void lock_buffer(struct buffer_head *bh)
     343                 :            : {
     344                 :            :         might_sleep();
     345   [ +  +  +  +  :   17936599 :         if (!trylock_buffer(bh))
          -  +  #  #  -  
          +  -  +  #  #  
             -  +  #  # ]
     346                 :       4991 :                 __lock_buffer(bh);
     347                 :            : }
     348                 :            : 
     349                 :            : extern int __set_page_dirty_buffers(struct page *page);
     350                 :            : 
     351                 :            : #else /* CONFIG_BLOCK */
     352                 :            : 
     353                 :            : static inline void buffer_init(void) {}
     354                 :            : static inline int try_to_free_buffers(struct page *page) { return 1; }
     355                 :            : static inline int inode_has_buffers(struct inode *inode) { return 0; }
     356                 :            : static inline void invalidate_inode_buffers(struct inode *inode) {}
     357                 :            : static inline int remove_inode_buffers(struct inode *inode) { return 1; }
     358                 :            : static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; }
     359                 :            : 
     360                 :            : #endif /* CONFIG_BLOCK */
     361                 :            : #endif /* _LINUX_BUFFER_HEAD_H */

Generated by: LCOV version 1.9