diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 20 | 
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 0d5ba922e411..ce5f21b6c2b3 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2783,11 +2783,12 @@ static int ext4_writepages(struct address_space *mapping,  		.can_map = 1,  	};  	int ret; +	int alloc_ctx;  	if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))  		return -EIO; -	percpu_down_read(&EXT4_SB(sb)->s_writepages_rwsem); +	alloc_ctx = ext4_writepages_down_read(sb);  	ret = ext4_do_writepages(&mpd);  	/*  	 * For data=journal writeback we could have come across pages marked @@ -2796,7 +2797,7 @@ static int ext4_writepages(struct address_space *mapping,  	 */  	if (!ret && mpd.journalled_more_data)  		ret = ext4_do_writepages(&mpd); -	percpu_up_read(&EXT4_SB(sb)->s_writepages_rwsem); +	ext4_writepages_up_read(sb, alloc_ctx);  	return ret;  } @@ -2824,17 +2825,18 @@ static int ext4_dax_writepages(struct address_space *mapping,  	long nr_to_write = wbc->nr_to_write;  	struct inode *inode = mapping->host;  	struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); +	int alloc_ctx;  	if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))  		return -EIO; -	percpu_down_read(&sbi->s_writepages_rwsem); +	alloc_ctx = ext4_writepages_down_read(inode->i_sb);  	trace_ext4_writepages(inode, wbc);  	ret = dax_writeback_mapping_range(mapping, sbi->s_daxdev, wbc);  	trace_ext4_writepages_result(inode, wbc, ret,  				     nr_to_write - wbc->nr_to_write); -	percpu_up_read(&sbi->s_writepages_rwsem); +	ext4_writepages_up_read(inode->i_sb, alloc_ctx);  	return ret;  } @@ -3375,7 +3377,7 @@ static int ext4_iomap_overwrite_begin(struct inode *inode, loff_t offset,  	 */  	flags &= ~IOMAP_WRITE;  	ret = ext4_iomap_begin(inode, offset, length, flags, iomap, srcmap); -	WARN_ON_ONCE(iomap->type != IOMAP_MAPPED); +	WARN_ON_ONCE(!ret && iomap->type != IOMAP_MAPPED);  	return ret;  } @@ -5928,7 +5930,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)  	journal_t *journal;  	handle_t *handle;  	int err; -	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); +	int alloc_ctx;  	/*  	 * We have to be very careful here: changing a data block's @@ -5966,7 +5968,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)  		}  	} -	percpu_down_write(&sbi->s_writepages_rwsem); +	alloc_ctx = ext4_writepages_down_write(inode->i_sb);  	jbd2_journal_lock_updates(journal);  	/* @@ -5983,7 +5985,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)  		err = jbd2_journal_flush(journal, 0);  		if (err < 0) {  			jbd2_journal_unlock_updates(journal); -			percpu_up_write(&sbi->s_writepages_rwsem); +			ext4_writepages_up_write(inode->i_sb, alloc_ctx);  			return err;  		}  		ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); @@ -5991,7 +5993,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)  	ext4_set_aops(inode);  	jbd2_journal_unlock_updates(journal); -	percpu_up_write(&sbi->s_writepages_rwsem); +	ext4_writepages_up_write(inode->i_sb, alloc_ctx);  	if (val)  		filemap_invalidate_unlock(inode->i_mapping);  | 
