Skip to content

Commit e2efa07

Browse files
Christoph Hellwigaxboe
authored andcommitted
memstick/ms_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-3-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 7679205 commit e2efa07

2 files changed

Lines changed: 15 additions & 50 deletions

File tree

drivers/memstick/core/ms_block.c

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,22 +1943,6 @@ static void msb_io_work(struct work_struct *work)
19431943
static DEFINE_IDR(msb_disk_idr); /*set of used disk numbers */
19441944
static DEFINE_MUTEX(msb_disk_lock); /* protects against races in open/release */
19451945

1946-
static int msb_bd_open(struct block_device *bdev, fmode_t mode)
1947-
{
1948-
struct gendisk *disk = bdev->bd_disk;
1949-
struct msb_data *msb = disk->private_data;
1950-
1951-
dbg_verbose("block device open");
1952-
1953-
mutex_lock(&msb_disk_lock);
1954-
1955-
if (msb && msb->card)
1956-
msb->usage_count++;
1957-
1958-
mutex_unlock(&msb_disk_lock);
1959-
return 0;
1960-
}
1961-
19621946
static void msb_data_clear(struct msb_data *msb)
19631947
{
19641948
kfree(msb->boot_page);
@@ -1968,33 +1952,6 @@ static void msb_data_clear(struct msb_data *msb)
19681952
msb->card = NULL;
19691953
}
19701954

1971-
static int msb_disk_release(struct gendisk *disk)
1972-
{
1973-
struct msb_data *msb = disk->private_data;
1974-
1975-
dbg_verbose("block device release");
1976-
mutex_lock(&msb_disk_lock);
1977-
1978-
if (msb) {
1979-
if (msb->usage_count)
1980-
msb->usage_count--;
1981-
1982-
if (!msb->usage_count) {
1983-
disk->private_data = NULL;
1984-
idr_remove(&msb_disk_idr, msb->disk_id);
1985-
put_disk(disk);
1986-
kfree(msb);
1987-
}
1988-
}
1989-
mutex_unlock(&msb_disk_lock);
1990-
return 0;
1991-
}
1992-
1993-
static void msb_bd_release(struct gendisk *disk, fmode_t mode)
1994-
{
1995-
msb_disk_release(disk);
1996-
}
1997-
19981955
static int msb_bd_getgeo(struct block_device *bdev,
19991956
struct hd_geometry *geo)
20001957
{
@@ -2003,6 +1960,17 @@ static int msb_bd_getgeo(struct block_device *bdev,
20031960
return 0;
20041961
}
20051962

1963+
static void msb_bd_free_disk(struct gendisk *disk)
1964+
{
1965+
struct msb_data *msb = disk->private_data;
1966+
1967+
mutex_lock(&msb_disk_lock);
1968+
idr_remove(&msb_disk_idr, msb->disk_id);
1969+
mutex_unlock(&msb_disk_lock);
1970+
1971+
kfree(msb);
1972+
}
1973+
20061974
static blk_status_t msb_queue_rq(struct blk_mq_hw_ctx *hctx,
20071975
const struct blk_mq_queue_data *bd)
20081976
{
@@ -2096,10 +2064,9 @@ static void msb_start(struct memstick_dev *card)
20962064
}
20972065

20982066
static const struct block_device_operations msb_bdops = {
2099-
.open = msb_bd_open,
2100-
.release = msb_bd_release,
2101-
.getgeo = msb_bd_getgeo,
2102-
.owner = THIS_MODULE
2067+
.owner = THIS_MODULE,
2068+
.getgeo = msb_bd_getgeo,
2069+
.free_disk = msb_bd_free_disk,
21032070
};
21042071

21052072
static const struct blk_mq_ops msb_mq_ops = {
@@ -2147,7 +2114,6 @@ static int msb_init_disk(struct memstick_dev *card)
21472114
set_capacity(msb->disk, capacity);
21482115
dbg("Set total disk size to %lu sectors", capacity);
21492116

2150-
msb->usage_count = 1;
21512117
msb->io_queue = alloc_ordered_workqueue("ms_block", WQ_MEM_RECLAIM);
21522118
INIT_WORK(&msb->io_work, msb_io_work);
21532119
sg_init_table(msb->prealloc_sg, MS_BLOCK_MAX_SEGS+1);
@@ -2229,7 +2195,7 @@ static void msb_remove(struct memstick_dev *card)
22292195
msb_data_clear(msb);
22302196
mutex_unlock(&msb_disk_lock);
22312197

2232-
msb_disk_release(msb->disk);
2198+
put_disk(msb->disk);
22332199
memstick_set_drvdata(card, NULL);
22342200
}
22352201

drivers/memstick/core/ms_block.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ struct ms_boot_page {
143143
} __packed;
144144

145145
struct msb_data {
146-
unsigned int usage_count;
147146
struct memstick_dev *card;
148147
struct gendisk *disk;
149148
struct request_queue *queue;

0 commit comments

Comments
 (0)