diff options
author | Jens Axboe <axboe@kernel.dk> | 2012-10-29 19:20:25 +0100 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2012-10-29 19:20:25 +0100 |
commit | a13c29ddf73d3be4fbb2b1bbced64014986cd87a (patch) | |
tree | a3ffe7a255a31d87e4fa6036b0f903ee05efa306 | |
parent | 34a73dd594699dc3834167297a74c43948bb6e41 (diff) | |
parent | 4a1996b54f41973520dea7d4b75e41cc241e4930 (diff) |
Merge branch 'for-jens' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/linux-block into for-3.7/driversfor-3.7/drivers
-rw-r--r-- | block/genhd.c | 6 | ||||
-rw-r--r-- | drivers/block/floppy.c | 13 |
2 files changed, 16 insertions, 3 deletions
diff --git a/block/genhd.c b/block/genhd.c index 633751dbb9a9..d839723303c8 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -587,6 +587,8 @@ void add_disk(struct gendisk *disk) WARN_ON(disk->minors && !(disk->major || disk->first_minor)); WARN_ON(!disk->minors && !(disk->flags & GENHD_FL_EXT_DEVT)); + disk->flags |= GENHD_FL_UP; + retval = blk_alloc_devt(&disk->part0, &devt); if (retval) { WARN_ON(1); @@ -594,8 +596,6 @@ void add_disk(struct gendisk *disk) } disk_to_dev(disk)->devt = devt; - disk->flags |= GENHD_FL_UP; - /* ->major and ->first_minor aren't supposed to be * dereferenced from here on, but set them just in case. */ @@ -1105,7 +1105,7 @@ static void disk_release(struct device *dev) disk_replace_part_tbl(disk, NULL); free_part_stats(&disk->part0); free_part_info(&disk->part0); - if (disk->queue && disk->flags & GENHD_FL_UP) + if (disk->queue) blk_put_queue(disk->queue); kfree(disk); } diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 95e528799737..9d900e6aba55 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -4337,6 +4337,11 @@ out_put_disk: if (disks[drive]->queue) { del_timer_sync(&motor_off_timer[drive]); blk_cleanup_queue(disks[drive]->queue); + /* + * put_disk() is not paired with add_disk() and + * will put queue reference one extra time. fix it. + */ + disks[drive]->queue = NULL; } put_disk(disks[drive]); } @@ -4565,6 +4570,14 @@ static void __exit floppy_module_exit(void) } blk_cleanup_queue(disks[drive]->queue); + /* + * These disks have not called add_disk(). Don't put down + * queue reference in put_disk(). + */ + if (!(allowed_drive_mask & (1 << drive)) || + fdc_state[FDC(drive)].version == FDC_NONE) + disks[drive]->queue = NULL; + put_disk(disks[drive]); } |