]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/md.c
Merge by hand (whitespace conflicts in libata.h)
[linux-2.6-omap-h63xx.git] / drivers / md / md.c
index 097ae1b5484bcb84358910a339b026a3b5573704..adf960d8a7c98d1430c2e51b7e0250674b98abff 100644 (file)
@@ -1727,7 +1727,7 @@ static ssize_t
 level_show(mddev_t *mddev, char *page)
 {
        mdk_personality_t *p = mddev->pers;
-       if (p == NULL)
+       if (p == NULL && mddev->raid_disks == 0)
                return 0;
        if (mddev->level >= 0)
                return sprintf(page, "RAID-%d\n", mddev->level);
@@ -1740,15 +1740,17 @@ static struct md_sysfs_entry md_level = __ATTR_RO(level);
 static ssize_t
 raid_disks_show(mddev_t *mddev, char *page)
 {
+       if (mddev->raid_disks == 0)
+               return 0;
        return sprintf(page, "%d\n", mddev->raid_disks);
 }
 
 static struct md_sysfs_entry md_raid_disks = __ATTR_RO(raid_disks);
 
 static ssize_t
-md_show_scan(mddev_t *mddev, char *page)
+action_show(mddev_t *mddev, char *page)
 {
-       char *type = "none";
+       char *type = "idle";
        if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
            test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) {
                if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
@@ -1765,27 +1767,36 @@ md_show_scan(mddev_t *mddev, char *page)
 }
 
 static ssize_t
-md_store_scan(mddev_t *mddev, const char *page, size_t len)
+action_store(mddev_t *mddev, const char *page, size_t len)
 {
-       int canscan=0;
+       if (!mddev->pers || !mddev->pers->sync_request)
+               return -EINVAL;
+
+       if (strcmp(page, "idle")==0 || strcmp(page, "idle\n")==0) {
+               if (mddev->sync_thread) {
+                       set_bit(MD_RECOVERY_INTR, &mddev->recovery);
+                       md_unregister_thread(mddev->sync_thread);
+                       mddev->sync_thread = NULL;
+                       mddev->recovery = 0;
+               }
+               return len;
+       }
 
        if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
            test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
                return -EBUSY;
-
-       if (mddev->pers && mddev->pers->sync_request)
-               canscan=1;
-
-       if (!canscan)
-               return -EINVAL;
-
-       if (strcmp(page, "check")==0 || strcmp(page, "check\n")==0)
-               set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
-       else if (strcmp(page, "repair")!=0 && strcmp(page, "repair\n")!=0)
-               return -EINVAL;
-       set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
-       set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
-       set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+       if (strcmp(page, "resync")==0 || strcmp(page, "resync\n")==0 ||
+           strcmp(page, "recover")==0 || strcmp(page, "recover\n")==0)
+               set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+       else {
+               if (strcmp(page, "check")==0 || strcmp(page, "check\n")==0)
+                       set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
+               else if (strcmp(page, "repair")!=0 && strcmp(page, "repair\n")!=0)
+                       return -EINVAL;
+               set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
+               set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
+               set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+       }
        md_wakeup_thread(mddev->thread);
        return len;
 }
@@ -1798,7 +1809,7 @@ mismatch_cnt_show(mddev_t *mddev, char *page)
 }
 
 static struct md_sysfs_entry
-md_scan_mode = __ATTR(scan_mode, S_IRUGO|S_IWUSR, md_show_scan, md_store_scan);
+md_scan_mode = __ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store);
 
 
 static struct md_sysfs_entry