diff options
| -rw-r--r-- | drivers/md/md.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 07f180f95b47..c1613854f38d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1525,6 +1525,26 @@ repeat: | |||
| 1525 | 1525 | ||
| 1526 | } | 1526 | } |
| 1527 | 1527 | ||
| 1528 | /* words written to sysfs files may, or my not, be \n terminated. | ||
| 1529 | * We want to accept with case. For this we use cmd_match. | ||
| 1530 | */ | ||
| 1531 | static int cmd_match(const char *cmd, const char *str) | ||
| 1532 | { | ||
| 1533 | /* See if cmd, written into a sysfs file, matches | ||
| 1534 | * str. They must either be the same, or cmd can | ||
| 1535 | * have a trailing newline | ||
| 1536 | */ | ||
| 1537 | while (*cmd && *str && *cmd == *str) { | ||
| 1538 | cmd++; | ||
| 1539 | str++; | ||
| 1540 | } | ||
| 1541 | if (*cmd == '\n') | ||
| 1542 | cmd++; | ||
| 1543 | if (*str || *cmd) | ||
| 1544 | return 0; | ||
| 1545 | return 1; | ||
| 1546 | } | ||
| 1547 | |||
| 1528 | struct rdev_sysfs_entry { | 1548 | struct rdev_sysfs_entry { |
| 1529 | struct attribute attr; | 1549 | struct attribute attr; |
| 1530 | ssize_t (*show)(mdk_rdev_t *, char *); | 1550 | ssize_t (*show)(mdk_rdev_t *, char *); |
| @@ -1799,7 +1819,7 @@ action_store(mddev_t *mddev, const char *page, size_t len) | |||
| 1799 | if (!mddev->pers || !mddev->pers->sync_request) | 1819 | if (!mddev->pers || !mddev->pers->sync_request) |
| 1800 | return -EINVAL; | 1820 | return -EINVAL; |
| 1801 | 1821 | ||
| 1802 | if (strcmp(page, "idle")==0 || strcmp(page, "idle\n")==0) { | 1822 | if (cmd_match(page, "idle")) { |
| 1803 | if (mddev->sync_thread) { | 1823 | if (mddev->sync_thread) { |
| 1804 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); | 1824 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
| 1805 | md_unregister_thread(mddev->sync_thread); | 1825 | md_unregister_thread(mddev->sync_thread); |
| @@ -1812,13 +1832,12 @@ action_store(mddev_t *mddev, const char *page, size_t len) | |||
| 1812 | if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || | 1832 | if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || |
| 1813 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) | 1833 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) |
| 1814 | return -EBUSY; | 1834 | return -EBUSY; |
| 1815 | if (strcmp(page, "resync")==0 || strcmp(page, "resync\n")==0 || | 1835 | if (cmd_match(page, "resync") || cmd_match(page, "recover")) |
| 1816 | strcmp(page, "recover")==0 || strcmp(page, "recover\n")==0) | ||
| 1817 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 1836 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| 1818 | else { | 1837 | else { |
| 1819 | if (strcmp(page, "check")==0 || strcmp(page, "check\n")==0) | 1838 | if (cmd_match(page, "check")) |
| 1820 | set_bit(MD_RECOVERY_CHECK, &mddev->recovery); | 1839 | set_bit(MD_RECOVERY_CHECK, &mddev->recovery); |
| 1821 | else if (strcmp(page, "repair")!=0 && strcmp(page, "repair\n")!=0) | 1840 | else if (cmd_match(page, "repair")) |
| 1822 | return -EINVAL; | 1841 | return -EINVAL; |
| 1823 | set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); | 1842 | set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); |
| 1824 | set_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 1843 | set_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
