diff options
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 18 | 
1 files changed, 9 insertions, 9 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index bd091329026c..084a6ade108a 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -49,6 +49,7 @@  #include <trace/events/block.h>  #include <linux/fscrypt.h>  #include <linux/fsverity.h> +#include <linux/sched/isolation.h>  #include "internal.h" @@ -1225,19 +1226,14 @@ EXPORT_SYMBOL(mark_buffer_dirty);  void mark_buffer_write_io_error(struct buffer_head *bh)  { -	struct super_block *sb; -  	set_buffer_write_io_error(bh);  	/* FIXME: do we need to set this in both places? */  	if (bh->b_folio && bh->b_folio->mapping)  		mapping_set_error(bh->b_folio->mapping, -EIO); -	if (bh->b_assoc_map) +	if (bh->b_assoc_map) {  		mapping_set_error(bh->b_assoc_map, -EIO); -	rcu_read_lock(); -	sb = READ_ONCE(bh->b_bdev->bd_super); -	if (sb) -		errseq_set(&sb->s_wb_err, -EIO); -	rcu_read_unlock(); +		errseq_set(&bh->b_assoc_map->host->i_sb->s_wb_err, -EIO); +	}  }  EXPORT_SYMBOL(mark_buffer_write_io_error); @@ -1352,7 +1348,7 @@ static void bh_lru_install(struct buffer_head *bh)  	 * failing page migration.  	 * Skip putting upcoming bh into bh_lru until migration is done.  	 */ -	if (lru_cache_disabled()) { +	if (lru_cache_disabled() || cpu_is_isolated(smp_processor_id())) {  		bh_lru_unlock();  		return;  	} @@ -1382,6 +1378,10 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, unsigned size)  	check_irqs_on();  	bh_lru_lock(); +	if (cpu_is_isolated(smp_processor_id())) { +		bh_lru_unlock(); +		return NULL; +	}  	for (i = 0; i < BH_LRU_SIZE; i++) {  		struct buffer_head *bh = __this_cpu_read(bh_lrus.bhs[i]);  | 
