block: Fix nr_vecs for inline integrity vectors
Commit 9f060e2231 changed the way we handle allocations for the
integrity vectors. When the vectors are inline there is no associated
slab and consequently bvec_nr_vecs() returns 0. Ensure that we check
against BIP_INLINE_VECS in that case.
Reported-by: David Milburn <dmilburn@redhat.com>
Tested-by: David Milburn <dmilburn@redhat.com>
Cc: stable@vger.kernel.org # v3.10+
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
	
	
This commit is contained in:
		
					parent
					
						
							
								14ec77f352
							
						
					
				
			
			
				commit
				
					
						087787959c
					
				
			
		
					 1 changed files with 9 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -114,6 +114,14 @@ 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
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +137,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 >= bvec_nr_vecs(bip->bip_slab)) {
 | 
			
		||||
	if (bip->bip_vcnt >= bip_integrity_vecs(bip)) {
 | 
			
		||||
		printk(KERN_ERR "%s: bip_vec full\n", __func__);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue