linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] reiserfs: remove unused j_timestamp
@ 2018-06-19 15:43 Arnd Bergmann
  2018-06-19 15:43 ` [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time Arnd Bergmann
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Arnd Bergmann @ 2018-06-19 15:43 UTC (permalink / raw)
  To: Al Viro, Andrew Morton
  Cc: y2038, Jan Kara, Arnd Bergmann, Thomas Gleixner, reiserfs-devel,
	linux-kernel

This uses the deprecated time_t type but is write-only, so we
can just remove it.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 fs/reiserfs/journal.c  | 1 -
 fs/reiserfs/reiserfs.h | 1 -
 2 files changed, 2 deletions(-)

diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index 52eb5d293a34..1e7f733b2a12 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -4110,7 +4110,6 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, int flags)
 
 	atomic_set(&jl->j_older_commits_done, 0);
 	jl->j_trans_id = journal->j_trans_id;
-	jl->j_timestamp = journal->j_trans_start_time;
 	jl->j_commit_bh = c_bh;
 	jl->j_start = journal->j_start;
 	jl->j_len = journal->j_len;
diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h
index ae4811fecc1f..1536ebbaf6ab 100644
--- a/fs/reiserfs/reiserfs.h
+++ b/fs/reiserfs/reiserfs.h
@@ -271,7 +271,6 @@ struct reiserfs_journal_list {
 
 	struct mutex j_commit_mutex;
 	unsigned int j_trans_id;
-	time_t j_timestamp;
 	struct reiserfs_list_bitmap *j_list_bitmap;
 	struct buffer_head *j_commit_bh;	/* commit buffer head */
 	struct reiserfs_journal_cnode *j_realblock;
-- 
2.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time
  2018-06-19 15:43 [PATCH 1/3] reiserfs: remove unused j_timestamp Arnd Bergmann
@ 2018-06-19 15:43 ` Arnd Bergmann
  2018-06-20  8:25   ` Jan Kara
  2018-06-19 15:43 ` [PATCH 3/3] reiserfs: use 64-bit values in print_time Arnd Bergmann
  2018-06-20  8:21 ` [PATCH 1/3] reiserfs: remove unused j_timestamp Jan Kara
  2 siblings, 1 reply; 6+ messages in thread
From: Arnd Bergmann @ 2018-06-19 15:43 UTC (permalink / raw)
  To: Al Viro, Andrew Morton
  Cc: y2038, Jan Kara, Arnd Bergmann, Thomas Gleixner, reiserfs-devel,
	linux-kernel

Using CLOCK_REALTIME time_t timestamps breaks on 32-bit systems
in 2038, and gives surprising results with a concurrent settimeofday().

This changes the reiserfs journal timestamps to use ktime_get_seconds()
instead, which makes it use a 64-bit CLOCK_MONOTONIC stamp.

In the procfs output, the monotonic timestamp needs to be converted
back to CLOCK_REALTIME to keep the existing ABI.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 fs/reiserfs/journal.c  | 22 +++++++++++-----------
 fs/reiserfs/procfs.c   |  8 ++++++--
 fs/reiserfs/reiserfs.h |  2 +-
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index 1e7f733b2a12..e809da912c00 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -2381,7 +2381,7 @@ static int journal_read(struct super_block *sb)
 	struct reiserfs_journal_desc *desc;
 	unsigned int oldest_trans_id = 0;
 	unsigned int oldest_invalid_trans_id = 0;
-	time_t start;
+	time64_t start;
 	unsigned long oldest_start = 0;
 	unsigned long cur_dblock = 0;
 	unsigned long newest_mount_id = 9;
@@ -2395,7 +2395,7 @@ static int journal_read(struct super_block *sb)
 	cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb);
 	reiserfs_info(sb, "checking transaction log (%pg)\n",
 		      journal->j_dev_bd);
-	start = get_seconds();
+	start = ktime_get_seconds();
 
 	/*
 	 * step 1, read in the journal header block.  Check the transaction
@@ -2556,7 +2556,7 @@ static int journal_read(struct super_block *sb)
 	if (replay_count > 0) {
 		reiserfs_info(sb,
 			      "replayed %d transactions in %lu seconds\n",
-			      replay_count, get_seconds() - start);
+			      replay_count, ktime_get_seconds() - start);
 	}
 	/* needed to satisfy the locking in _update_journal_header_block */
 	reiserfs_write_lock(sb);
@@ -2914,7 +2914,7 @@ int journal_transaction_should_end(struct reiserfs_transaction_handle *th,
 				   int new_alloc)
 {
 	struct reiserfs_journal *journal = SB_JOURNAL(th->t_super);
-	time_t now = get_seconds();
+	time64_t now = ktime_get_seconds();
 	/* cannot restart while nested */
 	BUG_ON(!th->t_trans_id);
 	if (th->t_refcount > 1)
@@ -3023,7 +3023,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
 			      struct super_block *sb, unsigned long nblocks,
 			      int join)
 {
-	time_t now = get_seconds();
+	time64_t now = ktime_get_seconds();
 	unsigned int old_trans_id;
 	struct reiserfs_journal *journal = SB_JOURNAL(sb);
 	struct reiserfs_transaction_handle myth;
@@ -3056,7 +3056,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
 		PROC_INFO_INC(sb, journal.journal_relock_writers);
 		goto relock;
 	}
-	now = get_seconds();
+	now = ktime_get_seconds();
 
 	/*
 	 * if there is no room in the journal OR
@@ -3119,7 +3119,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
 	}
 	/* we are the first writer, set trans_id */
 	if (journal->j_trans_start_time == 0) {
-		journal->j_trans_start_time = get_seconds();
+		journal->j_trans_start_time = ktime_get_seconds();
 	}
 	atomic_inc(&journal->j_wcount);
 	journal->j_len_alloc += nblocks;
@@ -3559,11 +3559,11 @@ static void flush_async_commits(struct work_struct *work)
  */
 void reiserfs_flush_old_commits(struct super_block *sb)
 {
-	time_t now;
+	time64_t now;
 	struct reiserfs_transaction_handle th;
 	struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
-	now = get_seconds();
+	now = ktime_get_seconds();
 	/*
 	 * safety check so we don't flush while we are replaying the log during
 	 * mount
@@ -3613,7 +3613,7 @@ void reiserfs_flush_old_commits(struct super_block *sb)
 static int check_journal_end(struct reiserfs_transaction_handle *th, int flags)
 {
 
-	time_t now;
+	time64_t now;
 	int flush = flags & FLUSH_ALL;
 	int commit_now = flags & COMMIT_NOW;
 	int wait_on_commit = flags & WAIT;
@@ -3694,7 +3694,7 @@ static int check_journal_end(struct reiserfs_transaction_handle *th, int flags)
 	}
 
 	/* deal with old transactions where we are the last writers */
-	now = get_seconds();
+	now = ktime_get_seconds();
 	if ((now - journal->j_trans_start_time) > journal->j_max_trans_age) {
 		commit_now = 1;
 		journal->j_next_async_flush = 1;
diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c
index e39b3910d24d..520f9003c13a 100644
--- a/fs/reiserfs/procfs.c
+++ b/fs/reiserfs/procfs.c
@@ -303,6 +303,10 @@ static int show_journal(struct seq_file *m, void *unused)
 	struct reiserfs_sb_info *r = REISERFS_SB(sb);
 	struct reiserfs_super_block *rs = r->s_rs;
 	struct journal_params *jp = &rs->s_v1.s_journal;
+	ktime_t j_trans_start_ktime = ktime_set(JF(j_trans_start_time), 0);
+
+	/* print as CLOCK_REALTIME */
+	j_trans_start_ktime = ktime_mono_to_real(j_trans_start_ktime);
 
 	seq_printf(m,		/* on-disk fields */
 		   "jp_journal_1st_block: \t%i\n"
@@ -325,7 +329,7 @@ static int show_journal(struct seq_file *m, void *unused)
 		   "j_bcount: \t%lu\n"
 		   "j_first_unflushed_offset: \t%lu\n"
 		   "j_last_flush_trans_id: \t%u\n"
-		   "j_trans_start_time: \t%li\n"
+		   "j_trans_start_time: \t%lli\n"
 		   "j_list_bitmap_index: \t%i\n"
 		   "j_must_wait: \t%i\n"
 		   "j_next_full_flush: \t%i\n"
@@ -366,7 +370,7 @@ static int show_journal(struct seq_file *m, void *unused)
 		   JF(j_bcount),
 		   JF(j_first_unflushed_offset),
 		   JF(j_last_flush_trans_id),
-		   JF(j_trans_start_time),
+		   ktime_divns(j_trans_start_ktime, NSEC_PER_SEC),
 		   JF(j_list_bitmap_index),
 		   JF(j_must_wait),
 		   JF(j_next_full_flush),
diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h
index 1536ebbaf6ab..d0fc829bd760 100644
--- a/fs/reiserfs/reiserfs.h
+++ b/fs/reiserfs/reiserfs.h
@@ -330,7 +330,7 @@ struct reiserfs_journal {
 
 	struct buffer_head *j_header_bh;
 
-	time_t j_trans_start_time;	/* time this transaction started */
+	time64_t j_trans_start_time;	/* time this transaction started */
 	struct mutex j_mutex;
 	struct mutex j_flush_mutex;
 
-- 
2.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] reiserfs: use 64-bit values in print_time
  2018-06-19 15:43 [PATCH 1/3] reiserfs: remove unused j_timestamp Arnd Bergmann
  2018-06-19 15:43 ` [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time Arnd Bergmann
@ 2018-06-19 15:43 ` Arnd Bergmann
  2018-06-20  8:28   ` Jan Kara
  2018-06-20  8:21 ` [PATCH 1/3] reiserfs: remove unused j_timestamp Jan Kara
  2 siblings, 1 reply; 6+ messages in thread
From: Arnd Bergmann @ 2018-06-19 15:43 UTC (permalink / raw)
  To: Al Viro, Andrew Morton
  Cc: y2038, Jan Kara, Arnd Bergmann, reiserfs-devel, linux-kernel

Inode timestamps are now 64-bit wide even on 32-bit machines, and reiserfs
interprets the 32-bit on-disk timestamps as unsigned when returning them
to user space with statx(), so for consistency we should print them
the same way in the emergency console logs.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 fs/reiserfs/item_ops.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/reiserfs/item_ops.c b/fs/reiserfs/item_ops.c
index e3c558d1b78c..d0ab3a763962 100644
--- a/fs/reiserfs/item_ops.c
+++ b/fs/reiserfs/item_ops.c
@@ -33,11 +33,11 @@ static int sd_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize)
 	return 0;
 }
 
-static char *print_time(time_t t)
+static char *print_time(time64_t t)
 {
 	static char timebuf[256];
 
-	sprintf(timebuf, "%ld", t);
+	sprintf(timebuf, "%lld", t);
 	return timebuf;
 }
 
-- 
2.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] reiserfs: remove unused j_timestamp
  2018-06-19 15:43 [PATCH 1/3] reiserfs: remove unused j_timestamp Arnd Bergmann
  2018-06-19 15:43 ` [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time Arnd Bergmann
  2018-06-19 15:43 ` [PATCH 3/3] reiserfs: use 64-bit values in print_time Arnd Bergmann
@ 2018-06-20  8:21 ` Jan Kara
  2 siblings, 0 replies; 6+ messages in thread
From: Jan Kara @ 2018-06-20  8:21 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Al Viro, Andrew Morton, y2038, Jan Kara, Thomas Gleixner,
	reiserfs-devel, linux-kernel

On Tue 19-06-18 17:43:13, Arnd Bergmann wrote:
> This uses the deprecated time_t type but is write-only, so we
> can just remove it.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Looks good to me. You can add:

Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

> ---
>  fs/reiserfs/journal.c  | 1 -
>  fs/reiserfs/reiserfs.h | 1 -
>  2 files changed, 2 deletions(-)
> 
> diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
> index 52eb5d293a34..1e7f733b2a12 100644
> --- a/fs/reiserfs/journal.c
> +++ b/fs/reiserfs/journal.c
> @@ -4110,7 +4110,6 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, int flags)
>  
>  	atomic_set(&jl->j_older_commits_done, 0);
>  	jl->j_trans_id = journal->j_trans_id;
> -	jl->j_timestamp = journal->j_trans_start_time;
>  	jl->j_commit_bh = c_bh;
>  	jl->j_start = journal->j_start;
>  	jl->j_len = journal->j_len;
> diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h
> index ae4811fecc1f..1536ebbaf6ab 100644
> --- a/fs/reiserfs/reiserfs.h
> +++ b/fs/reiserfs/reiserfs.h
> @@ -271,7 +271,6 @@ struct reiserfs_journal_list {
>  
>  	struct mutex j_commit_mutex;
>  	unsigned int j_trans_id;
> -	time_t j_timestamp;
>  	struct reiserfs_list_bitmap *j_list_bitmap;
>  	struct buffer_head *j_commit_bh;	/* commit buffer head */
>  	struct reiserfs_journal_cnode *j_realblock;
> -- 
> 2.9.0
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time
  2018-06-19 15:43 ` [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time Arnd Bergmann
@ 2018-06-20  8:25   ` Jan Kara
  0 siblings, 0 replies; 6+ messages in thread
From: Jan Kara @ 2018-06-20  8:25 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Al Viro, Andrew Morton, y2038, Jan Kara, Thomas Gleixner,
	reiserfs-devel, linux-kernel

On Tue 19-06-18 17:43:14, Arnd Bergmann wrote:
> Using CLOCK_REALTIME time_t timestamps breaks on 32-bit systems
> in 2038, and gives surprising results with a concurrent settimeofday().
> 
> This changes the reiserfs journal timestamps to use ktime_get_seconds()
> instead, which makes it use a 64-bit CLOCK_MONOTONIC stamp.
> 
> In the procfs output, the monotonic timestamp needs to be converted
> back to CLOCK_REALTIME to keep the existing ABI.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
...
> diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c
> index e39b3910d24d..520f9003c13a 100644
> --- a/fs/reiserfs/procfs.c
> +++ b/fs/reiserfs/procfs.c
> @@ -303,6 +303,10 @@ static int show_journal(struct seq_file *m, void *unused)
>  	struct reiserfs_sb_info *r = REISERFS_SB(sb);
>  	struct reiserfs_super_block *rs = r->s_rs;
>  	struct journal_params *jp = &rs->s_v1.s_journal;
> +	ktime_t j_trans_start_ktime = ktime_set(JF(j_trans_start_time), 0);
> +
> +	/* print as CLOCK_REALTIME */
> +	j_trans_start_ktime = ktime_mono_to_real(j_trans_start_ktime);
>  
>  	seq_printf(m,		/* on-disk fields */
>  		   "jp_journal_1st_block: \t%i\n"
> @@ -325,7 +329,7 @@ static int show_journal(struct seq_file *m, void *unused)
>  		   "j_bcount: \t%lu\n"
>  		   "j_first_unflushed_offset: \t%lu\n"
>  		   "j_last_flush_trans_id: \t%u\n"
> -		   "j_trans_start_time: \t%li\n"
> +		   "j_trans_start_time: \t%lli\n"
>  		   "j_list_bitmap_index: \t%i\n"
>  		   "j_must_wait: \t%i\n"
>  		   "j_next_full_flush: \t%i\n"
> @@ -366,7 +370,7 @@ static int show_journal(struct seq_file *m, void *unused)
>  		   JF(j_bcount),
>  		   JF(j_first_unflushed_offset),
>  		   JF(j_last_flush_trans_id),
> -		   JF(j_trans_start_time),
> +		   ktime_divns(j_trans_start_ktime, NSEC_PER_SEC),

Hum, this looks cumbersome - maybe have a helper function converting
MONOTONIC to REALTIME seconds? Regardless the code looks correct and
reiserfs is old enough that I'm happy someone improves anything there so
I'm OK even with the current code. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] reiserfs: use 64-bit values in print_time
  2018-06-19 15:43 ` [PATCH 3/3] reiserfs: use 64-bit values in print_time Arnd Bergmann
@ 2018-06-20  8:28   ` Jan Kara
  0 siblings, 0 replies; 6+ messages in thread
From: Jan Kara @ 2018-06-20  8:28 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Al Viro, Andrew Morton, y2038, Jan Kara, reiserfs-devel, linux-kernel

On Tue 19-06-18 17:43:15, Arnd Bergmann wrote:
> Inode timestamps are now 64-bit wide even on 32-bit machines, and reiserfs
> interprets the 32-bit on-disk timestamps as unsigned when returning them
> to user space with statx(), so for consistency we should print them
> the same way in the emergency console logs.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
...
> diff --git a/fs/reiserfs/item_ops.c b/fs/reiserfs/item_ops.c
> index e3c558d1b78c..d0ab3a763962 100644
> --- a/fs/reiserfs/item_ops.c
> +++ b/fs/reiserfs/item_ops.c
> @@ -33,11 +33,11 @@ static int sd_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize)
>  	return 0;
>  }
>  
> -static char *print_time(time_t t)
> +static char *print_time(time64_t t)
>  {
>  	static char timebuf[256];
>  
> -	sprintf(timebuf, "%ld", t);
> +	sprintf(timebuf, "%lld", t);
>  	return timebuf;
>  }

Well, seeing how print_time() is used, more appropriate prototype would be:

static char *print_time(u32 t)

and then print it as %u.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-06-20  9:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-19 15:43 [PATCH 1/3] reiserfs: remove unused j_timestamp Arnd Bergmann
2018-06-19 15:43 ` [PATCH 2/3] reiserfs: use monotonic time for j_trans_start_time Arnd Bergmann
2018-06-20  8:25   ` Jan Kara
2018-06-19 15:43 ` [PATCH 3/3] reiserfs: use 64-bit values in print_time Arnd Bergmann
2018-06-20  8:28   ` Jan Kara
2018-06-20  8:21 ` [PATCH 1/3] reiserfs: remove unused j_timestamp Jan Kara

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).