Commit b5bd357c authored by Luis Chamberlain's avatar Luis Chamberlain Committed by Jens Axboe

block: add docs for gendisk / request_queue refcount helpers

This adds documentation for the gendisk / request_queue refcount
helpers.
Signed-off-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent ff029451
...@@ -321,6 +321,13 @@ void blk_clear_pm_only(struct request_queue *q) ...@@ -321,6 +321,13 @@ void blk_clear_pm_only(struct request_queue *q)
} }
EXPORT_SYMBOL_GPL(blk_clear_pm_only); EXPORT_SYMBOL_GPL(blk_clear_pm_only);
/**
* blk_put_queue - decrement the request_queue refcount
* @q: the request_queue structure to decrement the refcount for
*
* Decrements the refcount of the request_queue kobject. When this reaches 0
* we'll have blk_release_queue() called.
*/
void blk_put_queue(struct request_queue *q) void blk_put_queue(struct request_queue *q)
{ {
kobject_put(&q->kobj); kobject_put(&q->kobj);
...@@ -598,6 +605,12 @@ struct request_queue *blk_alloc_queue(make_request_fn make_request, int node_id) ...@@ -598,6 +605,12 @@ struct request_queue *blk_alloc_queue(make_request_fn make_request, int node_id)
} }
EXPORT_SYMBOL(blk_alloc_queue); EXPORT_SYMBOL(blk_alloc_queue);
/**
* blk_get_queue - increment the request_queue refcount
* @q: the request_queue structure to increment the refcount for
*
* Increment the refcount of the request_queue kobject.
*/
bool blk_get_queue(struct request_queue *q) bool blk_get_queue(struct request_queue *q)
{ {
if (likely(!blk_queue_dying(q))) { if (likely(!blk_queue_dying(q))) {
......
...@@ -876,6 +876,20 @@ static void invalidate_partition(struct gendisk *disk, int partno) ...@@ -876,6 +876,20 @@ static void invalidate_partition(struct gendisk *disk, int partno)
bdput(bdev); bdput(bdev);
} }
/**
* del_gendisk - remove the gendisk
* @disk: the struct gendisk to remove
*
* Removes the gendisk and all its associated resources. This deletes the
* partitions associated with the gendisk, and unregisters the associated
* request_queue.
*
* This is the counter to the respective __device_add_disk() call.
*
* The final removal of the struct gendisk happens when its refcount reaches 0
* with put_disk(), which should be called after del_gendisk(), if
* __device_add_disk() was used.
*/
void del_gendisk(struct gendisk *disk) void del_gendisk(struct gendisk *disk)
{ {
struct disk_part_iter piter; struct disk_part_iter piter;
...@@ -1514,6 +1528,23 @@ int disk_expand_part_tbl(struct gendisk *disk, int partno) ...@@ -1514,6 +1528,23 @@ int disk_expand_part_tbl(struct gendisk *disk, int partno)
return 0; return 0;
} }
/**
* disk_release - releases all allocated resources of the gendisk
* @dev: the device representing this disk
*
* This function releases all allocated resources of the gendisk.
*
* The struct gendisk refcount is incremented with get_gendisk() or
* get_disk_and_module(), and its refcount is decremented with
* put_disk_and_module() or put_disk(). Once the refcount reaches 0 this
* function is called.
*
* Drivers which used __device_add_disk() have a gendisk with a request_queue
* assigned. Since the request_queue sits on top of the gendisk for these
* drivers we also call blk_put_queue() for them, and we expect the
* request_queue refcount to reach 0 at this point, and so the request_queue
* will also be freed prior to the disk.
*/
static void disk_release(struct device *dev) static void disk_release(struct device *dev)
{ {
struct gendisk *disk = dev_to_disk(dev); struct gendisk *disk = dev_to_disk(dev);
...@@ -1727,6 +1758,13 @@ struct gendisk *__alloc_disk_node(int minors, int node_id) ...@@ -1727,6 +1758,13 @@ struct gendisk *__alloc_disk_node(int minors, int node_id)
} }
EXPORT_SYMBOL(__alloc_disk_node); EXPORT_SYMBOL(__alloc_disk_node);
/**
* get_disk_and_module - increments the gendisk and gendisk fops module refcount
* @disk: the struct gendisk to to increment the refcount for
*
* This increments the refcount for the struct gendisk, and the gendisk's
* fops module owner.
*/
struct kobject *get_disk_and_module(struct gendisk *disk) struct kobject *get_disk_and_module(struct gendisk *disk)
{ {
struct module *owner; struct module *owner;
...@@ -1747,6 +1785,13 @@ struct kobject *get_disk_and_module(struct gendisk *disk) ...@@ -1747,6 +1785,13 @@ struct kobject *get_disk_and_module(struct gendisk *disk)
} }
EXPORT_SYMBOL(get_disk_and_module); EXPORT_SYMBOL(get_disk_and_module);
/**
* put_disk - decrements the gendisk refcount
* @disk: the struct gendisk to to decrement the refcount for
*
* This decrements the refcount for the struct gendisk. When this reaches 0
* we'll have disk_release() called.
*/
void put_disk(struct gendisk *disk) void put_disk(struct gendisk *disk)
{ {
if (disk) if (disk)
...@@ -1754,7 +1799,10 @@ void put_disk(struct gendisk *disk) ...@@ -1754,7 +1799,10 @@ void put_disk(struct gendisk *disk)
} }
EXPORT_SYMBOL(put_disk); EXPORT_SYMBOL(put_disk);
/* /**
* put_disk_and_module - decrements the module and gendisk refcount
* @disk: the struct gendisk to to decrement the refcount for
*
* This is a counterpart of get_disk_and_module() and thus also of * This is a counterpart of get_disk_and_module() and thus also of
* get_gendisk(). * get_gendisk().
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment