@@ -59,6 +59,16 @@ static struct kobject *rpc_sysfs_object_alloc(const char *name,
5959 return NULL ;
6060}
6161
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+
6272static inline struct rpc_xprt *
6373rpc_sysfs_xprt_kobj_get_xprt (struct kobject * kobj )
6474{
@@ -86,6 +96,51 @@ rpc_sysfs_xprt_switch_kobj_get_xprt(struct kobject *kobj)
8696 return xprt_switch_get (x -> xprt_switch );
8797}
8898
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+
89144static ssize_t rpc_sysfs_xprt_dstaddr_show (struct kobject * kobj ,
90145 struct kobj_attribute * attr ,
91146 char * buf )
@@ -423,6 +478,23 @@ static const void *rpc_sysfs_xprt_namespace(const struct kobject *kobj)
423478 kobject )-> xprt -> xprt_net ;
424479}
425480
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+
426498static struct kobj_attribute rpc_sysfs_xprt_dstaddr = __ATTR (dstaddr ,
427499 0644 , rpc_sysfs_xprt_dstaddr_show , rpc_sysfs_xprt_dstaddr_store );
428500
@@ -459,6 +531,7 @@ ATTRIBUTE_GROUPS(rpc_sysfs_xprt_switch);
459531
460532static const struct kobj_type rpc_sysfs_client_type = {
461533 .release = rpc_sysfs_client_release ,
534+ .default_groups = rpc_sysfs_rpc_clnt_groups ,
462535 .sysfs_ops = & kobj_sysfs_ops ,
463536 .namespace = rpc_sysfs_client_namespace ,
464537};
0 commit comments