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:29 -0400 |
commit | f28e565a1b15eef62618db4011d9e320089a4214 (patch) | |
tree | ed4f44cbbc4736eb2f23d3b8f717a944c56056d2 | |
parent | e5c35534042f4b5957a32bba651222c91247beba (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.c | 58 |
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 | */ |
2845 | static struct ceph_options *rbd_add_parse_args(struct rbd_device *rbd_dev, | 2845 | static 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; |
2917 | out_mem: | ||
2918 | err_ptr = ERR_PTR(-ENOMEM); | ||
2913 | out_err: | 2919 | out_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 | ||
3239 | err_out_disk: | 3240 | err_out_disk: |
@@ -3258,7 +3259,6 @@ err_out_args: | |||
3258 | kfree(rbd_dev->pool_name); | 3259 | kfree(rbd_dev->pool_name); |
3259 | err_out_mem: | 3260 | err_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); |