SUNRPC: Add an identifier for struct rpc_clnt
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 5 Sep 2013 01:51:44 +0000 (21:51 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 5 Sep 2013 14:13:15 +0000 (10:13 -0400)
Add an identifier in order to aid debugging.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
include/linux/sunrpc/clnt.h
net/sunrpc/clnt.c

index 76c0bf6ecd171eb6554b1760d2ec9b810887ccc7..6740801aa71ab519c59bd21a7e50ee5793cc242a 100644 (file)
@@ -33,6 +33,7 @@ struct rpc_inode;
  */
 struct rpc_clnt {
        atomic_t                cl_count;       /* Number of references */
+       unsigned int            cl_clid;        /* client id */
        struct list_head        cl_clients;     /* Global list of clients */
        struct list_head        cl_tasks;       /* List of tasks */
        spinlock_t              cl_lock;        /* spinlock */
index 0cd5b6d5c75e3c5bd76b6b722fbd5d65dcd89950..0a790690d1426b7de8b5103ec475a15b54466c6b 100644 (file)
@@ -313,6 +313,24 @@ out:
        return err;
 }
 
+static DEFINE_IDA(rpc_clids);
+
+static int rpc_alloc_clid(struct rpc_clnt *clnt)
+{
+       int clid;
+
+       clid = ida_simple_get(&rpc_clids, 0, 0, GFP_KERNEL);
+       if (clid < 0)
+               return clid;
+       clnt->cl_clid = clid;
+       return 0;
+}
+
+static void rpc_free_clid(struct rpc_clnt *clnt)
+{
+       ida_simple_remove(&rpc_clids, clnt->cl_clid);
+}
+
 static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
                struct rpc_xprt *xprt,
                struct rpc_clnt *parent)
@@ -343,6 +361,10 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
                goto out_err;
        clnt->cl_parent = parent ? : clnt;
 
+       err = rpc_alloc_clid(clnt);
+       if (err)
+               goto out_no_clid;
+
        rcu_assign_pointer(clnt->cl_xprt, xprt);
        clnt->cl_procinfo = version->procs;
        clnt->cl_maxproc  = version->nrprocs;
@@ -386,6 +408,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
 out_no_path:
        rpc_free_iostats(clnt->cl_metrics);
 out_no_stats:
+       rpc_free_clid(clnt);
+out_no_clid:
        kfree(clnt);
 out_err:
        rpciod_down();
@@ -646,6 +670,7 @@ rpc_free_client(struct rpc_clnt *clnt)
        clnt->cl_metrics = NULL;
        xprt_put(rcu_dereference_raw(clnt->cl_xprt));
        rpciod_down();
+       rpc_free_clid(clnt);
        kfree(clnt);
 }