summaryrefslogtreecommitdiffstats
path: root/fs/afs
diff options
context:
space:
mode:
authorMarc Dionne <marc.dionne@auristor.com>2018-05-12 02:35:06 +0200
committerDavid Howells <dhowells@redhat.com>2018-05-14 16:15:18 +0200
commitf9c1bba3d392843f046d2ee27b4dfcec989d8a4b (patch)
tree84f32ead390f4147fb7b835131a42bb24161374c /fs/afs
parentafs: Fix the handling of an unfound server in CM operations (diff)
downloadlinux-f9c1bba3d392843f046d2ee27b4dfcec989d8a4b.tar.xz
linux-f9c1bba3d392843f046d2ee27b4dfcec989d8a4b.zip
afs: Fix afs_find_server search loop
The code that looks up servers by addresses makes the assumption that the list of addresses for a server is sorted. It exits the loop if it finds that the target address is larger than the current candidate. As the list is not currently sorted, this can lead to a failure to find a matching server, which can cause callbacks from that server to be ignored. Remove the early exit case so that the complete list is searched. Fixes: d2ddc776a458 ("afs: Overhaul volume and server record caching and fileserver rotation") Signed-off-by: Marc Dionne <marc.dionne@auristor.com> Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs')
-rw-r--r--fs/afs/server.c13
1 files changed, 0 insertions, 13 deletions
diff --git a/fs/afs/server.c b/fs/afs/server.c
index 2c5cff60e34d..3af4625e2f8c 100644
--- a/fs/afs/server.c
+++ b/fs/afs/server.c
@@ -67,12 +67,6 @@ struct afs_server *afs_find_server(struct afs_net *net,
sizeof(struct in6_addr));
if (diff == 0)
goto found;
- if (diff < 0) {
- // TODO: Sort the list
- //if (i == alist->nr_ipv4)
- // goto not_found;
- break;
- }
}
}
} else {
@@ -87,17 +81,10 @@ struct afs_server *afs_find_server(struct afs_net *net,
(u32 __force)b->sin6_addr.s6_addr32[3]);
if (diff == 0)
goto found;
- if (diff < 0) {
- // TODO: Sort the list
- //if (i == 0)
- // goto not_found;
- break;
- }
}
}
}
- //not_found:
server = NULL;
found:
if (server && !atomic_inc_not_zero(&server->usage))