forked from Minki/linux
block: add blk_alloc_disk and blk_cleanup_disk APIs
Add two new APIs to allocate and free a gendisk including the request_queue for use with BIO based drivers. This is to avoid boilerplate code in drivers. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Link: https://lore.kernel.org/r/20210521055116.1053587-6-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
958229a7c5
commit
f525464a80
@ -1293,6 +1293,25 @@ out_free_disk:
|
||||
}
|
||||
EXPORT_SYMBOL(__alloc_disk_node);
|
||||
|
||||
struct gendisk *__blk_alloc_disk(int node)
|
||||
{
|
||||
struct request_queue *q;
|
||||
struct gendisk *disk;
|
||||
|
||||
q = blk_alloc_queue(node);
|
||||
if (!q)
|
||||
return NULL;
|
||||
|
||||
disk = __alloc_disk_node(0, node);
|
||||
if (!disk) {
|
||||
blk_cleanup_queue(q);
|
||||
return NULL;
|
||||
}
|
||||
disk->queue = q;
|
||||
return disk;
|
||||
}
|
||||
EXPORT_SYMBOL(__blk_alloc_disk);
|
||||
|
||||
/**
|
||||
* put_disk - decrements the gendisk refcount
|
||||
* @disk: the struct gendisk to decrement the refcount for
|
||||
@ -1310,6 +1329,22 @@ void put_disk(struct gendisk *disk)
|
||||
}
|
||||
EXPORT_SYMBOL(put_disk);
|
||||
|
||||
/**
|
||||
* blk_cleanup_disk - shutdown a gendisk allocated by blk_alloc_disk
|
||||
* @disk: gendisk to shutdown
|
||||
*
|
||||
* Mark the queue hanging off @disk DYING, drain all pending requests, then mark
|
||||
* the queue DEAD, destroy and put it and the gendisk structure.
|
||||
*
|
||||
* Context: can sleep
|
||||
*/
|
||||
void blk_cleanup_disk(struct gendisk *disk)
|
||||
{
|
||||
blk_cleanup_queue(disk->queue);
|
||||
put_disk(disk);
|
||||
}
|
||||
EXPORT_SYMBOL(blk_cleanup_disk);
|
||||
|
||||
static void set_disk_ro_uevent(struct gendisk *gd, int ro)
|
||||
{
|
||||
char event[] = "DISK_RO=1";
|
||||
|
@ -278,6 +278,28 @@ extern void put_disk(struct gendisk *disk);
|
||||
|
||||
#define alloc_disk(minors) alloc_disk_node(minors, NUMA_NO_NODE)
|
||||
|
||||
/**
|
||||
* blk_alloc_disk - allocate a gendisk structure
|
||||
* @node_id: numa node to allocate on
|
||||
*
|
||||
* Allocate and pre-initialize a gendisk structure for use with BIO based
|
||||
* drivers.
|
||||
*
|
||||
* Context: can sleep
|
||||
*/
|
||||
#define blk_alloc_disk(node_id) \
|
||||
({ \
|
||||
struct gendisk *__disk = __blk_alloc_disk(node_id); \
|
||||
static struct lock_class_key __key; \
|
||||
\
|
||||
if (__disk) \
|
||||
lockdep_init_map(&__disk->lockdep_map, \
|
||||
"(bio completion)", &__key, 0); \
|
||||
__disk; \
|
||||
})
|
||||
struct gendisk *__blk_alloc_disk(int node);
|
||||
void blk_cleanup_disk(struct gendisk *disk);
|
||||
|
||||
int __register_blkdev(unsigned int major, const char *name,
|
||||
void (*probe)(dev_t devt));
|
||||
#define register_blkdev(major, name) \
|
||||
|
Loading…
Reference in New Issue
Block a user