Lines Matching full:cb

71  * Encode/decode NFSv4 CB basic data types
238 dprintk("NFSD: Unrecognized NFS CB status value: %u\n", status); in nfs_cb_stat_to_errno()
433 const struct nfsd4_callback *cb, in encode_cb_sequence4args() argument
436 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in encode_cb_sequence4args()
446 *p++ = cpu_to_be32(session->se_cb_seq_nr[cb->cb_held_slot]); /* csa_sequenceid */ in encode_cb_sequence4args()
447 *p++ = cpu_to_be32(cb->cb_held_slot); /* csa_slotid */ in encode_cb_sequence4args()
502 struct nfsd4_callback *cb) in decode_cb_sequence4resok() argument
504 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in decode_cb_sequence4resok()
524 if (seqid != session->se_cb_seq_nr[cb->cb_held_slot]) { in decode_cb_sequence4resok()
530 if (slotid != cb->cb_held_slot) { in decode_cb_sequence4resok()
541 cb->cb_seq_status = status; in decode_cb_sequence4resok()
549 struct nfsd4_callback *cb) in decode_cb_sequence4res() argument
553 if (cb->cb_clp->cl_minorversion == 0) in decode_cb_sequence4res()
556 status = decode_cb_op_status(xdr, OP_CB_SEQUENCE, &cb->cb_seq_status); in decode_cb_sequence4res()
557 if (unlikely(status || cb->cb_seq_status)) in decode_cb_sequence4res()
560 return decode_cb_sequence4resok(xdr, cb); in decode_cb_sequence4res()
587 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_getattr() local
589 container_of(cb, struct nfs4_cb_fattr, ncf_getattr); in nfs4_xdr_enc_cb_getattr()
591 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_getattr()
592 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_getattr()
596 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_getattr()
607 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_recall() local
608 const struct nfs4_delegation *dp = cb_to_delegation(cb); in nfs4_xdr_enc_cb_recall()
610 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_recall()
611 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_recall()
615 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_recall()
627 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_recall_any() local
630 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_recall_any()
631 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_recall_any()
634 ra = container_of(cb, struct nfsd4_cb_recall_any, ra_cb); in nfs4_xdr_enc_cb_recall_any()
636 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_recall_any()
663 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_getattr() local
669 container_of(cb, struct nfs4_cb_fattr, ncf_getattr); in nfs4_xdr_dec_cb_getattr()
675 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_getattr()
676 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_getattr()
679 status = decode_cb_op_status(xdr, OP_CB_GETATTR, &cb->cb_status); in nfs4_xdr_dec_cb_getattr()
680 if (unlikely(status || cb->cb_status)) in nfs4_xdr_dec_cb_getattr()
703 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_recall() local
711 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_recall()
712 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_recall()
715 return decode_cb_op_status(xdr, OP_CB_RECALL, &cb->cb_status); in nfs4_xdr_dec_cb_recall()
726 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_recall_any() local
733 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_recall_any()
734 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_recall_any()
736 status = decode_cb_op_status(xdr, OP_CB_RECALL_ANY, &cb->cb_status); in nfs4_xdr_dec_cb_recall_any()
797 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_layout() local
799 container_of(cb, struct nfs4_layout_stateid, ls_recall); in nfs4_xdr_enc_cb_layout()
802 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_layout()
806 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_layout()
815 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_layout() local
823 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_layout()
824 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_layout()
827 return decode_cb_op_status(xdr, OP_CB_LAYOUTRECALL, &cb->cb_status); in nfs4_xdr_dec_cb_layout()
844 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_notify_lock() local
846 container_of(cb, struct nfsd4_blocked_lock, nbl_cb); in nfs4_xdr_enc_cb_notify_lock()
850 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_notify_lock()
858 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_notify_lock()
873 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_notify_lock() local
881 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_notify_lock()
882 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_notify_lock()
885 return decode_cb_op_status(xdr, OP_CB_NOTIFY_LOCK, &cb->cb_status); in nfs4_xdr_dec_cb_notify_lock()
949 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_offload() local
951 container_of(cb, struct nfsd4_cb_offload, co_cb); in nfs4_xdr_enc_cb_offload()
954 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_offload()
958 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_offload()
967 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_offload() local
975 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_offload()
976 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_offload()
979 return decode_cb_op_status(xdr, OP_CB_OFFLOAD, &cb->cb_status); in nfs4_xdr_dec_cb_offload()
1057 static bool nfsd4_queue_cb(struct nfsd4_callback *cb) in nfsd4_queue_cb() argument
1059 struct nfs4_client *clp = cb->cb_clp; in nfsd4_queue_cb()
1061 trace_nfsd_cb_queue(clp, cb); in nfsd4_queue_cb()
1062 return queue_work(clp->cl_callback_wq, &cb->cb_work); in nfsd4_queue_cb()
1065 static void nfsd4_requeue_cb(struct rpc_task *task, struct nfsd4_callback *cb) in nfsd4_requeue_cb() argument
1067 struct nfs4_client *clp = cb->cb_clp; in nfsd4_requeue_cb()
1070 trace_nfsd_cb_restart(clp, cb); in nfsd4_requeue_cb()
1072 set_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags); in nfsd4_requeue_cb()
1221 /* XXX: release method to ensure we set the cb channel down if
1274 static bool nfsd41_cb_get_slot(struct nfsd4_callback *cb, struct rpc_task *task) in nfsd41_cb_get_slot() argument
1276 struct nfs4_client *clp = cb->cb_clp; in nfsd41_cb_get_slot()
1279 if (cb->cb_held_slot >= 0) in nfsd41_cb_get_slot()
1281 cb->cb_held_slot = grab_slot(ses); in nfsd41_cb_get_slot()
1282 if (cb->cb_held_slot < 0) { in nfsd41_cb_get_slot()
1285 cb->cb_held_slot = grab_slot(ses); in nfsd41_cb_get_slot()
1286 if (cb->cb_held_slot < 0) in nfsd41_cb_get_slot()
1293 static void nfsd41_cb_release_slot(struct nfsd4_callback *cb) in nfsd41_cb_release_slot() argument
1295 struct nfs4_client *clp = cb->cb_clp; in nfsd41_cb_release_slot()
1298 if (cb->cb_held_slot >= 0) { in nfsd41_cb_release_slot()
1300 ses->se_cb_slot_avail |= BIT(cb->cb_held_slot); in nfsd41_cb_release_slot()
1302 cb->cb_held_slot = -1; in nfsd41_cb_release_slot()
1307 static void nfsd41_destroy_cb(struct nfsd4_callback *cb) in nfsd41_destroy_cb() argument
1309 struct nfs4_client *clp = cb->cb_clp; in nfsd41_destroy_cb()
1311 trace_nfsd_cb_destroy(clp, cb); in nfsd41_destroy_cb()
1312 nfsd41_cb_release_slot(cb); in nfsd41_destroy_cb()
1313 if (test_bit(NFSD4_CALLBACK_WAKE, &cb->cb_flags)) in nfsd41_destroy_cb()
1314 clear_and_wake_up_bit(NFSD4_CALLBACK_RUNNING, &cb->cb_flags); in nfsd41_destroy_cb()
1316 clear_bit(NFSD4_CALLBACK_RUNNING, &cb->cb_flags); in nfsd41_destroy_cb()
1318 if (cb->cb_ops && cb->cb_ops->release) in nfsd41_destroy_cb()
1319 cb->cb_ops->release(cb); in nfsd41_destroy_cb()
1329 struct nfsd4_callback *cb = calldata; in nfsd4_cb_prepare() local
1330 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_prepare()
1338 cb->cb_seq_status = 1; in nfsd4_cb_prepare()
1339 cb->cb_status = 0; in nfsd4_cb_prepare()
1340 if (minorversion && !nfsd41_cb_get_slot(cb, task)) in nfsd4_cb_prepare()
1346 static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback *cb) in nfsd4_cb_sequence_done() argument
1348 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in nfsd4_cb_sequence_done()
1351 if (cb->cb_held_slot < 0) in nfsd4_cb_sequence_done()
1355 trace_nfsd_cb_seq_status(task, cb); in nfsd4_cb_sequence_done()
1356 switch (cb->cb_seq_status) { in nfsd4_cb_sequence_done()
1365 ++session->se_cb_seq_nr[cb->cb_held_slot]; in nfsd4_cb_sequence_done()
1375 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1386 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1389 cb->cb_seq_status = 1; in nfsd4_cb_sequence_done()
1402 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1403 cb->cb_held_slot = -1; in nfsd4_cb_sequence_done()
1406 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1408 trace_nfsd_cb_free_slot(task, cb); in nfsd4_cb_sequence_done()
1409 nfsd41_cb_release_slot(cb); in nfsd4_cb_sequence_done()
1421 nfsd41_cb_release_slot(cb); in nfsd4_cb_sequence_done()
1422 nfsd4_requeue_cb(task, cb); in nfsd4_cb_sequence_done()
1428 struct nfsd4_callback *cb = calldata; in nfsd4_cb_done() local
1429 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_done()
1444 nfsd4_requeue_cb(task, cb); in nfsd4_cb_done()
1445 } else if (!nfsd4_cb_sequence_done(task, cb)) { in nfsd4_cb_done()
1449 if (cb->cb_status) { in nfsd4_cb_done()
1452 cb->cb_status, task->tk_status, cb->cb_ops->opcode); in nfsd4_cb_done()
1453 task->tk_status = cb->cb_status; in nfsd4_cb_done()
1456 switch (cb->cb_ops->done(cb, task)) { in nfsd4_cb_done()
1476 struct nfsd4_callback *cb = calldata; in nfsd4_cb_release() local
1478 trace_nfsd_cb_rpc_release(cb->cb_clp); in nfsd4_cb_release()
1480 if (test_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags)) in nfsd4_cb_release()
1481 nfsd4_queue_cb(cb); in nfsd4_cb_release()
1483 nfsd41_destroy_cb(cb); in nfsd4_cb_release()
1532 static void nfsd4_process_cb_update(struct nfsd4_callback *cb) in nfsd4_process_cb_update() argument
1535 struct nfs4_client *clp = cb->cb_clp; in nfsd4_process_cb_update()
1540 trace_nfsd_cb_bc_update(clp, cb); in nfsd4_process_cb_update()
1547 trace_nfsd_cb_bc_shutdown(clp, cb); in nfsd4_process_cb_update()
1568 memcpy(&conn, &cb->cb_clp->cl_cb_conn, sizeof(struct nfs4_cb_conn)); in nfsd4_process_cb_update()
1589 struct nfsd4_callback *cb = in nfsd4_run_cb_work() local
1591 struct nfs4_client *clp = cb->cb_clp; in nfsd4_run_cb_work()
1598 nfsd4_process_cb_update(cb); in nfsd4_run_cb_work()
1606 nfsd41_destroy_cb(cb); in nfsd4_run_cb_work()
1613 if (!cb->cb_ops && clp->cl_minorversion) { in nfsd4_run_cb_work()
1615 nfsd41_destroy_cb(cb); in nfsd4_run_cb_work()
1619 if (!test_and_clear_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags)) { in nfsd4_run_cb_work()
1620 if (cb->cb_ops && cb->cb_ops->prepare) in nfsd4_run_cb_work()
1621 cb->cb_ops->prepare(cb); in nfsd4_run_cb_work()
1624 cb->cb_msg.rpc_cred = clp->cl_cb_cred; in nfsd4_run_cb_work()
1626 ret = rpc_call_async(clnt, &cb->cb_msg, RPC_TASK_SOFT | flags, in nfsd4_run_cb_work()
1627 cb->cb_ops ? &nfsd4_cb_ops : &nfsd4_cb_probe_ops, cb); in nfsd4_run_cb_work()
1629 set_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags); in nfsd4_run_cb_work()
1630 nfsd4_queue_cb(cb); in nfsd4_run_cb_work()
1634 void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp, in nfsd4_init_cb() argument
1637 cb->cb_clp = clp; in nfsd4_init_cb()
1638 cb->cb_msg.rpc_proc = &nfs4_cb_procedures[op]; in nfsd4_init_cb()
1639 cb->cb_msg.rpc_argp = cb; in nfsd4_init_cb()
1640 cb->cb_msg.rpc_resp = cb; in nfsd4_init_cb()
1641 cb->cb_flags = 0; in nfsd4_init_cb()
1642 cb->cb_ops = ops; in nfsd4_init_cb()
1643 INIT_WORK(&cb->cb_work, nfsd4_run_cb_work); in nfsd4_init_cb()
1644 cb->cb_status = 0; in nfsd4_init_cb()
1645 cb->cb_held_slot = -1; in nfsd4_init_cb()
1650 * @cb: callback to queue
1655 bool nfsd4_run_cb(struct nfsd4_callback *cb) in nfsd4_run_cb() argument
1657 struct nfs4_client *clp = cb->cb_clp; in nfsd4_run_cb()
1661 queued = nfsd4_queue_cb(cb); in nfsd4_run_cb()