1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Add 'Volume Type' lv_attr characters for RAID and RAID_IMAGE.

RAID_META is already handled.
This commit is contained in:
Jonathan Earl Brassow 2011-09-23 15:17:54 +00:00
parent 766d22825b
commit efa3621a59
2 changed files with 47 additions and 0 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.89 - Version 2.02.89 -
================================== ==================================
Add 'Volume Type' lv_attr characters for RAID and RAID_IMAGE.
Add activation/retry_deactivation to lvm.conf to retry deactivation of an LV. Add activation/retry_deactivation to lvm.conf to retry deactivation of an LV.
Replace open_count check with holders/mounted_fs check on lvremove path. Replace open_count check with holders/mounted_fs check on lvremove path.
Disallow the creation of mirrors (mirror or raid1 segtype) with only one leg. Disallow the creation of mirrors (mirror or raid1 segtype) with only one leg.

View File

@ -304,6 +304,48 @@ static int _lv_mimage_in_sync(const struct logical_volume *lv)
return (percent == PERCENT_100) ? 1 : 0; return (percent == PERCENT_100) ? 1 : 0;
} }
static int _lv_raid_image_in_sync(const struct logical_volume *lv)
{
percent_t percent;
struct lv_segment *raid_seg;
if (!(lv->status & RAID_IMAGE)) {
log_error(INTERNAL_ERROR "%s is not a RAID image", lv->name);
return 0;
}
raid_seg = get_only_segment_using_this_lv(first_seg(lv)->lv);
if (!raid_seg) {
log_error("Failed to find RAID segment for %s", lv->name);
return 0;
}
if (!seg_is_raid(raid_seg)) {
log_error("%s on %s is not a RAID segment",
raid_seg->lv->name, lv->name);
return 0;
}
if (!lv_raid_percent(raid_seg->lv, &percent))
return_0;
if (percent == PERCENT_100)
return 1;
/*
* FIXME: Get individual RAID image status.
* The status health characters reported from a RAID target
* indicate whether the whole array or just individual devices
* are in-sync. If the corresponding character for this image
* was 'A', we could report a more accurate status. This is
* especially so in the case of failures or rebuildings.
*
* We need to test the health characters anyway to report
* the correct 4th attr character. Just need to figure out
* where to put this functionality.
*/
return 0;
}
char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv) char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
{ {
percent_t snap_percent; percent_t snap_percent;
@ -327,6 +369,8 @@ char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
/* Origin takes precedence over mirror and thin volume */ /* Origin takes precedence over mirror and thin volume */
else if (lv_is_origin(lv)) else if (lv_is_origin(lv))
repstr[0] = (lv_is_merging_origin(lv)) ? 'O' : 'o'; repstr[0] = (lv_is_merging_origin(lv)) ? 'O' : 'o';
else if (lv->status & RAID)
repstr[0] = (lv->status & LV_NOTSYNCED) ? 'R' : 'r';
else if (lv->status & MIRRORED) else if (lv->status & MIRRORED)
repstr[0] = (lv->status & LV_NOTSYNCED) ? 'M' : 'm'; repstr[0] = (lv->status & LV_NOTSYNCED) ? 'M' : 'm';
else if (lv_is_thin_volume(lv)) else if (lv_is_thin_volume(lv))
@ -341,6 +385,8 @@ char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
repstr[0] = 'e'; repstr[0] = 'e';
else if (lv->status & MIRROR_IMAGE) else if (lv->status & MIRROR_IMAGE)
repstr[0] = (_lv_mimage_in_sync(lv)) ? 'i' : 'I'; repstr[0] = (_lv_mimage_in_sync(lv)) ? 'i' : 'I';
else if (lv->status & RAID_IMAGE)
repstr[0] = (_lv_raid_image_in_sync(lv)) ? 'i' : 'I';
else if (lv->status & MIRROR_LOG) else if (lv->status & MIRROR_LOG)
repstr[0] = 'l'; repstr[0] = 'l';
else if (lv_is_cow(lv)) { else if (lv_is_cow(lv)) {