| @@ -97,7 +97,7 @@ static ssize_t rpc_sysfs_xprt_dstaddr_show(struct kobject *kobj, · 96 unmodified lines |
| 97 | return 0; | 97 | return 0; |
| 98 | ret = sprintf(buf, "%s\n", xprt->address_strings[RPC_DISPLAY_ADDR]); | 98 | ret = sprintf(buf, "%s\n", xprt->address_strings[RPC_DISPLAY_ADDR]); |
| 99 | xprt_put(xprt); | 99 | xprt_put(xprt); |
| 100 | return ret + 1; | 100 | return ret; |
| 101 | } | 101 | } |
| 102 | | 102 | |
| 103 | static ssize_t rpc_sysfs_xprt_srcaddr_show(struct kobject *kobj, | 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 | char *buf) | 105 | char *buf) |
| 106 | { | 106 | { |
| 107 | struct rpc_xprt *xprt = rpc_sysfs_xprt_kobj_get_xprt(kobj); | 107 | struct rpc_xprt *xprt = rpc_sysfs_xprt_kobj_get_xprt(kobj); |
| 108 | struct sockaddr_storage saddr; | 108 | size_t buflen = PAGE_SIZE; |
| 109 | struct sock_xprt *sock; | 109 | ssize_t ret = -ENOTSOCK; |
| 110 | ssize_t ret = -1; | | |
| 111 | | 110 | |
| 112 | if (!xprt || !xprt_connected(xprt)) { | 111 | if (!xprt || !xprt_connected(xprt)) { |
| 113 | xprt_put(xprt); | 112 | ret = -ENOTCONN; |
| 114 | return -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 | xprt_put(xprt); | 123 | xprt_put(xprt); |
| 127 | return ret + 1; | 124 | return ret; |
| 128 | } | 125 | } |
| 129 | | 126 | |
| 130 | static ssize_t rpc_sysfs_xprt_info_show(struct kobject *kobj, | 127 | static ssize_t rpc_sysfs_xprt_info_show(struct kobject *kobj, |
| 131 | struct kobj_attribute *attr, | 128 | struct kobj_attribute *attr, char *buf) |
| 132 | char *buf) | | |
| 133 | { | 129 | { |
| 134 | struct rpc_xprt *xprt = rpc_sysfs_xprt_kobj_get_xprt(kobj); | 130 | struct rpc_xprt *xprt = rpc_sysfs_xprt_kobj_get_xprt(kobj); |
| | 131 | unsigned short srcport = 0; |
| | 132 | size_t buflen = PAGE_SIZE; |
| 135 | ssize_t ret; | 133 | ssize_t ret; |
| 136 | | 134 | |
| 137 | if (!xprt || !xprt_connected(xprt)) { | 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 | return -ENOTCONN; | 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 | "max_num_slots=%u\nmin_num_slots=%u\nnum_reqs=%u\n" | 145 | "max_num_slots=%u\nmin_num_slots=%u\nnum_reqs=%u\n" |
| 144 | "binding_q_len=%u\nsending_q_len=%u\npending_q_len=%u\n" | 146 | "binding_q_len=%u\nsending_q_len=%u\npending_q_len=%u\n" |
| 145 | "backlog_q_len=%u\nmain_xprt=%d\nsrc_port=%u\n" | 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 | xprt->last_used, xprt->cong, xprt->cwnd, xprt->max_reqs, | 149 | xprt->last_used, xprt->cong, xprt->cwnd, xprt->max_reqs, |
| 148 | xprt->min_reqs, xprt->num_reqs, xprt->binding.qlen, | 150 | xprt->min_reqs, xprt->num_reqs, xprt->binding.qlen, |
| 149 | xprt->sending.qlen, xprt->pending.qlen, | 151 | xprt->sending.qlen, xprt->pending.qlen, |
| 150 | xprt->backlog.qlen, xprt->main, | 152 | xprt->backlog.qlen, xprt->main, srcport, |
| 151 | (xprt->xprt_class->ident == XPRT_TRANSPORT_TCP) ? | | |
| 152 | get_srcport(xprt) : 0, | | |
| 153 | atomic_long_read(&xprt->queuelen), | 153 | atomic_long_read(&xprt->queuelen), |
| 154 | (xprt->xprt_class->ident == XPRT_TRANSPORT_TCP) ? | 154 | xprt->address_strings[RPC_DISPLAY_PORT]); |
| 155 | xprt->address_strings[RPC_DISPLAY_PORT] : "0"); | | |
| 156 | xprt_put(xprt); | 155 | xprt_put(xprt); |
| 157 | return ret + 1; | 156 | return ret; |
| 158 | } | 157 | } |
| 159 | | 158 | |
| 160 | static ssize_t rpc_sysfs_xprt_state_show(struct kobject *kobj, | 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 | xprt_put(xprt); | 202 | xprt_put(xprt); |
| 204 | return ret + 1; | 203 | return ret; |
| 205 | } | 204 | } |
| 206 | | 205 | |
| 207 | static ssize_t rpc_sysfs_xprt_switch_info_show(struct kobject *kobj, | 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 | xprt_switch->xps_nunique_destaddr_xprts, | 219 | xprt_switch->xps_nunique_destaddr_xprts, |
| 221 | atomic_long_read(&xprt_switch->xps_queuelen)); | 220 | atomic_long_read(&xprt_switch->xps_queuelen)); |
| 222 | xprt_switch_put(xprt_switch); | 221 | xprt_switch_put(xprt_switch); |
| 223 | return ret + 1; | 222 | return ret; |
| 224 | } | 223 | } |
| 225 | | 224 | |
| 226 | static ssize_t rpc_sysfs_xprt_dstaddr_store(struct kobject *kobj, | 225 | static ssize_t rpc_sysfs_xprt_dstaddr_store(struct kobject *kobj, |