Browse Source

rbd: make ceph_parse_options() return a pointer

ceph_parse_options() takes the address of a pointer as an argument
and uses it to return the address of an allocated structure if
successful.  With this interface is not evident at call sites that
the pointer is always initialized.  Change the interface to return
the address instead (or a pointer-coded error code) to make the
validity of the returned pointer obvious.

Signed-off-by: Alex Elder <elder@dreamhost.com>
Signed-off-by: Sage Weil <sage@newdream.net>
Alex Elder 13 years ago
parent
commit
ee57741c52
4 changed files with 17 additions and 13 deletions
  1. 4 2
      drivers/block/rbd.c
  2. 4 2
      fs/ceph/super.c
  3. 1 1
      include/linux/ceph/libceph.h
  4. 8 8
      net/ceph/ceph_common.c

+ 4 - 2
drivers/block/rbd.c

@@ -371,11 +371,13 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
 
 
 	rbd_opts->notify_timeout = RBD_NOTIFY_TIMEOUT_DEFAULT;
 	rbd_opts->notify_timeout = RBD_NOTIFY_TIMEOUT_DEFAULT;
 
 
-	ret = ceph_parse_options(&opt, options, mon_addr,
+	opt = ceph_parse_options(options, mon_addr,
 				mon_addr + strlen(mon_addr),
 				mon_addr + strlen(mon_addr),
 				parse_rbd_opts_token, rbd_opts);
 				parse_rbd_opts_token, rbd_opts);
-	if (ret < 0)
+	if (IS_ERR(opt)) {
+		ret = PTR_ERR(opt);
 		goto done_err;
 		goto done_err;
+	}
 
 
 	spin_lock(&node_lock);
 	spin_lock(&node_lock);
 	rbdc = __rbd_client_find(opt);
 	rbdc = __rbd_client_find(opt);

+ 4 - 2
fs/ceph/super.c

@@ -334,10 +334,12 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
 	*path += 2;
 	*path += 2;
 	dout("server path '%s'\n", *path);
 	dout("server path '%s'\n", *path);
 
 
-	err = ceph_parse_options(popt, options, dev_name, dev_name_end,
+	*popt = ceph_parse_options(options, dev_name, dev_name_end,
 				 parse_fsopt_token, (void *)fsopt);
 				 parse_fsopt_token, (void *)fsopt);
-	if (err)
+	if (IS_ERR(*popt)) {
+		err = PTR_ERR(*popt);
 		goto out;
 		goto out;
+	}
 
 
 	/* success */
 	/* success */
 	*pfsopt = fsopt;
 	*pfsopt = fsopt;

+ 1 - 1
include/linux/ceph/libceph.h

@@ -207,7 +207,7 @@ extern struct kmem_cache *ceph_cap_cachep;
 extern struct kmem_cache *ceph_dentry_cachep;
 extern struct kmem_cache *ceph_dentry_cachep;
 extern struct kmem_cache *ceph_file_cachep;
 extern struct kmem_cache *ceph_file_cachep;
 
 
-extern int ceph_parse_options(struct ceph_options **popt, char *options,
+extern struct ceph_options *ceph_parse_options(char *options,
 			      const char *dev_name, const char *dev_name_end,
 			      const char *dev_name, const char *dev_name_end,
 			      int (*parse_extra_token)(char *c, void *private),
 			      int (*parse_extra_token)(char *c, void *private),
 			      void *private);
 			      void *private);

+ 8 - 8
net/ceph/ceph_common.c

@@ -277,10 +277,11 @@ out:
 	return err;
 	return err;
 }
 }
 
 
-int ceph_parse_options(struct ceph_options **popt, char *options,
-		       const char *dev_name, const char *dev_name_end,
-		       int (*parse_extra_token)(char *c, void *private),
-		       void *private)
+struct ceph_options *
+ceph_parse_options(char *options, const char *dev_name,
+			const char *dev_name_end,
+			int (*parse_extra_token)(char *c, void *private),
+			void *private)
 {
 {
 	struct ceph_options *opt;
 	struct ceph_options *opt;
 	const char *c;
 	const char *c;
@@ -289,7 +290,7 @@ int ceph_parse_options(struct ceph_options **popt, char *options,
 
 
 	opt = kzalloc(sizeof(*opt), GFP_KERNEL);
 	opt = kzalloc(sizeof(*opt), GFP_KERNEL);
 	if (!opt)
 	if (!opt)
-		return err;
+		return ERR_PTR(-ENOMEM);
 	opt->mon_addr = kcalloc(CEPH_MAX_MON, sizeof(*opt->mon_addr),
 	opt->mon_addr = kcalloc(CEPH_MAX_MON, sizeof(*opt->mon_addr),
 				GFP_KERNEL);
 				GFP_KERNEL);
 	if (!opt->mon_addr)
 	if (!opt->mon_addr)
@@ -412,12 +413,11 @@ int ceph_parse_options(struct ceph_options **popt, char *options,
 	}
 	}
 
 
 	/* success */
 	/* success */
-	*popt = opt;
-	return 0;
+	return opt;
 
 
 out:
 out:
 	ceph_destroy_options(opt);
 	ceph_destroy_options(opt);
-	return err;
+	return ERR_PTR(err);
 }
 }
 EXPORT_SYMBOL(ceph_parse_options);
 EXPORT_SYMBOL(ceph_parse_options);