| From foo@baz Sun Jun 17 12:07:34 CEST 2018 |
| From: Marc Dionne <marc.dionne@auristor.com> |
| Date: Fri, 11 May 2018 21:35:06 -0300 |
| Subject: afs: Fix afs_find_server search loop |
| |
| From: Marc Dionne <marc.dionne@auristor.com> |
| |
| [ Upstream commit f9c1bba3d392843f046d2ee27b4dfcec989d8a4b ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/afs/server.c | 13 ------------- |
| 1 file changed, 13 deletions(-) |
| |
| --- a/fs/afs/server.c |
| +++ b/fs/afs/server.c |
| @@ -66,12 +66,6 @@ struct afs_server *afs_find_server(struc |
| 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 { |
| @@ -85,17 +79,10 @@ struct afs_server *afs_find_server(struc |
| (u32)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)) |