aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-10-26 00:34:41 -0400
committerAlex Elder <elder@inktank.com>2012-10-30 09:34:29 -0400
commitf28e565a1b15eef62618db4011d9e320089a4214 (patch)
treeed4f44cbbc4736eb2f23d3b8f717a944c56056d2
parente5c35534042f4b5957a32bba651222c91247beba (diff)
rbd: remove options args from rbd_add_parse_args()
They "options" argument to rbd_add_parse_args() (and it's partner options_size) is now only needed within the function, so there's no need to have the caller allocate and pass the options buffer. Just allocate the options buffer within the function using dup_token(). Also distinguish between failures due to failed memory allocation and failing because a required argument was missing. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r--drivers/block/rbd.c58
1 files changed, 29 insertions, 29 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 7bd23139b948..62df67a11321 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2844,54 +2844,58 @@ static inline char *dup_token(const char **buf, size_t *lenp)
2844 */ 2844 */
2845static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev, 2845static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev,
2846 const char *buf, 2846 const char *buf,
2847 char *options,
2848 size_t options_size,
2849 char **snap_name) 2847 char **snap_name)
2850{ 2848{
2851 size_t len; 2849 size_t len;
2852 const char *mon_addrs; 2850 const char *mon_addrs;
2853 size_t mon_addrs_size; 2851 size_t mon_addrs_size;
2852 char *options;
2853 struct ceph_options *err_ptr = ERR_PTR(-EINVAL);
2854 struct rbd_options rbd_opts; 2854 struct rbd_options rbd_opts;
2855 struct ceph_options *ceph_opts; 2855 struct ceph_options *ceph_opts;
2856 struct ceph_options *err_ptr = ERR_PTR(-EINVAL);
2857 2856
2858 /* The first four tokens are required */ 2857 /* The first four tokens are required */
2859 2858
2860 len = next_token(&buf); 2859 len = next_token(&buf);
2861 if (!len) 2860 if (!len)
2862 return err_ptr; 2861 return err_ptr; /* Missing monitor address(es) */
2863 mon_addrs_size = len + 1;
2864 mon_addrs = buf; 2862 mon_addrs = buf;
2865 2863 mon_addrs_size = len + 1;
2866 buf += len; 2864 buf += len;
2867 2865
2868 len = copy_token(&buf, options, options_size); 2866 options = dup_token(&buf, NULL);
2869 if (!len || len >= options_size) 2867 if (!options)
2870 return err_ptr; 2868 goto out_mem;
2869 if (!*options)
2870 goto out_err; /* Missing options */
2871 2871
2872 err_ptr = ERR_PTR(-ENOMEM);
2873 rbd_dev->pool_name = dup_token(&buf, NULL); 2872 rbd_dev->pool_name = dup_token(&buf, NULL);
2874 if (!rbd_dev->pool_name) 2873 if (!rbd_dev->pool_name)
2875 goto out_err; 2874 goto out_mem;
2875 if (!*rbd_dev->pool_name)
2876 goto out_err; /* Missing pool name */
2876 2877
2877 rbd_dev->image_name = dup_token(&buf, &rbd_dev->image_name_len); 2878 rbd_dev->image_name = dup_token(&buf, &rbd_dev->image_name_len);
2878 if (!rbd_dev->image_name) 2879 if (!rbd_dev->image_name)
2879 goto out_err; 2880 goto out_mem;
2880 2881 if (!*rbd_dev->image_name)
2881 /* Snapshot name is optional; default is to use "head" */ 2882 goto out_err; /* Missing image name */
2882 2883
2884 /*
2885 * Snapshot name is optional; default is to use "-"
2886 * (indicating the head/no snapshot).
2887 */
2883 len = next_token(&buf); 2888 len = next_token(&buf);
2884 if (len > RBD_MAX_SNAP_NAME_LEN) {
2885 err_ptr = ERR_PTR(-ENAMETOOLONG);
2886 goto out_err;
2887 }
2888 if (!len) { 2889 if (!len) {
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;
2892 } else if (len > RBD_MAX_SNAP_NAME_LEN) {
2893 err_ptr = ERR_PTR(-ENAMETOOLONG);
2894 goto out_err;
2891 } 2895 }
2892 *snap_name = kmalloc(len + 1, GFP_KERNEL); 2896 *snap_name = kmalloc(len + 1, GFP_KERNEL);
2893 if (!*snap_name) 2897 if (!*snap_name)
2894 goto out_err; 2898 goto out_mem;
2895 memcpy(*snap_name, buf, len); 2899 memcpy(*snap_name, buf, len);
2896 *(*snap_name + len) = '\0'; 2900 *(*snap_name + len) = '\0';
2897 2901
@@ -2902,20 +2906,23 @@ static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev,
2902 ceph_opts = ceph_parse_options(options, mon_addrs, 2906 ceph_opts = ceph_parse_options(options, mon_addrs,
2903 mon_addrs + mon_addrs_size - 1, 2907 mon_addrs + mon_addrs_size - 1,
2904 parse_rbd_opts_token, &rbd_opts); 2908 parse_rbd_opts_token, &rbd_opts);
2909 kfree(options);
2905 2910
2906 /* Record the parsed rbd options */ 2911 /* Record the parsed rbd options */
2907 2912
2908 if (!IS_ERR(ceph_opts)) { 2913 if (!IS_ERR(ceph_opts))
2909 rbd_dev->mapping.read_only = rbd_opts.read_only; 2914 rbd_dev->mapping.read_only = rbd_opts.read_only;
2910 }
2911 2915
2912 return ceph_opts; 2916 return ceph_opts;
2917out_mem:
2918 err_ptr = ERR_PTR(-ENOMEM);
2913out_err: 2919out_err:
2914 kfree(rbd_dev->image_name); 2920 kfree(rbd_dev->image_name);
2915 rbd_dev->image_name = NULL; 2921 rbd_dev->image_name = NULL;
2916 rbd_dev->image_name_len = 0; 2922 rbd_dev->image_name_len = 0;
2917 kfree(rbd_dev->pool_name); 2923 kfree(rbd_dev->pool_name);
2918 rbd_dev->pool_name = NULL; 2924 rbd_dev->pool_name = NULL;
2925 kfree(options);
2919 2926
2920 return err_ptr; 2927 return err_ptr;
2921} 2928}
@@ -3124,7 +3131,6 @@ static ssize_t rbd_add(struct bus_type *bus,
3124 const char *buf, 3131 const char *buf,
3125 size_t count) 3132 size_t count)
3126{ 3133{
3127 char *options;
3128 struct rbd_device *rbd_dev = NULL; 3134 struct rbd_device *rbd_dev = NULL;
3129 char *snap_name; 3135 char *snap_name;
3130 struct ceph_options *ceph_opts; 3136 struct ceph_options *ceph_opts;
@@ -3134,9 +3140,6 @@ static ssize_t rbd_add(struct bus_type *bus,
3134 if (!try_module_get(THIS_MODULE)) 3140 if (!try_module_get(THIS_MODULE))
3135 return -ENODEV; 3141 return -ENODEV;
3136 3142
3137 options = kmalloc(count, GFP_KERNEL);
3138 if (!options)
3139 goto err_out_mem;
3140 rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL); 3143 rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
3141 if (!rbd_dev) 3144 if (!rbd_dev)
3142 goto err_out_mem; 3145 goto err_out_mem;
@@ -3148,8 +3151,7 @@ static ssize_t rbd_add(struct bus_type *bus,
3148 init_rwsem(&rbd_dev->header_rwsem); 3151 init_rwsem(&rbd_dev->header_rwsem);
3149 3152
3150 /* parse add command */ 3153 /* parse add command */
3151 ceph_opts = rbd_add_parse_args(rbd_dev, buf, options, count, 3154 ceph_opts = rbd_add_parse_args(rbd_dev, buf, &snap_name);
3152 &snap_name);
3153 if (IS_ERR(ceph_opts)) { 3155 if (IS_ERR(ceph_opts)) {
3154 rc = PTR_ERR(ceph_opts); 3156 rc = PTR_ERR(ceph_opts);
3155 goto err_out_mem; 3157 goto err_out_mem;
@@ -3233,7 +3235,6 @@ err_out_bus:
3233 /* this will also clean up rest of rbd_dev stuff */ 3235 /* this will also clean up rest of rbd_dev stuff */
3234 3236
3235 rbd_bus_del_dev(rbd_dev); 3237 rbd_bus_del_dev(rbd_dev);
3236 kfree(options);
3237 return rc; 3238 return rc;
3238 3239
3239err_out_disk: 3240err_out_disk:
@@ -3258,7 +3259,6 @@ err_out_args:
3258 kfree(rbd_dev->pool_name); 3259 kfree(rbd_dev->pool_name);
3259err_out_mem: 3260err_out_mem:
3260 kfree(rbd_dev); 3261 kfree(rbd_dev);
3261 kfree(options);
3262 3262
3263 dout("Error adding device %s\n", buf); 3263 dout("Error adding device %s\n", buf);
3264 module_put(THIS_MODULE); 3264 module_put(THIS_MODULE);