[PATCH] md: helper function to match commands written to sysfs files
NeilBrown [Fri, 6 Jan 2006 08:20:41 +0000 (00:20 -0800)]
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: Neil Brown <neilb@suse.de>
Acked-by: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

drivers/md/md.c

index 07f180f..c161385 100644 (file)
@@ -1525,6 +1525,26 @@ repeat:
 
 }
 
+/* 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 attribute attr;
        ssize_t (*show)(mdk_rdev_t *, char *);
@@ -1799,7 +1819,7 @@ action_store(mddev_t *mddev, const char *page, size_t len)
        if (!mddev->pers || !mddev->pers->sync_request)
                return -EINVAL;
 
-       if (strcmp(page, "idle")==0 || strcmp(page, "idle\n")==0) {
+       if (cmd_match(page, "idle")) {
                if (mddev->sync_thread) {
                        set_bit(MD_RECOVERY_INTR, &mddev->recovery);
                        md_unregister_thread(mddev->sync_thread);
@@ -1812,13 +1832,12 @@ action_store(mddev_t *mddev, const char *page, size_t len)
        if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
            test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
                return -EBUSY;
-       if (strcmp(page, "resync")==0 || strcmp(page, "resync\n")==0 ||
-           strcmp(page, "recover")==0 || strcmp(page, "recover\n")==0)
+       if (cmd_match(page, "resync") || cmd_match(page, "recover"))
                set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
        else {
-               if (strcmp(page, "check")==0 || strcmp(page, "check\n")==0)
+               if (cmd_match(page, "check"))
                        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;
                set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
                set_bit(MD_RECOVERY_SYNC, &mddev->recovery);