MD: Remember the last sync operation that was performed
Subsystems (3)
PATCH 1/1 MD: Remember the last sync operation that was performed
MD: Remember the last sync operation that was performed
This patch adds a field to the mddev structure to track the last sync operation that was performed. This is especially useful when it comes to what is recorded in mismatch_cnt in sysfs. If the last operation was "data-check", then it reports the number of descrepancies found by the user-initiated check. If it was a "repair" operation, then it is reporting the number of descrepancies repaired. etc.
drivers/md/dm-raid.c +2 -1
@@ -1388,6 +1388,7 @@ static void raid_status(struct dm_target* performing a "check" of the array. */ DMEMIT (" %llu" , + (strcmp (rs->md.last_sync_action,"data-check" )) ?0 : (unsigned long long )atomic64_read (&rs->md.resync_mismatches));break ;
@@ -1651,7 +1652,7 @@ static void raid_resume(struct dm_targetstatic struct target_type raid_target = { .name ="raid" , - .version = {1 ,5 ,1 }, + .version = {1 ,5 ,2 }, .module =THIS_MODULE , .ctr = raid_ctr, .dtr = raid_dtr,
drivers/md/md.c +16 -5
@@ -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, constreturn 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, c 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_attrstatic 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,
@@ -7336,7 +7345,7 @@ void md_do_sync(struct md_thread *threadif (test_bit (MD_RECOVERY_CHECK , &mddev->recovery)) desc ="data-check" ;else if (test_bit (MD_RECOVERY_REQUESTED , &mddev->recovery)) - desc ="requested-resync" ; + desc ="requested-resync" ;/* AKA "repair" */ else desc ="resync" ; }else if (test_bit (MD_RECOVERY_RESHAPE , &mddev->recovery))
@@ -7344,6 +7353,8 @@ void md_do_sync(struct md_thread *threadelse desc ="recovery" ; + mddev->last_sync_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
drivers/md/md.h +8 -0
@@ -268,6 +268,14 @@ struct mddev {struct md_thread *thread;/* management thread */ struct md_thread *sync_thread;/* doing resync or reconstruct */ + +/* 'last_sync_action' is initialized to "none". It is set when a +* sync operation (i.e "data-check", "requested-resync", "resync", +* "recovery", or "reshape") is started. It holds this value even +* when the sync thread is "frozen" (interrupted) or "idle" (stopped +* or finished). It is overwritten when a new sync operation is begun. +*/ +char *last_sync_action;sector_t curr_resync;/* last block scheduled */ /* As resync requests can complete out of order, we cannot easily track * how much resync has been completed. So we occasionally pause until
Documentation/device-mapper/dm-raid.txt +1 -0
@@ -223,3 +223,4 @@ Version History 1.5.0 Add message interface to allow manipulation of the sync_action. New status (STATUSTYPE_INFO) fields: sync_action and mismatch_cnt. 1.5.1 Add ability to restore transiently failed devices on resume. +1.5.2 'mismatch_cnt' is zero unless [last_]sync_action is "check".
Quoted 126 lines · On Tue, 25 Jun 2013 01:23:59 -0500 Jonathan Brassow <[email protected]> wrote:
MD: Remember the last sync operation that was performed
This patch adds a field to the mddev structure to track the last sync operation that was performed. This is especially useful when it comes to what is recorded in
mismatch_cntin sysfs. If the last operation was "data-check", then it reports the number of descrepancies found by the user-initiated check. If it was a "repair" operation, then it is reporting the number of descrepancies repaired. etc.Signed-off-by Jonathan Brassow <[email protected]>Index:
linux-upstream/drivers/md/dm-raid.c
===================================================================drivers/md/dm-raid.c +2
-1@@ -1388,6 +1388,7 @@ static void raid_status(struct dm_target* performing a "check" of the array. */ DMEMIT (" %llu" , + (strcmp (rs->md.last_sync_action,"data-check" )) ?0 : (unsigned long long )atomic64_read (&rs->md.resync_mismatches));break ;@@ -1651,7 +1652,7 @@ static void raid_resume(struct dm_targetstatic struct target_type raid_target = { .name ="raid" , - .version = {1 ,5 ,1 }, + .version = {1 ,5 ,2 }, .module =THIS_MODULE , .ctr = raid_ctr, .dtr = raid_dtr,Index:
linux-upstream/drivers/md/md.c
===================================================================drivers/md/md.c +16
-5@@ -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, constreturn 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, c 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_attrstatic 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,@@ -7336,7 +7345,7 @@ void md_do_sync(struct md_thread *threadif (test_bit (MD_RECOVERY_CHECK , &mddev->recovery)) desc ="data-check" ;else if (test_bit (MD_RECOVERY_REQUESTED , &mddev->recovery)) - desc ="requested-resync" ; + desc ="requested-resync" ;/* AKA "repair" */ else desc ="resync" ; }else if (test_bit (MD_RECOVERY_RESHAPE , &mddev->recovery))@@ -7344,6 +7353,8 @@ void md_do_sync(struct md_thread *threadelse desc ="recovery" ; + mddev->last_sync_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 Index:
linux-upstream/drivers/md/md.h
===================================================================drivers/md/md.h +8
-0@@ -268,6 +268,14 @@ struct mddev {struct md_thread *thread;/* management thread */ struct md_thread *sync_thread;/* doing resync or reconstruct */ + +/* 'last_sync_action' is initialized to "none". It is set when a +* sync operation (i.e "data-check", "requested-resync", "resync", +* "recovery", or "reshape") is started. It holds this value even +* when the sync thread is "frozen" (interrupted) or "idle" (stopped +* or finished). It is overwritten when a new sync operation is begun. +*/ +char *last_sync_action;sector_t curr_resync;/* last block scheduled */ /* As resync requests can complete out of order, we cannot easily track * how much resync has been completed. So we occasionally pause until Index:
linux-upstream/Documentation/device-mapper/dm-raid.txt
===================================================================
Documentation/device-mapper/dm-raid.txt Version History · line 226
Quoted 4 lines
Documentation/device-mapper/dm-raid.txt +1
-0@@ -223,3 +223,4 @@ Version History 1.5.0 Add message interface to allow manipulation of the sync_action. New status (STATUSTYPE_INFO) fields: sync_action and mismatch_cnt. 1.5.1 Add ability to restore transiently failed devices on resume. +1.5.2 'mismatch_cnt' is zero unless [last_]sync_action is "check".
Looks sane. Applied, thanks.
NeilBrown
Quoted 127 lines · On Wed, 26 Jun 2013 12:00:24 +1000 NeilBrown <[email protected]> wrote:
Quoted 124 lines · On Tue, 25 Jun 2013 01:23:59 -0500 Jonathan Brassow <[email protected]> wrote:
MD: Remember the last sync operation that was performed
This patch adds a field to the mddev structure to track the last sync operation that was performed. This is especially useful when it comes to what is recorded in
mismatch_cntin sysfs. If the last operation was "data-check", then it reports the number of descrepancies found by the user-initiated check. If it was a "repair" operation, then it is reporting the number of descrepancies repaired. etc.Signed-off-by Jonathan Brassow <[email protected]>Index:
linux-upstream/drivers/md/dm-raid.c
===================================================================drivers/md/dm-raid.c +2
-1@@ -1388,6 +1388,7 @@ static void raid_status(struct dm_target* performing a "check" of the array. */ DMEMIT (" %llu" , + (strcmp (rs->md.last_sync_action,"data-check" )) ?0 : (unsigned long long )atomic64_read (&rs->md.resync_mismatches));break ;@@ -1651,7 +1652,7 @@ static void raid_resume(struct dm_targetstatic struct target_type raid_target = { .name ="raid" , - .version = {1 ,5 ,1 }, + .version = {1 ,5 ,2 }, .module =THIS_MODULE , .ctr = raid_ctr, .dtr = raid_dtr,Index:
linux-upstream/drivers/md/md.c
===================================================================drivers/md/md.c +16
-5@@ -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, constreturn 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, c 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_attrstatic 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,@@ -7336,7 +7345,7 @@ void md_do_sync(struct md_thread *threadif (test_bit (MD_RECOVERY_CHECK , &mddev->recovery)) desc ="data-check" ;else if (test_bit (MD_RECOVERY_REQUESTED , &mddev->recovery)) - desc ="requested-resync" ; + desc ="requested-resync" ;/* AKA "repair" */ else desc ="resync" ; }else if (test_bit (MD_RECOVERY_RESHAPE , &mddev->recovery))@@ -7344,6 +7353,8 @@ void md_do_sync(struct md_thread *threadelse desc ="recovery" ; + mddev->last_sync_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 Index:
linux-upstream/drivers/md/md.h
===================================================================drivers/md/md.h +8
-0@@ -268,6 +268,14 @@ struct mddev {struct md_thread *thread;/* management thread */ struct md_thread *sync_thread;/* doing resync or reconstruct */ + +/* 'last_sync_action' is initialized to "none". It is set when a +* sync operation (i.e "data-check", "requested-resync", "resync", +* "recovery", or "reshape") is started. It holds this value even +* when the sync thread is "frozen" (interrupted) or "idle" (stopped +* or finished). It is overwritten when a new sync operation is begun. +*/ +char *last_sync_action;sector_t curr_resync;/* last block scheduled */ /* As resync requests can complete out of order, we cannot easily track * how much resync has been completed. So we occasionally pause until Index:
linux-upstream/Documentation/device-mapper/dm-raid.txt
===================================================================Documentation/device-mapper/dm-raid.txt +0
-0@@ -223,3 +223,4 @@ Version History
Quoted 8 lines
Documentation/device-mapper/dm-raid.txt Version History · line 226
Quoted 6 lines
Documentation/device-mapper/dm-raid.txt +1
-01.5.0 Add message interface to allow manipulation of the sync_action. New status (STATUSTYPE_INFO) fields: sync_action and mismatch_cnt. 1.5.1 Add ability to restore transiently failed devices on resume. +1.5.2 'mismatch_cnt' is zero unless [last_]sync_action is "check".Looks sane. Applied, thanks.
Actually, I thought better of one little part of this.
The words "data-check" and "requested-resync" only appear in 'dmesg', not in /sys or /proc and I want it to stay that way.
Also it is important that the new "last_sync_action" has the same set of words as "sync_action".
So I made that change. The new patch is below and in my for-next, and will go to Linus tomorrow.
NeilBrown
From c4a39551451666229b4ea5e8aae8ca0131d00665 Mon Sep 17 00:00:00 2001
From: Jonathan Brassow <[email protected]>
Date: Tue, 25 Jun 2013 01:23:59 -0500
Subject: [PATCH] MD: Remember the last sync operation that was performed
MD: Remember the last sync operation that was performed
This patch adds a field to the mddev structure to track the last sync operation that was performed. This is especially useful when it comes to what is recorded in mismatch_cnt in sysfs. If the last operation was "data-check", then it reports the number of descrepancies found by the user-initiated check. If it was a "repair" operation, then it is reporting the number of descrepancies repaired. etc.
Documentation/device-mapper/dm-raid.txt +1 -0
@@ -223,3 +223,4 @@ Version History 1.5.0 Add message interface to allow manipulation of the sync_action. New status (STATUSTYPE_INFO) fields: sync_action and mismatch_cnt. 1.5.1 Add ability to restore transiently failed devices on resume. +1.5.2 'mismatch_cnt' is zero unless [last_]sync_action is "check".
drivers/md/dm-raid.c +2 -1
@@ -1388,6 +1388,7 @@ static void raid_status(struct dm_target *ti, status_type_t type,* performing a "check" of the array. */ DMEMIT (" %llu" , + (strcmp (rs->md.last_sync_action,"check" )) ?0 : (unsigned long long )atomic64_read (&rs->md.resync_mismatches));break ;
@@ -1651,7 +1652,7 @@ static void raid_resume(struct dm_target *ti)static struct target_type raid_target = { .name ="raid" , - .version = {1 ,5 ,1 }, + .version = {1 ,5 ,2 }, .module =THIS_MODULE , .ctr = raid_ctr, .dtr = raid_dtr,
drivers/md/md.c +21 -8
@@ -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
drivers/md/md.h +8 -0
@@ -268,6 +268,14 @@ struct mddev {struct md_thread *thread;/* management thread */ struct md_thread *sync_thread;/* doing resync or reconstruct */ + +/* 'last_sync_action' is initialized to "none". It is set when a +* sync operation (i.e "data-check", "requested-resync", "resync", +* "recovery", or "reshape") is started. It holds this value even +* when the sync thread is "frozen" (interrupted) or "idle" (stopped +* or finished). It is overwritten when a new sync operation is begun. +*/ +char *last_sync_action;sector_t curr_resync;/* last block scheduled */ /* As resync requests can complete out of order, we cannot easily track * how much resync has been completed. So we occasionally pause until