mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
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: d2ddc776a4
("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>
This commit is contained in:
parent
a86b06d1cc
commit
f9c1bba3d3
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user