diff options
| author | Luis Chamberlain <mcgrof@kernel.org> | 2021-07-13 22:54:00 +0000 |
|---|---|---|
| committer | Luis Chamberlain <mcgrof@kernel.org> | 2021-08-17 00:04:22 -0700 |
| commit | 2d5d6d569c2bf06dc7b75a3557ec315435f3d78e (patch) | |
| tree | 8876175b269e891f68e0f38d223805b50e32819e | |
| parent | e9bb0d530a8737d642298487170761c4f62c02e6 (diff) | |
| download | linux-2d5d6d569c2bf06dc7b75a3557ec315435f3d78e.tar.gz | |
block/swim: add a helper to remove disks
This will be used later. This also adds a registration bool so we
can keep track of which drives are registered and also changes the
oder on cleanup from:
blk_cleanup_queue(...);
blk_mq_free_tag_set(...);
put_disk(...);
to the following shorter form:
blk_cleanup_disk(fs->disk);
blk_mq_free_tag_set(&fs->tag_set);
This will allow us to re-use this helper later, but to do that
we must ensure the disk was allocated as wel.
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
| -rw-r--r-- | drivers/block/swim.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/drivers/block/swim.c b/drivers/block/swim.c index 7ccc8d2a41bc6..f4c6588e2749a 100644 --- a/drivers/block/swim.c +++ b/drivers/block/swim.c @@ -184,6 +184,7 @@ struct floppy_state { int track; int ref_count; + bool registered; struct gendisk *disk; struct blk_mq_tag_set tag_set; @@ -771,6 +772,25 @@ static const struct blk_mq_ops swim_mq_ops = { .queue_rq = swim_queue_rq, }; +static void swim_del_disks(void) +{ + int drive; + struct floppy_state *fs; + + for (drive = 0; drive < swd->floppy_count; drive++) { + fs = swd->unit[drive]; + if (fs->disk) { + if (fw->registered) + del_gendisk(fs->disk); + blk_cleanup_disk(fs->disk); + } + if (fs->tag_set) + blk_mq_free_tag_set(&fs->tag_set); + } + + unregister_blkdev(FLOPPY_MAJOR, "fd"); +} + static int swim_floppy_init(struct swim_priv *swd) { int err; @@ -828,6 +848,7 @@ static int swim_floppy_init(struct swim_priv *swd) swd->unit[drive].disk->private_data = &swd->unit[drive]; set_capacity(swd->unit[drive].disk, 2880); add_disk(swd->unit[drive].disk); + swd->unit[drive].registered true; } return 0; @@ -909,14 +930,7 @@ static int swim_remove(struct platform_device *dev) int drive; struct resource *res; - for (drive = 0; drive < swd->floppy_count; drive++) { - del_gendisk(swd->unit[drive].disk); - blk_cleanup_queue(swd->unit[drive].disk->queue); - blk_mq_free_tag_set(&swd->unit[drive].tag_set); - put_disk(swd->unit[drive].disk); - } - - unregister_blkdev(FLOPPY_MAJOR, "fd"); + swim_del_disks(); /* eject floppies */ |
