Lines Matching refs:cb
435 const struct nfsd4_callback *cb, in encode_cb_sequence4args() argument
438 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in encode_cb_sequence4args()
448 *p++ = cpu_to_be32(session->se_cb_seq_nr[cb->cb_held_slot]); /* csa_sequenceid */ in encode_cb_sequence4args()
449 *p++ = cpu_to_be32(cb->cb_held_slot); /* csa_slotid */ in encode_cb_sequence4args()
504 struct nfsd4_callback *cb) in decode_cb_sequence4resok() argument
506 struct nfsd4_session *session = cb->cb_clp->cl_cb_session; in decode_cb_sequence4resok()
526 if (seqid != session->se_cb_seq_nr[cb->cb_held_slot]) { in decode_cb_sequence4resok()
532 if (slotid != cb->cb_held_slot) { in decode_cb_sequence4resok()
543 cb->cb_seq_status = status; in decode_cb_sequence4resok()
551 struct nfsd4_callback *cb) in decode_cb_sequence4res() argument
555 if (cb->cb_clp->cl_minorversion == 0) in decode_cb_sequence4res()
558 status = decode_cb_op_status(xdr, OP_CB_SEQUENCE, &cb->cb_seq_status); in decode_cb_sequence4res()
559 if (unlikely(status || cb->cb_seq_status)) in decode_cb_sequence4res()
562 return decode_cb_sequence4resok(xdr, cb); in decode_cb_sequence4res()
589 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_getattr() local
591 container_of(cb, struct nfs4_cb_fattr, ncf_getattr); in nfs4_xdr_enc_cb_getattr()
593 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_getattr()
594 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_getattr()
598 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_getattr()
609 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_recall() local
610 const struct nfs4_delegation *dp = cb_to_delegation(cb); in nfs4_xdr_enc_cb_recall()
612 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_recall()
613 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_recall()
617 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_recall()
629 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_recall_any() local
632 .ident = cb->cb_clp->cl_cb_ident, in nfs4_xdr_enc_cb_recall_any()
633 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_recall_any()
636 ra = container_of(cb, struct nfsd4_cb_recall_any, ra_cb); in nfs4_xdr_enc_cb_recall_any()
638 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_recall_any()
665 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_getattr() local
671 container_of(cb, struct nfs4_cb_fattr, ncf_getattr); in nfs4_xdr_dec_cb_getattr()
677 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_getattr()
678 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_getattr()
681 status = decode_cb_op_status(xdr, OP_CB_GETATTR, &cb->cb_status); in nfs4_xdr_dec_cb_getattr()
682 if (unlikely(status || cb->cb_status)) in nfs4_xdr_dec_cb_getattr()
705 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_recall() local
713 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_recall()
714 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_recall()
717 return decode_cb_op_status(xdr, OP_CB_RECALL, &cb->cb_status); in nfs4_xdr_dec_cb_recall()
728 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_recall_any() local
735 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_recall_any()
736 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_recall_any()
738 status = decode_cb_op_status(xdr, OP_CB_RECALL_ANY, &cb->cb_status); in nfs4_xdr_dec_cb_recall_any()
799 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_layout() local
801 container_of(cb, struct nfs4_layout_stateid, ls_recall); in nfs4_xdr_enc_cb_layout()
804 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_layout()
808 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_layout()
817 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_layout() local
825 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_layout()
826 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_layout()
829 return decode_cb_op_status(xdr, OP_CB_LAYOUTRECALL, &cb->cb_status); in nfs4_xdr_dec_cb_layout()
846 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_notify_lock() local
848 container_of(cb, struct nfsd4_blocked_lock, nbl_cb); in nfs4_xdr_enc_cb_notify_lock()
852 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_notify_lock()
860 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_notify_lock()
875 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_notify_lock() local
883 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_notify_lock()
884 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_notify_lock()
887 return decode_cb_op_status(xdr, OP_CB_NOTIFY_LOCK, &cb->cb_status); in nfs4_xdr_dec_cb_notify_lock()
951 const struct nfsd4_callback *cb = data; in nfs4_xdr_enc_cb_offload() local
953 container_of(cb, struct nfsd4_cb_offload, co_cb); in nfs4_xdr_enc_cb_offload()
956 .minorversion = cb->cb_clp->cl_minorversion, in nfs4_xdr_enc_cb_offload()
960 encode_cb_sequence4args(xdr, cb, &hdr); in nfs4_xdr_enc_cb_offload()
969 struct nfsd4_callback *cb = data; in nfs4_xdr_dec_cb_offload() local
977 status = decode_cb_sequence4res(xdr, cb); in nfs4_xdr_dec_cb_offload()
978 if (unlikely(status || cb->cb_seq_status)) in nfs4_xdr_dec_cb_offload()
981 return decode_cb_op_status(xdr, OP_CB_OFFLOAD, &cb->cb_status); in nfs4_xdr_dec_cb_offload()
1059 static bool nfsd4_queue_cb(struct nfsd4_callback *cb) in nfsd4_queue_cb() argument
1061 struct nfs4_client *clp = cb->cb_clp; in nfsd4_queue_cb()
1063 trace_nfsd_cb_queue(clp, cb); in nfsd4_queue_cb()
1064 return queue_work(clp->cl_callback_wq, &cb->cb_work); in nfsd4_queue_cb()
1265 static bool nfsd41_cb_get_slot(struct nfsd4_callback *cb, struct rpc_task *task) in nfsd41_cb_get_slot() argument
1267 struct nfs4_client *clp = cb->cb_clp; in nfsd41_cb_get_slot()
1270 if (cb->cb_held_slot >= 0) in nfsd41_cb_get_slot()
1272 cb->cb_held_slot = grab_slot(ses); in nfsd41_cb_get_slot()
1273 if (cb->cb_held_slot < 0) { in nfsd41_cb_get_slot()
1276 cb->cb_held_slot = grab_slot(ses); in nfsd41_cb_get_slot()
1277 if (cb->cb_held_slot < 0) in nfsd41_cb_get_slot()
1284 static void nfsd41_cb_release_slot(struct nfsd4_callback *cb) in nfsd41_cb_release_slot() argument
1286 struct nfs4_client *clp = cb->cb_clp; in nfsd41_cb_release_slot()
1289 if (cb->cb_held_slot >= 0) { in nfsd41_cb_release_slot()
1291 ses->se_cb_slot_avail |= BIT(cb->cb_held_slot); in nfsd41_cb_release_slot()
1293 cb->cb_held_slot = -1; in nfsd41_cb_release_slot()
1298 static void nfsd41_destroy_cb(struct nfsd4_callback *cb) in nfsd41_destroy_cb() argument
1300 struct nfs4_client *clp = cb->cb_clp; in nfsd41_destroy_cb()
1302 trace_nfsd_cb_destroy(clp, cb); in nfsd41_destroy_cb()
1303 nfsd41_cb_release_slot(cb); in nfsd41_destroy_cb()
1304 if (cb->cb_ops && cb->cb_ops->release) in nfsd41_destroy_cb()
1305 cb->cb_ops->release(cb); in nfsd41_destroy_cb()
1315 struct nfsd4_callback *cb = calldata; in nfsd4_cb_prepare() local
1316 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_prepare()
1324 cb->cb_seq_status = 1; in nfsd4_cb_prepare()
1325 cb->cb_status = 0; in nfsd4_cb_prepare()
1326 if (minorversion && !nfsd41_cb_get_slot(cb, task)) in nfsd4_cb_prepare()
1331 static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback *cb) in nfsd4_cb_sequence_done() argument
1333 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_sequence_done()
1353 if (cb->cb_held_slot < 0) in nfsd4_cb_sequence_done()
1357 trace_nfsd_cb_seq_status(task, cb); in nfsd4_cb_sequence_done()
1358 switch (cb->cb_seq_status) { in nfsd4_cb_sequence_done()
1367 ++session->se_cb_seq_nr[cb->cb_held_slot]; in nfsd4_cb_sequence_done()
1370 ++session->se_cb_seq_nr[cb->cb_held_slot]; in nfsd4_cb_sequence_done()
1371 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1383 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1387 cb->cb_seq_status = 1; in nfsd4_cb_sequence_done()
1396 if (session->se_cb_seq_nr[cb->cb_held_slot] != 1) { in nfsd4_cb_sequence_done()
1397 session->se_cb_seq_nr[cb->cb_held_slot] = 1; in nfsd4_cb_sequence_done()
1402 nfsd4_mark_cb_fault(cb->cb_clp); in nfsd4_cb_sequence_done()
1404 trace_nfsd_cb_free_slot(task, cb); in nfsd4_cb_sequence_done()
1405 nfsd41_cb_release_slot(cb); in nfsd4_cb_sequence_done()
1417 trace_nfsd_cb_restart(clp, cb); in nfsd4_cb_sequence_done()
1419 cb->cb_need_restart = true; in nfsd4_cb_sequence_done()
1426 struct nfsd4_callback *cb = calldata; in nfsd4_cb_done() local
1427 struct nfs4_client *clp = cb->cb_clp; in nfsd4_cb_done()
1431 if (!nfsd4_cb_sequence_done(task, cb)) in nfsd4_cb_done()
1434 if (cb->cb_status) { in nfsd4_cb_done()
1437 cb->cb_status, task->tk_status, cb->cb_ops->opcode); in nfsd4_cb_done()
1438 task->tk_status = cb->cb_status; in nfsd4_cb_done()
1441 switch (cb->cb_ops->done(cb, task)) { in nfsd4_cb_done()
1461 struct nfsd4_callback *cb = calldata; in nfsd4_cb_release() local
1463 trace_nfsd_cb_rpc_release(cb->cb_clp); in nfsd4_cb_release()
1465 if (cb->cb_need_restart) in nfsd4_cb_release()
1466 nfsd4_queue_cb(cb); in nfsd4_cb_release()
1468 nfsd41_destroy_cb(cb); in nfsd4_cb_release()
1517 static void nfsd4_process_cb_update(struct nfsd4_callback *cb) in nfsd4_process_cb_update() argument
1520 struct nfs4_client *clp = cb->cb_clp; in nfsd4_process_cb_update()
1525 trace_nfsd_cb_bc_update(clp, cb); in nfsd4_process_cb_update()
1532 trace_nfsd_cb_bc_shutdown(clp, cb); in nfsd4_process_cb_update()
1553 memcpy(&conn, &cb->cb_clp->cl_cb_conn, sizeof(struct nfs4_cb_conn)); in nfsd4_process_cb_update()
1574 struct nfsd4_callback *cb = in nfsd4_run_cb_work() local
1576 struct nfs4_client *clp = cb->cb_clp; in nfsd4_run_cb_work()
1583 nfsd4_process_cb_update(cb); in nfsd4_run_cb_work()
1591 nfsd41_destroy_cb(cb); in nfsd4_run_cb_work()
1598 if (!cb->cb_ops && clp->cl_minorversion) { in nfsd4_run_cb_work()
1600 nfsd41_destroy_cb(cb); in nfsd4_run_cb_work()
1604 if (cb->cb_need_restart) { in nfsd4_run_cb_work()
1605 cb->cb_need_restart = false; in nfsd4_run_cb_work()
1607 if (cb->cb_ops && cb->cb_ops->prepare) in nfsd4_run_cb_work()
1608 cb->cb_ops->prepare(cb); in nfsd4_run_cb_work()
1610 cb->cb_msg.rpc_cred = clp->cl_cb_cred; in nfsd4_run_cb_work()
1612 rpc_call_async(clnt, &cb->cb_msg, RPC_TASK_SOFT | flags, in nfsd4_run_cb_work()
1613 cb->cb_ops ? &nfsd4_cb_ops : &nfsd4_cb_probe_ops, cb); in nfsd4_run_cb_work()
1616 void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp, in nfsd4_init_cb() argument
1619 cb->cb_clp = clp; in nfsd4_init_cb()
1620 cb->cb_msg.rpc_proc = &nfs4_cb_procedures[op]; in nfsd4_init_cb()
1621 cb->cb_msg.rpc_argp = cb; in nfsd4_init_cb()
1622 cb->cb_msg.rpc_resp = cb; in nfsd4_init_cb()
1623 cb->cb_ops = ops; in nfsd4_init_cb()
1624 INIT_WORK(&cb->cb_work, nfsd4_run_cb_work); in nfsd4_init_cb()
1625 cb->cb_status = 0; in nfsd4_init_cb()
1626 cb->cb_need_restart = false; in nfsd4_init_cb()
1627 cb->cb_held_slot = -1; in nfsd4_init_cb()
1637 bool nfsd4_run_cb(struct nfsd4_callback *cb) in nfsd4_run_cb() argument
1639 struct nfs4_client *clp = cb->cb_clp; in nfsd4_run_cb()
1643 queued = nfsd4_queue_cb(cb); in nfsd4_run_cb()