Re: [PATCH] rbd: dynamically allocate pool name

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Josh Durgin <josh.durgin@xxxxxxxxxxx>

On 07/12/2012 10:05 AM, Alex Elder wrote:
There is no need to impose a small limit the length of the pool name
recorded for an rbd image in a struct rbd_device.  Remove the
limitation by allocating space for the pool name ynamically.

Signed-off-by: Alex Elder<elder@xxxxxxxxxxx>
---
  drivers/block/rbd.c |   27 +++++++++++++++++++--------
  1 file changed, 19 insertions(+), 8 deletions(-)

Index: b/drivers/block/rbd.c
===================================================================
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -56,7 +56,6 @@
  #define RBD_MINORS_PER_MAJOR	256		/* max minors per blkdev */

  #define RBD_MAX_MD_NAME_LEN	(RBD_MAX_OBJ_NAME_LEN + sizeof(RBD_SUFFIX))
-#define RBD_MAX_POOL_NAME_LEN	64
  #define RBD_MAX_SNAP_NAME_LEN	32
  #define RBD_MAX_OPT_LEN		1024

@@ -166,7 +165,7 @@ struct rbd_device {
  	char			obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */
  	int			obj_len;
  	char			obj_md_name[RBD_MAX_MD_NAME_LEN]; /* hdr nm. */
-	char			pool_name[RBD_MAX_POOL_NAME_LEN];
+	char			*pool_name;
  	int			pool_id;

  	struct ceph_osd_event   *watch_event;
@@ -2331,6 +2330,8 @@ static inline char *dup_token(const char
   * rbd_dev, rbd_md_name, and name fields of the given rbd_dev, based
   * on the list of monitor addresses and other options provided via
   * /sys/bus/rbd/add.
+ *
+ * Note: rbd_dev is assumed to have been initially zero-filled.
   */
  static int rbd_add_parse_args(struct rbd_device *rbd_dev,
  			      const char *buf,
@@ -2339,7 +2340,8 @@ static int rbd_add_parse_args(struct rbd
  			      char *options,
  			      size_t options_size)
  {
-	size_t	len;
+	size_t len;
+	int ret;

  	/* The first four tokens are required */

@@ -2355,13 +2357,14 @@ static int rbd_add_parse_args(struct rbd
  	if (!len || len>= options_size)
  		return -EINVAL;

-	len = copy_token(&buf, rbd_dev->pool_name, sizeof (rbd_dev->pool_name));
-	if (!len || len>= sizeof (rbd_dev->pool_name))
-		return -EINVAL;
+	rbd_dev->pool_name = dup_token(&buf, NULL);
+	if (!rbd_dev->pool_name)
+		return -ENOMEM;

+	ret = -EINVAL;
  	len = copy_token(&buf, rbd_dev->obj, sizeof (rbd_dev->obj));
  	if (!len || len>= sizeof (rbd_dev->obj))
-		return -EINVAL;
+		goto out_err;

  	/* We have the object length in hand, save it. */

@@ -2380,9 +2383,15 @@ static int rbd_add_parse_args(struct rbd
  		memcpy(rbd_dev->snap_name, RBD_SNAP_HEAD_NAME,
  			sizeof (RBD_SNAP_HEAD_NAME));
  	else if (len>= sizeof (rbd_dev->snap_name))
-		return -EINVAL;
+		goto out_err;

  	return 0;
+
+out_err:
+	kfree(rbd_dev->pool_name);
+	rbd_dev->pool_name = NULL;
+
+	return ret;
  }

  static ssize_t rbd_add(struct bus_type *bus,
@@ -2480,6 +2489,7 @@ err_out_blkdev:
  err_out_client:
  	rbd_put_client(rbd_dev);
  err_put_id:
+	kfree(rbd_dev->pool_name);
  	rbd_id_put(rbd_dev);
  err_nomem:
  	kfree(options);
@@ -2528,6 +2538,7 @@ static void rbd_dev_release(struct devic
  	unregister_blkdev(rbd_dev->major, rbd_dev->name);

  	/* done with the id, and with the rbd_dev */
+	kfree(rbd_dev->pool_name);
  	rbd_id_put(rbd_dev);
  	kfree(rbd_dev);

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux