Commit 0e3ef49e authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Shaohua Li

md: use seconds granularity for error logging

The md code stores the exact time of the last error in the
last_read_error variable using a timespec structure. It only
ever uses the seconds portion of that though, so we can
use a scalar for it.

There won't be an overflow in 2038 here, because it already
used monotonic time and 32-bit is enough for that, but I've
decided to use time64_t for consistency in the conversion.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent d787be40
...@@ -3173,8 +3173,7 @@ int md_rdev_init(struct md_rdev *rdev) ...@@ -3173,8 +3173,7 @@ int md_rdev_init(struct md_rdev *rdev)
rdev->data_offset = 0; rdev->data_offset = 0;
rdev->new_data_offset = 0; rdev->new_data_offset = 0;
rdev->sb_events = 0; rdev->sb_events = 0;
rdev->last_read_error.tv_sec = 0; rdev->last_read_error = 0;
rdev->last_read_error.tv_nsec = 0;
rdev->sb_loaded = 0; rdev->sb_loaded = 0;
rdev->bb_page = NULL; rdev->bb_page = NULL;
atomic_set(&rdev->nr_pending, 0); atomic_set(&rdev->nr_pending, 0);
......
...@@ -99,7 +99,7 @@ struct md_rdev { ...@@ -99,7 +99,7 @@ struct md_rdev {
atomic_t read_errors; /* number of consecutive read errors that atomic_t read_errors; /* number of consecutive read errors that
* we have tried to ignore. * we have tried to ignore.
*/ */
struct timespec last_read_error; /* monotonic time since our time64_t last_read_error; /* monotonic time since our
* last read error * last read error
*/ */
atomic_t corrected_errors; /* number of corrected read errors, atomic_t corrected_errors; /* number of corrected read errors,
......
...@@ -2174,21 +2174,20 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) ...@@ -2174,21 +2174,20 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio)
*/ */
static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev) static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev)
{ {
struct timespec cur_time_mon; long cur_time_mon;
unsigned long hours_since_last; unsigned long hours_since_last;
unsigned int read_errors = atomic_read(&rdev->read_errors); unsigned int read_errors = atomic_read(&rdev->read_errors);
ktime_get_ts(&cur_time_mon); cur_time_mon = ktime_get_seconds();
if (rdev->last_read_error.tv_sec == 0 && if (rdev->last_read_error == 0) {
rdev->last_read_error.tv_nsec == 0) {
/* first time we've seen a read error */ /* first time we've seen a read error */
rdev->last_read_error = cur_time_mon; rdev->last_read_error = cur_time_mon;
return; return;
} }
hours_since_last = (cur_time_mon.tv_sec - hours_since_last = (long)(cur_time_mon -
rdev->last_read_error.tv_sec) / 3600; rdev->last_read_error) / 3600;
rdev->last_read_error = cur_time_mon; rdev->last_read_error = cur_time_mon;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment