|
@@ -24,6 +24,7 @@
|
|
#define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
|
#define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
|
4 + 1 + 3)
|
|
4 + 1 + 3)
|
|
#define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
|
|
+#define CB_OP_RECALLSLOT_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
|
|
|
|
#define NFSDBG_FACILITY NFSDBG_CALLBACK
|
|
#define NFSDBG_FACILITY NFSDBG_CALLBACK
|
|
@@ -349,6 +350,20 @@ static unsigned decode_recallany_args(struct svc_rqst *rqstp,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static unsigned decode_recallslot_args(struct svc_rqst *rqstp,
|
|
|
|
+ struct xdr_stream *xdr,
|
|
|
|
+ struct cb_recallslotargs *args)
|
|
|
|
+{
|
|
|
|
+ __be32 *p;
|
|
|
|
+
|
|
|
|
+ args->crsa_addr = svc_addr(rqstp);
|
|
|
|
+ p = read_buf(xdr, 4);
|
|
|
|
+ if (unlikely(p == NULL))
|
|
|
|
+ return htonl(NFS4ERR_BADXDR);
|
|
|
|
+ args->crsa_target_max_slots = ntohl(*p++);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
|
|
|
|
static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char *str)
|
|
static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char *str)
|
|
@@ -557,6 +572,7 @@ preprocess_nfs41_op(int nop, unsigned int op_nr, struct callback_op **op)
|
|
case OP_CB_RECALL:
|
|
case OP_CB_RECALL:
|
|
case OP_CB_SEQUENCE:
|
|
case OP_CB_SEQUENCE:
|
|
case OP_CB_RECALL_ANY:
|
|
case OP_CB_RECALL_ANY:
|
|
|
|
+ case OP_CB_RECALL_SLOT:
|
|
*op = &callback_ops[op_nr];
|
|
*op = &callback_ops[op_nr];
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -565,7 +581,6 @@ preprocess_nfs41_op(int nop, unsigned int op_nr, struct callback_op **op)
|
|
case OP_CB_NOTIFY:
|
|
case OP_CB_NOTIFY:
|
|
case OP_CB_PUSH_DELEG:
|
|
case OP_CB_PUSH_DELEG:
|
|
case OP_CB_RECALLABLE_OBJ_AVAIL:
|
|
case OP_CB_RECALLABLE_OBJ_AVAIL:
|
|
- case OP_CB_RECALL_SLOT:
|
|
|
|
case OP_CB_WANTS_CANCELLED:
|
|
case OP_CB_WANTS_CANCELLED:
|
|
case OP_CB_NOTIFY_LOCK:
|
|
case OP_CB_NOTIFY_LOCK:
|
|
return htonl(NFS4ERR_NOTSUPP);
|
|
return htonl(NFS4ERR_NOTSUPP);
|
|
@@ -734,6 +749,11 @@ static struct callback_op callback_ops[] = {
|
|
.decode_args = (callback_decode_arg_t)decode_recallany_args,
|
|
.decode_args = (callback_decode_arg_t)decode_recallany_args,
|
|
.res_maxsize = CB_OP_RECALLANY_RES_MAXSZ,
|
|
.res_maxsize = CB_OP_RECALLANY_RES_MAXSZ,
|
|
},
|
|
},
|
|
|
|
+ [OP_CB_RECALL_SLOT] = {
|
|
|
|
+ .process_op = (callback_process_op_t)nfs4_callback_recallslot,
|
|
|
|
+ .decode_args = (callback_decode_arg_t)decode_recallslot_args,
|
|
|
|
+ .res_maxsize = CB_OP_RECALLSLOT_RES_MAXSZ,
|
|
|
|
+ },
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
};
|
|
};
|
|
|
|
|