diff options
Diffstat (limited to 'fs/block_dev.c')
| -rw-r--r-- | fs/block_dev.c | 34 | 
1 files changed, 12 insertions, 22 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 78d3257435c0..e6886c93c89d 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-only  /*   *  linux/fs/block_dev.c   * @@ -29,8 +30,6 @@  #include <linux/namei.h>  #include <linux/log2.h>  #include <linux/cleancache.h> -#include <linux/dax.h> -#include <linux/badblocks.h>  #include <linux/task_io_accounting_ops.h>  #include <linux/falloc.h>  #include <linux/uaccess.h> @@ -210,7 +209,6 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,  	struct bio bio;  	ssize_t ret;  	blk_qc_t qc; -	int i;  	struct bvec_iter_all iter_all;  	if ((pos | iov_iter_alignment(iter)) & @@ -261,10 +259,11 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,  	}  	__set_current_state(TASK_RUNNING); -	bio_for_each_segment_all(bvec, &bio, i, iter_all) { +	bio_for_each_segment_all(bvec, &bio, iter_all) {  		if (should_dirty && !PageCompound(bvec->bv_page))  			set_page_dirty_lock(bvec->bv_page); -		put_page(bvec->bv_page); +		if (!bio_flagged(&bio, BIO_NO_PAGE_REF)) +			put_page(bvec->bv_page);  	}  	if (unlikely(bio.bi_status)) @@ -307,10 +306,10 @@ static void blkdev_bio_end_io(struct bio *bio)  	struct blkdev_dio *dio = bio->bi_private;  	bool should_dirty = dio->should_dirty; -	if (dio->multi_bio && !atomic_dec_and_test(&dio->ref)) { -		if (bio->bi_status && !dio->bio.bi_status) -			dio->bio.bi_status = bio->bi_status; -	} else { +	if (bio->bi_status && !dio->bio.bi_status) +		dio->bio.bi_status = bio->bi_status; + +	if (!dio->multi_bio || atomic_dec_and_test(&dio->ref)) {  		if (!dio->is_sync) {  			struct kiocb *iocb = dio->iocb;  			ssize_t ret; @@ -339,9 +338,8 @@ static void blkdev_bio_end_io(struct bio *bio)  		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {  			struct bvec_iter_all iter_all;  			struct bio_vec *bvec; -			int i; -			bio_for_each_segment_all(bvec, bio, i, iter_all) +			bio_for_each_segment_all(bvec, bio, iter_all)  				put_page(bvec->bv_page);  		}  		bio_put(bio); @@ -789,17 +787,9 @@ static struct inode *bdev_alloc_inode(struct super_block *sb)  	return &ei->vfs_inode;  } -static void bdev_i_callback(struct rcu_head *head) -{ -	struct inode *inode = container_of(head, struct inode, i_rcu); -	struct bdev_inode *bdi = BDEV_I(inode); - -	kmem_cache_free(bdev_cachep, bdi); -} - -static void bdev_destroy_inode(struct inode *inode) +static void bdev_free_inode(struct inode *inode)  { -	call_rcu(&inode->i_rcu, bdev_i_callback); +	kmem_cache_free(bdev_cachep, BDEV_I(inode));  }  static void init_once(void *foo) @@ -839,7 +829,7 @@ static void bdev_evict_inode(struct inode *inode)  static const struct super_operations bdev_sops = {  	.statfs = simple_statfs,  	.alloc_inode = bdev_alloc_inode, -	.destroy_inode = bdev_destroy_inode, +	.free_inode = bdev_free_inode,  	.drop_inode = generic_delete_inode,  	.evict_inode = bdev_evict_inode,  };  |