diff options
Diffstat (limited to 'fs/bio-integrity.c')
| -rw-r--r-- | fs/bio-integrity.c | 29 | 
1 files changed, 28 insertions, 1 deletions
diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c index c3e174b35fe..19caf7c962a 100644 --- a/fs/bio-integrity.c +++ b/fs/bio-integrity.c @@ -107,7 +107,8 @@ void bio_integrity_free(struct bio *bio, struct bio_set *bs)  	BUG_ON(bip == NULL);  	/* A cloned bio doesn't own the integrity metadata */ -	if (!bio_flagged(bio, BIO_CLONED) && bip->bip_buf != NULL) +	if (!bio_flagged(bio, BIO_CLONED) && !bio_flagged(bio, BIO_FS_INTEGRITY) +	    && bip->bip_buf != NULL)  		kfree(bip->bip_buf);  	mempool_free(bip->bip_vec, bs->bvec_pools[bip->bip_pool]); @@ -150,6 +151,24 @@ int bio_integrity_add_page(struct bio *bio, struct page *page,  }  EXPORT_SYMBOL(bio_integrity_add_page); +static int bdev_integrity_enabled(struct block_device *bdev, int rw) +{ +	struct blk_integrity *bi = bdev_get_integrity(bdev); + +	if (bi == NULL) +		return 0; + +	if (rw == READ && bi->verify_fn != NULL && +	    (bi->flags & INTEGRITY_FLAG_READ)) +		return 1; + +	if (rw == WRITE && bi->generate_fn != NULL && +	    (bi->flags & INTEGRITY_FLAG_WRITE)) +		return 1; + +	return 0; +} +  /**   * bio_integrity_enabled - Check whether integrity can be passed   * @bio:	bio to check @@ -313,6 +332,14 @@ static void bio_integrity_generate(struct bio *bio)  	}  } +static inline unsigned short blk_integrity_tuple_size(struct blk_integrity *bi) +{ +	if (bi) +		return bi->tuple_size; + +	return 0; +} +  /**   * bio_integrity_prep - Prepare bio for integrity I/O   * @bio:	bio to prepare  |