Skip to content

Commit

Permalink
rbd: make ceph_parse_options() return a pointer
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Sage Weil <[email protected]>
  • Loading branch information
Alex Elder committed Mar 22, 2012
1 parent 2107978 commit ee57741
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 13 deletions.
6 changes: 4 additions & 2 deletions drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

ret = ceph_parse_options(&opt, options, mon_addr,
opt = ceph_parse_options(options, mon_addr,
mon_addr + strlen(mon_addr),
parse_rbd_opts_token, rbd_opts);
if (ret < 0)
if (IS_ERR(opt)) {
ret = PTR_ERR(opt);
goto done_err;
}

spin_lock(&node_lock);
rbdc = __rbd_client_find(opt);
Expand Down
6 changes: 4 additions & 2 deletions fs/ceph/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,10 +334,12 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
*path += 2;
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);
if (err)
if (IS_ERR(*popt)) {
err = PTR_ERR(*popt);
goto out;
}

/* success */
*pfsopt = fsopt;
Expand Down
2 changes: 1 addition & 1 deletion include/linux/ceph/libceph.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ extern struct kmem_cache *ceph_cap_cachep;
extern struct kmem_cache *ceph_dentry_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,
int (*parse_extra_token)(char *c, void *private),
void *private);
Expand Down
16 changes: 8 additions & 8 deletions net/ceph/ceph_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -277,10 +277,11 @@ static int get_secret(struct ceph_crypto_key *dst, const char *name) {
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;
const char *c;
Expand All @@ -289,7 +290,7 @@ int ceph_parse_options(struct ceph_options **popt, char *options,

opt = kzalloc(sizeof(*opt), GFP_KERNEL);
if (!opt)
return err;
return ERR_PTR(-ENOMEM);
opt->mon_addr = kcalloc(CEPH_MAX_MON, sizeof(*opt->mon_addr),
GFP_KERNEL);
if (!opt->mon_addr)
Expand Down Expand Up @@ -412,12 +413,11 @@ int ceph_parse_options(struct ceph_options **popt, char *options,
}

/* success */
*popt = opt;
return 0;
return opt;

out:
ceph_destroy_options(opt);
return err;
return ERR_PTR(err);
}
EXPORT_SYMBOL(ceph_parse_options);

Expand Down

0 comments on commit ee57741

Please sign in to comment.