Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP4
mdadm.22955
0024-imsm-fix-spare-activation-for-old-matrix-a...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0024-imsm-fix-spare-activation-for-old-matrix-arrays.patch of Package mdadm.22955
From 05501181f18cdccdb0b3cec1d8cf59f0995504d7 Mon Sep 17 00:00:00 2001 From: Pawel Baldysiak <pawel.baldysiak@intel.com> Date: Fri, 8 Mar 2019 12:19:11 +0100 Subject: [PATCH] imsm: fix spare activation for old matrix arrays Git-commit: 05501181f18cdccdb0b3cec1d8cf59f0995504d7 Patch-mainline: mdadm-4.1+ References: jsc#SLE-10078, jsc#SLE-9348 During spare activation get_extents() calculates metadata reserved space based on smallest active RAID member or it will take the defaults. Since patch 611d9529("imsm: change reserved space to 4MB") default is extended. If array was created prior that patch, reserved space is smaller. In case of matrix RAID - spare is activated in each array one-by-one, so it is spare for first activation, but treated as "active" during second one. In case of adding spare drive to old matrix RAID with the size the same as already existing member drive the routine will take the defaults during second run and mdmon will refuse to rebuild second volume, claiming that the drive does not have enough free space. Add parameter to get_extents(), so the during spare activation reserved space is always based on smallest active drive - even if given drive is already active in some other array of matrix RAID. Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com> Signed-off-by: Coly Li <colyli@suse.de> --- super-intel.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/super-intel.c b/super-intel.c index c399433..5a7c9f8 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1313,7 +1313,8 @@ static unsigned long long per_dev_array_size(struct imsm_map *map) return array_size; } -static struct extent *get_extents(struct intel_super *super, struct dl *dl) +static struct extent *get_extents(struct intel_super *super, struct dl *dl, + int get_minimal_reservation) { /* find a list of used extents on the given physical device */ struct extent *rv, *e; @@ -1325,7 +1326,7 @@ static struct extent *get_extents(struct intel_super *super, struct dl *dl) * regardless of whether the OROM has assigned sectors from the * IMSM_RESERVED_SECTORS region */ - if (dl->index == -1) + if (dl->index == -1 || get_minimal_reservation) reservation = imsm_min_reserved_sectors(super); else reservation = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS; @@ -1386,7 +1387,7 @@ static __u32 imsm_reserved_sectors(struct intel_super *super, struct dl *dl) if (dl->index == -1) return MPB_SECTOR_CNT; - e = get_extents(super, dl); + e = get_extents(super, dl, 0); if (!e) return MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS; @@ -1478,7 +1479,7 @@ static __u32 imsm_min_reserved_sectors(struct intel_super *super) return rv; /* find last lba used by subarrays on the smallest active disk */ - e = get_extents(super, dl_min); + e = get_extents(super, dl_min, 0); if (!e) return rv; for (i = 0; e[i].size; i++) @@ -1519,7 +1520,7 @@ int get_spare_criteria_imsm(struct supertype *st, struct spare_criteria *c) if (!dl) return -EINVAL; /* find last lba used by subarrays */ - e = get_extents(super, dl); + e = get_extents(super, dl, 0); if (!e) return -EINVAL; for (i = 0; e[i].size; i++) @@ -7203,7 +7204,7 @@ static int validate_geometry_imsm_volume(struct supertype *st, int level, pos = 0; i = 0; - e = get_extents(super, dl); + e = get_extents(super, dl, 0); if (!e) continue; do { unsigned long long esize; @@ -7261,7 +7262,7 @@ static int validate_geometry_imsm_volume(struct supertype *st, int level, } /* retrieve the largest free space block */ - e = get_extents(super, dl); + e = get_extents(super, dl, 0); maxsize = 0; i = 0; if (e) { @@ -7359,7 +7360,7 @@ static int imsm_get_free_size(struct supertype *st, int raiddisks, if (super->orom && dl->index < 0 && mpb->num_raid_devs) continue; - e = get_extents(super, dl); + e = get_extents(super, dl, 0); if (!e) continue; for (i = 1; e[i-1].size; i++) @@ -8846,7 +8847,7 @@ static struct dl *imsm_add_spare(struct intel_super *super, int slot, /* Does this unused device have the requisite free space? * It needs to be able to cover all member volumes */ - ex = get_extents(super, dl); + ex = get_extents(super, dl, 1); if (!ex) { dprintf("cannot get extents\n"); continue; -- 2.25.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor