Commit 4d9df986 authored by David Howells's avatar David Howells

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: default avatarDavid Howells <dhowells@redhat.com>
parent ad6a942a
...@@ -31,7 +31,7 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net, ...@@ -31,7 +31,7 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net,
char keyname[4 + AFS_MAXCELLNAME + 1], *cp, *dp, *next; char keyname[4 + AFS_MAXCELLNAME + 1], *cp, *dp, *next;
char *dvllist = NULL, *_vllist = NULL; char *dvllist = NULL, *_vllist = NULL;
char delimiter = ':'; char delimiter = ':';
int ret; int ret, i;
_enter("%*.*s,%s", namelen, namelen, name ?: "", vllist); _enter("%*.*s,%s", namelen, namelen, name ?: "", vllist);
...@@ -61,6 +61,14 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net, ...@@ -61,6 +61,14 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net,
INIT_LIST_HEAD(&cell->vl_list); INIT_LIST_HEAD(&cell->vl_list);
spin_lock_init(&cell->vl_lock); spin_lock_init(&cell->vl_lock);
for (i = 0; i < AFS_CELL_MAX_ADDRS; i++) {
struct sockaddr_rxrpc *srx = &cell->vl_addrs[i];
srx->srx_family = AF_RXRPC;
srx->srx_service = VL_SERVICE;
srx->transport_type = SOCK_DGRAM;
srx->transport.sin.sin_port = htons(AFS_VL_PORT);
}
/* if the ip address is invalid, try dns query */ /* if the ip address is invalid, try dns query */
if (!vllist || strlen(vllist) < 7) { if (!vllist || strlen(vllist) < 7) {
ret = dns_query("afsdb", name, namelen, "ipv4", &dvllist, NULL); ret = dns_query("afsdb", name, namelen, "ipv4", &dvllist, NULL);
...@@ -83,6 +91,7 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net, ...@@ -83,6 +91,7 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net,
/* fill in the VL server list from the rest of the string */ /* fill in the VL server list from the rest of the string */
do { do {
struct sockaddr_rxrpc *srx = &cell->vl_addrs[cell->vl_naddrs];
unsigned a, b, c, d; unsigned a, b, c, d;
next = strchr(_vllist, delimiter); next = strchr(_vllist, delimiter);
...@@ -95,10 +104,13 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net, ...@@ -95,10 +104,13 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net,
if (a > 255 || b > 255 || c > 255 || d > 255) if (a > 255 || b > 255 || c > 255 || d > 255)
goto bad_address; goto bad_address;
cell->vl_addrs[cell->vl_naddrs++].s_addr = srx->transport_len = sizeof(struct sockaddr_in);
srx->transport.sin.sin_family = AF_INET;
srx->transport.sin.sin_addr.s_addr =
htonl((a << 24) | (b << 16) | (c << 8) | d); htonl((a << 24) | (b << 16) | (c << 8) | d);
} while (cell->vl_naddrs < AFS_CELL_MAX_ADDRS && (_vllist = next)); } while (cell->vl_naddrs++,
cell->vl_naddrs < AFS_CELL_MAX_ADDRS && (_vllist = next));
/* create a key to represent an anonymous user */ /* create a key to represent an anonymous user */
memcpy(keyname, "afs@", 4); memcpy(keyname, "afs@", 4);
......
...@@ -297,8 +297,6 @@ int afs_fs_fetch_file_status(struct afs_server *server, ...@@ -297,8 +297,6 @@ int afs_fs_fetch_file_status(struct afs_server *server,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->reply2 = volsync; call->reply2 = volsync;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -504,8 +502,6 @@ static int afs_fs_fetch_data64(struct afs_server *server, ...@@ -504,8 +502,6 @@ static int afs_fs_fetch_data64(struct afs_server *server,
call->reply = vnode; call->reply = vnode;
call->reply2 = NULL; /* volsync */ call->reply2 = NULL; /* volsync */
call->reply3 = req; call->reply3 = req;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->operation_ID = FSFETCHDATA64; call->operation_ID = FSFETCHDATA64;
/* marshall the parameters */ /* marshall the parameters */
...@@ -551,8 +547,6 @@ int afs_fs_fetch_data(struct afs_server *server, ...@@ -551,8 +547,6 @@ int afs_fs_fetch_data(struct afs_server *server,
call->reply = vnode; call->reply = vnode;
call->reply2 = NULL; /* volsync */ call->reply2 = NULL; /* volsync */
call->reply3 = req; call->reply3 = req;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->operation_ID = FSFETCHDATA; call->operation_ID = FSFETCHDATA;
/* marshall the parameters */ /* marshall the parameters */
...@@ -619,8 +613,6 @@ int afs_fs_give_up_callbacks(struct afs_net *net, ...@@ -619,8 +613,6 @@ int afs_fs_give_up_callbacks(struct afs_net *net,
if (!call) if (!call)
return -ENOMEM; return -ENOMEM;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -723,8 +715,6 @@ int afs_fs_create(struct afs_server *server, ...@@ -723,8 +715,6 @@ int afs_fs_create(struct afs_server *server,
call->reply2 = newfid; call->reply2 = newfid;
call->reply3 = newstatus; call->reply3 = newstatus;
call->reply4 = newcb; call->reply4 = newcb;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -810,8 +800,6 @@ int afs_fs_remove(struct afs_server *server, ...@@ -810,8 +800,6 @@ int afs_fs_remove(struct afs_server *server,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -893,8 +881,6 @@ int afs_fs_link(struct afs_server *server, ...@@ -893,8 +881,6 @@ int afs_fs_link(struct afs_server *server,
call->key = key; call->key = key;
call->reply = dvnode; call->reply = dvnode;
call->reply2 = vnode; call->reply2 = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -988,8 +974,6 @@ int afs_fs_symlink(struct afs_server *server, ...@@ -988,8 +974,6 @@ int afs_fs_symlink(struct afs_server *server,
call->reply = vnode; call->reply = vnode;
call->reply2 = newfid; call->reply2 = newfid;
call->reply3 = newstatus; call->reply3 = newstatus;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -1094,8 +1078,6 @@ int afs_fs_rename(struct afs_server *server, ...@@ -1094,8 +1078,6 @@ int afs_fs_rename(struct afs_server *server,
call->key = key; call->key = key;
call->reply = orig_dvnode; call->reply = orig_dvnode;
call->reply2 = new_dvnode; call->reply2 = new_dvnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -1196,8 +1178,6 @@ static int afs_fs_store_data64(struct afs_server *server, ...@@ -1196,8 +1178,6 @@ static int afs_fs_store_data64(struct afs_server *server,
call->wb = wb; call->wb = wb;
call->key = wb->key; call->key = wb->key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->mapping = vnode->vfs_inode.i_mapping; call->mapping = vnode->vfs_inode.i_mapping;
call->first = first; call->first = first;
call->last = last; call->last = last;
...@@ -1274,8 +1254,6 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb, ...@@ -1274,8 +1254,6 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb,
call->wb = wb; call->wb = wb;
call->key = wb->key; call->key = wb->key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->mapping = vnode->vfs_inode.i_mapping; call->mapping = vnode->vfs_inode.i_mapping;
call->first = first; call->first = first;
call->last = last; call->last = last;
...@@ -1383,8 +1361,6 @@ static int afs_fs_setattr_size64(struct afs_server *server, struct key *key, ...@@ -1383,8 +1361,6 @@ static int afs_fs_setattr_size64(struct afs_server *server, struct key *key,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->store_version = vnode->status.data_version + 1; call->store_version = vnode->status.data_version + 1;
call->operation_ID = FSSTOREDATA; call->operation_ID = FSSTOREDATA;
...@@ -1435,8 +1411,6 @@ static int afs_fs_setattr_size(struct afs_server *server, struct key *key, ...@@ -1435,8 +1411,6 @@ static int afs_fs_setattr_size(struct afs_server *server, struct key *key,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->store_version = vnode->status.data_version + 1; call->store_version = vnode->status.data_version + 1;
call->operation_ID = FSSTOREDATA; call->operation_ID = FSSTOREDATA;
...@@ -1483,8 +1457,6 @@ int afs_fs_setattr(struct afs_server *server, struct key *key, ...@@ -1483,8 +1457,6 @@ int afs_fs_setattr(struct afs_server *server, struct key *key,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->operation_ID = FSSTORESTATUS; call->operation_ID = FSSTORESTATUS;
/* marshall the parameters */ /* marshall the parameters */
...@@ -1721,8 +1693,6 @@ int afs_fs_get_volume_status(struct afs_server *server, ...@@ -1721,8 +1693,6 @@ int afs_fs_get_volume_status(struct afs_server *server,
call->reply = vnode; call->reply = vnode;
call->reply2 = vs; call->reply2 = vs;
call->reply3 = tmpbuf; call->reply3 = tmpbuf;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -1805,8 +1775,6 @@ int afs_fs_set_lock(struct afs_server *server, ...@@ -1805,8 +1775,6 @@ int afs_fs_set_lock(struct afs_server *server,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -1839,8 +1807,6 @@ int afs_fs_extend_lock(struct afs_server *server, ...@@ -1839,8 +1807,6 @@ int afs_fs_extend_lock(struct afs_server *server,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -1872,8 +1838,6 @@ int afs_fs_release_lock(struct afs_server *server, ...@@ -1872,8 +1838,6 @@ int afs_fs_release_lock(struct afs_server *server,
call->key = key; call->key = key;
call->reply = vnode; call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
......
...@@ -106,7 +106,6 @@ struct afs_call { ...@@ -106,7 +106,6 @@ struct afs_call {
bool async; /* T if asynchronous */ bool async; /* T if asynchronous */
bool upgrade; /* T to request service upgrade */ bool upgrade; /* T to request service upgrade */
u16 service_id; /* RxRPC service ID to call */ u16 service_id; /* RxRPC service ID to call */
__be16 port; /* target UDP port */
u32 operation_ID; /* operation ID for an incoming call */ u32 operation_ID; /* operation ID for an incoming call */
u32 count; /* count for use in unmarshalling */ u32 count; /* count for use in unmarshalling */
__be32 tmp; /* place to extract temporary data */ __be32 tmp; /* place to extract temporary data */
...@@ -264,7 +263,7 @@ struct afs_cell { ...@@ -264,7 +263,7 @@ struct afs_cell {
spinlock_t vl_lock; /* vl_list lock */ spinlock_t vl_lock; /* vl_list lock */
unsigned short vl_naddrs; /* number of VL servers in addr list */ unsigned short vl_naddrs; /* number of VL servers in addr list */
unsigned short vl_curr_svix; /* current server index */ unsigned short vl_curr_svix; /* current server index */
struct in_addr vl_addrs[AFS_CELL_MAX_ADDRS]; /* cell VL server addresses */ struct sockaddr_rxrpc vl_addrs[AFS_CELL_MAX_ADDRS]; /* cell VL server addresses */
char name[0]; /* cell name - must go last */ char name[0]; /* cell name - must go last */
}; };
...@@ -284,7 +283,7 @@ struct afs_cache_vlocation { ...@@ -284,7 +283,7 @@ struct afs_cache_vlocation {
#define AFS_VOL_VTM_BAK 0x04 /* backup version of the volume is available (on this server) */ #define AFS_VOL_VTM_BAK 0x04 /* backup version of the volume is available (on this server) */
afs_volid_t vid[3]; /* volume IDs for R/W, R/O and Bak volumes */ afs_volid_t vid[3]; /* volume IDs for R/W, R/O and Bak volumes */
struct in_addr servers[8]; /* fileserver addresses */ struct sockaddr_rxrpc servers[8]; /* fileserver addresses */
time_t rtime; /* last retrieval time */ time_t rtime; /* last retrieval time */
}; };
...@@ -315,7 +314,7 @@ struct afs_vlocation { ...@@ -315,7 +314,7 @@ struct afs_vlocation {
struct afs_server { struct afs_server {
atomic_t usage; atomic_t usage;
time64_t time_of_death; /* time at which put reduced usage to 0 */ time64_t time_of_death; /* time at which put reduced usage to 0 */
struct in_addr addr; /* server address */ struct sockaddr_rxrpc addr; /* server address */
struct afs_net *net; /* Network namespace in which the server resides */ struct afs_net *net; /* Network namespace in which the server resides */
struct afs_cell *cell; /* cell in which server resides */ struct afs_cell *cell; /* cell in which server resides */
struct list_head link; /* link in cell's server list */ struct list_head link; /* link in cell's server list */
...@@ -654,7 +653,7 @@ extern void __net_exit afs_close_socket(struct afs_net *); ...@@ -654,7 +653,7 @@ extern void __net_exit afs_close_socket(struct afs_net *);
extern void afs_charge_preallocation(struct work_struct *); extern void afs_charge_preallocation(struct work_struct *);
extern void afs_put_call(struct afs_call *); extern void afs_put_call(struct afs_call *);
extern int afs_queue_call_work(struct afs_call *); extern int afs_queue_call_work(struct afs_call *);
extern int afs_make_call(struct in_addr *, struct afs_call *, gfp_t, bool); extern int afs_make_call(struct sockaddr_rxrpc *, struct afs_call *, gfp_t, bool);
extern struct afs_call *afs_alloc_flat_call(struct afs_net *, extern struct afs_call *afs_alloc_flat_call(struct afs_net *,
const struct afs_call_type *, const struct afs_call_type *,
size_t, size_t); size_t, size_t);
...@@ -690,7 +689,7 @@ do { \ ...@@ -690,7 +689,7 @@ do { \
extern void afs_server_timer(struct timer_list *); extern void afs_server_timer(struct timer_list *);
extern struct afs_server *afs_lookup_server(struct afs_cell *, extern struct afs_server *afs_lookup_server(struct afs_cell *,
const struct in_addr *); struct sockaddr_rxrpc *);
extern struct afs_server *afs_find_server(struct afs_net *, extern struct afs_server *afs_find_server(struct afs_net *,
const struct sockaddr_rxrpc *); const struct sockaddr_rxrpc *);
extern void afs_put_server(struct afs_net *, struct afs_server *); extern void afs_put_server(struct afs_net *, struct afs_server *);
...@@ -707,11 +706,11 @@ extern void __exit afs_fs_exit(void); ...@@ -707,11 +706,11 @@ extern void __exit afs_fs_exit(void);
* vlclient.c * vlclient.c
*/ */
extern int afs_vl_get_entry_by_name(struct afs_net *, extern int afs_vl_get_entry_by_name(struct afs_net *,
struct in_addr *, struct key *, struct sockaddr_rxrpc *, struct key *,
const char *, struct afs_cache_vlocation *, const char *, struct afs_cache_vlocation *,
bool); bool);
extern int afs_vl_get_entry_by_id(struct afs_net *, extern int afs_vl_get_entry_by_id(struct afs_net *,
struct in_addr *, struct key *, struct sockaddr_rxrpc *, struct key *,
afs_volid_t, afs_voltype_t, afs_volid_t, afs_voltype_t,
struct afs_cache_vlocation *, bool); struct afs_cache_vlocation *, bool);
......
...@@ -570,16 +570,16 @@ static void afs_proc_cell_vlservers_stop(struct seq_file *p, void *v) ...@@ -570,16 +570,16 @@ static void afs_proc_cell_vlservers_stop(struct seq_file *p, void *v)
*/ */
static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v) static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v)
{ {
struct in_addr *addr = v; struct sockaddr_rxrpc *addr = v;
/* display header on line 1 */ /* display header on line 1 */
if (v == (struct in_addr *) 1) { if (v == (void *)1) {
seq_puts(m, "ADDRESS\n"); seq_puts(m, "ADDRESS\n");
return 0; return 0;
} }
/* display one cell per line on subsequent lines */ /* display one cell per line on subsequent lines */
seq_printf(m, "%pI4\n", &addr->s_addr); seq_printf(m, "%pISp\n", &addr->transport);
return 0; return 0;
} }
...@@ -652,7 +652,7 @@ static int afs_proc_cell_servers_show(struct seq_file *m, void *v) ...@@ -652,7 +652,7 @@ static int afs_proc_cell_servers_show(struct seq_file *m, void *v)
{ {
struct afs_cell *cell = m->private; struct afs_cell *cell = m->private;
struct afs_server *server = list_entry(v, struct afs_server, link); struct afs_server *server = list_entry(v, struct afs_server, link);
char ipaddr[20]; char ipaddr[64];
/* display header on line 1 */ /* display header on line 1 */
if (v == &cell->servers) { if (v == &cell->servers) {
...@@ -661,7 +661,7 @@ static int afs_proc_cell_servers_show(struct seq_file *m, void *v) ...@@ -661,7 +661,7 @@ static int afs_proc_cell_servers_show(struct seq_file *m, void *v)
} }
/* display one cell per line on subsequent lines */ /* display one cell per line on subsequent lines */
sprintf(ipaddr, "%pI4", &server->addr); sprintf(ipaddr, "%pISp", &server->addr.transport);
seq_printf(m, "%3d %-15.15s %5d\n", seq_printf(m, "%3d %-15.15s %5d\n",
atomic_read(&server->usage), ipaddr, server->fs_state); atomic_read(&server->usage), ipaddr, server->fs_state);
......
...@@ -322,10 +322,9 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg) ...@@ -322,10 +322,9 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg)
/* /*
* initiate a call * initiate a call
*/ */
int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, int afs_make_call(struct sockaddr_rxrpc *srx, struct afs_call *call,
bool async) gfp_t gfp, bool async)
{ {
struct sockaddr_rxrpc srx;
struct rxrpc_call *rxcall; struct rxrpc_call *rxcall;
struct msghdr msg; struct msghdr msg;
struct kvec iov[1]; struct kvec iov[1];
...@@ -334,7 +333,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, ...@@ -334,7 +333,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
u32 abort_code; u32 abort_code;
int ret; int ret;
_enter("%x,{%d},", addr->s_addr, ntohs(call->port)); _enter(",{%pISp},", &srx->transport);
ASSERT(call->type != NULL); ASSERT(call->type != NULL);
ASSERT(call->type->name != NULL); ASSERT(call->type->name != NULL);
...@@ -345,15 +344,6 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, ...@@ -345,15 +344,6 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
call->async = async; call->async = async;
memset(&srx, 0, sizeof(srx));
srx.srx_family = AF_RXRPC;
srx.srx_service = call->service_id;
srx.transport_type = SOCK_DGRAM;
srx.transport_len = sizeof(srx.transport.sin);
srx.transport.sin.sin_family = AF_INET;
srx.transport.sin.sin_port = call->port;
memcpy(&srx.transport.sin.sin_addr, addr, 4);
/* Work out the length we're going to transmit. This is awkward for /* Work out the length we're going to transmit. This is awkward for
* calls such as FS.StoreData where there's an extra injection of data * calls such as FS.StoreData where there's an extra injection of data
* after the initial fixed part. * after the initial fixed part.
...@@ -365,7 +355,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, ...@@ -365,7 +355,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
} }
/* create a call */ /* create a call */
rxcall = rxrpc_kernel_begin_call(call->net->socket, &srx, call->key, rxcall = rxrpc_kernel_begin_call(call->net->socket, srx, call->key,
(unsigned long)call, (unsigned long)call,
tx_total_len, gfp, tx_total_len, gfp,
(async ? (async ?
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/slab.h> #include <linux/slab.h>
#include "afs_fs.h"
#include "internal.h" #include "internal.h"
static unsigned afs_server_timeout = 10; /* server timeout in seconds */ static unsigned afs_server_timeout = 10; /* server timeout in seconds */
...@@ -42,7 +43,7 @@ static int afs_install_server(struct afs_server *server) ...@@ -42,7 +43,7 @@ static int afs_install_server(struct afs_server *server)
struct afs_server *xserver; struct afs_server *xserver;
struct afs_net *net = server->cell->net; struct afs_net *net = server->cell->net;
struct rb_node **pp, *p; struct rb_node **pp, *p;
int ret; int ret, diff;
_enter("%p", server); _enter("%p", server);
...@@ -55,9 +56,10 @@ static int afs_install_server(struct afs_server *server) ...@@ -55,9 +56,10 @@ static int afs_install_server(struct afs_server *server)
p = *pp; p = *pp;
_debug("- consider %p", p); _debug("- consider %p", p);
xserver = rb_entry(p, struct afs_server, master_rb); xserver = rb_entry(p, struct afs_server, master_rb);
if (server->addr.s_addr < xserver->addr.s_addr) diff = memcmp(&server->addr, &xserver->addr, sizeof(server->addr));
if (diff < 0)
pp = &(*pp)->rb_left; pp = &(*pp)->rb_left;
else if (server->addr.s_addr > xserver->addr.s_addr) else if (diff > 0)
pp = &(*pp)->rb_right; pp = &(*pp)->rb_right;
else else
goto error; goto error;
...@@ -76,7 +78,7 @@ static int afs_install_server(struct afs_server *server) ...@@ -76,7 +78,7 @@ static int afs_install_server(struct afs_server *server)
* allocate a new server record * allocate a new server record
*/ */
static struct afs_server *afs_alloc_server(struct afs_cell *cell, static struct afs_server *afs_alloc_server(struct afs_cell *cell,
const struct in_addr *addr) const struct sockaddr_rxrpc *addr)
{ {
struct afs_server *server; struct afs_server *server;
...@@ -99,8 +101,7 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell, ...@@ -99,8 +101,7 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell,
INIT_DELAYED_WORK(&server->cb_break_work, INIT_DELAYED_WORK(&server->cb_break_work,
afs_dispatch_give_up_callbacks); afs_dispatch_give_up_callbacks);
memcpy(&server->addr, addr, sizeof(struct in_addr)); server->addr = *addr;
server->addr.s_addr = addr->s_addr;
afs_inc_servers_outstanding(cell->net); afs_inc_servers_outstanding(cell->net);
_leave(" = %p{%d}", server, atomic_read(&server->usage)); _leave(" = %p{%d}", server, atomic_read(&server->usage));
} else { } else {
...@@ -113,17 +114,17 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell, ...@@ -113,17 +114,17 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell,
* get an FS-server record for a cell * get an FS-server record for a cell
*/ */
struct afs_server *afs_lookup_server(struct afs_cell *cell, struct afs_server *afs_lookup_server(struct afs_cell *cell,
const struct in_addr *addr) struct sockaddr_rxrpc *addr)
{ {
struct afs_server *server, *candidate; struct afs_server *server, *candidate;
_enter("%p,%pI4", cell, &addr->s_addr); _enter("%p,%pIS", cell, &addr->transport);
/* quick scan of the list to see if we already have the server */ /* quick scan of the list to see if we already have the server */
read_lock(&cell->servers_lock); read_lock(&cell->servers_lock);
list_for_each_entry(server, &cell->servers, link) { list_for_each_entry(server, &cell->servers, link) {
if (server->addr.s_addr == addr->s_addr) if (memcmp(&server->addr, addr, sizeof(*addr)) == 0)
goto found_server_quickly; goto found_server_quickly;
} }
read_unlock(&cell->servers_lock); read_unlock(&cell->servers_lock);
...@@ -138,7 +139,7 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell, ...@@ -138,7 +139,7 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell,
/* check the cell's server list again */ /* check the cell's server list again */
list_for_each_entry(server, &cell->servers, link) { list_for_each_entry(server, &cell->servers, link) {
if (server->addr.s_addr == addr->s_addr) if (memcmp(&server->addr, addr, sizeof(*addr)) == 0)
goto found_server; goto found_server;
} }
...@@ -195,9 +196,9 @@ struct afs_server *afs_find_server(struct afs_net *net, ...@@ -195,9 +196,9 @@ struct afs_server *afs_find_server(struct afs_net *net,
{ {
struct afs_server *server = NULL; struct afs_server *server = NULL;
struct rb_node *p; struct rb_node *p;
struct in_addr addr = srx->transport.sin.sin_addr; int diff;
_enter("{%d,%pI4}", srx->transport.family, &addr.s_addr); _enter("{%d,%pIS}", srx->transport.family, &srx->transport);
if (srx->transport.family != AF_INET) { if (srx->transport.family != AF_INET) {
WARN(true, "AFS does not yes support non-IPv4 addresses\n"); 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,9 +213,10 @@ struct afs_server *afs_find_server(struct afs_net *net,
_debug("- consider %p", p); _debug("- consider %p", p);
if (addr.s_addr < server->addr.s_addr) { diff = memcmp(srx, &server->addr, sizeof(*srx));
if (diff < 0) {
p = p->rb_left; p = p->rb_left;
} else if (addr.s_addr > server->addr.s_addr) { } else if (diff > 0) {
p = p->rb_right; p = p->rb_right;
} else { } else {
afs_get_server(server); afs_get_server(server);
...@@ -225,7 +227,6 @@ struct afs_server *afs_find_server(struct afs_net *net, ...@@ -225,7 +227,6 @@ struct afs_server *afs_find_server(struct afs_net *net,
server = NULL; server = NULL;
found: found:
read_unlock(&net->servers_lock); read_unlock(&net->servers_lock);
ASSERTIFCMP(server, server->addr.s_addr, ==, addr.s_addr);
_leave(" = %p", server); _leave(" = %p", server);
return server; return server;
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h> #include <linux/sched.h>
#include "afs_fs.h"
#include "internal.h" #include "internal.h"
/* /*
...@@ -83,8 +84,15 @@ static int afs_deliver_vl_get_entry_by_xxx(struct afs_call *call) ...@@ -83,8 +84,15 @@ static int afs_deliver_vl_get_entry_by_xxx(struct afs_call *call)
bp++; /* type */ bp++; /* type */
entry->nservers = ntohl(*bp++); entry->nservers = ntohl(*bp++);
for (loop = 0; loop < 8; loop++) for (loop = 0; loop < 8; loop++) {
entry->servers[loop].s_addr = *bp++; entry->servers[loop].srx_family = AF_RXRPC;
entry->servers[loop].srx_service = FS_SERVICE;
entry->servers[loop].transport_type = SOCK_DGRAM;
entry->servers[loop].transport_len = sizeof(entry->servers[loop].transport.sin);
entry->servers[loop].transport.sin.sin_family = AF_INET;
entry->servers[loop].transport.sin.sin_port = htons(AFS_FS_PORT);
entry->servers[loop].transport.sin.sin_addr.s_addr = *bp++;
}
bp += 8; /* partition IDs */ bp += 8; /* partition IDs */
...@@ -144,7 +152,7 @@ static const struct afs_call_type afs_RXVLGetEntryById = { ...@@ -144,7 +152,7 @@ static const struct afs_call_type afs_RXVLGetEntryById = {
* dispatch a get volume entry by name operation * dispatch a get volume entry by name operation
*/ */
int afs_vl_get_entry_by_name(struct afs_net *net, int afs_vl_get_entry_by_name(struct afs_net *net,
struct in_addr *addr, struct sockaddr_rxrpc *addr,
struct key *key, struct key *key,
const char *volname, const char *volname,
struct afs_cache_vlocation *entry, struct afs_cache_vlocation *entry,
...@@ -166,8 +174,6 @@ int afs_vl_get_entry_by_name(struct afs_net *net, ...@@ -166,8 +174,6 @@ int afs_vl_get_entry_by_name(struct afs_net *net,
call->key = key; call->key = key;
call->reply = entry; call->reply = entry;
call->service_id = VL_SERVICE;
call->port = htons(AFS_VL_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
...@@ -185,7 +191,7 @@ int afs_vl_get_entry_by_name(struct afs_net *net, ...@@ -185,7 +191,7 @@ int afs_vl_get_entry_by_name(struct afs_net *net,
* dispatch a get volume entry by ID operation * dispatch a get volume entry by ID operation
*/ */
int afs_vl_get_entry_by_id(struct afs_net *net, int afs_vl_get_entry_by_id(struct afs_net *net,
struct in_addr *addr, struct sockaddr_rxrpc *addr,
struct key *key, struct key *key,
afs_volid_t volid, afs_volid_t volid,
afs_voltype_t voltype, afs_voltype_t voltype,
...@@ -203,8 +209,6 @@ int afs_vl_get_entry_by_id(struct afs_net *net, ...@@ -203,8 +209,6 @@ int afs_vl_get_entry_by_id(struct afs_net *net,
call->key = key; call->key = key;
call->reply = entry; call->reply = entry;
call->service_id = VL_SERVICE;
call->port = htons(AFS_VL_PORT);
/* marshall the parameters */ /* marshall the parameters */
bp = call->request; bp = call->request;
......
...@@ -30,7 +30,6 @@ static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl, ...@@ -30,7 +30,6 @@ static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl,
struct afs_cache_vlocation *vldb) struct afs_cache_vlocation *vldb)
{ {
struct afs_cell *cell = vl->cell; struct afs_cell *cell = vl->cell;
struct in_addr addr;
int count, ret; int count, ret;
_enter("%s,%s", cell->name, vl->vldb.name); _enter("%s,%s", cell->name, vl->vldb.name);
...@@ -38,12 +37,12 @@ static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl, ...@@ -38,12 +37,12 @@ static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl,
down_write(&vl->cell->vl_sem); down_write(&vl->cell->vl_sem);
ret = -ENOMEDIUM; ret = -ENOMEDIUM;
for (count = cell->vl_naddrs; count > 0; count--) { for (count = cell->vl_naddrs; count > 0; count--) {
addr = cell->vl_addrs[cell->vl_curr_svix]; struct sockaddr_rxrpc *addr = &cell->vl_addrs[cell->vl_curr_svix];
_debug("CellServ[%hu]: %08x", cell->vl_curr_svix, addr.s_addr); _debug("CellServ[%hu]: %pIS", cell->vl_curr_svix, &addr->transport);
/* attempt to access the VL server */ /* attempt to access the VL server */
ret = afs_vl_get_entry_by_name(cell->net, &addr, key, ret = afs_vl_get_entry_by_name(cell->net, addr, key,
vl->vldb.name, vldb, false); vl->vldb.name, vldb, false);
switch (ret) { switch (ret) {
case 0: case 0:
...@@ -88,7 +87,6 @@ static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl, ...@@ -88,7 +87,6 @@ static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl,
struct afs_cache_vlocation *vldb) struct afs_cache_vlocation *vldb)
{ {
struct afs_cell *cell = vl->cell; struct afs_cell *cell = vl->cell;
struct in_addr addr;
int count, ret; int count, ret;
_enter("%s,%x,%d,", cell->name, volid, voltype); _enter("%s,%x,%d,", cell->name, volid, voltype);
...@@ -96,12 +94,12 @@ static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl, ...@@ -96,12 +94,12 @@ static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl,
down_write(&vl->cell->vl_sem); down_write(&vl->cell->vl_sem);
ret = -ENOMEDIUM; ret = -ENOMEDIUM;
for (count = cell->vl_naddrs; count > 0; count--) { for (count = cell->vl_naddrs; count > 0; count--) {
addr = cell->vl_addrs[cell->vl_curr_svix]; struct sockaddr_rxrpc *addr = &cell->vl_addrs[cell->vl_curr_svix];
_debug("CellServ[%hu]: %08x", cell->vl_curr_svix, addr.s_addr); _debug("CellServ[%hu]: %pIS", cell->vl_curr_svix, &addr->transport);
/* attempt to access the VL server */ /* attempt to access the VL server */
ret = afs_vl_get_entry_by_id(cell->net, &addr, key, volid, ret = afs_vl_get_entry_by_id(cell->net, addr, key, volid,
voltype, vldb, false); voltype, vldb, false);
switch (ret) { switch (ret) {
case 0: case 0:
...@@ -192,15 +190,7 @@ static int afs_vlocation_update_record(struct afs_vlocation *vl, ...@@ -192,15 +190,7 @@ static int afs_vlocation_update_record(struct afs_vlocation *vl,
int ret; int ret;
/* try to look up a cached volume in the cell VL databases by ID */ /* try to look up a cached volume in the cell VL databases by ID */
_debug("Locally Cached: %s %02x { %08x(%x) %08x(%x) %08x(%x) }", _debug("Locally Cached: %s %02x", vl->vldb.name, vl->vldb.vidmask);
vl->vldb.name,
vl->vldb.vidmask,
ntohl(vl->vldb.servers[0].s_addr),
vl->vldb.srvtmask[0],
ntohl(vl->vldb.servers[1].s_addr),
vl->vldb.srvtmask[1],
ntohl(vl->vldb.servers[2].s_addr),
vl->vldb.srvtmask[2]);
_debug("Vids: %08x %08x %08x", _debug("Vids: %08x %08x %08x",
vl->vldb.vid[0], vl->vldb.vid[0],
...@@ -258,11 +248,7 @@ static int afs_vlocation_update_record(struct afs_vlocation *vl, ...@@ -258,11 +248,7 @@ static int afs_vlocation_update_record(struct afs_vlocation *vl,
static void afs_vlocation_apply_update(struct afs_vlocation *vl, static void afs_vlocation_apply_update(struct afs_vlocation *vl,
struct afs_cache_vlocation *vldb) struct afs_cache_vlocation *vldb)
{ {
_debug("Done VL Lookup: %s %02x { %08x(%x) %08x(%x) %08x(%x) }", _debug("Done VL Lookup: %s %02x", vldb->name, vldb->vidmask);
vldb->name, vldb->vidmask,
ntohl(vldb->servers[0].s_addr), vldb->srvtmask[0],
ntohl(vldb->servers[1].s_addr), vldb->srvtmask[1],
ntohl(vldb->servers[2].s_addr), vldb->srvtmask[2]);
_debug("Vids: %08x %08x %08x", _debug("Vids: %08x %08x %08x",
vldb->vid[0], vldb->vid[1], vldb->vid[2]); vldb->vid[0], vldb->vid[1], vldb->vid[2]);
......
...@@ -354,8 +354,8 @@ int afs_vnode_fetch_status(struct afs_vnode *vnode, ...@@ -354,8 +354,8 @@ int afs_vnode_fetch_status(struct afs_vnode *vnode,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %p{%08x}", _debug("USING SERVER: %p{%pIS}",
server, ntohl(server->addr.s_addr)); server, &server->addr.transport);
ret = afs_fs_fetch_file_status(server, key, vnode, NULL, ret = afs_fs_fetch_file_status(server, key, vnode, NULL,
false); false);
...@@ -418,7 +418,7 @@ int afs_vnode_fetch_data(struct afs_vnode *vnode, struct key *key, ...@@ -418,7 +418,7 @@ int afs_vnode_fetch_data(struct afs_vnode *vnode, struct key *key,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_fetch_data(server, key, vnode, desc, ret = afs_fs_fetch_data(server, key, vnode, desc,
false); false);
...@@ -474,7 +474,7 @@ int afs_vnode_create(struct afs_vnode *vnode, struct key *key, ...@@ -474,7 +474,7 @@ int afs_vnode_create(struct afs_vnode *vnode, struct key *key,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_create(server, key, vnode, name, mode, newfid, ret = afs_fs_create(server, key, vnode, name, mode, newfid,
newstatus, newcb, false); newstatus, newcb, false);
...@@ -530,7 +530,7 @@ int afs_vnode_remove(struct afs_vnode *vnode, struct key *key, const char *name, ...@@ -530,7 +530,7 @@ int afs_vnode_remove(struct afs_vnode *vnode, struct key *key, const char *name,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_remove(server, key, vnode, name, isdir, ret = afs_fs_remove(server, key, vnode, name, isdir,
false); false);
...@@ -592,7 +592,7 @@ int afs_vnode_link(struct afs_vnode *dvnode, struct afs_vnode *vnode, ...@@ -592,7 +592,7 @@ int afs_vnode_link(struct afs_vnode *dvnode, struct afs_vnode *vnode,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_link(server, key, dvnode, vnode, name, ret = afs_fs_link(server, key, dvnode, vnode, name,
false); false);
...@@ -656,7 +656,7 @@ int afs_vnode_symlink(struct afs_vnode *vnode, struct key *key, ...@@ -656,7 +656,7 @@ int afs_vnode_symlink(struct afs_vnode *vnode, struct key *key,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_symlink(server, key, vnode, name, content, ret = afs_fs_symlink(server, key, vnode, name, content,
newfid, newstatus, false); newfid, newstatus, false);
...@@ -726,7 +726,7 @@ int afs_vnode_rename(struct afs_vnode *orig_dvnode, ...@@ -726,7 +726,7 @@ int afs_vnode_rename(struct afs_vnode *orig_dvnode,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_rename(server, key, orig_dvnode, orig_name, ret = afs_fs_rename(server, key, orig_dvnode, orig_name,
new_dvnode, new_name, false); new_dvnode, new_name, false);
...@@ -792,7 +792,7 @@ int afs_vnode_store_data(struct afs_writeback *wb, pgoff_t first, pgoff_t last, ...@@ -792,7 +792,7 @@ int afs_vnode_store_data(struct afs_writeback *wb, pgoff_t first, pgoff_t last,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_store_data(server, wb, first, last, offset, to, ret = afs_fs_store_data(server, wb, first, last, offset, to,
false); false);
...@@ -845,7 +845,7 @@ int afs_vnode_setattr(struct afs_vnode *vnode, struct key *key, ...@@ -845,7 +845,7 @@ int afs_vnode_setattr(struct afs_vnode *vnode, struct key *key,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_setattr(server, key, vnode, attr, false); ret = afs_fs_setattr(server, key, vnode, attr, false);
...@@ -892,7 +892,7 @@ int afs_vnode_get_volume_status(struct afs_vnode *vnode, struct key *key, ...@@ -892,7 +892,7 @@ int afs_vnode_get_volume_status(struct afs_vnode *vnode, struct key *key,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_get_volume_status(server, key, vnode, vs, false); ret = afs_fs_get_volume_status(server, key, vnode, vs, false);
...@@ -931,7 +931,7 @@ int afs_vnode_set_lock(struct afs_vnode *vnode, struct key *key, ...@@ -931,7 +931,7 @@ int afs_vnode_set_lock(struct afs_vnode *vnode, struct key *key,
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_set_lock(server, key, vnode, type, false); ret = afs_fs_set_lock(server, key, vnode, type, false);
...@@ -969,7 +969,7 @@ int afs_vnode_extend_lock(struct afs_vnode *vnode, struct key *key) ...@@ -969,7 +969,7 @@ int afs_vnode_extend_lock(struct afs_vnode *vnode, struct key *key)
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_extend_lock(server, key, vnode, false); ret = afs_fs_extend_lock(server, key, vnode, false);
...@@ -1007,7 +1007,7 @@ int afs_vnode_release_lock(struct afs_vnode *vnode, struct key *key) ...@@ -1007,7 +1007,7 @@ int afs_vnode_release_lock(struct afs_vnode *vnode, struct key *key)
if (IS_ERR(server)) if (IS_ERR(server))
goto no_server; goto no_server;
_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr)); _debug("USING SERVER: %pIS\n", &server->addr.transport);
ret = afs_fs_release_lock(server, key, vnode, false); ret = afs_fs_release_lock(server, key, vnode, false);
......
...@@ -248,8 +248,8 @@ struct afs_server *afs_volume_pick_fileserver(struct afs_vnode *vnode) ...@@ -248,8 +248,8 @@ struct afs_server *afs_volume_pick_fileserver(struct afs_vnode *vnode)
case 0: case 0:
afs_get_server(server); afs_get_server(server);
up_read(&volume->server_sem); up_read(&volume->server_sem);
_leave(" = %p (picked %08x)", _leave(" = %p (picked %pIS)",
server, ntohl(server->addr.s_addr)); server, &server->addr.transport);
return server; return server;
case -ENETUNREACH: case -ENETUNREACH:
...@@ -303,9 +303,8 @@ int afs_volume_release_fileserver(struct afs_vnode *vnode, ...@@ -303,9 +303,8 @@ int afs_volume_release_fileserver(struct afs_vnode *vnode,
struct afs_volume *volume = vnode->volume; struct afs_volume *volume = vnode->volume;
unsigned loop; unsigned loop;
_enter("%s,%08x,%d", _enter("%s,%pIS,%d",
volume->vlocation->vldb.name, ntohl(server->addr.s_addr), volume->vlocation->vldb.name, &server->addr.transport, result);
result);
switch (result) { switch (result) {
/* success */ /* success */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment