bool verboseflag = false;
bool fakeflag = false;
bool skip_mtab_flag = false;
-bool v2_addrs = false;
+bool v2_addrs = true;
bool no_fallback = false;
bool ms_mode_specified = false;
bool mon_addr_specified = false;
cmi->cmi_mons = strndup(dev_str, len);
if (!cmi->cmi_mons)
return -ENOMEM;
+ mon_addr_specified = true;
+ } else {
+ /* reset mon_addr=<> mount option */
+ mon_addr_specified = false;
}
mount_path++;
}
/* new-style dev - force using v2 addrs first */
- if (!ms_mode_specified && !mon_addr_specified) {
- v2_addrs = true;
- append_opt("ms_mode", CEPH_DEFAULT_V2_MS_MODE, cmi,
- opt_pos);
- }
+ if (!ms_mode_specified && !mon_addr_specified)
+ append_opt("ms_mode", CEPH_DEFAULT_V2_MS_MODE, cmi,
+ opt_pos);
cmi->format = MOUNT_DEV_FORMAT_NEW;
return 0;
return ret;
}
-/* resolve monitor host and record in option string */
-static int finalize_src(struct ceph_mount_info *cmi, int *opt_pos)
+/* resolve monitor host and optionally record in option string.
+ * use opt_pos to determine if the caller wants to record the
+ * resolved address in mount option (c.f., mount_old_device_format).
+ */
+static int finalize_src(struct ceph_mount_info *cmi, int *opt_pos,
+ char **resolved_addr)
{
char *src;
size_t len = strlen(cmi->cmi_mons);
if (!src)
return -1;
- resolved_mon_addr_as_mount_opt(src);
- append_opt("mon_addr", src, cmi, opt_pos);
+ mount_ceph_debug("mount.ceph: resolved to: \"%s\"\n", src);
+ if (opt_pos) {
+ resolved_mon_addr_as_mount_opt(src);
+ append_opt("mon_addr", src, cmi, opt_pos);
+ } else if (resolved_addr) {
+ *resolved_addr = strdup(src);
+ }
free(src);
return 0;
}
int r;
int len = 0;
int pos = 0;
- char *mon_addr;
+ char *mon_addr = NULL;
char *rsrc = NULL;
r = remove_opt(cmi, "mon_addr", &mon_addr);
return -EINVAL;
}
+ /* if we reach here and still have a v2 addr, we'd need to
+ * refresh with v1 addrs, since we'll be not passing ms_mode
+ * with the old syntax.
+ */
+ if (v2_addrs && !ms_mode_specified && !mon_addr_specified) {
+ mount_ceph_debug("mount.ceph: switching to using v1 address with old syntax\n");
+ v2_addrs = false;
+ free(mon_addr);
+ free(cmi->cmi_mons);
+ mon_addr = NULL;
+ cmi->cmi_mons = NULL;
+ fetch_config_info(cmi);
+ if (!cmi->cmi_mons) {
+ fprintf(stderr, "unable to determine (v1) mon addresses\n");
+ return -EINVAL;
+ }
+ r = finalize_src(cmi, NULL, &mon_addr);
+ if (r) {
+ fprintf(stderr, "failed to resolve (v1) mon addresses\n");
+ return -EINVAL;
+ }
+ remove_opt(cmi, "ms_mode", NULL);
+ }
+
pos = strlen(cmi->cmi_opts);
if (cmi->cmi_fsname)
append_opt("mds_namespace", cmi->cmi_fsname, cmi, &pos);
bool fallback = true;
/* no v2 addresses available via config - try v1 addresses */
- if (!cmi->cmi_mons &&
+ if (v2_addrs &&
+ !cmi->cmi_mons &&
!ms_mode_specified &&
- !mon_addr_specified &&
- cmi->format == MOUNT_DEV_FORMAT_NEW) {
+ !mon_addr_specified) {
mount_ceph_debug("mount.ceph: switching to using v1 address\n");
v2_addrs = false;
fetch_config_info(cmi);
}
pos = strlen(cmi->cmi_opts);
- retval = finalize_src(cmi, &pos);
+ retval = finalize_src(cmi, &pos, NULL);
if (retval) {
fprintf(stderr, "failed to resolve source\n");
return -EINVAL;