@@ -82,6 +82,14 @@ static void rpc_sysfs_xprt_switch_release(struct kobject *kobj)
82
82
kfree (xprt_switch );
83
83
}
84
84
85
+ static void rpc_sysfs_xprt_release (struct kobject * kobj )
86
+ {
87
+ struct rpc_sysfs_xprt * xprt ;
88
+
89
+ xprt = container_of (kobj , struct rpc_sysfs_xprt , kobject );
90
+ kfree (xprt );
91
+ }
92
+
85
93
static const void * rpc_sysfs_client_namespace (struct kobject * kobj )
86
94
{
87
95
return container_of (kobj , struct rpc_sysfs_client , kobject )-> net ;
@@ -92,6 +100,12 @@ static const void *rpc_sysfs_xprt_switch_namespace(struct kobject *kobj)
92
100
return container_of (kobj , struct rpc_sysfs_xprt_switch , kobject )-> net ;
93
101
}
94
102
103
+ static const void * rpc_sysfs_xprt_namespace (struct kobject * kobj )
104
+ {
105
+ return container_of (kobj , struct rpc_sysfs_xprt ,
106
+ kobject )-> xprt -> xprt_net ;
107
+ }
108
+
95
109
static struct kobj_type rpc_sysfs_client_type = {
96
110
.release = rpc_sysfs_client_release ,
97
111
.sysfs_ops = & kobj_sysfs_ops ,
@@ -104,6 +118,12 @@ static struct kobj_type rpc_sysfs_xprt_switch_type = {
104
118
.namespace = rpc_sysfs_xprt_switch_namespace ,
105
119
};
106
120
121
+ static struct kobj_type rpc_sysfs_xprt_type = {
122
+ .release = rpc_sysfs_xprt_release ,
123
+ .sysfs_ops = & kobj_sysfs_ops ,
124
+ .namespace = rpc_sysfs_xprt_namespace ,
125
+ };
126
+
107
127
void rpc_sysfs_exit (void )
108
128
{
109
129
kobject_put (rpc_sunrpc_client_kobj );
@@ -151,6 +171,25 @@ rpc_sysfs_xprt_switch_alloc(struct kobject *parent,
151
171
return NULL ;
152
172
}
153
173
174
+ static struct rpc_sysfs_xprt * rpc_sysfs_xprt_alloc (struct kobject * parent ,
175
+ struct rpc_xprt * xprt ,
176
+ gfp_t gfp_flags )
177
+ {
178
+ struct rpc_sysfs_xprt * p ;
179
+
180
+ p = kzalloc (sizeof (* p ), gfp_flags );
181
+ if (!p )
182
+ goto out ;
183
+ p -> kobject .kset = rpc_sunrpc_kset ;
184
+ if (kobject_init_and_add (& p -> kobject , & rpc_sysfs_xprt_type ,
185
+ parent , "xprt-%d-%s" , xprt -> id ,
186
+ xprt -> address_strings [RPC_DISPLAY_PROTO ]) == 0 )
187
+ return p ;
188
+ kobject_put (& p -> kobject );
189
+ out :
190
+ return NULL ;
191
+ }
192
+
154
193
void rpc_sysfs_client_setup (struct rpc_clnt * clnt ,
155
194
struct rpc_xprt_switch * xprt_switch ,
156
195
struct net * net )
@@ -199,6 +238,22 @@ void rpc_sysfs_xprt_switch_setup(struct rpc_xprt_switch *xprt_switch,
199
238
}
200
239
}
201
240
241
+ void rpc_sysfs_xprt_setup (struct rpc_xprt_switch * xprt_switch ,
242
+ struct rpc_xprt * xprt ,
243
+ gfp_t gfp_flags )
244
+ {
245
+ struct rpc_sysfs_xprt * rpc_xprt ;
246
+ struct rpc_sysfs_xprt_switch * switch_obj =
247
+ (struct rpc_sysfs_xprt_switch * )xprt_switch -> xps_sysfs ;
248
+
249
+ rpc_xprt = rpc_sysfs_xprt_alloc (& switch_obj -> kobject , xprt , gfp_flags );
250
+ if (rpc_xprt ) {
251
+ xprt -> xprt_sysfs = rpc_xprt ;
252
+ rpc_xprt -> xprt = xprt ;
253
+ kobject_uevent (& rpc_xprt -> kobject , KOBJ_ADD );
254
+ }
255
+ }
256
+
202
257
void rpc_sysfs_client_destroy (struct rpc_clnt * clnt )
203
258
{
204
259
struct rpc_sysfs_client * rpc_client = clnt -> cl_sysfs ;
@@ -225,3 +280,15 @@ void rpc_sysfs_xprt_switch_destroy(struct rpc_xprt_switch *xprt_switch)
225
280
xprt_switch -> xps_sysfs = NULL ;
226
281
}
227
282
}
283
+
284
+ void rpc_sysfs_xprt_destroy (struct rpc_xprt * xprt )
285
+ {
286
+ struct rpc_sysfs_xprt * rpc_xprt = xprt -> xprt_sysfs ;
287
+
288
+ if (rpc_xprt ) {
289
+ kobject_uevent (& rpc_xprt -> kobject , KOBJ_REMOVE );
290
+ kobject_del (& rpc_xprt -> kobject );
291
+ kobject_put (& rpc_xprt -> kobject );
292
+ xprt -> xprt_sysfs = NULL ;
293
+ }
294
+ }
0 commit comments