Skip to content

Commit

Permalink
afs: Keep and pass sockaddr_rxrpc addresses rather than in_addr
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Howells committed Nov 13, 2017
1 parent ad6a942 commit 4d9df98
Show file tree
Hide file tree
Showing 10 changed files with 85 additions and 130 deletions.
18 changes: 15 additions & 3 deletions fs/afs/cell.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 *dvllist = NULL, *_vllist = NULL;
char delimiter = ':';
int ret;
int ret, i;

_enter("%*.*s,%s", namelen, namelen, name ?: "", vllist);

Expand Down Expand Up @@ -61,6 +61,14 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net,
INIT_LIST_HEAD(&cell->vl_list);
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 (!vllist || strlen(vllist) < 7) {
ret = dns_query("afsdb", name, namelen, "ipv4", &dvllist, NULL);
Expand All @@ -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 */
do {
struct sockaddr_rxrpc *srx = &cell->vl_addrs[cell->vl_naddrs];
unsigned a, b, c, d;

next = strchr(_vllist, delimiter);
Expand All @@ -95,10 +104,13 @@ static struct afs_cell *afs_cell_alloc(struct afs_net *net,
if (a > 255 || b > 255 || c > 255 || d > 255)
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);

} 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 */
memcpy(keyname, "afs@", 4);
Expand Down
36 changes: 0 additions & 36 deletions fs/afs/fsclient.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,6 @@ int afs_fs_fetch_file_status(struct afs_server *server,
call->key = key;
call->reply = vnode;
call->reply2 = volsync;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -504,8 +502,6 @@ static int afs_fs_fetch_data64(struct afs_server *server,
call->reply = vnode;
call->reply2 = NULL; /* volsync */
call->reply3 = req;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->operation_ID = FSFETCHDATA64;

/* marshall the parameters */
Expand Down Expand Up @@ -551,8 +547,6 @@ int afs_fs_fetch_data(struct afs_server *server,
call->reply = vnode;
call->reply2 = NULL; /* volsync */
call->reply3 = req;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->operation_ID = FSFETCHDATA;

/* marshall the parameters */
Expand Down Expand Up @@ -619,8 +613,6 @@ int afs_fs_give_up_callbacks(struct afs_net *net,
if (!call)
return -ENOMEM;

call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -723,8 +715,6 @@ int afs_fs_create(struct afs_server *server,
call->reply2 = newfid;
call->reply3 = newstatus;
call->reply4 = newcb;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -810,8 +800,6 @@ int afs_fs_remove(struct afs_server *server,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -893,8 +881,6 @@ int afs_fs_link(struct afs_server *server,
call->key = key;
call->reply = dvnode;
call->reply2 = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -988,8 +974,6 @@ int afs_fs_symlink(struct afs_server *server,
call->reply = vnode;
call->reply2 = newfid;
call->reply3 = newstatus;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -1094,8 +1078,6 @@ int afs_fs_rename(struct afs_server *server,
call->key = key;
call->reply = orig_dvnode;
call->reply2 = new_dvnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -1196,8 +1178,6 @@ static int afs_fs_store_data64(struct afs_server *server,
call->wb = wb;
call->key = wb->key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->mapping = vnode->vfs_inode.i_mapping;
call->first = first;
call->last = last;
Expand Down Expand Up @@ -1274,8 +1254,6 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb,
call->wb = wb;
call->key = wb->key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->mapping = vnode->vfs_inode.i_mapping;
call->first = first;
call->last = last;
Expand Down Expand Up @@ -1383,8 +1361,6 @@ static int afs_fs_setattr_size64(struct afs_server *server, struct key *key,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->store_version = vnode->status.data_version + 1;
call->operation_ID = FSSTOREDATA;

Expand Down Expand Up @@ -1435,8 +1411,6 @@ static int afs_fs_setattr_size(struct afs_server *server, struct key *key,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->store_version = vnode->status.data_version + 1;
call->operation_ID = FSSTOREDATA;

Expand Down Expand Up @@ -1483,8 +1457,6 @@ int afs_fs_setattr(struct afs_server *server, struct key *key,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);
call->operation_ID = FSSTORESTATUS;

/* marshall the parameters */
Expand Down Expand Up @@ -1721,8 +1693,6 @@ int afs_fs_get_volume_status(struct afs_server *server,
call->reply = vnode;
call->reply2 = vs;
call->reply3 = tmpbuf;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -1805,8 +1775,6 @@ int afs_fs_set_lock(struct afs_server *server,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -1839,8 +1807,6 @@ int afs_fs_extend_lock(struct afs_server *server,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down Expand Up @@ -1872,8 +1838,6 @@ int afs_fs_release_lock(struct afs_server *server,

call->key = key;
call->reply = vnode;
call->service_id = FS_SERVICE;
call->port = htons(AFS_FS_PORT);

/* marshall the parameters */
bp = call->request;
Expand Down
15 changes: 7 additions & 8 deletions fs/afs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ struct afs_call {
bool async; /* T if asynchronous */
bool upgrade; /* T to request service upgrade */
u16 service_id; /* RxRPC service ID to call */
__be16 port; /* target UDP port */
u32 operation_ID; /* operation ID for an incoming call */
u32 count; /* count for use in unmarshalling */
__be32 tmp; /* place to extract temporary data */
Expand Down Expand Up @@ -264,7 +263,7 @@ struct afs_cell {
spinlock_t vl_lock; /* vl_list lock */
unsigned short vl_naddrs; /* number of VL servers in addr list */
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 */
};
Expand All @@ -284,7 +283,7 @@ struct afs_cache_vlocation {
#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 */
struct in_addr servers[8]; /* fileserver addresses */
struct sockaddr_rxrpc servers[8]; /* fileserver addresses */
time_t rtime; /* last retrieval time */
};

Expand Down Expand Up @@ -315,7 +314,7 @@ struct afs_vlocation {
struct afs_server {
atomic_t usage;
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_cell *cell; /* cell in which server resides */
struct list_head link; /* link in cell's server list */
Expand Down Expand Up @@ -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_put_call(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 *,
const struct afs_call_type *,
size_t, size_t);
Expand Down Expand Up @@ -690,7 +689,7 @@ do { \

extern void afs_server_timer(struct timer_list *);
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 *,
const struct sockaddr_rxrpc *);
extern void afs_put_server(struct afs_net *, struct afs_server *);
Expand All @@ -707,11 +706,11 @@ extern void __exit afs_fs_exit(void);
* vlclient.c
*/
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 *,
bool);
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,
struct afs_cache_vlocation *, bool);

Expand Down
10 changes: 5 additions & 5 deletions fs/afs/proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
struct in_addr *addr = v;
struct sockaddr_rxrpc *addr = v;

/* display header on line 1 */
if (v == (struct in_addr *) 1) {
if (v == (void *)1) {
seq_puts(m, "ADDRESS\n");
return 0;
}

/* 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;
}

Expand Down Expand Up @@ -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_server *server = list_entry(v, struct afs_server, link);
char ipaddr[20];
char ipaddr[64];

/* display header on line 1 */
if (v == &cell->servers) {
Expand All @@ -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 */
sprintf(ipaddr, "%pI4", &server->addr);
sprintf(ipaddr, "%pISp", &server->addr.transport);
seq_printf(m, "%3d %-15.15s %5d\n",
atomic_read(&server->usage), ipaddr, server->fs_state);

Expand Down
18 changes: 4 additions & 14 deletions fs/afs/rxrpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,10 +322,9 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg)
/*
* initiate a call
*/
int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
bool async)
int afs_make_call(struct sockaddr_rxrpc *srx, struct afs_call *call,
gfp_t gfp, bool async)
{
struct sockaddr_rxrpc srx;
struct rxrpc_call *rxcall;
struct msghdr msg;
struct kvec iov[1];
Expand All @@ -334,7 +333,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
u32 abort_code;
int ret;

_enter("%x,{%d},", addr->s_addr, ntohs(call->port));
_enter(",{%pISp},", &srx->transport);

ASSERT(call->type != NULL);
ASSERT(call->type->name != NULL);
Expand All @@ -345,15 +344,6 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,

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
* calls such as FS.StoreData where there's an extra injection of data
* after the initial fixed part.
Expand All @@ -365,7 +355,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
}

/* 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,
tx_total_len, gfp,
(async ?
Expand Down
Loading

0 comments on commit 4d9df98

Please sign in to comment.