diff options
-rw-r--r-- | fs/nfs/nfs3xdr.c | 111 |
1 files changed, 55 insertions, 56 deletions
diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index b0af263e4db9..119844d0b4d5 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c | |||
@@ -167,14 +167,6 @@ out_overflow: | |||
167 | * Encode/decode time. | 167 | * Encode/decode time. |
168 | */ | 168 | */ |
169 | static inline __be32 * | 169 | static inline __be32 * |
170 | xdr_encode_time3(__be32 *p, const struct timespec *timep) | ||
171 | { | ||
172 | *p++ = htonl(timep->tv_sec); | ||
173 | *p++ = htonl(timep->tv_nsec); | ||
174 | return p; | ||
175 | } | ||
176 | |||
177 | static inline __be32 * | ||
178 | xdr_decode_time3(__be32 *p, struct timespec *timep) | 170 | xdr_decode_time3(__be32 *p, struct timespec *timep) |
179 | { | 171 | { |
180 | timep->tv_sec = ntohl(*p++); | 172 | timep->tv_sec = ntohl(*p++); |
@@ -219,52 +211,6 @@ xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr) | |||
219 | } | 211 | } |
220 | 212 | ||
221 | static inline __be32 * | 213 | static inline __be32 * |
222 | xdr_encode_sattr(__be32 *p, const struct iattr *attr) | ||
223 | { | ||
224 | if (attr->ia_valid & ATTR_MODE) { | ||
225 | *p++ = xdr_one; | ||
226 | *p++ = htonl(attr->ia_mode & S_IALLUGO); | ||
227 | } else { | ||
228 | *p++ = xdr_zero; | ||
229 | } | ||
230 | if (attr->ia_valid & ATTR_UID) { | ||
231 | *p++ = xdr_one; | ||
232 | *p++ = htonl(attr->ia_uid); | ||
233 | } else { | ||
234 | *p++ = xdr_zero; | ||
235 | } | ||
236 | if (attr->ia_valid & ATTR_GID) { | ||
237 | *p++ = xdr_one; | ||
238 | *p++ = htonl(attr->ia_gid); | ||
239 | } else { | ||
240 | *p++ = xdr_zero; | ||
241 | } | ||
242 | if (attr->ia_valid & ATTR_SIZE) { | ||
243 | *p++ = xdr_one; | ||
244 | p = xdr_encode_hyper(p, (__u64) attr->ia_size); | ||
245 | } else { | ||
246 | *p++ = xdr_zero; | ||
247 | } | ||
248 | if (attr->ia_valid & ATTR_ATIME_SET) { | ||
249 | *p++ = xdr_two; | ||
250 | p = xdr_encode_time3(p, &attr->ia_atime); | ||
251 | } else if (attr->ia_valid & ATTR_ATIME) { | ||
252 | *p++ = xdr_one; | ||
253 | } else { | ||
254 | *p++ = xdr_zero; | ||
255 | } | ||
256 | if (attr->ia_valid & ATTR_MTIME_SET) { | ||
257 | *p++ = xdr_two; | ||
258 | p = xdr_encode_time3(p, &attr->ia_mtime); | ||
259 | } else if (attr->ia_valid & ATTR_MTIME) { | ||
260 | *p++ = xdr_one; | ||
261 | } else { | ||
262 | *p++ = xdr_zero; | ||
263 | } | ||
264 | return p; | ||
265 | } | ||
266 | |||
267 | static inline __be32 * | ||
268 | xdr_decode_wcc_attr(__be32 *p, struct nfs_fattr *fattr) | 214 | xdr_decode_wcc_attr(__be32 *p, struct nfs_fattr *fattr) |
269 | { | 215 | { |
270 | p = xdr_decode_hyper(p, &fattr->pre_size); | 216 | p = xdr_decode_hyper(p, &fattr->pre_size); |
@@ -453,6 +399,21 @@ static void encode_nfs_fh3(struct xdr_stream *xdr, const struct nfs_fh *fh) | |||
453 | } | 399 | } |
454 | 400 | ||
455 | /* | 401 | /* |
402 | * nfstime3 | ||
403 | * | ||
404 | * struct nfstime3 { | ||
405 | * uint32 seconds; | ||
406 | * uint32 nseconds; | ||
407 | * }; | ||
408 | */ | ||
409 | static __be32 *xdr_encode_nfstime3(__be32 *p, const struct timespec *timep) | ||
410 | { | ||
411 | *p++ = cpu_to_be32(timep->tv_sec); | ||
412 | *p++ = cpu_to_be32(timep->tv_nsec); | ||
413 | return p; | ||
414 | } | ||
415 | |||
416 | /* | ||
456 | * sattr3 | 417 | * sattr3 |
457 | * | 418 | * |
458 | * enum time_how { | 419 | * enum time_how { |
@@ -538,7 +499,45 @@ static void encode_sattr3(struct xdr_stream *xdr, const struct iattr *attr) | |||
538 | nbytes += 8; | 499 | nbytes += 8; |
539 | p = xdr_reserve_space(xdr, nbytes); | 500 | p = xdr_reserve_space(xdr, nbytes); |
540 | 501 | ||
541 | xdr_encode_sattr(p, attr); | 502 | if (attr->ia_valid & ATTR_MODE) { |
503 | *p++ = xdr_one; | ||
504 | *p++ = cpu_to_be32(attr->ia_mode & S_IALLUGO); | ||
505 | } else | ||
506 | *p++ = xdr_zero; | ||
507 | |||
508 | if (attr->ia_valid & ATTR_UID) { | ||
509 | *p++ = xdr_one; | ||
510 | *p++ = cpu_to_be32(attr->ia_uid); | ||
511 | } else | ||
512 | *p++ = xdr_zero; | ||
513 | |||
514 | if (attr->ia_valid & ATTR_GID) { | ||
515 | *p++ = xdr_one; | ||
516 | *p++ = cpu_to_be32(attr->ia_gid); | ||
517 | } else | ||
518 | *p++ = xdr_zero; | ||
519 | |||
520 | if (attr->ia_valid & ATTR_SIZE) { | ||
521 | *p++ = xdr_one; | ||
522 | p = xdr_encode_hyper(p, (u64)attr->ia_size); | ||
523 | } else | ||
524 | *p++ = xdr_zero; | ||
525 | |||
526 | if (attr->ia_valid & ATTR_ATIME_SET) { | ||
527 | *p++ = xdr_two; | ||
528 | p = xdr_encode_nfstime3(p, &attr->ia_atime); | ||
529 | } else if (attr->ia_valid & ATTR_ATIME) { | ||
530 | *p++ = xdr_one; | ||
531 | } else | ||
532 | *p++ = xdr_zero; | ||
533 | |||
534 | if (attr->ia_valid & ATTR_MTIME_SET) { | ||
535 | *p++ = xdr_two; | ||
536 | xdr_encode_nfstime3(p, &attr->ia_mtime); | ||
537 | } else if (attr->ia_valid & ATTR_MTIME) { | ||
538 | *p = xdr_one; | ||
539 | } else | ||
540 | *p = xdr_zero; | ||
542 | } | 541 | } |
543 | 542 | ||
544 | /* | 543 | /* |
@@ -605,7 +604,7 @@ static void encode_sattrguard3(struct xdr_stream *xdr, | |||
605 | if (args->guard) { | 604 | if (args->guard) { |
606 | p = xdr_reserve_space(xdr, 4 + 8); | 605 | p = xdr_reserve_space(xdr, 4 + 8); |
607 | *p++ = xdr_one; | 606 | *p++ = xdr_one; |
608 | xdr_encode_time3(p, &args->guardtime); | 607 | xdr_encode_nfstime3(p, &args->guardtime); |
609 | } else { | 608 | } else { |
610 | p = xdr_reserve_space(xdr, 4); | 609 | p = xdr_reserve_space(xdr, 4); |
611 | *p = xdr_zero; | 610 | *p = xdr_zero; |