aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/nfs2xdr.c59
1 files changed, 33 insertions, 26 deletions
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
index f5ea9dcf08d6..c79977304af8 100644
--- a/fs/nfs/nfs2xdr.c
+++ b/fs/nfs/nfs2xdr.c
@@ -91,32 +91,6 @@ xdr_decode_fhandle(__be32 *p, struct nfs_fh *fhandle)
91} 91}
92 92
93static inline __be32* 93static inline __be32*
94xdr_encode_time(__be32 *p, const struct timespec *timep)
95{
96 *p++ = htonl(timep->tv_sec);
97 /* Convert nanoseconds into microseconds */
98 *p++ = htonl(timep->tv_nsec ? timep->tv_nsec / 1000 : 0);
99 return p;
100}
101
102static inline __be32*
103xdr_encode_current_server_time(__be32 *p, const struct timespec *timep)
104{
105 /*
106 * Passing the invalid value useconds=1000000 is a
107 * Sun convention for "set to current server time".
108 * It's needed to make permissions checks for the
109 * "touch" program across v2 mounts to Solaris and
110 * Irix boxes work correctly. See description of
111 * sattr in section 6.1 of "NFS Illustrated" by
112 * Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5
113 */
114 *p++ = htonl(timep->tv_sec);
115 *p++ = htonl(1000000);
116 return p;
117}
118
119static inline __be32*
120xdr_decode_time(__be32 *p, struct timespec *timep) 94xdr_decode_time(__be32 *p, struct timespec *timep)
121{ 95{
122 timep->tv_sec = ntohl(*p++); 96 timep->tv_sec = ntohl(*p++);
@@ -179,6 +153,39 @@ static void encode_fhandle(struct xdr_stream *xdr, const struct nfs_fh *fh)
179} 153}
180 154
181/* 155/*
156 * 2.3.4. timeval
157 *
158 * struct timeval {
159 * unsigned int seconds;
160 * unsigned int useconds;
161 * };
162 */
163static __be32 *xdr_encode_time(__be32 *p, const struct timespec *timep)
164{
165 *p++ = cpu_to_be32(timep->tv_sec);
166 if (timep->tv_nsec != 0)
167 *p++ = cpu_to_be32(timep->tv_nsec / NSEC_PER_USEC);
168 else
169 *p++ = cpu_to_be32(0);
170 return p;
171}
172
173/*
174 * Passing the invalid value useconds=1000000 is a Sun convention for
175 * "set to current server time". It's needed to make permissions checks
176 * for the "touch" program across v2 mounts to Solaris and Irix servers
177 * work correctly. See description of sattr in section 6.1 of "NFS
178 * Illustrated" by Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5.
179 */
180static __be32 *xdr_encode_current_server_time(__be32 *p,
181 const struct timespec *timep)
182{
183 *p++ = cpu_to_be32(timep->tv_sec);
184 *p++ = cpu_to_be32(1000000);
185 return p;
186}
187
188/*
182 * 2.3.6. sattr 189 * 2.3.6. sattr
183 * 190 *
184 * struct sattr { 191 * struct sattr {