Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm raid: a few cleanups

- ensure maximum device limit in superblock
- rename DMPF_* (print flags) to CTR_FLAG_* (constructor flags)
and their respective struct raid_set member
- use strcasecmp() in raid10_format_to_md_layout() as in the constructor

Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
Reviewed-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>

authored by

Heinz Mauelshagen and committed by
Mike Snitzer
c76d53f4 0f4106b3

+46 -45
+46 -45
drivers/md/dm-raid.c
··· 17 17 #include <linux/device-mapper.h> 18 18 19 19 #define DM_MSG_PREFIX "raid" 20 + #define MAX_RAID_DEVICES 253 /* raid4/5/6 limit */ 20 21 21 22 static bool devices_handle_discard_safely = false; 22 23 ··· 46 45 }; 47 46 48 47 /* 49 - * Flags for rs->print_flags field. 48 + * Flags for rs->ctr_flags field. 50 49 */ 51 - #define DMPF_SYNC 0x1 52 - #define DMPF_NOSYNC 0x2 53 - #define DMPF_REBUILD 0x4 54 - #define DMPF_DAEMON_SLEEP 0x8 55 - #define DMPF_MIN_RECOVERY_RATE 0x10 56 - #define DMPF_MAX_RECOVERY_RATE 0x20 57 - #define DMPF_MAX_WRITE_BEHIND 0x40 58 - #define DMPF_STRIPE_CACHE 0x80 59 - #define DMPF_REGION_SIZE 0x100 60 - #define DMPF_RAID10_COPIES 0x200 61 - #define DMPF_RAID10_FORMAT 0x400 50 + #define CTR_FLAG_SYNC 0x1 51 + #define CTR_FLAG_NOSYNC 0x2 52 + #define CTR_FLAG_REBUILD 0x4 53 + #define CTR_FLAG_DAEMON_SLEEP 0x8 54 + #define CTR_FLAG_MIN_RECOVERY_RATE 0x10 55 + #define CTR_FLAG_MAX_RECOVERY_RATE 0x20 56 + #define CTR_FLAG_MAX_WRITE_BEHIND 0x40 57 + #define CTR_FLAG_STRIPE_CACHE 0x80 58 + #define CTR_FLAG_REGION_SIZE 0x100 59 + #define CTR_FLAG_RAID10_COPIES 0x200 60 + #define CTR_FLAG_RAID10_FORMAT 0x400 62 61 63 62 struct raid_set { 64 63 struct dm_target *ti; 65 64 66 65 uint32_t bitmap_loaded; 67 - uint32_t print_flags; 66 + uint32_t ctr_flags; 68 67 69 68 struct mddev md; 70 69 struct raid_type *raid_type; ··· 120 119 { 121 120 unsigned n = 1, f = 1; 122 121 123 - if (!strcmp("near", format)) 122 + if (!strcasecmp("near", format)) 124 123 n = copies; 125 124 else 126 125 f = copies; 127 126 128 - if (!strcmp("offset", format)) 127 + if (!strcasecmp("offset", format)) 129 128 return 0x30000 | (f << 8) | n; 130 129 131 - if (!strcmp("far", format)) 130 + if (!strcasecmp("far", format)) 132 131 return 0x20000 | (f << 8) | n; 133 132 134 133 return (f << 8) | n; ··· 554 553 for (i = 0; i < num_raid_params; i++) { 555 554 if (!strcasecmp(argv[i], "nosync")) { 556 555 rs->md.recovery_cp = MaxSector; 557 - rs->print_flags |= DMPF_NOSYNC; 556 + rs->ctr_flags |= CTR_FLAG_NOSYNC; 558 557 continue; 559 558 } 560 559 if (!strcasecmp(argv[i], "sync")) { 561 560 rs->md.recovery_cp = 0; 562 - rs->print_flags |= DMPF_SYNC; 561 + rs->ctr_flags |= CTR_FLAG_SYNC; 563 562 continue; 564 563 } 565 564 ··· 584 583 return -EINVAL; 585 584 } 586 585 raid10_format = argv[i]; 587 - rs->print_flags |= DMPF_RAID10_FORMAT; 586 + rs->ctr_flags |= CTR_FLAG_RAID10_FORMAT; 588 587 continue; 589 588 } 590 589 ··· 601 600 } 602 601 clear_bit(In_sync, &rs->dev[value].rdev.flags); 603 602 rs->dev[value].rdev.recovery_offset = 0; 604 - rs->print_flags |= DMPF_REBUILD; 603 + rs->ctr_flags |= CTR_FLAG_REBUILD; 605 604 } else if (!strcasecmp(key, "write_mostly")) { 606 605 if (rs->raid_type->level != 1) { 607 606 rs->ti->error = "write_mostly option is only valid for RAID1"; ··· 617 616 rs->ti->error = "max_write_behind option is only valid for RAID1"; 618 617 return -EINVAL; 619 618 } 620 - rs->print_flags |= DMPF_MAX_WRITE_BEHIND; 619 + rs->ctr_flags |= CTR_FLAG_MAX_WRITE_BEHIND; 621 620 622 621 /* 623 622 * In device-mapper, we specify things in sectors, but ··· 630 629 } 631 630 rs->md.bitmap_info.max_write_behind = value; 632 631 } else if (!strcasecmp(key, "daemon_sleep")) { 633 - rs->print_flags |= DMPF_DAEMON_SLEEP; 632 + rs->ctr_flags |= CTR_FLAG_DAEMON_SLEEP; 634 633 if (!value || (value > MAX_SCHEDULE_TIMEOUT)) { 635 634 rs->ti->error = "daemon sleep period out of range"; 636 635 return -EINVAL; 637 636 } 638 637 rs->md.bitmap_info.daemon_sleep = value; 639 638 } else if (!strcasecmp(key, "stripe_cache")) { 640 - rs->print_flags |= DMPF_STRIPE_CACHE; 639 + rs->ctr_flags |= CTR_FLAG_STRIPE_CACHE; 641 640 642 641 /* 643 642 * In device-mapper, we specify things in sectors, but ··· 655 654 return -EINVAL; 656 655 } 657 656 } else if (!strcasecmp(key, "min_recovery_rate")) { 658 - rs->print_flags |= DMPF_MIN_RECOVERY_RATE; 657 + rs->ctr_flags |= CTR_FLAG_MIN_RECOVERY_RATE; 659 658 if (value > INT_MAX) { 660 659 rs->ti->error = "min_recovery_rate out of range"; 661 660 return -EINVAL; 662 661 } 663 662 rs->md.sync_speed_min = (int)value; 664 663 } else if (!strcasecmp(key, "max_recovery_rate")) { 665 - rs->print_flags |= DMPF_MAX_RECOVERY_RATE; 664 + rs->ctr_flags |= CTR_FLAG_MAX_RECOVERY_RATE; 666 665 if (value > INT_MAX) { 667 666 rs->ti->error = "max_recovery_rate out of range"; 668 667 return -EINVAL; 669 668 } 670 669 rs->md.sync_speed_max = (int)value; 671 670 } else if (!strcasecmp(key, "region_size")) { 672 - rs->print_flags |= DMPF_REGION_SIZE; 671 + rs->ctr_flags |= CTR_FLAG_REGION_SIZE; 673 672 region_size = value; 674 673 } else if (!strcasecmp(key, "raid10_copies") && 675 674 (rs->raid_type->level == 10)) { ··· 677 676 rs->ti->error = "Bad value for 'raid10_copies'"; 678 677 return -EINVAL; 679 678 } 680 - rs->print_flags |= DMPF_RAID10_COPIES; 679 + rs->ctr_flags |= CTR_FLAG_RAID10_COPIES; 681 680 raid10_copies = value; 682 681 } else { 683 682 DMERR("Unable to parse RAID parameter: %s", key); ··· 946 945 return -EINVAL; 947 946 } 948 947 949 - if (!(rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC))) 948 + if (!(rs->ctr_flags & (CTR_FLAG_SYNC | CTR_FLAG_NOSYNC))) 950 949 mddev->recovery_cp = le64_to_cpu(sb->array_resync_offset); 951 950 952 951 /* ··· 1072 1071 freshest = NULL; 1073 1072 rdev_for_each_safe(rdev, tmp, mddev) { 1074 1073 /* 1075 - * Skipping super_load due to DMPF_SYNC will cause 1074 + * Skipping super_load due to CTR_FLAG_SYNC will cause 1076 1075 * the array to undergo initialization again as 1077 1076 * though it were new. This is the intended effect 1078 1077 * of the "sync" directive. ··· 1081 1080 * that the "sync" directive is disallowed during the 1082 1081 * reshape. 1083 1082 */ 1084 - if (rs->print_flags & DMPF_SYNC) 1083 + if (rs->ctr_flags & CTR_FLAG_SYNC) 1085 1084 continue; 1086 1085 1087 1086 if (!rdev->meta_bdev) ··· 1242 1241 } 1243 1242 1244 1243 if ((kstrtoul(argv[num_raid_params], 10, &num_raid_devs) < 0) || 1245 - (num_raid_devs >= INT_MAX)) { 1244 + (num_raid_devs > MAX_RAID_DEVICES)) { 1246 1245 ti->error = "Cannot understand number of raid devices"; 1247 1246 return -EINVAL; 1248 1247 } ··· 1445 1444 case STATUSTYPE_TABLE: 1446 1445 /* The string you would use to construct this array */ 1447 1446 for (i = 0; i < rs->md.raid_disks; i++) { 1448 - if ((rs->print_flags & DMPF_REBUILD) && 1447 + if ((rs->ctr_flags & CTR_FLAG_REBUILD) && 1449 1448 rs->dev[i].data_dev && 1450 1449 !test_bit(In_sync, &rs->dev[i].rdev.flags)) 1451 1450 raid_param_cnt += 2; /* for rebuilds */ ··· 1454 1453 raid_param_cnt += 2; 1455 1454 } 1456 1455 1457 - raid_param_cnt += (hweight32(rs->print_flags & ~DMPF_REBUILD) * 2); 1458 - if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) 1456 + raid_param_cnt += (hweight32(rs->ctr_flags & ~CTR_FLAG_REBUILD) * 2); 1457 + if (rs->ctr_flags & (CTR_FLAG_SYNC | CTR_FLAG_NOSYNC)) 1459 1458 raid_param_cnt--; 1460 1459 1461 1460 DMEMIT("%s %u %u", rs->raid_type->name, 1462 1461 raid_param_cnt, rs->md.chunk_sectors); 1463 1462 1464 - if ((rs->print_flags & DMPF_SYNC) && 1463 + if ((rs->ctr_flags & CTR_FLAG_SYNC) && 1465 1464 (rs->md.recovery_cp == MaxSector)) 1466 1465 DMEMIT(" sync"); 1467 - if (rs->print_flags & DMPF_NOSYNC) 1466 + if (rs->ctr_flags & CTR_FLAG_NOSYNC) 1468 1467 DMEMIT(" nosync"); 1469 1468 1470 1469 for (i = 0; i < rs->md.raid_disks; i++) 1471 - if ((rs->print_flags & DMPF_REBUILD) && 1470 + if ((rs->ctr_flags & CTR_FLAG_REBUILD) && 1472 1471 rs->dev[i].data_dev && 1473 1472 !test_bit(In_sync, &rs->dev[i].rdev.flags)) 1474 1473 DMEMIT(" rebuild %u", i); 1475 1474 1476 - if (rs->print_flags & DMPF_DAEMON_SLEEP) 1475 + if (rs->ctr_flags & CTR_FLAG_DAEMON_SLEEP) 1477 1476 DMEMIT(" daemon_sleep %lu", 1478 1477 rs->md.bitmap_info.daemon_sleep); 1479 1478 1480 - if (rs->print_flags & DMPF_MIN_RECOVERY_RATE) 1479 + if (rs->ctr_flags & CTR_FLAG_MIN_RECOVERY_RATE) 1481 1480 DMEMIT(" min_recovery_rate %d", rs->md.sync_speed_min); 1482 1481 1483 - if (rs->print_flags & DMPF_MAX_RECOVERY_RATE) 1482 + if (rs->ctr_flags & CTR_FLAG_MAX_RECOVERY_RATE) 1484 1483 DMEMIT(" max_recovery_rate %d", rs->md.sync_speed_max); 1485 1484 1486 1485 for (i = 0; i < rs->md.raid_disks; i++) ··· 1488 1487 test_bit(WriteMostly, &rs->dev[i].rdev.flags)) 1489 1488 DMEMIT(" write_mostly %u", i); 1490 1489 1491 - if (rs->print_flags & DMPF_MAX_WRITE_BEHIND) 1490 + if (rs->ctr_flags & CTR_FLAG_MAX_WRITE_BEHIND) 1492 1491 DMEMIT(" max_write_behind %lu", 1493 1492 rs->md.bitmap_info.max_write_behind); 1494 1493 1495 - if (rs->print_flags & DMPF_STRIPE_CACHE) { 1494 + if (rs->ctr_flags & CTR_FLAG_STRIPE_CACHE) { 1496 1495 struct r5conf *conf = rs->md.private; 1497 1496 1498 1497 /* convert from kiB to sectors */ ··· 1500 1499 conf ? conf->max_nr_stripes * 2 : 0); 1501 1500 } 1502 1501 1503 - if (rs->print_flags & DMPF_REGION_SIZE) 1502 + if (rs->ctr_flags & CTR_FLAG_REGION_SIZE) 1504 1503 DMEMIT(" region_size %lu", 1505 1504 rs->md.bitmap_info.chunksize >> 9); 1506 1505 1507 - if (rs->print_flags & DMPF_RAID10_COPIES) 1506 + if (rs->ctr_flags & CTR_FLAG_RAID10_COPIES) 1508 1507 DMEMIT(" raid10_copies %u", 1509 1508 raid10_md_layout_to_copies(rs->md.layout)); 1510 1509 1511 - if (rs->print_flags & DMPF_RAID10_FORMAT) 1510 + if (rs->ctr_flags & CTR_FLAG_RAID10_FORMAT) 1512 1511 DMEMIT(" raid10_format %s", 1513 1512 raid10_md_layout_to_format(rs->md.layout)); 1514 1513