hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/afs/server_list.c
....@@ -1,12 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /* AFS fileserver list management.
23 *
34 * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved.
45 * Written by David Howells (dhowells@redhat.com)
5
- *
6
- * This program is free software; you can redistribute it and/or
7
- * modify it under the terms of the GNU General Public License
8
- * as published by the Free Software Foundation; either version
9
- * 2 of the License, or (at your option) any later version.
106 */
117
128 #include <linux/kernel.h>
....@@ -18,10 +14,9 @@
1814 int i;
1915
2016 if (slist && refcount_dec_and_test(&slist->usage)) {
21
- for (i = 0; i < slist->nr_servers; i++) {
22
- afs_put_cb_interest(net, slist->servers[i].cb_interest);
23
- afs_put_server(net, slist->servers[i].server);
24
- }
17
+ for (i = 0; i < slist->nr_servers; i++)
18
+ afs_unuse_server(net, slist->servers[i].server,
19
+ afs_server_trace_put_slist);
2520 kfree(slist);
2621 }
2722 }
....@@ -42,21 +37,23 @@
4237 if (vldb->fs_mask[i] & type_mask)
4338 nr_servers++;
4439
45
- slist = kzalloc(sizeof(struct afs_server_list) +
46
- sizeof(struct afs_server_entry) * nr_servers,
47
- GFP_KERNEL);
40
+ slist = kzalloc(struct_size(slist, servers, nr_servers), GFP_KERNEL);
4841 if (!slist)
4942 goto error;
5043
5144 refcount_set(&slist->usage, 1);
5245 rwlock_init(&slist->lock);
5346
47
+ for (i = 0; i < AFS_MAXTYPES; i++)
48
+ slist->vids[i] = vldb->vid[i];
49
+
5450 /* Make sure a records exists for each server in the list. */
5551 for (i = 0; i < vldb->nr_servers; i++) {
5652 if (!(vldb->fs_mask[i] & type_mask))
5753 continue;
5854
59
- server = afs_lookup_server(cell, key, &vldb->fs_server[i]);
55
+ server = afs_lookup_server(cell, key, &vldb->fs_server[i],
56
+ vldb->addr_version[i]);
6057 if (IS_ERR(server)) {
6158 ret = PTR_ERR(server);
6259 if (ret == -ENOENT ||
....@@ -73,7 +70,8 @@
7370 break;
7471 if (j < slist->nr_servers) {
7572 if (slist->servers[j].server == server) {
76
- afs_put_server(cell->net, server);
73
+ afs_put_server(cell->net, server,
74
+ afs_server_trace_put_slist_isort);
7775 continue;
7876 }
7977
....@@ -118,39 +116,13 @@
118116 return false;
119117
120118 changed:
121
- /* Maintain the same current server as before if possible. */
122
- cur = old->servers[old->index].server;
119
+ /* Maintain the same preferred server as before if possible. */
120
+ cur = old->servers[old->preferred].server;
123121 for (j = 0; j < new->nr_servers; j++) {
124122 if (new->servers[j].server == cur) {
125
- new->index = j;
123
+ new->preferred = j;
126124 break;
127125 }
128
- }
129
-
130
- /* Keep the old callback interest records where possible so that we
131
- * maintain callback interception.
132
- */
133
- i = 0;
134
- j = 0;
135
- while (i < old->nr_servers && j < new->nr_servers) {
136
- if (new->servers[j].server == old->servers[i].server) {
137
- struct afs_cb_interest *cbi = old->servers[i].cb_interest;
138
- if (cbi) {
139
- new->servers[j].cb_interest = cbi;
140
- refcount_inc(&cbi->usage);
141
- }
142
- i++;
143
- j++;
144
- continue;
145
- }
146
-
147
- if (new->servers[j].server < old->servers[i].server) {
148
- j++;
149
- continue;
150
- }
151
-
152
- i++;
153
- continue;
154126 }
155127
156128 return true;