* [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 [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 [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