提交 bce74dac 编写于 作者: N NeilBrown 提交者: Linus Torvalds

[PATCH] md: helper function to match commands written to sysfs files

Commands written to sysfs files may, or my not, be \n terminated.  We want to
accept with case.  For this we use cmd_match.
Signed-off-by: NNeil Brown <neilb@suse.de>
Acked-by: NGreg KH <greg@kroah.com>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 1345b1d8
...@@ -1525,6 +1525,26 @@ static void md_update_sb(mddev_t * mddev) ...@@ -1525,6 +1525,26 @@ static void md_update_sb(mddev_t * mddev)
} }
/* words written to sysfs files may, or my not, be \n terminated.
* We want to accept with case. For this we use cmd_match.
*/
static int cmd_match(const char *cmd, const char *str)
{
/* See if cmd, written into a sysfs file, matches
* str. They must either be the same, or cmd can
* have a trailing newline
*/
while (*cmd && *str && *cmd == *str) {
cmd++;
str++;
}
if (*cmd == '\n')
cmd++;
if (*str || *cmd)
return 0;
return 1;
}
struct rdev_sysfs_entry { struct rdev_sysfs_entry {
struct attribute attr; struct attribute attr;
ssize_t (*show)(mdk_rdev_t *, char *); ssize_t (*show)(mdk_rdev_t *, char *);
...@@ -1799,7 +1819,7 @@ action_store(mddev_t *mddev, const char *page, size_t len) ...@@ -1799,7 +1819,7 @@ action_store(mddev_t *mddev, const char *page, size_t len)
if (!mddev->pers || !mddev->pers->sync_request) if (!mddev->pers || !mddev->pers->sync_request)
return -EINVAL; return -EINVAL;
if (strcmp(page, "idle")==0 || strcmp(page, "idle\n")==0) { if (cmd_match(page, "idle")) {
if (mddev->sync_thread) { if (mddev->sync_thread) {
set_bit(MD_RECOVERY_INTR, &mddev->recovery); set_bit(MD_RECOVERY_INTR, &mddev->recovery);
md_unregister_thread(mddev->sync_thread); md_unregister_thread(mddev->sync_thread);
...@@ -1812,13 +1832,12 @@ action_store(mddev_t *mddev, const char *page, size_t len) ...@@ -1812,13 +1832,12 @@ action_store(mddev_t *mddev, const char *page, size_t len)
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
return -EBUSY; return -EBUSY;
if (strcmp(page, "resync")==0 || strcmp(page, "resync\n")==0 || if (cmd_match(page, "resync") || cmd_match(page, "recover"))
strcmp(page, "recover")==0 || strcmp(page, "recover\n")==0)
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
else { else {
if (strcmp(page, "check")==0 || strcmp(page, "check\n")==0) if (cmd_match(page, "check"))
set_bit(MD_RECOVERY_CHECK, &mddev->recovery); set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
else if (strcmp(page, "repair")!=0 && strcmp(page, "repair\n")!=0) else if (cmd_match(page, "repair"))
return -EINVAL; return -EINVAL;
set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
set_bit(MD_RECOVERY_SYNC, &mddev->recovery); set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册