imsm: fix: correct checking volume's degradation

We do not check the return value of sysfs_get_ll() now. It is wrong.
If reading of the sysfs "degraded" key does not succeed,
the "new_degraded" variable will not be initiated
and accidentally it can have the value of "degraded" variable.
In that case the change of degradation will not be checked.

It happens if mdadm is compiled with gcc's "-fstack-protector" option
when one tries to stop a volume under reshape (e.g. OLCE).
Reshape seems to be finished then (metadata is in normal/clean state)
but it is not finished, it is broken and data are corrupted.

Now we always check the return value of sysfs_get_ll().
Even if reading of the sysfs "degraded" key does not succeed
(rv == -1) the change of degradation will be checked.

Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Lukasz Dorau 2012-05-25 15:06:41 +02:00 committed by NeilBrown
parent 4687f16027
commit e199302399
1 changed files with 4 additions and 2 deletions

View File

@ -10370,8 +10370,10 @@ int check_degradation_change(struct mdinfo *info,
int degraded)
{
unsigned long long new_degraded;
sysfs_get_ll(info, NULL, "degraded", &new_degraded);
if (new_degraded != (unsigned long long)degraded) {
int rv;
rv = sysfs_get_ll(info, NULL, "degraded", &new_degraded);
if ((rv == -1) || (new_degraded != (unsigned long long)degraded)) {
/* check each device to ensure it is still working */
struct mdinfo *sd;
new_degraded = 0;