linux/include/linux/buffer_head.h
<<
>>
Prefs
   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 <asm/atomic.h>
  16
  17enum bh_state_bits {
  18        BH_Uptodate,    /* Contains valid data */
  19        BH_Dirty,       /* Is dirty */
  20        BH_Lock,        /* Is locked */
  21        BH_Req,         /* Has been submitted for I/O */
  22        BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise
  23                          * IO completion of other buffers in the page
  24                          */
  25
  26        BH_Mapped,      /* Has a disk mapping */
  27        BH_New,         /* Disk mapping was newly created by get_block */
  28        BH_Async_Read,  /* Is under end_buffer_async_read I/O */
  29        BH_Async_Write, /* Is under end_buffer_async_write I/O */
  30        BH_Delay,       /* Buffer is not yet allocated on disk */
  31        BH_Boundary,    /* Block is followed by a discontiguity */
  32        BH_Write_EIO,   /* I/O error on write */
  33        BH_Ordered,     /* ordered write */
  34        BH_Eopnotsupp,  /* operation not supported (barrier) */
  35
  36        BH_PrivateStart,/* not a state bit, but the first bit available
  37                         * for private allocation by other entities
  38                         */
  39};
  40
  41#define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512)
  42
  43struct page;
  44struct buffer_head;
  45struct address_space;
  46typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate);
  47
  48/*
  49 * Historically, a buffer_head was used to map a single block
  50 * within a page, and of course as the unit of I/O through the
  51 * filesystem and block layers.  Nowadays the basic I/O unit
  52 * is the bio, and buffer_heads are used for extracting block
  53 * mappings (via a get_block_t call), for tracking state within
  54 * a page (via a page_mapping) and for wrapping bio submission
  55 * for backward compatibility reasons (e.g. submit_bh).
  56 */
  57struct buffer_head {
  58        unsigned long b_state;          /* buffer state bitmap (see above) */
  59        struct buffer_head *b_this_page;/* circular list of page's buffers */
  60        struct page *b_page;            /* the page this bh is mapped to */
  61
  62        sector_t b_blocknr;             /* start block number */
  63        size_t b_size;                  /* size of mapping */
  64        char *b_data;                   /* pointer to data within the page */
  65
  66        struct block_device *b_bdev;
  67        bh_end_io_t *b_end_io;          /* I/O completion */
  68        void *b_private;                /* reserved for b_end_io */
  69        struct list_head b_assoc_buffers; /* associated with another mapping */
  70        atomic_t b_count;               /* users using this buffer_head */
  71};
  72
  73/*
  74 * macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
  75 * and buffer_foo() functions.
  76 */
  77#define BUFFER_FNS(bit, name)                                           \
  78static inline void set_buffer_##name(struct buffer_head *bh)            \
  79{                                                                       \
  80        set_bit(BH_##bit, &(bh)->b_state);                              \
  81}                                                                       \
  82static inline void clear_buffer_##name(struct buffer_head *bh)          \
  83{                                                                       \
  84        clear_bit(BH_##bit, &(bh)->b_state);                            \
  85}                                                                       \
  86static inline int buffer_##name(const struct buffer_head *bh)           \
  87{                                                                       \
  88        return test_bit(BH_##bit, &(bh)->b_state);                      \
  89}
  90
  91/*
  92 * test_set_buffer_foo() and test_clear_buffer_foo()
  93 */
  94#define TAS_BUFFER_FNS(bit, name)                                       \
  95static inline int test_set_buffer_##name(struct buffer_head *bh)        \
  96{                                                                       \
  97        return test_and_set_bit(BH_##bit, &(bh)->b_state);              \
  98}                                                                       \
  99static inline int test_clear_buffer_##name(struct buffer_head *bh)      \
 100{                                                                       \
 101        return test_and_clear_bit(BH_##bit, &(bh)->b_state);            \
 102}                                                                       \
 103
 104/*
 105 * Emit the buffer bitops functions.   Note that there are also functions
 106 * of the form "mark_buffer_foo()".  These are higher-level functions which
 107 * do something in addition to setting a b_state bit.
 108 */
 109BUFFER_FNS(Uptodate, uptodate)
 110BUFFER_FNS(Dirty, dirty)
 111TAS_BUFFER_FNS(Dirty, dirty)
 112BUFFER_FNS(Lock, locked)
 113TAS_BUFFER_FNS(Lock, locked)
 114BUFFER_FNS(Req, req)
 115TAS_BUFFER_FNS(Req, req)
 116BUFFER_FNS(Mapped, mapped)
 117BUFFER_FNS(New, new)
 118BUFFER_FNS(Async_Read, async_read)
 119BUFFER_FNS(Async_Write, async_write)
 120BUFFER_FNS(Delay, delay)
 121BUFFER_FNS(Boundary, boundary)
 122BUFFER_FNS(Write_EIO, write_io_error)
 123BUFFER_FNS(Ordered, ordered)
 124BUFFER_FNS(Eopnotsupp, eopnotsupp)
 125
 126#define bh_offset(bh)           ((unsigned long)(bh)->b_data & ~PAGE_MASK)
 127#define touch_buffer(bh)        mark_page_accessed(bh->b_page)
 128
 129/* If we *know* page->private refers to buffer_heads */
 130#define page_buffers(page)                                      \
 131        ({                                                      \
 132                BUG_ON(!PagePrivate(page));                     \
 133                ((struct buffer_head *)page_private(page));     \
 134        })
 135#define page_has_buffers(page)  PagePrivate(page)
 136
 137/*
 138 * Declarations
 139 */
 140
 141void FASTCALL(mark_buffer_dirty(struct buffer_head *bh));
 142void init_buffer(struct buffer_head *, bh_end_io_t *, void *);
 143void set_bh_page(struct buffer_head *bh,
 144                struct page *page, unsigned long offset);
 145int try_to_free_buffers(struct page *);
 146struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
 147                int retry);
 148void create_empty_buffers(struct page *, unsigned long,
 149                        unsigned long b_state);
 150void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
 151void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
 152
 153/* Things to do with buffers at mapping->private_list */
 154void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode);
 155int inode_has_buffers(struct inode *);
 156void invalidate_inode_buffers(struct inode *);
 157int remove_inode_buffers(struct inode *inode);
 158int sync_mapping_buffers(struct address_space *mapping);
 159void unmap_underlying_metadata(struct block_device *bdev, sector_t block);
 160
 161void mark_buffer_async_write(struct buffer_head *bh);
 162void invalidate_bdev(struct block_device *, int);
 163int sync_blockdev(struct block_device *bdev);
 164void __wait_on_buffer(struct buffer_head *);
 165wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
 166int fsync_bdev(struct block_device *);
 167struct super_block *freeze_bdev(struct block_device *);
 168void thaw_bdev(struct block_device *, struct super_block *);
 169int fsync_super(struct super_block *);
 170int fsync_no_super(struct block_device *);
 171struct buffer_head *__find_get_block(struct block_device *, sector_t, int);
 172struct buffer_head * __getblk(struct block_device *, sector_t, int);
 173void __brelse(struct buffer_head *);
 174void __bforget(struct buffer_head *);
 175void __breadahead(struct block_device *, sector_t block, int size);
 176struct buffer_head *__bread(struct block_device *, sector_t block, int size);
 177struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
 178void free_buffer_head(struct buffer_head * bh);
 179void FASTCALL(unlock_buffer(struct buffer_head *bh));
 180void FASTCALL(__lock_buffer(struct buffer_head *bh));
 181void ll_rw_block(int, int, struct buffer_head * bh[]);
 182int sync_dirty_buffer(struct buffer_head *bh);
 183int submit_bh(int, struct buffer_head *);
 184void write_boundary_block(struct block_device *bdev,
 185                        sector_t bblock, unsigned blocksize);
 186
 187extern int buffer_heads_over_limit;
 188
 189/*
 190 * Generic address_space_operations implementations for buffer_head-backed
 191 * address_spaces.
 192 */
 193int try_to_release_page(struct page * page, gfp_t gfp_mask);
 194void block_invalidatepage(struct page *page, unsigned long offset);
 195void do_invalidatepage(struct page *page, unsigned long offset);
 196int block_write_full_page(struct page *page, get_block_t *get_block,
 197                                struct writeback_control *wbc);
 198int block_read_full_page(struct page*, get_block_t*);
 199int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*);
 200int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*,
 201                                loff_t *);
 202int generic_cont_expand(struct inode *inode, loff_t size);
 203int generic_cont_expand_simple(struct inode *inode, loff_t size);
 204int block_commit_write(struct page *page, unsigned from, unsigned to);
 205void block_sync_page(struct page *);
 206sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
 207int generic_commit_write(struct file *, struct page *, unsigned, unsigned);
 208int block_truncate_page(struct address_space *, loff_t, get_block_t *);
 209int file_fsync(struct file *, struct dentry *, int);
 210int nobh_prepare_write(struct page*, unsigned, unsigned, get_block_t*);
 211int nobh_commit_write(struct file *, struct page *, unsigned, unsigned);
 212int nobh_truncate_page(struct address_space *, loff_t);
 213int nobh_writepage(struct page *page, get_block_t *get_block,
 214                        struct writeback_control *wbc);
 215
 216void buffer_init(void);
 217
 218/*
 219 * inline definitions
 220 */
 221
 222static inline void attach_page_buffers(struct page *page,
 223                struct buffer_head *head)
 224{
 225        page_cache_get(page);
 226        SetPagePrivate(page);
 227        set_page_private(page, (unsigned long)head);
 228}
 229
 230static inline void get_bh(struct buffer_head *bh)
 231{
 232        atomic_inc(&bh->b_count);
 233}
 234
 235static inline void put_bh(struct buffer_head *bh)
 236{
 237        smp_mb__before_atomic_dec();
 238        atomic_dec(&bh->b_count);
 239}
 240
 241static inline void brelse(struct buffer_head *bh)
 242{
 243        if (bh)
 244                __brelse(bh);
 245}
 246
 247static inline void bforget(struct buffer_head *bh)
 248{
 249        if (bh)
 250                __bforget(bh);
 251}
 252
 253static inline struct buffer_head *
 254sb_bread(struct super_block *sb, sector_t block)
 255{
 256        return __bread(sb->s_bdev, block, sb->s_blocksize);
 257}
 258
 259static inline void
 260sb_breadahead(struct super_block *sb, sector_t block)
 261{
 262        __breadahead(sb->s_bdev, block, sb->s_blocksize);
 263}
 264
 265static inline struct buffer_head *
 266sb_getblk(struct super_block *sb, sector_t block)
 267{
 268        return __getblk(sb->s_bdev, block, sb->s_blocksize);
 269}
 270
 271static inline struct buffer_head *
 272sb_find_get_block(struct super_block *sb, sector_t block)
 273{
 274        return __find_get_block(sb->s_bdev, block, sb->s_blocksize);
 275}
 276
 277static inline void
 278map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block)
 279{
 280        set_buffer_mapped(bh);
 281        bh->b_bdev = sb->s_bdev;
 282        bh->b_blocknr = block;
 283        bh->b_size = sb->s_blocksize;
 284}
 285
 286/*
 287 * Calling wait_on_buffer() for a zero-ref buffer is illegal, so we call into
 288 * __wait_on_buffer() just to trip a debug check.  Because debug code in inline
 289 * functions is bloaty.
 290 */
 291static inline void wait_on_buffer(struct buffer_head *bh)
 292{
 293        might_sleep();
 294        if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
 295                __wait_on_buffer(bh);
 296}
 297
 298static inline void lock_buffer(struct buffer_head *bh)
 299{
 300        might_sleep();
 301        if (test_set_buffer_locked(bh))
 302                __lock_buffer(bh);
 303}
 304
 305#endif /* _LINUX_BUFFER_HEAD_H */
 306
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.