]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
block/rnbd-clt: Dynamically alloc buffer for pathname & blk_symlink_name
authorMd Haris Iqbal <haris.iqbal@cloud.ionos.com>
Thu, 26 Nov 2020 10:47:23 +0000 (11:47 +0100)
committerJens Axboe <axboe@kernel.dk>
Fri, 4 Dec 2020 16:41:10 +0000 (09:41 -0700)
For every rnbd_clt_dev, we alloc the pathname and blk_symlink_name
statically to NAME_MAX which is 255 bytes. In most of the cases we only
need less than 10 bytes, so 500 bytes per block device are wasted.

This commit dynamically allocates memory buffer for pathname and
blk_symlink_name.

Signed-off-by: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@cloud.ionos.com>
Reviewed-by: Lutz Pogrell <lutz.pogrell@cloud.ionos.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rnbd/rnbd-clt-sysfs.c
drivers/block/rnbd/rnbd-clt.c
drivers/block/rnbd/rnbd-clt.h

index e3c3270b0cee9d5ccce254505d28473d242b9995..c3c96a5675680c4796a35916d2ba9c55235cd09b 100644 (file)
@@ -434,6 +434,7 @@ void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev)
         */
        if (strlen(dev->blk_symlink_name) && try_module_get(THIS_MODULE)) {
                sysfs_remove_link(rnbd_devs_kobj, dev->blk_symlink_name);
+               kfree(dev->blk_symlink_name);
                module_put(THIS_MODULE);
        }
 }
@@ -492,10 +493,17 @@ static int rnbd_clt_get_path_name(struct rnbd_clt_dev *dev, char *buf,
 static int rnbd_clt_add_dev_symlink(struct rnbd_clt_dev *dev)
 {
        struct kobject *gd_kobj = &disk_to_dev(dev->gd)->kobj;
-       int ret;
+       int ret, len;
+
+       len = strlen(dev->pathname) + strlen(dev->sess->sessname) + 2;
+       dev->blk_symlink_name = kzalloc(len, GFP_KERNEL);
+       if (!dev->blk_symlink_name) {
+               rnbd_clt_err(dev, "Failed to allocate memory for blk_symlink_name\n");
+               goto out_err;
+       }
 
        ret = rnbd_clt_get_path_name(dev, dev->blk_symlink_name,
-                                     sizeof(dev->blk_symlink_name));
+                                     len);
        if (ret) {
                rnbd_clt_err(dev, "Failed to get /sys/block symlink path, err: %d\n",
                              ret);
index 1bb495e5093153d1887a0f40fe5a936326be7316..34bc6083b58dd30df5b79563b2ef82195224b592 100644 (file)
@@ -59,6 +59,7 @@ static void rnbd_clt_put_dev(struct rnbd_clt_dev *dev)
        ida_simple_remove(&index_ida, dev->clt_device_id);
        mutex_unlock(&ida_lock);
        kfree(dev->hw_queues);
+       kfree(dev->pathname);
        rnbd_clt_put_sess(dev->sess);
        mutex_destroy(&dev->lock);
        kfree(dev);
@@ -1387,10 +1388,17 @@ static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess,
                       pathname, sess->sessname, ret);
                goto out_queues;
        }
+
+       dev->pathname = kzalloc(strlen(pathname) + 1, GFP_KERNEL);
+       if (!dev->pathname) {
+               ret = -ENOMEM;
+               goto out_queues;
+       }
+       strlcpy(dev->pathname, pathname, strlen(pathname) + 1);
+
        dev->clt_device_id      = ret;
        dev->sess               = sess;
        dev->access_mode        = access_mode;
-       strlcpy(dev->pathname, pathname, sizeof(dev->pathname));
        mutex_init(&dev->lock);
        refcount_set(&dev->refcount, 1);
        dev->dev_state = DEV_STATE_INIT;
@@ -1422,8 +1430,8 @@ static bool __exists_dev(const char *pathname, const char *sessname)
                        continue;
                mutex_lock(&sess->lock);
                list_for_each_entry(dev, &sess->devs_list, list) {
-                       if (!strncmp(dev->pathname, pathname,
-                                    sizeof(dev->pathname))) {
+                       if (strlen(dev->pathname) == strlen(pathname) &&
+                           !strcmp(dev->pathname, pathname)) {
                                found = true;
                                break;
                        }
index ed33654aa4868f9aaac45a92f7d819d7c39ae21b..b193d59040503bb8aa9ebcfa369b6b7d91417a9c 100644 (file)
@@ -108,7 +108,7 @@ struct rnbd_clt_dev {
        u32                     clt_device_id;
        struct mutex            lock;
        enum rnbd_clt_dev_state dev_state;
-       char                    pathname[NAME_MAX];
+       char                    *pathname;
        enum rnbd_access_mode   access_mode;
        bool                    read_only;
        bool                    rotational;
@@ -126,7 +126,7 @@ struct rnbd_clt_dev {
        struct list_head        list;
        struct gendisk          *gd;
        struct kobject          kobj;
-       char                    blk_symlink_name[NAME_MAX];
+       char                    *blk_symlink_name;
        refcount_t              refcount;
        struct work_struct      unmap_on_rmmod_work;
 };