1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * include/linux/buffer_head.h 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Everything to do with buffer_heads. 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #ifndef _LINUX_BUFFER_HEAD_H 91da177e4SLinus Torvalds #define _LINUX_BUFFER_HEAD_H 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #include <linux/types.h> 123ae72869SBart Van Assche #include <linux/blk_types.h> 131da177e4SLinus Torvalds #include <linux/fs.h> 141da177e4SLinus Torvalds #include <linux/linkage.h> 151da177e4SLinus Torvalds #include <linux/pagemap.h> 161da177e4SLinus Torvalds #include <linux/wait.h> 1760063497SArun Sharma #include <linux/atomic.h> 181da177e4SLinus Torvalds 199361401eSDavid Howells #ifdef CONFIG_BLOCK 209361401eSDavid Howells 211da177e4SLinus Torvalds enum bh_state_bits { 221da177e4SLinus Torvalds BH_Uptodate, /* Contains valid data */ 231da177e4SLinus Torvalds BH_Dirty, /* Is dirty */ 241da177e4SLinus Torvalds BH_Lock, /* Is locked */ 251da177e4SLinus Torvalds BH_Req, /* Has been submitted for I/O */ 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds BH_Mapped, /* Has a disk mapping */ 281da177e4SLinus Torvalds BH_New, /* Disk mapping was newly created by get_block */ 291da177e4SLinus Torvalds BH_Async_Read, /* Is under end_buffer_async_read I/O */ 301da177e4SLinus Torvalds BH_Async_Write, /* Is under end_buffer_async_write I/O */ 311da177e4SLinus Torvalds BH_Delay, /* Buffer is not yet allocated on disk */ 321da177e4SLinus Torvalds BH_Boundary, /* Block is followed by a discontiguity */ 331da177e4SLinus Torvalds BH_Write_EIO, /* I/O error on write */ 3433a266ddSDavid Chinner BH_Unwritten, /* Buffer is allocated on disk but not written */ 3508bafc03SKeith Mannthey BH_Quiet, /* Buffer Error Prinks to be quiet */ 36877f962cSTheodore Ts'o BH_Meta, /* Buffer contains metadata */ 37877f962cSTheodore Ts'o BH_Prio, /* Buffer should be submitted with REQ_PRIO */ 387b7a8665SChristoph Hellwig BH_Defer_Completion, /* Defer AIO completion to workqueue */ 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds BH_PrivateStart,/* not a state bit, but the first bit available 411da177e4SLinus Torvalds * for private allocation by other entities 421da177e4SLinus Torvalds */ 431da177e4SLinus Torvalds }; 441da177e4SLinus Torvalds 4509cbfeafSKirill A. Shutemov #define MAX_BUF_PER_PAGE (PAGE_SIZE / 512) 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds struct page; 481da177e4SLinus Torvalds struct buffer_head; 491da177e4SLinus Torvalds struct address_space; 501da177e4SLinus Torvalds typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate); 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds /* 53205f87f6SBadari Pulavarty * Historically, a buffer_head was used to map a single block 54205f87f6SBadari Pulavarty * within a page, and of course as the unit of I/O through the 55205f87f6SBadari Pulavarty * filesystem and block layers. Nowadays the basic I/O unit 56205f87f6SBadari Pulavarty * is the bio, and buffer_heads are used for extracting block 57205f87f6SBadari Pulavarty * mappings (via a get_block_t call), for tracking state within 58205f87f6SBadari Pulavarty * a page (via a page_mapping) and for wrapping bio submission 59205f87f6SBadari Pulavarty * for backward compatibility reasons (e.g. submit_bh). 601da177e4SLinus Torvalds */ 611da177e4SLinus Torvalds struct buffer_head { 621da177e4SLinus Torvalds unsigned long b_state; /* buffer state bitmap (see above) */ 631da177e4SLinus Torvalds struct buffer_head *b_this_page;/* circular list of page's buffers */ 641da177e4SLinus Torvalds struct page *b_page; /* the page this bh is mapped to */ 651da177e4SLinus Torvalds 66205f87f6SBadari Pulavarty sector_t b_blocknr; /* start block number */ 67205f87f6SBadari Pulavarty size_t b_size; /* size of mapping */ 68205f87f6SBadari Pulavarty char *b_data; /* pointer to data within the page */ 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds struct block_device *b_bdev; 711da177e4SLinus Torvalds bh_end_io_t *b_end_io; /* I/O completion */ 721da177e4SLinus Torvalds void *b_private; /* reserved for b_end_io */ 731da177e4SLinus Torvalds struct list_head b_assoc_buffers; /* associated with another mapping */ 7458ff407bSJan Kara struct address_space *b_assoc_map; /* mapping this buffer is 7558ff407bSJan Kara associated with */ 76205f87f6SBadari Pulavarty atomic_t b_count; /* users using this buffer_head */ 77f1e67e35SThomas Gleixner spinlock_t b_uptodate_lock; /* Used by the first bh in a page, to 78f1e67e35SThomas Gleixner * serialise IO completion of other 79f1e67e35SThomas Gleixner * buffers in the page */ 801da177e4SLinus Torvalds }; 811da177e4SLinus Torvalds 821da177e4SLinus Torvalds /* 831da177e4SLinus Torvalds * macro tricks to expand the set_buffer_foo(), clear_buffer_foo() 841da177e4SLinus Torvalds * and buffer_foo() functions. 8560f91826SKemi Wang * To avoid reset buffer flags that are already set, because that causes 8660f91826SKemi Wang * a costly cache line transition, check the flag first. 871da177e4SLinus Torvalds */ 881da177e4SLinus Torvalds #define BUFFER_FNS(bit, name) \ 89ee91ef61SDenys Vlasenko static __always_inline void set_buffer_##name(struct buffer_head *bh) \ 901da177e4SLinus Torvalds { \ 9160f91826SKemi Wang if (!test_bit(BH_##bit, &(bh)->b_state)) \ 921da177e4SLinus Torvalds set_bit(BH_##bit, &(bh)->b_state); \ 931da177e4SLinus Torvalds } \ 94ee91ef61SDenys Vlasenko static __always_inline void clear_buffer_##name(struct buffer_head *bh) \ 951da177e4SLinus Torvalds { \ 961da177e4SLinus Torvalds clear_bit(BH_##bit, &(bh)->b_state); \ 971da177e4SLinus Torvalds } \ 98ee91ef61SDenys Vlasenko static __always_inline int buffer_##name(const struct buffer_head *bh) \ 991da177e4SLinus Torvalds { \ 1001da177e4SLinus Torvalds return test_bit(BH_##bit, &(bh)->b_state); \ 1011da177e4SLinus Torvalds } 1021da177e4SLinus Torvalds 1031da177e4SLinus Torvalds /* 1041da177e4SLinus Torvalds * test_set_buffer_foo() and test_clear_buffer_foo() 1051da177e4SLinus Torvalds */ 1061da177e4SLinus Torvalds #define TAS_BUFFER_FNS(bit, name) \ 107ee91ef61SDenys Vlasenko static __always_inline int test_set_buffer_##name(struct buffer_head *bh) \ 1081da177e4SLinus Torvalds { \ 1091da177e4SLinus Torvalds return test_and_set_bit(BH_##bit, &(bh)->b_state); \ 1101da177e4SLinus Torvalds } \ 111ee91ef61SDenys Vlasenko static __always_inline int test_clear_buffer_##name(struct buffer_head *bh) \ 1121da177e4SLinus Torvalds { \ 1131da177e4SLinus Torvalds return test_and_clear_bit(BH_##bit, &(bh)->b_state); \ 1141da177e4SLinus Torvalds } \ 1151da177e4SLinus Torvalds 1161da177e4SLinus Torvalds /* 1171da177e4SLinus Torvalds * Emit the buffer bitops functions. Note that there are also functions 1181da177e4SLinus Torvalds * of the form "mark_buffer_foo()". These are higher-level functions which 1191da177e4SLinus Torvalds * do something in addition to setting a b_state bit. 1201da177e4SLinus Torvalds */ 1211da177e4SLinus Torvalds BUFFER_FNS(Dirty, dirty) 1221da177e4SLinus Torvalds TAS_BUFFER_FNS(Dirty, dirty) 1231da177e4SLinus Torvalds BUFFER_FNS(Lock, locked) 1241da177e4SLinus Torvalds BUFFER_FNS(Req, req) 1251da177e4SLinus Torvalds TAS_BUFFER_FNS(Req, req) 1261da177e4SLinus Torvalds BUFFER_FNS(Mapped, mapped) 1271da177e4SLinus Torvalds BUFFER_FNS(New, new) 1281da177e4SLinus Torvalds BUFFER_FNS(Async_Read, async_read) 1291da177e4SLinus Torvalds BUFFER_FNS(Async_Write, async_write) 1301da177e4SLinus Torvalds BUFFER_FNS(Delay, delay) 1311da177e4SLinus Torvalds BUFFER_FNS(Boundary, boundary) 1321da177e4SLinus Torvalds BUFFER_FNS(Write_EIO, write_io_error) 13333a266ddSDavid Chinner BUFFER_FNS(Unwritten, unwritten) 134877f962cSTheodore Ts'o BUFFER_FNS(Meta, meta) 135877f962cSTheodore Ts'o BUFFER_FNS(Prio, prio) 1367b7a8665SChristoph Hellwig BUFFER_FNS(Defer_Completion, defer_completion) 1371da177e4SLinus Torvalds 138d4252071SMikulas Patocka static __always_inline void set_buffer_uptodate(struct buffer_head *bh) 139d4252071SMikulas Patocka { 140d4252071SMikulas Patocka /* 141d4252071SMikulas Patocka * make it consistent with folio_mark_uptodate 142d4252071SMikulas Patocka * pairs with smp_load_acquire in buffer_uptodate 143d4252071SMikulas Patocka */ 144d4252071SMikulas Patocka smp_mb__before_atomic(); 145d4252071SMikulas Patocka set_bit(BH_Uptodate, &bh->b_state); 146d4252071SMikulas Patocka } 147d4252071SMikulas Patocka 148d4252071SMikulas Patocka static __always_inline void clear_buffer_uptodate(struct buffer_head *bh) 149d4252071SMikulas Patocka { 150d4252071SMikulas Patocka clear_bit(BH_Uptodate, &bh->b_state); 151d4252071SMikulas Patocka } 152d4252071SMikulas Patocka 153d4252071SMikulas Patocka static __always_inline int buffer_uptodate(const struct buffer_head *bh) 154d4252071SMikulas Patocka { 155d4252071SMikulas Patocka /* 156d4252071SMikulas Patocka * make it consistent with folio_test_uptodate 157d4252071SMikulas Patocka * pairs with smp_mb__before_atomic in set_buffer_uptodate 158d4252071SMikulas Patocka */ 1598238b457SMikulas Patocka return test_bit_acquire(BH_Uptodate, &bh->b_state); 160d4252071SMikulas Patocka } 161d4252071SMikulas Patocka 1621da177e4SLinus Torvalds #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) 1631da177e4SLinus Torvalds 1641da177e4SLinus Torvalds /* If we *know* page->private refers to buffer_heads */ 1651da177e4SLinus Torvalds #define page_buffers(page) \ 1661da177e4SLinus Torvalds ({ \ 1671da177e4SLinus Torvalds BUG_ON(!PagePrivate(page)); \ 1684c21e2f2SHugh Dickins ((struct buffer_head *)page_private(page)); \ 1691da177e4SLinus Torvalds }) 1701da177e4SLinus Torvalds #define page_has_buffers(page) PagePrivate(page) 171cd1067beSMatthew Wilcox (Oracle) #define folio_buffers(folio) folio_get_private(folio) 1721da177e4SLinus Torvalds 173520f301cSMatthew Wilcox (Oracle) void buffer_check_dirty_writeback(struct folio *folio, 174b4597226SMel Gorman bool *dirty, bool *writeback); 175b4597226SMel Gorman 1761da177e4SLinus Torvalds /* 1771da177e4SLinus Torvalds * Declarations 1781da177e4SLinus Torvalds */ 1791da177e4SLinus Torvalds 180b3c97528SHarvey Harrison void mark_buffer_dirty(struct buffer_head *bh); 18187354e5dSJeff Layton void mark_buffer_write_io_error(struct buffer_head *bh); 182f0059afdSTejun Heo void touch_buffer(struct buffer_head *bh); 1831da177e4SLinus Torvalds void set_bh_page(struct buffer_head *bh, 1841da177e4SLinus Torvalds struct page *page, unsigned long offset); 18568189fefSMatthew Wilcox (Oracle) bool try_to_free_buffers(struct folio *); 1861da177e4SLinus Torvalds struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size, 187640ab98fSJens Axboe bool retry); 1881da177e4SLinus Torvalds void create_empty_buffers(struct page *, unsigned long, 1891da177e4SLinus Torvalds unsigned long b_state); 1901da177e4SLinus Torvalds void end_buffer_read_sync(struct buffer_head *bh, int uptodate); 1911da177e4SLinus Torvalds void end_buffer_write_sync(struct buffer_head *bh, int uptodate); 19235c80d5fSChris Mason void end_buffer_async_write(struct buffer_head *bh, int uptodate); 1931da177e4SLinus Torvalds 1941da177e4SLinus Torvalds /* Things to do with buffers at mapping->private_list */ 1951da177e4SLinus Torvalds void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode); 1961da177e4SLinus Torvalds int inode_has_buffers(struct inode *); 1971da177e4SLinus Torvalds void invalidate_inode_buffers(struct inode *); 1981da177e4SLinus Torvalds int remove_inode_buffers(struct inode *inode); 1991da177e4SLinus Torvalds int sync_mapping_buffers(struct address_space *mapping); 20029f3ad7dSJan Kara void clean_bdev_aliases(struct block_device *bdev, sector_t block, 20129f3ad7dSJan Kara sector_t len); 202e64855c6SJan Kara static inline void clean_bdev_bh_alias(struct buffer_head *bh) 203e64855c6SJan Kara { 204e64855c6SJan Kara clean_bdev_aliases(bh->b_bdev, bh->b_blocknr, 1); 205e64855c6SJan Kara } 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds void mark_buffer_async_write(struct buffer_head *bh); 2081da177e4SLinus Torvalds void __wait_on_buffer(struct buffer_head *); 2091da177e4SLinus Torvalds wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); 2103991d3bdSTomasz Kvarsin struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, 2113991d3bdSTomasz Kvarsin unsigned size); 2123b5e6454SGioh Kim struct buffer_head *__getblk_gfp(struct block_device *bdev, sector_t block, 2133b5e6454SGioh Kim unsigned size, gfp_t gfp); 2141da177e4SLinus Torvalds void __brelse(struct buffer_head *); 2151da177e4SLinus Torvalds void __bforget(struct buffer_head *); 2163991d3bdSTomasz Kvarsin void __breadahead(struct block_device *, sector_t block, unsigned int size); 2173b5e6454SGioh Kim struct buffer_head *__bread_gfp(struct block_device *, 2183b5e6454SGioh Kim sector_t block, unsigned size, gfp_t gfp); 219f9a14399SPeter Zijlstra void invalidate_bh_lrus(void); 220243418e3SMinchan Kim void invalidate_bh_lrus_cpu(void); 2218cc621d2SMinchan Kim bool has_bh_in_lru(int cpu, void *dummy); 222dd0fc66fSAl Viro struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); 2231da177e4SLinus Torvalds void free_buffer_head(struct buffer_head * bh); 224b3c97528SHarvey Harrison void unlock_buffer(struct buffer_head *bh); 225b3c97528SHarvey Harrison void __lock_buffer(struct buffer_head *bh); 2261420c4a5SBart Van Assche void ll_rw_block(blk_opf_t, int, struct buffer_head * bh[]); 2271da177e4SLinus Torvalds int sync_dirty_buffer(struct buffer_head *bh); 2283ae72869SBart Van Assche int __sync_dirty_buffer(struct buffer_head *bh, blk_opf_t op_flags); 2293ae72869SBart Van Assche void write_dirty_buffer(struct buffer_head *bh, blk_opf_t op_flags); 2301420c4a5SBart Van Assche int submit_bh(blk_opf_t, struct buffer_head *); 2311da177e4SLinus Torvalds void write_boundary_block(struct block_device *bdev, 2321da177e4SLinus Torvalds sector_t bblock, unsigned blocksize); 233389d1b08SAneesh Kumar K.V int bh_uptodate_or_lock(struct buffer_head *bh); 234389d1b08SAneesh Kumar K.V int bh_submit_read(struct buffer_head *bh); 235*fdee117eSZhang Yi int __bh_read(struct buffer_head *bh, blk_opf_t op_flags, bool wait); 236*fdee117eSZhang Yi void __bh_read_batch(int nr, struct buffer_head *bhs[], 237*fdee117eSZhang Yi blk_opf_t op_flags, bool force_lock); 2381da177e4SLinus Torvalds 2391da177e4SLinus Torvalds extern int buffer_heads_over_limit; 2401da177e4SLinus Torvalds 2411da177e4SLinus Torvalds /* 2421da177e4SLinus Torvalds * Generic address_space_operations implementations for buffer_head-backed 2431da177e4SLinus Torvalds * address_spaces. 2441da177e4SLinus Torvalds */ 2457ba13abbSMatthew Wilcox (Oracle) void block_invalidate_folio(struct folio *folio, size_t offset, size_t length); 2461da177e4SLinus Torvalds int block_write_full_page(struct page *page, get_block_t *get_block, 2471da177e4SLinus Torvalds struct writeback_control *wbc); 248b4bba389SBenjamin Marzinski int __block_write_full_page(struct inode *inode, struct page *page, 249b4bba389SBenjamin Marzinski get_block_t *get_block, struct writeback_control *wbc, 250b4bba389SBenjamin Marzinski bh_end_io_t *handler); 2512c69e205SMatthew Wilcox (Oracle) int block_read_full_folio(struct folio *, get_block_t *); 2522e7e80f7SMatthew Wilcox (Oracle) bool block_is_partially_uptodate(struct folio *, size_t from, size_t count); 253155130a4SChristoph Hellwig int block_write_begin(struct address_space *mapping, loff_t pos, unsigned len, 254b3992d1eSMatthew Wilcox (Oracle) struct page **pagep, get_block_t *get_block); 2556e1db88dSChristoph Hellwig int __block_write_begin(struct page *page, loff_t pos, unsigned len, 2566e1db88dSChristoph Hellwig get_block_t *get_block); 257afddba49SNick Piggin int block_write_end(struct file *, struct address_space *, 258afddba49SNick Piggin loff_t, unsigned, unsigned, 259afddba49SNick Piggin struct page *, void *); 260afddba49SNick Piggin int generic_write_end(struct file *, struct address_space *, 261afddba49SNick Piggin loff_t, unsigned, unsigned, 262afddba49SNick Piggin struct page *, void *); 263afddba49SNick Piggin void page_zero_new_buffers(struct page *page, unsigned from, unsigned to); 264f892760aSMatthew Wilcox void clean_page_buffers(struct page *page); 26589e10787SNick Piggin int cont_write_begin(struct file *, struct address_space *, loff_t, 266be3bbbc5SMatthew Wilcox (Oracle) unsigned, struct page **, void **, 26789e10787SNick Piggin get_block_t *, loff_t *); 26805eb0b51SOGAWA Hirofumi int generic_cont_expand_simple(struct inode *inode, loff_t size); 2691da177e4SLinus Torvalds int block_commit_write(struct page *page, unsigned from, unsigned to); 270c2ec175cSNick Piggin int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, 27154171690SDavid Chinner get_block_t get_block); 27224da4fabSJan Kara /* Convert errno to return value from ->page_mkwrite() call */ 273401b25aaSSouptick Joarder static inline vm_fault_t block_page_mkwrite_return(int err) 27424da4fabSJan Kara { 27524da4fabSJan Kara if (err == 0) 27624da4fabSJan Kara return VM_FAULT_LOCKED; 2770911d004SJan Kara if (err == -EFAULT || err == -EAGAIN) 27824da4fabSJan Kara return VM_FAULT_NOPAGE; 27924da4fabSJan Kara if (err == -ENOMEM) 28024da4fabSJan Kara return VM_FAULT_OOM; 28124da4fabSJan Kara /* -ENOSPC, -EDQUOT, -EIO ... */ 28224da4fabSJan Kara return VM_FAULT_SIGBUS; 28324da4fabSJan Kara } 2841da177e4SLinus Torvalds sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); 2851da177e4SLinus Torvalds int block_truncate_page(struct address_space *, loff_t, get_block_t *); 2861da177e4SLinus Torvalds 28767235182SMatthew Wilcox (Oracle) #ifdef CONFIG_MIGRATION 28867235182SMatthew Wilcox (Oracle) extern int buffer_migrate_folio(struct address_space *, 28967235182SMatthew Wilcox (Oracle) struct folio *dst, struct folio *src, enum migrate_mode); 29067235182SMatthew Wilcox (Oracle) extern int buffer_migrate_folio_norefs(struct address_space *, 29167235182SMatthew Wilcox (Oracle) struct folio *dst, struct folio *src, enum migrate_mode); 29267235182SMatthew Wilcox (Oracle) #else 29367235182SMatthew Wilcox (Oracle) #define buffer_migrate_folio NULL 29467235182SMatthew Wilcox (Oracle) #define buffer_migrate_folio_norefs NULL 29567235182SMatthew Wilcox (Oracle) #endif 2961da177e4SLinus Torvalds 297b6cd0b77SAdrian Bunk void buffer_init(void); 2981da177e4SLinus Torvalds 2991da177e4SLinus Torvalds /* 3001da177e4SLinus Torvalds * inline definitions 3011da177e4SLinus Torvalds */ 3021da177e4SLinus Torvalds 3031da177e4SLinus Torvalds static inline void get_bh(struct buffer_head *bh) 3041da177e4SLinus Torvalds { 3051da177e4SLinus Torvalds atomic_inc(&bh->b_count); 3061da177e4SLinus Torvalds } 3071da177e4SLinus Torvalds 3081da177e4SLinus Torvalds static inline void put_bh(struct buffer_head *bh) 3091da177e4SLinus Torvalds { 3104e857c58SPeter Zijlstra smp_mb__before_atomic(); 3111da177e4SLinus Torvalds atomic_dec(&bh->b_count); 3121da177e4SLinus Torvalds } 3131da177e4SLinus Torvalds 3141da177e4SLinus Torvalds static inline void brelse(struct buffer_head *bh) 3151da177e4SLinus Torvalds { 3161da177e4SLinus Torvalds if (bh) 3171da177e4SLinus Torvalds __brelse(bh); 3181da177e4SLinus Torvalds } 3191da177e4SLinus Torvalds 3201da177e4SLinus Torvalds static inline void bforget(struct buffer_head *bh) 3211da177e4SLinus Torvalds { 3221da177e4SLinus Torvalds if (bh) 3231da177e4SLinus Torvalds __bforget(bh); 3241da177e4SLinus Torvalds } 3251da177e4SLinus Torvalds 3261da177e4SLinus Torvalds static inline struct buffer_head * 3271da177e4SLinus Torvalds sb_bread(struct super_block *sb, sector_t block) 3281da177e4SLinus Torvalds { 3293b5e6454SGioh Kim return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE); 3303b5e6454SGioh Kim } 3313b5e6454SGioh Kim 3323b5e6454SGioh Kim static inline struct buffer_head * 3333b5e6454SGioh Kim sb_bread_unmovable(struct super_block *sb, sector_t block) 3343b5e6454SGioh Kim { 3353b5e6454SGioh Kim return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, 0); 3361da177e4SLinus Torvalds } 3371da177e4SLinus Torvalds 3381da177e4SLinus Torvalds static inline void 3391da177e4SLinus Torvalds sb_breadahead(struct super_block *sb, sector_t block) 3401da177e4SLinus Torvalds { 3411da177e4SLinus Torvalds __breadahead(sb->s_bdev, block, sb->s_blocksize); 3421da177e4SLinus Torvalds } 3431da177e4SLinus Torvalds 3441da177e4SLinus Torvalds static inline struct buffer_head * 3451da177e4SLinus Torvalds sb_getblk(struct super_block *sb, sector_t block) 3461da177e4SLinus Torvalds { 3473b5e6454SGioh Kim return __getblk_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE); 3481da177e4SLinus Torvalds } 3491da177e4SLinus Torvalds 350bd7ade3cSNikolay Borisov 351bd7ade3cSNikolay Borisov static inline struct buffer_head * 352bd7ade3cSNikolay Borisov sb_getblk_gfp(struct super_block *sb, sector_t block, gfp_t gfp) 353bd7ade3cSNikolay Borisov { 354bd7ade3cSNikolay Borisov return __getblk_gfp(sb->s_bdev, block, sb->s_blocksize, gfp); 355bd7ade3cSNikolay Borisov } 356bd7ade3cSNikolay Borisov 3571da177e4SLinus Torvalds static inline struct buffer_head * 3581da177e4SLinus Torvalds sb_find_get_block(struct super_block *sb, sector_t block) 3591da177e4SLinus Torvalds { 3601da177e4SLinus Torvalds return __find_get_block(sb->s_bdev, block, sb->s_blocksize); 3611da177e4SLinus Torvalds } 3621da177e4SLinus Torvalds 3631da177e4SLinus Torvalds static inline void 3641da177e4SLinus Torvalds map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) 3651da177e4SLinus Torvalds { 3661da177e4SLinus Torvalds set_buffer_mapped(bh); 3671da177e4SLinus Torvalds bh->b_bdev = sb->s_bdev; 3681da177e4SLinus Torvalds bh->b_blocknr = block; 369b0cf2321SBadari Pulavarty bh->b_size = sb->s_blocksize; 3701da177e4SLinus Torvalds } 3711da177e4SLinus Torvalds 3721da177e4SLinus Torvalds static inline void wait_on_buffer(struct buffer_head *bh) 3731da177e4SLinus Torvalds { 3741da177e4SLinus Torvalds might_sleep(); 375a9877cc2SRichard Kennedy if (buffer_locked(bh)) 3761da177e4SLinus Torvalds __wait_on_buffer(bh); 3771da177e4SLinus Torvalds } 3781da177e4SLinus Torvalds 379ca5de404SNick Piggin static inline int trylock_buffer(struct buffer_head *bh) 380ca5de404SNick Piggin { 38151b07fc3SNick Piggin return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state)); 382ca5de404SNick Piggin } 383ca5de404SNick Piggin 3841da177e4SLinus Torvalds static inline void lock_buffer(struct buffer_head *bh) 3851da177e4SLinus Torvalds { 3861da177e4SLinus Torvalds might_sleep(); 387ca5de404SNick Piggin if (!trylock_buffer(bh)) 3881da177e4SLinus Torvalds __lock_buffer(bh); 3891da177e4SLinus Torvalds } 3901da177e4SLinus Torvalds 3913b5e6454SGioh Kim static inline struct buffer_head *getblk_unmovable(struct block_device *bdev, 3923b5e6454SGioh Kim sector_t block, 3933b5e6454SGioh Kim unsigned size) 3943b5e6454SGioh Kim { 3953b5e6454SGioh Kim return __getblk_gfp(bdev, block, size, 0); 3963b5e6454SGioh Kim } 3973b5e6454SGioh Kim 3983b5e6454SGioh Kim static inline struct buffer_head *__getblk(struct block_device *bdev, 3993b5e6454SGioh Kim sector_t block, 4003b5e6454SGioh Kim unsigned size) 4013b5e6454SGioh Kim { 4023b5e6454SGioh Kim return __getblk_gfp(bdev, block, size, __GFP_MOVABLE); 4033b5e6454SGioh Kim } 4043b5e6454SGioh Kim 405*fdee117eSZhang Yi static inline void bh_readahead(struct buffer_head *bh, blk_opf_t op_flags) 406*fdee117eSZhang Yi { 407*fdee117eSZhang Yi if (!buffer_uptodate(bh) && trylock_buffer(bh)) { 408*fdee117eSZhang Yi if (!buffer_uptodate(bh)) 409*fdee117eSZhang Yi __bh_read(bh, op_flags, false); 410*fdee117eSZhang Yi else 411*fdee117eSZhang Yi unlock_buffer(bh); 412*fdee117eSZhang Yi } 413*fdee117eSZhang Yi } 414*fdee117eSZhang Yi 415*fdee117eSZhang Yi static inline void bh_read_nowait(struct buffer_head *bh, blk_opf_t op_flags) 416*fdee117eSZhang Yi { 417*fdee117eSZhang Yi if (!bh_uptodate_or_lock(bh)) 418*fdee117eSZhang Yi __bh_read(bh, op_flags, false); 419*fdee117eSZhang Yi } 420*fdee117eSZhang Yi 421*fdee117eSZhang Yi /* Returns 1 if buffer uptodated, 0 on success, and -EIO on error. */ 422*fdee117eSZhang Yi static inline int bh_read(struct buffer_head *bh, blk_opf_t op_flags) 423*fdee117eSZhang Yi { 424*fdee117eSZhang Yi if (bh_uptodate_or_lock(bh)) 425*fdee117eSZhang Yi return 1; 426*fdee117eSZhang Yi return __bh_read(bh, op_flags, true); 427*fdee117eSZhang Yi } 428*fdee117eSZhang Yi 429*fdee117eSZhang Yi static inline void bh_read_batch(int nr, struct buffer_head *bhs[]) 430*fdee117eSZhang Yi { 431*fdee117eSZhang Yi __bh_read_batch(nr, bhs, 0, true); 432*fdee117eSZhang Yi } 433*fdee117eSZhang Yi 434*fdee117eSZhang Yi static inline void bh_readahead_batch(int nr, struct buffer_head *bhs[], 435*fdee117eSZhang Yi blk_opf_t op_flags) 436*fdee117eSZhang Yi { 437*fdee117eSZhang Yi __bh_read_batch(nr, bhs, op_flags, false); 438*fdee117eSZhang Yi } 439*fdee117eSZhang Yi 4403b5e6454SGioh Kim /** 4413b5e6454SGioh Kim * __bread() - reads a specified block and returns the bh 4423b5e6454SGioh Kim * @bdev: the block_device to read from 4433b5e6454SGioh Kim * @block: number of block 4443b5e6454SGioh Kim * @size: size (in bytes) to read 4453b5e6454SGioh Kim * 4463b5e6454SGioh Kim * Reads a specified block, and returns buffer head that contains it. 4473b5e6454SGioh Kim * The page cache is allocated from movable area so that it can be migrated. 4483b5e6454SGioh Kim * It returns NULL if the block was unreadable. 4493b5e6454SGioh Kim */ 4503b5e6454SGioh Kim static inline struct buffer_head * 4513b5e6454SGioh Kim __bread(struct block_device *bdev, sector_t block, unsigned size) 4523b5e6454SGioh Kim { 4533b5e6454SGioh Kim return __bread_gfp(bdev, block, size, __GFP_MOVABLE); 4543b5e6454SGioh Kim } 4553b5e6454SGioh Kim 456e621900aSMatthew Wilcox (Oracle) bool block_dirty_folio(struct address_space *mapping, struct folio *folio); 4579361401eSDavid Howells 4589361401eSDavid Howells #else /* CONFIG_BLOCK */ 4599361401eSDavid Howells 4609361401eSDavid Howells static inline void buffer_init(void) {} 46168189fefSMatthew Wilcox (Oracle) static inline bool try_to_free_buffers(struct folio *folio) { return true; } 4629361401eSDavid Howells static inline int inode_has_buffers(struct inode *inode) { return 0; } 4639361401eSDavid Howells static inline void invalidate_inode_buffers(struct inode *inode) {} 4649361401eSDavid Howells static inline int remove_inode_buffers(struct inode *inode) { return 1; } 4659361401eSDavid Howells static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; } 466243418e3SMinchan Kim static inline void invalidate_bh_lrus_cpu(void) {} 4676de522d1SJing Yangyang static inline bool has_bh_in_lru(int cpu, void *dummy) { return false; } 468d2de7ea4SChristoph Hellwig #define buffer_heads_over_limit 0 4699361401eSDavid Howells 4709361401eSDavid Howells #endif /* CONFIG_BLOCK */ 4711da177e4SLinus Torvalds #endif /* _LINUX_BUFFER_HEAD_H */ 472