Commit ca1cbbdc authored by David Howells's avatar David Howells

afs: Fix afs_cell records to always have a VL server list record

Fix it such that afs_cell records always have a VL server list record
attached, even if it's a dummy one, so that various checks can be removed.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 6b8812fc
...@@ -123,6 +123,7 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net, ...@@ -123,6 +123,7 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net,
const char *name, unsigned int namelen, const char *name, unsigned int namelen,
const char *addresses) const char *addresses)
{ {
struct afs_vlserver_list *vllist;
struct afs_cell *cell; struct afs_cell *cell;
int i, ret; int i, ret;
...@@ -157,12 +158,10 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net, ...@@ -157,12 +158,10 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net,
rwlock_init(&cell->proc_lock); rwlock_init(&cell->proc_lock);
rwlock_init(&cell->vl_servers_lock); rwlock_init(&cell->vl_servers_lock);
/* Fill in the VL server list if we were given a list of addresses to /* Provide a VL server list, filling it in if we were given a list of
* use. * addresses to use.
*/ */
if (addresses) { if (addresses) {
struct afs_vlserver_list *vllist;
vllist = afs_parse_text_addrs(net, vllist = afs_parse_text_addrs(net,
addresses, strlen(addresses), ':', addresses, strlen(addresses), ':',
VL_SERVICE, AFS_VL_PORT); VL_SERVICE, AFS_VL_PORT);
...@@ -171,19 +170,24 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net, ...@@ -171,19 +170,24 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net,
goto parse_failed; goto parse_failed;
} }
rcu_assign_pointer(cell->vl_servers, vllist);
cell->dns_expiry = TIME64_MAX; cell->dns_expiry = TIME64_MAX;
__clear_bit(AFS_CELL_FL_NO_LOOKUP_YET, &cell->flags);
} else { } else {
ret = -ENOMEM;
vllist = afs_alloc_vlserver_list(0);
if (!vllist)
goto error;
cell->dns_expiry = ktime_get_real_seconds(); cell->dns_expiry = ktime_get_real_seconds();
} }
rcu_assign_pointer(cell->vl_servers, vllist);
_leave(" = %p", cell); _leave(" = %p", cell);
return cell; return cell;
parse_failed: parse_failed:
if (ret == -EINVAL) if (ret == -EINVAL)
printk(KERN_ERR "kAFS: bad VL server IP address\n"); printk(KERN_ERR "kAFS: bad VL server IP address\n");
error:
kfree(cell); kfree(cell);
_leave(" = %d", ret); _leave(" = %d", ret);
return ERR_PTR(ret); return ERR_PTR(ret);
...@@ -410,8 +414,7 @@ static void afs_update_cell(struct afs_cell *cell) ...@@ -410,8 +414,7 @@ static void afs_update_cell(struct afs_cell *cell)
cell->dns_expiry = expiry; cell->dns_expiry = expiry;
write_unlock(&cell->vl_servers_lock); write_unlock(&cell->vl_servers_lock);
if (old) afs_put_vlserverlist(cell->net, old);
afs_put_vlserverlist(cell->net, old);
} }
if (test_and_clear_bit(AFS_CELL_FL_NO_LOOKUP_YET, &cell->flags)) if (test_and_clear_bit(AFS_CELL_FL_NO_LOOKUP_YET, &cell->flags))
......
...@@ -53,7 +53,7 @@ static int afs_proc_cells_show(struct seq_file *m, void *v) ...@@ -53,7 +53,7 @@ static int afs_proc_cells_show(struct seq_file *m, void *v)
seq_printf(m, "%3u %6lld %2u %s\n", seq_printf(m, "%3u %6lld %2u %s\n",
atomic_read(&cell->usage), atomic_read(&cell->usage),
cell->dns_expiry - ktime_get_real_seconds(), cell->dns_expiry - ktime_get_real_seconds(),
vllist ? vllist->nr_servers : 0, vllist->nr_servers,
cell->name); cell->name);
return 0; return 0;
} }
...@@ -296,8 +296,8 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v) ...@@ -296,8 +296,8 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v)
if (v == SEQ_START_TOKEN) { if (v == SEQ_START_TOKEN) {
seq_printf(m, "# source %s, status %s\n", seq_printf(m, "# source %s, status %s\n",
dns_record_sources[vllist->source], dns_record_sources[vllist ? vllist->source : 0],
dns_lookup_statuses[vllist->status]); dns_lookup_statuses[vllist ? vllist->status : 0]);
return 0; return 0;
} }
...@@ -336,7 +336,7 @@ static void *afs_proc_cell_vlservers_start(struct seq_file *m, loff_t *_pos) ...@@ -336,7 +336,7 @@ static void *afs_proc_cell_vlservers_start(struct seq_file *m, loff_t *_pos)
if (pos == 0) if (pos == 0)
return SEQ_START_TOKEN; return SEQ_START_TOKEN;
if (!vllist || pos - 1 >= vllist->nr_servers) if (pos - 1 >= vllist->nr_servers)
return NULL; return NULL;
return &vllist->servers[pos - 1]; return &vllist->servers[pos - 1];
......
...@@ -232,18 +232,16 @@ struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *cell, ...@@ -232,18 +232,16 @@ struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *cell,
if (bs.status > NR__dns_lookup_status) if (bs.status > NR__dns_lookup_status)
bs.status = NR__dns_lookup_status; bs.status = NR__dns_lookup_status;
/* See if we can update an old server record */
server = NULL; server = NULL;
if (previous) { for (i = 0; i < previous->nr_servers; i++) {
/* See if we can update an old server record */ struct afs_vlserver *p = previous->servers[i].server;
for (i = 0; i < previous->nr_servers; i++) {
struct afs_vlserver *p = previous->servers[i].server; if (p->name_len == bs.name_len &&
p->port == bs.port &&
if (p->name_len == bs.name_len && strncasecmp(b, p->name, bs.name_len) == 0) {
p->port == bs.port && server = afs_get_vlserver(p);
strncasecmp(b, p->name, bs.name_len) == 0) { break;
server = afs_get_vlserver(p);
break;
}
} }
} }
......
...@@ -55,7 +55,7 @@ static bool afs_start_vl_iteration(struct afs_vl_cursor *vc) ...@@ -55,7 +55,7 @@ static bool afs_start_vl_iteration(struct afs_vl_cursor *vc)
rcu_dereference_protected(cell->vl_servers, rcu_dereference_protected(cell->vl_servers,
lockdep_is_held(&cell->vl_servers_lock))); lockdep_is_held(&cell->vl_servers_lock)));
read_unlock(&cell->vl_servers_lock); read_unlock(&cell->vl_servers_lock);
if (!vc->server_list || !vc->server_list->nr_servers) if (!vc->server_list->nr_servers)
return false; return false;
vc->untried = (1UL << vc->server_list->nr_servers) - 1; vc->untried = (1UL << vc->server_list->nr_servers) - 1;
......
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