diff options
Diffstat (limited to 'net/sunrpc/svc_xprt.c')
-rw-r--r-- | net/sunrpc/svc_xprt.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index e588df5d6b34..2819ee093f36 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
@@ -161,7 +161,9 @@ EXPORT_SYMBOL_GPL(svc_xprt_init); | |||
161 | 161 | ||
162 | static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, | 162 | static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, |
163 | struct svc_serv *serv, | 163 | struct svc_serv *serv, |
164 | unsigned short port, int flags) | 164 | const int family, |
165 | const unsigned short port, | ||
166 | int flags) | ||
165 | { | 167 | { |
166 | struct sockaddr_in sin = { | 168 | struct sockaddr_in sin = { |
167 | .sin_family = AF_INET, | 169 | .sin_family = AF_INET, |
@@ -176,12 +178,12 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, | |||
176 | struct sockaddr *sap; | 178 | struct sockaddr *sap; |
177 | size_t len; | 179 | size_t len; |
178 | 180 | ||
179 | switch (serv->sv_family) { | 181 | switch (family) { |
180 | case AF_INET: | 182 | case PF_INET: |
181 | sap = (struct sockaddr *)&sin; | 183 | sap = (struct sockaddr *)&sin; |
182 | len = sizeof(sin); | 184 | len = sizeof(sin); |
183 | break; | 185 | break; |
184 | case AF_INET6: | 186 | case PF_INET6: |
185 | sap = (struct sockaddr *)&sin6; | 187 | sap = (struct sockaddr *)&sin6; |
186 | len = sizeof(sin6); | 188 | len = sizeof(sin6); |
187 | break; | 189 | break; |
@@ -192,7 +194,8 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, | |||
192 | return xcl->xcl_ops->xpo_create(serv, sap, len, flags); | 194 | return xcl->xcl_ops->xpo_create(serv, sap, len, flags); |
193 | } | 195 | } |
194 | 196 | ||
195 | int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port, | 197 | int svc_create_xprt(struct svc_serv *serv, const char *xprt_name, |
198 | const int family, const unsigned short port, | ||
196 | int flags) | 199 | int flags) |
197 | { | 200 | { |
198 | struct svc_xprt_class *xcl; | 201 | struct svc_xprt_class *xcl; |
@@ -209,7 +212,7 @@ int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port, | |||
209 | goto err; | 212 | goto err; |
210 | 213 | ||
211 | spin_unlock(&svc_xprt_class_lock); | 214 | spin_unlock(&svc_xprt_class_lock); |
212 | newxprt = __svc_xpo_create(xcl, serv, port, flags); | 215 | newxprt = __svc_xpo_create(xcl, serv, family, port, flags); |
213 | if (IS_ERR(newxprt)) { | 216 | if (IS_ERR(newxprt)) { |
214 | module_put(xcl->xcl_owner); | 217 | module_put(xcl->xcl_owner); |
215 | return PTR_ERR(newxprt); | 218 | return PTR_ERR(newxprt); |
@@ -1033,7 +1036,13 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt) | |||
1033 | return dr; | 1036 | return dr; |
1034 | } | 1037 | } |
1035 | 1038 | ||
1036 | /* | 1039 | /** |
1040 | * svc_find_xprt - find an RPC transport instance | ||
1041 | * @serv: pointer to svc_serv to search | ||
1042 | * @xcl_name: C string containing transport's class name | ||
1043 | * @af: Address family of transport's local address | ||
1044 | * @port: transport's IP port number | ||
1045 | * | ||
1037 | * Return the transport instance pointer for the endpoint accepting | 1046 | * Return the transport instance pointer for the endpoint accepting |
1038 | * connections/peer traffic from the specified transport class, | 1047 | * connections/peer traffic from the specified transport class, |
1039 | * address family and port. | 1048 | * address family and port. |
@@ -1042,14 +1051,14 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt) | |||
1042 | * wild-card, and will result in matching the first transport in the | 1051 | * wild-card, and will result in matching the first transport in the |
1043 | * service's list that has a matching class name. | 1052 | * service's list that has a matching class name. |
1044 | */ | 1053 | */ |
1045 | struct svc_xprt *svc_find_xprt(struct svc_serv *serv, char *xcl_name, | 1054 | struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name, |
1046 | int af, int port) | 1055 | const sa_family_t af, const unsigned short port) |
1047 | { | 1056 | { |
1048 | struct svc_xprt *xprt; | 1057 | struct svc_xprt *xprt; |
1049 | struct svc_xprt *found = NULL; | 1058 | struct svc_xprt *found = NULL; |
1050 | 1059 | ||
1051 | /* Sanity check the args */ | 1060 | /* Sanity check the args */ |
1052 | if (!serv || !xcl_name) | 1061 | if (serv == NULL || xcl_name == NULL) |
1053 | return found; | 1062 | return found; |
1054 | 1063 | ||
1055 | spin_lock_bh(&serv->sv_lock); | 1064 | spin_lock_bh(&serv->sv_lock); |
@@ -1058,7 +1067,7 @@ struct svc_xprt *svc_find_xprt(struct svc_serv *serv, char *xcl_name, | |||
1058 | continue; | 1067 | continue; |
1059 | if (af != AF_UNSPEC && af != xprt->xpt_local.ss_family) | 1068 | if (af != AF_UNSPEC && af != xprt->xpt_local.ss_family) |
1060 | continue; | 1069 | continue; |
1061 | if (port && port != svc_xprt_local_port(xprt)) | 1070 | if (port != 0 && port != svc_xprt_local_port(xprt)) |
1062 | continue; | 1071 | continue; |
1063 | found = xprt; | 1072 | found = xprt; |
1064 | svc_xprt_get(xprt); | 1073 | svc_xprt_get(xprt); |