From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-sn1nam01on0125.outbound.protection.outlook.com ([104.47.32.125]:4176 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752689AbeARVGL (ORCPT ); Thu, 18 Jan 2018 16:06:11 -0500 From: Sasha Levin To: "stable@vger.kernel.org" , "stable-commits@vger.kernel.org" CC: Tina Ruchandani , David Howells , Sasha Levin Subject: [added to the 4.1 stable tree] afs: Migrate vlocation fields to 64-bit Date: Thu, 18 Jan 2018 21:01:33 +0000 Message-ID: <20180118205908.3220-242-alexander.levin@microsoft.com> References: <20180118205908.3220-1-alexander.levin@microsoft.com> In-Reply-To: <20180118205908.3220-1-alexander.levin@microsoft.com> Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org List-ID: From: Tina Ruchandani This patch has been added to the stable tree. If you have any objections, please let us know. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [ Upstream commit 8a79790bf0b7da216627ffb85f52cfb4adbf1e4e ] get_seconds() returns real wall-clock seconds. On 32-bit systems this value will overflow in year 2038 and beyond. This patch changes afs's vlocation record to use ktime_get_real_seconds() instead, for the fields time_of_death and update_at. Signed-off-by: Tina Ruchandani Signed-off-by: David Howells Signed-off-by: Sasha Levin --- fs/afs/callback.c | 7 ++++--- fs/afs/internal.h | 7 ++++--- fs/afs/server.c | 6 +++--- fs/afs/vlocation.c | 16 +++++++++------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/fs/afs/callback.c b/fs/afs/callback.c index 7ef637d7f3a5..7d54efd73519 100644 --- a/fs/afs/callback.c +++ b/fs/afs/callback.c @@ -362,7 +362,7 @@ static void afs_callback_updater(struct work_struct *wo= rk) { struct afs_server *server; struct afs_vnode *vnode, *xvnode; - time_t now; + time64_t now; long timeout; int ret; =20 @@ -370,7 +370,7 @@ static void afs_callback_updater(struct work_struct *wo= rk) =20 _enter(""); =20 - now =3D get_seconds(); + now =3D ktime_get_real_seconds(); =20 /* find the first vnode to update */ spin_lock(&server->cb_lock); @@ -424,7 +424,8 @@ static void afs_callback_updater(struct work_struct *wo= rk) =20 /* and then reschedule */ _debug("reschedule"); - vnode->update_at =3D get_seconds() + afs_vnode_update_timeout; + vnode->update_at =3D ktime_get_real_seconds() + + afs_vnode_update_timeout; =20 spin_lock(&server->cb_lock); =20 diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 5cb5c320b966..c671cdb3acad 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -11,6 +11,7 @@ =20 #include #include +#include #include #include #include @@ -247,7 +248,7 @@ struct afs_cache_vhash { */ struct afs_vlocation { atomic_t usage; - time_t time_of_death; /* time at which put reduced usage to 0 */ + time64_t time_of_death; /* time at which put reduced usage to 0 */ struct list_head link; /* link in cell volume location list */ struct list_head grave; /* link in master graveyard list */ struct list_head update; /* link in master update list */ @@ -258,7 +259,7 @@ struct afs_vlocation { struct afs_cache_vlocation vldb; /* volume information DB record */ struct afs_volume *vols[3]; /* volume access record pointer (index by typ= e) */ wait_queue_head_t waitq; /* status change waitqueue */ - time_t update_at; /* time at which record should be updated */ + time64_t update_at; /* time at which record should be updated */ spinlock_t lock; /* access lock */ afs_vlocation_state_t state; /* volume location state */ unsigned short upd_rej_cnt; /* ENOMEDIUM count during update */ @@ -271,7 +272,7 @@ struct afs_vlocation { */ struct afs_server { atomic_t usage; - time_t time_of_death; /* time at which put reduced usage to 0 */ + time64_t time_of_death; /* time at which put reduced usage to 0 */ struct in_addr addr; /* server address */ struct afs_cell *cell; /* cell in which server resides */ struct list_head link; /* link in cell's server list */ diff --git a/fs/afs/server.c b/fs/afs/server.c index f342acf3547d..3bc1a46f0bd6 100644 --- a/fs/afs/server.c +++ b/fs/afs/server.c @@ -237,7 +237,7 @@ void afs_put_server(struct afs_server *server) spin_lock(&afs_server_graveyard_lock); if (atomic_read(&server->usage) =3D=3D 0) { list_move_tail(&server->grave, &afs_server_graveyard); - server->time_of_death =3D get_seconds(); + server->time_of_death =3D ktime_get_real_seconds(); queue_delayed_work(afs_wq, &afs_server_reaper, afs_server_timeout * HZ); } @@ -272,9 +272,9 @@ static void afs_reap_server(struct work_struct *work) LIST_HEAD(corpses); struct afs_server *server; unsigned long delay, expiry; - time_t now; + time64_t now; =20 - now =3D get_seconds(); + now =3D ktime_get_real_seconds(); spin_lock(&afs_server_graveyard_lock); =20 while (!list_empty(&afs_server_graveyard)) { diff --git a/fs/afs/vlocation.c b/fs/afs/vlocation.c index 52976785a32c..ee9015c0db5a 100644 --- a/fs/afs/vlocation.c +++ b/fs/afs/vlocation.c @@ -340,7 +340,8 @@ static void afs_vlocation_queue_for_updates(struct afs_= vlocation *vl) struct afs_vlocation *xvl; =20 /* wait at least 10 minutes before updating... */ - vl->update_at =3D get_seconds() + afs_vlocation_update_timeout; + vl->update_at =3D ktime_get_real_seconds() + + afs_vlocation_update_timeout; =20 spin_lock(&afs_vlocation_updates_lock); =20 @@ -506,7 +507,7 @@ void afs_put_vlocation(struct afs_vlocation *vl) if (atomic_read(&vl->usage) =3D=3D 0) { _debug("buried"); list_move_tail(&vl->grave, &afs_vlocation_graveyard); - vl->time_of_death =3D get_seconds(); + vl->time_of_death =3D ktime_get_real_seconds(); queue_delayed_work(afs_wq, &afs_vlocation_reap, afs_vlocation_timeout * HZ); =20 @@ -543,11 +544,11 @@ static void afs_vlocation_reaper(struct work_struct *= work) LIST_HEAD(corpses); struct afs_vlocation *vl; unsigned long delay, expiry; - time_t now; + time64_t now; =20 _enter(""); =20 - now =3D get_seconds(); + now =3D ktime_get_real_seconds(); spin_lock(&afs_vlocation_graveyard_lock); =20 while (!list_empty(&afs_vlocation_graveyard)) { @@ -622,13 +623,13 @@ static void afs_vlocation_updater(struct work_struct = *work) { struct afs_cache_vlocation vldb; struct afs_vlocation *vl, *xvl; - time_t now; + time64_t now; long timeout; int ret; =20 _enter(""); =20 - now =3D get_seconds(); + now =3D ktime_get_real_seconds(); =20 /* find a record to update */ spin_lock(&afs_vlocation_updates_lock); @@ -684,7 +685,8 @@ static void afs_vlocation_updater(struct work_struct *w= ork) =20 /* and then reschedule */ _debug("reschedule"); - vl->update_at =3D get_seconds() + afs_vlocation_update_timeout; + vl->update_at =3D ktime_get_real_seconds() + + afs_vlocation_update_timeout; =20 spin_lock(&afs_vlocation_updates_lock); =20 --=20 2.11.0