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> 1560063497SArun Sharma #include <linux/atomic.h> 161da177e4SLinus Torvalds 179361401eSDavid Howells #ifdef CONFIG_BLOCK 189361401eSDavid Howells 191da177e4SLinus Torvalds enum bh_state_bits { 201da177e4SLinus Torvalds BH_Uptodate, /* Contains valid data */ 211da177e4SLinus Torvalds BH_Dirty, /* Is dirty */ 221da177e4SLinus Torvalds BH_Lock, /* Is locked */ 231da177e4SLinus Torvalds BH_Req, /* Has been submitted for I/O */ 24a3972203SNick Piggin BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise 25a3972203SNick Piggin * IO completion of other buffers in the page 26a3972203SNick Piggin */ 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds BH_Mapped, /* Has a disk mapping */ 291da177e4SLinus Torvalds BH_New, /* Disk mapping was newly created by get_block */ 301da177e4SLinus Torvalds BH_Async_Read, /* Is under end_buffer_async_read I/O */ 311da177e4SLinus Torvalds BH_Async_Write, /* Is under end_buffer_async_write I/O */ 321da177e4SLinus Torvalds BH_Delay, /* Buffer is not yet allocated on disk */ 331da177e4SLinus Torvalds BH_Boundary, /* Block is followed by a discontiguity */ 341da177e4SLinus Torvalds BH_Write_EIO, /* I/O error on write */ 3533a266ddSDavid Chinner BH_Unwritten, /* Buffer is allocated on disk but not written */ 3608bafc03SKeith Mannthey BH_Quiet, /* Buffer Error Prinks to be quiet */ 37877f962cSTheodore Ts'o BH_Meta, /* Buffer contains metadata */ 38877f962cSTheodore Ts'o BH_Prio, /* Buffer should be submitted with REQ_PRIO */ 397b7a8665SChristoph Hellwig BH_Defer_Completion, /* Defer AIO completion to workqueue */ 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds BH_PrivateStart,/* not a state bit, but the first bit available 421da177e4SLinus Torvalds * for private allocation by other entities 431da177e4SLinus Torvalds */ 441da177e4SLinus Torvalds }; 451da177e4SLinus Torvalds 4609cbfeafSKirill A. Shutemov #define MAX_BUF_PER_PAGE (PAGE_SIZE / 512) 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds struct page; 491da177e4SLinus Torvalds struct buffer_head; 501da177e4SLinus Torvalds struct address_space; 511da177e4SLinus Torvalds typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate); 521da177e4SLinus Torvalds 531da177e4SLinus Torvalds /* 54205f87f6SBadari Pulavarty * Historically, a buffer_head was used to map a single block 55205f87f6SBadari Pulavarty * within a page, and of course as the unit of I/O through the 56205f87f6SBadari Pulavarty * filesystem and block layers. Nowadays the basic I/O unit 57205f87f6SBadari Pulavarty * is the bio, and buffer_heads are used for extracting block 58205f87f6SBadari Pulavarty * mappings (via a get_block_t call), for tracking state within 59205f87f6SBadari Pulavarty * a page (via a page_mapping) and for wrapping bio submission 60205f87f6SBadari Pulavarty * for backward compatibility reasons (e.g. submit_bh). 611da177e4SLinus Torvalds */ 621da177e4SLinus Torvalds struct buffer_head { 631da177e4SLinus Torvalds unsigned long b_state; /* buffer state bitmap (see above) */ 641da177e4SLinus Torvalds struct buffer_head *b_this_page;/* circular list of page's buffers */ 651da177e4SLinus Torvalds struct page *b_page; /* the page this bh is mapped to */ 661da177e4SLinus Torvalds 67205f87f6SBadari Pulavarty sector_t b_blocknr; /* start block number */ 68205f87f6SBadari Pulavarty size_t b_size; /* size of mapping */ 69205f87f6SBadari Pulavarty char *b_data; /* pointer to data within the page */ 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds struct block_device *b_bdev; 721da177e4SLinus Torvalds bh_end_io_t *b_end_io; /* I/O completion */ 731da177e4SLinus Torvalds void *b_private; /* reserved for b_end_io */ 741da177e4SLinus Torvalds struct list_head b_assoc_buffers; /* associated with another mapping */ 7558ff407bSJan Kara struct address_space *b_assoc_map; /* mapping this buffer is 7658ff407bSJan Kara associated with */ 77205f87f6SBadari Pulavarty atomic_t b_count; /* users using this buffer_head */ 781da177e4SLinus Torvalds }; 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds /* 811da177e4SLinus Torvalds * macro tricks to expand the set_buffer_foo(), clear_buffer_foo() 821da177e4SLinus Torvalds * and buffer_foo() functions. 831da177e4SLinus Torvalds */ 841da177e4SLinus Torvalds #define BUFFER_FNS(bit, name) \ 85ee91ef61SDenys Vlasenko static __always_inline void set_buffer_##name(struct buffer_head *bh) \ 861da177e4SLinus Torvalds { \ 871da177e4SLinus Torvalds set_bit(BH_##bit, &(bh)->b_state); \ 881da177e4SLinus Torvalds } \ 89ee91ef61SDenys Vlasenko static __always_inline void clear_buffer_##name(struct buffer_head *bh) \ 901da177e4SLinus Torvalds { \ 911da177e4SLinus Torvalds clear_bit(BH_##bit, &(bh)->b_state); \ 921da177e4SLinus Torvalds } \ 93ee91ef61SDenys Vlasenko static __always_inline int buffer_##name(const struct buffer_head *bh) \ 941da177e4SLinus Torvalds { \ 951da177e4SLinus Torvalds return test_bit(BH_##bit, &(bh)->b_state); \ 961da177e4SLinus Torvalds } 971da177e4SLinus Torvalds 981da177e4SLinus Torvalds /* 991da177e4SLinus Torvalds * test_set_buffer_foo() and test_clear_buffer_foo() 1001da177e4SLinus Torvalds */ 1011da177e4SLinus Torvalds #define TAS_BUFFER_FNS(bit, name) \ 102ee91ef61SDenys Vlasenko static __always_inline int test_set_buffer_##name(struct buffer_head *bh) \ 1031da177e4SLinus Torvalds { \ 1041da177e4SLinus Torvalds return test_and_set_bit(BH_##bit, &(bh)->b_state); \ 1051da177e4SLinus Torvalds } \ 106ee91ef61SDenys Vlasenko static __always_inline int test_clear_buffer_##name(struct buffer_head *bh) \ 1071da177e4SLinus Torvalds { \ 1081da177e4SLinus Torvalds return test_and_clear_bit(BH_##bit, &(bh)->b_state); \ 1091da177e4SLinus Torvalds } \ 1101da177e4SLinus Torvalds 1111da177e4SLinus Torvalds /* 1121da177e4SLinus Torvalds * Emit the buffer bitops functions. Note that there are also functions 1131da177e4SLinus Torvalds * of the form "mark_buffer_foo()". These are higher-level functions which 1141da177e4SLinus Torvalds * do something in addition to setting a b_state bit. 1151da177e4SLinus Torvalds */ 1161da177e4SLinus Torvalds BUFFER_FNS(Uptodate, uptodate) 1171da177e4SLinus Torvalds BUFFER_FNS(Dirty, dirty) 1181da177e4SLinus Torvalds TAS_BUFFER_FNS(Dirty, dirty) 1191da177e4SLinus Torvalds BUFFER_FNS(Lock, locked) 1201da177e4SLinus Torvalds BUFFER_FNS(Req, req) 1211da177e4SLinus Torvalds TAS_BUFFER_FNS(Req, req) 1221da177e4SLinus Torvalds BUFFER_FNS(Mapped, mapped) 1231da177e4SLinus Torvalds BUFFER_FNS(New, new) 1241da177e4SLinus Torvalds BUFFER_FNS(Async_Read, async_read) 1251da177e4SLinus Torvalds BUFFER_FNS(Async_Write, async_write) 1261da177e4SLinus Torvalds BUFFER_FNS(Delay, delay) 1271da177e4SLinus Torvalds BUFFER_FNS(Boundary, boundary) 1281da177e4SLinus Torvalds BUFFER_FNS(Write_EIO, write_io_error) 12933a266ddSDavid Chinner BUFFER_FNS(Unwritten, unwritten) 130877f962cSTheodore Ts'o BUFFER_FNS(Meta, meta) 131877f962cSTheodore Ts'o BUFFER_FNS(Prio, prio) 1327b7a8665SChristoph Hellwig BUFFER_FNS(Defer_Completion, defer_completion) 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) 1351da177e4SLinus Torvalds 1361da177e4SLinus Torvalds /* If we *know* page->private refers to buffer_heads */ 1371da177e4SLinus Torvalds #define page_buffers(page) \ 1381da177e4SLinus Torvalds ({ \ 1391da177e4SLinus Torvalds BUG_ON(!PagePrivate(page)); \ 1404c21e2f2SHugh Dickins ((struct buffer_head *)page_private(page)); \ 1411da177e4SLinus Torvalds }) 1421da177e4SLinus Torvalds #define page_has_buffers(page) PagePrivate(page) 1431da177e4SLinus Torvalds 144b4597226SMel Gorman void buffer_check_dirty_writeback(struct page *page, 145b4597226SMel Gorman bool *dirty, bool *writeback); 146b4597226SMel Gorman 1471da177e4SLinus Torvalds /* 1481da177e4SLinus Torvalds * Declarations 1491da177e4SLinus Torvalds */ 1501da177e4SLinus Torvalds 151b3c97528SHarvey Harrison void mark_buffer_dirty(struct buffer_head *bh); 1521da177e4SLinus Torvalds void init_buffer(struct buffer_head *, bh_end_io_t *, void *); 153f0059afdSTejun Heo void touch_buffer(struct buffer_head *bh); 1541da177e4SLinus Torvalds void set_bh_page(struct buffer_head *bh, 1551da177e4SLinus Torvalds struct page *page, unsigned long offset); 1561da177e4SLinus Torvalds int try_to_free_buffers(struct page *); 1571da177e4SLinus Torvalds struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size, 1581da177e4SLinus Torvalds int retry); 1591da177e4SLinus Torvalds void create_empty_buffers(struct page *, unsigned long, 1601da177e4SLinus Torvalds unsigned long b_state); 1611da177e4SLinus Torvalds void end_buffer_read_sync(struct buffer_head *bh, int uptodate); 1621da177e4SLinus Torvalds void end_buffer_write_sync(struct buffer_head *bh, int uptodate); 16335c80d5fSChris Mason void end_buffer_async_write(struct buffer_head *bh, int uptodate); 1641da177e4SLinus Torvalds 1651da177e4SLinus Torvalds /* Things to do with buffers at mapping->private_list */ 1661da177e4SLinus Torvalds void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode); 1671da177e4SLinus Torvalds int inode_has_buffers(struct inode *); 1681da177e4SLinus Torvalds void invalidate_inode_buffers(struct inode *); 1691da177e4SLinus Torvalds int remove_inode_buffers(struct inode *inode); 1701da177e4SLinus Torvalds int sync_mapping_buffers(struct address_space *mapping); 1711da177e4SLinus Torvalds void unmap_underlying_metadata(struct block_device *bdev, sector_t block); 1721da177e4SLinus Torvalds 1731da177e4SLinus Torvalds void mark_buffer_async_write(struct buffer_head *bh); 1741da177e4SLinus Torvalds void __wait_on_buffer(struct buffer_head *); 1751da177e4SLinus Torvalds wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); 1763991d3bdSTomasz Kvarsin struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, 1773991d3bdSTomasz Kvarsin unsigned size); 1783b5e6454SGioh Kim struct buffer_head *__getblk_gfp(struct block_device *bdev, sector_t block, 1793b5e6454SGioh Kim unsigned size, gfp_t gfp); 1801da177e4SLinus Torvalds void __brelse(struct buffer_head *); 1811da177e4SLinus Torvalds void __bforget(struct buffer_head *); 1823991d3bdSTomasz Kvarsin void __breadahead(struct block_device *, sector_t block, unsigned int size); 1833b5e6454SGioh Kim struct buffer_head *__bread_gfp(struct block_device *, 1843b5e6454SGioh Kim sector_t block, unsigned size, gfp_t gfp); 185f9a14399SPeter Zijlstra void invalidate_bh_lrus(void); 186dd0fc66fSAl Viro struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); 1871da177e4SLinus Torvalds void free_buffer_head(struct buffer_head * bh); 188b3c97528SHarvey Harrison void unlock_buffer(struct buffer_head *bh); 189b3c97528SHarvey Harrison void __lock_buffer(struct buffer_head *bh); 190*dfec8a14SMike Christie void ll_rw_block(int, int, int, struct buffer_head * bh[]); 1911da177e4SLinus Torvalds int sync_dirty_buffer(struct buffer_head *bh); 1922a222ca9SMike Christie int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); 1932a222ca9SMike Christie void write_dirty_buffer(struct buffer_head *bh, int op_flags); 1942a222ca9SMike Christie int _submit_bh(int op, int op_flags, struct buffer_head *bh, 1952a222ca9SMike Christie unsigned long bio_flags); 1962a222ca9SMike Christie int submit_bh(int, int, struct buffer_head *); 1971da177e4SLinus Torvalds void write_boundary_block(struct block_device *bdev, 1981da177e4SLinus Torvalds sector_t bblock, unsigned blocksize); 199389d1b08SAneesh Kumar K.V int bh_uptodate_or_lock(struct buffer_head *bh); 200389d1b08SAneesh Kumar K.V int bh_submit_read(struct buffer_head *bh); 2011da177e4SLinus Torvalds 2021da177e4SLinus Torvalds extern int buffer_heads_over_limit; 2031da177e4SLinus Torvalds 2041da177e4SLinus Torvalds /* 2051da177e4SLinus Torvalds * Generic address_space_operations implementations for buffer_head-backed 2061da177e4SLinus Torvalds * address_spaces. 2071da177e4SLinus Torvalds */ 208d47992f8SLukas Czerner void block_invalidatepage(struct page *page, unsigned int offset, 209d47992f8SLukas Czerner unsigned int length); 2101da177e4SLinus Torvalds int block_write_full_page(struct page *page, get_block_t *get_block, 2111da177e4SLinus Torvalds struct writeback_control *wbc); 2121da177e4SLinus Torvalds int block_read_full_page(struct page*, get_block_t*); 213c186afb4SAl Viro int block_is_partially_uptodate(struct page *page, unsigned long from, 214c186afb4SAl Viro unsigned long count); 215155130a4SChristoph Hellwig int block_write_begin(struct address_space *mapping, loff_t pos, unsigned len, 216155130a4SChristoph Hellwig unsigned flags, struct page **pagep, get_block_t *get_block); 2176e1db88dSChristoph Hellwig int __block_write_begin(struct page *page, loff_t pos, unsigned len, 2186e1db88dSChristoph Hellwig get_block_t *get_block); 219afddba49SNick Piggin int block_write_end(struct file *, struct address_space *, 220afddba49SNick Piggin loff_t, unsigned, unsigned, 221afddba49SNick Piggin struct page *, void *); 222afddba49SNick Piggin int generic_write_end(struct file *, struct address_space *, 223afddba49SNick Piggin loff_t, unsigned, unsigned, 224afddba49SNick Piggin struct page *, void *); 225afddba49SNick Piggin void page_zero_new_buffers(struct page *page, unsigned from, unsigned to); 22689e10787SNick Piggin int cont_write_begin(struct file *, struct address_space *, loff_t, 22789e10787SNick Piggin unsigned, unsigned, struct page **, void **, 22889e10787SNick Piggin get_block_t *, loff_t *); 22905eb0b51SOGAWA Hirofumi int generic_cont_expand_simple(struct inode *inode, loff_t size); 2301da177e4SLinus Torvalds int block_commit_write(struct page *page, unsigned from, unsigned to); 231c2ec175cSNick Piggin int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, 23254171690SDavid Chinner get_block_t get_block); 23324da4fabSJan Kara /* Convert errno to return value from ->page_mkwrite() call */ 23424da4fabSJan Kara static inline int block_page_mkwrite_return(int err) 23524da4fabSJan Kara { 23624da4fabSJan Kara if (err == 0) 23724da4fabSJan Kara return VM_FAULT_LOCKED; 23824da4fabSJan Kara if (err == -EFAULT) 23924da4fabSJan Kara return VM_FAULT_NOPAGE; 24024da4fabSJan Kara if (err == -ENOMEM) 24124da4fabSJan Kara return VM_FAULT_OOM; 242ea13a864SJan Kara if (err == -EAGAIN) 243ea13a864SJan Kara return VM_FAULT_RETRY; 24424da4fabSJan Kara /* -ENOSPC, -EDQUOT, -EIO ... */ 24524da4fabSJan Kara return VM_FAULT_SIGBUS; 24624da4fabSJan Kara } 2471da177e4SLinus Torvalds sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); 2481da177e4SLinus Torvalds int block_truncate_page(struct address_space *, loff_t, get_block_t *); 249ea0f04e5SChristoph Hellwig int nobh_write_begin(struct address_space *, loff_t, unsigned, unsigned, 25003158cd7SNick Piggin struct page **, void **, get_block_t*); 25103158cd7SNick Piggin int nobh_write_end(struct file *, struct address_space *, 25203158cd7SNick Piggin loff_t, unsigned, unsigned, 25303158cd7SNick Piggin struct page *, void *); 25403158cd7SNick Piggin int nobh_truncate_page(struct address_space *, loff_t, get_block_t *); 2551da177e4SLinus Torvalds int nobh_writepage(struct page *page, get_block_t *get_block, 2561da177e4SLinus Torvalds struct writeback_control *wbc); 2571da177e4SLinus Torvalds 258b6cd0b77SAdrian Bunk void buffer_init(void); 2591da177e4SLinus Torvalds 2601da177e4SLinus Torvalds /* 2611da177e4SLinus Torvalds * inline definitions 2621da177e4SLinus Torvalds */ 2631da177e4SLinus Torvalds 2641da177e4SLinus Torvalds static inline void attach_page_buffers(struct page *page, 2651da177e4SLinus Torvalds struct buffer_head *head) 2661da177e4SLinus Torvalds { 26709cbfeafSKirill A. Shutemov get_page(page); 2681da177e4SLinus Torvalds SetPagePrivate(page); 2694c21e2f2SHugh Dickins set_page_private(page, (unsigned long)head); 2701da177e4SLinus Torvalds } 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvalds static inline void get_bh(struct buffer_head *bh) 2731da177e4SLinus Torvalds { 2741da177e4SLinus Torvalds atomic_inc(&bh->b_count); 2751da177e4SLinus Torvalds } 2761da177e4SLinus Torvalds 2771da177e4SLinus Torvalds static inline void put_bh(struct buffer_head *bh) 2781da177e4SLinus Torvalds { 2794e857c58SPeter Zijlstra smp_mb__before_atomic(); 2801da177e4SLinus Torvalds atomic_dec(&bh->b_count); 2811da177e4SLinus Torvalds } 2821da177e4SLinus Torvalds 2831da177e4SLinus Torvalds static inline void brelse(struct buffer_head *bh) 2841da177e4SLinus Torvalds { 2851da177e4SLinus Torvalds if (bh) 2861da177e4SLinus Torvalds __brelse(bh); 2871da177e4SLinus Torvalds } 2881da177e4SLinus Torvalds 2891da177e4SLinus Torvalds static inline void bforget(struct buffer_head *bh) 2901da177e4SLinus Torvalds { 2911da177e4SLinus Torvalds if (bh) 2921da177e4SLinus Torvalds __bforget(bh); 2931da177e4SLinus Torvalds } 2941da177e4SLinus Torvalds 2951da177e4SLinus Torvalds static inline struct buffer_head * 2961da177e4SLinus Torvalds sb_bread(struct super_block *sb, sector_t block) 2971da177e4SLinus Torvalds { 2983b5e6454SGioh Kim return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE); 2993b5e6454SGioh Kim } 3003b5e6454SGioh Kim 3013b5e6454SGioh Kim static inline struct buffer_head * 3023b5e6454SGioh Kim sb_bread_unmovable(struct super_block *sb, sector_t block) 3033b5e6454SGioh Kim { 3043b5e6454SGioh Kim return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, 0); 3051da177e4SLinus Torvalds } 3061da177e4SLinus Torvalds 3071da177e4SLinus Torvalds static inline void 3081da177e4SLinus Torvalds sb_breadahead(struct super_block *sb, sector_t block) 3091da177e4SLinus Torvalds { 3101da177e4SLinus Torvalds __breadahead(sb->s_bdev, block, sb->s_blocksize); 3111da177e4SLinus Torvalds } 3121da177e4SLinus Torvalds 3131da177e4SLinus Torvalds static inline struct buffer_head * 3141da177e4SLinus Torvalds sb_getblk(struct super_block *sb, sector_t block) 3151da177e4SLinus Torvalds { 3163b5e6454SGioh Kim return __getblk_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE); 3171da177e4SLinus Torvalds } 3181da177e4SLinus Torvalds 319bd7ade3cSNikolay Borisov 320bd7ade3cSNikolay Borisov static inline struct buffer_head * 321bd7ade3cSNikolay Borisov sb_getblk_gfp(struct super_block *sb, sector_t block, gfp_t gfp) 322bd7ade3cSNikolay Borisov { 323bd7ade3cSNikolay Borisov return __getblk_gfp(sb->s_bdev, block, sb->s_blocksize, gfp); 324bd7ade3cSNikolay Borisov } 325bd7ade3cSNikolay Borisov 3261da177e4SLinus Torvalds static inline struct buffer_head * 3271da177e4SLinus Torvalds sb_find_get_block(struct super_block *sb, sector_t block) 3281da177e4SLinus Torvalds { 3291da177e4SLinus Torvalds return __find_get_block(sb->s_bdev, block, sb->s_blocksize); 3301da177e4SLinus Torvalds } 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvalds static inline void 3331da177e4SLinus Torvalds map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) 3341da177e4SLinus Torvalds { 3351da177e4SLinus Torvalds set_buffer_mapped(bh); 3361da177e4SLinus Torvalds bh->b_bdev = sb->s_bdev; 3371da177e4SLinus Torvalds bh->b_blocknr = block; 338b0cf2321SBadari Pulavarty bh->b_size = sb->s_blocksize; 3391da177e4SLinus Torvalds } 3401da177e4SLinus Torvalds 3411da177e4SLinus Torvalds static inline void wait_on_buffer(struct buffer_head *bh) 3421da177e4SLinus Torvalds { 3431da177e4SLinus Torvalds might_sleep(); 344a9877cc2SRichard Kennedy if (buffer_locked(bh)) 3451da177e4SLinus Torvalds __wait_on_buffer(bh); 3461da177e4SLinus Torvalds } 3471da177e4SLinus Torvalds 348ca5de404SNick Piggin static inline int trylock_buffer(struct buffer_head *bh) 349ca5de404SNick Piggin { 35051b07fc3SNick Piggin return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state)); 351ca5de404SNick Piggin } 352ca5de404SNick Piggin 3531da177e4SLinus Torvalds static inline void lock_buffer(struct buffer_head *bh) 3541da177e4SLinus Torvalds { 3551da177e4SLinus Torvalds might_sleep(); 356ca5de404SNick Piggin if (!trylock_buffer(bh)) 3571da177e4SLinus Torvalds __lock_buffer(bh); 3581da177e4SLinus Torvalds } 3591da177e4SLinus Torvalds 3603b5e6454SGioh Kim static inline struct buffer_head *getblk_unmovable(struct block_device *bdev, 3613b5e6454SGioh Kim sector_t block, 3623b5e6454SGioh Kim unsigned size) 3633b5e6454SGioh Kim { 3643b5e6454SGioh Kim return __getblk_gfp(bdev, block, size, 0); 3653b5e6454SGioh Kim } 3663b5e6454SGioh Kim 3673b5e6454SGioh Kim static inline struct buffer_head *__getblk(struct block_device *bdev, 3683b5e6454SGioh Kim sector_t block, 3693b5e6454SGioh Kim unsigned size) 3703b5e6454SGioh Kim { 3713b5e6454SGioh Kim return __getblk_gfp(bdev, block, size, __GFP_MOVABLE); 3723b5e6454SGioh Kim } 3733b5e6454SGioh Kim 3743b5e6454SGioh Kim /** 3753b5e6454SGioh Kim * __bread() - reads a specified block and returns the bh 3763b5e6454SGioh Kim * @bdev: the block_device to read from 3773b5e6454SGioh Kim * @block: number of block 3783b5e6454SGioh Kim * @size: size (in bytes) to read 3793b5e6454SGioh Kim * 3803b5e6454SGioh Kim * Reads a specified block, and returns buffer head that contains it. 3813b5e6454SGioh Kim * The page cache is allocated from movable area so that it can be migrated. 3823b5e6454SGioh Kim * It returns NULL if the block was unreadable. 3833b5e6454SGioh Kim */ 3843b5e6454SGioh Kim static inline struct buffer_head * 3853b5e6454SGioh Kim __bread(struct block_device *bdev, sector_t block, unsigned size) 3863b5e6454SGioh Kim { 3873b5e6454SGioh Kim return __bread_gfp(bdev, block, size, __GFP_MOVABLE); 3883b5e6454SGioh Kim } 3893b5e6454SGioh Kim 390cf9a2ae8SDavid Howells extern int __set_page_dirty_buffers(struct page *page); 3919361401eSDavid Howells 3929361401eSDavid Howells #else /* CONFIG_BLOCK */ 3939361401eSDavid Howells 3949361401eSDavid Howells static inline void buffer_init(void) {} 3959361401eSDavid Howells static inline int try_to_free_buffers(struct page *page) { return 1; } 3969361401eSDavid Howells static inline int inode_has_buffers(struct inode *inode) { return 0; } 3979361401eSDavid Howells static inline void invalidate_inode_buffers(struct inode *inode) {} 3989361401eSDavid Howells static inline int remove_inode_buffers(struct inode *inode) { return 1; } 3999361401eSDavid Howells static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; } 4009361401eSDavid Howells 4019361401eSDavid Howells #endif /* CONFIG_BLOCK */ 4021da177e4SLinus Torvalds #endif /* _LINUX_BUFFER_HEAD_H */ 403