|
@@ -330,7 +330,7 @@ static unsigned encode_op_hdr(struct xdr_stream *xdr, uint32_t op, uint32_t res)
|
|
|
|
|
|
static unsigned encode_getattr_res(struct svc_rqst *rqstp, struct xdr_stream *xdr, const struct cb_getattrres *res)
|
|
|
{
|
|
|
- uint32_t *savep;
|
|
|
+ uint32_t *savep = NULL;
|
|
|
unsigned status = res->status;
|
|
|
|
|
|
if (unlikely(status != 0))
|
|
@@ -358,23 +358,26 @@ static unsigned process_op(struct svc_rqst *rqstp,
|
|
|
struct xdr_stream *xdr_in, void *argp,
|
|
|
struct xdr_stream *xdr_out, void *resp)
|
|
|
{
|
|
|
- struct callback_op *op;
|
|
|
- unsigned int op_nr;
|
|
|
+ struct callback_op *op = &callback_ops[0];
|
|
|
+ unsigned int op_nr = OP_CB_ILLEGAL;
|
|
|
unsigned int status = 0;
|
|
|
long maxlen;
|
|
|
unsigned res;
|
|
|
|
|
|
dprintk("%s: start\n", __FUNCTION__);
|
|
|
status = decode_op_hdr(xdr_in, &op_nr);
|
|
|
- if (unlikely(status != 0)) {
|
|
|
- op_nr = OP_CB_ILLEGAL;
|
|
|
- op = &callback_ops[0];
|
|
|
- } else if (unlikely(op_nr != OP_CB_GETATTR && op_nr != OP_CB_RECALL)) {
|
|
|
- op_nr = OP_CB_ILLEGAL;
|
|
|
- op = &callback_ops[0];
|
|
|
- status = htonl(NFS4ERR_OP_ILLEGAL);
|
|
|
- } else
|
|
|
- op = &callback_ops[op_nr];
|
|
|
+ if (likely(status == 0)) {
|
|
|
+ switch (op_nr) {
|
|
|
+ case OP_CB_GETATTR:
|
|
|
+ case OP_CB_RECALL:
|
|
|
+ op = &callback_ops[op_nr];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ op_nr = OP_CB_ILLEGAL;
|
|
|
+ op = &callback_ops[0];
|
|
|
+ status = htonl(NFS4ERR_OP_ILLEGAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
maxlen = xdr_out->end - xdr_out->p;
|
|
|
if (maxlen > 0 && maxlen < PAGE_SIZE) {
|
|
@@ -416,6 +419,7 @@ static int nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *resp
|
|
|
decode_compound_hdr_arg(&xdr_in, &hdr_arg);
|
|
|
hdr_res.taglen = hdr_arg.taglen;
|
|
|
hdr_res.tag = hdr_arg.tag;
|
|
|
+ hdr_res.nops = NULL;
|
|
|
encode_compound_hdr_res(&xdr_out, &hdr_res);
|
|
|
|
|
|
for (;;) {
|