// SPDX-License-Identifier: GPL-2.0-or-later /* Server address list management * * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com)
*/
for (i = 0; i < alist->nr_addrs; i++)
rxrpc_kernel_put_peer(alist->addrs[i].peer);
trace_afs_alist(alist->debug_id, refcount_read(&alist->usage), afs_alist_trace_free);
kfree(alist);
}
if (!alist) return;
debug_id = alist->debug_id;
dead = __refcount_dec_and_test(&alist->usage, &r);
trace_afs_alist(debug_id, r - 1, reason); if (dead)
call_rcu(&alist->rcu, afs_free_addrlist);
}
/* Count the addresses */
p = text; do { if (!*p) {
problem = "nul"; goto inval;
} if (*p == delim) continue;
nr++; if (*p == '[') {
p++; if (p == end) {
problem = "brace1"; goto inval;
}
p = memchr(p, ']', end - p); if (!p) {
problem = "brace2"; goto inval;
}
p++; if (p >= end) break;
}
p = memchr(p, delim, end - p); if (!p) break;
p++;
} while (p < end);
_debug("%u/%u addresses", nr, AFS_MAX_ADDRESSES);
vllist = afs_alloc_vlserver_list(1); if (!vllist) return ERR_PTR(-ENOMEM);
/* * Perform a DNS query for VL servers and build a up an address list.
*/ struct afs_vlserver_list *afs_dns_query(struct afs_cell *cell, time64_t *_expiry)
{ struct afs_vlserver_list *vllist; char *result = NULL; int ret;
peer = rxrpc_kernel_lookup_peer(net->socket, &srx, GFP_KERNEL); if (!peer) return -ENOMEM;
for (i = 0; i < alist->nr_ipv4; i++) { if (peer == alist->addrs[i].peer) {
rxrpc_kernel_put_peer(peer); return 0;
} if (peer <= alist->addrs[i].peer) break;
}
if (i < alist->nr_addrs)
memmove(alist->addrs + i + 1,
alist->addrs + i, sizeof(alist->addrs[0]) * (alist->nr_addrs - i));
peer = rxrpc_kernel_lookup_peer(net->socket, &srx, GFP_KERNEL); if (!peer) return -ENOMEM;
for (i = alist->nr_ipv4; i < alist->nr_addrs; i++) { if (peer == alist->addrs[i].peer) {
rxrpc_kernel_put_peer(peer); return 0;
} if (peer <= alist->addrs[i].peer) break;
}
if (i < alist->nr_addrs)
memmove(alist->addrs + i + 1,
alist->addrs + i, sizeof(alist->addrs[0]) * (alist->nr_addrs - i));
alist->addrs[i].peer = peer;
alist->nr_addrs++; return 0;
}
/* * Set the app data on the rxrpc peers an address list points to
*/ void afs_set_peer_appdata(struct afs_server *server, struct afs_addr_list *old_alist, struct afs_addr_list *new_alist)
{ unsignedlong data = (unsignedlong)server; int n = 0, o = 0;
if (!old_alist) { /* New server. Just set all. */ for (; n < new_alist->nr_addrs; n++)
rxrpc_kernel_set_peer_data(new_alist->addrs[n].peer, data); return;
} if (!new_alist) { /* Dead server. Just remove all. */ for (; o < old_alist->nr_addrs; o++)
rxrpc_kernel_set_peer_data(old_alist->addrs[o].peer, 0); return;
}
/* Walk through the two lists simultaneously, setting new peers and * clearing old ones. The two lists are ordered by pointer to peer * record.
*/ while (n < new_alist->nr_addrs && o < old_alist->nr_addrs) { struct rxrpc_peer *pn = new_alist->addrs[n].peer; struct rxrpc_peer *po = old_alist->addrs[o].peer;
if (n < new_alist->nr_addrs) for (; n < new_alist->nr_addrs; n++)
rxrpc_kernel_set_peer_data(new_alist->addrs[n].peer, data); if (o < old_alist->nr_addrs) for (; o < old_alist->nr_addrs; o++)
rxrpc_kernel_set_peer_data(old_alist->addrs[o].peer, 0);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.