mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jamie Lokier <jamie@shareable.org>
To: Linus Torvalds <torvalds@osdl.org>,
	Neil Brown <neilb@cse.unsw.edu.au>,
	Trond Myklebust <trond.myklebust@fys.uio.no>,
	Andrew Morton <akpm@osdl.org>,
	linux-kernel@vger.kernel.org
Subject: [PATCH] (resent) Fix protocol bugs with NFS and nanoseconds
Date: Sat, 9 Aug 2003 21:08:40 +0100	[thread overview]
Message-ID: <20030809200840.GA30698@mail.jlokier.co.uk> (raw)
In-Reply-To: <20030809173546.GA29917@mail.jlokier.co.uk>

(Resent because osdl.com != osdl.org...)

NFS with 2.5.75 as both client and server is totally broken with GNU
Make.  Kernel builds fail.  The nanosecond field of timestamps of
newly touched files is often negative on the client, which is probably
why Make fails.  The value also bears no relation to the file's
nanosecond field on the server.

The culprit is htons() used where htonl() should be:

-	*p++ = htonl((u32) time->tv_sec); *p++ = htons(time->tv_nsec);
+	*p++ = htonl((u32) time->tv_sec); *p++ = htonl(time->tv_nsec);

The rest of this patch corrects nfsd to use microseconds in NFSv2, not
nanoseconds.  (The client already gets this right, but I have
optimised it slightly to avoid division when possible).

With this patch, kernel builds work again over NFSv3.  The NFSv2
fix is also tested.

Please apply.

Enjoy,
-- Jamie

diff -ur orig-2.5.75/fs/nfs/nfs2xdr.c laptop-2.5.75/fs/nfs/nfs2xdr.c
--- orig-2.5.75/fs/nfs/nfs2xdr.c	2003-07-08 21:40:56.000000000 +0100
+++ laptop-2.5.75/fs/nfs/nfs2xdr.c	2003-08-09 17:57:08.498827393 +0100
@@ -90,7 +90,7 @@
 {
 	*p++ = htonl(timep->tv_sec);
 	/* Convert nanoseconds into microseconds */
-	*p++ = htonl(timep->tv_nsec / 1000);
+	*p++ = htonl(timep->tv_nsec ? timep->tv_nsec / 1000 : 0);
 	return p;
 }
 
diff -ur orig-2.5.75/fs/nfsd/nfs3xdr.c laptop-2.5.75/fs/nfsd/nfs3xdr.c
--- orig-2.5.75/fs/nfsd/nfs3xdr.c	2003-07-08 21:55:24.000000000 +0100
+++ laptop-2.5.75/fs/nfsd/nfs3xdr.c	2003-08-09 17:59:34.416338758 +0100
@@ -4,6 +4,8 @@
  * XDR support for nfsd/protocol version 3.
  *
  * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
+ *
+ * 2003-08-09 Jamie Lokier: Use htonl() for nanoseconds, not htons()!
  */
 
 #include <linux/types.h>
@@ -43,7 +45,7 @@
 static inline u32 *
 encode_time3(u32 *p, struct timespec *time)
 {
-	*p++ = htonl((u32) time->tv_sec); *p++ = htons(time->tv_nsec);
+	*p++ = htonl((u32) time->tv_sec); *p++ = htonl(time->tv_nsec);
 	return p;
 }
 
diff -ur orig-2.5.75/fs/nfsd/nfsxdr.c laptop-2.5.75/fs/nfsd/nfsxdr.c
--- orig-2.5.75/fs/nfsd/nfsxdr.c	2003-07-08 21:54:20.000000000 +0100
+++ laptop-2.5.75/fs/nfsd/nfsxdr.c	2003-08-09 17:57:52.963829023 +0100
@@ -123,13 +123,13 @@
 	if (tmp != (u32)-1 && tmp1 != (u32)-1) {
 		iap->ia_valid |= ATTR_ATIME | ATTR_ATIME_SET;
 		iap->ia_atime.tv_sec = tmp;
-		iap->ia_atime.tv_nsec = tmp1; 
+		iap->ia_atime.tv_nsec = tmp1 * 1000; 
 	}
 	tmp  = ntohl(*p++); tmp1 = ntohl(*p++);
 	if (tmp != (u32)-1 && tmp1 != (u32)-1) {
 		iap->ia_valid |= ATTR_MTIME | ATTR_MTIME_SET;
 		iap->ia_mtime.tv_sec = tmp;
-		iap->ia_mtime.tv_nsec = tmp1; 
+		iap->ia_mtime.tv_nsec = tmp1 * 1000; 
 	}
 	return p;
 }
@@ -171,12 +171,12 @@
 		*p++ = htonl((u32) stat.dev);
 	*p++ = htonl((u32) stat.ino);
 	*p++ = htonl((u32) stat.atime.tv_sec);
-	*p++ = htons(stat.atime.tv_nsec);
+	*p++ = htonl(stat.atime.tv_nsec ? stat.atime.tv_nsec / 1000 : 0);
 	lease_get_mtime(dentry->d_inode, &time); 
 	*p++ = htonl((u32) time.tv_sec);
-	*p++ = htons(time.tv_nsec); 
+	*p++ = htonl(time.tv_nsec ? time.tv_nsec / 1000 : 0); 
 	*p++ = htonl((u32) stat.ctime.tv_sec);
-	*p++ = htons(stat.ctime.tv_nsec);
+	*p++ = htonl(stat.ctime.tv_nsec ? stat.ctime.tv_nsec / 1000 : 0);
 
 	return p;
 }

      reply	other threads:[~2003-08-09 20:08 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-08-09 17:35 [PATCH] " Jamie Lokier
2003-08-09 20:08 ` Jamie Lokier [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20030809200840.GA30698@mail.jlokier.co.uk \
    --to=jamie@shareable.org \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=neilb@cse.unsw.edu.au \
    --cc=torvalds@osdl.org \
    --cc=trond.myklebust@fys.uio.no \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®