hulk inclusion category: feature bugzilla: https://atomgit.com/openeuler/kernel/issues/9153 ---------------------------------------- This reverts commit a798223fb5d3c56bcd0faae02cab0a23eea35e7d. Revert self-developed patchset, using mainline patchset. Signed-off-by: Yang Erkun <yangerkun@huawei.com> --- drivers/block/nbd.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 2cc7abcf8bc7..abf8e34516e0 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -956,31 +956,40 @@ static int find_fallback(struct nbd_device *nbd, int index) int new_index = -1; struct nbd_sock *nsock = config->socks[index]; int fallback = nsock->fallback_index; - int i; if (test_bit(NBD_RT_DISCONNECTED, &config->runtime_flags)) return new_index; - if (config->num_connections <= 1) - goto no_fallback; + if (config->num_connections <= 1) { + dev_err_ratelimited(disk_to_dev(nbd->disk), + "Dead connection, failed to find a fallback\n"); + return new_index; + } if (fallback >= 0 && fallback < config->num_connections && !config->socks[fallback]->dead) return fallback; - for (i = 0; i < config->num_connections; i++) { - if (i != index && !config->socks[i]->dead) { - new_index = i; - break; + if (nsock->fallback_index < 0 || + nsock->fallback_index >= config->num_connections || + config->socks[nsock->fallback_index]->dead) { + int i; + for (i = 0; i < config->num_connections; i++) { + if (i == index) + continue; + if (!config->socks[i]->dead) { + new_index = i; + break; + } + } + nsock->fallback_index = new_index; + if (new_index < 0) { + dev_err_ratelimited(disk_to_dev(nbd->disk), + "Dead connection, failed to find a fallback\n"); + return new_index; } } - nsock->fallback_index = new_index; - if (new_index >= 0) - return new_index; - -no_fallback: - dev_err_ratelimited(disk_to_dev(nbd->disk), - "Dead connection, failed to find a fallback\n"); + new_index = nsock->fallback_index; return new_index; } -- 2.52.0