Message ID | 20240221220141.32316-1-alfredo.carlon@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: add put_device() call when device_add() fails in device_add_disk() | expand |
Hi, 在 2024/02/22 6:01, Alfredo Cruz 写道: > When device_add() fails, put_device() should called for cleanup. > Added this call before the jump to out_free_ext_minor to not > interfere with device_del() on error paths where deivce_add() succeeded > > Signed-off-by: Alfredo Cruz <alfredo.carlon@gmail.com> > --- > block/genhd.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/block/genhd.c b/block/genhd.c > index d74fb5b4ae68..5a231fb075bd 100644 > --- a/block/genhd.c > +++ b/block/genhd.c > @@ -456,8 +456,10 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk, > if (!(disk->flags & GENHD_FL_HIDDEN)) > ddev->devt = MKDEV(disk->major, disk->first_minor); > ret = device_add(ddev); > - if (ret) > + if (ret) { > + put_device(ddev); > goto out_free_ext_minor; > + } This is wrong, gendisk is allocated by caller, and caller is responsible to free the gendisk, as you can see in many callers. Thanks, Kuai > > ret = disk_alloc_events(disk); > if (ret) >
diff --git a/block/genhd.c b/block/genhd.c index d74fb5b4ae68..5a231fb075bd 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -456,8 +456,10 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk, if (!(disk->flags & GENHD_FL_HIDDEN)) ddev->devt = MKDEV(disk->major, disk->first_minor); ret = device_add(ddev); - if (ret) + if (ret) { + put_device(ddev); goto out_free_ext_minor; + } ret = disk_alloc_events(disk); if (ret)
When device_add() fails, put_device() should called for cleanup. Added this call before the jump to out_free_ext_minor to not interfere with device_del() on error paths where deivce_add() succeeded Signed-off-by: Alfredo Cruz <alfredo.carlon@gmail.com> --- block/genhd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)