]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: rnbd: add .release to rnbd_dev_ktype
authorZhu Yanjun <yanjun.zhu@linux.dev>
Fri, 5 Dec 2025 12:47:29 +0000 (13:47 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 Jan 2026 12:28:10 +0000 (05:28 -0700)
Every ktype must provides a .release function that will be called after
the last kobject_put.

Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rnbd/rnbd-clt-sysfs.c
drivers/block/rnbd/rnbd-clt.c

index 6ea7c12e3a871304a4fb1ce03405d33d67072930..144aea1466a4d33e79059dfa9da0401fd7b287ac 100644 (file)
@@ -475,9 +475,17 @@ void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev)
        }
 }
 
+static void rnbd_dev_release(struct kobject *kobj)
+{
+       struct rnbd_clt_dev *dev = container_of(kobj, struct rnbd_clt_dev, kobj);
+
+       kfree(dev);
+}
+
 static const struct kobj_type rnbd_dev_ktype = {
        .sysfs_ops      = &kobj_sysfs_ops,
        .default_groups = rnbd_dev_groups,
+       .release        = rnbd_dev_release,
 };
 
 static int rnbd_clt_add_dev_kobj(struct rnbd_clt_dev *dev)
index d1c354636315d2e4e75340dcd226a11000ba26c6..094ecc174f416460e36c770fca7f83f2eae44ed7 100644 (file)
@@ -60,7 +60,9 @@ static void rnbd_clt_put_dev(struct rnbd_clt_dev *dev)
        kfree(dev->pathname);
        rnbd_clt_put_sess(dev->sess);
        mutex_destroy(&dev->lock);
-       kfree(dev);
+
+       if (dev->kobj.state_initialized)
+               kobject_put(&dev->kobj);
 }
 
 static inline bool rnbd_clt_get_dev(struct rnbd_clt_dev *dev)
@@ -1517,7 +1519,7 @@ static bool insert_dev_if_not_exists_devpath(struct rnbd_clt_dev *dev)
        return found;
 }
 
-static void delete_dev(struct rnbd_clt_dev *dev)
+static void rnbd_delete_dev(struct rnbd_clt_dev *dev)
 {
        struct rnbd_clt_session *sess = dev->sess;
 
@@ -1638,7 +1640,7 @@ put_iu:
        kfree(rsp);
        rnbd_put_iu(sess, iu);
 del_dev:
-       delete_dev(dev);
+       rnbd_delete_dev(dev);
 put_dev:
        rnbd_clt_put_dev(dev);
 put_sess:
@@ -1647,13 +1649,13 @@ put_sess:
        return ERR_PTR(ret);
 }
 
-static void destroy_gen_disk(struct rnbd_clt_dev *dev)
+static void rnbd_destroy_gen_disk(struct rnbd_clt_dev *dev)
 {
        del_gendisk(dev->gd);
        put_disk(dev->gd);
 }
 
-static void destroy_sysfs(struct rnbd_clt_dev *dev,
+static void rnbd_destroy_sysfs(struct rnbd_clt_dev *dev,
                          const struct attribute *sysfs_self)
 {
        rnbd_clt_remove_dev_symlink(dev);
@@ -1691,9 +1693,9 @@ int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force,
        dev->dev_state = DEV_STATE_UNMAPPED;
        mutex_unlock(&dev->lock);
 
-       delete_dev(dev);
-       destroy_sysfs(dev, sysfs_self);
-       destroy_gen_disk(dev);
+       rnbd_delete_dev(dev);
+       rnbd_destroy_sysfs(dev, sysfs_self);
+       rnbd_destroy_gen_disk(dev);
        if (was_mapped && sess->rtrs)
                send_msg_close(dev, dev->device_id, RTRS_PERMIT_WAIT);