summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2021-03-23 16:15:43 +0100
committerSimon Rettberg2021-03-23 16:15:43 +0100
commit6c509e7a6e90c2e8e55613e29cb08dc2674e30de (patch)
tree7dc1e39a7792db764fe903d0617b0e79a040a28c
parent[KERNEL] Synchronous add/remove of alt-servers via IOCTL (diff)
downloaddnbd3-6c509e7a6e90c2e8e55613e29cb08dc2674e30de.tar.gz
dnbd3-6c509e7a6e90c2e8e55613e29cb08dc2674e30de.tar.xz
dnbd3-6c509e7a6e90c2e8e55613e29cb08dc2674e30de.zip
[KERNEL] Set fake low RTT after manual server switch
This avoids automatically switching back right after adding and switching to a server.
-rw-r--r--src/kernel/blk.c7
-rw-r--r--src/kernel/dnbd3_main.c1
2 files changed, 8 insertions, 0 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 661bc2e..90e9b34 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -247,6 +247,13 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
/* switching didn't work but we are back to the old server */
result = -EAGAIN;
}
+ } else {
+ /* switch succeeded, fake very low RTT so we don't switch away again soon */
+ mutex_lock(&dev->alt_servers_lock);
+ if (is_same_server(alt_server, &new_server)) {
+ alt_server->rtts[0] = alt_server->rtts[1] = alt_server->rtts[2] = alt_server->rtts[3] = 4;
+ }
+ mutex_unlock(&dev->alt_servers_lock);
}
} else {
/* specified server is already working, so do not switch */
diff --git a/src/kernel/dnbd3_main.c b/src/kernel/dnbd3_main.c
index 17d553e..7a3b1d5 100644
--- a/src/kernel/dnbd3_main.c
+++ b/src/kernel/dnbd3_main.c
@@ -66,6 +66,7 @@ static inline dnbd3_server_t *get_free_alt_server(dnbd3_device_t *const dev)
/**
* Returns pointer to existing entry in alt_servers that matches the given
* alt server, or NULL if not found.
+ * The caller has to hold dev->alt_servers_lock.
*/
dnbd3_server_t *get_existing_server(const dnbd3_host_t *const newserver, dnbd3_device_t *const dev)
{