3115 lines · 81.1 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-only/* *  linux/fs/buffer.c * *  Copyright (C) 1991, 1992, 2002  Linus Torvalds */ /* * Start bdflush() with kernel_thread not syscall - Paul Gortmaker, 12/95 * * Removed a lot of unnecessary code and simplified things now that * the buffer cache isn't our primary cache - Andrew Tridgell 12/96 * * Speed up hash, lru, and free list operations.  Use gfp() for allocating * hash table, use SLAB cache for buffer heads. SMP threading.  -DaveM * * Added 32k buffer block sizes - these are required older ARM systems. - RMK * * async buffer flushing, 1999 Andrea Arcangeli <andrea@suse.de> */ #include <linux/kernel.h>#include <linux/sched/signal.h>#include <linux/syscalls.h>#include <linux/fs.h>#include <linux/iomap.h>#include <linux/mm.h>#include <linux/percpu.h>#include <linux/slab.h>#include <linux/capability.h>#include <linux/blkdev.h>#include <linux/file.h>#include <linux/quotaops.h>#include <linux/highmem.h>#include <linux/export.h>#include <linux/backing-dev.h>#include <linux/writeback.h>#include <linux/hash.h>#include <linux/suspend.h>#include <linux/buffer_head.h>#include <linux/task_io_accounting_ops.h>#include <linux/bio.h>#include <linux/cpu.h>#include <linux/bitops.h>#include <linux/mpage.h>#include <linux/bit_spinlock.h>#include <linux/pagevec.h>#include <linux/sched/mm.h>#include <trace/events/block.h>#include <linux/fscrypt.h>#include <linux/fsverity.h> #include "internal.h" static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);static void submit_bh_wbc(blk_opf_t opf, struct buffer_head *bh,			  struct writeback_control *wbc); #define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers) inline void touch_buffer(struct buffer_head *bh){	trace_block_touch_buffer(bh);	folio_mark_accessed(bh->b_folio);}EXPORT_SYMBOL(touch_buffer); void __lock_buffer(struct buffer_head *bh){	wait_on_bit_lock_io(&bh->b_state, BH_Lock, TASK_UNINTERRUPTIBLE);}EXPORT_SYMBOL(__lock_buffer); void unlock_buffer(struct buffer_head *bh){	clear_bit_unlock(BH_Lock, &bh->b_state);	smp_mb__after_atomic();	wake_up_bit(&bh->b_state, BH_Lock);}EXPORT_SYMBOL(unlock_buffer); /* * Returns if the folio has dirty or writeback buffers. If all the buffers * are unlocked and clean then the folio_test_dirty information is stale. If * any of the buffers are locked, it is assumed they are locked for IO. */void buffer_check_dirty_writeback(struct folio *folio,				     bool *dirty, bool *writeback){	struct buffer_head *head, *bh;	*dirty = false;	*writeback = false; 	BUG_ON(!folio_test_locked(folio)); 	head = folio_buffers(folio);	if (!head)		return; 	if (folio_test_writeback(folio))		*writeback = true; 	bh = head;	do {		if (buffer_locked(bh))			*writeback = true; 		if (buffer_dirty(bh))			*dirty = true; 		bh = bh->b_this_page;	} while (bh != head);}EXPORT_SYMBOL(buffer_check_dirty_writeback); /* * Block until a buffer comes unlocked.  This doesn't stop it * from becoming locked again - you have to lock it yourself * if you want to preserve its state. */void __wait_on_buffer(struct buffer_head * bh){	wait_on_bit_io(&bh->b_state, BH_Lock, TASK_UNINTERRUPTIBLE);}EXPORT_SYMBOL(__wait_on_buffer); static void buffer_io_error(struct buffer_head *bh, char *msg){	if (!test_bit(BH_Quiet, &bh->b_state))		printk_ratelimited(KERN_ERR			"Buffer I/O error on dev %pg, logical block %llu%s\n",			bh->b_bdev, (unsigned long long)bh->b_blocknr, msg);} /* * End-of-IO handler helper function which does not touch the bh after * unlocking it. * Note: unlock_buffer() sort-of does touch the bh after unlocking it, but * a race there is benign: unlock_buffer() only use the bh's address for * hashing after unlocking the buffer, so it doesn't actually touch the bh * itself. */static void __end_buffer_read_notouch(struct buffer_head *bh, int uptodate){	if (uptodate) {		set_buffer_uptodate(bh);	} else {		/* This happens, due to failed read-ahead attempts. */		clear_buffer_uptodate(bh);	}	unlock_buffer(bh);} /* * Default synchronous end-of-IO handler..  Just mark it up-to-date and * unlock the buffer. */void end_buffer_read_sync(struct buffer_head *bh, int uptodate){	__end_buffer_read_notouch(bh, uptodate);	put_bh(bh);}EXPORT_SYMBOL(end_buffer_read_sync); void end_buffer_write_sync(struct buffer_head *bh, int uptodate){	if (uptodate) {		set_buffer_uptodate(bh);	} else {		buffer_io_error(bh, ", lost sync page write");		mark_buffer_write_io_error(bh);		clear_buffer_uptodate(bh);	}	unlock_buffer(bh);	put_bh(bh);}EXPORT_SYMBOL(end_buffer_write_sync); /* * Various filesystems appear to want __find_get_block to be non-blocking. * But it's the page lock which protects the buffers.  To get around this, * we get exclusion from try_to_free_buffers with the blockdev mapping's * private_lock. * * Hack idea: for the blockdev mapping, private_lock contention * may be quite high.  This code could TryLock the page, and if that * succeeds, there is no need to take private_lock. */static struct buffer_head *__find_get_block_slow(struct block_device *bdev, sector_t block){	struct inode *bd_inode = bdev->bd_inode;	struct address_space *bd_mapping = bd_inode->i_mapping;	struct buffer_head *ret = NULL;	pgoff_t index;	struct buffer_head *bh;	struct buffer_head *head;	struct page *page;	int all_mapped = 1;	static DEFINE_RATELIMIT_STATE(last_warned, HZ, 1); 	index = block >> (PAGE_SHIFT - bd_inode->i_blkbits);	page = find_get_page_flags(bd_mapping, index, FGP_ACCESSED);	if (!page)		goto out; 	spin_lock(&bd_mapping->private_lock);	if (!page_has_buffers(page))		goto out_unlock;	head = page_buffers(page);	bh = head;	do {		if (!buffer_mapped(bh))			all_mapped = 0;		else if (bh->b_blocknr == block) {			ret = bh;			get_bh(bh);			goto out_unlock;		}		bh = bh->b_this_page;	} while (bh != head); 	/* we might be here because some of the buffers on this page are	 * not mapped.  This is due to various races between	 * file io on the block device and getblk.  It gets dealt with	 * elsewhere, don't buffer_error if we had some unmapped buffers	 */	ratelimit_set_flags(&last_warned, RATELIMIT_MSG_ON_RELEASE);	if (all_mapped && __ratelimit(&last_warned)) {		printk("__find_get_block_slow() failed. block=%llu, "		       "b_blocknr=%llu, b_state=0x%08lx, b_size=%zu, "		       "device %pg blocksize: %d\n",		       (unsigned long long)block,		       (unsigned long long)bh->b_blocknr,		       bh->b_state, bh->b_size, bdev,		       1 << bd_inode->i_blkbits);	}out_unlock:	spin_unlock(&bd_mapping->private_lock);	put_page(page);out:	return ret;} static void end_buffer_async_read(struct buffer_head *bh, int uptodate){	unsigned long flags;	struct buffer_head *first;	struct buffer_head *tmp;	struct folio *folio;	int folio_uptodate = 1; 	BUG_ON(!buffer_async_read(bh)); 	folio = bh->b_folio;	if (uptodate) {		set_buffer_uptodate(bh);	} else {		clear_buffer_uptodate(bh);		buffer_io_error(bh, ", async page read");		folio_set_error(folio);	} 	/*	 * Be _very_ careful from here on. Bad things can happen if	 * two buffer heads end IO at almost the same time and both	 * decide that the page is now completely done.	 */	first = folio_buffers(folio);	spin_lock_irqsave(&first->b_uptodate_lock, flags);	clear_buffer_async_read(bh);	unlock_buffer(bh);	tmp = bh;	do {		if (!buffer_uptodate(tmp))			folio_uptodate = 0;		if (buffer_async_read(tmp)) {			BUG_ON(!buffer_locked(tmp));			goto still_busy;		}		tmp = tmp->b_this_page;	} while (tmp != bh);	spin_unlock_irqrestore(&first->b_uptodate_lock, flags); 	/*	 * If all of the buffers are uptodate then we can set the page	 * uptodate.	 */	if (folio_uptodate)		folio_mark_uptodate(folio);	folio_unlock(folio);	return; still_busy:	spin_unlock_irqrestore(&first->b_uptodate_lock, flags);	return;} struct postprocess_bh_ctx {	struct work_struct work;	struct buffer_head *bh;}; static void verify_bh(struct work_struct *work){	struct postprocess_bh_ctx *ctx =		container_of(work, struct postprocess_bh_ctx, work);	struct buffer_head *bh = ctx->bh;	bool valid; 	valid = fsverity_verify_blocks(bh->b_folio, bh->b_size, bh_offset(bh));	end_buffer_async_read(bh, valid);	kfree(ctx);} static bool need_fsverity(struct buffer_head *bh){	struct folio *folio = bh->b_folio;	struct inode *inode = folio->mapping->host; 	return fsverity_active(inode) &&		/* needed by ext4 */		folio->index < DIV_ROUND_UP(inode->i_size, PAGE_SIZE);} static void decrypt_bh(struct work_struct *work){	struct postprocess_bh_ctx *ctx =		container_of(work, struct postprocess_bh_ctx, work);	struct buffer_head *bh = ctx->bh;	int err; 	err = fscrypt_decrypt_pagecache_blocks(bh->b_folio, bh->b_size,					       bh_offset(bh));	if (err == 0 && need_fsverity(bh)) {		/*		 * We use different work queues for decryption and for verity		 * because verity may require reading metadata pages that need		 * decryption, and we shouldn't recurse to the same workqueue.		 */		INIT_WORK(&ctx->work, verify_bh);		fsverity_enqueue_verify_work(&ctx->work);		return;	}	end_buffer_async_read(bh, err == 0);	kfree(ctx);} /* * I/O completion handler for block_read_full_folio() - pages * which come unlocked at the end of I/O. */static void end_buffer_async_read_io(struct buffer_head *bh, int uptodate){	struct inode *inode = bh->b_folio->mapping->host;	bool decrypt = fscrypt_inode_uses_fs_layer_crypto(inode);	bool verify = need_fsverity(bh); 	/* Decrypt (with fscrypt) and/or verify (with fsverity) if needed. */	if (uptodate && (decrypt || verify)) {		struct postprocess_bh_ctx *ctx =			kmalloc(sizeof(*ctx), GFP_ATOMIC); 		if (ctx) {			ctx->bh = bh;			if (decrypt) {				INIT_WORK(&ctx->work, decrypt_bh);				fscrypt_enqueue_decrypt_work(&ctx->work);			} else {				INIT_WORK(&ctx->work, verify_bh);				fsverity_enqueue_verify_work(&ctx->work);			}			return;		}		uptodate = 0;	}	end_buffer_async_read(bh, uptodate);} /* * Completion handler for block_write_full_page() - pages which are unlocked * during I/O, and which have PageWriteback cleared upon I/O completion. */void end_buffer_async_write(struct buffer_head *bh, int uptodate){	unsigned long flags;	struct buffer_head *first;	struct buffer_head *tmp;	struct folio *folio; 	BUG_ON(!buffer_async_write(bh)); 	folio = bh->b_folio;	if (uptodate) {		set_buffer_uptodate(bh);	} else {		buffer_io_error(bh, ", lost async page write");		mark_buffer_write_io_error(bh);		clear_buffer_uptodate(bh);		folio_set_error(folio);	} 	first = folio_buffers(folio);	spin_lock_irqsave(&first->b_uptodate_lock, flags); 	clear_buffer_async_write(bh);	unlock_buffer(bh);	tmp = bh->b_this_page;	while (tmp != bh) {		if (buffer_async_write(tmp)) {			BUG_ON(!buffer_locked(tmp));			goto still_busy;		}		tmp = tmp->b_this_page;	}	spin_unlock_irqrestore(&first->b_uptodate_lock, flags);	folio_end_writeback(folio);	return; still_busy:	spin_unlock_irqrestore(&first->b_uptodate_lock, flags);	return;}EXPORT_SYMBOL(end_buffer_async_write); /* * If a page's buffers are under async readin (end_buffer_async_read * completion) then there is a possibility that another thread of * control could lock one of the buffers after it has completed * but while some of the other buffers have not completed.  This * locked buffer would confuse end_buffer_async_read() into not unlocking * the page.  So the absence of BH_Async_Read tells end_buffer_async_read() * that this buffer is not under async I/O. * * The page comes unlocked when it has no locked buffer_async buffers * left. * * PageLocked prevents anyone starting new async I/O reads any of * the buffers. * * PageWriteback is used to prevent simultaneous writeout of the same * page. * * PageLocked prevents anyone from starting writeback of a page which is * under read I/O (PageWriteback is only ever set against a locked page). */static void mark_buffer_async_read(struct buffer_head *bh){	bh->b_end_io = end_buffer_async_read_io;	set_buffer_async_read(bh);} static void mark_buffer_async_write_endio(struct buffer_head *bh,					  bh_end_io_t *handler){	bh->b_end_io = handler;	set_buffer_async_write(bh);} void mark_buffer_async_write(struct buffer_head *bh){	mark_buffer_async_write_endio(bh, end_buffer_async_write);}EXPORT_SYMBOL(mark_buffer_async_write);  /* * fs/buffer.c contains helper functions for buffer-backed address space's * fsync functions.  A common requirement for buffer-based filesystems is * that certain data from the backing blockdev needs to be written out for * a successful fsync().  For example, ext2 indirect blocks need to be * written back and waited upon before fsync() returns. * * The functions mark_buffer_inode_dirty(), fsync_inode_buffers(), * inode_has_buffers() and invalidate_inode_buffers() are provided for the * management of a list of dependent buffers at ->i_mapping->private_list. * * Locking is a little subtle: try_to_free_buffers() will remove buffers * from their controlling inode's queue when they are being freed.  But * try_to_free_buffers() will be operating against the *blockdev* mapping * at the time, not against the S_ISREG file which depends on those buffers. * So the locking for private_list is via the private_lock in the address_space * which backs the buffers.  Which is different from the address_space  * against which the buffers are listed.  So for a particular address_space, * mapping->private_lock does *not* protect mapping->private_list!  In fact, * mapping->private_list will always be protected by the backing blockdev's * ->private_lock. * * Which introduces a requirement: all buffers on an address_space's * ->private_list must be from the same address_space: the blockdev's. * * address_spaces which do not place buffers at ->private_list via these * utility functions are free to use private_lock and private_list for * whatever they want.  The only requirement is that list_empty(private_list) * be true at clear_inode() time. * * FIXME: clear_inode should not call invalidate_inode_buffers().  The * filesystems should do that.  invalidate_inode_buffers() should just go * BUG_ON(!list_empty). *

Lines 1–500 of 3115.