|
@@ -521,6 +521,7 @@ void mddev_init(struct mddev *mddev)
|
|
|
init_waitqueue_head(&mddev->recovery_wait);
|
|
|
mddev->reshape_position = MaxSector;
|
|
|
mddev->reshape_backwards = 0;
|
|
|
+ mddev->last_sync_action = "none";
|
|
|
mddev->resync_min = 0;
|
|
|
mddev->resync_max = MaxSector;
|
|
|
mddev->level = LEVEL_NONE;
|
|
@@ -4272,6 +4273,17 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
|
|
return len;
|
|
|
}
|
|
|
|
|
|
+static struct md_sysfs_entry md_scan_mode =
|
|
|
+__ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store);
|
|
|
+
|
|
|
+static ssize_t
|
|
|
+last_sync_action_show(struct mddev *mddev, char *page)
|
|
|
+{
|
|
|
+ return sprintf(page, "%s\n", mddev->last_sync_action);
|
|
|
+}
|
|
|
+
|
|
|
+static struct md_sysfs_entry md_last_scan_mode = __ATTR_RO(last_sync_action);
|
|
|
+
|
|
|
static ssize_t
|
|
|
mismatch_cnt_show(struct mddev *mddev, char *page)
|
|
|
{
|
|
@@ -4280,10 +4292,6 @@ mismatch_cnt_show(struct mddev *mddev, char *page)
|
|
|
atomic64_read(&mddev->resync_mismatches));
|
|
|
}
|
|
|
|
|
|
-static struct md_sysfs_entry md_scan_mode =
|
|
|
-__ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store);
|
|
|
-
|
|
|
-
|
|
|
static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt);
|
|
|
|
|
|
static ssize_t
|
|
@@ -4686,6 +4694,7 @@ static struct attribute *md_default_attrs[] = {
|
|
|
|
|
|
static struct attribute *md_redundancy_attrs[] = {
|
|
|
&md_scan_mode.attr,
|
|
|
+ &md_last_scan_mode.attr,
|
|
|
&md_mismatches.attr,
|
|
|
&md_sync_min.attr,
|
|
|
&md_sync_max.attr,
|
|
@@ -7329,7 +7338,7 @@ void md_do_sync(struct md_thread *thread)
|
|
|
sector_t last_check;
|
|
|
int skipped = 0;
|
|
|
struct md_rdev *rdev;
|
|
|
- char *desc;
|
|
|
+ char *desc, *action = NULL;
|
|
|
struct blk_plug plug;
|
|
|
|
|
|
/* just incase thread restarts... */
|
|
@@ -7339,17 +7348,21 @@ void md_do_sync(struct md_thread *thread)
|
|
|
return;
|
|
|
|
|
|
if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
|
|
|
- if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery))
|
|
|
+ if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) {
|
|
|
desc = "data-check";
|
|
|
- else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
|
|
|
+ action = "check";
|
|
|
+ } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
|
|
|
desc = "requested-resync";
|
|
|
- else
|
|
|
+ action = "repair";
|
|
|
+ } else
|
|
|
desc = "resync";
|
|
|
} else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
|
|
|
desc = "reshape";
|
|
|
else
|
|
|
desc = "recovery";
|
|
|
|
|
|
+ mddev->last_sync_action = action ?: desc;
|
|
|
+
|
|
|
/* we overload curr_resync somewhat here.
|
|
|
* 0 == not engaged in resync at all
|
|
|
* 2 == checking that there is no conflict with another sync
|