mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-18 10:04:20 +03:00
activation: Add lv_is_active_remotely.
This commit is contained in:
parent
c812c2dbc7
commit
2304286f68
@ -389,6 +389,10 @@ int lv_is_active_locally(const struct logical_volume *lv)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int lv_is_active_remotely(const struct logical_volume *lv)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int lv_is_active_but_not_locally(const struct logical_volume *lv)
|
int lv_is_active_but_not_locally(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -1334,12 +1338,14 @@ int lvs_in_vg_opened(const struct volume_group *vg)
|
|||||||
* _lv_is_active
|
* _lv_is_active
|
||||||
* @lv: logical volume being queried
|
* @lv: logical volume being queried
|
||||||
* @locally: set if active locally (when provided)
|
* @locally: set if active locally (when provided)
|
||||||
|
* @remotely: set if active remotely (when provided)
|
||||||
* @exclusive: set if active exclusively (when provided)
|
* @exclusive: set if active exclusively (when provided)
|
||||||
*
|
*
|
||||||
* Determine whether an LV is active locally or in a cluster.
|
* Determine whether an LV is active locally or in a cluster.
|
||||||
* In addition to the return code which indicates whether or
|
* In addition to the return code which indicates whether or
|
||||||
* not the LV is active somewhere, two other values are set
|
* not the LV is active somewhere, two other values are set
|
||||||
* to yield more information about the status of the activation:
|
* to yield more information about the status of the activation:
|
||||||
|
*
|
||||||
* return locally exclusively status
|
* return locally exclusively status
|
||||||
* ====== ======= =========== ======
|
* ====== ======= =========== ======
|
||||||
* 0 0 0 not active
|
* 0 0 0 not active
|
||||||
@ -1352,9 +1358,10 @@ int lvs_in_vg_opened(const struct volume_group *vg)
|
|||||||
* Returns: 0 or 1
|
* Returns: 0 or 1
|
||||||
*/
|
*/
|
||||||
static int _lv_is_active(const struct logical_volume *lv,
|
static int _lv_is_active(const struct logical_volume *lv,
|
||||||
int *locally, int *exclusive)
|
int *locally, int *remotely, int *exclusive)
|
||||||
{
|
{
|
||||||
int r, l, e; /* remote, local, and exclusive */
|
int r, l, e; /* remote, local, and exclusive */
|
||||||
|
int skip_cluster_query = 0;
|
||||||
|
|
||||||
r = l = e = 0;
|
r = l = e = 0;
|
||||||
|
|
||||||
@ -1367,11 +1374,14 @@ static int _lv_is_active(const struct logical_volume *lv,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Active locally, and the caller doesn't care about exclusive */
|
/* Active locally, and the caller doesn't care about exclusive or remotely */
|
||||||
if (l && !exclusive)
|
if (l && !exclusive && !remotely)
|
||||||
|
skip_cluster_query = 1;
|
||||||
|
|
||||||
|
if (skip_cluster_query)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if ((r = cluster_lock_held(lv->lvid.s, "", &e)) >= 0)
|
if ((r = cluster_lock_held(lv->lvid.s, NODE_REMOTE, &e)) >= 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1387,6 +1397,9 @@ static int _lv_is_active(const struct logical_volume *lv,
|
|||||||
|
|
||||||
e = 0;
|
e = 0;
|
||||||
|
|
||||||
|
/* Also set remotely as a precaution, as we don't know */
|
||||||
|
r = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We used to attempt activate_lv_excl_local(lv->vg->cmd, lv) here,
|
* We used to attempt activate_lv_excl_local(lv->vg->cmd, lv) here,
|
||||||
* but it's unreliable.
|
* but it's unreliable.
|
||||||
@ -1397,53 +1410,65 @@ out:
|
|||||||
*locally = l;
|
*locally = l;
|
||||||
if (exclusive)
|
if (exclusive)
|
||||||
*exclusive = e;
|
*exclusive = e;
|
||||||
|
if (remotely)
|
||||||
|
*remotely = r;
|
||||||
|
|
||||||
log_very_verbose("%s is %sactive%s%s",
|
log_very_verbose("%s is %sactive%s%s%s%s",
|
||||||
display_lvname(lv),
|
display_lvname(lv),
|
||||||
(r || l) ? "" : "not ",
|
(r || l) ? "" : "not ",
|
||||||
(exclusive && e) ? " exclusive" : "",
|
(exclusive && e) ? " exclusive" : "",
|
||||||
e ? (l ? " locally" : " remotely") : "");
|
l ? " locally" : "",
|
||||||
|
(!skip_cluster_query && l && r) ? " and" : "",
|
||||||
|
(!skip_cluster_query && r) ? " remotely" : "");
|
||||||
|
|
||||||
return r || l;
|
return r || l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv_is_active(const struct logical_volume *lv)
|
int lv_is_active(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
return _lv_is_active(lv, NULL, NULL);
|
return _lv_is_active(lv, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv_is_active_locally(const struct logical_volume *lv)
|
int lv_is_active_locally(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
|
|
||||||
return _lv_is_active(lv, &l, NULL) && l;
|
return _lv_is_active(lv, &l, NULL, NULL) && l;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lv_is_active_remotely(const struct logical_volume *lv)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
return _lv_is_active(lv, NULL, &r, NULL) && r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv_is_active_but_not_locally(const struct logical_volume *lv)
|
int lv_is_active_but_not_locally(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
return _lv_is_active(lv, &l, NULL) && !l;
|
|
||||||
|
return _lv_is_active(lv, &l, NULL, NULL) && !l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv_is_active_exclusive(const struct logical_volume *lv)
|
int lv_is_active_exclusive(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int e;
|
int e;
|
||||||
|
|
||||||
return _lv_is_active(lv, NULL, &e) && e;
|
return _lv_is_active(lv, NULL, NULL, &e) && e;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv_is_active_exclusive_locally(const struct logical_volume *lv)
|
int lv_is_active_exclusive_locally(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int l, e;
|
int l, e;
|
||||||
|
|
||||||
return _lv_is_active(lv, &l, &e) && l && e;
|
return _lv_is_active(lv, &l, NULL, &e) && l && e;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv_is_active_exclusive_remotely(const struct logical_volume *lv)
|
int lv_is_active_exclusive_remotely(const struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int l, e;
|
int l, e;
|
||||||
|
|
||||||
return _lv_is_active(lv, &l, &e) && !l && e;
|
return _lv_is_active(lv, &l, NULL, &e) && !l && e;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DMEVENTD
|
#ifdef DMEVENTD
|
||||||
|
Loading…
x
Reference in New Issue
Block a user