diff options
author | Alex Elder <elder@inktank.com> | 2012-10-26 00:34:41 -0400 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2012-10-30 09:34:30 -0400 |
commit | dc79b113d6db48ee6ee7decf0216feee48757f01 (patch) | |
tree | 232927c275a1e30db92396f79cc6753bdb381e7a | |
parent | 4e9afeba7aa9ca925a79d9ce82f1a8e79e14c291 (diff) |
rbd: have rbd_add_parse_args() return error
Change the interface to rbd_add_parse_args() so it returns an
error code rather than a pointer. Return the ceph_options result
via a pointer whose address is passed as an argument.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r-- | drivers/block/rbd.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 338cfadad63f..ab6e6d8364ef 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -2841,30 +2841,31 @@ static inline char *dup_token(const char **buf, size_t *lenp) | |||
2841 | * | 2841 | * |
2842 | * Note: rbd_dev is assumed to have been initially zero-filled. | 2842 | * Note: rbd_dev is assumed to have been initially zero-filled. |
2843 | */ | 2843 | */ |
2844 | static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev, | 2844 | static int rbd_add_parse_args(struct rbd_device *rbd_dev, |
2845 | const char *buf, | 2845 | const char *buf, |
2846 | struct rbd_options **opts) | 2846 | struct ceph_options **ceph_opts, |
2847 | struct rbd_options **opts) | ||
2847 | { | 2848 | { |
2848 | size_t len; | 2849 | size_t len; |
2849 | const char *mon_addrs; | 2850 | const char *mon_addrs; |
2850 | size_t mon_addrs_size; | 2851 | size_t mon_addrs_size; |
2851 | char *options; | 2852 | char *options; |
2852 | struct ceph_options *err_ptr = ERR_PTR(-EINVAL); | ||
2853 | struct ceph_options *ceph_opts; | ||
2854 | struct rbd_options *rbd_opts = NULL; | 2853 | struct rbd_options *rbd_opts = NULL; |
2854 | int ret; | ||
2855 | 2855 | ||
2856 | /* The first four tokens are required */ | 2856 | /* The first four tokens are required */ |
2857 | 2857 | ||
2858 | len = next_token(&buf); | 2858 | len = next_token(&buf); |
2859 | if (!len) | 2859 | if (!len) |
2860 | return err_ptr; /* Missing monitor address(es) */ | 2860 | return -EINVAL; /* Missing monitor address(es) */ |
2861 | mon_addrs = buf; | 2861 | mon_addrs = buf; |
2862 | mon_addrs_size = len + 1; | 2862 | mon_addrs_size = len + 1; |
2863 | buf += len; | 2863 | buf += len; |
2864 | 2864 | ||
2865 | ret = -EINVAL; | ||
2865 | options = dup_token(&buf, NULL); | 2866 | options = dup_token(&buf, NULL); |
2866 | if (!options) | 2867 | if (!options) |
2867 | goto out_mem; | 2868 | return -ENOMEM; |
2868 | if (!*options) | 2869 | if (!*options) |
2869 | goto out_err; /* Missing options */ | 2870 | goto out_err; /* Missing options */ |
2870 | 2871 | ||
@@ -2889,7 +2890,7 @@ static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev, | |||
2889 | buf = RBD_SNAP_HEAD_NAME; /* No snapshot supplied */ | 2890 | buf = RBD_SNAP_HEAD_NAME; /* No snapshot supplied */ |
2890 | len = sizeof (RBD_SNAP_HEAD_NAME) - 1; | 2891 | len = sizeof (RBD_SNAP_HEAD_NAME) - 1; |
2891 | } else if (len > RBD_MAX_SNAP_NAME_LEN) { | 2892 | } else if (len > RBD_MAX_SNAP_NAME_LEN) { |
2892 | err_ptr = ERR_PTR(-ENAMETOOLONG); | 2893 | ret = -ENAMETOOLONG; |
2893 | goto out_err; | 2894 | goto out_err; |
2894 | } | 2895 | } |
2895 | rbd_dev->snap_name = kmalloc(len + 1, GFP_KERNEL); | 2896 | rbd_dev->snap_name = kmalloc(len + 1, GFP_KERNEL); |
@@ -2906,15 +2907,19 @@ static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev, | |||
2906 | 2907 | ||
2907 | rbd_opts->read_only = RBD_READ_ONLY_DEFAULT; | 2908 | rbd_opts->read_only = RBD_READ_ONLY_DEFAULT; |
2908 | 2909 | ||
2909 | ceph_opts = ceph_parse_options(options, mon_addrs, | 2910 | *ceph_opts = ceph_parse_options(options, mon_addrs, |
2910 | mon_addrs + mon_addrs_size - 1, | 2911 | mon_addrs + mon_addrs_size - 1, |
2911 | parse_rbd_opts_token, rbd_opts); | 2912 | parse_rbd_opts_token, rbd_opts); |
2912 | kfree(options); | 2913 | kfree(options); |
2914 | if (IS_ERR(*ceph_opts)) { | ||
2915 | ret = PTR_ERR(*ceph_opts); | ||
2916 | goto out_err; | ||
2917 | } | ||
2913 | *opts = rbd_opts; | 2918 | *opts = rbd_opts; |
2914 | 2919 | ||
2915 | return ceph_opts; | 2920 | return 0; |
2916 | out_mem: | 2921 | out_mem: |
2917 | err_ptr = ERR_PTR(-ENOMEM); | 2922 | ret = -ENOMEM; |
2918 | out_err: | 2923 | out_err: |
2919 | kfree(rbd_dev->image_name); | 2924 | kfree(rbd_dev->image_name); |
2920 | rbd_dev->image_name = NULL; | 2925 | rbd_dev->image_name = NULL; |
@@ -2923,7 +2928,7 @@ out_err: | |||
2923 | rbd_dev->pool_name = NULL; | 2928 | rbd_dev->pool_name = NULL; |
2924 | kfree(options); | 2929 | kfree(options); |
2925 | 2930 | ||
2926 | return err_ptr; | 2931 | return ret; |
2927 | } | 2932 | } |
2928 | 2933 | ||
2929 | /* | 2934 | /* |
@@ -3131,7 +3136,7 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
3131 | size_t count) | 3136 | size_t count) |
3132 | { | 3137 | { |
3133 | struct rbd_device *rbd_dev = NULL; | 3138 | struct rbd_device *rbd_dev = NULL; |
3134 | struct ceph_options *ceph_opts; | 3139 | struct ceph_options *ceph_opts = NULL; |
3135 | struct rbd_options *rbd_opts = NULL; | 3140 | struct rbd_options *rbd_opts = NULL; |
3136 | struct ceph_osd_client *osdc; | 3141 | struct ceph_osd_client *osdc; |
3137 | int rc = -ENOMEM; | 3142 | int rc = -ENOMEM; |
@@ -3150,11 +3155,9 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
3150 | init_rwsem(&rbd_dev->header_rwsem); | 3155 | init_rwsem(&rbd_dev->header_rwsem); |
3151 | 3156 | ||
3152 | /* parse add command */ | 3157 | /* parse add command */ |
3153 | ceph_opts = rbd_add_parse_args(rbd_dev, buf, &rbd_opts); | 3158 | rc = rbd_add_parse_args(rbd_dev, buf, &ceph_opts, &rbd_opts); |
3154 | if (IS_ERR(ceph_opts)) { | 3159 | if (rc < 0) |
3155 | rc = PTR_ERR(ceph_opts); | ||
3156 | goto err_out_mem; | 3160 | goto err_out_mem; |
3157 | } | ||
3158 | rbd_dev->mapping.read_only = rbd_opts->read_only; | 3161 | rbd_dev->mapping.read_only = rbd_opts->read_only; |
3159 | 3162 | ||
3160 | rc = rbd_get_client(rbd_dev, ceph_opts); | 3163 | rc = rbd_get_client(rbd_dev, ceph_opts); |