diff options
Diffstat (limited to 'fs/nfs/nfs2xdr.c')
| -rw-r--r-- | fs/nfs/nfs2xdr.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c index f0015fa876e1..b49501fc0a79 100644 --- a/fs/nfs/nfs2xdr.c +++ b/fs/nfs/nfs2xdr.c | |||
| @@ -23,12 +23,11 @@ | |||
| 23 | #include <linux/nfs.h> | 23 | #include <linux/nfs.h> |
| 24 | #include <linux/nfs2.h> | 24 | #include <linux/nfs2.h> |
| 25 | #include <linux/nfs_fs.h> | 25 | #include <linux/nfs_fs.h> |
| 26 | #include "internal.h" | ||
| 26 | 27 | ||
| 27 | #define NFSDBG_FACILITY NFSDBG_XDR | 28 | #define NFSDBG_FACILITY NFSDBG_XDR |
| 28 | /* #define NFS_PARANOIA 1 */ | 29 | /* #define NFS_PARANOIA 1 */ |
| 29 | 30 | ||
| 30 | extern int nfs_stat_to_errno(int stat); | ||
| 31 | |||
| 32 | /* Mapping from NFS error code to "errno" error code. */ | 31 | /* Mapping from NFS error code to "errno" error code. */ |
| 33 | #define errno_NFSERR_IO EIO | 32 | #define errno_NFSERR_IO EIO |
| 34 | 33 | ||
| @@ -52,7 +51,7 @@ extern int nfs_stat_to_errno(int stat); | |||
| 52 | #define NFS_createargs_sz (NFS_diropargs_sz+NFS_sattr_sz) | 51 | #define NFS_createargs_sz (NFS_diropargs_sz+NFS_sattr_sz) |
| 53 | #define NFS_renameargs_sz (NFS_diropargs_sz+NFS_diropargs_sz) | 52 | #define NFS_renameargs_sz (NFS_diropargs_sz+NFS_diropargs_sz) |
| 54 | #define NFS_linkargs_sz (NFS_fhandle_sz+NFS_diropargs_sz) | 53 | #define NFS_linkargs_sz (NFS_fhandle_sz+NFS_diropargs_sz) |
| 55 | #define NFS_symlinkargs_sz (NFS_diropargs_sz+NFS_path_sz+NFS_sattr_sz) | 54 | #define NFS_symlinkargs_sz (NFS_diropargs_sz+1+NFS_sattr_sz) |
| 56 | #define NFS_readdirargs_sz (NFS_fhandle_sz+2) | 55 | #define NFS_readdirargs_sz (NFS_fhandle_sz+2) |
| 57 | 56 | ||
| 58 | #define NFS_attrstat_sz (1+NFS_fattr_sz) | 57 | #define NFS_attrstat_sz (1+NFS_fattr_sz) |
| @@ -131,7 +130,8 @@ xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr) | |||
| 131 | fattr->du.nfs2.blocksize = ntohl(*p++); | 130 | fattr->du.nfs2.blocksize = ntohl(*p++); |
| 132 | rdev = ntohl(*p++); | 131 | rdev = ntohl(*p++); |
| 133 | fattr->du.nfs2.blocks = ntohl(*p++); | 132 | fattr->du.nfs2.blocks = ntohl(*p++); |
| 134 | fattr->fsid_u.nfs3 = ntohl(*p++); | 133 | fattr->fsid.major = ntohl(*p++); |
| 134 | fattr->fsid.minor = 0; | ||
| 135 | fattr->fileid = ntohl(*p++); | 135 | fattr->fileid = ntohl(*p++); |
| 136 | p = xdr_decode_time(p, &fattr->atime); | 136 | p = xdr_decode_time(p, &fattr->atime); |
| 137 | p = xdr_decode_time(p, &fattr->mtime); | 137 | p = xdr_decode_time(p, &fattr->mtime); |
| @@ -351,11 +351,26 @@ nfs_xdr_linkargs(struct rpc_rqst *req, u32 *p, struct nfs_linkargs *args) | |||
| 351 | static int | 351 | static int |
| 352 | nfs_xdr_symlinkargs(struct rpc_rqst *req, u32 *p, struct nfs_symlinkargs *args) | 352 | nfs_xdr_symlinkargs(struct rpc_rqst *req, u32 *p, struct nfs_symlinkargs *args) |
| 353 | { | 353 | { |
| 354 | struct xdr_buf *sndbuf = &req->rq_snd_buf; | ||
| 355 | size_t pad; | ||
| 356 | |||
| 354 | p = xdr_encode_fhandle(p, args->fromfh); | 357 | p = xdr_encode_fhandle(p, args->fromfh); |
| 355 | p = xdr_encode_array(p, args->fromname, args->fromlen); | 358 | p = xdr_encode_array(p, args->fromname, args->fromlen); |
| 356 | p = xdr_encode_array(p, args->topath, args->tolen); | 359 | *p++ = htonl(args->pathlen); |
| 360 | sndbuf->len = xdr_adjust_iovec(sndbuf->head, p); | ||
| 361 | |||
| 362 | xdr_encode_pages(sndbuf, args->pages, 0, args->pathlen); | ||
| 363 | |||
| 364 | /* | ||
| 365 | * xdr_encode_pages may have added a few bytes to ensure the | ||
| 366 | * pathname ends on a 4-byte boundary. Start encoding the | ||
| 367 | * attributes after the pad bytes. | ||
| 368 | */ | ||
| 369 | pad = sndbuf->tail->iov_len; | ||
| 370 | if (pad > 0) | ||
| 371 | p++; | ||
| 357 | p = xdr_encode_sattr(p, args->sattr); | 372 | p = xdr_encode_sattr(p, args->sattr); |
| 358 | req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); | 373 | sndbuf->len += xdr_adjust_iovec(sndbuf->tail, p) - pad; |
| 359 | return 0; | 374 | return 0; |
| 360 | } | 375 | } |
| 361 | 376 | ||
