Skip to content

Commit 185ed42

Browse files
Christoph Hellwigaxboe
authored andcommitted
memstick/mspro_block: simplify refcounting
Implement the ->free_disk method to free the msb_data structure only once the last gendisk reference goes away instead of keeping a local refcount. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20220215094514.3828912-5-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 6dab421 commit 185ed42

1 file changed

Lines changed: 7 additions & 42 deletions

File tree

drivers/memstick/core/mspro_block.c

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ struct mspro_devinfo {
133133

134134
struct mspro_block_data {
135135
struct memstick_dev *card;
136-
unsigned int usage_count;
137136
unsigned int caps;
138137
struct gendisk *disk;
139138
struct request_queue *queue;
@@ -178,48 +177,16 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error);
178177

179178
/*** Block device ***/
180179

181-
static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode)
182-
{
183-
struct gendisk *disk = bdev->bd_disk;
184-
struct mspro_block_data *msb = disk->private_data;
185-
int rc = -ENXIO;
186-
187-
mutex_lock(&mspro_block_disk_lock);
188-
189-
if (msb && msb->card)
190-
msb->usage_count++;
191-
192-
mutex_unlock(&mspro_block_disk_lock);
193-
194-
return rc;
195-
}
196-
197-
198-
static void mspro_block_disk_release(struct gendisk *disk)
180+
static void mspro_block_bd_free_disk(struct gendisk *disk)
199181
{
200182
struct mspro_block_data *msb = disk->private_data;
201183
int disk_id = MINOR(disk_devt(disk)) >> MSPRO_BLOCK_PART_SHIFT;
202184

203185
mutex_lock(&mspro_block_disk_lock);
204-
205-
if (msb) {
206-
if (msb->usage_count)
207-
msb->usage_count--;
208-
209-
if (!msb->usage_count) {
210-
kfree(msb);
211-
disk->private_data = NULL;
212-
idr_remove(&mspro_block_disk_idr, disk_id);
213-
put_disk(disk);
214-
}
215-
}
216-
186+
idr_remove(&mspro_block_disk_idr, disk_id);
217187
mutex_unlock(&mspro_block_disk_lock);
218-
}
219188

220-
static void mspro_block_bd_release(struct gendisk *disk, fmode_t mode)
221-
{
222-
mspro_block_disk_release(disk);
189+
kfree(msb);
223190
}
224191

225192
static int mspro_block_bd_getgeo(struct block_device *bdev,
@@ -235,10 +202,9 @@ static int mspro_block_bd_getgeo(struct block_device *bdev,
235202
}
236203

237204
static const struct block_device_operations ms_block_bdops = {
238-
.open = mspro_block_bd_open,
239-
.release = mspro_block_bd_release,
240-
.getgeo = mspro_block_bd_getgeo,
241-
.owner = THIS_MODULE
205+
.owner = THIS_MODULE,
206+
.getgeo = mspro_block_bd_getgeo,
207+
.free_disk = mspro_block_bd_free_disk,
242208
};
243209

244210
/*** Information ***/
@@ -1221,7 +1187,6 @@ static int mspro_block_init_disk(struct memstick_dev *card)
12211187
msb->disk->first_minor = disk_id << MSPRO_BLOCK_PART_SHIFT;
12221188
msb->disk->minors = 1 << MSPRO_BLOCK_PART_SHIFT;
12231189
msb->disk->fops = &ms_block_bdops;
1224-
msb->usage_count = 1;
12251190
msb->disk->private_data = msb;
12261191

12271192
sprintf(msb->disk->disk_name, "mspblk%d", disk_id);
@@ -1339,7 +1304,7 @@ static void mspro_block_remove(struct memstick_dev *card)
13391304
mspro_block_data_clear(msb);
13401305
mutex_unlock(&mspro_block_disk_lock);
13411306

1342-
mspro_block_disk_release(msb->disk);
1307+
put_disk(msb->disk);
13431308
memstick_set_drvdata(card, NULL);
13441309
}
13451310

0 commit comments

Comments
 (0)