1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-18 10:04:20 +03:00

raid0: Standardise meta_areas checks before access.

This commit is contained in:
Alasdair G Kergon 2016-05-23 22:55:13 +01:00
parent 757f7d5508
commit b896f7de1e
9 changed files with 21 additions and 19 deletions

View File

@ -2207,7 +2207,7 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
(!dm->track_pending_delete || !lv_is_cache(lv)) && (!dm->track_pending_delete || !lv_is_cache(lv)) &&
!_add_lv_to_dtree(dm, dtree, seg_lv(seg, s), 0)) !_add_lv_to_dtree(dm, dtree, seg_lv(seg, s), 0))
return_0; return_0;
if (seg_is_raid(seg) && seg->meta_areas && seg_metalv(seg, s) && if (seg_is_raid_with_meta(seg) && seg->meta_areas && seg_metalv(seg, s) &&
!_add_lv_to_dtree(dm, dtree, seg_metalv(seg, s), 0)) !_add_lv_to_dtree(dm, dtree, seg_metalv(seg, s), 0))
return_0; return_0;
} }
@ -2713,7 +2713,7 @@ static int _add_segment_to_dtree(struct dev_manager *dm,
!_add_new_lv_to_dtree(dm, dtree, seg_lv(seg, s), !_add_new_lv_to_dtree(dm, dtree, seg_lv(seg, s),
laopts, NULL)) laopts, NULL))
return_0; return_0;
if (seg_is_raid(seg) && seg->meta_areas && seg_metalv(seg, s) && if (seg_is_raid_with_meta(seg) && seg->meta_areas && seg_metalv(seg, s) &&
!_add_new_lv_to_dtree(dm, dtree, seg_metalv(seg, s), !_add_new_lv_to_dtree(dm, dtree, seg_metalv(seg, s),
laopts, NULL)) laopts, NULL))
return_0; return_0;

View File

@ -53,7 +53,7 @@ static struct dm_list *_format_pvsegs(struct dm_pool *mem, const struct lv_segme
goto bad; goto bad;
} }
if (metadata_areas_only && (!seg_is_raid(seg) || lv_is_raid_metadata(seg->lv) || lv_is_raid_image(seg->lv))) if (metadata_areas_only && (!seg_is_raid_with_meta(seg) || !seg->meta_areas || lv_is_raid_metadata(seg->lv) || lv_is_raid_image(seg->lv)))
goto out; goto out;
for (s = 0; s < seg->area_count; s++) { for (s = 0; s < seg->area_count; s++) {
@ -1012,7 +1012,7 @@ int lv_raid_healthy(const struct logical_volume *lv)
/* Find out which sub-LV this is. */ /* Find out which sub-LV this is. */
for (s = 0; s < raid_seg->area_count; s++) for (s = 0; s < raid_seg->area_count; s++)
if ((lv_is_raid_image(lv) && (seg_lv(raid_seg, s) == lv)) || if ((lv_is_raid_image(lv) && (seg_lv(raid_seg, s) == lv)) ||
(lv_is_raid_metadata(lv) && (seg_metalv(raid_seg,s) == lv))) (lv_is_raid_metadata(lv) && (seg_metalv(raid_seg, s) == lv)))
break; break;
if (s == raid_seg->area_count) { if (s == raid_seg->area_count) {
log_error(INTERNAL_ERROR log_error(INTERNAL_ERROR

View File

@ -1019,7 +1019,7 @@ static int _release_and_discard_lv_segment_area(struct lv_segment *seg, uint32_t
} }
/* Remove metadata area if image has been removed */ /* Remove metadata area if image has been removed */
if (area_reduction == seg->area_len) { if (seg->meta_areas && seg_metalv(seg, s) && (area_reduction == seg->area_len)) {
if (!lv_reduce(seg_metalv(seg, s), if (!lv_reduce(seg_metalv(seg, s),
seg_metalv(seg, s)->le_count)) { seg_metalv(seg, s)->le_count)) {
log_error("Failed to remove RAID meta-device %s", log_error("Failed to remove RAID meta-device %s",
@ -3826,7 +3826,7 @@ static int _lv_extend_layered_lv(struct alloc_handle *ah,
} }
/* Extend metadata LVs only on initial creation */ /* Extend metadata LVs only on initial creation */
if (seg_is_raid(seg) && !seg_is_raid0(seg) && !lv->le_count) { if (seg_is_raid_with_meta(seg) && !lv->le_count) {
if (!seg->meta_areas) { if (!seg->meta_areas) {
log_error("No meta_areas for RAID type"); log_error("No meta_areas for RAID type");
return 0; return 0;
@ -4190,12 +4190,12 @@ static int _for_each_sub_lv(struct logical_volume *lv, int skip_pools,
return_0; return_0;
} }
if (!seg_is_raid(seg)) if (!seg_is_raid_with_meta(seg))
continue; continue;
/* RAID has meta_areas */ /* RAID has meta_areas */
for (s = 0; s < seg->area_count; s++) { for (s = 0; s < seg->area_count; s++) {
if (seg_metatype(seg, s) != AREA_LV) if ((seg_metatype(seg, s) != AREA_LV) || !seg_metalv(seg, s))
continue; continue;
if (!fn(seg_metalv(seg, s), data)) if (!fn(seg_metalv(seg, s), data))
return_0; return_0;

View File

@ -441,7 +441,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
continue; continue;
if (lv == seg_lv(seg, s)) if (lv == seg_lv(seg, s))
seg_found++; seg_found++;
if (seg_is_raid(seg) && (lv == seg_metalv(seg, s))) if (seg_is_raid_with_meta(seg) && (lv == seg_metalv(seg, s)))
seg_found++; seg_found++;
} }
if (seg_is_replicator_dev(seg)) { if (seg_is_replicator_dev(seg)) {

View File

@ -1872,7 +1872,7 @@ int lv_raid_remove_missing(struct logical_volume *lv)
for (s = 0; s < seg->area_count; s++) { for (s = 0; s < seg->area_count; s++) {
if (!lv_is_partial(seg_lv(seg, s)) && if (!lv_is_partial(seg_lv(seg, s)) &&
!lv_is_partial(seg_metalv(seg, s))) (!seg->meta_areas || !seg_metalv(seg, s) || !lv_is_partial(seg_metalv(seg, s))))
continue; continue;
log_debug("Replacing %s and %s segments with error target", log_debug("Replacing %s and %s segments with error target",
@ -1882,7 +1882,7 @@ int lv_raid_remove_missing(struct logical_volume *lv)
display_lvname(seg_lv(seg, s))); display_lvname(seg_lv(seg, s)));
return 0; return 0;
} }
if (!replace_lv_with_error_segment(seg_metalv(seg, s))) { if (seg->meta_areas && !replace_lv_with_error_segment(seg_metalv(seg, s))) {
log_error("Failed to replace %s's extents with error target.", log_error("Failed to replace %s's extents with error target.",
display_lvname(seg_metalv(seg, s))); display_lvname(seg_metalv(seg, s)));
return 0; return 0;

View File

@ -119,6 +119,7 @@ struct dev_manager;
#define segtype_is_raid6_nr(segtype) ((segtype)->flags & SEG_RAID6_NR ? 1 : 0) #define segtype_is_raid6_nr(segtype) ((segtype)->flags & SEG_RAID6_NR ? 1 : 0)
#define segtype_is_raid6_zr(segtype) ((segtype)->flags & SEG_RAID6_ZR ? 1 : 0) #define segtype_is_raid6_zr(segtype) ((segtype)->flags & SEG_RAID6_ZR ? 1 : 0)
#define segtype_is_raid10(segtype) ((segtype)->flags & SEG_RAID10 ? 1 : 0) #define segtype_is_raid10(segtype) ((segtype)->flags & SEG_RAID10 ? 1 : 0)
#define segtype_is_raid_with_meta(segtype) (segtype_is_raid(segtype) && !segtype_is_raid0(segtype))
#define segtype_is_snapshot(segtype) ((segtype)->flags & SEG_SNAPSHOT ? 1 : 0) #define segtype_is_snapshot(segtype) ((segtype)->flags & SEG_SNAPSHOT ? 1 : 0)
#define segtype_is_striped(segtype) ((segtype)->flags & SEG_AREAS_STRIPED ? 1 : 0) #define segtype_is_striped(segtype) ((segtype)->flags & SEG_AREAS_STRIPED ? 1 : 0)
#define segtype_is_thin(segtype) ((segtype)->flags & (SEG_THIN_POOL|SEG_THIN_VOLUME) ? 1 : 0) #define segtype_is_thin(segtype) ((segtype)->flags & (SEG_THIN_POOL|SEG_THIN_VOLUME) ? 1 : 0)
@ -148,6 +149,7 @@ struct dev_manager;
#define seg_is_raid6_nr(seg) segtype_is_raid6_nr((seg)->segtype) #define seg_is_raid6_nr(seg) segtype_is_raid6_nr((seg)->segtype)
#define seg_is_raid6_nc(seg) segtype_is_raid6_nc((seg)->segtype) #define seg_is_raid6_nc(seg) segtype_is_raid6_nc((seg)->segtype)
#define seg_is_raid10(seg) segtype_is_raid10((seg)->segtype) #define seg_is_raid10(seg) segtype_is_raid10((seg)->segtype)
#define seg_is_raid_with_meta(seg) segtype_is_raid_with_meta((seg)->segtype)
#define seg_is_replicator(seg) ((seg)->segtype->flags & SEG_REPLICATOR ? 1 : 0) #define seg_is_replicator(seg) ((seg)->segtype->flags & SEG_REPLICATOR ? 1 : 0)
#define seg_is_replicator_dev(seg) ((seg)->segtype->flags & SEG_REPLICATOR_DEV ? 1 : 0) #define seg_is_replicator_dev(seg) ((seg)->segtype->flags & SEG_REPLICATOR_DEV ? 1 : 0)
#define seg_is_snapshot(seg) segtype_is_snapshot((seg)->segtype) #define seg_is_snapshot(seg) segtype_is_snapshot((seg)->segtype)

View File

@ -33,10 +33,10 @@ static void _raid_display(const struct lv_segment *seg)
display_stripe(seg, s, " "); display_stripe(seg, s, " ");
} }
if (seg->meta_areas) { if (seg->meta_areas)
for (s = 0; s < seg->area_count; ++s) for (s = 0; s < seg->area_count; ++s)
if (seg_metalv(seg, s))
log_print(" Raid Metadata LV%2d\t%s", s, seg_metalv(seg, s)->name); log_print(" Raid Metadata LV%2d\t%s", s, seg_metalv(seg, s)->name);
}
log_print(" "); log_print(" ");
} }

View File

@ -243,7 +243,7 @@ static int detach_metadata_devices(struct lv_segment *seg, struct dm_list *list)
if (!(lvl = dm_pool_alloc(seg->lv->vg->vgmem, sizeof(*lvl) * num_meta_lvs))) if (!(lvl = dm_pool_alloc(seg->lv->vg->vgmem, sizeof(*lvl) * num_meta_lvs)))
return_0; return_0;
if (seg_is_raid(seg)) { if (seg_is_raid_with_meta(seg)) {
for (s = 0; s < seg->area_count; s++) { for (s = 0; s < seg->area_count; s++) {
if (!seg_metalv(seg, s)) if (!seg_metalv(seg, s))
return_0; /* Trap this future possibility */ return_0; /* Trap this future possibility */

View File

@ -253,11 +253,11 @@ static int _move_raid(struct volume_group *vg_from,
for (s = 0; s < seg->area_count; s++) { for (s = 0; s < seg->area_count; s++) {
if (_lv_is_in_vg(vg_to, seg_lv(seg, s))) if (_lv_is_in_vg(vg_to, seg_lv(seg, s)))
seg_in++; seg_in++;
if (_lv_is_in_vg(vg_to, seg_metalv(seg, s))) if (seg->meta_areas && seg_metalv(seg, s) && _lv_is_in_vg(vg_to, seg_metalv(seg, s)))
seg_in++; seg_in++; /* FIXME Inadequate - must count separately */
} }
if (seg_in && seg_in != (seg->area_count * 2)) { if (seg_in && seg_in != (seg->area_count * (seg->meta_areas ? 2 : 1))) {
log_error("Can't split RAID %s between " log_error("Can't split RAID %s between "
"two Volume Groups", lv->name); "two Volume Groups", lv->name);
return 0; return 0;