dm raid: table line rebuild status fixes
raid_status() wasn't emitting rebuild flags on the table line properly because the rdev number was not yet set properly; index raid component devices array directly to solve. Also fix wrong argument count on emitted table line caused by 1 too many rebuild/write_mostly argument and consider any journal_(dev|mode) pairs. Link: https://bugzilla.redhat.com/1782045 Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
committed by
Mike Snitzer
parent
88e7cafdca
commit
43f3952a51
@@ -419,3 +419,5 @@ Version History
|
|||||||
rebuild errors.
|
rebuild errors.
|
||||||
1.15.0 Fix size extensions not being synchronized in case of new MD bitmap
|
1.15.0 Fix size extensions not being synchronized in case of new MD bitmap
|
||||||
pages allocated; also fix those not occuring after previous reductions
|
pages allocated; also fix those not occuring after previous reductions
|
||||||
|
1.15.1 Fix argument count and arguments for rebuild/write_mostly/journal_(dev|mode)
|
||||||
|
on the status line.
|
||||||
|
|||||||
@@ -129,7 +129,9 @@ struct raid_dev {
|
|||||||
CTR_FLAG_RAID10_COPIES | \
|
CTR_FLAG_RAID10_COPIES | \
|
||||||
CTR_FLAG_RAID10_FORMAT | \
|
CTR_FLAG_RAID10_FORMAT | \
|
||||||
CTR_FLAG_DELTA_DISKS | \
|
CTR_FLAG_DELTA_DISKS | \
|
||||||
CTR_FLAG_DATA_OFFSET)
|
CTR_FLAG_DATA_OFFSET | \
|
||||||
|
CTR_FLAG_JOURNAL_DEV | \
|
||||||
|
CTR_FLAG_JOURNAL_MODE)
|
||||||
|
|
||||||
/* Valid options definitions per raid level... */
|
/* Valid options definitions per raid level... */
|
||||||
|
|
||||||
@@ -3001,7 +3003,6 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
|||||||
{ 1, 254, "Cannot understand number of raid devices parameters" }
|
{ 1, 254, "Cannot understand number of raid devices parameters" }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Must have <raid_type> */
|
|
||||||
arg = dm_shift_arg(&as);
|
arg = dm_shift_arg(&as);
|
||||||
if (!arg) {
|
if (!arg) {
|
||||||
ti->error = "No arguments";
|
ti->error = "No arguments";
|
||||||
@@ -3508,8 +3509,7 @@ static void raid_status(struct dm_target *ti, status_type_t type,
|
|||||||
unsigned long recovery;
|
unsigned long recovery;
|
||||||
unsigned int raid_param_cnt = 1; /* at least 1 for chunksize */
|
unsigned int raid_param_cnt = 1; /* at least 1 for chunksize */
|
||||||
unsigned int sz = 0;
|
unsigned int sz = 0;
|
||||||
unsigned int rebuild_disks;
|
unsigned int rebuild_writemostly_count = 0;
|
||||||
unsigned int write_mostly_params = 0;
|
|
||||||
sector_t progress, resync_max_sectors, resync_mismatches;
|
sector_t progress, resync_max_sectors, resync_mismatches;
|
||||||
enum sync_state state;
|
enum sync_state state;
|
||||||
struct raid_type *rt;
|
struct raid_type *rt;
|
||||||
@@ -3593,18 +3593,20 @@ static void raid_status(struct dm_target *ti, status_type_t type,
|
|||||||
case STATUSTYPE_TABLE:
|
case STATUSTYPE_TABLE:
|
||||||
/* Report the table line string you would use to construct this raid set */
|
/* Report the table line string you would use to construct this raid set */
|
||||||
|
|
||||||
/* Calculate raid parameter count */
|
/*
|
||||||
for (i = 0; i < rs->raid_disks; i++)
|
* Count any rebuild or writemostly argument pairs and subtract the
|
||||||
if (test_bit(WriteMostly, &rs->dev[i].rdev.flags))
|
* hweight count being added below of any rebuild and writemostly ctr flags.
|
||||||
write_mostly_params += 2;
|
*/
|
||||||
rebuild_disks = memweight(rs->rebuild_disks, DISKS_ARRAY_ELEMS * sizeof(*rs->rebuild_disks));
|
for (i = 0; i < rs->raid_disks; i++) {
|
||||||
raid_param_cnt += rebuild_disks * 2 +
|
rebuild_writemostly_count += (test_bit(i, (void *) rs->rebuild_disks) ? 2 : 0) +
|
||||||
write_mostly_params +
|
(test_bit(WriteMostly, &rs->dev[i].rdev.flags) ? 2 : 0);
|
||||||
|
}
|
||||||
|
rebuild_writemostly_count -= (test_bit(__CTR_FLAG_REBUILD, &rs->ctr_flags) ? 2 : 0) +
|
||||||
|
(test_bit(__CTR_FLAG_WRITE_MOSTLY, &rs->ctr_flags) ? 2 : 0);
|
||||||
|
/* Calculate raid parameter count based on ^ rebuild/writemostly argument counts and ctr flags set. */
|
||||||
|
raid_param_cnt += rebuild_writemostly_count +
|
||||||
hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_NO_ARGS) +
|
hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_NO_ARGS) +
|
||||||
hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_ONE_ARG) * 2 +
|
hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_ONE_ARG) * 2;
|
||||||
(test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ? 2 : 0) +
|
|
||||||
(test_bit(__CTR_FLAG_JOURNAL_MODE, &rs->ctr_flags) ? 2 : 0);
|
|
||||||
|
|
||||||
/* Emit table line */
|
/* Emit table line */
|
||||||
/* This has to be in the documented order for userspace! */
|
/* This has to be in the documented order for userspace! */
|
||||||
DMEMIT("%s %u %u", rs->raid_type->name, raid_param_cnt, mddev->new_chunk_sectors);
|
DMEMIT("%s %u %u", rs->raid_type->name, raid_param_cnt, mddev->new_chunk_sectors);
|
||||||
@@ -3612,11 +3614,10 @@ static void raid_status(struct dm_target *ti, status_type_t type,
|
|||||||
DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_SYNC));
|
DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_SYNC));
|
||||||
if (test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
|
if (test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
|
||||||
DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_NOSYNC));
|
DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_NOSYNC));
|
||||||
if (rebuild_disks)
|
if (test_bit(__CTR_FLAG_REBUILD, &rs->ctr_flags))
|
||||||
for (i = 0; i < rs->raid_disks; i++)
|
for (i = 0; i < rs->raid_disks; i++)
|
||||||
if (test_bit(rs->dev[i].rdev.raid_disk, (void *) rs->rebuild_disks))
|
if (test_bit(i, (void *) rs->rebuild_disks))
|
||||||
DMEMIT(" %s %u", dm_raid_arg_name_by_flag(CTR_FLAG_REBUILD),
|
DMEMIT(" %s %u", dm_raid_arg_name_by_flag(CTR_FLAG_REBUILD), i);
|
||||||
rs->dev[i].rdev.raid_disk);
|
|
||||||
if (test_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags))
|
if (test_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags))
|
||||||
DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP),
|
DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP),
|
||||||
mddev->bitmap_info.daemon_sleep);
|
mddev->bitmap_info.daemon_sleep);
|
||||||
@@ -3626,7 +3627,7 @@ static void raid_status(struct dm_target *ti, status_type_t type,
|
|||||||
if (test_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags))
|
if (test_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags))
|
||||||
DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE),
|
DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE),
|
||||||
mddev->sync_speed_max);
|
mddev->sync_speed_max);
|
||||||
if (write_mostly_params)
|
if (test_bit(__CTR_FLAG_WRITE_MOSTLY, &rs->ctr_flags))
|
||||||
for (i = 0; i < rs->raid_disks; i++)
|
for (i = 0; i < rs->raid_disks; i++)
|
||||||
if (test_bit(WriteMostly, &rs->dev[i].rdev.flags))
|
if (test_bit(WriteMostly, &rs->dev[i].rdev.flags))
|
||||||
DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_WRITE_MOSTLY),
|
DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_WRITE_MOSTLY),
|
||||||
@@ -4029,7 +4030,7 @@ static void raid_resume(struct dm_target *ti)
|
|||||||
|
|
||||||
static struct target_type raid_target = {
|
static struct target_type raid_target = {
|
||||||
.name = "raid",
|
.name = "raid",
|
||||||
.version = {1, 15, 0},
|
.version = {1, 15, 1},
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.ctr = raid_ctr,
|
.ctr = raid_ctr,
|
||||||
.dtr = raid_dtr,
|
.dtr = raid_dtr,
|
||||||
|
|||||||
Reference in New Issue
Block a user