Skip to content

Commit 7135a71

Browse files
ecashinJens Axboe
authored andcommitted
aoe: allocate unused request_queue for sysfs
Andy Whitcroft reported an oops in aoe triggered by use of an incorrectly initialised request_queue object: [ 2645.959090] kobject '<NULL>' (ffff880059ca22c0): tried to add an uninitialized object, something is seriously wrong. [ 2645.959104] Pid: 6, comm: events/0 Not tainted 2.6.31-5-generic #24-Ubuntu [ 2645.959107] Call Trace: [ 2645.959139] [<ffffffff8126ca2f>] kobject_add+0x5f/0x70 [ 2645.959151] [<ffffffff8125b4ab>] blk_register_queue+0x8b/0xf0 [ 2645.959155] [<ffffffff8126043f>] add_disk+0x8f/0x160 [ 2645.959161] [<ffffffffa01673c4>] aoeblk_gdalloc+0x164/0x1c0 [aoe] The request queue of an aoe device is not used but can be allocated in code that does not sleep. Bruno bisected this regression down to cd43e26 block: Expose stacked device queues in sysfs "This seems to generate /sys/block/$device/queue and its contents for everyone who is using queues, not just for those queues that have a non-NULL queue->request_fn." Addresses http://bugs.launchpad.net/bugs/410198 Addresses http://bugzilla.kernel.org/show_bug.cgi?id=13942 Note that embedding a queue inside another object has always been an illegal construct, since the queues are reference counted and must persist until the last reference is dropped. So aoe was always buggy in this respect (Jens). Signed-off-by: Ed Cashin <[email protected]> Cc: Andy Whitcroft <[email protected]> Cc: "Rafael J. Wysocki" <[email protected]> Cc: Bruno Premont <[email protected]> Cc: Martin K. Petersen <[email protected]> Cc: Andrew Morton <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent e6890f6 commit 7135a71

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

drivers/block/aoe/aoe.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ struct aoedev {
155155
u16 fw_ver; /* version of blade's firmware */
156156
struct work_struct work;/* disk create work struct */
157157
struct gendisk *gd;
158-
struct request_queue blkq;
158+
struct request_queue *blkq;
159159
struct hd_geometry geo;
160160
sector_t ssize;
161161
struct timer_list timer;

drivers/block/aoe/aoeblk.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,12 @@ aoeblk_gdalloc(void *vp)
264264
goto err_disk;
265265
}
266266

267-
blk_queue_make_request(&d->blkq, aoeblk_make_request);
268-
if (bdi_init(&d->blkq.backing_dev_info))
267+
d->blkq = blk_alloc_queue(GFP_KERNEL);
268+
if (!d->blkq)
269269
goto err_mempool;
270+
blk_queue_make_request(d->blkq, aoeblk_make_request);
271+
if (bdi_init(&d->blkq->backing_dev_info))
272+
goto err_blkq;
270273
spin_lock_irqsave(&d->lock, flags);
271274
gd->major = AOE_MAJOR;
272275
gd->first_minor = d->sysminor * AOE_PARTITIONS;
@@ -276,7 +279,7 @@ aoeblk_gdalloc(void *vp)
276279
snprintf(gd->disk_name, sizeof gd->disk_name, "etherd/e%ld.%d",
277280
d->aoemajor, d->aoeminor);
278281

279-
gd->queue = &d->blkq;
282+
gd->queue = d->blkq;
280283
d->gd = gd;
281284
d->flags &= ~DEVFL_GDALLOC;
282285
d->flags |= DEVFL_UP;
@@ -287,6 +290,9 @@ aoeblk_gdalloc(void *vp)
287290
aoedisk_add_sysfs(d);
288291
return;
289292

293+
err_blkq:
294+
blk_cleanup_queue(d->blkq);
295+
d->blkq = NULL;
290296
err_mempool:
291297
mempool_destroy(d->bufpool);
292298
err_disk:

drivers/block/aoe/aoedev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ aoedev_freedev(struct aoedev *d)
113113
if (d->bufpool)
114114
mempool_destroy(d->bufpool);
115115
skbpoolfree(d);
116+
blk_cleanup_queue(d->blkq);
116117
kfree(d);
117118
}
118119

0 commit comments

Comments
 (0)