@@ -59,6 +59,16 @@ static struct kobject *rpc_sysfs_object_alloc(const char *name,
59
59
return NULL ;
60
60
}
61
61
62
+ static inline struct rpc_clnt *
63
+ rpc_sysfs_client_kobj_get_clnt (struct kobject * kobj )
64
+ {
65
+ struct rpc_sysfs_client * c = container_of (kobj ,
66
+ struct rpc_sysfs_client , kobject );
67
+ struct rpc_clnt * ret = c -> clnt ;
68
+
69
+ return refcount_inc_not_zero (& ret -> cl_count ) ? ret : NULL ;
70
+ }
71
+
62
72
static inline struct rpc_xprt *
63
73
rpc_sysfs_xprt_kobj_get_xprt (struct kobject * kobj )
64
74
{
@@ -86,6 +96,51 @@ rpc_sysfs_xprt_switch_kobj_get_xprt(struct kobject *kobj)
86
96
return xprt_switch_get (x -> xprt_switch );
87
97
}
88
98
99
+ static ssize_t rpc_sysfs_clnt_version_show (struct kobject * kobj ,
100
+ struct kobj_attribute * attr ,
101
+ char * buf )
102
+ {
103
+ struct rpc_clnt * clnt = rpc_sysfs_client_kobj_get_clnt (kobj );
104
+ ssize_t ret ;
105
+
106
+ if (!clnt )
107
+ return sprintf (buf , "<closed>\n" );
108
+
109
+ ret = sprintf (buf , "%u" , clnt -> cl_vers );
110
+ refcount_dec (& clnt -> cl_count );
111
+ return ret ;
112
+ }
113
+
114
+ static ssize_t rpc_sysfs_clnt_program_show (struct kobject * kobj ,
115
+ struct kobj_attribute * attr ,
116
+ char * buf )
117
+ {
118
+ struct rpc_clnt * clnt = rpc_sysfs_client_kobj_get_clnt (kobj );
119
+ ssize_t ret ;
120
+
121
+ if (!clnt )
122
+ return sprintf (buf , "<closed>\n" );
123
+
124
+ ret = sprintf (buf , "%s" , clnt -> cl_program -> name );
125
+ refcount_dec (& clnt -> cl_count );
126
+ return ret ;
127
+ }
128
+
129
+ static ssize_t rpc_sysfs_clnt_max_connect_show (struct kobject * kobj ,
130
+ struct kobj_attribute * attr ,
131
+ char * buf )
132
+ {
133
+ struct rpc_clnt * clnt = rpc_sysfs_client_kobj_get_clnt (kobj );
134
+ ssize_t ret ;
135
+
136
+ if (!clnt )
137
+ return sprintf (buf , "<closed>\n" );
138
+
139
+ ret = sprintf (buf , "%u\n" , clnt -> cl_max_connect );
140
+ refcount_dec (& clnt -> cl_count );
141
+ return ret ;
142
+ }
143
+
89
144
static ssize_t rpc_sysfs_xprt_dstaddr_show (struct kobject * kobj ,
90
145
struct kobj_attribute * attr ,
91
146
char * buf )
@@ -423,6 +478,23 @@ static const void *rpc_sysfs_xprt_namespace(const struct kobject *kobj)
423
478
kobject )-> xprt -> xprt_net ;
424
479
}
425
480
481
+ static struct kobj_attribute rpc_sysfs_clnt_version = __ATTR (rpc_version ,
482
+ 0444 , rpc_sysfs_clnt_version_show , NULL );
483
+
484
+ static struct kobj_attribute rpc_sysfs_clnt_program = __ATTR (program ,
485
+ 0444 , rpc_sysfs_clnt_program_show , NULL );
486
+
487
+ static struct kobj_attribute rpc_sysfs_clnt_max_connect = __ATTR (max_connect ,
488
+ 0444 , rpc_sysfs_clnt_max_connect_show , NULL );
489
+
490
+ static struct attribute * rpc_sysfs_rpc_clnt_attrs [] = {
491
+ & rpc_sysfs_clnt_version .attr ,
492
+ & rpc_sysfs_clnt_program .attr ,
493
+ & rpc_sysfs_clnt_max_connect .attr ,
494
+ NULL ,
495
+ };
496
+ ATTRIBUTE_GROUPS (rpc_sysfs_rpc_clnt );
497
+
426
498
static struct kobj_attribute rpc_sysfs_xprt_dstaddr = __ATTR (dstaddr ,
427
499
0644 , rpc_sysfs_xprt_dstaddr_show , rpc_sysfs_xprt_dstaddr_store );
428
500
@@ -459,6 +531,7 @@ ATTRIBUTE_GROUPS(rpc_sysfs_xprt_switch);
459
531
460
532
static const struct kobj_type rpc_sysfs_client_type = {
461
533
.release = rpc_sysfs_client_release ,
534
+ .default_groups = rpc_sysfs_rpc_clnt_groups ,
462
535
.sysfs_ops = & kobj_sysfs_ops ,
463
536
.namespace = rpc_sysfs_client_namespace ,
464
537
};
0 commit comments