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()
456 const struct nfsd4_callback *cb, in encode_cb_sequence4args() argument
459 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in encode_cb_sequence4args()
470 *p++ = cpu_to_be32(session->se_cb_seq_nr[cb->cb_held_slot]); /* csa_sequenceid */ in encode_cb_sequence4args()
471 *p++ = cpu_to_be32(cb->cb_held_slot); /* csa_slotid */ in encode_cb_sequence4args()
476 encode_uint32(xdr, cb->cb_nr_referring_call_list); in encode_cb_sequence4args()
477 list_for_each_entry(rcl, &cb->cb_referring_call_list, __list) in encode_cb_sequence4args()
530 struct nfsd4_callback *cb) in decode_cb_sequence4resok() argument
532 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in decode_cb_sequence4resok()
552 if (seqid != session->se_cb_seq_nr[cb->cb_held_slot]) { in decode_cb_sequence4resok()
558 if (slotid != cb->cb_held_slot) { in decode_cb_sequence4resok()
569 cb->cb_seq_status = status; in decode_cb_sequence4resok()
577 struct nfsd4_callback *cb) in decode_cb_sequence4res() argument
581 if (cb->cb_clp->cl_minorversion == 0) in decode_cb_sequence4res()
584 status = decode_cb_op_status(xdr, OP_CB_SEQUENCE, &cb->cb_seq_status); in decode_cb_sequence4res()
585 if (unlikely(status || cb->cb_seq_status)) in decode_cb_sequence4res()
588 return decode_cb_sequence4resok(xdr, cb); in decode_cb_sequence4res()
615 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_getattr() local
617 container_of(cb, struct nfs4_cb_fattr, ncf_getattr); in nfs4_xdr_enc_cb_getattr()
619 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_getattr()
620 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_getattr()
624 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_getattr()
635 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_recall() local
636 const struct nfs4_delegation *dp = cb_to_delegation(cb); in nfs4_xdr_enc_cb_recall()
638 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_recall()
639 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_recall()
643 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_recall()
655 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_recall_any() local
658 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_recall_any()
659 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_recall_any()
662 ra = container_of(cb, struct nfsd4_cb_recall_any, ra_cb); in nfs4_xdr_enc_cb_recall_any()
664 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_recall_any()
691 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_getattr() local
697 container_of(cb, struct nfs4_cb_fattr, ncf_getattr); in nfs4_xdr_dec_cb_getattr()
703 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_getattr()
704 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_getattr()
707 status = decode_cb_op_status(xdr, OP_CB_GETATTR, &cb->cb_status); in nfs4_xdr_dec_cb_getattr()
708 if (unlikely(status || cb->cb_status)) in nfs4_xdr_dec_cb_getattr()
731 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_recall() local
739 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_recall()
740 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_recall()
743 return decode_cb_op_status(xdr, OP_CB_RECALL, &cb->cb_status); in nfs4_xdr_dec_cb_recall()
754 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_recall_any() local
761 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_recall_any()
762 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_recall_any()
764 status = decode_cb_op_status(xdr, OP_CB_RECALL_ANY, &cb->cb_status); in nfs4_xdr_dec_cb_recall_any()
825 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_layout() local
827 container_of(cb, struct nfs4_layout_stateid, ls_recall); in nfs4_xdr_enc_cb_layout()
830 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_layout()
834 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_layout()
843 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_layout() local
851 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_layout()
852 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_layout()
855 return decode_cb_op_status(xdr, OP_CB_LAYOUTRECALL, &cb->cb_status); in nfs4_xdr_dec_cb_layout()
872 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_notify_lock() local
874 container_of(cb, struct nfsd4_blocked_lock, nbl_cb); in nfs4_xdr_enc_cb_notify_lock()
878 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_notify_lock()
886 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_notify_lock()
901 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_notify_lock() local
909 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_notify_lock()
910 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_notify_lock()
913 return decode_cb_op_status(xdr, OP_CB_NOTIFY_LOCK, &cb->cb_status); in nfs4_xdr_dec_cb_notify_lock()
977 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_offload() local
979 container_of(cb, struct nfsd4_cb_offload, co_cb); in nfs4_xdr_enc_cb_offload()
982 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_offload()
986 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_offload()
995 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_offload() local
1003 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_offload()
1004 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_offload()
1007 return decode_cb_op_status(xdr, OP_CB_OFFLOAD, &cb->cb_status); in nfs4_xdr_dec_cb_offload()
1085 static bool nfsd4_queue_cb(struct nfsd4_callback *cb) in nfsd4_queue_cb() argument
1087 struct nfs4_client *clp = cb->cb_clp; in nfsd4_queue_cb()
1089 trace_nfsd_cb_queue(clp, cb); in nfsd4_queue_cb()
1090 return queue_work(clp->cl_callback_wq, &cb->cb_work); in nfsd4_queue_cb()
1093 static void nfsd4_requeue_cb(struct rpc_task *task, struct nfsd4_callback *cb) in nfsd4_requeue_cb() argument
1095 struct nfs4_client *clp = cb->cb_clp; in nfsd4_requeue_cb()
1098 trace_nfsd_cb_restart(clp, cb); in nfsd4_requeue_cb()
1100 set_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags); in nfsd4_requeue_cb()
1249 /* XXX: release method to ensure we set the cb channel down if
1302 static bool nfsd41_cb_get_slot(struct nfsd4_callback *cb, struct rpc_task *task) in nfsd41_cb_get_slot() argument
1304 struct nfs4_client *clp = cb->cb_clp; in nfsd41_cb_get_slot()
1307 if (cb->cb_held_slot >= 0) in nfsd41_cb_get_slot()
1309 cb->cb_held_slot = grab_slot(ses); in nfsd41_cb_get_slot()
1310 if (cb->cb_held_slot < 0) { in nfsd41_cb_get_slot()
1313 cb->cb_held_slot = grab_slot(ses); in nfsd41_cb_get_slot()
1314 if (cb->cb_held_slot < 0) in nfsd41_cb_get_slot()
1321 static void nfsd41_cb_release_slot(struct nfsd4_callback *cb) in nfsd41_cb_release_slot() argument
1323 struct nfs4_client *clp = cb->cb_clp; in nfsd41_cb_release_slot()
1326 if (cb->cb_held_slot >= 0) { in nfsd41_cb_release_slot()
1328 ses->se_cb_slot_avail |= BIT(cb->cb_held_slot); in nfsd41_cb_release_slot()
1330 cb->cb_held_slot = -1; in nfsd41_cb_release_slot()
1335 static void nfsd41_destroy_cb(struct nfsd4_callback *cb) in nfsd41_destroy_cb() argument
1337 struct nfs4_client *clp = cb->cb_clp; in nfsd41_destroy_cb()
1339 trace_nfsd_cb_destroy(clp, cb); in nfsd41_destroy_cb()
1340 nfsd41_cb_release_slot(cb); in nfsd41_destroy_cb()
1341 if (test_bit(NFSD4_CALLBACK_WAKE, &cb->cb_flags)) in nfsd41_destroy_cb()
1342 clear_and_wake_up_bit(NFSD4_CALLBACK_RUNNING, &cb->cb_flags); in nfsd41_destroy_cb()
1344 clear_bit(NFSD4_CALLBACK_RUNNING, &cb->cb_flags); in nfsd41_destroy_cb()
1346 if (cb->cb_ops && cb->cb_ops->release) in nfsd41_destroy_cb()
1347 cb->cb_ops->release(cb); in nfsd41_destroy_cb()
1353 * @cb: context of callback to add the rc to
1358 * Caller serializes access to @cb.
1362 void nfsd41_cb_referring_call(struct nfsd4_callback *cb, in nfsd41_cb_referring_call() argument
1373 list_for_each_entry(rcl, &cb->cb_referring_call_list, __list) { in nfsd41_cb_referring_call()
1388 list_add(&rcl->__list, &cb->cb_referring_call_list); in nfsd41_cb_referring_call()
1389 cb->cb_nr_referring_call_list++; in nfsd41_cb_referring_call()
1411 cb->cb_nr_referring_call_list--; in nfsd41_cb_referring_call()
1419 * @cb: context of a callback that has completed
1424 * Caller serializes access to @cb.
1426 void nfsd41_cb_destroy_referring_call_list(struct nfsd4_callback *cb) in nfsd41_cb_destroy_referring_call_list() argument
1431 while (!list_empty(&cb->cb_referring_call_list)) { in nfsd41_cb_destroy_referring_call_list()
1432 rcl = list_first_entry(&cb->cb_referring_call_list, in nfsd41_cb_destroy_referring_call_list()
1450 struct nfsd4_callback *cb = calldata; in nfsd4_cb_prepare() local
1451 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_prepare()
1459 cb->cb_seq_status = 1; in nfsd4_cb_prepare()
1460 cb->cb_status = 0; in nfsd4_cb_prepare()
1461 if (minorversion && !nfsd41_cb_get_slot(cb, task)) in nfsd4_cb_prepare()
1467 static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback *cb) in nfsd4_cb_sequence_done() argument
1469 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in nfsd4_cb_sequence_done()
1472 if (cb->cb_held_slot < 0) in nfsd4_cb_sequence_done()
1476 trace_nfsd_cb_seq_status(task, cb); in nfsd4_cb_sequence_done()
1477 switch (cb->cb_seq_status) { in nfsd4_cb_sequence_done()
1486 ++session->se_cb_seq_nr[cb->cb_held_slot]; in nfsd4_cb_sequence_done()
1496 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1507 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1510 cb->cb_seq_status = 1; in nfsd4_cb_sequence_done()
1523 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1524 cb->cb_held_slot = -1; in nfsd4_cb_sequence_done()
1527 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1529 trace_nfsd_cb_free_slot(task, cb); in nfsd4_cb_sequence_done()
1530 nfsd41_cb_release_slot(cb); in nfsd4_cb_sequence_done()
1542 nfsd41_cb_release_slot(cb); in nfsd4_cb_sequence_done()
1543 nfsd4_requeue_cb(task, cb); in nfsd4_cb_sequence_done()
1549 struct nfsd4_callback *cb = calldata; in nfsd4_cb_done() local
1550 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_done()
1565 nfsd4_requeue_cb(task, cb); in nfsd4_cb_done()
1566 } else if (!nfsd4_cb_sequence_done(task, cb)) { in nfsd4_cb_done()
1570 if (cb->cb_status) { in nfsd4_cb_done()
1573 cb->cb_status, task->tk_status, cb->cb_ops->opcode); in nfsd4_cb_done()
1574 task->tk_status = cb->cb_status; in nfsd4_cb_done()
1577 switch (cb->cb_ops->done(cb, task)) { in nfsd4_cb_done()
1597 struct nfsd4_callback *cb = calldata; in nfsd4_cb_release() local
1599 trace_nfsd_cb_rpc_release(cb->cb_clp); in nfsd4_cb_release()
1601 if (test_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags)) in nfsd4_cb_release()
1602 nfsd4_queue_cb(cb); in nfsd4_cb_release()
1604 nfsd41_destroy_cb(cb); in nfsd4_cb_release()
1653 static void nfsd4_process_cb_update(struct nfsd4_callback *cb) in nfsd4_process_cb_update() argument
1656 struct nfs4_client *clp = cb->cb_clp; in nfsd4_process_cb_update()
1661 trace_nfsd_cb_bc_update(clp, cb); in nfsd4_process_cb_update()
1668 trace_nfsd_cb_bc_shutdown(clp, cb); in nfsd4_process_cb_update()
1689 memcpy(&conn, &cb->cb_clp->cl_cb_conn, sizeof(struct nfs4_cb_conn)); in nfsd4_process_cb_update()
1710 struct nfsd4_callback *cb = in nfsd4_run_cb_work() local
1712 struct nfs4_client *clp = cb->cb_clp; in nfsd4_run_cb_work()
1719 nfsd4_process_cb_update(cb); in nfsd4_run_cb_work()
1727 nfsd41_destroy_cb(cb); in nfsd4_run_cb_work()
1734 if (!cb->cb_ops && clp->cl_minorversion) { in nfsd4_run_cb_work()
1736 nfsd41_destroy_cb(cb); in nfsd4_run_cb_work()
1740 if (!test_and_clear_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags)) { in nfsd4_run_cb_work()
1741 if (cb->cb_ops && cb->cb_ops->prepare) in nfsd4_run_cb_work()
1742 cb->cb_ops->prepare(cb); in nfsd4_run_cb_work()
1745 cb->cb_msg.rpc_cred = clp->cl_cb_cred; in nfsd4_run_cb_work()
1747 ret = rpc_call_async(clnt, &cb->cb_msg, RPC_TASK_SOFT | flags, in nfsd4_run_cb_work()
1748 cb->cb_ops ? &nfsd4_cb_ops : &nfsd4_cb_probe_ops, cb); in nfsd4_run_cb_work()
1750 set_bit(NFSD4_CALLBACK_REQUEUE, &cb->cb_flags); in nfsd4_run_cb_work()
1751 nfsd4_queue_cb(cb); in nfsd4_run_cb_work()
1755 void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp, in nfsd4_init_cb() argument
1758 cb->cb_clp = clp; in nfsd4_init_cb()
1759 cb->cb_msg.rpc_proc = &nfs4_cb_procedures[op]; in nfsd4_init_cb()
1760 cb->cb_msg.rpc_argp = cb; in nfsd4_init_cb()
1761 cb->cb_msg.rpc_resp = cb; in nfsd4_init_cb()
1762 cb->cb_flags = 0; in nfsd4_init_cb()
1763 cb->cb_ops = ops; in nfsd4_init_cb()
1764 INIT_WORK(&cb->cb_work, nfsd4_run_cb_work); in nfsd4_init_cb()
1765 cb->cb_status = 0; in nfsd4_init_cb()
1766 cb->cb_held_slot = -1; in nfsd4_init_cb()
1767 cb->cb_nr_referring_call_list = 0; in nfsd4_init_cb()
1768 INIT_LIST_HEAD(&cb->cb_referring_call_list); in nfsd4_init_cb()
1773 * @cb: callback to queue
1778 bool nfsd4_run_cb(struct nfsd4_callback *cb) in nfsd4_run_cb() argument
1780 struct nfs4_client *clp = cb->cb_clp; in nfsd4_run_cb()
1784 queued = nfsd4_queue_cb(cb); in nfsd4_run_cb()