Re: [PATCH] block: rbd: switch to dynamic root device

Johan Hovold
2026-04-27T15:21:55Z

On Fri, Apr 24, 2026 at 06:48:32PM +0000, Viacheslav Dubeyko wrote:
> On Fri, 2026-04-24 at 12:39 +0200, Johan Hovold wrote:
> > Driver core expects devices to be dynamically allocated and will, for
> > example, complain loudly when no release function has been provided.
> >
> > Use root_device_register() to allocate and register the root device
> > instead of open coding using a static device.

> > @@ -5390,7 +5383,7 @@ static struct rbd_device *__rbd_dev_create(struct rbd_spec *spec)
> >
> > rbd_dev->dev.bus = &rbd_bus_type;
> > rbd_dev->dev.type = &rbd_device_type;
> > - rbd_dev->dev.parent = &rbd_root_dev;
> > + rbd_dev->dev.parent = rbd_root_dev;
> > device_initialize(&rbd_dev->dev);
> >
> > return rbd_dev;
> > @@ -7331,15 +7324,13 @@ static int __init rbd_sysfs_init(void)
> > {
> > int ret;
> >
> > - ret = device_register(&rbd_root_dev);
> > - if (ret < 0) {
> > - put_device(&rbd_root_dev);
> > - return ret;
> > - }
> > + rbd_root_dev = root_device_register("rbd");
> > + if (IS_ERR(rbd_root_dev))
> > + return PTR_ERR(rbd_root_dev);
> >
> > ret = bus_register(&rbd_bus_type);
> > if (ret < 0)
> > - device_unregister(&rbd_root_dev);
> > + root_device_unregister(rbd_root_dev);
>
> I think we need to assign NULL here:
>
> rbd_root_dev = NULL;

From what I can tell these devices are only created from the bus sysfs
attribute so this pointer will not be accessed if bus registration
fails and there is no need to clear it (or add a sanity check to
__rbd_dev_create()).

> > return ret;
> > }
> > @@ -7347,7 +7338,7 @@ static int __init rbd_sysfs_init(void)
> > static void __exit rbd_sysfs_cleanup(void)
> > {
> > bus_unregister(&rbd_bus_type);
> > - device_unregister(&rbd_root_dev);
> > + root_device_unregister(rbd_root_dev);
>
> The same issue here:
>
> rbd_root_dev = NULL;

So this is not needed either.

Johan