7
7
#include "sysfs.h"
8
8
9
9
static 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 ;
11
11
12
12
static void rpc_sysfs_object_release (struct kobject * kobj )
13
13
{
@@ -48,13 +48,22 @@ int rpc_sysfs_init(void)
48
48
rpc_sunrpc_kset = kset_create_and_add ("sunrpc" , NULL , kernel_kobj );
49
49
if (!rpc_sunrpc_kset )
50
50
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 ;
57
59
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 ;
58
67
}
59
68
60
69
static void rpc_sysfs_client_release (struct kobject * kobj )
@@ -65,20 +74,40 @@ static void rpc_sysfs_client_release(struct kobject *kobj)
65
74
kfree (c );
66
75
}
67
76
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
+
68
85
static const void * rpc_sysfs_client_namespace (struct kobject * kobj )
69
86
{
70
87
return container_of (kobj , struct rpc_sysfs_client , kobject )-> net ;
71
88
}
72
89
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
+
73
95
static struct kobj_type rpc_sysfs_client_type = {
74
96
.release = rpc_sysfs_client_release ,
75
97
.sysfs_ops = & kobj_sysfs_ops ,
76
98
.namespace = rpc_sysfs_client_namespace ,
77
99
};
78
100
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
+
79
107
void rpc_sysfs_exit (void )
80
108
{
81
109
kobject_put (rpc_sunrpc_client_kobj );
110
+ kobject_put (rpc_sunrpc_xprt_switch_kobj );
82
111
kset_unregister (rpc_sunrpc_kset );
83
112
}
84
113
@@ -100,6 +129,28 @@ static struct rpc_sysfs_client *rpc_sysfs_client_alloc(struct kobject *parent,
100
129
return NULL ;
101
130
}
102
131
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
+
103
154
void rpc_sysfs_client_setup (struct rpc_clnt * clnt , struct net * net )
104
155
{
105
156
struct rpc_sysfs_client * rpc_client ;
@@ -111,6 +162,28 @@ void rpc_sysfs_client_setup(struct rpc_clnt *clnt, struct net *net)
111
162
}
112
163
}
113
164
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
+
114
187
void rpc_sysfs_client_destroy (struct rpc_clnt * clnt )
115
188
{
116
189
struct rpc_sysfs_client * rpc_client = clnt -> cl_sysfs ;
@@ -122,3 +195,15 @@ void rpc_sysfs_client_destroy(struct rpc_clnt *clnt)
122
195
clnt -> cl_sysfs = NULL ;
123
196
}
124
197
}
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