| @@ -97,7 +97,7 @@ static ssize_t rpc_sysfs_xprt_dstaddr_show(struct kobject *kobj, · 96 unmodified lines |
| 97 | 97 | return 0; |
| 98 | 98 | ret = sprintf(buf, "%s\n", xprt->address_strings[RPC_DISPLAY_ADDR]); |
| 99 | 99 | xprt_put(xprt); |
| 100 | | − return ret + 1; |
| 100 | + return ret; |
| 101 | 101 | } |
| 102 | 102 | |
| 103 | 103 | static ssize_t rpc_sysfs_xprt_srcaddr_show(struct kobject *kobj, |
| @@ -105,33 +105,31 @@ static ssize_t rpc_sysfs_xprt_srcaddr_show(struct kobject *kobj, · 1 unmodified line |
| 105 | 105 | char *buf) |
| 106 | 106 | { |
| 107 | 107 | struct rpc_xprt *xprt = rpc_sysfs_xprt_kobj_get_xprt(kobj); |
| 108 | | − struct sockaddr_storage saddr; |
| 109 | | − struct sock_xprt *sock; |
| 110 | | − ssize_t ret = -1; |
| 108 | + size_t buflen = PAGE_SIZE; |
| 109 | + ssize_t ret = -ENOTSOCK; |
| 111 | 110 | |
| 112 | 111 | if (!xprt || !xprt_connected(xprt)) { |
| 113 | | − xprt_put(xprt); |
| 114 | | − return -ENOTCONN; |
| 112 | + ret = -ENOTCONN; |
| 113 | + } else if (xprt->ops->get_srcaddr) { |
| 114 | + ret = xprt->ops->get_srcaddr(xprt, buf, buflen); |
| 115 | + if (ret > 0) { |
| 116 | + if (ret < buflen - 1) { |
| 117 | + buf[ret] = '\n'; |
| 118 | + ret++; |
| 119 | + buf[ret] = '\0'; |
| 120 | + } |
| 121 | + } |
| 115 | 122 | } |
| 116 | | − |
| 117 | | − sock = container_of(xprt, struct sock_xprt, xprt); |
| 118 | | − mutex_lock(&sock->recv_mutex); |
| 119 | | − if (sock->sock == NULL || |
| 120 | | − kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0) |
| 121 | | − goto out; |
| 122 | | − |
| 123 | | − ret = sprintf(buf, "%pISc\n", &saddr); |
| 124 | | −out: |
| 125 | | − mutex_unlock(&sock->recv_mutex); |
| 126 | 123 | xprt_put(xprt); |
| 127 | | − return ret + 1; |
| 124 | + return ret; |
| 128 | 125 | } |
| 129 | 126 | |
| 130 | 127 | static ssize_t rpc_sysfs_xprt_info_show(struct kobject *kobj, |
| 131 | | − struct kobj_attribute *attr, |
| 132 | | − char *buf) |
| 128 | + struct kobj_attribute *attr, char *buf) |
| 133 | 129 | { |
| 134 | 130 | struct rpc_xprt *xprt = rpc_sysfs_xprt_kobj_get_xprt(kobj); |
| 131 | + unsigned short srcport = 0; |
| 132 | + size_t buflen = PAGE_SIZE; |
| 135 | 133 | ssize_t ret; |
| 136 | 134 | |
| 137 | 135 | if (!xprt || !xprt_connected(xprt)) { |
| @@ -139,7 +137,11 @@ static ssize_t rpc_sysfs_xprt_info_show(struct kobject *kobj, · 1 unmodified line |
| 139 | 137 | return -ENOTCONN; |
| 140 | 138 | } |
| 141 | 139 | |
| 142 | | − ret = sprintf(buf, "last_used=%lu\ncur_cong=%lu\ncong_win=%lu\n" |
| 140 | + if (xprt->ops->get_srcport) |
| 141 | + srcport = xprt->ops->get_srcport(xprt); |
| 142 | + |
| 143 | + ret = snprintf(buf, buflen, |
| 144 | + "last_used=%lu\ncur_cong=%lu\ncong_win=%lu\n" |
| 143 | 145 | "max_num_slots=%u\nmin_num_slots=%u\nnum_reqs=%u\n" |
| 144 | 146 | "binding_q_len=%u\nsending_q_len=%u\npending_q_len=%u\n" |
| 145 | 147 | "backlog_q_len=%u\nmain_xprt=%d\nsrc_port=%u\n" |
| @@ -147,14 +149,11 @@ static ssize_t rpc_sysfs_xprt_info_show(struct kobject *kobj, · 1 unmodified line |
| 147 | 149 | xprt->last_used, xprt->cong, xprt->cwnd, xprt->max_reqs, |
| 148 | 150 | xprt->min_reqs, xprt->num_reqs, xprt->binding.qlen, |
| 149 | 151 | xprt->sending.qlen, xprt->pending.qlen, |
| 150 | | − xprt->backlog.qlen, xprt->main, |
| 151 | | − (xprt->xprt_class->ident == XPRT_TRANSPORT_TCP) ? |
| 152 | | − get_srcport(xprt) : 0, |
| 152 | + xprt->backlog.qlen, xprt->main, srcport, |
| 153 | 153 | atomic_long_read(&xprt->queuelen), |
| 154 | | − (xprt->xprt_class->ident == XPRT_TRANSPORT_TCP) ? |
| 155 | | − xprt->address_strings[RPC_DISPLAY_PORT] : "0"); |
| 154 | + xprt->address_strings[RPC_DISPLAY_PORT]); |
| 156 | 155 | xprt_put(xprt); |
| 157 | | − return ret + 1; |
| 156 | + return ret; |
| 158 | 157 | } |
| 159 | 158 | |
| 160 | 159 | static ssize_t rpc_sysfs_xprt_state_show(struct kobject *kobj, |
| @@ -201,7 +200,7 @@ static ssize_t rpc_sysfs_xprt_state_show(struct kobject *kobj, · 40 unmodified lines |
| 201 | 200 | } |
| 202 | 201 | |
| 203 | 202 | xprt_put(xprt); |
| 204 | | − return ret + 1; |
| 203 | + return ret; |
| 205 | 204 | } |
| 206 | 205 | |
| 207 | 206 | static ssize_t rpc_sysfs_xprt_switch_info_show(struct kobject *kobj, |
| @@ -220,7 +219,7 @@ static ssize_t rpc_sysfs_xprt_switch_info_show(struct kobject *kobj, · 12 unmodified lines |
| 220 | 219 | xprt_switch->xps_nunique_destaddr_xprts, |
| 221 | 220 | atomic_long_read(&xprt_switch->xps_queuelen)); |
| 222 | 221 | xprt_switch_put(xprt_switch); |
| 223 | | − return ret + 1; |
| 222 | + return ret; |
| 224 | 223 | } |
| 225 | 224 | |
| 226 | 225 | static ssize_t rpc_sysfs_xprt_dstaddr_store(struct kobject *kobj, |