lkml.org 
[lkml]   [2017]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 13/27] afs: Migrate vlocation fields to 64-bit
    From
    Date
    From: Tina Ruchandani <ruchandani.tina@gmail.com>

    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 <ruchandani.tina@gmail.com>
    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    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 b29447e03ede..25d404d22cae 100644
    --- a/fs/afs/callback.c
    +++ b/fs/afs/callback.c
    @@ -362,7 +362,7 @@ static void afs_callback_updater(struct work_struct *work)
    {
    struct afs_server *server;
    struct afs_vnode *vnode, *xvnode;
    - time_t now;
    + time64_t now;
    long timeout;
    int ret;

    @@ -370,7 +370,7 @@ static void afs_callback_updater(struct work_struct *work)

    _enter("");

    - now = get_seconds();
    + now = ktime_get_real_seconds();

    /* find the first vnode to update */
    spin_lock(&server->cb_lock);
    @@ -424,7 +424,8 @@ static void afs_callback_updater(struct work_struct *work)

    /* and then reschedule */
    _debug("reschedule");
    - vnode->update_at = get_seconds() + afs_vnode_update_timeout;
    + vnode->update_at = ktime_get_real_seconds() +
    + afs_vnode_update_timeout;

    spin_lock(&server->cb_lock);

    diff --git a/fs/afs/internal.h b/fs/afs/internal.h
    index 39de154fb42e..97a16ce200be 100644
    --- a/fs/afs/internal.h
    +++ b/fs/afs/internal.h
    @@ -11,6 +11,7 @@

    #include <linux/compiler.h>
    #include <linux/kernel.h>
    +#include <linux/ktime.h>
    #include <linux/fs.h>
    #include <linux/pagemap.h>
    #include <linux/rxrpc.h>
    @@ -249,7 +250,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 */
    @@ -260,7 +261,7 @@ struct afs_vlocation {
    struct afs_cache_vlocation vldb; /* volume information DB record */
    struct afs_volume *vols[3]; /* volume access record pointer (index by type) */
    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 */
    @@ -273,7 +274,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 d4066ab7dd55..c001b1f2455f 100644
    --- a/fs/afs/server.c
    +++ b/fs/afs/server.c
    @@ -242,7 +242,7 @@ void afs_put_server(struct afs_server *server)
    spin_lock(&afs_server_graveyard_lock);
    if (atomic_read(&server->usage) == 0) {
    list_move_tail(&server->grave, &afs_server_graveyard);
    - server->time_of_death = get_seconds();
    + server->time_of_death = ktime_get_real_seconds();
    queue_delayed_work(afs_wq, &afs_server_reaper,
    afs_server_timeout * HZ);
    }
    @@ -277,9 +277,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;

    - now = get_seconds();
    + now = ktime_get_real_seconds();
    spin_lock(&afs_server_graveyard_lock);

    while (!list_empty(&afs_server_graveyard)) {
    diff --git a/fs/afs/vlocation.c b/fs/afs/vlocation.c
    index d7d8dd8c0b31..37b7c3b342a6 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;

    /* wait at least 10 minutes before updating... */
    - vl->update_at = get_seconds() + afs_vlocation_update_timeout;
    + vl->update_at = ktime_get_real_seconds() +
    + afs_vlocation_update_timeout;

    spin_lock(&afs_vlocation_updates_lock);

    @@ -506,7 +507,7 @@ void afs_put_vlocation(struct afs_vlocation *vl)
    if (atomic_read(&vl->usage) == 0) {
    _debug("buried");
    list_move_tail(&vl->grave, &afs_vlocation_graveyard);
    - vl->time_of_death = get_seconds();
    + vl->time_of_death = ktime_get_real_seconds();
    queue_delayed_work(afs_wq, &afs_vlocation_reap,
    afs_vlocation_timeout * HZ);

    @@ -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;

    _enter("");

    - now = get_seconds();
    + now = ktime_get_real_seconds();
    spin_lock(&afs_vlocation_graveyard_lock);

    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;

    _enter("");

    - now = get_seconds();
    + now = ktime_get_real_seconds();

    /* find a record to update */
    spin_lock(&afs_vlocation_updates_lock);
    @@ -684,7 +685,8 @@ static void afs_vlocation_updater(struct work_struct *work)

    /* and then reschedule */
    _debug("reschedule");
    - vl->update_at = get_seconds() + afs_vlocation_update_timeout;
    + vl->update_at = ktime_get_real_seconds() +
    + afs_vlocation_update_timeout;

    spin_lock(&afs_vlocation_updates_lock);

    \
     
     \ /
      Last update: 2017-03-09 20:01    [W:4.728 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site