Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christoph Hellwig and committed by
Jens Axboe
e2efa079 76792055

+15 -50
+15 -49
drivers/memstick/core/ms_block.c
··· 1943 1943 static DEFINE_IDR(msb_disk_idr); /*set of used disk numbers */ 1944 1944 static DEFINE_MUTEX(msb_disk_lock); /* protects against races in open/release */ 1945 1945 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 - 1962 1946 static void msb_data_clear(struct msb_data *msb) 1963 1947 { 1964 1948 kfree(msb->boot_page); ··· 1952 1968 msb->card = NULL; 1953 1969 } 1954 1970 1955 - static int msb_disk_release(struct gendisk *disk) 1956 - { 1957 - struct msb_data *msb = disk->private_data; 1958 - 1959 - dbg_verbose("block device release"); 1960 - mutex_lock(&msb_disk_lock); 1961 - 1962 - if (msb) { 1963 - if (msb->usage_count) 1964 - msb->usage_count--; 1965 - 1966 - if (!msb->usage_count) { 1967 - disk->private_data = NULL; 1968 - idr_remove(&msb_disk_idr, msb->disk_id); 1969 - put_disk(disk); 1970 - kfree(msb); 1971 - } 1972 - } 1973 - mutex_unlock(&msb_disk_lock); 1974 - return 0; 1975 - } 1976 - 1977 - static void msb_bd_release(struct gendisk *disk, fmode_t mode) 1978 - { 1979 - msb_disk_release(disk); 1980 - } 1981 - 1982 1971 static int msb_bd_getgeo(struct block_device *bdev, 1983 1972 struct hd_geometry *geo) 1984 1973 { 1985 1974 struct msb_data *msb = bdev->bd_disk->private_data; 1986 1975 *geo = msb->geometry; 1987 1976 return 0; 1977 + } 1978 + 1979 + static void msb_bd_free_disk(struct gendisk *disk) 1980 + { 1981 + struct msb_data *msb = disk->private_data; 1982 + 1983 + mutex_lock(&msb_disk_lock); 1984 + idr_remove(&msb_disk_idr, msb->disk_id); 1985 + mutex_unlock(&msb_disk_lock); 1986 + 1987 + kfree(msb); 1988 1988 } 1989 1989 1990 1990 static blk_status_t msb_queue_rq(struct blk_mq_hw_ctx *hctx, ··· 2064 2096 } 2065 2097 2066 2098 static const struct block_device_operations msb_bdops = { 2067 - .open = msb_bd_open, 2068 - .release = msb_bd_release, 2069 - .getgeo = msb_bd_getgeo, 2070 - .owner = THIS_MODULE 2099 + .owner = THIS_MODULE, 2100 + .getgeo = msb_bd_getgeo, 2101 + .free_disk = msb_bd_free_disk, 2071 2102 }; 2072 2103 2073 2104 static const struct blk_mq_ops msb_mq_ops = { ··· 2114 2147 set_capacity(msb->disk, capacity); 2115 2148 dbg("Set total disk size to %lu sectors", capacity); 2116 2149 2117 - msb->usage_count = 1; 2118 2150 msb->io_queue = alloc_ordered_workqueue("ms_block", WQ_MEM_RECLAIM); 2119 2151 INIT_WORK(&msb->io_work, msb_io_work); 2120 2152 sg_init_table(msb->prealloc_sg, MS_BLOCK_MAX_SEGS+1); ··· 2195 2229 msb_data_clear(msb); 2196 2230 mutex_unlock(&msb_disk_lock); 2197 2231 2198 - msb_disk_release(msb->disk); 2232 + put_disk(msb->disk); 2199 2233 memstick_set_drvdata(card, NULL); 2200 2234 } 2201 2235
-1
drivers/memstick/core/ms_block.h
··· 143 143 } __packed; 144 144 145 145 struct msb_data { 146 - unsigned int usage_count; 147 146 struct memstick_dev *card; 148 147 struct gendisk *disk; 149 148 struct request_queue *queue;