summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2012-10-29 19:20:25 +0100
committerJens Axboe <axboe@kernel.dk>2012-10-29 19:20:25 +0100
commita13c29ddf73d3be4fbb2b1bbced64014986cd87a (patch)
treea3ffe7a255a31d87e4fa6036b0f903ee05efa306
parent34a73dd594699dc3834167297a74c43948bb6e41 (diff)
parent4a1996b54f41973520dea7d4b75e41cc241e4930 (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.c6
-rw-r--r--drivers/block/floppy.c13
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]);
}