Skip to content

Commit

Permalink
afs: Fix afs_find_server search loop
Browse files Browse the repository at this point in the history
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: d2ddc77 ("afs: Overhaul volume and server record caching and fileserver rotation")
Signed-off-by: Marc Dionne <[email protected]>
Signed-off-by: David Howells <[email protected]>
  • Loading branch information
Marc Dionne authored and dhowells committed May 14, 2018
1 parent a86b06d commit f9c1bba
Showing 1 changed file with 0 additions and 13 deletions.
13 changes: 0 additions & 13 deletions fs/afs/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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))
Expand Down

0 comments on commit f9c1bba

Please sign in to comment.