Skip to content

Commit 473bd2d

Browse files
arndbidryomov
authored andcommitted
libceph: use timespec64 in for keepalive2 and ticket validity
ceph_con_keepalive_expired() is the last user of timespec_add() and some of the last uses of ktime_get_real_ts(). Replacing this with timespec64 based interfaces lets us remove that deprecated API. I'm introducing new ceph_encode_timespec64()/ceph_decode_timespec64() here that take timespec64 structures and convert to/from ceph_timespec, which is defined to have an unsigned 32-bit tv_sec member. This extends the range of valid times to year 2106, avoiding the year 2038 overflow. The ceph file system portion still uses the old functions for inode timestamps, this will be done separately after the VFS layer is converted. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
1 parent 67fcd15 commit 473bd2d

File tree

6 files changed

+40
-22
lines changed

6 files changed

+40
-22
lines changed

include/linux/ceph/decode.h

+19-1
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,26 @@ ceph_decode_skip_n(p, end, sizeof(u8), bad)
194194
} while (0)
195195

196196
/*
197-
* struct ceph_timespec <-> struct timespec
197+
* struct ceph_timespec <-> struct timespec64
198198
*/
199+
static inline void ceph_decode_timespec64(struct timespec64 *ts,
200+
const struct ceph_timespec *tv)
201+
{
202+
/*
203+
* This will still overflow in year 2106. We could extend
204+
* the protocol to steal two more bits from tv_nsec to
205+
* add three more 136 year epochs after that the way ext4
206+
* does if necessary.
207+
*/
208+
ts->tv_sec = (time64_t)le32_to_cpu(tv->tv_sec);
209+
ts->tv_nsec = (long)le32_to_cpu(tv->tv_nsec);
210+
}
211+
static inline void ceph_encode_timespec64(struct ceph_timespec *tv,
212+
const struct timespec64 *ts)
213+
{
214+
tv->tv_sec = cpu_to_le32((u32)ts->tv_sec);
215+
tv->tv_nsec = cpu_to_le32((u32)ts->tv_nsec);
216+
}
199217
static inline void ceph_decode_timespec(struct timespec *ts,
200218
const struct ceph_timespec *tv)
201219
{

include/linux/ceph/messenger.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ struct ceph_connection {
330330
int in_base_pos; /* bytes read */
331331
__le64 in_temp_ack; /* for reading an ack */
332332

333-
struct timespec last_keepalive_ack; /* keepalive2 ack stamp */
333+
struct timespec64 last_keepalive_ack; /* keepalive2 ack stamp */
334334

335335
struct delayed_work work; /* send|recv work */
336336
unsigned long delay; /* current delay interval */

net/ceph/auth_x.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,12 @@ static int process_one_ticket(struct ceph_auth_client *ac,
149149
void *dp, *dend;
150150
int dlen;
151151
char is_enc;
152-
struct timespec validity;
152+
struct timespec64 validity;
153153
void *tp, *tpend;
154154
void **ptp;
155155
struct ceph_crypto_key new_session_key = { 0 };
156156
struct ceph_buffer *new_ticket_blob;
157-
unsigned long new_expires, new_renew_after;
157+
time64_t new_expires, new_renew_after;
158158
u64 new_secret_id;
159159
int ret;
160160

@@ -189,11 +189,11 @@ static int process_one_ticket(struct ceph_auth_client *ac,
189189
if (ret)
190190
goto out;
191191

192-
ceph_decode_timespec(&validity, dp);
192+
ceph_decode_timespec64(&validity, dp);
193193
dp += sizeof(struct ceph_timespec);
194-
new_expires = get_seconds() + validity.tv_sec;
194+
new_expires = ktime_get_real_seconds() + validity.tv_sec;
195195
new_renew_after = new_expires - (validity.tv_sec / 4);
196-
dout(" expires=%lu renew_after=%lu\n", new_expires,
196+
dout(" expires=%llu renew_after=%llu\n", new_expires,
197197
new_renew_after);
198198

199199
/* ticket blob for service */
@@ -385,13 +385,13 @@ static bool need_key(struct ceph_x_ticket_handler *th)
385385
if (!th->have_key)
386386
return true;
387387

388-
return get_seconds() >= th->renew_after;
388+
return ktime_get_real_seconds() >= th->renew_after;
389389
}
390390

391391
static bool have_key(struct ceph_x_ticket_handler *th)
392392
{
393393
if (th->have_key) {
394-
if (get_seconds() >= th->expires)
394+
if (ktime_get_real_seconds() >= th->expires)
395395
th->have_key = false;
396396
}
397397

net/ceph/auth_x.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct ceph_x_ticket_handler {
2222
u64 secret_id;
2323
struct ceph_buffer *ticket_blob;
2424

25-
unsigned long renew_after, expires;
25+
time64_t renew_after, expires;
2626
};
2727

2828
#define CEPHX_AU_ENC_BUF_LEN 128 /* big enough for encrypted blob */

net/ceph/cls_lock_client.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ int ceph_cls_lock(struct ceph_osd_client *osdc,
3232
int desc_len = strlen(desc);
3333
void *p, *end;
3434
struct page *lock_op_page;
35-
struct timespec mtime;
35+
struct timespec64 mtime;
3636
int ret;
3737

3838
lock_op_buf_size = name_len + sizeof(__le32) +
@@ -63,7 +63,7 @@ int ceph_cls_lock(struct ceph_osd_client *osdc,
6363
ceph_encode_string(&p, end, desc, desc_len);
6464
/* only support infinite duration */
6565
memset(&mtime, 0, sizeof(mtime));
66-
ceph_encode_timespec(p, &mtime);
66+
ceph_encode_timespec64(p, &mtime);
6767
p += sizeof(struct ceph_timespec);
6868
ceph_encode_8(&p, flags);
6969

net/ceph/messenger.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -1417,11 +1417,11 @@ static void prepare_write_keepalive(struct ceph_connection *con)
14171417
dout("prepare_write_keepalive %p\n", con);
14181418
con_out_kvec_reset(con);
14191419
if (con->peer_features & CEPH_FEATURE_MSGR_KEEPALIVE2) {
1420-
struct timespec now;
1420+
struct timespec64 now;
14211421

1422-
ktime_get_real_ts(&now);
1422+
ktime_get_real_ts64(&now);
14231423
con_out_kvec_add(con, sizeof(tag_keepalive2), &tag_keepalive2);
1424-
ceph_encode_timespec(&con->out_temp_keepalive2, &now);
1424+
ceph_encode_timespec64(&con->out_temp_keepalive2, &now);
14251425
con_out_kvec_add(con, sizeof(con->out_temp_keepalive2),
14261426
&con->out_temp_keepalive2);
14271427
} else {
@@ -2555,7 +2555,7 @@ static int read_keepalive_ack(struct ceph_connection *con)
25552555
int ret = read_partial(con, size, size, &ceph_ts);
25562556
if (ret <= 0)
25572557
return ret;
2558-
ceph_decode_timespec(&con->last_keepalive_ack, &ceph_ts);
2558+
ceph_decode_timespec64(&con->last_keepalive_ack, &ceph_ts);
25592559
prepare_read_tag(con);
25602560
return 1;
25612561
}
@@ -3223,12 +3223,12 @@ bool ceph_con_keepalive_expired(struct ceph_connection *con,
32233223
{
32243224
if (interval > 0 &&
32253225
(con->peer_features & CEPH_FEATURE_MSGR_KEEPALIVE2)) {
3226-
struct timespec now;
3227-
struct timespec ts;
3228-
ktime_get_real_ts(&now);
3229-
jiffies_to_timespec(interval, &ts);
3230-
ts = timespec_add(con->last_keepalive_ack, ts);
3231-
return timespec_compare(&now, &ts) >= 0;
3226+
struct timespec64 now;
3227+
struct timespec64 ts;
3228+
ktime_get_real_ts64(&now);
3229+
jiffies_to_timespec64(interval, &ts);
3230+
ts = timespec64_add(con->last_keepalive_ack, ts);
3231+
return timespec64_compare(&now, &ts) >= 0;
32323232
}
32333233
return false;
32343234
}

0 commit comments

Comments
 (0)