diff options
Diffstat (limited to 'fs/nfs/callback_xdr.c')
-rw-r--r-- | fs/nfs/callback_xdr.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index d50b2742f23..95bfc243992 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c | |||
@@ -9,6 +9,8 @@ | |||
9 | #include <linux/sunrpc/svc.h> | 9 | #include <linux/sunrpc/svc.h> |
10 | #include <linux/nfs4.h> | 10 | #include <linux/nfs4.h> |
11 | #include <linux/nfs_fs.h> | 11 | #include <linux/nfs_fs.h> |
12 | #include <linux/ratelimit.h> | ||
13 | #include <linux/printk.h> | ||
12 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
13 | #include <linux/sunrpc/bc_xprt.h> | 15 | #include <linux/sunrpc/bc_xprt.h> |
14 | #include "nfs4_fs.h" | 16 | #include "nfs4_fs.h" |
@@ -73,7 +75,7 @@ static __be32 *read_buf(struct xdr_stream *xdr, int nbytes) | |||
73 | 75 | ||
74 | p = xdr_inline_decode(xdr, nbytes); | 76 | p = xdr_inline_decode(xdr, nbytes); |
75 | if (unlikely(p == NULL)) | 77 | if (unlikely(p == NULL)) |
76 | printk(KERN_WARNING "NFSv4 callback reply buffer overflowed!\n"); | 78 | printk(KERN_WARNING "NFS: NFSv4 callback reply buffer overflowed!\n"); |
77 | return p; | 79 | return p; |
78 | } | 80 | } |
79 | 81 | ||
@@ -138,10 +140,10 @@ static __be32 decode_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid) | |||
138 | { | 140 | { |
139 | __be32 *p; | 141 | __be32 *p; |
140 | 142 | ||
141 | p = read_buf(xdr, 16); | 143 | p = read_buf(xdr, NFS4_STATEID_SIZE); |
142 | if (unlikely(p == NULL)) | 144 | if (unlikely(p == NULL)) |
143 | return htonl(NFS4ERR_RESOURCE); | 145 | return htonl(NFS4ERR_RESOURCE); |
144 | memcpy(stateid->data, p, 16); | 146 | memcpy(stateid, p, NFS4_STATEID_SIZE); |
145 | return 0; | 147 | return 0; |
146 | } | 148 | } |
147 | 149 | ||
@@ -155,7 +157,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound | |||
155 | return status; | 157 | return status; |
156 | /* We do not like overly long tags! */ | 158 | /* We do not like overly long tags! */ |
157 | if (hdr->taglen > CB_OP_TAGLEN_MAXSZ - 12) { | 159 | if (hdr->taglen > CB_OP_TAGLEN_MAXSZ - 12) { |
158 | printk("NFSv4 CALLBACK %s: client sent tag of length %u\n", | 160 | printk("NFS: NFSv4 CALLBACK %s: client sent tag of length %u\n", |
159 | __func__, hdr->taglen); | 161 | __func__, hdr->taglen); |
160 | return htonl(NFS4ERR_RESOURCE); | 162 | return htonl(NFS4ERR_RESOURCE); |
161 | } | 163 | } |
@@ -167,7 +169,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound | |||
167 | if (hdr->minorversion <= 1) { | 169 | if (hdr->minorversion <= 1) { |
168 | hdr->cb_ident = ntohl(*p++); /* ignored by v4.1 */ | 170 | hdr->cb_ident = ntohl(*p++); /* ignored by v4.1 */ |
169 | } else { | 171 | } else { |
170 | printk(KERN_WARNING "%s: NFSv4 server callback with " | 172 | pr_warn_ratelimited("NFS: %s: NFSv4 server callback with " |
171 | "illegal minor version %u!\n", | 173 | "illegal minor version %u!\n", |
172 | __func__, hdr->minorversion); | 174 | __func__, hdr->minorversion); |
173 | return htonl(NFS4ERR_MINOR_VERS_MISMATCH); | 175 | return htonl(NFS4ERR_MINOR_VERS_MISMATCH); |
@@ -759,14 +761,14 @@ static void nfs4_callback_free_slot(struct nfs4_session *session) | |||
759 | * Let the state manager know callback processing done. | 761 | * Let the state manager know callback processing done. |
760 | * A single slot, so highest used slotid is either 0 or -1 | 762 | * A single slot, so highest used slotid is either 0 or -1 |
761 | */ | 763 | */ |
762 | tbl->highest_used_slotid = -1; | 764 | tbl->highest_used_slotid = NFS4_NO_SLOT; |
763 | nfs4_check_drain_bc_complete(session); | 765 | nfs4_check_drain_bc_complete(session); |
764 | spin_unlock(&tbl->slot_tbl_lock); | 766 | spin_unlock(&tbl->slot_tbl_lock); |
765 | } | 767 | } |
766 | 768 | ||
767 | static void nfs4_cb_free_slot(struct cb_process_state *cps) | 769 | static void nfs4_cb_free_slot(struct cb_process_state *cps) |
768 | { | 770 | { |
769 | if (cps->slotid != -1) | 771 | if (cps->slotid != NFS4_NO_SLOT) |
770 | nfs4_callback_free_slot(cps->clp->cl_session); | 772 | nfs4_callback_free_slot(cps->clp->cl_session); |
771 | } | 773 | } |
772 | 774 | ||
@@ -860,7 +862,8 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *r | |||
860 | struct cb_process_state cps = { | 862 | struct cb_process_state cps = { |
861 | .drc_status = 0, | 863 | .drc_status = 0, |
862 | .clp = NULL, | 864 | .clp = NULL, |
863 | .slotid = -1, | 865 | .slotid = NFS4_NO_SLOT, |
866 | .net = rqstp->rq_xprt->xpt_net, | ||
864 | }; | 867 | }; |
865 | unsigned int nops = 0; | 868 | unsigned int nops = 0; |
866 | 869 | ||
@@ -876,7 +879,7 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *r | |||
876 | return rpc_garbage_args; | 879 | return rpc_garbage_args; |
877 | 880 | ||
878 | if (hdr_arg.minorversion == 0) { | 881 | if (hdr_arg.minorversion == 0) { |
879 | cps.clp = nfs4_find_client_ident(hdr_arg.cb_ident); | 882 | cps.clp = nfs4_find_client_ident(rqstp->rq_xprt->xpt_net, hdr_arg.cb_ident); |
880 | if (!cps.clp || !check_gss_callback_principal(cps.clp, rqstp)) | 883 | if (!cps.clp || !check_gss_callback_principal(cps.clp, rqstp)) |
881 | return rpc_drop_reply; | 884 | return rpc_drop_reply; |
882 | } | 885 | } |