block: Allow empty integrity profile

Allow a block device to allocate and register an integrity profile
without providing a template.  This allows DM to preallocate a profile
to avoid deadlocks during table reconfiguration.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
Martin K. Petersen 2009-01-04 02:43:40 -05:00 committed by Jens Axboe
parent 8ae372e3bb
commit 322316385d

View File

@ -309,24 +309,24 @@ static struct kobj_type integrity_ktype = {
/** /**
* blk_integrity_register - Register a gendisk as being integrity-capable * blk_integrity_register - Register a gendisk as being integrity-capable
* @disk: struct gendisk pointer to make integrity-aware * @disk: struct gendisk pointer to make integrity-aware
* @template: integrity profile * @template: optional integrity profile to register
* *
* Description: When a device needs to advertise itself as being able * Description: When a device needs to advertise itself as being able
* to send/receive integrity metadata it must use this function to * to send/receive integrity metadata it must use this function to
* register the capability with the block layer. The template is a * register the capability with the block layer. The template is a
* blk_integrity struct with values appropriate for the underlying * blk_integrity struct with values appropriate for the underlying
* hardware. See Documentation/block/data-integrity.txt. * hardware. If template is NULL the new profile is allocated but
* not filled out. See Documentation/block/data-integrity.txt.
*/ */
int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template) int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)
{ {
struct blk_integrity *bi; struct blk_integrity *bi;
BUG_ON(disk == NULL); BUG_ON(disk == NULL);
BUG_ON(template == NULL);
if (disk->integrity == NULL) { if (disk->integrity == NULL) {
bi = kmem_cache_alloc(integrity_cachep, bi = kmem_cache_alloc(integrity_cachep,
GFP_KERNEL | __GFP_ZERO); GFP_KERNEL | __GFP_ZERO);
if (!bi) if (!bi)
return -1; return -1;
@ -346,13 +346,16 @@ int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)
bi = disk->integrity; bi = disk->integrity;
/* Use the provided profile as template */ /* Use the provided profile as template */
bi->name = template->name; if (template != NULL) {
bi->generate_fn = template->generate_fn; bi->name = template->name;
bi->verify_fn = template->verify_fn; bi->generate_fn = template->generate_fn;
bi->tuple_size = template->tuple_size; bi->verify_fn = template->verify_fn;
bi->set_tag_fn = template->set_tag_fn; bi->tuple_size = template->tuple_size;
bi->get_tag_fn = template->get_tag_fn; bi->set_tag_fn = template->set_tag_fn;
bi->tag_size = template->tag_size; bi->get_tag_fn = template->get_tag_fn;
bi->tag_size = template->tag_size;
} else
bi->name = "unsupported";
return 0; return 0;
} }