diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r-- | fs/nfs/nfs4xdr.c | 1435 |
1 files changed, 673 insertions, 762 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 9f1826b012e6..4e2c168b6ee9 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -71,8 +71,8 @@ static int nfs4_stat_to_errno(int); | |||
71 | /* lock,open owner id: | 71 | /* lock,open owner id: |
72 | * we currently use size 2 (u64) out of (NFS4_OPAQUE_LIMIT >> 2) | 72 | * we currently use size 2 (u64) out of (NFS4_OPAQUE_LIMIT >> 2) |
73 | */ | 73 | */ |
74 | #define open_owner_id_maxsz (1 + 4) | 74 | #define open_owner_id_maxsz (1 + 1 + 4) |
75 | #define lock_owner_id_maxsz (1 + 4) | 75 | #define lock_owner_id_maxsz (1 + 1 + 4) |
76 | #define decode_lockowner_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ)) | 76 | #define decode_lockowner_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ)) |
77 | #define compound_encode_hdr_maxsz (3 + (NFS4_MAXTAGLEN >> 2)) | 77 | #define compound_encode_hdr_maxsz (3 + (NFS4_MAXTAGLEN >> 2)) |
78 | #define compound_decode_hdr_maxsz (3 + (NFS4_MAXTAGLEN >> 2)) | 78 | #define compound_decode_hdr_maxsz (3 + (NFS4_MAXTAGLEN >> 2)) |
@@ -1088,10 +1088,11 @@ static void encode_lockowner(struct xdr_stream *xdr, const struct nfs_lowner *lo | |||
1088 | { | 1088 | { |
1089 | __be32 *p; | 1089 | __be32 *p; |
1090 | 1090 | ||
1091 | p = reserve_space(xdr, 28); | 1091 | p = reserve_space(xdr, 32); |
1092 | p = xdr_encode_hyper(p, lowner->clientid); | 1092 | p = xdr_encode_hyper(p, lowner->clientid); |
1093 | *p++ = cpu_to_be32(16); | 1093 | *p++ = cpu_to_be32(20); |
1094 | p = xdr_encode_opaque_fixed(p, "lock id:", 8); | 1094 | p = xdr_encode_opaque_fixed(p, "lock id:", 8); |
1095 | *p++ = cpu_to_be32(lowner->s_dev); | ||
1095 | xdr_encode_hyper(p, lowner->id); | 1096 | xdr_encode_hyper(p, lowner->id); |
1096 | } | 1097 | } |
1097 | 1098 | ||
@@ -1210,10 +1211,11 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena | |||
1210 | *p++ = cpu_to_be32(OP_OPEN); | 1211 | *p++ = cpu_to_be32(OP_OPEN); |
1211 | *p = cpu_to_be32(arg->seqid->sequence->counter); | 1212 | *p = cpu_to_be32(arg->seqid->sequence->counter); |
1212 | encode_share_access(xdr, arg->fmode); | 1213 | encode_share_access(xdr, arg->fmode); |
1213 | p = reserve_space(xdr, 28); | 1214 | p = reserve_space(xdr, 32); |
1214 | p = xdr_encode_hyper(p, arg->clientid); | 1215 | p = xdr_encode_hyper(p, arg->clientid); |
1215 | *p++ = cpu_to_be32(16); | 1216 | *p++ = cpu_to_be32(20); |
1216 | p = xdr_encode_opaque_fixed(p, "open id:", 8); | 1217 | p = xdr_encode_opaque_fixed(p, "open id:", 8); |
1218 | *p++ = cpu_to_be32(arg->server->s_dev); | ||
1217 | xdr_encode_hyper(p, arg->id); | 1219 | xdr_encode_hyper(p, arg->id); |
1218 | } | 1220 | } |
1219 | 1221 | ||
@@ -1510,7 +1512,7 @@ encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr) | |||
1510 | hdr->replen += decode_restorefh_maxsz; | 1512 | hdr->replen += decode_restorefh_maxsz; |
1511 | } | 1513 | } |
1512 | 1514 | ||
1513 | static int | 1515 | static void |
1514 | encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compound_hdr *hdr) | 1516 | encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compound_hdr *hdr) |
1515 | { | 1517 | { |
1516 | __be32 *p; | 1518 | __be32 *p; |
@@ -1521,14 +1523,12 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compoun | |||
1521 | p = reserve_space(xdr, 2*4); | 1523 | p = reserve_space(xdr, 2*4); |
1522 | *p++ = cpu_to_be32(1); | 1524 | *p++ = cpu_to_be32(1); |
1523 | *p = cpu_to_be32(FATTR4_WORD0_ACL); | 1525 | *p = cpu_to_be32(FATTR4_WORD0_ACL); |
1524 | if (arg->acl_len % 4) | 1526 | BUG_ON(arg->acl_len % 4); |
1525 | return -EINVAL; | ||
1526 | p = reserve_space(xdr, 4); | 1527 | p = reserve_space(xdr, 4); |
1527 | *p = cpu_to_be32(arg->acl_len); | 1528 | *p = cpu_to_be32(arg->acl_len); |
1528 | xdr_write_pages(xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); | 1529 | xdr_write_pages(xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); |
1529 | hdr->nops++; | 1530 | hdr->nops++; |
1530 | hdr->replen += decode_setacl_maxsz; | 1531 | hdr->replen += decode_setacl_maxsz; |
1531 | return 0; | ||
1532 | } | 1532 | } |
1533 | 1533 | ||
1534 | static void | 1534 | static void |
@@ -1789,7 +1789,6 @@ encode_layoutget(struct xdr_stream *xdr, | |||
1789 | const struct nfs4_layoutget_args *args, | 1789 | const struct nfs4_layoutget_args *args, |
1790 | struct compound_hdr *hdr) | 1790 | struct compound_hdr *hdr) |
1791 | { | 1791 | { |
1792 | nfs4_stateid stateid; | ||
1793 | __be32 *p; | 1792 | __be32 *p; |
1794 | 1793 | ||
1795 | p = reserve_space(xdr, 44 + NFS4_STATEID_SIZE); | 1794 | p = reserve_space(xdr, 44 + NFS4_STATEID_SIZE); |
@@ -1800,9 +1799,7 @@ encode_layoutget(struct xdr_stream *xdr, | |||
1800 | p = xdr_encode_hyper(p, args->range.offset); | 1799 | p = xdr_encode_hyper(p, args->range.offset); |
1801 | p = xdr_encode_hyper(p, args->range.length); | 1800 | p = xdr_encode_hyper(p, args->range.length); |
1802 | p = xdr_encode_hyper(p, args->minlength); | 1801 | p = xdr_encode_hyper(p, args->minlength); |
1803 | pnfs_get_layout_stateid(&stateid, NFS_I(args->inode)->layout, | 1802 | p = xdr_encode_opaque_fixed(p, &args->stateid.data, NFS4_STATEID_SIZE); |
1804 | args->ctx->state); | ||
1805 | p = xdr_encode_opaque_fixed(p, &stateid.data, NFS4_STATEID_SIZE); | ||
1806 | *p = cpu_to_be32(args->maxcount); | 1803 | *p = cpu_to_be32(args->maxcount); |
1807 | 1804 | ||
1808 | dprintk("%s: 1st type:0x%x iomode:%d off:%lu len:%lu mc:%d\n", | 1805 | dprintk("%s: 1st type:0x%x iomode:%d off:%lu len:%lu mc:%d\n", |
@@ -1833,393 +1830,362 @@ static u32 nfs4_xdr_minorversion(const struct nfs4_sequence_args *args) | |||
1833 | /* | 1830 | /* |
1834 | * Encode an ACCESS request | 1831 | * Encode an ACCESS request |
1835 | */ | 1832 | */ |
1836 | static int nfs4_xdr_enc_access(struct rpc_rqst *req, __be32 *p, const struct nfs4_accessargs *args) | 1833 | static void nfs4_xdr_enc_access(struct rpc_rqst *req, struct xdr_stream *xdr, |
1834 | const struct nfs4_accessargs *args) | ||
1837 | { | 1835 | { |
1838 | struct xdr_stream xdr; | ||
1839 | struct compound_hdr hdr = { | 1836 | struct compound_hdr hdr = { |
1840 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1837 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1841 | }; | 1838 | }; |
1842 | 1839 | ||
1843 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1840 | encode_compound_hdr(xdr, req, &hdr); |
1844 | encode_compound_hdr(&xdr, req, &hdr); | 1841 | encode_sequence(xdr, &args->seq_args, &hdr); |
1845 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1842 | encode_putfh(xdr, args->fh, &hdr); |
1846 | encode_putfh(&xdr, args->fh, &hdr); | 1843 | encode_access(xdr, args->access, &hdr); |
1847 | encode_access(&xdr, args->access, &hdr); | 1844 | encode_getfattr(xdr, args->bitmask, &hdr); |
1848 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1849 | encode_nops(&hdr); | 1845 | encode_nops(&hdr); |
1850 | return 0; | ||
1851 | } | 1846 | } |
1852 | 1847 | ||
1853 | /* | 1848 | /* |
1854 | * Encode LOOKUP request | 1849 | * Encode LOOKUP request |
1855 | */ | 1850 | */ |
1856 | static int nfs4_xdr_enc_lookup(struct rpc_rqst *req, __be32 *p, const struct nfs4_lookup_arg *args) | 1851 | static void nfs4_xdr_enc_lookup(struct rpc_rqst *req, struct xdr_stream *xdr, |
1852 | const struct nfs4_lookup_arg *args) | ||
1857 | { | 1853 | { |
1858 | struct xdr_stream xdr; | ||
1859 | struct compound_hdr hdr = { | 1854 | struct compound_hdr hdr = { |
1860 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1855 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1861 | }; | 1856 | }; |
1862 | 1857 | ||
1863 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1858 | encode_compound_hdr(xdr, req, &hdr); |
1864 | encode_compound_hdr(&xdr, req, &hdr); | 1859 | encode_sequence(xdr, &args->seq_args, &hdr); |
1865 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1860 | encode_putfh(xdr, args->dir_fh, &hdr); |
1866 | encode_putfh(&xdr, args->dir_fh, &hdr); | 1861 | encode_lookup(xdr, args->name, &hdr); |
1867 | encode_lookup(&xdr, args->name, &hdr); | 1862 | encode_getfh(xdr, &hdr); |
1868 | encode_getfh(&xdr, &hdr); | 1863 | encode_getfattr(xdr, args->bitmask, &hdr); |
1869 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1870 | encode_nops(&hdr); | 1864 | encode_nops(&hdr); |
1871 | return 0; | ||
1872 | } | 1865 | } |
1873 | 1866 | ||
1874 | /* | 1867 | /* |
1875 | * Encode LOOKUP_ROOT request | 1868 | * Encode LOOKUP_ROOT request |
1876 | */ | 1869 | */ |
1877 | static int nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, __be32 *p, const struct nfs4_lookup_root_arg *args) | 1870 | static void nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, |
1871 | struct xdr_stream *xdr, | ||
1872 | const struct nfs4_lookup_root_arg *args) | ||
1878 | { | 1873 | { |
1879 | struct xdr_stream xdr; | ||
1880 | struct compound_hdr hdr = { | 1874 | struct compound_hdr hdr = { |
1881 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1875 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1882 | }; | 1876 | }; |
1883 | 1877 | ||
1884 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1878 | encode_compound_hdr(xdr, req, &hdr); |
1885 | encode_compound_hdr(&xdr, req, &hdr); | 1879 | encode_sequence(xdr, &args->seq_args, &hdr); |
1886 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1880 | encode_putrootfh(xdr, &hdr); |
1887 | encode_putrootfh(&xdr, &hdr); | 1881 | encode_getfh(xdr, &hdr); |
1888 | encode_getfh(&xdr, &hdr); | 1882 | encode_getfattr(xdr, args->bitmask, &hdr); |
1889 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1890 | encode_nops(&hdr); | 1883 | encode_nops(&hdr); |
1891 | return 0; | ||
1892 | } | 1884 | } |
1893 | 1885 | ||
1894 | /* | 1886 | /* |
1895 | * Encode REMOVE request | 1887 | * Encode REMOVE request |
1896 | */ | 1888 | */ |
1897 | static int nfs4_xdr_enc_remove(struct rpc_rqst *req, __be32 *p, const struct nfs_removeargs *args) | 1889 | static void nfs4_xdr_enc_remove(struct rpc_rqst *req, struct xdr_stream *xdr, |
1890 | const struct nfs_removeargs *args) | ||
1898 | { | 1891 | { |
1899 | struct xdr_stream xdr; | ||
1900 | struct compound_hdr hdr = { | 1892 | struct compound_hdr hdr = { |
1901 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1893 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1902 | }; | 1894 | }; |
1903 | 1895 | ||
1904 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1896 | encode_compound_hdr(xdr, req, &hdr); |
1905 | encode_compound_hdr(&xdr, req, &hdr); | 1897 | encode_sequence(xdr, &args->seq_args, &hdr); |
1906 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1898 | encode_putfh(xdr, args->fh, &hdr); |
1907 | encode_putfh(&xdr, args->fh, &hdr); | 1899 | encode_remove(xdr, &args->name, &hdr); |
1908 | encode_remove(&xdr, &args->name, &hdr); | 1900 | encode_getfattr(xdr, args->bitmask, &hdr); |
1909 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1910 | encode_nops(&hdr); | 1901 | encode_nops(&hdr); |
1911 | return 0; | ||
1912 | } | 1902 | } |
1913 | 1903 | ||
1914 | /* | 1904 | /* |
1915 | * Encode RENAME request | 1905 | * Encode RENAME request |
1916 | */ | 1906 | */ |
1917 | static int nfs4_xdr_enc_rename(struct rpc_rqst *req, __be32 *p, const struct nfs_renameargs *args) | 1907 | static void nfs4_xdr_enc_rename(struct rpc_rqst *req, struct xdr_stream *xdr, |
1908 | const struct nfs_renameargs *args) | ||
1918 | { | 1909 | { |
1919 | struct xdr_stream xdr; | ||
1920 | struct compound_hdr hdr = { | 1910 | struct compound_hdr hdr = { |
1921 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1911 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1922 | }; | 1912 | }; |
1923 | 1913 | ||
1924 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1914 | encode_compound_hdr(xdr, req, &hdr); |
1925 | encode_compound_hdr(&xdr, req, &hdr); | 1915 | encode_sequence(xdr, &args->seq_args, &hdr); |
1926 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1916 | encode_putfh(xdr, args->old_dir, &hdr); |
1927 | encode_putfh(&xdr, args->old_dir, &hdr); | 1917 | encode_savefh(xdr, &hdr); |
1928 | encode_savefh(&xdr, &hdr); | 1918 | encode_putfh(xdr, args->new_dir, &hdr); |
1929 | encode_putfh(&xdr, args->new_dir, &hdr); | 1919 | encode_rename(xdr, args->old_name, args->new_name, &hdr); |
1930 | encode_rename(&xdr, args->old_name, args->new_name, &hdr); | 1920 | encode_getfattr(xdr, args->bitmask, &hdr); |
1931 | encode_getfattr(&xdr, args->bitmask, &hdr); | 1921 | encode_restorefh(xdr, &hdr); |
1932 | encode_restorefh(&xdr, &hdr); | 1922 | encode_getfattr(xdr, args->bitmask, &hdr); |
1933 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1934 | encode_nops(&hdr); | 1923 | encode_nops(&hdr); |
1935 | return 0; | ||
1936 | } | 1924 | } |
1937 | 1925 | ||
1938 | /* | 1926 | /* |
1939 | * Encode LINK request | 1927 | * Encode LINK request |
1940 | */ | 1928 | */ |
1941 | static int nfs4_xdr_enc_link(struct rpc_rqst *req, __be32 *p, const struct nfs4_link_arg *args) | 1929 | static void nfs4_xdr_enc_link(struct rpc_rqst *req, struct xdr_stream *xdr, |
1930 | const struct nfs4_link_arg *args) | ||
1942 | { | 1931 | { |
1943 | struct xdr_stream xdr; | ||
1944 | struct compound_hdr hdr = { | 1932 | struct compound_hdr hdr = { |
1945 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1933 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1946 | }; | 1934 | }; |
1947 | 1935 | ||
1948 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1936 | encode_compound_hdr(xdr, req, &hdr); |
1949 | encode_compound_hdr(&xdr, req, &hdr); | 1937 | encode_sequence(xdr, &args->seq_args, &hdr); |
1950 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1938 | encode_putfh(xdr, args->fh, &hdr); |
1951 | encode_putfh(&xdr, args->fh, &hdr); | 1939 | encode_savefh(xdr, &hdr); |
1952 | encode_savefh(&xdr, &hdr); | 1940 | encode_putfh(xdr, args->dir_fh, &hdr); |
1953 | encode_putfh(&xdr, args->dir_fh, &hdr); | 1941 | encode_link(xdr, args->name, &hdr); |
1954 | encode_link(&xdr, args->name, &hdr); | 1942 | encode_getfattr(xdr, args->bitmask, &hdr); |
1955 | encode_getfattr(&xdr, args->bitmask, &hdr); | 1943 | encode_restorefh(xdr, &hdr); |
1956 | encode_restorefh(&xdr, &hdr); | 1944 | encode_getfattr(xdr, args->bitmask, &hdr); |
1957 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1958 | encode_nops(&hdr); | 1945 | encode_nops(&hdr); |
1959 | return 0; | ||
1960 | } | 1946 | } |
1961 | 1947 | ||
1962 | /* | 1948 | /* |
1963 | * Encode CREATE request | 1949 | * Encode CREATE request |
1964 | */ | 1950 | */ |
1965 | static int nfs4_xdr_enc_create(struct rpc_rqst *req, __be32 *p, const struct nfs4_create_arg *args) | 1951 | static void nfs4_xdr_enc_create(struct rpc_rqst *req, struct xdr_stream *xdr, |
1952 | const struct nfs4_create_arg *args) | ||
1966 | { | 1953 | { |
1967 | struct xdr_stream xdr; | ||
1968 | struct compound_hdr hdr = { | 1954 | struct compound_hdr hdr = { |
1969 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1955 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
1970 | }; | 1956 | }; |
1971 | 1957 | ||
1972 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1958 | encode_compound_hdr(xdr, req, &hdr); |
1973 | encode_compound_hdr(&xdr, req, &hdr); | 1959 | encode_sequence(xdr, &args->seq_args, &hdr); |
1974 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1960 | encode_putfh(xdr, args->dir_fh, &hdr); |
1975 | encode_putfh(&xdr, args->dir_fh, &hdr); | 1961 | encode_savefh(xdr, &hdr); |
1976 | encode_savefh(&xdr, &hdr); | 1962 | encode_create(xdr, args, &hdr); |
1977 | encode_create(&xdr, args, &hdr); | 1963 | encode_getfh(xdr, &hdr); |
1978 | encode_getfh(&xdr, &hdr); | 1964 | encode_getfattr(xdr, args->bitmask, &hdr); |
1979 | encode_getfattr(&xdr, args->bitmask, &hdr); | 1965 | encode_restorefh(xdr, &hdr); |
1980 | encode_restorefh(&xdr, &hdr); | 1966 | encode_getfattr(xdr, args->bitmask, &hdr); |
1981 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
1982 | encode_nops(&hdr); | 1967 | encode_nops(&hdr); |
1983 | return 0; | ||
1984 | } | 1968 | } |
1985 | 1969 | ||
1986 | /* | 1970 | /* |
1987 | * Encode SYMLINK request | 1971 | * Encode SYMLINK request |
1988 | */ | 1972 | */ |
1989 | static int nfs4_xdr_enc_symlink(struct rpc_rqst *req, __be32 *p, const struct nfs4_create_arg *args) | 1973 | static void nfs4_xdr_enc_symlink(struct rpc_rqst *req, struct xdr_stream *xdr, |
1974 | const struct nfs4_create_arg *args) | ||
1990 | { | 1975 | { |
1991 | return nfs4_xdr_enc_create(req, p, args); | 1976 | nfs4_xdr_enc_create(req, xdr, args); |
1992 | } | 1977 | } |
1993 | 1978 | ||
1994 | /* | 1979 | /* |
1995 | * Encode GETATTR request | 1980 | * Encode GETATTR request |
1996 | */ | 1981 | */ |
1997 | static int nfs4_xdr_enc_getattr(struct rpc_rqst *req, __be32 *p, const struct nfs4_getattr_arg *args) | 1982 | static void nfs4_xdr_enc_getattr(struct rpc_rqst *req, struct xdr_stream *xdr, |
1983 | const struct nfs4_getattr_arg *args) | ||
1998 | { | 1984 | { |
1999 | struct xdr_stream xdr; | ||
2000 | struct compound_hdr hdr = { | 1985 | struct compound_hdr hdr = { |
2001 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 1986 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2002 | }; | 1987 | }; |
2003 | 1988 | ||
2004 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1989 | encode_compound_hdr(xdr, req, &hdr); |
2005 | encode_compound_hdr(&xdr, req, &hdr); | 1990 | encode_sequence(xdr, &args->seq_args, &hdr); |
2006 | encode_sequence(&xdr, &args->seq_args, &hdr); | 1991 | encode_putfh(xdr, args->fh, &hdr); |
2007 | encode_putfh(&xdr, args->fh, &hdr); | 1992 | encode_getfattr(xdr, args->bitmask, &hdr); |
2008 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2009 | encode_nops(&hdr); | 1993 | encode_nops(&hdr); |
2010 | return 0; | ||
2011 | } | 1994 | } |
2012 | 1995 | ||
2013 | /* | 1996 | /* |
2014 | * Encode a CLOSE request | 1997 | * Encode a CLOSE request |
2015 | */ | 1998 | */ |
2016 | static int nfs4_xdr_enc_close(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args) | 1999 | static void nfs4_xdr_enc_close(struct rpc_rqst *req, struct xdr_stream *xdr, |
2000 | struct nfs_closeargs *args) | ||
2017 | { | 2001 | { |
2018 | struct xdr_stream xdr; | ||
2019 | struct compound_hdr hdr = { | 2002 | struct compound_hdr hdr = { |
2020 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2003 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2021 | }; | 2004 | }; |
2022 | 2005 | ||
2023 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2006 | encode_compound_hdr(xdr, req, &hdr); |
2024 | encode_compound_hdr(&xdr, req, &hdr); | 2007 | encode_sequence(xdr, &args->seq_args, &hdr); |
2025 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2008 | encode_putfh(xdr, args->fh, &hdr); |
2026 | encode_putfh(&xdr, args->fh, &hdr); | 2009 | encode_close(xdr, args, &hdr); |
2027 | encode_close(&xdr, args, &hdr); | 2010 | encode_getfattr(xdr, args->bitmask, &hdr); |
2028 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2029 | encode_nops(&hdr); | 2011 | encode_nops(&hdr); |
2030 | return 0; | ||
2031 | } | 2012 | } |
2032 | 2013 | ||
2033 | /* | 2014 | /* |
2034 | * Encode an OPEN request | 2015 | * Encode an OPEN request |
2035 | */ | 2016 | */ |
2036 | static int nfs4_xdr_enc_open(struct rpc_rqst *req, __be32 *p, struct nfs_openargs *args) | 2017 | static void nfs4_xdr_enc_open(struct rpc_rqst *req, struct xdr_stream *xdr, |
2018 | struct nfs_openargs *args) | ||
2037 | { | 2019 | { |
2038 | struct xdr_stream xdr; | ||
2039 | struct compound_hdr hdr = { | 2020 | struct compound_hdr hdr = { |
2040 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2021 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2041 | }; | 2022 | }; |
2042 | 2023 | ||
2043 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2024 | encode_compound_hdr(xdr, req, &hdr); |
2044 | encode_compound_hdr(&xdr, req, &hdr); | 2025 | encode_sequence(xdr, &args->seq_args, &hdr); |
2045 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2026 | encode_putfh(xdr, args->fh, &hdr); |
2046 | encode_putfh(&xdr, args->fh, &hdr); | 2027 | encode_savefh(xdr, &hdr); |
2047 | encode_savefh(&xdr, &hdr); | 2028 | encode_open(xdr, args, &hdr); |
2048 | encode_open(&xdr, args, &hdr); | 2029 | encode_getfh(xdr, &hdr); |
2049 | encode_getfh(&xdr, &hdr); | 2030 | encode_getfattr(xdr, args->bitmask, &hdr); |
2050 | encode_getfattr(&xdr, args->bitmask, &hdr); | 2031 | encode_restorefh(xdr, &hdr); |
2051 | encode_restorefh(&xdr, &hdr); | 2032 | encode_getfattr(xdr, args->bitmask, &hdr); |
2052 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2053 | encode_nops(&hdr); | 2033 | encode_nops(&hdr); |
2054 | return 0; | ||
2055 | } | 2034 | } |
2056 | 2035 | ||
2057 | /* | 2036 | /* |
2058 | * Encode an OPEN_CONFIRM request | 2037 | * Encode an OPEN_CONFIRM request |
2059 | */ | 2038 | */ |
2060 | static int nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_open_confirmargs *args) | 2039 | static void nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, |
2040 | struct xdr_stream *xdr, | ||
2041 | struct nfs_open_confirmargs *args) | ||
2061 | { | 2042 | { |
2062 | struct xdr_stream xdr; | ||
2063 | struct compound_hdr hdr = { | 2043 | struct compound_hdr hdr = { |
2064 | .nops = 0, | 2044 | .nops = 0, |
2065 | }; | 2045 | }; |
2066 | 2046 | ||
2067 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2047 | encode_compound_hdr(xdr, req, &hdr); |
2068 | encode_compound_hdr(&xdr, req, &hdr); | 2048 | encode_putfh(xdr, args->fh, &hdr); |
2069 | encode_putfh(&xdr, args->fh, &hdr); | 2049 | encode_open_confirm(xdr, args, &hdr); |
2070 | encode_open_confirm(&xdr, args, &hdr); | ||
2071 | encode_nops(&hdr); | 2050 | encode_nops(&hdr); |
2072 | return 0; | ||
2073 | } | 2051 | } |
2074 | 2052 | ||
2075 | /* | 2053 | /* |
2076 | * Encode an OPEN request with no attributes. | 2054 | * Encode an OPEN request with no attributes. |
2077 | */ | 2055 | */ |
2078 | static int nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, __be32 *p, struct nfs_openargs *args) | 2056 | static void nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, |
2057 | struct xdr_stream *xdr, | ||
2058 | struct nfs_openargs *args) | ||
2079 | { | 2059 | { |
2080 | struct xdr_stream xdr; | ||
2081 | struct compound_hdr hdr = { | 2060 | struct compound_hdr hdr = { |
2082 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2061 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2083 | }; | 2062 | }; |
2084 | 2063 | ||
2085 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2064 | encode_compound_hdr(xdr, req, &hdr); |
2086 | encode_compound_hdr(&xdr, req, &hdr); | 2065 | encode_sequence(xdr, &args->seq_args, &hdr); |
2087 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2066 | encode_putfh(xdr, args->fh, &hdr); |
2088 | encode_putfh(&xdr, args->fh, &hdr); | 2067 | encode_open(xdr, args, &hdr); |
2089 | encode_open(&xdr, args, &hdr); | 2068 | encode_getfattr(xdr, args->bitmask, &hdr); |
2090 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2091 | encode_nops(&hdr); | 2069 | encode_nops(&hdr); |
2092 | return 0; | ||
2093 | } | 2070 | } |
2094 | 2071 | ||
2095 | /* | 2072 | /* |
2096 | * Encode an OPEN_DOWNGRADE request | 2073 | * Encode an OPEN_DOWNGRADE request |
2097 | */ | 2074 | */ |
2098 | static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args) | 2075 | static void nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, |
2076 | struct xdr_stream *xdr, | ||
2077 | struct nfs_closeargs *args) | ||
2099 | { | 2078 | { |
2100 | struct xdr_stream xdr; | ||
2101 | struct compound_hdr hdr = { | 2079 | struct compound_hdr hdr = { |
2102 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2080 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2103 | }; | 2081 | }; |
2104 | 2082 | ||
2105 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2083 | encode_compound_hdr(xdr, req, &hdr); |
2106 | encode_compound_hdr(&xdr, req, &hdr); | 2084 | encode_sequence(xdr, &args->seq_args, &hdr); |
2107 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2085 | encode_putfh(xdr, args->fh, &hdr); |
2108 | encode_putfh(&xdr, args->fh, &hdr); | 2086 | encode_open_downgrade(xdr, args, &hdr); |
2109 | encode_open_downgrade(&xdr, args, &hdr); | 2087 | encode_getfattr(xdr, args->bitmask, &hdr); |
2110 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2111 | encode_nops(&hdr); | 2088 | encode_nops(&hdr); |
2112 | return 0; | ||
2113 | } | 2089 | } |
2114 | 2090 | ||
2115 | /* | 2091 | /* |
2116 | * Encode a LOCK request | 2092 | * Encode a LOCK request |
2117 | */ | 2093 | */ |
2118 | static int nfs4_xdr_enc_lock(struct rpc_rqst *req, __be32 *p, struct nfs_lock_args *args) | 2094 | static void nfs4_xdr_enc_lock(struct rpc_rqst *req, struct xdr_stream *xdr, |
2095 | struct nfs_lock_args *args) | ||
2119 | { | 2096 | { |
2120 | struct xdr_stream xdr; | ||
2121 | struct compound_hdr hdr = { | 2097 | struct compound_hdr hdr = { |
2122 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2098 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2123 | }; | 2099 | }; |
2124 | 2100 | ||
2125 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2101 | encode_compound_hdr(xdr, req, &hdr); |
2126 | encode_compound_hdr(&xdr, req, &hdr); | 2102 | encode_sequence(xdr, &args->seq_args, &hdr); |
2127 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2103 | encode_putfh(xdr, args->fh, &hdr); |
2128 | encode_putfh(&xdr, args->fh, &hdr); | 2104 | encode_lock(xdr, args, &hdr); |
2129 | encode_lock(&xdr, args, &hdr); | ||
2130 | encode_nops(&hdr); | 2105 | encode_nops(&hdr); |
2131 | return 0; | ||
2132 | } | 2106 | } |
2133 | 2107 | ||
2134 | /* | 2108 | /* |
2135 | * Encode a LOCKT request | 2109 | * Encode a LOCKT request |
2136 | */ | 2110 | */ |
2137 | static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, __be32 *p, struct nfs_lockt_args *args) | 2111 | static void nfs4_xdr_enc_lockt(struct rpc_rqst *req, struct xdr_stream *xdr, |
2112 | struct nfs_lockt_args *args) | ||
2138 | { | 2113 | { |
2139 | struct xdr_stream xdr; | ||
2140 | struct compound_hdr hdr = { | 2114 | struct compound_hdr hdr = { |
2141 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2115 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2142 | }; | 2116 | }; |
2143 | 2117 | ||
2144 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2118 | encode_compound_hdr(xdr, req, &hdr); |
2145 | encode_compound_hdr(&xdr, req, &hdr); | 2119 | encode_sequence(xdr, &args->seq_args, &hdr); |
2146 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2120 | encode_putfh(xdr, args->fh, &hdr); |
2147 | encode_putfh(&xdr, args->fh, &hdr); | 2121 | encode_lockt(xdr, args, &hdr); |
2148 | encode_lockt(&xdr, args, &hdr); | ||
2149 | encode_nops(&hdr); | 2122 | encode_nops(&hdr); |
2150 | return 0; | ||
2151 | } | 2123 | } |
2152 | 2124 | ||
2153 | /* | 2125 | /* |
2154 | * Encode a LOCKU request | 2126 | * Encode a LOCKU request |
2155 | */ | 2127 | */ |
2156 | static int nfs4_xdr_enc_locku(struct rpc_rqst *req, __be32 *p, struct nfs_locku_args *args) | 2128 | static void nfs4_xdr_enc_locku(struct rpc_rqst *req, struct xdr_stream *xdr, |
2129 | struct nfs_locku_args *args) | ||
2157 | { | 2130 | { |
2158 | struct xdr_stream xdr; | ||
2159 | struct compound_hdr hdr = { | 2131 | struct compound_hdr hdr = { |
2160 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2132 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2161 | }; | 2133 | }; |
2162 | 2134 | ||
2163 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2135 | encode_compound_hdr(xdr, req, &hdr); |
2164 | encode_compound_hdr(&xdr, req, &hdr); | 2136 | encode_sequence(xdr, &args->seq_args, &hdr); |
2165 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2137 | encode_putfh(xdr, args->fh, &hdr); |
2166 | encode_putfh(&xdr, args->fh, &hdr); | 2138 | encode_locku(xdr, args, &hdr); |
2167 | encode_locku(&xdr, args, &hdr); | ||
2168 | encode_nops(&hdr); | 2139 | encode_nops(&hdr); |
2169 | return 0; | ||
2170 | } | 2140 | } |
2171 | 2141 | ||
2172 | static int nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req, __be32 *p, struct nfs_release_lockowner_args *args) | 2142 | static void nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req, |
2143 | struct xdr_stream *xdr, | ||
2144 | struct nfs_release_lockowner_args *args) | ||
2173 | { | 2145 | { |
2174 | struct xdr_stream xdr; | ||
2175 | struct compound_hdr hdr = { | 2146 | struct compound_hdr hdr = { |
2176 | .minorversion = 0, | 2147 | .minorversion = 0, |
2177 | }; | 2148 | }; |
2178 | 2149 | ||
2179 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2150 | encode_compound_hdr(xdr, req, &hdr); |
2180 | encode_compound_hdr(&xdr, req, &hdr); | 2151 | encode_release_lockowner(xdr, &args->lock_owner, &hdr); |
2181 | encode_release_lockowner(&xdr, &args->lock_owner, &hdr); | ||
2182 | encode_nops(&hdr); | 2152 | encode_nops(&hdr); |
2183 | return 0; | ||
2184 | } | 2153 | } |
2185 | 2154 | ||
2186 | /* | 2155 | /* |
2187 | * Encode a READLINK request | 2156 | * Encode a READLINK request |
2188 | */ | 2157 | */ |
2189 | static int nfs4_xdr_enc_readlink(struct rpc_rqst *req, __be32 *p, const struct nfs4_readlink *args) | 2158 | static void nfs4_xdr_enc_readlink(struct rpc_rqst *req, struct xdr_stream *xdr, |
2159 | const struct nfs4_readlink *args) | ||
2190 | { | 2160 | { |
2191 | struct xdr_stream xdr; | ||
2192 | struct compound_hdr hdr = { | 2161 | struct compound_hdr hdr = { |
2193 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2162 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2194 | }; | 2163 | }; |
2195 | 2164 | ||
2196 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2165 | encode_compound_hdr(xdr, req, &hdr); |
2197 | encode_compound_hdr(&xdr, req, &hdr); | 2166 | encode_sequence(xdr, &args->seq_args, &hdr); |
2198 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2167 | encode_putfh(xdr, args->fh, &hdr); |
2199 | encode_putfh(&xdr, args->fh, &hdr); | 2168 | encode_readlink(xdr, args, req, &hdr); |
2200 | encode_readlink(&xdr, args, req, &hdr); | ||
2201 | 2169 | ||
2202 | xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages, | 2170 | xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages, |
2203 | args->pgbase, args->pglen); | 2171 | args->pgbase, args->pglen); |
2204 | encode_nops(&hdr); | 2172 | encode_nops(&hdr); |
2205 | return 0; | ||
2206 | } | 2173 | } |
2207 | 2174 | ||
2208 | /* | 2175 | /* |
2209 | * Encode a READDIR request | 2176 | * Encode a READDIR request |
2210 | */ | 2177 | */ |
2211 | static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nfs4_readdir_arg *args) | 2178 | static void nfs4_xdr_enc_readdir(struct rpc_rqst *req, struct xdr_stream *xdr, |
2179 | const struct nfs4_readdir_arg *args) | ||
2212 | { | 2180 | { |
2213 | struct xdr_stream xdr; | ||
2214 | struct compound_hdr hdr = { | 2181 | struct compound_hdr hdr = { |
2215 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2182 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2216 | }; | 2183 | }; |
2217 | 2184 | ||
2218 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2185 | encode_compound_hdr(xdr, req, &hdr); |
2219 | encode_compound_hdr(&xdr, req, &hdr); | 2186 | encode_sequence(xdr, &args->seq_args, &hdr); |
2220 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2187 | encode_putfh(xdr, args->fh, &hdr); |
2221 | encode_putfh(&xdr, args->fh, &hdr); | 2188 | encode_readdir(xdr, args, req, &hdr); |
2222 | encode_readdir(&xdr, args, req, &hdr); | ||
2223 | 2189 | ||
2224 | xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages, | 2190 | xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages, |
2225 | args->pgbase, args->count); | 2191 | args->pgbase, args->count); |
@@ -2227,428 +2193,387 @@ static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nf | |||
2227 | __func__, hdr.replen << 2, args->pages, | 2193 | __func__, hdr.replen << 2, args->pages, |
2228 | args->pgbase, args->count); | 2194 | args->pgbase, args->count); |
2229 | encode_nops(&hdr); | 2195 | encode_nops(&hdr); |
2230 | return 0; | ||
2231 | } | 2196 | } |
2232 | 2197 | ||
2233 | /* | 2198 | /* |
2234 | * Encode a READ request | 2199 | * Encode a READ request |
2235 | */ | 2200 | */ |
2236 | static int nfs4_xdr_enc_read(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args) | 2201 | static void nfs4_xdr_enc_read(struct rpc_rqst *req, struct xdr_stream *xdr, |
2202 | struct nfs_readargs *args) | ||
2237 | { | 2203 | { |
2238 | struct xdr_stream xdr; | ||
2239 | struct compound_hdr hdr = { | 2204 | struct compound_hdr hdr = { |
2240 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2205 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2241 | }; | 2206 | }; |
2242 | 2207 | ||
2243 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2208 | encode_compound_hdr(xdr, req, &hdr); |
2244 | encode_compound_hdr(&xdr, req, &hdr); | 2209 | encode_sequence(xdr, &args->seq_args, &hdr); |
2245 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2210 | encode_putfh(xdr, args->fh, &hdr); |
2246 | encode_putfh(&xdr, args->fh, &hdr); | 2211 | encode_read(xdr, args, &hdr); |
2247 | encode_read(&xdr, args, &hdr); | ||
2248 | 2212 | ||
2249 | xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, | 2213 | xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, |
2250 | args->pages, args->pgbase, args->count); | 2214 | args->pages, args->pgbase, args->count); |
2251 | req->rq_rcv_buf.flags |= XDRBUF_READ; | 2215 | req->rq_rcv_buf.flags |= XDRBUF_READ; |
2252 | encode_nops(&hdr); | 2216 | encode_nops(&hdr); |
2253 | return 0; | ||
2254 | } | 2217 | } |
2255 | 2218 | ||
2256 | /* | 2219 | /* |
2257 | * Encode an SETATTR request | 2220 | * Encode an SETATTR request |
2258 | */ | 2221 | */ |
2259 | static int nfs4_xdr_enc_setattr(struct rpc_rqst *req, __be32 *p, struct nfs_setattrargs *args) | 2222 | static void nfs4_xdr_enc_setattr(struct rpc_rqst *req, struct xdr_stream *xdr, |
2223 | struct nfs_setattrargs *args) | ||
2260 | { | 2224 | { |
2261 | struct xdr_stream xdr; | ||
2262 | struct compound_hdr hdr = { | 2225 | struct compound_hdr hdr = { |
2263 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2226 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2264 | }; | 2227 | }; |
2265 | 2228 | ||
2266 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2229 | encode_compound_hdr(xdr, req, &hdr); |
2267 | encode_compound_hdr(&xdr, req, &hdr); | 2230 | encode_sequence(xdr, &args->seq_args, &hdr); |
2268 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2231 | encode_putfh(xdr, args->fh, &hdr); |
2269 | encode_putfh(&xdr, args->fh, &hdr); | 2232 | encode_setattr(xdr, args, args->server, &hdr); |
2270 | encode_setattr(&xdr, args, args->server, &hdr); | 2233 | encode_getfattr(xdr, args->bitmask, &hdr); |
2271 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2272 | encode_nops(&hdr); | 2234 | encode_nops(&hdr); |
2273 | return 0; | ||
2274 | } | 2235 | } |
2275 | 2236 | ||
2276 | /* | 2237 | /* |
2277 | * Encode a GETACL request | 2238 | * Encode a GETACL request |
2278 | */ | 2239 | */ |
2279 | static int | 2240 | static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr, |
2280 | nfs4_xdr_enc_getacl(struct rpc_rqst *req, __be32 *p, | 2241 | struct nfs_getaclargs *args) |
2281 | struct nfs_getaclargs *args) | ||
2282 | { | 2242 | { |
2283 | struct xdr_stream xdr; | ||
2284 | struct compound_hdr hdr = { | 2243 | struct compound_hdr hdr = { |
2285 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2244 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2286 | }; | 2245 | }; |
2287 | uint32_t replen; | 2246 | uint32_t replen; |
2288 | 2247 | ||
2289 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2248 | encode_compound_hdr(xdr, req, &hdr); |
2290 | encode_compound_hdr(&xdr, req, &hdr); | 2249 | encode_sequence(xdr, &args->seq_args, &hdr); |
2291 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2250 | encode_putfh(xdr, args->fh, &hdr); |
2292 | encode_putfh(&xdr, args->fh, &hdr); | ||
2293 | replen = hdr.replen + op_decode_hdr_maxsz + nfs4_fattr_bitmap_maxsz + 1; | 2251 | replen = hdr.replen + op_decode_hdr_maxsz + nfs4_fattr_bitmap_maxsz + 1; |
2294 | encode_getattr_two(&xdr, FATTR4_WORD0_ACL, 0, &hdr); | 2252 | encode_getattr_two(xdr, FATTR4_WORD0_ACL, 0, &hdr); |
2295 | 2253 | ||
2296 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, | 2254 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, |
2297 | args->acl_pages, args->acl_pgbase, args->acl_len); | 2255 | args->acl_pages, args->acl_pgbase, args->acl_len); |
2298 | encode_nops(&hdr); | 2256 | encode_nops(&hdr); |
2299 | return 0; | ||
2300 | } | 2257 | } |
2301 | 2258 | ||
2302 | /* | 2259 | /* |
2303 | * Encode a WRITE request | 2260 | * Encode a WRITE request |
2304 | */ | 2261 | */ |
2305 | static int nfs4_xdr_enc_write(struct rpc_rqst *req, __be32 *p, struct nfs_writeargs *args) | 2262 | static void nfs4_xdr_enc_write(struct rpc_rqst *req, struct xdr_stream *xdr, |
2263 | struct nfs_writeargs *args) | ||
2306 | { | 2264 | { |
2307 | struct xdr_stream xdr; | ||
2308 | struct compound_hdr hdr = { | 2265 | struct compound_hdr hdr = { |
2309 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2266 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2310 | }; | 2267 | }; |
2311 | 2268 | ||
2312 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2269 | encode_compound_hdr(xdr, req, &hdr); |
2313 | encode_compound_hdr(&xdr, req, &hdr); | 2270 | encode_sequence(xdr, &args->seq_args, &hdr); |
2314 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2271 | encode_putfh(xdr, args->fh, &hdr); |
2315 | encode_putfh(&xdr, args->fh, &hdr); | 2272 | encode_write(xdr, args, &hdr); |
2316 | encode_write(&xdr, args, &hdr); | ||
2317 | req->rq_snd_buf.flags |= XDRBUF_WRITE; | 2273 | req->rq_snd_buf.flags |= XDRBUF_WRITE; |
2318 | encode_getfattr(&xdr, args->bitmask, &hdr); | 2274 | encode_getfattr(xdr, args->bitmask, &hdr); |
2319 | encode_nops(&hdr); | 2275 | encode_nops(&hdr); |
2320 | return 0; | ||
2321 | } | 2276 | } |
2322 | 2277 | ||
2323 | /* | 2278 | /* |
2324 | * a COMMIT request | 2279 | * a COMMIT request |
2325 | */ | 2280 | */ |
2326 | static int nfs4_xdr_enc_commit(struct rpc_rqst *req, __be32 *p, struct nfs_writeargs *args) | 2281 | static void nfs4_xdr_enc_commit(struct rpc_rqst *req, struct xdr_stream *xdr, |
2282 | struct nfs_writeargs *args) | ||
2327 | { | 2283 | { |
2328 | struct xdr_stream xdr; | ||
2329 | struct compound_hdr hdr = { | 2284 | struct compound_hdr hdr = { |
2330 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2285 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2331 | }; | 2286 | }; |
2332 | 2287 | ||
2333 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2288 | encode_compound_hdr(xdr, req, &hdr); |
2334 | encode_compound_hdr(&xdr, req, &hdr); | 2289 | encode_sequence(xdr, &args->seq_args, &hdr); |
2335 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2290 | encode_putfh(xdr, args->fh, &hdr); |
2336 | encode_putfh(&xdr, args->fh, &hdr); | 2291 | encode_commit(xdr, args, &hdr); |
2337 | encode_commit(&xdr, args, &hdr); | 2292 | encode_getfattr(xdr, args->bitmask, &hdr); |
2338 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2339 | encode_nops(&hdr); | 2293 | encode_nops(&hdr); |
2340 | return 0; | ||
2341 | } | 2294 | } |
2342 | 2295 | ||
2343 | /* | 2296 | /* |
2344 | * FSINFO request | 2297 | * FSINFO request |
2345 | */ | 2298 | */ |
2346 | static int nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, __be32 *p, struct nfs4_fsinfo_arg *args) | 2299 | static void nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr, |
2300 | struct nfs4_fsinfo_arg *args) | ||
2347 | { | 2301 | { |
2348 | struct xdr_stream xdr; | ||
2349 | struct compound_hdr hdr = { | 2302 | struct compound_hdr hdr = { |
2350 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2303 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2351 | }; | 2304 | }; |
2352 | 2305 | ||
2353 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2306 | encode_compound_hdr(xdr, req, &hdr); |
2354 | encode_compound_hdr(&xdr, req, &hdr); | 2307 | encode_sequence(xdr, &args->seq_args, &hdr); |
2355 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2308 | encode_putfh(xdr, args->fh, &hdr); |
2356 | encode_putfh(&xdr, args->fh, &hdr); | 2309 | encode_fsinfo(xdr, args->bitmask, &hdr); |
2357 | encode_fsinfo(&xdr, args->bitmask, &hdr); | ||
2358 | encode_nops(&hdr); | 2310 | encode_nops(&hdr); |
2359 | return 0; | ||
2360 | } | 2311 | } |
2361 | 2312 | ||
2362 | /* | 2313 | /* |
2363 | * a PATHCONF request | 2314 | * a PATHCONF request |
2364 | */ | 2315 | */ |
2365 | static int nfs4_xdr_enc_pathconf(struct rpc_rqst *req, __be32 *p, const struct nfs4_pathconf_arg *args) | 2316 | static void nfs4_xdr_enc_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr, |
2317 | const struct nfs4_pathconf_arg *args) | ||
2366 | { | 2318 | { |
2367 | struct xdr_stream xdr; | ||
2368 | struct compound_hdr hdr = { | 2319 | struct compound_hdr hdr = { |
2369 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2320 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2370 | }; | 2321 | }; |
2371 | 2322 | ||
2372 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2323 | encode_compound_hdr(xdr, req, &hdr); |
2373 | encode_compound_hdr(&xdr, req, &hdr); | 2324 | encode_sequence(xdr, &args->seq_args, &hdr); |
2374 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2325 | encode_putfh(xdr, args->fh, &hdr); |
2375 | encode_putfh(&xdr, args->fh, &hdr); | 2326 | encode_getattr_one(xdr, args->bitmask[0] & nfs4_pathconf_bitmap[0], |
2376 | encode_getattr_one(&xdr, args->bitmask[0] & nfs4_pathconf_bitmap[0], | ||
2377 | &hdr); | 2327 | &hdr); |
2378 | encode_nops(&hdr); | 2328 | encode_nops(&hdr); |
2379 | return 0; | ||
2380 | } | 2329 | } |
2381 | 2330 | ||
2382 | /* | 2331 | /* |
2383 | * a STATFS request | 2332 | * a STATFS request |
2384 | */ | 2333 | */ |
2385 | static int nfs4_xdr_enc_statfs(struct rpc_rqst *req, __be32 *p, const struct nfs4_statfs_arg *args) | 2334 | static void nfs4_xdr_enc_statfs(struct rpc_rqst *req, struct xdr_stream *xdr, |
2335 | const struct nfs4_statfs_arg *args) | ||
2386 | { | 2336 | { |
2387 | struct xdr_stream xdr; | ||
2388 | struct compound_hdr hdr = { | 2337 | struct compound_hdr hdr = { |
2389 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2338 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2390 | }; | 2339 | }; |
2391 | 2340 | ||
2392 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2341 | encode_compound_hdr(xdr, req, &hdr); |
2393 | encode_compound_hdr(&xdr, req, &hdr); | 2342 | encode_sequence(xdr, &args->seq_args, &hdr); |
2394 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2343 | encode_putfh(xdr, args->fh, &hdr); |
2395 | encode_putfh(&xdr, args->fh, &hdr); | 2344 | encode_getattr_two(xdr, args->bitmask[0] & nfs4_statfs_bitmap[0], |
2396 | encode_getattr_two(&xdr, args->bitmask[0] & nfs4_statfs_bitmap[0], | ||
2397 | args->bitmask[1] & nfs4_statfs_bitmap[1], &hdr); | 2345 | args->bitmask[1] & nfs4_statfs_bitmap[1], &hdr); |
2398 | encode_nops(&hdr); | 2346 | encode_nops(&hdr); |
2399 | return 0; | ||
2400 | } | 2347 | } |
2401 | 2348 | ||
2402 | /* | 2349 | /* |
2403 | * GETATTR_BITMAP request | 2350 | * GETATTR_BITMAP request |
2404 | */ | 2351 | */ |
2405 | static int nfs4_xdr_enc_server_caps(struct rpc_rqst *req, __be32 *p, | 2352 | static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req, |
2406 | struct nfs4_server_caps_arg *args) | 2353 | struct xdr_stream *xdr, |
2354 | struct nfs4_server_caps_arg *args) | ||
2407 | { | 2355 | { |
2408 | struct xdr_stream xdr; | ||
2409 | struct compound_hdr hdr = { | 2356 | struct compound_hdr hdr = { |
2410 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2357 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2411 | }; | 2358 | }; |
2412 | 2359 | ||
2413 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2360 | encode_compound_hdr(xdr, req, &hdr); |
2414 | encode_compound_hdr(&xdr, req, &hdr); | 2361 | encode_sequence(xdr, &args->seq_args, &hdr); |
2415 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2362 | encode_putfh(xdr, args->fhandle, &hdr); |
2416 | encode_putfh(&xdr, args->fhandle, &hdr); | 2363 | encode_getattr_one(xdr, FATTR4_WORD0_SUPPORTED_ATTRS| |
2417 | encode_getattr_one(&xdr, FATTR4_WORD0_SUPPORTED_ATTRS| | ||
2418 | FATTR4_WORD0_LINK_SUPPORT| | 2364 | FATTR4_WORD0_LINK_SUPPORT| |
2419 | FATTR4_WORD0_SYMLINK_SUPPORT| | 2365 | FATTR4_WORD0_SYMLINK_SUPPORT| |
2420 | FATTR4_WORD0_ACLSUPPORT, &hdr); | 2366 | FATTR4_WORD0_ACLSUPPORT, &hdr); |
2421 | encode_nops(&hdr); | 2367 | encode_nops(&hdr); |
2422 | return 0; | ||
2423 | } | 2368 | } |
2424 | 2369 | ||
2425 | /* | 2370 | /* |
2426 | * a RENEW request | 2371 | * a RENEW request |
2427 | */ | 2372 | */ |
2428 | static int nfs4_xdr_enc_renew(struct rpc_rqst *req, __be32 *p, struct nfs_client *clp) | 2373 | static void nfs4_xdr_enc_renew(struct rpc_rqst *req, struct xdr_stream *xdr, |
2374 | struct nfs_client *clp) | ||
2429 | { | 2375 | { |
2430 | struct xdr_stream xdr; | ||
2431 | struct compound_hdr hdr = { | 2376 | struct compound_hdr hdr = { |
2432 | .nops = 0, | 2377 | .nops = 0, |
2433 | }; | 2378 | }; |
2434 | 2379 | ||
2435 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2380 | encode_compound_hdr(xdr, req, &hdr); |
2436 | encode_compound_hdr(&xdr, req, &hdr); | 2381 | encode_renew(xdr, clp, &hdr); |
2437 | encode_renew(&xdr, clp, &hdr); | ||
2438 | encode_nops(&hdr); | 2382 | encode_nops(&hdr); |
2439 | return 0; | ||
2440 | } | 2383 | } |
2441 | 2384 | ||
2442 | /* | 2385 | /* |
2443 | * a SETCLIENTID request | 2386 | * a SETCLIENTID request |
2444 | */ | 2387 | */ |
2445 | static int nfs4_xdr_enc_setclientid(struct rpc_rqst *req, __be32 *p, struct nfs4_setclientid *sc) | 2388 | static void nfs4_xdr_enc_setclientid(struct rpc_rqst *req, |
2389 | struct xdr_stream *xdr, | ||
2390 | struct nfs4_setclientid *sc) | ||
2446 | { | 2391 | { |
2447 | struct xdr_stream xdr; | ||
2448 | struct compound_hdr hdr = { | 2392 | struct compound_hdr hdr = { |
2449 | .nops = 0, | 2393 | .nops = 0, |
2450 | }; | 2394 | }; |
2451 | 2395 | ||
2452 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2396 | encode_compound_hdr(xdr, req, &hdr); |
2453 | encode_compound_hdr(&xdr, req, &hdr); | 2397 | encode_setclientid(xdr, sc, &hdr); |
2454 | encode_setclientid(&xdr, sc, &hdr); | ||
2455 | encode_nops(&hdr); | 2398 | encode_nops(&hdr); |
2456 | return 0; | ||
2457 | } | 2399 | } |
2458 | 2400 | ||
2459 | /* | 2401 | /* |
2460 | * a SETCLIENTID_CONFIRM request | 2402 | * a SETCLIENTID_CONFIRM request |
2461 | */ | 2403 | */ |
2462 | static int nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs4_setclientid_res *arg) | 2404 | static void nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, |
2405 | struct xdr_stream *xdr, | ||
2406 | struct nfs4_setclientid_res *arg) | ||
2463 | { | 2407 | { |
2464 | struct xdr_stream xdr; | ||
2465 | struct compound_hdr hdr = { | 2408 | struct compound_hdr hdr = { |
2466 | .nops = 0, | 2409 | .nops = 0, |
2467 | }; | 2410 | }; |
2468 | const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 }; | 2411 | const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 }; |
2469 | 2412 | ||
2470 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2413 | encode_compound_hdr(xdr, req, &hdr); |
2471 | encode_compound_hdr(&xdr, req, &hdr); | 2414 | encode_setclientid_confirm(xdr, arg, &hdr); |
2472 | encode_setclientid_confirm(&xdr, arg, &hdr); | 2415 | encode_putrootfh(xdr, &hdr); |
2473 | encode_putrootfh(&xdr, &hdr); | 2416 | encode_fsinfo(xdr, lease_bitmap, &hdr); |
2474 | encode_fsinfo(&xdr, lease_bitmap, &hdr); | ||
2475 | encode_nops(&hdr); | 2417 | encode_nops(&hdr); |
2476 | return 0; | ||
2477 | } | 2418 | } |
2478 | 2419 | ||
2479 | /* | 2420 | /* |
2480 | * DELEGRETURN request | 2421 | * DELEGRETURN request |
2481 | */ | 2422 | */ |
2482 | static int nfs4_xdr_enc_delegreturn(struct rpc_rqst *req, __be32 *p, const struct nfs4_delegreturnargs *args) | 2423 | static void nfs4_xdr_enc_delegreturn(struct rpc_rqst *req, |
2424 | struct xdr_stream *xdr, | ||
2425 | const struct nfs4_delegreturnargs *args) | ||
2483 | { | 2426 | { |
2484 | struct xdr_stream xdr; | ||
2485 | struct compound_hdr hdr = { | 2427 | struct compound_hdr hdr = { |
2486 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2428 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2487 | }; | 2429 | }; |
2488 | 2430 | ||
2489 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2431 | encode_compound_hdr(xdr, req, &hdr); |
2490 | encode_compound_hdr(&xdr, req, &hdr); | 2432 | encode_sequence(xdr, &args->seq_args, &hdr); |
2491 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2433 | encode_putfh(xdr, args->fhandle, &hdr); |
2492 | encode_putfh(&xdr, args->fhandle, &hdr); | 2434 | encode_delegreturn(xdr, args->stateid, &hdr); |
2493 | encode_delegreturn(&xdr, args->stateid, &hdr); | 2435 | encode_getfattr(xdr, args->bitmask, &hdr); |
2494 | encode_getfattr(&xdr, args->bitmask, &hdr); | ||
2495 | encode_nops(&hdr); | 2436 | encode_nops(&hdr); |
2496 | return 0; | ||
2497 | } | 2437 | } |
2498 | 2438 | ||
2499 | /* | 2439 | /* |
2500 | * Encode FS_LOCATIONS request | 2440 | * Encode FS_LOCATIONS request |
2501 | */ | 2441 | */ |
2502 | static int nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, __be32 *p, struct nfs4_fs_locations_arg *args) | 2442 | static void nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, |
2443 | struct xdr_stream *xdr, | ||
2444 | struct nfs4_fs_locations_arg *args) | ||
2503 | { | 2445 | { |
2504 | struct xdr_stream xdr; | ||
2505 | struct compound_hdr hdr = { | 2446 | struct compound_hdr hdr = { |
2506 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2447 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2507 | }; | 2448 | }; |
2508 | uint32_t replen; | 2449 | uint32_t replen; |
2509 | 2450 | ||
2510 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2451 | encode_compound_hdr(xdr, req, &hdr); |
2511 | encode_compound_hdr(&xdr, req, &hdr); | 2452 | encode_sequence(xdr, &args->seq_args, &hdr); |
2512 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2453 | encode_putfh(xdr, args->dir_fh, &hdr); |
2513 | encode_putfh(&xdr, args->dir_fh, &hdr); | 2454 | encode_lookup(xdr, args->name, &hdr); |
2514 | encode_lookup(&xdr, args->name, &hdr); | ||
2515 | replen = hdr.replen; /* get the attribute into args->page */ | 2455 | replen = hdr.replen; /* get the attribute into args->page */ |
2516 | encode_fs_locations(&xdr, args->bitmask, &hdr); | 2456 | encode_fs_locations(xdr, args->bitmask, &hdr); |
2517 | 2457 | ||
2518 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, &args->page, | 2458 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, &args->page, |
2519 | 0, PAGE_SIZE); | 2459 | 0, PAGE_SIZE); |
2520 | encode_nops(&hdr); | 2460 | encode_nops(&hdr); |
2521 | return 0; | ||
2522 | } | 2461 | } |
2523 | 2462 | ||
2524 | #if defined(CONFIG_NFS_V4_1) | 2463 | #if defined(CONFIG_NFS_V4_1) |
2525 | /* | 2464 | /* |
2526 | * EXCHANGE_ID request | 2465 | * EXCHANGE_ID request |
2527 | */ | 2466 | */ |
2528 | static int nfs4_xdr_enc_exchange_id(struct rpc_rqst *req, uint32_t *p, | 2467 | static void nfs4_xdr_enc_exchange_id(struct rpc_rqst *req, |
2529 | struct nfs41_exchange_id_args *args) | 2468 | struct xdr_stream *xdr, |
2469 | struct nfs41_exchange_id_args *args) | ||
2530 | { | 2470 | { |
2531 | struct xdr_stream xdr; | ||
2532 | struct compound_hdr hdr = { | 2471 | struct compound_hdr hdr = { |
2533 | .minorversion = args->client->cl_mvops->minor_version, | 2472 | .minorversion = args->client->cl_mvops->minor_version, |
2534 | }; | 2473 | }; |
2535 | 2474 | ||
2536 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2475 | encode_compound_hdr(xdr, req, &hdr); |
2537 | encode_compound_hdr(&xdr, req, &hdr); | 2476 | encode_exchange_id(xdr, args, &hdr); |
2538 | encode_exchange_id(&xdr, args, &hdr); | ||
2539 | encode_nops(&hdr); | 2477 | encode_nops(&hdr); |
2540 | return 0; | ||
2541 | } | 2478 | } |
2542 | 2479 | ||
2543 | /* | 2480 | /* |
2544 | * a CREATE_SESSION request | 2481 | * a CREATE_SESSION request |
2545 | */ | 2482 | */ |
2546 | static int nfs4_xdr_enc_create_session(struct rpc_rqst *req, uint32_t *p, | 2483 | static void nfs4_xdr_enc_create_session(struct rpc_rqst *req, |
2547 | struct nfs41_create_session_args *args) | 2484 | struct xdr_stream *xdr, |
2485 | struct nfs41_create_session_args *args) | ||
2548 | { | 2486 | { |
2549 | struct xdr_stream xdr; | ||
2550 | struct compound_hdr hdr = { | 2487 | struct compound_hdr hdr = { |
2551 | .minorversion = args->client->cl_mvops->minor_version, | 2488 | .minorversion = args->client->cl_mvops->minor_version, |
2552 | }; | 2489 | }; |
2553 | 2490 | ||
2554 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2491 | encode_compound_hdr(xdr, req, &hdr); |
2555 | encode_compound_hdr(&xdr, req, &hdr); | 2492 | encode_create_session(xdr, args, &hdr); |
2556 | encode_create_session(&xdr, args, &hdr); | ||
2557 | encode_nops(&hdr); | 2493 | encode_nops(&hdr); |
2558 | return 0; | ||
2559 | } | 2494 | } |
2560 | 2495 | ||
2561 | /* | 2496 | /* |
2562 | * a DESTROY_SESSION request | 2497 | * a DESTROY_SESSION request |
2563 | */ | 2498 | */ |
2564 | static int nfs4_xdr_enc_destroy_session(struct rpc_rqst *req, uint32_t *p, | 2499 | static void nfs4_xdr_enc_destroy_session(struct rpc_rqst *req, |
2565 | struct nfs4_session *session) | 2500 | struct xdr_stream *xdr, |
2501 | struct nfs4_session *session) | ||
2566 | { | 2502 | { |
2567 | struct xdr_stream xdr; | ||
2568 | struct compound_hdr hdr = { | 2503 | struct compound_hdr hdr = { |
2569 | .minorversion = session->clp->cl_mvops->minor_version, | 2504 | .minorversion = session->clp->cl_mvops->minor_version, |
2570 | }; | 2505 | }; |
2571 | 2506 | ||
2572 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2507 | encode_compound_hdr(xdr, req, &hdr); |
2573 | encode_compound_hdr(&xdr, req, &hdr); | 2508 | encode_destroy_session(xdr, session, &hdr); |
2574 | encode_destroy_session(&xdr, session, &hdr); | ||
2575 | encode_nops(&hdr); | 2509 | encode_nops(&hdr); |
2576 | return 0; | ||
2577 | } | 2510 | } |
2578 | 2511 | ||
2579 | /* | 2512 | /* |
2580 | * a SEQUENCE request | 2513 | * a SEQUENCE request |
2581 | */ | 2514 | */ |
2582 | static int nfs4_xdr_enc_sequence(struct rpc_rqst *req, uint32_t *p, | 2515 | static void nfs4_xdr_enc_sequence(struct rpc_rqst *req, struct xdr_stream *xdr, |
2583 | struct nfs4_sequence_args *args) | 2516 | struct nfs4_sequence_args *args) |
2584 | { | 2517 | { |
2585 | struct xdr_stream xdr; | ||
2586 | struct compound_hdr hdr = { | 2518 | struct compound_hdr hdr = { |
2587 | .minorversion = nfs4_xdr_minorversion(args), | 2519 | .minorversion = nfs4_xdr_minorversion(args), |
2588 | }; | 2520 | }; |
2589 | 2521 | ||
2590 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2522 | encode_compound_hdr(xdr, req, &hdr); |
2591 | encode_compound_hdr(&xdr, req, &hdr); | 2523 | encode_sequence(xdr, args, &hdr); |
2592 | encode_sequence(&xdr, args, &hdr); | ||
2593 | encode_nops(&hdr); | 2524 | encode_nops(&hdr); |
2594 | return 0; | ||
2595 | } | 2525 | } |
2596 | 2526 | ||
2597 | /* | 2527 | /* |
2598 | * a GET_LEASE_TIME request | 2528 | * a GET_LEASE_TIME request |
2599 | */ | 2529 | */ |
2600 | static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p, | 2530 | static void nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, |
2601 | struct nfs4_get_lease_time_args *args) | 2531 | struct xdr_stream *xdr, |
2532 | struct nfs4_get_lease_time_args *args) | ||
2602 | { | 2533 | { |
2603 | struct xdr_stream xdr; | ||
2604 | struct compound_hdr hdr = { | 2534 | struct compound_hdr hdr = { |
2605 | .minorversion = nfs4_xdr_minorversion(&args->la_seq_args), | 2535 | .minorversion = nfs4_xdr_minorversion(&args->la_seq_args), |
2606 | }; | 2536 | }; |
2607 | const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 }; | 2537 | const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 }; |
2608 | 2538 | ||
2609 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2539 | encode_compound_hdr(xdr, req, &hdr); |
2610 | encode_compound_hdr(&xdr, req, &hdr); | 2540 | encode_sequence(xdr, &args->la_seq_args, &hdr); |
2611 | encode_sequence(&xdr, &args->la_seq_args, &hdr); | 2541 | encode_putrootfh(xdr, &hdr); |
2612 | encode_putrootfh(&xdr, &hdr); | 2542 | encode_fsinfo(xdr, lease_bitmap, &hdr); |
2613 | encode_fsinfo(&xdr, lease_bitmap, &hdr); | ||
2614 | encode_nops(&hdr); | 2543 | encode_nops(&hdr); |
2615 | return 0; | ||
2616 | } | 2544 | } |
2617 | 2545 | ||
2618 | /* | 2546 | /* |
2619 | * a RECLAIM_COMPLETE request | 2547 | * a RECLAIM_COMPLETE request |
2620 | */ | 2548 | */ |
2621 | static int nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req, uint32_t *p, | 2549 | static void nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req, |
2622 | struct nfs41_reclaim_complete_args *args) | 2550 | struct xdr_stream *xdr, |
2551 | struct nfs41_reclaim_complete_args *args) | ||
2623 | { | 2552 | { |
2624 | struct xdr_stream xdr; | ||
2625 | struct compound_hdr hdr = { | 2553 | struct compound_hdr hdr = { |
2626 | .minorversion = nfs4_xdr_minorversion(&args->seq_args) | 2554 | .minorversion = nfs4_xdr_minorversion(&args->seq_args) |
2627 | }; | 2555 | }; |
2628 | 2556 | ||
2629 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2557 | encode_compound_hdr(xdr, req, &hdr); |
2630 | encode_compound_hdr(&xdr, req, &hdr); | 2558 | encode_sequence(xdr, &args->seq_args, &hdr); |
2631 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2559 | encode_reclaim_complete(xdr, args, &hdr); |
2632 | encode_reclaim_complete(&xdr, args, &hdr); | ||
2633 | encode_nops(&hdr); | 2560 | encode_nops(&hdr); |
2634 | return 0; | ||
2635 | } | 2561 | } |
2636 | 2562 | ||
2637 | /* | 2563 | /* |
2638 | * Encode GETDEVICEINFO request | 2564 | * Encode GETDEVICEINFO request |
2639 | */ | 2565 | */ |
2640 | static int nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req, uint32_t *p, | 2566 | static void nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req, |
2641 | struct nfs4_getdeviceinfo_args *args) | 2567 | struct xdr_stream *xdr, |
2568 | struct nfs4_getdeviceinfo_args *args) | ||
2642 | { | 2569 | { |
2643 | struct xdr_stream xdr; | ||
2644 | struct compound_hdr hdr = { | 2570 | struct compound_hdr hdr = { |
2645 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2571 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2646 | }; | 2572 | }; |
2647 | 2573 | ||
2648 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2574 | encode_compound_hdr(xdr, req, &hdr); |
2649 | encode_compound_hdr(&xdr, req, &hdr); | 2575 | encode_sequence(xdr, &args->seq_args, &hdr); |
2650 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2576 | encode_getdeviceinfo(xdr, args, &hdr); |
2651 | encode_getdeviceinfo(&xdr, args, &hdr); | ||
2652 | 2577 | ||
2653 | /* set up reply kvec. Subtract notification bitmap max size (2) | 2578 | /* set up reply kvec. Subtract notification bitmap max size (2) |
2654 | * so that notification bitmap is put in xdr_buf tail */ | 2579 | * so that notification bitmap is put in xdr_buf tail */ |
@@ -2657,27 +2582,24 @@ static int nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req, uint32_t *p, | |||
2657 | args->pdev->pglen); | 2582 | args->pdev->pglen); |
2658 | 2583 | ||
2659 | encode_nops(&hdr); | 2584 | encode_nops(&hdr); |
2660 | return 0; | ||
2661 | } | 2585 | } |
2662 | 2586 | ||
2663 | /* | 2587 | /* |
2664 | * Encode LAYOUTGET request | 2588 | * Encode LAYOUTGET request |
2665 | */ | 2589 | */ |
2666 | static int nfs4_xdr_enc_layoutget(struct rpc_rqst *req, uint32_t *p, | 2590 | static void nfs4_xdr_enc_layoutget(struct rpc_rqst *req, |
2667 | struct nfs4_layoutget_args *args) | 2591 | struct xdr_stream *xdr, |
2592 | struct nfs4_layoutget_args *args) | ||
2668 | { | 2593 | { |
2669 | struct xdr_stream xdr; | ||
2670 | struct compound_hdr hdr = { | 2594 | struct compound_hdr hdr = { |
2671 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 2595 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
2672 | }; | 2596 | }; |
2673 | 2597 | ||
2674 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 2598 | encode_compound_hdr(xdr, req, &hdr); |
2675 | encode_compound_hdr(&xdr, req, &hdr); | 2599 | encode_sequence(xdr, &args->seq_args, &hdr); |
2676 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2600 | encode_putfh(xdr, NFS_FH(args->inode), &hdr); |
2677 | encode_putfh(&xdr, NFS_FH(args->inode), &hdr); | 2601 | encode_layoutget(xdr, args, &hdr); |
2678 | encode_layoutget(&xdr, args, &hdr); | ||
2679 | encode_nops(&hdr); | 2602 | encode_nops(&hdr); |
2680 | return 0; | ||
2681 | } | 2603 | } |
2682 | #endif /* CONFIG_NFS_V4_1 */ | 2604 | #endif /* CONFIG_NFS_V4_1 */ |
2683 | 2605 | ||
@@ -4475,7 +4397,7 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_ | |||
4475 | goto out_overflow; | 4397 | goto out_overflow; |
4476 | eof = be32_to_cpup(p++); | 4398 | eof = be32_to_cpup(p++); |
4477 | count = be32_to_cpup(p); | 4399 | count = be32_to_cpup(p); |
4478 | hdrlen = (u8 *) p - (u8 *) iov->iov_base; | 4400 | hdrlen = (u8 *) xdr->p - (u8 *) iov->iov_base; |
4479 | recvd = req->rq_rcv_buf.len - hdrlen; | 4401 | recvd = req->rq_rcv_buf.len - hdrlen; |
4480 | if (count > recvd) { | 4402 | if (count > recvd) { |
4481 | dprintk("NFS: server cheating in read reply: " | 4403 | dprintk("NFS: server cheating in read reply: " |
@@ -5000,7 +4922,7 @@ static int decode_getdeviceinfo(struct xdr_stream *xdr, | |||
5000 | goto out_overflow; | 4922 | goto out_overflow; |
5001 | len = be32_to_cpup(p); | 4923 | len = be32_to_cpup(p); |
5002 | if (len) { | 4924 | if (len) { |
5003 | int i; | 4925 | uint32_t i; |
5004 | 4926 | ||
5005 | p = xdr_inline_decode(xdr, 4 * len); | 4927 | p = xdr_inline_decode(xdr, 4 * len); |
5006 | if (unlikely(!p)) | 4928 | if (unlikely(!p)) |
@@ -5090,26 +5012,26 @@ out_overflow: | |||
5090 | /* | 5012 | /* |
5091 | * Decode OPEN_DOWNGRADE response | 5013 | * Decode OPEN_DOWNGRADE response |
5092 | */ | 5014 | */ |
5093 | static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res) | 5015 | static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, |
5016 | struct xdr_stream *xdr, | ||
5017 | struct nfs_closeres *res) | ||
5094 | { | 5018 | { |
5095 | struct xdr_stream xdr; | ||
5096 | struct compound_hdr hdr; | 5019 | struct compound_hdr hdr; |
5097 | int status; | 5020 | int status; |
5098 | 5021 | ||
5099 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5022 | status = decode_compound_hdr(xdr, &hdr); |
5100 | status = decode_compound_hdr(&xdr, &hdr); | ||
5101 | if (status) | 5023 | if (status) |
5102 | goto out; | 5024 | goto out; |
5103 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5025 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5104 | if (status) | 5026 | if (status) |
5105 | goto out; | 5027 | goto out; |
5106 | status = decode_putfh(&xdr); | 5028 | status = decode_putfh(xdr); |
5107 | if (status) | 5029 | if (status) |
5108 | goto out; | 5030 | goto out; |
5109 | status = decode_open_downgrade(&xdr, res); | 5031 | status = decode_open_downgrade(xdr, res); |
5110 | if (status != 0) | 5032 | if (status != 0) |
5111 | goto out; | 5033 | goto out; |
5112 | decode_getfattr(&xdr, res->fattr, res->server, | 5034 | decode_getfattr(xdr, res->fattr, res->server, |
5113 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5035 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5114 | out: | 5036 | out: |
5115 | return status; | 5037 | return status; |
@@ -5118,26 +5040,25 @@ out: | |||
5118 | /* | 5040 | /* |
5119 | * Decode ACCESS response | 5041 | * Decode ACCESS response |
5120 | */ | 5042 | */ |
5121 | static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_accessres *res) | 5043 | static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5044 | struct nfs4_accessres *res) | ||
5122 | { | 5045 | { |
5123 | struct xdr_stream xdr; | ||
5124 | struct compound_hdr hdr; | 5046 | struct compound_hdr hdr; |
5125 | int status; | 5047 | int status; |
5126 | 5048 | ||
5127 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5049 | status = decode_compound_hdr(xdr, &hdr); |
5128 | status = decode_compound_hdr(&xdr, &hdr); | ||
5129 | if (status) | 5050 | if (status) |
5130 | goto out; | 5051 | goto out; |
5131 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5052 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5132 | if (status) | 5053 | if (status) |
5133 | goto out; | 5054 | goto out; |
5134 | status = decode_putfh(&xdr); | 5055 | status = decode_putfh(xdr); |
5135 | if (status != 0) | 5056 | if (status != 0) |
5136 | goto out; | 5057 | goto out; |
5137 | status = decode_access(&xdr, res); | 5058 | status = decode_access(xdr, res); |
5138 | if (status != 0) | 5059 | if (status != 0) |
5139 | goto out; | 5060 | goto out; |
5140 | decode_getfattr(&xdr, res->fattr, res->server, | 5061 | decode_getfattr(xdr, res->fattr, res->server, |
5141 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5062 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5142 | out: | 5063 | out: |
5143 | return status; | 5064 | return status; |
@@ -5146,26 +5067,28 @@ out: | |||
5146 | /* | 5067 | /* |
5147 | * Decode LOOKUP response | 5068 | * Decode LOOKUP response |
5148 | */ | 5069 | */ |
5149 | static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_lookup_res *res) | 5070 | static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5071 | struct nfs4_lookup_res *res) | ||
5150 | { | 5072 | { |
5151 | struct xdr_stream xdr; | ||
5152 | struct compound_hdr hdr; | 5073 | struct compound_hdr hdr; |
5153 | int status; | 5074 | int status; |
5154 | 5075 | ||
5155 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5076 | status = decode_compound_hdr(xdr, &hdr); |
5156 | status = decode_compound_hdr(&xdr, &hdr); | ||
5157 | if (status) | 5077 | if (status) |
5158 | goto out; | 5078 | goto out; |
5159 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5079 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5160 | if (status) | 5080 | if (status) |
5161 | goto out; | 5081 | goto out; |
5162 | if ((status = decode_putfh(&xdr)) != 0) | 5082 | status = decode_putfh(xdr); |
5083 | if (status) | ||
5163 | goto out; | 5084 | goto out; |
5164 | if ((status = decode_lookup(&xdr)) != 0) | 5085 | status = decode_lookup(xdr); |
5086 | if (status) | ||
5165 | goto out; | 5087 | goto out; |
5166 | if ((status = decode_getfh(&xdr, res->fh)) != 0) | 5088 | status = decode_getfh(xdr, res->fh); |
5089 | if (status) | ||
5167 | goto out; | 5090 | goto out; |
5168 | status = decode_getfattr(&xdr, res->fattr, res->server | 5091 | status = decode_getfattr(xdr, res->fattr, res->server |
5169 | ,!RPC_IS_ASYNC(rqstp->rq_task)); | 5092 | ,!RPC_IS_ASYNC(rqstp->rq_task)); |
5170 | out: | 5093 | out: |
5171 | return status; | 5094 | return status; |
@@ -5174,23 +5097,25 @@ out: | |||
5174 | /* | 5097 | /* |
5175 | * Decode LOOKUP_ROOT response | 5098 | * Decode LOOKUP_ROOT response |
5176 | */ | 5099 | */ |
5177 | static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_lookup_res *res) | 5100 | static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp, |
5101 | struct xdr_stream *xdr, | ||
5102 | struct nfs4_lookup_res *res) | ||
5178 | { | 5103 | { |
5179 | struct xdr_stream xdr; | ||
5180 | struct compound_hdr hdr; | 5104 | struct compound_hdr hdr; |
5181 | int status; | 5105 | int status; |
5182 | 5106 | ||
5183 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5107 | status = decode_compound_hdr(xdr, &hdr); |
5184 | status = decode_compound_hdr(&xdr, &hdr); | ||
5185 | if (status) | 5108 | if (status) |
5186 | goto out; | 5109 | goto out; |
5187 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5110 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5188 | if (status) | 5111 | if (status) |
5189 | goto out; | 5112 | goto out; |
5190 | if ((status = decode_putrootfh(&xdr)) != 0) | 5113 | status = decode_putrootfh(xdr); |
5114 | if (status) | ||
5191 | goto out; | 5115 | goto out; |
5192 | if ((status = decode_getfh(&xdr, res->fh)) == 0) | 5116 | status = decode_getfh(xdr, res->fh); |
5193 | status = decode_getfattr(&xdr, res->fattr, res->server, | 5117 | if (status == 0) |
5118 | status = decode_getfattr(xdr, res->fattr, res->server, | ||
5194 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5119 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5195 | out: | 5120 | out: |
5196 | return status; | 5121 | return status; |
@@ -5199,24 +5124,25 @@ out: | |||
5199 | /* | 5124 | /* |
5200 | * Decode REMOVE response | 5125 | * Decode REMOVE response |
5201 | */ | 5126 | */ |
5202 | static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, __be32 *p, struct nfs_removeres *res) | 5127 | static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5128 | struct nfs_removeres *res) | ||
5203 | { | 5129 | { |
5204 | struct xdr_stream xdr; | ||
5205 | struct compound_hdr hdr; | 5130 | struct compound_hdr hdr; |
5206 | int status; | 5131 | int status; |
5207 | 5132 | ||
5208 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5133 | status = decode_compound_hdr(xdr, &hdr); |
5209 | status = decode_compound_hdr(&xdr, &hdr); | ||
5210 | if (status) | 5134 | if (status) |
5211 | goto out; | 5135 | goto out; |
5212 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5136 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5213 | if (status) | 5137 | if (status) |
5214 | goto out; | 5138 | goto out; |
5215 | if ((status = decode_putfh(&xdr)) != 0) | 5139 | status = decode_putfh(xdr); |
5140 | if (status) | ||
5216 | goto out; | 5141 | goto out; |
5217 | if ((status = decode_remove(&xdr, &res->cinfo)) != 0) | 5142 | status = decode_remove(xdr, &res->cinfo); |
5143 | if (status) | ||
5218 | goto out; | 5144 | goto out; |
5219 | decode_getfattr(&xdr, res->dir_attr, res->server, | 5145 | decode_getfattr(xdr, res->dir_attr, res->server, |
5220 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5146 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5221 | out: | 5147 | out: |
5222 | return status; | 5148 | return status; |
@@ -5225,34 +5151,38 @@ out: | |||
5225 | /* | 5151 | /* |
5226 | * Decode RENAME response | 5152 | * Decode RENAME response |
5227 | */ | 5153 | */ |
5228 | static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, __be32 *p, struct nfs_renameres *res) | 5154 | static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5155 | struct nfs_renameres *res) | ||
5229 | { | 5156 | { |
5230 | struct xdr_stream xdr; | ||
5231 | struct compound_hdr hdr; | 5157 | struct compound_hdr hdr; |
5232 | int status; | 5158 | int status; |
5233 | 5159 | ||
5234 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5160 | status = decode_compound_hdr(xdr, &hdr); |
5235 | status = decode_compound_hdr(&xdr, &hdr); | ||
5236 | if (status) | 5161 | if (status) |
5237 | goto out; | 5162 | goto out; |
5238 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5163 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5239 | if (status) | 5164 | if (status) |
5240 | goto out; | 5165 | goto out; |
5241 | if ((status = decode_putfh(&xdr)) != 0) | 5166 | status = decode_putfh(xdr); |
5167 | if (status) | ||
5242 | goto out; | 5168 | goto out; |
5243 | if ((status = decode_savefh(&xdr)) != 0) | 5169 | status = decode_savefh(xdr); |
5170 | if (status) | ||
5244 | goto out; | 5171 | goto out; |
5245 | if ((status = decode_putfh(&xdr)) != 0) | 5172 | status = decode_putfh(xdr); |
5173 | if (status) | ||
5246 | goto out; | 5174 | goto out; |
5247 | if ((status = decode_rename(&xdr, &res->old_cinfo, &res->new_cinfo)) != 0) | 5175 | status = decode_rename(xdr, &res->old_cinfo, &res->new_cinfo); |
5176 | if (status) | ||
5248 | goto out; | 5177 | goto out; |
5249 | /* Current FH is target directory */ | 5178 | /* Current FH is target directory */ |
5250 | if (decode_getfattr(&xdr, res->new_fattr, res->server, | 5179 | if (decode_getfattr(xdr, res->new_fattr, res->server, |
5251 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) | 5180 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) |
5252 | goto out; | 5181 | goto out; |
5253 | if ((status = decode_restorefh(&xdr)) != 0) | 5182 | status = decode_restorefh(xdr); |
5183 | if (status) | ||
5254 | goto out; | 5184 | goto out; |
5255 | decode_getfattr(&xdr, res->old_fattr, res->server, | 5185 | decode_getfattr(xdr, res->old_fattr, res->server, |
5256 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5186 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5257 | out: | 5187 | out: |
5258 | return status; | 5188 | return status; |
@@ -5261,37 +5191,41 @@ out: | |||
5261 | /* | 5191 | /* |
5262 | * Decode LINK response | 5192 | * Decode LINK response |
5263 | */ | 5193 | */ |
5264 | static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_link_res *res) | 5194 | static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5195 | struct nfs4_link_res *res) | ||
5265 | { | 5196 | { |
5266 | struct xdr_stream xdr; | ||
5267 | struct compound_hdr hdr; | 5197 | struct compound_hdr hdr; |
5268 | int status; | 5198 | int status; |
5269 | 5199 | ||
5270 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5200 | status = decode_compound_hdr(xdr, &hdr); |
5271 | status = decode_compound_hdr(&xdr, &hdr); | ||
5272 | if (status) | 5201 | if (status) |
5273 | goto out; | 5202 | goto out; |
5274 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5203 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5275 | if (status) | 5204 | if (status) |
5276 | goto out; | 5205 | goto out; |
5277 | if ((status = decode_putfh(&xdr)) != 0) | 5206 | status = decode_putfh(xdr); |
5207 | if (status) | ||
5278 | goto out; | 5208 | goto out; |
5279 | if ((status = decode_savefh(&xdr)) != 0) | 5209 | status = decode_savefh(xdr); |
5210 | if (status) | ||
5280 | goto out; | 5211 | goto out; |
5281 | if ((status = decode_putfh(&xdr)) != 0) | 5212 | status = decode_putfh(xdr); |
5213 | if (status) | ||
5282 | goto out; | 5214 | goto out; |
5283 | if ((status = decode_link(&xdr, &res->cinfo)) != 0) | 5215 | status = decode_link(xdr, &res->cinfo); |
5216 | if (status) | ||
5284 | goto out; | 5217 | goto out; |
5285 | /* | 5218 | /* |
5286 | * Note order: OP_LINK leaves the directory as the current | 5219 | * Note order: OP_LINK leaves the directory as the current |
5287 | * filehandle. | 5220 | * filehandle. |
5288 | */ | 5221 | */ |
5289 | if (decode_getfattr(&xdr, res->dir_attr, res->server, | 5222 | if (decode_getfattr(xdr, res->dir_attr, res->server, |
5290 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) | 5223 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) |
5291 | goto out; | 5224 | goto out; |
5292 | if ((status = decode_restorefh(&xdr)) != 0) | 5225 | status = decode_restorefh(xdr); |
5226 | if (status) | ||
5293 | goto out; | 5227 | goto out; |
5294 | decode_getfattr(&xdr, res->fattr, res->server, | 5228 | decode_getfattr(xdr, res->fattr, res->server, |
5295 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5229 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5296 | out: | 5230 | out: |
5297 | return status; | 5231 | return status; |
@@ -5300,33 +5234,37 @@ out: | |||
5300 | /* | 5234 | /* |
5301 | * Decode CREATE response | 5235 | * Decode CREATE response |
5302 | */ | 5236 | */ |
5303 | static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_create_res *res) | 5237 | static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5238 | struct nfs4_create_res *res) | ||
5304 | { | 5239 | { |
5305 | struct xdr_stream xdr; | ||
5306 | struct compound_hdr hdr; | 5240 | struct compound_hdr hdr; |
5307 | int status; | 5241 | int status; |
5308 | 5242 | ||
5309 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5243 | status = decode_compound_hdr(xdr, &hdr); |
5310 | status = decode_compound_hdr(&xdr, &hdr); | ||
5311 | if (status) | 5244 | if (status) |
5312 | goto out; | 5245 | goto out; |
5313 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5246 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5314 | if (status) | 5247 | if (status) |
5315 | goto out; | 5248 | goto out; |
5316 | if ((status = decode_putfh(&xdr)) != 0) | 5249 | status = decode_putfh(xdr); |
5250 | if (status) | ||
5317 | goto out; | 5251 | goto out; |
5318 | if ((status = decode_savefh(&xdr)) != 0) | 5252 | status = decode_savefh(xdr); |
5253 | if (status) | ||
5319 | goto out; | 5254 | goto out; |
5320 | if ((status = decode_create(&xdr,&res->dir_cinfo)) != 0) | 5255 | status = decode_create(xdr, &res->dir_cinfo); |
5256 | if (status) | ||
5321 | goto out; | 5257 | goto out; |
5322 | if ((status = decode_getfh(&xdr, res->fh)) != 0) | 5258 | status = decode_getfh(xdr, res->fh); |
5259 | if (status) | ||
5323 | goto out; | 5260 | goto out; |
5324 | if (decode_getfattr(&xdr, res->fattr, res->server, | 5261 | if (decode_getfattr(xdr, res->fattr, res->server, |
5325 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) | 5262 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) |
5326 | goto out; | 5263 | goto out; |
5327 | if ((status = decode_restorefh(&xdr)) != 0) | 5264 | status = decode_restorefh(xdr); |
5265 | if (status) | ||
5328 | goto out; | 5266 | goto out; |
5329 | decode_getfattr(&xdr, res->dir_fattr, res->server, | 5267 | decode_getfattr(xdr, res->dir_fattr, res->server, |
5330 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5268 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5331 | out: | 5269 | out: |
5332 | return status; | 5270 | return status; |
@@ -5335,31 +5273,31 @@ out: | |||
5335 | /* | 5273 | /* |
5336 | * Decode SYMLINK response | 5274 | * Decode SYMLINK response |
5337 | */ | 5275 | */ |
5338 | static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_create_res *res) | 5276 | static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5277 | struct nfs4_create_res *res) | ||
5339 | { | 5278 | { |
5340 | return nfs4_xdr_dec_create(rqstp, p, res); | 5279 | return nfs4_xdr_dec_create(rqstp, xdr, res); |
5341 | } | 5280 | } |
5342 | 5281 | ||
5343 | /* | 5282 | /* |
5344 | * Decode GETATTR response | 5283 | * Decode GETATTR response |
5345 | */ | 5284 | */ |
5346 | static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_getattr_res *res) | 5285 | static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5286 | struct nfs4_getattr_res *res) | ||
5347 | { | 5287 | { |
5348 | struct xdr_stream xdr; | ||
5349 | struct compound_hdr hdr; | 5288 | struct compound_hdr hdr; |
5350 | int status; | 5289 | int status; |
5351 | 5290 | ||
5352 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5291 | status = decode_compound_hdr(xdr, &hdr); |
5353 | status = decode_compound_hdr(&xdr, &hdr); | ||
5354 | if (status) | 5292 | if (status) |
5355 | goto out; | 5293 | goto out; |
5356 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5294 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5357 | if (status) | 5295 | if (status) |
5358 | goto out; | 5296 | goto out; |
5359 | status = decode_putfh(&xdr); | 5297 | status = decode_putfh(xdr); |
5360 | if (status) | 5298 | if (status) |
5361 | goto out; | 5299 | goto out; |
5362 | status = decode_getfattr(&xdr, res->fattr, res->server, | 5300 | status = decode_getfattr(xdr, res->fattr, res->server, |
5363 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5301 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5364 | out: | 5302 | out: |
5365 | return status; | 5303 | return status; |
@@ -5368,46 +5306,40 @@ out: | |||
5368 | /* | 5306 | /* |
5369 | * Encode an SETACL request | 5307 | * Encode an SETACL request |
5370 | */ | 5308 | */ |
5371 | static int | 5309 | static void nfs4_xdr_enc_setacl(struct rpc_rqst *req, struct xdr_stream *xdr, |
5372 | nfs4_xdr_enc_setacl(struct rpc_rqst *req, __be32 *p, struct nfs_setaclargs *args) | 5310 | struct nfs_setaclargs *args) |
5373 | { | 5311 | { |
5374 | struct xdr_stream xdr; | ||
5375 | struct compound_hdr hdr = { | 5312 | struct compound_hdr hdr = { |
5376 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), | 5313 | .minorversion = nfs4_xdr_minorversion(&args->seq_args), |
5377 | }; | 5314 | }; |
5378 | int status; | ||
5379 | 5315 | ||
5380 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 5316 | encode_compound_hdr(xdr, req, &hdr); |
5381 | encode_compound_hdr(&xdr, req, &hdr); | 5317 | encode_sequence(xdr, &args->seq_args, &hdr); |
5382 | encode_sequence(&xdr, &args->seq_args, &hdr); | 5318 | encode_putfh(xdr, args->fh, &hdr); |
5383 | encode_putfh(&xdr, args->fh, &hdr); | 5319 | encode_setacl(xdr, args, &hdr); |
5384 | status = encode_setacl(&xdr, args, &hdr); | ||
5385 | encode_nops(&hdr); | 5320 | encode_nops(&hdr); |
5386 | return status; | ||
5387 | } | 5321 | } |
5388 | 5322 | ||
5389 | /* | 5323 | /* |
5390 | * Decode SETACL response | 5324 | * Decode SETACL response |
5391 | */ | 5325 | */ |
5392 | static int | 5326 | static int |
5393 | nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, __be32 *p, | 5327 | nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5394 | struct nfs_setaclres *res) | 5328 | struct nfs_setaclres *res) |
5395 | { | 5329 | { |
5396 | struct xdr_stream xdr; | ||
5397 | struct compound_hdr hdr; | 5330 | struct compound_hdr hdr; |
5398 | int status; | 5331 | int status; |
5399 | 5332 | ||
5400 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5333 | status = decode_compound_hdr(xdr, &hdr); |
5401 | status = decode_compound_hdr(&xdr, &hdr); | ||
5402 | if (status) | 5334 | if (status) |
5403 | goto out; | 5335 | goto out; |
5404 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5336 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5405 | if (status) | 5337 | if (status) |
5406 | goto out; | 5338 | goto out; |
5407 | status = decode_putfh(&xdr); | 5339 | status = decode_putfh(xdr); |
5408 | if (status) | 5340 | if (status) |
5409 | goto out; | 5341 | goto out; |
5410 | status = decode_setattr(&xdr); | 5342 | status = decode_setattr(xdr); |
5411 | out: | 5343 | out: |
5412 | return status; | 5344 | return status; |
5413 | } | 5345 | } |
@@ -5416,24 +5348,22 @@ out: | |||
5416 | * Decode GETACL response | 5348 | * Decode GETACL response |
5417 | */ | 5349 | */ |
5418 | static int | 5350 | static int |
5419 | nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, __be32 *p, | 5351 | nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5420 | struct nfs_getaclres *res) | 5352 | struct nfs_getaclres *res) |
5421 | { | 5353 | { |
5422 | struct xdr_stream xdr; | ||
5423 | struct compound_hdr hdr; | 5354 | struct compound_hdr hdr; |
5424 | int status; | 5355 | int status; |
5425 | 5356 | ||
5426 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5357 | status = decode_compound_hdr(xdr, &hdr); |
5427 | status = decode_compound_hdr(&xdr, &hdr); | ||
5428 | if (status) | 5358 | if (status) |
5429 | goto out; | 5359 | goto out; |
5430 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5360 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5431 | if (status) | 5361 | if (status) |
5432 | goto out; | 5362 | goto out; |
5433 | status = decode_putfh(&xdr); | 5363 | status = decode_putfh(xdr); |
5434 | if (status) | 5364 | if (status) |
5435 | goto out; | 5365 | goto out; |
5436 | status = decode_getacl(&xdr, rqstp, &res->acl_len); | 5366 | status = decode_getacl(xdr, rqstp, &res->acl_len); |
5437 | 5367 | ||
5438 | out: | 5368 | out: |
5439 | return status; | 5369 | return status; |
@@ -5442,23 +5372,22 @@ out: | |||
5442 | /* | 5372 | /* |
5443 | * Decode CLOSE response | 5373 | * Decode CLOSE response |
5444 | */ | 5374 | */ |
5445 | static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res) | 5375 | static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5376 | struct nfs_closeres *res) | ||
5446 | { | 5377 | { |
5447 | struct xdr_stream xdr; | ||
5448 | struct compound_hdr hdr; | 5378 | struct compound_hdr hdr; |
5449 | int status; | 5379 | int status; |
5450 | 5380 | ||
5451 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5381 | status = decode_compound_hdr(xdr, &hdr); |
5452 | status = decode_compound_hdr(&xdr, &hdr); | ||
5453 | if (status) | 5382 | if (status) |
5454 | goto out; | 5383 | goto out; |
5455 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5384 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5456 | if (status) | 5385 | if (status) |
5457 | goto out; | 5386 | goto out; |
5458 | status = decode_putfh(&xdr); | 5387 | status = decode_putfh(xdr); |
5459 | if (status) | 5388 | if (status) |
5460 | goto out; | 5389 | goto out; |
5461 | status = decode_close(&xdr, res); | 5390 | status = decode_close(xdr, res); |
5462 | if (status != 0) | 5391 | if (status != 0) |
5463 | goto out; | 5392 | goto out; |
5464 | /* | 5393 | /* |
@@ -5467,7 +5396,7 @@ static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_clos | |||
5467 | * an ESTALE error. Shouldn't be a problem, | 5396 | * an ESTALE error. Shouldn't be a problem, |
5468 | * though, since fattr->valid will remain unset. | 5397 | * though, since fattr->valid will remain unset. |
5469 | */ | 5398 | */ |
5470 | decode_getfattr(&xdr, res->fattr, res->server, | 5399 | decode_getfattr(xdr, res->fattr, res->server, |
5471 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5400 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5472 | out: | 5401 | out: |
5473 | return status; | 5402 | return status; |
@@ -5476,36 +5405,35 @@ out: | |||
5476 | /* | 5405 | /* |
5477 | * Decode OPEN response | 5406 | * Decode OPEN response |
5478 | */ | 5407 | */ |
5479 | static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res) | 5408 | static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5409 | struct nfs_openres *res) | ||
5480 | { | 5410 | { |
5481 | struct xdr_stream xdr; | ||
5482 | struct compound_hdr hdr; | 5411 | struct compound_hdr hdr; |
5483 | int status; | 5412 | int status; |
5484 | 5413 | ||
5485 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5414 | status = decode_compound_hdr(xdr, &hdr); |
5486 | status = decode_compound_hdr(&xdr, &hdr); | ||
5487 | if (status) | 5415 | if (status) |
5488 | goto out; | 5416 | goto out; |
5489 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5417 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5490 | if (status) | 5418 | if (status) |
5491 | goto out; | 5419 | goto out; |
5492 | status = decode_putfh(&xdr); | 5420 | status = decode_putfh(xdr); |
5493 | if (status) | 5421 | if (status) |
5494 | goto out; | 5422 | goto out; |
5495 | status = decode_savefh(&xdr); | 5423 | status = decode_savefh(xdr); |
5496 | if (status) | 5424 | if (status) |
5497 | goto out; | 5425 | goto out; |
5498 | status = decode_open(&xdr, res); | 5426 | status = decode_open(xdr, res); |
5499 | if (status) | 5427 | if (status) |
5500 | goto out; | 5428 | goto out; |
5501 | if (decode_getfh(&xdr, &res->fh) != 0) | 5429 | if (decode_getfh(xdr, &res->fh) != 0) |
5502 | goto out; | 5430 | goto out; |
5503 | if (decode_getfattr(&xdr, res->f_attr, res->server, | 5431 | if (decode_getfattr(xdr, res->f_attr, res->server, |
5504 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) | 5432 | !RPC_IS_ASYNC(rqstp->rq_task)) != 0) |
5505 | goto out; | 5433 | goto out; |
5506 | if (decode_restorefh(&xdr) != 0) | 5434 | if (decode_restorefh(xdr) != 0) |
5507 | goto out; | 5435 | goto out; |
5508 | decode_getfattr(&xdr, res->dir_attr, res->server, | 5436 | decode_getfattr(xdr, res->dir_attr, res->server, |
5509 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5437 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5510 | out: | 5438 | out: |
5511 | return status; | 5439 | return status; |
@@ -5514,20 +5442,20 @@ out: | |||
5514 | /* | 5442 | /* |
5515 | * Decode OPEN_CONFIRM response | 5443 | * Decode OPEN_CONFIRM response |
5516 | */ | 5444 | */ |
5517 | static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, __be32 *p, struct nfs_open_confirmres *res) | 5445 | static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, |
5446 | struct xdr_stream *xdr, | ||
5447 | struct nfs_open_confirmres *res) | ||
5518 | { | 5448 | { |
5519 | struct xdr_stream xdr; | ||
5520 | struct compound_hdr hdr; | 5449 | struct compound_hdr hdr; |
5521 | int status; | 5450 | int status; |
5522 | 5451 | ||
5523 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5452 | status = decode_compound_hdr(xdr, &hdr); |
5524 | status = decode_compound_hdr(&xdr, &hdr); | ||
5525 | if (status) | 5453 | if (status) |
5526 | goto out; | 5454 | goto out; |
5527 | status = decode_putfh(&xdr); | 5455 | status = decode_putfh(xdr); |
5528 | if (status) | 5456 | if (status) |
5529 | goto out; | 5457 | goto out; |
5530 | status = decode_open_confirm(&xdr, res); | 5458 | status = decode_open_confirm(xdr, res); |
5531 | out: | 5459 | out: |
5532 | return status; | 5460 | return status; |
5533 | } | 5461 | } |
@@ -5535,26 +5463,26 @@ out: | |||
5535 | /* | 5463 | /* |
5536 | * Decode OPEN response | 5464 | * Decode OPEN response |
5537 | */ | 5465 | */ |
5538 | static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res) | 5466 | static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, |
5467 | struct xdr_stream *xdr, | ||
5468 | struct nfs_openres *res) | ||
5539 | { | 5469 | { |
5540 | struct xdr_stream xdr; | ||
5541 | struct compound_hdr hdr; | 5470 | struct compound_hdr hdr; |
5542 | int status; | 5471 | int status; |
5543 | 5472 | ||
5544 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5473 | status = decode_compound_hdr(xdr, &hdr); |
5545 | status = decode_compound_hdr(&xdr, &hdr); | ||
5546 | if (status) | 5474 | if (status) |
5547 | goto out; | 5475 | goto out; |
5548 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5476 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5549 | if (status) | 5477 | if (status) |
5550 | goto out; | 5478 | goto out; |
5551 | status = decode_putfh(&xdr); | 5479 | status = decode_putfh(xdr); |
5552 | if (status) | 5480 | if (status) |
5553 | goto out; | 5481 | goto out; |
5554 | status = decode_open(&xdr, res); | 5482 | status = decode_open(xdr, res); |
5555 | if (status) | 5483 | if (status) |
5556 | goto out; | 5484 | goto out; |
5557 | decode_getfattr(&xdr, res->f_attr, res->server, | 5485 | decode_getfattr(xdr, res->f_attr, res->server, |
5558 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5486 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5559 | out: | 5487 | out: |
5560 | return status; | 5488 | return status; |
@@ -5563,26 +5491,26 @@ out: | |||
5563 | /* | 5491 | /* |
5564 | * Decode SETATTR response | 5492 | * Decode SETATTR response |
5565 | */ | 5493 | */ |
5566 | static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_setattrres *res) | 5494 | static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, |
5495 | struct xdr_stream *xdr, | ||
5496 | struct nfs_setattrres *res) | ||
5567 | { | 5497 | { |
5568 | struct xdr_stream xdr; | ||
5569 | struct compound_hdr hdr; | 5498 | struct compound_hdr hdr; |
5570 | int status; | 5499 | int status; |
5571 | 5500 | ||
5572 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5501 | status = decode_compound_hdr(xdr, &hdr); |
5573 | status = decode_compound_hdr(&xdr, &hdr); | ||
5574 | if (status) | 5502 | if (status) |
5575 | goto out; | 5503 | goto out; |
5576 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5504 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5577 | if (status) | 5505 | if (status) |
5578 | goto out; | 5506 | goto out; |
5579 | status = decode_putfh(&xdr); | 5507 | status = decode_putfh(xdr); |
5580 | if (status) | 5508 | if (status) |
5581 | goto out; | 5509 | goto out; |
5582 | status = decode_setattr(&xdr); | 5510 | status = decode_setattr(xdr); |
5583 | if (status) | 5511 | if (status) |
5584 | goto out; | 5512 | goto out; |
5585 | decode_getfattr(&xdr, res->fattr, res->server, | 5513 | decode_getfattr(xdr, res->fattr, res->server, |
5586 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5514 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5587 | out: | 5515 | out: |
5588 | return status; | 5516 | return status; |
@@ -5591,23 +5519,22 @@ out: | |||
5591 | /* | 5519 | /* |
5592 | * Decode LOCK response | 5520 | * Decode LOCK response |
5593 | */ | 5521 | */ |
5594 | static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, __be32 *p, struct nfs_lock_res *res) | 5522 | static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5523 | struct nfs_lock_res *res) | ||
5595 | { | 5524 | { |
5596 | struct xdr_stream xdr; | ||
5597 | struct compound_hdr hdr; | 5525 | struct compound_hdr hdr; |
5598 | int status; | 5526 | int status; |
5599 | 5527 | ||
5600 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5528 | status = decode_compound_hdr(xdr, &hdr); |
5601 | status = decode_compound_hdr(&xdr, &hdr); | ||
5602 | if (status) | 5529 | if (status) |
5603 | goto out; | 5530 | goto out; |
5604 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5531 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5605 | if (status) | 5532 | if (status) |
5606 | goto out; | 5533 | goto out; |
5607 | status = decode_putfh(&xdr); | 5534 | status = decode_putfh(xdr); |
5608 | if (status) | 5535 | if (status) |
5609 | goto out; | 5536 | goto out; |
5610 | status = decode_lock(&xdr, res); | 5537 | status = decode_lock(xdr, res); |
5611 | out: | 5538 | out: |
5612 | return status; | 5539 | return status; |
5613 | } | 5540 | } |
@@ -5615,23 +5542,22 @@ out: | |||
5615 | /* | 5542 | /* |
5616 | * Decode LOCKT response | 5543 | * Decode LOCKT response |
5617 | */ | 5544 | */ |
5618 | static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, __be32 *p, struct nfs_lockt_res *res) | 5545 | static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5546 | struct nfs_lockt_res *res) | ||
5619 | { | 5547 | { |
5620 | struct xdr_stream xdr; | ||
5621 | struct compound_hdr hdr; | 5548 | struct compound_hdr hdr; |
5622 | int status; | 5549 | int status; |
5623 | 5550 | ||
5624 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5551 | status = decode_compound_hdr(xdr, &hdr); |
5625 | status = decode_compound_hdr(&xdr, &hdr); | ||
5626 | if (status) | 5552 | if (status) |
5627 | goto out; | 5553 | goto out; |
5628 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5554 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5629 | if (status) | 5555 | if (status) |
5630 | goto out; | 5556 | goto out; |
5631 | status = decode_putfh(&xdr); | 5557 | status = decode_putfh(xdr); |
5632 | if (status) | 5558 | if (status) |
5633 | goto out; | 5559 | goto out; |
5634 | status = decode_lockt(&xdr, res); | 5560 | status = decode_lockt(xdr, res); |
5635 | out: | 5561 | out: |
5636 | return status; | 5562 | return status; |
5637 | } | 5563 | } |
@@ -5639,61 +5565,58 @@ out: | |||
5639 | /* | 5565 | /* |
5640 | * Decode LOCKU response | 5566 | * Decode LOCKU response |
5641 | */ | 5567 | */ |
5642 | static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, __be32 *p, struct nfs_locku_res *res) | 5568 | static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5569 | struct nfs_locku_res *res) | ||
5643 | { | 5570 | { |
5644 | struct xdr_stream xdr; | ||
5645 | struct compound_hdr hdr; | 5571 | struct compound_hdr hdr; |
5646 | int status; | 5572 | int status; |
5647 | 5573 | ||
5648 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5574 | status = decode_compound_hdr(xdr, &hdr); |
5649 | status = decode_compound_hdr(&xdr, &hdr); | ||
5650 | if (status) | 5575 | if (status) |
5651 | goto out; | 5576 | goto out; |
5652 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5577 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5653 | if (status) | 5578 | if (status) |
5654 | goto out; | 5579 | goto out; |
5655 | status = decode_putfh(&xdr); | 5580 | status = decode_putfh(xdr); |
5656 | if (status) | 5581 | if (status) |
5657 | goto out; | 5582 | goto out; |
5658 | status = decode_locku(&xdr, res); | 5583 | status = decode_locku(xdr, res); |
5659 | out: | 5584 | out: |
5660 | return status; | 5585 | return status; |
5661 | } | 5586 | } |
5662 | 5587 | ||
5663 | static int nfs4_xdr_dec_release_lockowner(struct rpc_rqst *rqstp, __be32 *p, void *dummy) | 5588 | static int nfs4_xdr_dec_release_lockowner(struct rpc_rqst *rqstp, |
5589 | struct xdr_stream *xdr, void *dummy) | ||
5664 | { | 5590 | { |
5665 | struct xdr_stream xdr; | ||
5666 | struct compound_hdr hdr; | 5591 | struct compound_hdr hdr; |
5667 | int status; | 5592 | int status; |
5668 | 5593 | ||
5669 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5594 | status = decode_compound_hdr(xdr, &hdr); |
5670 | status = decode_compound_hdr(&xdr, &hdr); | ||
5671 | if (!status) | 5595 | if (!status) |
5672 | status = decode_release_lockowner(&xdr); | 5596 | status = decode_release_lockowner(xdr); |
5673 | return status; | 5597 | return status; |
5674 | } | 5598 | } |
5675 | 5599 | ||
5676 | /* | 5600 | /* |
5677 | * Decode READLINK response | 5601 | * Decode READLINK response |
5678 | */ | 5602 | */ |
5679 | static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp, __be32 *p, | 5603 | static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp, |
5604 | struct xdr_stream *xdr, | ||
5680 | struct nfs4_readlink_res *res) | 5605 | struct nfs4_readlink_res *res) |
5681 | { | 5606 | { |
5682 | struct xdr_stream xdr; | ||
5683 | struct compound_hdr hdr; | 5607 | struct compound_hdr hdr; |
5684 | int status; | 5608 | int status; |
5685 | 5609 | ||
5686 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5610 | status = decode_compound_hdr(xdr, &hdr); |
5687 | status = decode_compound_hdr(&xdr, &hdr); | ||
5688 | if (status) | 5611 | if (status) |
5689 | goto out; | 5612 | goto out; |
5690 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5613 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5691 | if (status) | 5614 | if (status) |
5692 | goto out; | 5615 | goto out; |
5693 | status = decode_putfh(&xdr); | 5616 | status = decode_putfh(xdr); |
5694 | if (status) | 5617 | if (status) |
5695 | goto out; | 5618 | goto out; |
5696 | status = decode_readlink(&xdr, rqstp); | 5619 | status = decode_readlink(xdr, rqstp); |
5697 | out: | 5620 | out: |
5698 | return status; | 5621 | return status; |
5699 | } | 5622 | } |
@@ -5701,23 +5624,22 @@ out: | |||
5701 | /* | 5624 | /* |
5702 | * Decode READDIR response | 5625 | * Decode READDIR response |
5703 | */ | 5626 | */ |
5704 | static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_readdir_res *res) | 5627 | static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5628 | struct nfs4_readdir_res *res) | ||
5705 | { | 5629 | { |
5706 | struct xdr_stream xdr; | ||
5707 | struct compound_hdr hdr; | 5630 | struct compound_hdr hdr; |
5708 | int status; | 5631 | int status; |
5709 | 5632 | ||
5710 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5633 | status = decode_compound_hdr(xdr, &hdr); |
5711 | status = decode_compound_hdr(&xdr, &hdr); | ||
5712 | if (status) | 5634 | if (status) |
5713 | goto out; | 5635 | goto out; |
5714 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5636 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5715 | if (status) | 5637 | if (status) |
5716 | goto out; | 5638 | goto out; |
5717 | status = decode_putfh(&xdr); | 5639 | status = decode_putfh(xdr); |
5718 | if (status) | 5640 | if (status) |
5719 | goto out; | 5641 | goto out; |
5720 | status = decode_readdir(&xdr, rqstp, res); | 5642 | status = decode_readdir(xdr, rqstp, res); |
5721 | out: | 5643 | out: |
5722 | return status; | 5644 | return status; |
5723 | } | 5645 | } |
@@ -5725,23 +5647,22 @@ out: | |||
5725 | /* | 5647 | /* |
5726 | * Decode Read response | 5648 | * Decode Read response |
5727 | */ | 5649 | */ |
5728 | static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, __be32 *p, struct nfs_readres *res) | 5650 | static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5651 | struct nfs_readres *res) | ||
5729 | { | 5652 | { |
5730 | struct xdr_stream xdr; | ||
5731 | struct compound_hdr hdr; | 5653 | struct compound_hdr hdr; |
5732 | int status; | 5654 | int status; |
5733 | 5655 | ||
5734 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5656 | status = decode_compound_hdr(xdr, &hdr); |
5735 | status = decode_compound_hdr(&xdr, &hdr); | ||
5736 | if (status) | 5657 | if (status) |
5737 | goto out; | 5658 | goto out; |
5738 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5659 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5739 | if (status) | 5660 | if (status) |
5740 | goto out; | 5661 | goto out; |
5741 | status = decode_putfh(&xdr); | 5662 | status = decode_putfh(xdr); |
5742 | if (status) | 5663 | if (status) |
5743 | goto out; | 5664 | goto out; |
5744 | status = decode_read(&xdr, rqstp, res); | 5665 | status = decode_read(xdr, rqstp, res); |
5745 | if (!status) | 5666 | if (!status) |
5746 | status = res->count; | 5667 | status = res->count; |
5747 | out: | 5668 | out: |
@@ -5751,26 +5672,25 @@ out: | |||
5751 | /* | 5672 | /* |
5752 | * Decode WRITE response | 5673 | * Decode WRITE response |
5753 | */ | 5674 | */ |
5754 | static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, __be32 *p, struct nfs_writeres *res) | 5675 | static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5676 | struct nfs_writeres *res) | ||
5755 | { | 5677 | { |
5756 | struct xdr_stream xdr; | ||
5757 | struct compound_hdr hdr; | 5678 | struct compound_hdr hdr; |
5758 | int status; | 5679 | int status; |
5759 | 5680 | ||
5760 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5681 | status = decode_compound_hdr(xdr, &hdr); |
5761 | status = decode_compound_hdr(&xdr, &hdr); | ||
5762 | if (status) | 5682 | if (status) |
5763 | goto out; | 5683 | goto out; |
5764 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5684 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5765 | if (status) | 5685 | if (status) |
5766 | goto out; | 5686 | goto out; |
5767 | status = decode_putfh(&xdr); | 5687 | status = decode_putfh(xdr); |
5768 | if (status) | 5688 | if (status) |
5769 | goto out; | 5689 | goto out; |
5770 | status = decode_write(&xdr, res); | 5690 | status = decode_write(xdr, res); |
5771 | if (status) | 5691 | if (status) |
5772 | goto out; | 5692 | goto out; |
5773 | decode_getfattr(&xdr, res->fattr, res->server, | 5693 | decode_getfattr(xdr, res->fattr, res->server, |
5774 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5694 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5775 | if (!status) | 5695 | if (!status) |
5776 | status = res->count; | 5696 | status = res->count; |
@@ -5781,26 +5701,25 @@ out: | |||
5781 | /* | 5701 | /* |
5782 | * Decode COMMIT response | 5702 | * Decode COMMIT response |
5783 | */ | 5703 | */ |
5784 | static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, __be32 *p, struct nfs_writeres *res) | 5704 | static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5705 | struct nfs_writeres *res) | ||
5785 | { | 5706 | { |
5786 | struct xdr_stream xdr; | ||
5787 | struct compound_hdr hdr; | 5707 | struct compound_hdr hdr; |
5788 | int status; | 5708 | int status; |
5789 | 5709 | ||
5790 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5710 | status = decode_compound_hdr(xdr, &hdr); |
5791 | status = decode_compound_hdr(&xdr, &hdr); | ||
5792 | if (status) | 5711 | if (status) |
5793 | goto out; | 5712 | goto out; |
5794 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5713 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5795 | if (status) | 5714 | if (status) |
5796 | goto out; | 5715 | goto out; |
5797 | status = decode_putfh(&xdr); | 5716 | status = decode_putfh(xdr); |
5798 | if (status) | 5717 | if (status) |
5799 | goto out; | 5718 | goto out; |
5800 | status = decode_commit(&xdr, res); | 5719 | status = decode_commit(xdr, res); |
5801 | if (status) | 5720 | if (status) |
5802 | goto out; | 5721 | goto out; |
5803 | decode_getfattr(&xdr, res->fattr, res->server, | 5722 | decode_getfattr(xdr, res->fattr, res->server, |
5804 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5723 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5805 | out: | 5724 | out: |
5806 | return status; | 5725 | return status; |
@@ -5809,85 +5728,80 @@ out: | |||
5809 | /* | 5728 | /* |
5810 | * Decode FSINFO response | 5729 | * Decode FSINFO response |
5811 | */ | 5730 | */ |
5812 | static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, __be32 *p, | 5731 | static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr, |
5813 | struct nfs4_fsinfo_res *res) | 5732 | struct nfs4_fsinfo_res *res) |
5814 | { | 5733 | { |
5815 | struct xdr_stream xdr; | ||
5816 | struct compound_hdr hdr; | 5734 | struct compound_hdr hdr; |
5817 | int status; | 5735 | int status; |
5818 | 5736 | ||
5819 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5737 | status = decode_compound_hdr(xdr, &hdr); |
5820 | status = decode_compound_hdr(&xdr, &hdr); | ||
5821 | if (!status) | 5738 | if (!status) |
5822 | status = decode_sequence(&xdr, &res->seq_res, req); | 5739 | status = decode_sequence(xdr, &res->seq_res, req); |
5823 | if (!status) | 5740 | if (!status) |
5824 | status = decode_putfh(&xdr); | 5741 | status = decode_putfh(xdr); |
5825 | if (!status) | 5742 | if (!status) |
5826 | status = decode_fsinfo(&xdr, res->fsinfo); | 5743 | status = decode_fsinfo(xdr, res->fsinfo); |
5827 | return status; | 5744 | return status; |
5828 | } | 5745 | } |
5829 | 5746 | ||
5830 | /* | 5747 | /* |
5831 | * Decode PATHCONF response | 5748 | * Decode PATHCONF response |
5832 | */ | 5749 | */ |
5833 | static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, __be32 *p, | 5750 | static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr, |
5834 | struct nfs4_pathconf_res *res) | 5751 | struct nfs4_pathconf_res *res) |
5835 | { | 5752 | { |
5836 | struct xdr_stream xdr; | ||
5837 | struct compound_hdr hdr; | 5753 | struct compound_hdr hdr; |
5838 | int status; | 5754 | int status; |
5839 | 5755 | ||
5840 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5756 | status = decode_compound_hdr(xdr, &hdr); |
5841 | status = decode_compound_hdr(&xdr, &hdr); | ||
5842 | if (!status) | 5757 | if (!status) |
5843 | status = decode_sequence(&xdr, &res->seq_res, req); | 5758 | status = decode_sequence(xdr, &res->seq_res, req); |
5844 | if (!status) | 5759 | if (!status) |
5845 | status = decode_putfh(&xdr); | 5760 | status = decode_putfh(xdr); |
5846 | if (!status) | 5761 | if (!status) |
5847 | status = decode_pathconf(&xdr, res->pathconf); | 5762 | status = decode_pathconf(xdr, res->pathconf); |
5848 | return status; | 5763 | return status; |
5849 | } | 5764 | } |
5850 | 5765 | ||
5851 | /* | 5766 | /* |
5852 | * Decode STATFS response | 5767 | * Decode STATFS response |
5853 | */ | 5768 | */ |
5854 | static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, __be32 *p, | 5769 | static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, struct xdr_stream *xdr, |
5855 | struct nfs4_statfs_res *res) | 5770 | struct nfs4_statfs_res *res) |
5856 | { | 5771 | { |
5857 | struct xdr_stream xdr; | ||
5858 | struct compound_hdr hdr; | 5772 | struct compound_hdr hdr; |
5859 | int status; | 5773 | int status; |
5860 | 5774 | ||
5861 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5775 | status = decode_compound_hdr(xdr, &hdr); |
5862 | status = decode_compound_hdr(&xdr, &hdr); | ||
5863 | if (!status) | 5776 | if (!status) |
5864 | status = decode_sequence(&xdr, &res->seq_res, req); | 5777 | status = decode_sequence(xdr, &res->seq_res, req); |
5865 | if (!status) | 5778 | if (!status) |
5866 | status = decode_putfh(&xdr); | 5779 | status = decode_putfh(xdr); |
5867 | if (!status) | 5780 | if (!status) |
5868 | status = decode_statfs(&xdr, res->fsstat); | 5781 | status = decode_statfs(xdr, res->fsstat); |
5869 | return status; | 5782 | return status; |
5870 | } | 5783 | } |
5871 | 5784 | ||
5872 | /* | 5785 | /* |
5873 | * Decode GETATTR_BITMAP response | 5786 | * Decode GETATTR_BITMAP response |
5874 | */ | 5787 | */ |
5875 | static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, __be32 *p, struct nfs4_server_caps_res *res) | 5788 | static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, |
5789 | struct xdr_stream *xdr, | ||
5790 | struct nfs4_server_caps_res *res) | ||
5876 | { | 5791 | { |
5877 | struct xdr_stream xdr; | ||
5878 | struct compound_hdr hdr; | 5792 | struct compound_hdr hdr; |
5879 | int status; | 5793 | int status; |
5880 | 5794 | ||
5881 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5795 | status = decode_compound_hdr(xdr, &hdr); |
5882 | status = decode_compound_hdr(&xdr, &hdr); | ||
5883 | if (status) | 5796 | if (status) |
5884 | goto out; | 5797 | goto out; |
5885 | status = decode_sequence(&xdr, &res->seq_res, req); | 5798 | status = decode_sequence(xdr, &res->seq_res, req); |
5886 | if (status) | 5799 | if (status) |
5887 | goto out; | 5800 | goto out; |
5888 | if ((status = decode_putfh(&xdr)) != 0) | 5801 | status = decode_putfh(xdr); |
5802 | if (status) | ||
5889 | goto out; | 5803 | goto out; |
5890 | status = decode_server_caps(&xdr, res); | 5804 | status = decode_server_caps(xdr, res); |
5891 | out: | 5805 | out: |
5892 | return status; | 5806 | return status; |
5893 | } | 5807 | } |
@@ -5895,79 +5809,77 @@ out: | |||
5895 | /* | 5809 | /* |
5896 | * Decode RENEW response | 5810 | * Decode RENEW response |
5897 | */ | 5811 | */ |
5898 | static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, __be32 *p, void *dummy) | 5812 | static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, struct xdr_stream *xdr, |
5813 | void *__unused) | ||
5899 | { | 5814 | { |
5900 | struct xdr_stream xdr; | ||
5901 | struct compound_hdr hdr; | 5815 | struct compound_hdr hdr; |
5902 | int status; | 5816 | int status; |
5903 | 5817 | ||
5904 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5818 | status = decode_compound_hdr(xdr, &hdr); |
5905 | status = decode_compound_hdr(&xdr, &hdr); | ||
5906 | if (!status) | 5819 | if (!status) |
5907 | status = decode_renew(&xdr); | 5820 | status = decode_renew(xdr); |
5908 | return status; | 5821 | return status; |
5909 | } | 5822 | } |
5910 | 5823 | ||
5911 | /* | 5824 | /* |
5912 | * Decode SETCLIENTID response | 5825 | * Decode SETCLIENTID response |
5913 | */ | 5826 | */ |
5914 | static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, __be32 *p, | 5827 | static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, |
5915 | struct nfs4_setclientid_res *res) | 5828 | struct xdr_stream *xdr, |
5829 | struct nfs4_setclientid_res *res) | ||
5916 | { | 5830 | { |
5917 | struct xdr_stream xdr; | ||
5918 | struct compound_hdr hdr; | 5831 | struct compound_hdr hdr; |
5919 | int status; | 5832 | int status; |
5920 | 5833 | ||
5921 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5834 | status = decode_compound_hdr(xdr, &hdr); |
5922 | status = decode_compound_hdr(&xdr, &hdr); | ||
5923 | if (!status) | 5835 | if (!status) |
5924 | status = decode_setclientid(&xdr, res); | 5836 | status = decode_setclientid(xdr, res); |
5925 | return status; | 5837 | return status; |
5926 | } | 5838 | } |
5927 | 5839 | ||
5928 | /* | 5840 | /* |
5929 | * Decode SETCLIENTID_CONFIRM response | 5841 | * Decode SETCLIENTID_CONFIRM response |
5930 | */ | 5842 | */ |
5931 | static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_fsinfo *fsinfo) | 5843 | static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, |
5844 | struct xdr_stream *xdr, | ||
5845 | struct nfs_fsinfo *fsinfo) | ||
5932 | { | 5846 | { |
5933 | struct xdr_stream xdr; | ||
5934 | struct compound_hdr hdr; | 5847 | struct compound_hdr hdr; |
5935 | int status; | 5848 | int status; |
5936 | 5849 | ||
5937 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5850 | status = decode_compound_hdr(xdr, &hdr); |
5938 | status = decode_compound_hdr(&xdr, &hdr); | ||
5939 | if (!status) | 5851 | if (!status) |
5940 | status = decode_setclientid_confirm(&xdr); | 5852 | status = decode_setclientid_confirm(xdr); |
5941 | if (!status) | 5853 | if (!status) |
5942 | status = decode_putrootfh(&xdr); | 5854 | status = decode_putrootfh(xdr); |
5943 | if (!status) | 5855 | if (!status) |
5944 | status = decode_fsinfo(&xdr, fsinfo); | 5856 | status = decode_fsinfo(xdr, fsinfo); |
5945 | return status; | 5857 | return status; |
5946 | } | 5858 | } |
5947 | 5859 | ||
5948 | /* | 5860 | /* |
5949 | * Decode DELEGRETURN response | 5861 | * Decode DELEGRETURN response |
5950 | */ | 5862 | */ |
5951 | static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_delegreturnres *res) | 5863 | static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, |
5864 | struct xdr_stream *xdr, | ||
5865 | struct nfs4_delegreturnres *res) | ||
5952 | { | 5866 | { |
5953 | struct xdr_stream xdr; | ||
5954 | struct compound_hdr hdr; | 5867 | struct compound_hdr hdr; |
5955 | int status; | 5868 | int status; |
5956 | 5869 | ||
5957 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5870 | status = decode_compound_hdr(xdr, &hdr); |
5958 | status = decode_compound_hdr(&xdr, &hdr); | ||
5959 | if (status) | 5871 | if (status) |
5960 | goto out; | 5872 | goto out; |
5961 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 5873 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
5962 | if (status) | 5874 | if (status) |
5963 | goto out; | 5875 | goto out; |
5964 | status = decode_putfh(&xdr); | 5876 | status = decode_putfh(xdr); |
5965 | if (status != 0) | 5877 | if (status != 0) |
5966 | goto out; | 5878 | goto out; |
5967 | status = decode_delegreturn(&xdr); | 5879 | status = decode_delegreturn(xdr); |
5968 | if (status != 0) | 5880 | if (status != 0) |
5969 | goto out; | 5881 | goto out; |
5970 | decode_getfattr(&xdr, res->fattr, res->server, | 5882 | decode_getfattr(xdr, res->fattr, res->server, |
5971 | !RPC_IS_ASYNC(rqstp->rq_task)); | 5883 | !RPC_IS_ASYNC(rqstp->rq_task)); |
5972 | out: | 5884 | out: |
5973 | return status; | 5885 | return status; |
@@ -5976,26 +5888,27 @@ out: | |||
5976 | /* | 5888 | /* |
5977 | * Decode FS_LOCATIONS response | 5889 | * Decode FS_LOCATIONS response |
5978 | */ | 5890 | */ |
5979 | static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, __be32 *p, | 5891 | static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, |
5892 | struct xdr_stream *xdr, | ||
5980 | struct nfs4_fs_locations_res *res) | 5893 | struct nfs4_fs_locations_res *res) |
5981 | { | 5894 | { |
5982 | struct xdr_stream xdr; | ||
5983 | struct compound_hdr hdr; | 5895 | struct compound_hdr hdr; |
5984 | int status; | 5896 | int status; |
5985 | 5897 | ||
5986 | xdr_init_decode(&xdr, &req->rq_rcv_buf, p); | 5898 | status = decode_compound_hdr(xdr, &hdr); |
5987 | status = decode_compound_hdr(&xdr, &hdr); | ||
5988 | if (status) | 5899 | if (status) |
5989 | goto out; | 5900 | goto out; |
5990 | status = decode_sequence(&xdr, &res->seq_res, req); | 5901 | status = decode_sequence(xdr, &res->seq_res, req); |
5991 | if (status) | 5902 | if (status) |
5992 | goto out; | 5903 | goto out; |
5993 | if ((status = decode_putfh(&xdr)) != 0) | 5904 | status = decode_putfh(xdr); |
5905 | if (status) | ||
5994 | goto out; | 5906 | goto out; |
5995 | if ((status = decode_lookup(&xdr)) != 0) | 5907 | status = decode_lookup(xdr); |
5908 | if (status) | ||
5996 | goto out; | 5909 | goto out; |
5997 | xdr_enter_page(&xdr, PAGE_SIZE); | 5910 | xdr_enter_page(xdr, PAGE_SIZE); |
5998 | status = decode_getfattr(&xdr, &res->fs_locations->fattr, | 5911 | status = decode_getfattr(xdr, &res->fs_locations->fattr, |
5999 | res->fs_locations->server, | 5912 | res->fs_locations->server, |
6000 | !RPC_IS_ASYNC(req->rq_task)); | 5913 | !RPC_IS_ASYNC(req->rq_task)); |
6001 | out: | 5914 | out: |
@@ -6006,129 +5919,122 @@ out: | |||
6006 | /* | 5919 | /* |
6007 | * Decode EXCHANGE_ID response | 5920 | * Decode EXCHANGE_ID response |
6008 | */ | 5921 | */ |
6009 | static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp, uint32_t *p, | 5922 | static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp, |
5923 | struct xdr_stream *xdr, | ||
6010 | void *res) | 5924 | void *res) |
6011 | { | 5925 | { |
6012 | struct xdr_stream xdr; | ||
6013 | struct compound_hdr hdr; | 5926 | struct compound_hdr hdr; |
6014 | int status; | 5927 | int status; |
6015 | 5928 | ||
6016 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5929 | status = decode_compound_hdr(xdr, &hdr); |
6017 | status = decode_compound_hdr(&xdr, &hdr); | ||
6018 | if (!status) | 5930 | if (!status) |
6019 | status = decode_exchange_id(&xdr, res); | 5931 | status = decode_exchange_id(xdr, res); |
6020 | return status; | 5932 | return status; |
6021 | } | 5933 | } |
6022 | 5934 | ||
6023 | /* | 5935 | /* |
6024 | * Decode CREATE_SESSION response | 5936 | * Decode CREATE_SESSION response |
6025 | */ | 5937 | */ |
6026 | static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp, uint32_t *p, | 5938 | static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp, |
5939 | struct xdr_stream *xdr, | ||
6027 | struct nfs41_create_session_res *res) | 5940 | struct nfs41_create_session_res *res) |
6028 | { | 5941 | { |
6029 | struct xdr_stream xdr; | ||
6030 | struct compound_hdr hdr; | 5942 | struct compound_hdr hdr; |
6031 | int status; | 5943 | int status; |
6032 | 5944 | ||
6033 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5945 | status = decode_compound_hdr(xdr, &hdr); |
6034 | status = decode_compound_hdr(&xdr, &hdr); | ||
6035 | if (!status) | 5946 | if (!status) |
6036 | status = decode_create_session(&xdr, res); | 5947 | status = decode_create_session(xdr, res); |
6037 | return status; | 5948 | return status; |
6038 | } | 5949 | } |
6039 | 5950 | ||
6040 | /* | 5951 | /* |
6041 | * Decode DESTROY_SESSION response | 5952 | * Decode DESTROY_SESSION response |
6042 | */ | 5953 | */ |
6043 | static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp, uint32_t *p, | 5954 | static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp, |
6044 | void *dummy) | 5955 | struct xdr_stream *xdr, |
5956 | void *res) | ||
6045 | { | 5957 | { |
6046 | struct xdr_stream xdr; | ||
6047 | struct compound_hdr hdr; | 5958 | struct compound_hdr hdr; |
6048 | int status; | 5959 | int status; |
6049 | 5960 | ||
6050 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5961 | status = decode_compound_hdr(xdr, &hdr); |
6051 | status = decode_compound_hdr(&xdr, &hdr); | ||
6052 | if (!status) | 5962 | if (!status) |
6053 | status = decode_destroy_session(&xdr, dummy); | 5963 | status = decode_destroy_session(xdr, res); |
6054 | return status; | 5964 | return status; |
6055 | } | 5965 | } |
6056 | 5966 | ||
6057 | /* | 5967 | /* |
6058 | * Decode SEQUENCE response | 5968 | * Decode SEQUENCE response |
6059 | */ | 5969 | */ |
6060 | static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp, uint32_t *p, | 5970 | static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp, |
5971 | struct xdr_stream *xdr, | ||
6061 | struct nfs4_sequence_res *res) | 5972 | struct nfs4_sequence_res *res) |
6062 | { | 5973 | { |
6063 | struct xdr_stream xdr; | ||
6064 | struct compound_hdr hdr; | 5974 | struct compound_hdr hdr; |
6065 | int status; | 5975 | int status; |
6066 | 5976 | ||
6067 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5977 | status = decode_compound_hdr(xdr, &hdr); |
6068 | status = decode_compound_hdr(&xdr, &hdr); | ||
6069 | if (!status) | 5978 | if (!status) |
6070 | status = decode_sequence(&xdr, res, rqstp); | 5979 | status = decode_sequence(xdr, res, rqstp); |
6071 | return status; | 5980 | return status; |
6072 | } | 5981 | } |
6073 | 5982 | ||
6074 | /* | 5983 | /* |
6075 | * Decode GET_LEASE_TIME response | 5984 | * Decode GET_LEASE_TIME response |
6076 | */ | 5985 | */ |
6077 | static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp, uint32_t *p, | 5986 | static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp, |
5987 | struct xdr_stream *xdr, | ||
6078 | struct nfs4_get_lease_time_res *res) | 5988 | struct nfs4_get_lease_time_res *res) |
6079 | { | 5989 | { |
6080 | struct xdr_stream xdr; | ||
6081 | struct compound_hdr hdr; | 5990 | struct compound_hdr hdr; |
6082 | int status; | 5991 | int status; |
6083 | 5992 | ||
6084 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 5993 | status = decode_compound_hdr(xdr, &hdr); |
6085 | status = decode_compound_hdr(&xdr, &hdr); | ||
6086 | if (!status) | 5994 | if (!status) |
6087 | status = decode_sequence(&xdr, &res->lr_seq_res, rqstp); | 5995 | status = decode_sequence(xdr, &res->lr_seq_res, rqstp); |
6088 | if (!status) | 5996 | if (!status) |
6089 | status = decode_putrootfh(&xdr); | 5997 | status = decode_putrootfh(xdr); |
6090 | if (!status) | 5998 | if (!status) |
6091 | status = decode_fsinfo(&xdr, res->lr_fsinfo); | 5999 | status = decode_fsinfo(xdr, res->lr_fsinfo); |
6092 | return status; | 6000 | return status; |
6093 | } | 6001 | } |
6094 | 6002 | ||
6095 | /* | 6003 | /* |
6096 | * Decode RECLAIM_COMPLETE response | 6004 | * Decode RECLAIM_COMPLETE response |
6097 | */ | 6005 | */ |
6098 | static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp, uint32_t *p, | 6006 | static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp, |
6007 | struct xdr_stream *xdr, | ||
6099 | struct nfs41_reclaim_complete_res *res) | 6008 | struct nfs41_reclaim_complete_res *res) |
6100 | { | 6009 | { |
6101 | struct xdr_stream xdr; | ||
6102 | struct compound_hdr hdr; | 6010 | struct compound_hdr hdr; |
6103 | int status; | 6011 | int status; |
6104 | 6012 | ||
6105 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 6013 | status = decode_compound_hdr(xdr, &hdr); |
6106 | status = decode_compound_hdr(&xdr, &hdr); | ||
6107 | if (!status) | 6014 | if (!status) |
6108 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 6015 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
6109 | if (!status) | 6016 | if (!status) |
6110 | status = decode_reclaim_complete(&xdr, (void *)NULL); | 6017 | status = decode_reclaim_complete(xdr, (void *)NULL); |
6111 | return status; | 6018 | return status; |
6112 | } | 6019 | } |
6113 | 6020 | ||
6114 | /* | 6021 | /* |
6115 | * Decode GETDEVINFO response | 6022 | * Decode GETDEVINFO response |
6116 | */ | 6023 | */ |
6117 | static int nfs4_xdr_dec_getdeviceinfo(struct rpc_rqst *rqstp, uint32_t *p, | 6024 | static int nfs4_xdr_dec_getdeviceinfo(struct rpc_rqst *rqstp, |
6025 | struct xdr_stream *xdr, | ||
6118 | struct nfs4_getdeviceinfo_res *res) | 6026 | struct nfs4_getdeviceinfo_res *res) |
6119 | { | 6027 | { |
6120 | struct xdr_stream xdr; | ||
6121 | struct compound_hdr hdr; | 6028 | struct compound_hdr hdr; |
6122 | int status; | 6029 | int status; |
6123 | 6030 | ||
6124 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 6031 | status = decode_compound_hdr(xdr, &hdr); |
6125 | status = decode_compound_hdr(&xdr, &hdr); | ||
6126 | if (status != 0) | 6032 | if (status != 0) |
6127 | goto out; | 6033 | goto out; |
6128 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 6034 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
6129 | if (status != 0) | 6035 | if (status != 0) |
6130 | goto out; | 6036 | goto out; |
6131 | status = decode_getdeviceinfo(&xdr, res->pdev); | 6037 | status = decode_getdeviceinfo(xdr, res->pdev); |
6132 | out: | 6038 | out: |
6133 | return status; | 6039 | return status; |
6134 | } | 6040 | } |
@@ -6136,45 +6042,58 @@ out: | |||
6136 | /* | 6042 | /* |
6137 | * Decode LAYOUTGET response | 6043 | * Decode LAYOUTGET response |
6138 | */ | 6044 | */ |
6139 | static int nfs4_xdr_dec_layoutget(struct rpc_rqst *rqstp, uint32_t *p, | 6045 | static int nfs4_xdr_dec_layoutget(struct rpc_rqst *rqstp, |
6046 | struct xdr_stream *xdr, | ||
6140 | struct nfs4_layoutget_res *res) | 6047 | struct nfs4_layoutget_res *res) |
6141 | { | 6048 | { |
6142 | struct xdr_stream xdr; | ||
6143 | struct compound_hdr hdr; | 6049 | struct compound_hdr hdr; |
6144 | int status; | 6050 | int status; |
6145 | 6051 | ||
6146 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 6052 | status = decode_compound_hdr(xdr, &hdr); |
6147 | status = decode_compound_hdr(&xdr, &hdr); | ||
6148 | if (status) | 6053 | if (status) |
6149 | goto out; | 6054 | goto out; |
6150 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | 6055 | status = decode_sequence(xdr, &res->seq_res, rqstp); |
6151 | if (status) | 6056 | if (status) |
6152 | goto out; | 6057 | goto out; |
6153 | status = decode_putfh(&xdr); | 6058 | status = decode_putfh(xdr); |
6154 | if (status) | 6059 | if (status) |
6155 | goto out; | 6060 | goto out; |
6156 | status = decode_layoutget(&xdr, rqstp, res); | 6061 | status = decode_layoutget(xdr, rqstp, res); |
6157 | out: | 6062 | out: |
6158 | return status; | 6063 | return status; |
6159 | } | 6064 | } |
6160 | #endif /* CONFIG_NFS_V4_1 */ | 6065 | #endif /* CONFIG_NFS_V4_1 */ |
6161 | 6066 | ||
6162 | __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | 6067 | /** |
6163 | struct nfs_server *server, int plus) | 6068 | * nfs4_decode_dirent - Decode a single NFSv4 directory entry stored in |
6069 | * the local page cache. | ||
6070 | * @xdr: XDR stream where entry resides | ||
6071 | * @entry: buffer to fill in with entry data | ||
6072 | * @plus: boolean indicating whether this should be a readdirplus entry | ||
6073 | * | ||
6074 | * Returns zero if successful, otherwise a negative errno value is | ||
6075 | * returned. | ||
6076 | * | ||
6077 | * This function is not invoked during READDIR reply decoding, but | ||
6078 | * rather whenever an application invokes the getdents(2) system call | ||
6079 | * on a directory already in our cache. | ||
6080 | */ | ||
6081 | int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | ||
6082 | int plus) | ||
6164 | { | 6083 | { |
6165 | uint32_t bitmap[2] = {0}; | 6084 | uint32_t bitmap[2] = {0}; |
6166 | uint32_t len; | 6085 | uint32_t len; |
6167 | __be32 *p = xdr_inline_decode(xdr, 4); | 6086 | __be32 *p = xdr_inline_decode(xdr, 4); |
6168 | if (unlikely(!p)) | 6087 | if (unlikely(!p)) |
6169 | goto out_overflow; | 6088 | goto out_overflow; |
6170 | if (!ntohl(*p++)) { | 6089 | if (*p == xdr_zero) { |
6171 | p = xdr_inline_decode(xdr, 4); | 6090 | p = xdr_inline_decode(xdr, 4); |
6172 | if (unlikely(!p)) | 6091 | if (unlikely(!p)) |
6173 | goto out_overflow; | 6092 | goto out_overflow; |
6174 | if (!ntohl(*p++)) | 6093 | if (*p == xdr_zero) |
6175 | return ERR_PTR(-EAGAIN); | 6094 | return -EAGAIN; |
6176 | entry->eof = 1; | 6095 | entry->eof = 1; |
6177 | return ERR_PTR(-EBADCOOKIE); | 6096 | return -EBADCOOKIE; |
6178 | } | 6097 | } |
6179 | 6098 | ||
6180 | p = xdr_inline_decode(xdr, 12); | 6099 | p = xdr_inline_decode(xdr, 12); |
@@ -6182,7 +6101,7 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | |||
6182 | goto out_overflow; | 6101 | goto out_overflow; |
6183 | entry->prev_cookie = entry->cookie; | 6102 | entry->prev_cookie = entry->cookie; |
6184 | p = xdr_decode_hyper(p, &entry->cookie); | 6103 | p = xdr_decode_hyper(p, &entry->cookie); |
6185 | entry->len = ntohl(*p++); | 6104 | entry->len = be32_to_cpup(p); |
6186 | 6105 | ||
6187 | p = xdr_inline_decode(xdr, entry->len); | 6106 | p = xdr_inline_decode(xdr, entry->len); |
6188 | if (unlikely(!p)) | 6107 | if (unlikely(!p)) |
@@ -6203,7 +6122,8 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | |||
6203 | if (decode_attr_length(xdr, &len, &p) < 0) | 6122 | if (decode_attr_length(xdr, &len, &p) < 0) |
6204 | goto out_overflow; | 6123 | goto out_overflow; |
6205 | 6124 | ||
6206 | if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, server, 1) < 0) | 6125 | if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, |
6126 | entry->server, 1) < 0) | ||
6207 | goto out_overflow; | 6127 | goto out_overflow; |
6208 | if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) | 6128 | if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) |
6209 | entry->ino = entry->fattr->fileid; | 6129 | entry->ino = entry->fattr->fileid; |
@@ -6212,20 +6132,11 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, | |||
6212 | if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE) | 6132 | if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE) |
6213 | entry->d_type = nfs_umode_to_dtype(entry->fattr->mode); | 6133 | entry->d_type = nfs_umode_to_dtype(entry->fattr->mode); |
6214 | 6134 | ||
6215 | if (verify_attr_len(xdr, p, len) < 0) | 6135 | return 0; |
6216 | goto out_overflow; | ||
6217 | |||
6218 | p = xdr_inline_peek(xdr, 8); | ||
6219 | if (p != NULL) | ||
6220 | entry->eof = !p[0] && p[1]; | ||
6221 | else | ||
6222 | entry->eof = 0; | ||
6223 | |||
6224 | return p; | ||
6225 | 6136 | ||
6226 | out_overflow: | 6137 | out_overflow: |
6227 | print_overflow_msg(__func__, xdr); | 6138 | print_overflow_msg(__func__, xdr); |
6228 | return ERR_PTR(-EAGAIN); | 6139 | return -EAGAIN; |
6229 | } | 6140 | } |
6230 | 6141 | ||
6231 | /* | 6142 | /* |
@@ -6301,8 +6212,8 @@ nfs4_stat_to_errno(int stat) | |||
6301 | #define PROC(proc, argtype, restype) \ | 6212 | #define PROC(proc, argtype, restype) \ |
6302 | [NFSPROC4_CLNT_##proc] = { \ | 6213 | [NFSPROC4_CLNT_##proc] = { \ |
6303 | .p_proc = NFSPROC4_COMPOUND, \ | 6214 | .p_proc = NFSPROC4_COMPOUND, \ |
6304 | .p_encode = (kxdrproc_t) nfs4_xdr_##argtype, \ | 6215 | .p_encode = (kxdreproc_t)nfs4_xdr_##argtype, \ |
6305 | .p_decode = (kxdrproc_t) nfs4_xdr_##restype, \ | 6216 | .p_decode = (kxdrdproc_t)nfs4_xdr_##restype, \ |
6306 | .p_arglen = NFS4_##argtype##_sz, \ | 6217 | .p_arglen = NFS4_##argtype##_sz, \ |
6307 | .p_replen = NFS4_##restype##_sz, \ | 6218 | .p_replen = NFS4_##restype##_sz, \ |
6308 | .p_statidx = NFSPROC4_CLNT_##proc, \ | 6219 | .p_statidx = NFSPROC4_CLNT_##proc, \ |
@@ -6310,50 +6221,50 @@ nfs4_stat_to_errno(int stat) | |||
6310 | } | 6221 | } |
6311 | 6222 | ||
6312 | struct rpc_procinfo nfs4_procedures[] = { | 6223 | struct rpc_procinfo nfs4_procedures[] = { |
6313 | PROC(READ, enc_read, dec_read), | 6224 | PROC(READ, enc_read, dec_read), |
6314 | PROC(WRITE, enc_write, dec_write), | 6225 | PROC(WRITE, enc_write, dec_write), |
6315 | PROC(COMMIT, enc_commit, dec_commit), | 6226 | PROC(COMMIT, enc_commit, dec_commit), |
6316 | PROC(OPEN, enc_open, dec_open), | 6227 | PROC(OPEN, enc_open, dec_open), |
6317 | PROC(OPEN_CONFIRM, enc_open_confirm, dec_open_confirm), | 6228 | PROC(OPEN_CONFIRM, enc_open_confirm, dec_open_confirm), |
6318 | PROC(OPEN_NOATTR, enc_open_noattr, dec_open_noattr), | 6229 | PROC(OPEN_NOATTR, enc_open_noattr, dec_open_noattr), |
6319 | PROC(OPEN_DOWNGRADE, enc_open_downgrade, dec_open_downgrade), | 6230 | PROC(OPEN_DOWNGRADE, enc_open_downgrade, dec_open_downgrade), |
6320 | PROC(CLOSE, enc_close, dec_close), | 6231 | PROC(CLOSE, enc_close, dec_close), |
6321 | PROC(SETATTR, enc_setattr, dec_setattr), | 6232 | PROC(SETATTR, enc_setattr, dec_setattr), |
6322 | PROC(FSINFO, enc_fsinfo, dec_fsinfo), | 6233 | PROC(FSINFO, enc_fsinfo, dec_fsinfo), |
6323 | PROC(RENEW, enc_renew, dec_renew), | 6234 | PROC(RENEW, enc_renew, dec_renew), |
6324 | PROC(SETCLIENTID, enc_setclientid, dec_setclientid), | 6235 | PROC(SETCLIENTID, enc_setclientid, dec_setclientid), |
6325 | PROC(SETCLIENTID_CONFIRM, enc_setclientid_confirm, dec_setclientid_confirm), | 6236 | PROC(SETCLIENTID_CONFIRM, enc_setclientid_confirm, dec_setclientid_confirm), |
6326 | PROC(LOCK, enc_lock, dec_lock), | 6237 | PROC(LOCK, enc_lock, dec_lock), |
6327 | PROC(LOCKT, enc_lockt, dec_lockt), | 6238 | PROC(LOCKT, enc_lockt, dec_lockt), |
6328 | PROC(LOCKU, enc_locku, dec_locku), | 6239 | PROC(LOCKU, enc_locku, dec_locku), |
6329 | PROC(ACCESS, enc_access, dec_access), | 6240 | PROC(ACCESS, enc_access, dec_access), |
6330 | PROC(GETATTR, enc_getattr, dec_getattr), | 6241 | PROC(GETATTR, enc_getattr, dec_getattr), |
6331 | PROC(LOOKUP, enc_lookup, dec_lookup), | 6242 | PROC(LOOKUP, enc_lookup, dec_lookup), |
6332 | PROC(LOOKUP_ROOT, enc_lookup_root, dec_lookup_root), | 6243 | PROC(LOOKUP_ROOT, enc_lookup_root, dec_lookup_root), |
6333 | PROC(REMOVE, enc_remove, dec_remove), | 6244 | PROC(REMOVE, enc_remove, dec_remove), |
6334 | PROC(RENAME, enc_rename, dec_rename), | 6245 | PROC(RENAME, enc_rename, dec_rename), |
6335 | PROC(LINK, enc_link, dec_link), | 6246 | PROC(LINK, enc_link, dec_link), |
6336 | PROC(SYMLINK, enc_symlink, dec_symlink), | 6247 | PROC(SYMLINK, enc_symlink, dec_symlink), |
6337 | PROC(CREATE, enc_create, dec_create), | 6248 | PROC(CREATE, enc_create, dec_create), |
6338 | PROC(PATHCONF, enc_pathconf, dec_pathconf), | 6249 | PROC(PATHCONF, enc_pathconf, dec_pathconf), |
6339 | PROC(STATFS, enc_statfs, dec_statfs), | 6250 | PROC(STATFS, enc_statfs, dec_statfs), |
6340 | PROC(READLINK, enc_readlink, dec_readlink), | 6251 | PROC(READLINK, enc_readlink, dec_readlink), |
6341 | PROC(READDIR, enc_readdir, dec_readdir), | 6252 | PROC(READDIR, enc_readdir, dec_readdir), |
6342 | PROC(SERVER_CAPS, enc_server_caps, dec_server_caps), | 6253 | PROC(SERVER_CAPS, enc_server_caps, dec_server_caps), |
6343 | PROC(DELEGRETURN, enc_delegreturn, dec_delegreturn), | 6254 | PROC(DELEGRETURN, enc_delegreturn, dec_delegreturn), |
6344 | PROC(GETACL, enc_getacl, dec_getacl), | 6255 | PROC(GETACL, enc_getacl, dec_getacl), |
6345 | PROC(SETACL, enc_setacl, dec_setacl), | 6256 | PROC(SETACL, enc_setacl, dec_setacl), |
6346 | PROC(FS_LOCATIONS, enc_fs_locations, dec_fs_locations), | 6257 | PROC(FS_LOCATIONS, enc_fs_locations, dec_fs_locations), |
6347 | PROC(RELEASE_LOCKOWNER, enc_release_lockowner, dec_release_lockowner), | 6258 | PROC(RELEASE_LOCKOWNER, enc_release_lockowner, dec_release_lockowner), |
6348 | #if defined(CONFIG_NFS_V4_1) | 6259 | #if defined(CONFIG_NFS_V4_1) |
6349 | PROC(EXCHANGE_ID, enc_exchange_id, dec_exchange_id), | 6260 | PROC(EXCHANGE_ID, enc_exchange_id, dec_exchange_id), |
6350 | PROC(CREATE_SESSION, enc_create_session, dec_create_session), | 6261 | PROC(CREATE_SESSION, enc_create_session, dec_create_session), |
6351 | PROC(DESTROY_SESSION, enc_destroy_session, dec_destroy_session), | 6262 | PROC(DESTROY_SESSION, enc_destroy_session, dec_destroy_session), |
6352 | PROC(SEQUENCE, enc_sequence, dec_sequence), | 6263 | PROC(SEQUENCE, enc_sequence, dec_sequence), |
6353 | PROC(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time), | 6264 | PROC(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time), |
6354 | PROC(RECLAIM_COMPLETE, enc_reclaim_complete, dec_reclaim_complete), | 6265 | PROC(RECLAIM_COMPLETE, enc_reclaim_complete, dec_reclaim_complete), |
6355 | PROC(GETDEVICEINFO, enc_getdeviceinfo, dec_getdeviceinfo), | 6266 | PROC(GETDEVICEINFO, enc_getdeviceinfo, dec_getdeviceinfo), |
6356 | PROC(LAYOUTGET, enc_layoutget, dec_layoutget), | 6267 | PROC(LAYOUTGET, enc_layoutget, dec_layoutget), |
6357 | #endif /* CONFIG_NFS_V4_1 */ | 6268 | #endif /* CONFIG_NFS_V4_1 */ |
6358 | }; | 6269 | }; |
6359 | 6270 | ||