diff options
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 33 | 
1 files changed, 5 insertions, 28 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index d8c7242426bb..18a87ec8a465 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -3031,11 +3031,9 @@ static void end_bio_bh_io_sync(struct bio *bio)   * errors, this only handles the "we need to be able to   * do IO at the final sector" case.   */ -void guard_bio_eod(int op, struct bio *bio) +void guard_bio_eod(struct bio *bio)  {  	sector_t maxsector; -	struct bio_vec *bvec = bio_last_bvec_all(bio); -	unsigned truncated_bytes;  	struct hd_struct *part;  	rcu_read_lock(); @@ -3061,28 +3059,7 @@ void guard_bio_eod(int op, struct bio *bio)  	if (likely((bio->bi_iter.bi_size >> 9) <= maxsector))  		return; -	/* Uhhuh. We've got a bio that straddles the device size! */ -	truncated_bytes = bio->bi_iter.bi_size - (maxsector << 9); - -	/* -	 * The bio contains more than one segment which spans EOD, just return -	 * and let IO layer turn it into an EIO -	 */ -	if (truncated_bytes > bvec->bv_len) -		return; - -	/* Truncate the bio.. */ -	bio->bi_iter.bi_size -= truncated_bytes; -	bvec->bv_len -= truncated_bytes; - -	/* ..and clear the end of the buffer for reads */ -	if (op == REQ_OP_READ) { -		struct bio_vec bv; - -		mp_bvec_last_segment(bvec, &bv); -		zero_user(bv.bv_page, bv.bv_offset + bv.bv_len, -				truncated_bytes); -	} +	bio_truncate(bio, maxsector << 9);  }  static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, @@ -3118,15 +3095,15 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,  	bio->bi_end_io = end_bio_bh_io_sync;  	bio->bi_private = bh; -	/* Take care of bh's that straddle the end of the device */ -	guard_bio_eod(op, bio); -  	if (buffer_meta(bh))  		op_flags |= REQ_META;  	if (buffer_prio(bh))  		op_flags |= REQ_PRIO;  	bio_set_op_attrs(bio, op, op_flags); +	/* Take care of bh's that straddle the end of the device */ +	guard_bio_eod(bio); +  	if (wbc) {  		wbc_init_bio(wbc, bio);  		wbc_account_cgroup_owner(wbc, bh->b_page, bh->b_size);  | 
