scsi: remove unused kobj map for sd devie to avoid memleak
ANBZ: #11194 commit ecb923f0920eac832435d5e39b880c858d04c271 openeuler 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: Yufen Yu <yuyufen@huawei.com> Reviewed-by: Jason Yan <yanaijie@huawei.com> Signed-off-by: Chen Jun <chenjun102@huawei.com> Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com> Signed-off-by: Slim6882 <yangjunshuo@huawei.com> Signed-off-by: Min Li <gumi@linux.alibaba.com> Reviewed-by: Guixin Liu <kanie@linux.alibaba.com> Acked-by: Joseph Qi <joseph.qi@linux.alibaba.com> Reviewed-by: Xunlei Pang <xlpang@linux.alibaba.com> Link: https://gitee.com/anolis/cloud-kernel/pulls/4229
This commit is contained in:
parent
72f072d9d5
commit
86657657fa
|
@ -664,6 +664,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;
|
||||
|
|
|
@ -3490,6 +3490,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);
|
||||
|
||||
|
|
|
@ -364,6 +364,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 *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue