[PATCH] net/sunrpc: fix time conversion error

From: Nishanth Aravamudan
Date: Mon Aug 01 2005 - 17:58:02 EST


On 01.08.2005 [15:11:48 -0600], Josip Loncaric wrote:
> Line 589 of linux-2.6.11.10/net/sunrpc/svcsock.c is obviously wrong:
>
> skb->stamp.tv_usec = xtime.tv_nsec * 1000;
>
> To convert nsec to usec, one should divide instead of multiplying:
>
> skb->stamp.tv_usec = xtime.tv_nsec / 1000;
>
> The same bug could be present in the latest kernels, although I haven't
> checked. This bug makes svc_udp_recvfrom() timestamps incorrect.

Agreed, the conversion is wrong. I think the code is buggy period, as it
accesses xtime without grabbing the xtime_lock first. Following patch
should fix both issues.

Description: This function incorrectly multiplies a nanosecond value by
1000, instead of dividing by 1000, to obtain a corresponding microsecond
value. Fix the math. Also, the function incorrectly accesses xtime
without using the xtime_lock. Fixed as well. Patch is compile-tested.

Signed-off-by: Nishanth Aravamudan <nacc@xxxxxxxxxx>

---

svcsock.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)

--- 2.6.13-rc4/net/sunrpc/svcsock.c 2005-07-29 14:11:50.000000000 -0700
+++ 2.6.13-rc4-dev/net/sunrpc/svcsock.c 2005-08-01 15:51:11.000000000 -0700
@@ -559,6 +559,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
struct svc_serv *serv = svsk->sk_server;
struct sk_buff *skb;
int err, len;
+ unsigned long seq;

if (test_and_clear_bit(SK_CHNGBUF, &svsk->sk_flags))
/* udp sockets need large rcvbuf as all pending
@@ -585,8 +586,11 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
dprintk("svc: recvfrom returned error %d\n", -err);
}
if (skb->stamp.tv_sec == 0) {
- skb->stamp.tv_sec = xtime.tv_sec;
- skb->stamp.tv_usec = xtime.tv_nsec * 1000;
+ do {
+ seq = read_seqbegin(&xtime_lock);
+ skb->stamp.tv_sec = xtime.tv_sec;
+ skb->stamp.tv_usec = xtime.tv_nsec / 1000;
+ } while (read_seqretry(&xtime_lock, seq));
/* Don't enable netstamp, sunrpc doesn't
need that much accuracy */
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/