diff options
author | David Howells <dhowells@redhat.com> | 2017-11-02 11:27:47 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2017-11-13 10:38:17 -0500 |
commit | 4d9df9868f31df6725481135c10ac6419ce58d44 (patch) | |
tree | c4fcbe437438c940485d438ad5c5871ab20d3288 /fs/afs/server.c | |
parent | ad6a942a9e74edea8a4a126a1e434feff6a6d5c2 (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.c | 31 |
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 | ||
16 | static unsigned afs_server_timeout = 10; /* server timeout in seconds */ | 17 | static 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 | */ |
78 | static struct afs_server *afs_alloc_server(struct afs_cell *cell, | 80 | static 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 | */ |
115 | struct afs_server *afs_lookup_server(struct afs_cell *cell, | 116 | struct 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; |
226 | found: | 228 | found: |
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 | } |