summaryrefslogtreecommitdiffstats
path: root/fs/afs/server.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2017-11-02 11:27:47 -0400
committerDavid Howells <dhowells@redhat.com>2017-11-13 10:38:17 -0500
commit4d9df9868f31df6725481135c10ac6419ce58d44 (patch)
treec4fcbe437438c940485d438ad5c5871ab20d3288 /fs/afs/server.c
parentad6a942a9e74edea8a4a126a1e434feff6a6d5c2 (diff)
afs: Keep and pass sockaddr_rxrpc addresses rather than in_addr
Keep and pass sockaddr_rxrpc addresses around rather than keeping and passing in_addr addresses to allow for the use of IPv6 and non-standard port numbers in future. This also allows the port and service_id fields to be removed from the afs_call struct. Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/server.c')
-rw-r--r--fs/afs/server.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/fs/afs/server.c b/fs/afs/server.c
index d8044be913f0..662f7fbf5d05 100644
--- a/fs/afs/server.c
+++ b/fs/afs/server.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/sched.h> 12#include <linux/sched.h>
13#include <linux/slab.h> 13#include <linux/slab.h>
14#include "afs_fs.h"
14#include "internal.h" 15#include "internal.h"
15 16
16static unsigned afs_server_timeout = 10; /* server timeout in seconds */ 17static unsigned afs_server_timeout = 10; /* server timeout in seconds */
@@ -42,7 +43,7 @@ static int afs_install_server(struct afs_server *server)
42 struct afs_server *xserver; 43 struct afs_server *xserver;
43 struct afs_net *net = server->cell->net; 44 struct afs_net *net = server->cell->net;
44 struct rb_node **pp, *p; 45 struct rb_node **pp, *p;
45 int ret; 46 int ret, diff;
46 47
47 _enter("%p", server); 48 _enter("%p", server);
48 49
@@ -55,9 +56,10 @@ static int afs_install_server(struct afs_server *server)
55 p = *pp; 56 p = *pp;
56 _debug("- consider %p", p); 57 _debug("- consider %p", p);
57 xserver = rb_entry(p, struct afs_server, master_rb); 58 xserver = rb_entry(p, struct afs_server, master_rb);
58 if (server->addr.s_addr < xserver->addr.s_addr) 59 diff = memcmp(&server->addr, &xserver->addr, sizeof(server->addr));
60 if (diff < 0)
59 pp = &(*pp)->rb_left; 61 pp = &(*pp)->rb_left;
60 else if (server->addr.s_addr > xserver->addr.s_addr) 62 else if (diff > 0)
61 pp = &(*pp)->rb_right; 63 pp = &(*pp)->rb_right;
62 else 64 else
63 goto error; 65 goto error;
@@ -76,7 +78,7 @@ error:
76 * allocate a new server record 78 * allocate a new server record
77 */ 79 */
78static struct afs_server *afs_alloc_server(struct afs_cell *cell, 80static struct afs_server *afs_alloc_server(struct afs_cell *cell,
79 const struct in_addr *addr) 81 const struct sockaddr_rxrpc *addr)
80{ 82{
81 struct afs_server *server; 83 struct afs_server *server;
82 84
@@ -99,8 +101,7 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell,
99 INIT_DELAYED_WORK(&server->cb_break_work, 101 INIT_DELAYED_WORK(&server->cb_break_work,
100 afs_dispatch_give_up_callbacks); 102 afs_dispatch_give_up_callbacks);
101 103
102 memcpy(&server->addr, addr, sizeof(struct in_addr)); 104 server->addr = *addr;
103 server->addr.s_addr = addr->s_addr;
104 afs_inc_servers_outstanding(cell->net); 105 afs_inc_servers_outstanding(cell->net);
105 _leave(" = %p{%d}", server, atomic_read(&server->usage)); 106 _leave(" = %p{%d}", server, atomic_read(&server->usage));
106 } else { 107 } else {
@@ -113,17 +114,17 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell,
113 * get an FS-server record for a cell 114 * get an FS-server record for a cell
114 */ 115 */
115struct afs_server *afs_lookup_server(struct afs_cell *cell, 116struct afs_server *afs_lookup_server(struct afs_cell *cell,
116 const struct in_addr *addr) 117 struct sockaddr_rxrpc *addr)
117{ 118{
118 struct afs_server *server, *candidate; 119 struct afs_server *server, *candidate;
119 120
120 _enter("%p,%pI4", cell, &addr->s_addr); 121 _enter("%p,%pIS", cell, &addr->transport);
121 122
122 /* quick scan of the list to see if we already have the server */ 123 /* quick scan of the list to see if we already have the server */
123 read_lock(&cell->servers_lock); 124 read_lock(&cell->servers_lock);
124 125
125 list_for_each_entry(server, &cell->servers, link) { 126 list_for_each_entry(server, &cell->servers, link) {
126 if (server->addr.s_addr == addr->s_addr) 127 if (memcmp(&server->addr, addr, sizeof(*addr)) == 0)
127 goto found_server_quickly; 128 goto found_server_quickly;
128 } 129 }
129 read_unlock(&cell->servers_lock); 130 read_unlock(&cell->servers_lock);
@@ -138,7 +139,7 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell,
138 139
139 /* check the cell's server list again */ 140 /* check the cell's server list again */
140 list_for_each_entry(server, &cell->servers, link) { 141 list_for_each_entry(server, &cell->servers, link) {
141 if (server->addr.s_addr == addr->s_addr) 142 if (memcmp(&server->addr, addr, sizeof(*addr)) == 0)
142 goto found_server; 143 goto found_server;
143 } 144 }
144 145
@@ -195,9 +196,9 @@ struct afs_server *afs_find_server(struct afs_net *net,
195{ 196{
196 struct afs_server *server = NULL; 197 struct afs_server *server = NULL;
197 struct rb_node *p; 198 struct rb_node *p;
198 struct in_addr addr = srx->transport.sin.sin_addr; 199 int diff;
199 200
200 _enter("{%d,%pI4}", srx->transport.family, &addr.s_addr); 201 _enter("{%d,%pIS}", srx->transport.family, &srx->transport);
201 202
202 if (srx->transport.family != AF_INET) { 203 if (srx->transport.family != AF_INET) {
203 WARN(true, "AFS does not yes support non-IPv4 addresses\n"); 204 WARN(true, "AFS does not yes support non-IPv4 addresses\n");
@@ -212,9 +213,10 @@ struct afs_server *afs_find_server(struct afs_net *net,
212 213
213 _debug("- consider %p", p); 214 _debug("- consider %p", p);
214 215
215 if (addr.s_addr < server->addr.s_addr) { 216 diff = memcmp(srx, &server->addr, sizeof(*srx));
217 if (diff < 0) {
216 p = p->rb_left; 218 p = p->rb_left;
217 } else if (addr.s_addr > server->addr.s_addr) { 219 } else if (diff > 0) {
218 p = p->rb_right; 220 p = p->rb_right;
219 } else { 221 } else {
220 afs_get_server(server); 222 afs_get_server(server);
@@ -225,7 +227,6 @@ struct afs_server *afs_find_server(struct afs_net *net,
225 server = NULL; 227 server = NULL;
226found: 228found:
227 read_unlock(&net->servers_lock); 229 read_unlock(&net->servers_lock);
228 ASSERTIFCMP(server, server->addr.s_addr, ==, addr.s_addr);
229 _leave(" = %p", server); 230 _leave(" = %p", server);
230 return server; 231 return server;
231} 232}