diff options
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/super.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index b982239f38f9..2f586b0e5e0f 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
@@ -307,7 +307,10 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt, | |||
307 | { | 307 | { |
308 | struct ceph_mount_options *fsopt; | 308 | struct ceph_mount_options *fsopt; |
309 | const char *dev_name_end; | 309 | const char *dev_name_end; |
310 | int err = -ENOMEM; | 310 | int err; |
311 | |||
312 | if (!dev_name || !*dev_name) | ||
313 | return -EINVAL; | ||
311 | 314 | ||
312 | fsopt = kzalloc(sizeof(*fsopt), GFP_KERNEL); | 315 | fsopt = kzalloc(sizeof(*fsopt), GFP_KERNEL); |
313 | if (!fsopt) | 316 | if (!fsopt) |
@@ -328,21 +331,33 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt, | |||
328 | fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT; | 331 | fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT; |
329 | fsopt->congestion_kb = default_congestion_kb(); | 332 | fsopt->congestion_kb = default_congestion_kb(); |
330 | 333 | ||
331 | /* ip1[:port1][,ip2[:port2]...]:/subdir/in/fs */ | 334 | /* |
335 | * Distinguish the server list from the path in "dev_name". | ||
336 | * Internally we do not include the leading '/' in the path. | ||
337 | * | ||
338 | * "dev_name" will look like: | ||
339 | * <server_spec>[,<server_spec>...]:[<path>] | ||
340 | * where | ||
341 | * <server_spec> is <ip>[:<port>] | ||
342 | * <path> is optional, but if present must begin with '/' | ||
343 | */ | ||
344 | dev_name_end = strchr(dev_name, '/'); | ||
345 | if (dev_name_end) { | ||
346 | /* skip over leading '/' for path */ | ||
347 | *path = dev_name_end + 1; | ||
348 | } else { | ||
349 | /* path is empty */ | ||
350 | dev_name_end = dev_name + strlen(dev_name); | ||
351 | *path = dev_name_end; | ||
352 | } | ||
332 | err = -EINVAL; | 353 | err = -EINVAL; |
333 | if (!dev_name) | 354 | dev_name_end--; /* back up to ':' separator */ |
334 | goto out; | 355 | if (*dev_name_end != ':') { |
335 | *path = strstr(dev_name, ":/"); | 356 | pr_err("device name is missing path (no : separator in %s)\n", |
336 | if (*path == NULL) { | ||
337 | pr_err("device name is missing path (no :/ in %s)\n", | ||
338 | dev_name); | 357 | dev_name); |
339 | goto out; | 358 | goto out; |
340 | } | 359 | } |
341 | dev_name_end = *path; | ||
342 | dout("device name '%.*s'\n", (int)(dev_name_end - dev_name), dev_name); | 360 | dout("device name '%.*s'\n", (int)(dev_name_end - dev_name), dev_name); |
343 | |||
344 | /* path on server */ | ||
345 | *path += 2; | ||
346 | dout("server path '%s'\n", *path); | 361 | dout("server path '%s'\n", *path); |
347 | 362 | ||
348 | *popt = ceph_parse_options(options, dev_name, dev_name_end, | 363 | *popt = ceph_parse_options(options, dev_name, dev_name_end, |