File tree Expand file tree Collapse file tree 3 files changed +40
-23
lines changed Expand file tree Collapse file tree 3 files changed +40
-23
lines changed Original file line number Diff line number Diff line change @@ -505,4 +505,7 @@ static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
505
505
return test_and_set_bit (XPRT_BINDING , & xprt -> state );
506
506
}
507
507
508
+ void xprt_set_offline_locked (struct rpc_xprt * xprt , struct rpc_xprt_switch * xps );
509
+ void xprt_set_online_locked (struct rpc_xprt * xprt , struct rpc_xprt_switch * xps );
510
+ void xprt_delete_locked (struct rpc_xprt * xprt , struct rpc_xprt_switch * xps );
508
511
#endif /* _LINUX_SUNRPC_XPRT_H */
Original file line number Diff line number Diff line change @@ -314,32 +314,14 @@ static ssize_t rpc_sysfs_xprt_state_change(struct kobject *kobj,
314
314
goto release_tasks ;
315
315
}
316
316
if (offline ) {
317
- if (!test_and_set_bit (XPRT_OFFLINE , & xprt -> state )) {
318
- spin_lock (& xps -> xps_lock );
319
- xps -> xps_nactive -- ;
320
- spin_unlock (& xps -> xps_lock );
321
- }
317
+ xprt_set_offline_locked (xprt , xps );
322
318
} else if (online ) {
323
- if (test_and_clear_bit (XPRT_OFFLINE , & xprt -> state )) {
324
- spin_lock (& xps -> xps_lock );
325
- xps -> xps_nactive ++ ;
326
- spin_unlock (& xps -> xps_lock );
327
- }
319
+ xprt_set_online_locked (xprt , xps );
328
320
} else if (remove ) {
329
- if (test_bit (XPRT_OFFLINE , & xprt -> state )) {
330
- if (!test_and_set_bit (XPRT_REMOVE , & xprt -> state )) {
331
- xprt_force_disconnect (xprt );
332
- if (test_bit (XPRT_CONNECTED , & xprt -> state )) {
333
- if (!xprt -> sending .qlen &&
334
- !xprt -> pending .qlen &&
335
- !xprt -> backlog .qlen &&
336
- !atomic_long_read (& xprt -> queuelen ))
337
- rpc_xprt_switch_remove_xprt (xps , xprt );
338
- }
339
- }
340
- } else {
321
+ if (test_bit (XPRT_OFFLINE , & xprt -> state ))
322
+ xprt_delete_locked (xprt , xps );
323
+ else
341
324
count = - EINVAL ;
342
- }
343
325
}
344
326
345
327
release_tasks :
Original file line number Diff line number Diff line change @@ -2152,3 +2152,35 @@ void xprt_put(struct rpc_xprt *xprt)
2152
2152
kref_put (& xprt -> kref , xprt_destroy_kref );
2153
2153
}
2154
2154
EXPORT_SYMBOL_GPL (xprt_put );
2155
+
2156
+ void xprt_set_offline_locked (struct rpc_xprt * xprt , struct rpc_xprt_switch * xps )
2157
+ {
2158
+ if (!test_and_set_bit (XPRT_OFFLINE , & xprt -> state )) {
2159
+ spin_lock (& xps -> xps_lock );
2160
+ xps -> xps_nactive -- ;
2161
+ spin_unlock (& xps -> xps_lock );
2162
+ }
2163
+ }
2164
+
2165
+ void xprt_set_online_locked (struct rpc_xprt * xprt , struct rpc_xprt_switch * xps )
2166
+ {
2167
+ if (test_and_clear_bit (XPRT_OFFLINE , & xprt -> state )) {
2168
+ spin_lock (& xps -> xps_lock );
2169
+ xps -> xps_nactive ++ ;
2170
+ spin_unlock (& xps -> xps_lock );
2171
+ }
2172
+ }
2173
+
2174
+ void xprt_delete_locked (struct rpc_xprt * xprt , struct rpc_xprt_switch * xps )
2175
+ {
2176
+ if (test_and_set_bit (XPRT_REMOVE , & xprt -> state ))
2177
+ return ;
2178
+
2179
+ xprt_force_disconnect (xprt );
2180
+ if (!test_bit (XPRT_CONNECTED , & xprt -> state ))
2181
+ return ;
2182
+
2183
+ if (!xprt -> sending .qlen && !xprt -> pending .qlen &&
2184
+ !xprt -> backlog .qlen && !atomic_long_read (& xprt -> queuelen ))
2185
+ rpc_xprt_switch_remove_xprt (xps , xprt );
2186
+ }
You can’t perform that action at this time.
0 commit comments