diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r-- | fs/nfs/nfs4xdr.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index f6a1ea7df374..4b6613f61341 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -2326,6 +2326,22 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t | |||
2326 | return 0; | 2326 | return 0; |
2327 | } | 2327 | } |
2328 | 2328 | ||
2329 | static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid) | ||
2330 | { | ||
2331 | uint32_t *p; | ||
2332 | |||
2333 | *fileid = 0; | ||
2334 | if (unlikely(bitmap[1] & (FATTR4_WORD1_MOUNTED_ON_FILEID - 1U))) | ||
2335 | return -EIO; | ||
2336 | if (likely(bitmap[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)) { | ||
2337 | READ_BUF(8); | ||
2338 | READ64(*fileid); | ||
2339 | bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; | ||
2340 | } | ||
2341 | dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid); | ||
2342 | return 0; | ||
2343 | } | ||
2344 | |||
2329 | static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res) | 2345 | static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res) |
2330 | { | 2346 | { |
2331 | uint32_t *p; | 2347 | uint32_t *p; |
@@ -2983,6 +2999,7 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons | |||
2983 | bitmap[2] = {0}, | 2999 | bitmap[2] = {0}, |
2984 | type; | 3000 | type; |
2985 | int status, fmode = 0; | 3001 | int status, fmode = 0; |
3002 | uint64_t fileid; | ||
2986 | 3003 | ||
2987 | if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0) | 3004 | if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0) |
2988 | goto xdr_error; | 3005 | goto xdr_error; |
@@ -3032,6 +3049,10 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons | |||
3032 | goto xdr_error; | 3049 | goto xdr_error; |
3033 | if ((status = decode_attr_time_modify(xdr, bitmap, &fattr->mtime)) != 0) | 3050 | if ((status = decode_attr_time_modify(xdr, bitmap, &fattr->mtime)) != 0) |
3034 | goto xdr_error; | 3051 | goto xdr_error; |
3052 | if ((status = decode_attr_mounted_on_fileid(xdr, bitmap, &fileid)) != 0) | ||
3053 | goto xdr_error; | ||
3054 | if (fattr->fileid == 0 && fileid != 0) | ||
3055 | fattr->fileid = fileid; | ||
3035 | if ((status = verify_attr_len(xdr, savep, attrlen)) == 0) | 3056 | if ((status = verify_attr_len(xdr, savep, attrlen)) == 0) |
3036 | fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4; | 3057 | fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4; |
3037 | xdr_error: | 3058 | xdr_error: |