提交 ecb923f0 编写于 作者: Y Yufen Yu 提交者: Zheng Zengkai

scsi: remove unused kobj map for sd devie to avoid memleak

hulk inclusion
category: bugfix
bugzilla: 168625
CVE: NA

-------------------------------------------------

After calling add_disk, we have register new kobj map for sd device,
then we can remove old unused kobj map which probed by sd_remove.
Signed-off-by: NYufen Yu <yuyufen@huawei.com>
Reviewed-by: NJason Yan <yanaijie@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 919e759d
......@@ -663,6 +663,14 @@ void blk_unregister_region(dev_t devt, unsigned long range)
EXPORT_SYMBOL(blk_unregister_region);
void blk_delete_region(dev_t devt, unsigned long range,
struct kobject *(*probe)(dev_t, int *, void *))
{
kobj_delete(bdev_map, devt, range, probe);
}
EXPORT_SYMBOL(blk_delete_region);
static struct kobject *exact_match(dev_t devt, int *partno, void *data)
{
struct gendisk *p = data;
......
......@@ -92,6 +92,34 @@ void kobj_unmap(struct kobj_map *domain, dev_t dev, unsigned long range)
kfree(found);
}
void kobj_delete(struct kobj_map *domain, dev_t dev, unsigned long range,
kobj_probe_t *probe)
{
unsigned n = MAJOR(dev + range - 1) - MAJOR(dev) + 1;
unsigned index = MAJOR(dev);
unsigned i;
struct probe *found = NULL;
if (n > 255)
n = 255;
mutex_lock(domain->lock);
for (i = 0; i < n; i++, index++) {
struct probe **s;
for (s = &domain->probes[index % 255]; *s; s = &(*s)->next) {
struct probe *p = *s;
if (p->dev == dev && p->range == range && p->get == probe) {
*s = p->next;
if (!found)
found = p;
break;
}
}
}
mutex_unlock(domain->lock);
kfree(found);
}
struct kobject *kobj_lookup(struct kobj_map *domain, dev_t dev, int *index)
{
struct kobject *kobj;
......
......@@ -3488,6 +3488,7 @@ static int sd_probe(struct device *dev)
sdp->host->hostt->rpm_autosuspend_delay);
}
device_add_disk(dev, gd, NULL);
blk_delete_region(disk_devt(sdkp->disk), SD_MINORS, sd_default_probe);
if (sdkp->capacity)
sd_dif_config_host(sdkp);
......
......@@ -349,6 +349,8 @@ extern void blk_register_region(dev_t devt, unsigned long range,
int (*lock)(dev_t, void *),
void *data);
extern void blk_unregister_region(dev_t devt, unsigned long range);
extern void blk_delete_region(dev_t devt, unsigned long range,
struct kobject *(*probe)(dev_t, int *, void *));
#define alloc_disk_node(minors, node_id) \
({ \
......
......@@ -14,6 +14,8 @@ struct kobj_map;
int kobj_map(struct kobj_map *, dev_t, unsigned long, struct module *,
kobj_probe_t *, int (*)(dev_t, void *), void *);
void kobj_unmap(struct kobj_map *, dev_t, unsigned long);
void kobj_delete(struct kobj_map *, dev_t, unsigned long,
kobj_probe_t *);
struct kobject *kobj_lookup(struct kobj_map *, dev_t, int *);
struct kobj_map *kobj_map_init(kobj_probe_t *, struct mutex *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册