return r;
}
-int
-dm_switchgroup(char * mapname, int index)
+static int
+dm_groupmsg (char * msg, char * mapname, int index)
{
int r = 0;
struct dm_task *dmt;
if (!dm_task_set_sector(dmt, 0))
goto out;
- snprintf(str, 24, "switch_group %i\n", index);
+ snprintf(str, 24, "%s_group %i\n", msg, index);
condlog(3, "message %s 0 %s", mapname, str);
if (!dm_task_set_message(dmt, str))
}
int
+dm_switchgroup(char * mapname, int index)
+{
+ return dm_groupmsg("switch", mapname,index);
+}
+
+int
+dm_enablegroup(char * mapname, int index)
+{
+ return dm_groupmsg("enable", mapname,index);
+}
+
+int
+dm_disablegroup(char * mapname, int index)
+{
+ return dm_groupmsg("disable", mapname,index);
+}
+
+int
dm_get_maps (vector mp, char * type)
{
struct multipath * mpp;
int dm_fail_path(char * mapname, char * path);
int dm_reinstate(char * mapname, char * path);
int dm_switchgroup(char * mapname, int index);
+int dm_enablegroup(char * mapname, int index);
+int dm_disablegroup(char * mapname, int index);
int dm_get_maps (vector mp, char * type);
int dm_geteventnr (char *name);
int dm_get_minor (char *name);
if (!strlen(mpp->wwid))
strncpy(mpp->wwid, pp->wwid, WWID_SIZE);
+ pp->pgindex = i + 1;
+
for (k = 0; k < num_paths_args; k++)
p += get_word(p, NULL);
}
int failcount;
int priority;
int claimed;
+ int pgindex;
char * getuid;
char * getprio;
int (*checkfn) (int, char *, void **);
}
}
+static void
+enable_group(struct path * pp)
+{
+ struct pathgroup * pgp;
+
+ pgp = VECTOR_SLOT(pp->mpp->pg, pp->pgindex - 1);
+
+ if (pgp->status == PGSTATE_DISABLED) {
+ condlog(2, "%s: enable group #%i", pp->mpp->alias, pp->pgindex);
+ dm_enablegroup(pp->mpp->alias, pp->pgindex);
+ }
+}
+
static void *
checkerloop (void *ap)
{
if (pp->mpp->pgfailback == FAILBACK_IMMEDIATE)
switch_pathgroup(pp->mpp);
+
+ /*
+ * if at least one path is up in a group, and
+ * the group is disabled, re-enable it
+ */
+ if (newstate == PATH_UP)
+ enable_group(pp);
}
else if (newstate == PATH_UP || newstate == PATH_GHOST) {
/*
pp->tick = pp->checkint;
condlog(4, "%s: delay next check %is",
pp->dev_t, pp->tick);
+
}
pp->state = newstate;
}