diff options
| author | Gu Zheng <guz.fnst@cn.fujitsu.com> | 2014-07-01 10:36:47 -0600 | 
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2014-07-01 10:36:47 -0600 | 
| commit | cbcd1054a1fd2aa980fc11ff28e436fc4aaa2d54 (patch) | |
| tree | ba7302637859ce48e703a4bd2c3ce7c7d2a27175 | |
| parent | add703fda981b9719d37f371498b9f129acbd997 (diff) | |
bio-integrity: add "bip_max_vcnt" into struct bio_integrity_payload
Commit 08778795 ("block: Fix nr_vecs for inline integrity vectors") from
Martin introduces the function bip_integrity_vecs(get the useful vectors)
to fix the issue about nr_vecs for inline integrity vectors that reported
by David Milburn.
But it seems that bip_integrity_vecs() will return the wrong number if the
bio is not based on any bio_set for some reason(bio->bi_pool == NULL),
because in that case, the bip_inline_vecs[0] is malloced directly.  So
here we add the bip_max_vcnt to record the count of vector slots, and
cleanup the function bip_integrity_vecs().
Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Kent Overstreet <kmo@daterainc.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
| -rw-r--r-- | block/bio-integrity.c | 12 | ||||
| -rw-r--r-- | include/linux/bio.h | 1 | 
2 files changed, 4 insertions, 9 deletions
| diff --git a/block/bio-integrity.c b/block/bio-integrity.c index 9e241063a616..bc423f7b02da 100644 --- a/block/bio-integrity.c +++ b/block/bio-integrity.c @@ -70,8 +70,10 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,  					  bs->bvec_integrity_pool);  		if (!bip->bip_vec)  			goto err; +		bip->bip_max_vcnt = bvec_nr_vecs(idx);  	} else {  		bip->bip_vec = bip->bip_inline_vecs; +		bip->bip_max_vcnt = inline_vecs;  	}  	bip->bip_slab = idx; @@ -114,14 +116,6 @@ void bio_integrity_free(struct bio *bio)  }  EXPORT_SYMBOL(bio_integrity_free); -static inline unsigned int bip_integrity_vecs(struct bio_integrity_payload *bip) -{ -	if (bip->bip_slab == BIO_POOL_NONE) -		return BIP_INLINE_VECS; - -	return bvec_nr_vecs(bip->bip_slab); -} -  /**   * bio_integrity_add_page - Attach integrity metadata   * @bio:	bio to update @@ -137,7 +131,7 @@ int bio_integrity_add_page(struct bio *bio, struct page *page,  	struct bio_integrity_payload *bip = bio->bi_integrity;  	struct bio_vec *iv; -	if (bip->bip_vcnt >= bip_integrity_vecs(bip)) { +	if (bip->bip_vcnt >= bip->bip_max_vcnt) {  		printk(KERN_ERR "%s: bip_vec full\n", __func__);  		return 0;  	} diff --git a/include/linux/bio.h b/include/linux/bio.h index d2633ee099d9..b39e5000ff58 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -308,6 +308,7 @@ struct bio_integrity_payload {  	unsigned short		bip_slab;	/* slab the bip came from */  	unsigned short		bip_vcnt;	/* # of integrity bio_vecs */ +	unsigned short		bip_max_vcnt;	/* integrity bio_vec slots */  	unsigned		bip_owns_buf:1;	/* should free bip_buf */  	struct work_struct	bip_work;	/* I/O completion */ | 
