Lines Matching refs:clp
846 static void nfsd41_cb_inflight_begin(struct nfs4_client *clp)
848 atomic_inc(&clp->cl_cb_inflight);
851 static void nfsd41_cb_inflight_end(struct nfs4_client *clp)
854 if (atomic_dec_and_test(&clp->cl_cb_inflight))
855 wake_up_var(&clp->cl_cb_inflight);
858 static void nfsd41_cb_inflight_wait_complete(struct nfs4_client *clp)
860 wait_var_event(&clp->cl_cb_inflight,
861 !atomic_read(&clp->cl_cb_inflight));
864 static const struct cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc_clnt *client, struct nfsd4_session *ses)
866 if (clp->cl_minorversion == 0) {
867 client->cl_principal = clp->cl_cred.cr_targ_princ ?
868 clp->cl_cred.cr_targ_princ : "nfs";
884 static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn, struct nfsd4_session *ses)
886 int maxtime = max_cb_time(clp->net);
893 .net = clp->net,
906 if (clp->cl_minorversion == 0) {
907 if (!clp->cl_cred.cr_principal &&
908 (clp->cl_cred.cr_flavor >= RPC_AUTH_GSS_KRB5)) {
909 trace_nfsd_cb_setup_err(clp, -EINVAL);
912 args.client_name = clp->cl_cred.cr_principal;
915 args.authflavor = clp->cl_cred.cr_flavor;
916 clp->cl_cb_ident = conn->cb_ident;
920 clp->cl_cb_session = ses;
922 args.prognumber = clp->cl_cb_session->se_cb_prog;
930 trace_nfsd_cb_setup_err(clp, PTR_ERR(client));
933 cred = get_backchannel_cred(clp, client, ses);
935 trace_nfsd_cb_setup_err(clp, -ENOMEM);
940 if (clp->cl_minorversion != 0)
941 clp->cl_cb_conn.cb_xprt = conn->cb_xprt;
942 clp->cl_cb_client = client;
943 clp->cl_cb_cred = cred;
944 trace_nfsd_cb_setup(clp);
948 static void nfsd4_mark_cb_down(struct nfs4_client *clp, int reason)
950 if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
952 clp->cl_cb_state = NFSD4_CB_DOWN;
953 trace_nfsd_cb_state(clp);
956 static void nfsd4_mark_cb_fault(struct nfs4_client *clp, int reason)
958 if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
960 clp->cl_cb_state = NFSD4_CB_FAULT;
961 trace_nfsd_cb_state(clp);
966 struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null);
968 trace_nfsd_cb_done(clp, task->tk_status);
970 nfsd4_mark_cb_down(clp, task->tk_status);
972 clp->cl_cb_state = NFSD4_CB_UP;
973 trace_nfsd_cb_state(clp);
979 struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null);
981 nfsd41_cb_inflight_end(clp);
996 void nfsd4_probe_callback(struct nfs4_client *clp)
998 clp->cl_cb_state = NFSD4_CB_UNKNOWN;
999 trace_nfsd_cb_state(clp);
1000 set_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags);
1001 nfsd4_run_cb(&clp->cl_cb_null);
1004 void nfsd4_probe_callback_sync(struct nfs4_client *clp)
1006 nfsd4_probe_callback(clp);
1010 void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *conn)
1012 clp->cl_cb_state = NFSD4_CB_UNKNOWN;
1013 spin_lock(&clp->cl_lock);
1014 memcpy(&clp->cl_cb_conn, conn, sizeof(struct nfs4_cb_conn));
1015 spin_unlock(&clp->cl_lock);
1016 trace_nfsd_cb_state(clp);
1026 struct nfs4_client *clp = cb->cb_clp;
1029 test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
1030 rpc_sleep_on(&clp->cl_cb_waitq, task, NULL);
1032 if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
1036 rpc_wake_up_queued_task(&clp->cl_cb_waitq, task);
1044 struct nfs4_client *clp = cb->cb_clp;
1048 clear_bit(0, &clp->cl_cb_slot_busy);
1049 rpc_wake_up_next(&clp->cl_cb_waitq);
1055 struct nfs4_client *clp = cb->cb_clp;
1060 nfsd41_cb_inflight_end(clp);
1070 struct nfs4_client *clp = cb->cb_clp;
1071 u32 minorversion = clp->cl_minorversion;
1086 struct nfs4_client *clp = cb->cb_clp;
1087 struct nfsd4_session *session = clp->cl_cb_session;
1090 if (!clp->cl_minorversion) {
1150 clp->cl_cb_session->se_cb_seq_nr);
1161 if (!test_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags)) {
1171 struct nfs4_client *clp = cb->cb_clp;
1173 trace_nfsd_cb_done(clp, task->tk_status);
1193 nfsd4_mark_cb_down(clp, task->tk_status);
1232 void nfsd4_shutdown_callback(struct nfs4_client *clp)
1234 set_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags);
1240 nfsd4_run_cb(&clp->cl_cb_null);
1242 nfsd41_cb_inflight_wait_complete(clp);
1246 static struct nfsd4_conn * __nfsd4_find_backchannel(struct nfs4_client *clp)
1251 list_for_each_entry(s, &clp->cl_sessions, se_perclnt) {
1269 struct nfs4_client *clp = cb->cb_clp;
1278 if (clp->cl_cb_client) {
1279 trace_nfsd_cb_shutdown(clp);
1280 rpc_shutdown_client(clp->cl_cb_client);
1281 clp->cl_cb_client = NULL;
1282 put_cred(clp->cl_cb_cred);
1283 clp->cl_cb_cred = NULL;
1285 if (clp->cl_cb_conn.cb_xprt) {
1286 svc_xprt_put(clp->cl_cb_conn.cb_xprt);
1287 clp->cl_cb_conn.cb_xprt = NULL;
1289 if (test_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags))
1291 spin_lock(&clp->cl_lock);
1296 BUG_ON(!(clp->cl_flags & NFSD4_CLIENT_CB_FLAG_MASK));
1297 clear_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags);
1299 c = __nfsd4_find_backchannel(clp);
1305 spin_unlock(&clp->cl_lock);
1307 err = setup_callback_client(clp, &conn, ses);
1309 nfsd4_mark_cb_down(clp, err);
1321 struct nfs4_client *clp = cb->cb_clp;
1325 trace_nfsd_cb_work(clp, cb->cb_msg.rpc_proc->p_name);
1334 if (clp->cl_flags & NFSD4_CLIENT_CB_FLAG_MASK)
1337 clnt = clp->cl_cb_client;
1347 if (!cb->cb_ops && clp->cl_minorversion) {
1348 clp->cl_cb_state = NFSD4_CB_UP;
1353 cb->cb_msg.rpc_cred = clp->cl_cb_cred;
1354 flags = clp->cl_minorversion ? RPC_TASK_NOCONNECT : RPC_TASK_SOFTCONN;
1359 void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
1362 cb->cb_clp = clp;
1376 struct nfs4_client *clp = cb->cb_clp;
1378 nfsd41_cb_inflight_begin(clp);
1380 nfsd41_cb_inflight_end(clp);