Commit 56e71431 authored by Tina Ruchandani's avatar Tina Ruchandani Committed by David Howells

afs: Prevent callback expiry timer overflow

get_seconds() returns real wall-clock seconds. On 32-bit systems
this value will overflow in year 2038 and beyond. This patch changes
afs_vnode record to use ktime_get_real_seconds() instead, for the
fields cb_expires and cb_expires_at.
Signed-off-by: default avatarTina Ruchandani <ruchandani.tina@gmail.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 8a79790b
...@@ -145,7 +145,7 @@ static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode) ...@@ -145,7 +145,7 @@ static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode)
vnode->cb_version = ntohl(*bp++); vnode->cb_version = ntohl(*bp++);
vnode->cb_expiry = ntohl(*bp++); vnode->cb_expiry = ntohl(*bp++);
vnode->cb_type = ntohl(*bp++); vnode->cb_type = ntohl(*bp++);
vnode->cb_expires = vnode->cb_expiry + get_seconds(); vnode->cb_expires = vnode->cb_expiry + ktime_get_real_seconds();
*_bp = bp; *_bp = bp;
} }
......
...@@ -246,12 +246,13 @@ struct inode *afs_iget(struct super_block *sb, struct key *key, ...@@ -246,12 +246,13 @@ struct inode *afs_iget(struct super_block *sb, struct key *key,
vnode->cb_version = 0; vnode->cb_version = 0;
vnode->cb_expiry = 0; vnode->cb_expiry = 0;
vnode->cb_type = 0; vnode->cb_type = 0;
vnode->cb_expires = get_seconds(); vnode->cb_expires = ktime_get_real_seconds();
} else { } else {
vnode->cb_version = cb->version; vnode->cb_version = cb->version;
vnode->cb_expiry = cb->expiry; vnode->cb_expiry = cb->expiry;
vnode->cb_type = cb->type; vnode->cb_type = cb->type;
vnode->cb_expires = vnode->cb_expiry + get_seconds(); vnode->cb_expires = vnode->cb_expiry +
ktime_get_real_seconds();
} }
} }
...@@ -324,7 +325,7 @@ int afs_validate(struct afs_vnode *vnode, struct key *key) ...@@ -324,7 +325,7 @@ int afs_validate(struct afs_vnode *vnode, struct key *key)
!test_bit(AFS_VNODE_CB_BROKEN, &vnode->flags) && !test_bit(AFS_VNODE_CB_BROKEN, &vnode->flags) &&
!test_bit(AFS_VNODE_MODIFIED, &vnode->flags) && !test_bit(AFS_VNODE_MODIFIED, &vnode->flags) &&
!test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) { !test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) {
if (vnode->cb_expires < get_seconds() + 10) { if (vnode->cb_expires < ktime_get_real_seconds() + 10) {
_debug("callback expired"); _debug("callback expired");
set_bit(AFS_VNODE_CB_BROKEN, &vnode->flags); set_bit(AFS_VNODE_CB_BROKEN, &vnode->flags);
} else { } else {
......
...@@ -377,8 +377,8 @@ struct afs_vnode { ...@@ -377,8 +377,8 @@ struct afs_vnode {
struct rb_node server_rb; /* link in server->fs_vnodes */ struct rb_node server_rb; /* link in server->fs_vnodes */
struct rb_node cb_promise; /* link in server->cb_promises */ struct rb_node cb_promise; /* link in server->cb_promises */
struct work_struct cb_broken_work; /* work to be done on callback break */ struct work_struct cb_broken_work; /* work to be done on callback break */
time_t cb_expires; /* time at which callback expires */ time64_t cb_expires; /* time at which callback expires */
time_t cb_expires_at; /* time used to order cb_promise */ time64_t cb_expires_at; /* time used to order cb_promise */
unsigned cb_version; /* callback version */ unsigned cb_version; /* callback version */
unsigned cb_expiry; /* callback expiry time */ unsigned cb_expiry; /* callback expiry time */
afs_callback_type_t cb_type; /* type of callback */ afs_callback_type_t cb_type; /* type of callback */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment