Skip to content

Commit 61a35cf

Browse files
Christoph Hellwigaxboe
authored andcommitted
block: hold a request_queue reference for the lifetime of struct gendisk
Acquire the queue ref dropped in disk_release in __blk_alloc_disk so any allocate gendisk always has a queue reference. Signed-off-by: Christoph Hellwig <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 4a1fa41 commit 61a35cf

File tree

2 files changed

+7
-13
lines changed

2 files changed

+7
-13
lines changed

block/genhd.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -551,15 +551,6 @@ void device_add_disk(struct device *parent, struct gendisk *disk,
551551
register_disk(parent, disk, groups);
552552
blk_register_queue(disk);
553553

554-
/*
555-
* Take an extra ref on queue which will be put on disk_release()
556-
* so that it sticks around as long as @disk is there.
557-
*/
558-
if (blk_get_queue(disk->queue))
559-
set_bit(GD_QUEUE_REF, &disk->state);
560-
else
561-
WARN_ON_ONCE(1);
562-
563554
disk_add_events(disk);
564555
blk_integrity_add(disk);
565556
}
@@ -1087,8 +1078,7 @@ static void disk_release(struct device *dev)
10871078
disk_release_events(disk);
10881079
kfree(disk->random);
10891080
xa_destroy(&disk->part_tbl);
1090-
if (test_bit(GD_QUEUE_REF, &disk->state) && disk->queue)
1091-
blk_put_queue(disk->queue);
1081+
blk_put_queue(disk->queue);
10921082
iput(disk->part0->bd_inode); /* frees the disk */
10931083
}
10941084

@@ -1259,9 +1249,12 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
12591249
{
12601250
struct gendisk *disk;
12611251

1252+
if (!blk_get_queue(q))
1253+
return NULL;
1254+
12621255
disk = kzalloc_node(sizeof(struct gendisk), GFP_KERNEL, node_id);
12631256
if (!disk)
1264-
return NULL;
1257+
goto out_put_queue;
12651258

12661259
disk->bdi = bdi_alloc(node_id);
12671260
if (!disk->bdi)
@@ -1296,6 +1289,8 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
12961289
bdi_put(disk->bdi);
12971290
out_free_disk:
12981291
kfree(disk);
1292+
out_put_queue:
1293+
blk_put_queue(q);
12991294
return NULL;
13001295
}
13011296
EXPORT_SYMBOL(__alloc_disk_node);

include/linux/genhd.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ struct gendisk {
149149
unsigned long state;
150150
#define GD_NEED_PART_SCAN 0
151151
#define GD_READ_ONLY 1
152-
#define GD_QUEUE_REF 2
153152

154153
struct mutex open_mutex; /* open/close mutex */
155154
unsigned open_partitions; /* number of open partitions */

0 commit comments

Comments
 (0)