Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[platform/kernel/linux-starfive.git] / fs / nfsd / nfs4callback.c
index 5cf9132..7fbe984 100644 (file)
@@ -38,6 +38,7 @@
 #include "nfsd.h"
 #include "state.h"
 #include "netns.h"
+#include "trace.h"
 #include "xdr4cb.h"
 #include "xdr4.h"
 
@@ -904,16 +905,20 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
 
        if (clp->cl_minorversion == 0) {
                if (!clp->cl_cred.cr_principal &&
-                               (clp->cl_cred.cr_flavor >= RPC_AUTH_GSS_KRB5))
+                   (clp->cl_cred.cr_flavor >= RPC_AUTH_GSS_KRB5)) {
+                       trace_nfsd_cb_setup_err(clp, -EINVAL);
                        return -EINVAL;
+               }
                args.client_name = clp->cl_cred.cr_principal;
                args.prognumber = conn->cb_prog;
                args.protocol = XPRT_TRANSPORT_TCP;
                args.authflavor = clp->cl_cred.cr_flavor;
                clp->cl_cb_ident = conn->cb_ident;
        } else {
-               if (!conn->cb_xprt)
+               if (!conn->cb_xprt) {
+                       trace_nfsd_cb_setup_err(clp, -EINVAL);
                        return -EINVAL;
+               }
                clp->cl_cb_conn.cb_xprt = conn->cb_xprt;
                clp->cl_cb_session = ses;
                args.bc_xprt = conn->cb_xprt;
@@ -925,32 +930,27 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
        /* Create RPC client */
        client = rpc_create(&args);
        if (IS_ERR(client)) {
-               dprintk("NFSD: couldn't create callback client: %ld\n",
-                       PTR_ERR(client));
+               trace_nfsd_cb_setup_err(clp, PTR_ERR(client));
                return PTR_ERR(client);
        }
        cred = get_backchannel_cred(clp, client, ses);
        if (!cred) {
+               trace_nfsd_cb_setup_err(clp, -ENOMEM);
                rpc_shutdown_client(client);
                return -ENOMEM;
        }
        clp->cl_cb_client = client;
        clp->cl_cb_cred = cred;
+       trace_nfsd_cb_setup(clp);
        return 0;
 }
 
-static void warn_no_callback_path(struct nfs4_client *clp, int reason)
-{
-       dprintk("NFSD: warning: no callback path to client %.*s: error %d\n",
-               (int)clp->cl_name.len, clp->cl_name.data, reason);
-}
-
 static void nfsd4_mark_cb_down(struct nfs4_client *clp, int reason)
 {
        if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
                return;
        clp->cl_cb_state = NFSD4_CB_DOWN;
-       warn_no_callback_path(clp, reason);
+       trace_nfsd_cb_state(clp);
 }
 
 static void nfsd4_mark_cb_fault(struct nfs4_client *clp, int reason)
@@ -958,17 +958,20 @@ static void nfsd4_mark_cb_fault(struct nfs4_client *clp, int reason)
        if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
                return;
        clp->cl_cb_state = NFSD4_CB_FAULT;
-       warn_no_callback_path(clp, reason);
+       trace_nfsd_cb_state(clp);
 }
 
 static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
 {
        struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null);
 
+       trace_nfsd_cb_done(clp, task->tk_status);
        if (task->tk_status)
                nfsd4_mark_cb_down(clp, task->tk_status);
-       else
+       else {
                clp->cl_cb_state = NFSD4_CB_UP;
+               trace_nfsd_cb_state(clp);
+       }
 }
 
 static void nfsd4_cb_probe_release(void *calldata)
@@ -993,6 +996,7 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = {
 void nfsd4_probe_callback(struct nfs4_client *clp)
 {
        clp->cl_cb_state = NFSD4_CB_UNKNOWN;
+       trace_nfsd_cb_state(clp);
        set_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags);
        nfsd4_run_cb(&clp->cl_cb_null);
 }
@@ -1009,6 +1013,7 @@ void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *conn)
        spin_lock(&clp->cl_lock);
        memcpy(&clp->cl_cb_conn, conn, sizeof(struct nfs4_cb_conn));
        spin_unlock(&clp->cl_lock);
+       trace_nfsd_cb_state(clp);
 }
 
 /*
@@ -1165,8 +1170,7 @@ static void nfsd4_cb_done(struct rpc_task *task, void *calldata)
        struct nfsd4_callback *cb = calldata;
        struct nfs4_client *clp = cb->cb_clp;
 
-       dprintk("%s: minorversion=%d\n", __func__,
-               clp->cl_minorversion);
+       trace_nfsd_cb_done(clp, task->tk_status);
 
        if (!nfsd4_cb_sequence_done(task, cb))
                return;
@@ -1271,6 +1275,7 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
         * kill the old client:
         */
        if (clp->cl_cb_client) {
+               trace_nfsd_cb_shutdown(clp);
                rpc_shutdown_client(clp->cl_cb_client);
                clp->cl_cb_client = NULL;
                put_cred(clp->cl_cb_cred);
@@ -1301,6 +1306,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
        err = setup_callback_client(clp, &conn, ses);
        if (err) {
                nfsd4_mark_cb_down(clp, err);
+               if (c)
+                       svc_xprt_put(c->cn_xprt);
                return;
        }
 }
@@ -1314,6 +1321,8 @@ nfsd4_run_cb_work(struct work_struct *work)
        struct rpc_clnt *clnt;
        int flags;
 
+       trace_nfsd_cb_work(clp, cb->cb_msg.rpc_proc->p_name);
+
        if (cb->cb_need_restart) {
                cb->cb_need_restart = false;
        } else {