dm_log_init_verbose(conf ? conf->verbosity + 3 : 0);
}
+#define VERSION_GE(v, minv) ( \
+ (v[0] > minv[0]) || \
+ ((v[0] == minv[0]) && (v[1] > minv[1])) || \
+ ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2])) \
+)
+
static int
dm_libprereq (void)
{
condlog(3, "libdevmapper version %s", version);
sscanf(version, "%d.%d.%d ", &v[0], &v[1], &v[2]);
- if ((v[0] > minv[0]) ||
- ((v[0] == minv[0]) && (v[1] > minv[1])) ||
- ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2])))
+ if VERSION_GE(v, minv)
return 0;
condlog(0, "libdevmapper version must be >= %d.%.2d.%.2d",
minv[0], minv[1], minv[2]);
}
static int
-dm_drvprereq (char * str)
+dm_drv_version (unsigned int * version, char * str)
{
int r = 2;
struct dm_task *dmt;
struct dm_versions *target;
struct dm_versions *last_target;
- int minv[3] = {1, 0, 3};
unsigned int *v;
if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
- return 3;
+ return 1;
dm_task_no_open_count(dmt);
} while (last_target != target);
if (r == 2) {
- condlog(0, "DM multipath kernel driver not loaded");
+ condlog(0, "DM %s kernel driver not loaded", str);
goto out;
}
v = target->version;
- if ((v[0] > minv[0]) ||
- ((v[0] == minv[0]) && (v[1] > minv[1])) ||
- ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2]))) {
- r = 0;
- goto out;
- }
- condlog(0, "DM multipath kernel driver must be >= %u.%.2u.%.2u",
- minv[0], minv[1], minv[2]);
+ version[0] = v[0];
+ version[1] = v[1];
+ version[2] = v[2];
+ r = 0;
out:
dm_task_destroy(dmt);
return r;
}
+int
+dm_drv_get_rq (void)
+{
+ unsigned int minv_dmrq[3] = {1, 1, 0};
+ unsigned int *v;
+
+ v = zalloc(3);
+ if (!v)
+ return 0;
+
+ if (dm_drv_version(v, TGT_MPATH)) {
+ /* in doubt return least capable */
+ return 0;
+ }
+
+ /* test request based multipath capability */
+ if VERSION_GE(v, minv_dmrq) {
+ condlog(3, "activate request-based multipathing mode "
+ "(driver >= v%u.%u.%u)",
+ minv_dmrq[0], minv_dmrq[1], minv_dmrq[2]);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+dm_drvprereq (char * str)
+{
+ unsigned int minv[3] = {1, 0, 3};
+ unsigned int *v;
+
+ v = zalloc(3);
+ if (!v)
+ return 0;
+
+ if (dm_drv_version(v, str)) {
+ /* in doubt return not capable */
+ return 1;
+ }
+
+ /* test request based multipath capability */
+ condlog(3, "DM multipath kernel driver v%u.%u.%u",
+ v[0], v[1], v[2]);
+
+ if VERSION_GE(v, minv)
+ return 1;
+
+ condlog(0, "DM multipath kernel driver must be >= v%u.%u.%u",
+ minv[0], minv[1], minv[2]);
+ return 0;
+}
+
extern int
dm_prereq (void)
{
}
static int
+def_minio_rq_handler(vector strvec)
+{
+ char * buff;
+
+ buff = set_value(strvec);
+
+ if (!buff)
+ return 1;
+
+ conf->minio_rq = atoi(buff);
+ FREE(buff);
+
+ return 0;
+}
+
+static int
get_sys_max_fds(int *max_fds)
{
FILE *file;
}
static int
+hw_minio_rq_handler(vector strvec)
+{
+ struct hwentry *hwe = VECTOR_LAST_SLOT(conf->hwtable);
+ char * buff;
+
+ if (!hwe)
+ return 1;
+
+ buff = set_value(strvec);
+
+ if (!buff)
+ return 1;
+
+ hwe->minio_rq = atoi(buff);
+ FREE(buff);
+
+ return 0;
+}
+
+static int
hw_pg_timeout_handler(vector strvec)
{
int pg_timeout;
}
static int
+mp_minio_rq_handler(vector strvec)
+{
+ struct mpentry *mpe = VECTOR_LAST_SLOT(conf->mptable);
+ char * buff;
+
+ if (!mpe)
+ return 1;
+
+ buff = set_value(strvec);
+
+ if (!buff)
+ return 1;
+
+ mpe->minio_rq = atoi(buff);
+ FREE(buff);
+
+ return 0;
+}
+
+static int
mp_pg_timeout_handler(vector strvec)
{
int pg_timeout;
}
static int
+snprint_mp_rr_min_io_rq (char * buff, int len, void * data)
+{
+ struct mpentry * mpe = (struct mpentry *)data;
+
+ if (!mpe->minio_rq)
+ return 0;
+
+ return snprintf(buff, len, "%u", mpe->minio_rq);
+}
+
+static int
snprint_mp_pg_timeout (char * buff, int len, void * data)
{
struct mpentry * mpe = (struct mpentry *)data;
}
static int
+snprint_hw_rr_min_io_rq (char * buff, int len, void * data)
+{
+ struct hwentry * hwe = (struct hwentry *)data;
+
+ if (!hwe->minio_rq)
+ return 0;
+
+ return snprintf(buff, len, "%u", hwe->minio_rq);
+}
+
+static int
snprint_hw_pg_timeout (char * buff, int len, void * data)
{
struct hwentry * hwe = (struct hwentry *)data;
}
static int
+snprint_def_rr_min_io_rq (char * buff, int len, void * data)
+{
+ if (!conf->minio_rq)
+ return 0;
+
+ return snprintf(buff, len, "%u", conf->minio_rq);
+}
+
+static int
snprint_max_fds (char * buff, int len, void * data)
{
if (!conf->max_fds)
install_keyword("alias_prefix", &def_alias_prefix_handler, &snprint_def_alias_prefix);
install_keyword("failback", &default_failback_handler, &snprint_def_failback);
install_keyword("rr_min_io", &def_minio_handler, &snprint_def_rr_min_io);
+ install_keyword("rr_min_io_rq", &def_minio_rq_handler, &snprint_def_rr_min_io_rq);
install_keyword("max_fds", &max_fds_handler, &snprint_max_fds);
install_keyword("rr_weight", &def_weight_handler, &snprint_def_rr_weight);
install_keyword("no_path_retry", &def_no_path_retry_handler, &snprint_def_no_path_retry);
install_keyword("rr_weight", &hw_weight_handler, &snprint_hw_rr_weight);
install_keyword("no_path_retry", &hw_no_path_retry_handler, &snprint_hw_no_path_retry);
install_keyword("rr_min_io", &hw_minio_handler, &snprint_hw_rr_min_io);
+ install_keyword("rr_min_io_rq", &hw_minio_rq_handler, &snprint_hw_rr_min_io_rq);
install_keyword("pg_timeout", &hw_pg_timeout_handler, &snprint_hw_pg_timeout);
install_keyword("flush_on_last_del", &hw_flush_on_last_del_handler, &snprint_hw_flush_on_last_del);
install_keyword("fast_io_fail_tmo", &hw_fast_io_fail_handler, &snprint_hw_fast_io_fail);
install_keyword("rr_weight", &mp_weight_handler, &snprint_mp_rr_weight);
install_keyword("no_path_retry", &mp_no_path_retry_handler, &snprint_mp_no_path_retry);
install_keyword("rr_min_io", &mp_minio_handler, &snprint_mp_rr_min_io);
+ install_keyword("rr_min_io_rq", &mp_minio_rq_handler, &snprint_mp_rr_min_io_rq);
install_keyword("pg_timeout", &mp_pg_timeout_handler, &snprint_mp_pg_timeout);
install_keyword("flush_on_last_del", &mp_flush_on_last_del_handler, &snprint_mp_flush_on_last_del);
install_keyword("mode", &mp_mode_handler, &snprint_mp_mode);
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DEFAULT_CHECKER,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DEFAULT_CHECKER,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = HP_SW,
.prio_name = PRIO_HP_SW,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 12,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 12,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = (300 / DEFAULT_CHECKINT),
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = EMC_CLARIION,
.prio_name = PRIO_EMC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 5,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
},
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 5,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_HDS,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 300,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 300,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 300,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_ALUA,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_ALUA,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_ALUA,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = (300 / DEFAULT_CHECKINT),
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = (300 / DEFAULT_CHECKINT),
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = (300 / DEFAULT_CHECKINT),
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_ALUA,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_ALUA,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = TUR,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DIRECTIO,
.prio_name = DEFAULT_PRIO,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = DEFAULT_CHECKER,
.prio_name = DEFAULT_PRIO,
},
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = 15,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_QUEUE,
.minio = DEFAULT_MINIO,
+ .minio_rq = DEFAULT_MINIO_RQ,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.rr_weight = 0,
.no_path_retry = 0,
.minio = 0,
+ .minio_rq = 0,
.checker_name = NULL,
.prio_name = NULL,
.prio_args = NULL,