Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -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);
+1 −1
Original line number Original line Diff line number Diff line
@@ -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,
+5 −6
Original line number Original line Diff line number Diff line
@@ -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;