11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * include/linux/buffer_head.h 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Everything to do with buffer_heads. 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds 71da177e4SLinus Torvalds #ifndef _LINUX_BUFFER_HEAD_H 81da177e4SLinus Torvalds #define _LINUX_BUFFER_HEAD_H 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/types.h> 111da177e4SLinus Torvalds #include <linux/fs.h> 121da177e4SLinus Torvalds #include <linux/linkage.h> 131da177e4SLinus Torvalds #include <linux/pagemap.h> 141da177e4SLinus Torvalds #include <linux/wait.h> 151da177e4SLinus Torvalds #include <asm/atomic.h> 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds enum bh_state_bits { 181da177e4SLinus Torvalds BH_Uptodate, /* Contains valid data */ 191da177e4SLinus Torvalds BH_Dirty, /* Is dirty */ 201da177e4SLinus Torvalds BH_Lock, /* Is locked */ 211da177e4SLinus Torvalds BH_Req, /* Has been submitted for I/O */ 22a3972203SNick Piggin BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise 23a3972203SNick Piggin * IO completion of other buffers in the page 24a3972203SNick Piggin */ 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds BH_Mapped, /* Has a disk mapping */ 271da177e4SLinus Torvalds BH_New, /* Disk mapping was newly created by get_block */ 281da177e4SLinus Torvalds BH_Async_Read, /* Is under end_buffer_async_read I/O */ 291da177e4SLinus Torvalds BH_Async_Write, /* Is under end_buffer_async_write I/O */ 301da177e4SLinus Torvalds BH_Delay, /* Buffer is not yet allocated on disk */ 311da177e4SLinus Torvalds BH_Boundary, /* Block is followed by a discontiguity */ 321da177e4SLinus Torvalds BH_Write_EIO, /* I/O error on write */ 331da177e4SLinus Torvalds BH_Ordered, /* ordered write */ 341da177e4SLinus Torvalds BH_Eopnotsupp, /* operation not supported (barrier) */ 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds BH_PrivateStart,/* not a state bit, but the first bit available 371da177e4SLinus Torvalds * for private allocation by other entities 381da177e4SLinus Torvalds */ 391da177e4SLinus Torvalds }; 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds #define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512) 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds struct page; 441da177e4SLinus Torvalds struct buffer_head; 451da177e4SLinus Torvalds struct address_space; 461da177e4SLinus Torvalds typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate); 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds /* 491da177e4SLinus Torvalds * Keep related fields in common cachelines. The most commonly accessed 501da177e4SLinus Torvalds * field (b_state) goes at the start so the compiler does not generate 511da177e4SLinus Torvalds * indexed addressing for it. 521da177e4SLinus Torvalds */ 531da177e4SLinus Torvalds struct buffer_head { 541da177e4SLinus Torvalds /* First cache line: */ 551da177e4SLinus Torvalds unsigned long b_state; /* buffer state bitmap (see above) */ 561da177e4SLinus Torvalds struct buffer_head *b_this_page;/* circular list of page's buffers */ 571da177e4SLinus Torvalds struct page *b_page; /* the page this bh is mapped to */ 581da177e4SLinus Torvalds atomic_t b_count; /* users using this block */ 591da177e4SLinus Torvalds u32 b_size; /* block size */ 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds sector_t b_blocknr; /* block number */ 621da177e4SLinus Torvalds char *b_data; /* pointer to data block */ 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds struct block_device *b_bdev; 651da177e4SLinus Torvalds bh_end_io_t *b_end_io; /* I/O completion */ 661da177e4SLinus Torvalds void *b_private; /* reserved for b_end_io */ 671da177e4SLinus Torvalds struct list_head b_assoc_buffers; /* associated with another mapping */ 681da177e4SLinus Torvalds }; 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds /* 711da177e4SLinus Torvalds * macro tricks to expand the set_buffer_foo(), clear_buffer_foo() 721da177e4SLinus Torvalds * and buffer_foo() functions. 731da177e4SLinus Torvalds */ 741da177e4SLinus Torvalds #define BUFFER_FNS(bit, name) \ 751da177e4SLinus Torvalds static inline void set_buffer_##name(struct buffer_head *bh) \ 761da177e4SLinus Torvalds { \ 771da177e4SLinus Torvalds set_bit(BH_##bit, &(bh)->b_state); \ 781da177e4SLinus Torvalds } \ 791da177e4SLinus Torvalds static inline void clear_buffer_##name(struct buffer_head *bh) \ 801da177e4SLinus Torvalds { \ 811da177e4SLinus Torvalds clear_bit(BH_##bit, &(bh)->b_state); \ 821da177e4SLinus Torvalds } \ 831da177e4SLinus Torvalds static inline int buffer_##name(const struct buffer_head *bh) \ 841da177e4SLinus Torvalds { \ 851da177e4SLinus Torvalds return test_bit(BH_##bit, &(bh)->b_state); \ 861da177e4SLinus Torvalds } 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds /* 891da177e4SLinus Torvalds * test_set_buffer_foo() and test_clear_buffer_foo() 901da177e4SLinus Torvalds */ 911da177e4SLinus Torvalds #define TAS_BUFFER_FNS(bit, name) \ 921da177e4SLinus Torvalds static inline int test_set_buffer_##name(struct buffer_head *bh) \ 931da177e4SLinus Torvalds { \ 941da177e4SLinus Torvalds return test_and_set_bit(BH_##bit, &(bh)->b_state); \ 951da177e4SLinus Torvalds } \ 961da177e4SLinus Torvalds static inline int test_clear_buffer_##name(struct buffer_head *bh) \ 971da177e4SLinus Torvalds { \ 981da177e4SLinus Torvalds return test_and_clear_bit(BH_##bit, &(bh)->b_state); \ 991da177e4SLinus Torvalds } \ 1001da177e4SLinus Torvalds 1011da177e4SLinus Torvalds /* 1021da177e4SLinus Torvalds * Emit the buffer bitops functions. Note that there are also functions 1031da177e4SLinus Torvalds * of the form "mark_buffer_foo()". These are higher-level functions which 1041da177e4SLinus Torvalds * do something in addition to setting a b_state bit. 1051da177e4SLinus Torvalds */ 1061da177e4SLinus Torvalds BUFFER_FNS(Uptodate, uptodate) 1071da177e4SLinus Torvalds BUFFER_FNS(Dirty, dirty) 1081da177e4SLinus Torvalds TAS_BUFFER_FNS(Dirty, dirty) 1091da177e4SLinus Torvalds BUFFER_FNS(Lock, locked) 1101da177e4SLinus Torvalds TAS_BUFFER_FNS(Lock, locked) 1111da177e4SLinus Torvalds BUFFER_FNS(Req, req) 1121da177e4SLinus Torvalds TAS_BUFFER_FNS(Req, req) 1131da177e4SLinus Torvalds BUFFER_FNS(Mapped, mapped) 1141da177e4SLinus Torvalds BUFFER_FNS(New, new) 1151da177e4SLinus Torvalds BUFFER_FNS(Async_Read, async_read) 1161da177e4SLinus Torvalds BUFFER_FNS(Async_Write, async_write) 1171da177e4SLinus Torvalds BUFFER_FNS(Delay, delay) 1181da177e4SLinus Torvalds BUFFER_FNS(Boundary, boundary) 1191da177e4SLinus Torvalds BUFFER_FNS(Write_EIO, write_io_error) 1201da177e4SLinus Torvalds BUFFER_FNS(Ordered, ordered) 1211da177e4SLinus Torvalds BUFFER_FNS(Eopnotsupp, eopnotsupp) 1221da177e4SLinus Torvalds 1231da177e4SLinus Torvalds #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) 1241da177e4SLinus Torvalds #define touch_buffer(bh) mark_page_accessed(bh->b_page) 1251da177e4SLinus Torvalds 1261da177e4SLinus Torvalds /* If we *know* page->private refers to buffer_heads */ 1271da177e4SLinus Torvalds #define page_buffers(page) \ 1281da177e4SLinus Torvalds ({ \ 1291da177e4SLinus Torvalds BUG_ON(!PagePrivate(page)); \ 1304c21e2f2SHugh Dickins ((struct buffer_head *)page_private(page)); \ 1311da177e4SLinus Torvalds }) 1321da177e4SLinus Torvalds #define page_has_buffers(page) PagePrivate(page) 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds /* 1351da177e4SLinus Torvalds * Declarations 1361da177e4SLinus Torvalds */ 1371da177e4SLinus Torvalds 1381da177e4SLinus Torvalds void FASTCALL(mark_buffer_dirty(struct buffer_head *bh)); 1391da177e4SLinus Torvalds void init_buffer(struct buffer_head *, bh_end_io_t *, void *); 1401da177e4SLinus Torvalds void set_bh_page(struct buffer_head *bh, 1411da177e4SLinus Torvalds struct page *page, unsigned long offset); 1421da177e4SLinus Torvalds int try_to_free_buffers(struct page *); 1431da177e4SLinus Torvalds struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size, 1441da177e4SLinus Torvalds int retry); 1451da177e4SLinus Torvalds void create_empty_buffers(struct page *, unsigned long, 1461da177e4SLinus Torvalds unsigned long b_state); 1471da177e4SLinus Torvalds void end_buffer_read_sync(struct buffer_head *bh, int uptodate); 1481da177e4SLinus Torvalds void end_buffer_write_sync(struct buffer_head *bh, int uptodate); 1491da177e4SLinus Torvalds void end_buffer_async_write(struct buffer_head *bh, int uptodate); 1501da177e4SLinus Torvalds 1511da177e4SLinus Torvalds /* Things to do with buffers at mapping->private_list */ 1521da177e4SLinus Torvalds void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode); 1531da177e4SLinus Torvalds int inode_has_buffers(struct inode *); 1541da177e4SLinus Torvalds void invalidate_inode_buffers(struct inode *); 1551da177e4SLinus Torvalds int remove_inode_buffers(struct inode *inode); 1561da177e4SLinus Torvalds int sync_mapping_buffers(struct address_space *mapping); 1571da177e4SLinus Torvalds void unmap_underlying_metadata(struct block_device *bdev, sector_t block); 1581da177e4SLinus Torvalds 1591da177e4SLinus Torvalds void mark_buffer_async_write(struct buffer_head *bh); 1601da177e4SLinus Torvalds void invalidate_bdev(struct block_device *, int); 1611da177e4SLinus Torvalds int sync_blockdev(struct block_device *bdev); 1621da177e4SLinus Torvalds void __wait_on_buffer(struct buffer_head *); 1631da177e4SLinus Torvalds wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); 1641da177e4SLinus Torvalds int fsync_bdev(struct block_device *); 1651da177e4SLinus Torvalds struct super_block *freeze_bdev(struct block_device *); 1661da177e4SLinus Torvalds void thaw_bdev(struct block_device *, struct super_block *); 1671da177e4SLinus Torvalds int fsync_super(struct super_block *); 1681da177e4SLinus Torvalds int fsync_no_super(struct block_device *); 1691da177e4SLinus Torvalds struct buffer_head *__find_get_block(struct block_device *, sector_t, int); 1701da177e4SLinus Torvalds struct buffer_head * __getblk(struct block_device *, sector_t, int); 1711da177e4SLinus Torvalds void __brelse(struct buffer_head *); 1721da177e4SLinus Torvalds void __bforget(struct buffer_head *); 1731da177e4SLinus Torvalds void __breadahead(struct block_device *, sector_t block, int size); 1741da177e4SLinus Torvalds struct buffer_head *__bread(struct block_device *, sector_t block, int size); 175dd0fc66fSAl Viro struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); 1761da177e4SLinus Torvalds void free_buffer_head(struct buffer_head * bh); 1771da177e4SLinus Torvalds void FASTCALL(unlock_buffer(struct buffer_head *bh)); 1781da177e4SLinus Torvalds void FASTCALL(__lock_buffer(struct buffer_head *bh)); 1791da177e4SLinus Torvalds void ll_rw_block(int, int, struct buffer_head * bh[]); 1801da177e4SLinus Torvalds int sync_dirty_buffer(struct buffer_head *bh); 1811da177e4SLinus Torvalds int submit_bh(int, struct buffer_head *); 1821da177e4SLinus Torvalds void write_boundary_block(struct block_device *bdev, 1831da177e4SLinus Torvalds sector_t bblock, unsigned blocksize); 1841da177e4SLinus Torvalds 1851da177e4SLinus Torvalds extern int buffer_heads_over_limit; 1861da177e4SLinus Torvalds 1871da177e4SLinus Torvalds /* 1881da177e4SLinus Torvalds * Generic address_space_operations implementations for buffer_head-backed 1891da177e4SLinus Torvalds * address_spaces. 1901da177e4SLinus Torvalds */ 19127496a8cSAl Viro int try_to_release_page(struct page * page, gfp_t gfp_mask); 192*2ff28e22SNeilBrown void block_invalidatepage(struct page *page, unsigned long offset); 193*2ff28e22SNeilBrown void do_invalidatepage(struct page *page, unsigned long offset); 1941da177e4SLinus Torvalds int block_write_full_page(struct page *page, get_block_t *get_block, 1951da177e4SLinus Torvalds struct writeback_control *wbc); 1961da177e4SLinus Torvalds int block_read_full_page(struct page*, get_block_t*); 1971da177e4SLinus Torvalds int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); 1981da177e4SLinus Torvalds int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*, 1991da177e4SLinus Torvalds loff_t *); 2001da177e4SLinus Torvalds int generic_cont_expand(struct inode *inode, loff_t size); 20105eb0b51SOGAWA Hirofumi int generic_cont_expand_simple(struct inode *inode, loff_t size); 2021da177e4SLinus Torvalds int block_commit_write(struct page *page, unsigned from, unsigned to); 2033978d717SNeilBrown void block_sync_page(struct page *); 2041da177e4SLinus Torvalds sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); 2051da177e4SLinus Torvalds int generic_commit_write(struct file *, struct page *, unsigned, unsigned); 2061da177e4SLinus Torvalds int block_truncate_page(struct address_space *, loff_t, get_block_t *); 2071da177e4SLinus Torvalds int file_fsync(struct file *, struct dentry *, int); 2081da177e4SLinus Torvalds int nobh_prepare_write(struct page*, unsigned, unsigned, get_block_t*); 2091da177e4SLinus Torvalds int nobh_commit_write(struct file *, struct page *, unsigned, unsigned); 2101da177e4SLinus Torvalds int nobh_truncate_page(struct address_space *, loff_t); 2111da177e4SLinus Torvalds int nobh_writepage(struct page *page, get_block_t *get_block, 2121da177e4SLinus Torvalds struct writeback_control *wbc); 2131da177e4SLinus Torvalds 2141da177e4SLinus Torvalds 2151da177e4SLinus Torvalds /* 2161da177e4SLinus Torvalds * inline definitions 2171da177e4SLinus Torvalds */ 2181da177e4SLinus Torvalds 2191da177e4SLinus Torvalds static inline void attach_page_buffers(struct page *page, 2201da177e4SLinus Torvalds struct buffer_head *head) 2211da177e4SLinus Torvalds { 2221da177e4SLinus Torvalds page_cache_get(page); 2231da177e4SLinus Torvalds SetPagePrivate(page); 2244c21e2f2SHugh Dickins set_page_private(page, (unsigned long)head); 2251da177e4SLinus Torvalds } 2261da177e4SLinus Torvalds 2271da177e4SLinus Torvalds static inline void get_bh(struct buffer_head *bh) 2281da177e4SLinus Torvalds { 2291da177e4SLinus Torvalds atomic_inc(&bh->b_count); 2301da177e4SLinus Torvalds } 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds static inline void put_bh(struct buffer_head *bh) 2331da177e4SLinus Torvalds { 2341da177e4SLinus Torvalds smp_mb__before_atomic_dec(); 2351da177e4SLinus Torvalds atomic_dec(&bh->b_count); 2361da177e4SLinus Torvalds } 2371da177e4SLinus Torvalds 2381da177e4SLinus Torvalds static inline void brelse(struct buffer_head *bh) 2391da177e4SLinus Torvalds { 2401da177e4SLinus Torvalds if (bh) 2411da177e4SLinus Torvalds __brelse(bh); 2421da177e4SLinus Torvalds } 2431da177e4SLinus Torvalds 2441da177e4SLinus Torvalds static inline void bforget(struct buffer_head *bh) 2451da177e4SLinus Torvalds { 2461da177e4SLinus Torvalds if (bh) 2471da177e4SLinus Torvalds __bforget(bh); 2481da177e4SLinus Torvalds } 2491da177e4SLinus Torvalds 2501da177e4SLinus Torvalds static inline struct buffer_head * 2511da177e4SLinus Torvalds sb_bread(struct super_block *sb, sector_t block) 2521da177e4SLinus Torvalds { 2531da177e4SLinus Torvalds return __bread(sb->s_bdev, block, sb->s_blocksize); 2541da177e4SLinus Torvalds } 2551da177e4SLinus Torvalds 2561da177e4SLinus Torvalds static inline void 2571da177e4SLinus Torvalds sb_breadahead(struct super_block *sb, sector_t block) 2581da177e4SLinus Torvalds { 2591da177e4SLinus Torvalds __breadahead(sb->s_bdev, block, sb->s_blocksize); 2601da177e4SLinus Torvalds } 2611da177e4SLinus Torvalds 2621da177e4SLinus Torvalds static inline struct buffer_head * 2631da177e4SLinus Torvalds sb_getblk(struct super_block *sb, sector_t block) 2641da177e4SLinus Torvalds { 2651da177e4SLinus Torvalds return __getblk(sb->s_bdev, block, sb->s_blocksize); 2661da177e4SLinus Torvalds } 2671da177e4SLinus Torvalds 2681da177e4SLinus Torvalds static inline struct buffer_head * 2691da177e4SLinus Torvalds sb_find_get_block(struct super_block *sb, sector_t block) 2701da177e4SLinus Torvalds { 2711da177e4SLinus Torvalds return __find_get_block(sb->s_bdev, block, sb->s_blocksize); 2721da177e4SLinus Torvalds } 2731da177e4SLinus Torvalds 2741da177e4SLinus Torvalds static inline void 2751da177e4SLinus Torvalds map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) 2761da177e4SLinus Torvalds { 2771da177e4SLinus Torvalds set_buffer_mapped(bh); 2781da177e4SLinus Torvalds bh->b_bdev = sb->s_bdev; 2791da177e4SLinus Torvalds bh->b_blocknr = block; 2801da177e4SLinus Torvalds } 2811da177e4SLinus Torvalds 2821da177e4SLinus Torvalds /* 2831da177e4SLinus Torvalds * Calling wait_on_buffer() for a zero-ref buffer is illegal, so we call into 2841da177e4SLinus Torvalds * __wait_on_buffer() just to trip a debug check. Because debug code in inline 2851da177e4SLinus Torvalds * functions is bloaty. 2861da177e4SLinus Torvalds */ 2871da177e4SLinus Torvalds static inline void wait_on_buffer(struct buffer_head *bh) 2881da177e4SLinus Torvalds { 2891da177e4SLinus Torvalds might_sleep(); 2901da177e4SLinus Torvalds if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0) 2911da177e4SLinus Torvalds __wait_on_buffer(bh); 2921da177e4SLinus Torvalds } 2931da177e4SLinus Torvalds 2941da177e4SLinus Torvalds static inline void lock_buffer(struct buffer_head *bh) 2951da177e4SLinus Torvalds { 2961da177e4SLinus Torvalds might_sleep(); 2971da177e4SLinus Torvalds if (test_set_buffer_locked(bh)) 2981da177e4SLinus Torvalds __lock_buffer(bh); 2991da177e4SLinus Torvalds } 3001da177e4SLinus Torvalds 3011da177e4SLinus Torvalds #endif /* _LINUX_BUFFER_HEAD_H */ 302