77#include "sysfs.h"
88
99static struct kset * rpc_sunrpc_kset ;
10- static struct kobject * rpc_sunrpc_client_kobj ;
10+ static struct kobject * rpc_sunrpc_client_kobj , * rpc_sunrpc_xprt_switch_kobj ;
1111
1212static void rpc_sysfs_object_release (struct kobject * kobj )
1313{
@@ -48,13 +48,22 @@ int rpc_sysfs_init(void)
4848 rpc_sunrpc_kset = kset_create_and_add ("sunrpc" , NULL , kernel_kobj );
4949 if (!rpc_sunrpc_kset )
5050 return - ENOMEM ;
51- rpc_sunrpc_client_kobj = rpc_sysfs_object_alloc ("client" , rpc_sunrpc_kset , NULL );
52- if (!rpc_sunrpc_client_kobj ) {
53- kset_unregister (rpc_sunrpc_kset );
54- rpc_sunrpc_client_kobj = NULL ;
55- return - ENOMEM ;
56- }
51+ rpc_sunrpc_client_kobj =
52+ rpc_sysfs_object_alloc ("rpc-clients" , rpc_sunrpc_kset , NULL );
53+ if (!rpc_sunrpc_client_kobj )
54+ goto err_client ;
55+ rpc_sunrpc_xprt_switch_kobj =
56+ rpc_sysfs_object_alloc ("xprt-switches" , rpc_sunrpc_kset , NULL );
57+ if (!rpc_sunrpc_xprt_switch_kobj )
58+ goto err_switch ;
5759 return 0 ;
60+ err_switch :
61+ kobject_put (rpc_sunrpc_client_kobj );
62+ rpc_sunrpc_client_kobj = NULL ;
63+ err_client :
64+ kset_unregister (rpc_sunrpc_kset );
65+ rpc_sunrpc_kset = NULL ;
66+ return - ENOMEM ;
5867}
5968
6069static void rpc_sysfs_client_release (struct kobject * kobj )
@@ -65,20 +74,40 @@ static void rpc_sysfs_client_release(struct kobject *kobj)
6574 kfree (c );
6675}
6776
77+ static void rpc_sysfs_xprt_switch_release (struct kobject * kobj )
78+ {
79+ struct rpc_sysfs_xprt_switch * xprt_switch ;
80+
81+ xprt_switch = container_of (kobj , struct rpc_sysfs_xprt_switch , kobject );
82+ kfree (xprt_switch );
83+ }
84+
6885static const void * rpc_sysfs_client_namespace (struct kobject * kobj )
6986{
7087 return container_of (kobj , struct rpc_sysfs_client , kobject )-> net ;
7188}
7289
90+ static const void * rpc_sysfs_xprt_switch_namespace (struct kobject * kobj )
91+ {
92+ return container_of (kobj , struct rpc_sysfs_xprt_switch , kobject )-> net ;
93+ }
94+
7395static struct kobj_type rpc_sysfs_client_type = {
7496 .release = rpc_sysfs_client_release ,
7597 .sysfs_ops = & kobj_sysfs_ops ,
7698 .namespace = rpc_sysfs_client_namespace ,
7799};
78100
101+ static struct kobj_type rpc_sysfs_xprt_switch_type = {
102+ .release = rpc_sysfs_xprt_switch_release ,
103+ .sysfs_ops = & kobj_sysfs_ops ,
104+ .namespace = rpc_sysfs_xprt_switch_namespace ,
105+ };
106+
79107void rpc_sysfs_exit (void )
80108{
81109 kobject_put (rpc_sunrpc_client_kobj );
110+ kobject_put (rpc_sunrpc_xprt_switch_kobj );
82111 kset_unregister (rpc_sunrpc_kset );
83112}
84113
@@ -100,6 +129,28 @@ static struct rpc_sysfs_client *rpc_sysfs_client_alloc(struct kobject *parent,
100129 return NULL ;
101130}
102131
132+ static struct rpc_sysfs_xprt_switch *
133+ rpc_sysfs_xprt_switch_alloc (struct kobject * parent ,
134+ struct rpc_xprt_switch * xprt_switch ,
135+ struct net * net ,
136+ gfp_t gfp_flags )
137+ {
138+ struct rpc_sysfs_xprt_switch * p ;
139+
140+ p = kzalloc (sizeof (* p ), gfp_flags );
141+ if (p ) {
142+ p -> net = net ;
143+ p -> kobject .kset = rpc_sunrpc_kset ;
144+ if (kobject_init_and_add (& p -> kobject ,
145+ & rpc_sysfs_xprt_switch_type ,
146+ parent , "switch-%d" ,
147+ xprt_switch -> xps_id ) == 0 )
148+ return p ;
149+ kobject_put (& p -> kobject );
150+ }
151+ return NULL ;
152+ }
153+
103154void rpc_sysfs_client_setup (struct rpc_clnt * clnt , struct net * net )
104155{
105156 struct rpc_sysfs_client * rpc_client ;
@@ -111,6 +162,28 @@ void rpc_sysfs_client_setup(struct rpc_clnt *clnt, struct net *net)
111162 }
112163}
113164
165+ void rpc_sysfs_xprt_switch_setup (struct rpc_xprt_switch * xprt_switch ,
166+ struct rpc_xprt * xprt ,
167+ gfp_t gfp_flags )
168+ {
169+ struct rpc_sysfs_xprt_switch * rpc_xprt_switch ;
170+ struct net * net ;
171+
172+ if (xprt_switch -> xps_net )
173+ net = xprt_switch -> xps_net ;
174+ else
175+ net = xprt -> xprt_net ;
176+ rpc_xprt_switch =
177+ rpc_sysfs_xprt_switch_alloc (rpc_sunrpc_xprt_switch_kobj ,
178+ xprt_switch , net , gfp_flags );
179+ if (rpc_xprt_switch ) {
180+ xprt_switch -> xps_sysfs = rpc_xprt_switch ;
181+ rpc_xprt_switch -> xprt_switch = xprt_switch ;
182+ rpc_xprt_switch -> xprt = xprt ;
183+ kobject_uevent (& rpc_xprt_switch -> kobject , KOBJ_ADD );
184+ }
185+ }
186+
114187void rpc_sysfs_client_destroy (struct rpc_clnt * clnt )
115188{
116189 struct rpc_sysfs_client * rpc_client = clnt -> cl_sysfs ;
@@ -122,3 +195,15 @@ void rpc_sysfs_client_destroy(struct rpc_clnt *clnt)
122195 clnt -> cl_sysfs = NULL ;
123196 }
124197}
198+
199+ void rpc_sysfs_xprt_switch_destroy (struct rpc_xprt_switch * xprt_switch )
200+ {
201+ struct rpc_sysfs_xprt_switch * rpc_xprt_switch = xprt_switch -> xps_sysfs ;
202+
203+ if (rpc_xprt_switch ) {
204+ kobject_uevent (& rpc_xprt_switch -> kobject , KOBJ_REMOVE );
205+ kobject_del (& rpc_xprt_switch -> kobject );
206+ kobject_put (& rpc_xprt_switch -> kobject );
207+ xprt_switch -> xps_sysfs = NULL ;
208+ }
209+ }
0 commit comments