aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis Chamberlain <mcgrof@kernel.org>2021-07-13 22:54:00 +0000
committerLuis Chamberlain <mcgrof@kernel.org>2021-07-14 20:57:36 -0700
commit7c4874d9d55df4c25a06b1c9004b1a29429a8f6b (patch)
tree4a3af75c66a2b85617eaaaf62d543e175bb559ea
parentb3327dca82fd283decf84f86967e601883a0efc5 (diff)
downloadlinux-next-7c4874d9d55df4c25a06b1c9004b1a29429a8f6b.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.c30
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 */