From 0dba36ab4e8414458889990d8423f0f29a8ae638 Mon Sep 17 00:00:00 2001 From: Francesco Mazzoli Date: Thu, 22 Feb 2024 18:06:30 +0000 Subject: [PATCH] ETIMEDOUT on zero response The expected behavior is not really documented, but this seems to be what is happening. --- kmod/shuckle.c | 2 ++ kmod/super.c | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/kmod/shuckle.c b/kmod/shuckle.c index 138379cf..6169697e 100644 --- a/kmod/shuckle.c +++ b/kmod/shuckle.c @@ -110,6 +110,7 @@ int eggsfs_create_shuckle_socket(atomic64_t* addr1, atomic64_t* addr2, struct so iov.iov_base = resp_header + read_so_far; iov.iov_len = sizeof(resp_header) - read_so_far; int read = kernel_recvmsg(*sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; goto out_sock; } read_so_far += read; } @@ -127,6 +128,7 @@ int eggsfs_create_shuckle_socket(atomic64_t* addr1, atomic64_t* addr2, struct so iov.iov_base = (char*)&resp + read_so_far; iov.iov_len = sizeof(resp) - read_so_far; int read = kernel_recvmsg(*sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; goto out_sock; } read_so_far += read; } diff --git a/kmod/super.c b/kmod/super.c index 303c18bb..1f03f38f 100644 --- a/kmod/super.c +++ b/kmod/super.c @@ -57,6 +57,7 @@ static int eggsfs_refresh_fs_info(struct eggsfs_fs_info* info) { iov.iov_base = shards_resp_header + read_so_far; iov.iov_len = sizeof(shards_resp_header) - read_so_far; int read = kernel_recvmsg(shuckle_sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; goto out_sock; } read_so_far += read; } @@ -81,6 +82,7 @@ static int eggsfs_refresh_fs_info(struct eggsfs_fs_info* info) { iov.iov_base = shard_info_resp + read_so_far; iov.iov_len = sizeof(shard_info_resp) - read_so_far; int read = kernel_recvmsg(shuckle_sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; goto out_sock; } read_so_far += read; } @@ -118,6 +120,7 @@ static int eggsfs_refresh_fs_info(struct eggsfs_fs_info* info) { iov.iov_base = cdc_resp_header + read_so_far; iov.iov_len = sizeof(cdc_resp_header) - read_so_far; int read = kernel_recvmsg(shuckle_sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; goto out_sock; } read_so_far += read; } @@ -133,6 +136,7 @@ static int eggsfs_refresh_fs_info(struct eggsfs_fs_info* info) { iov.iov_base = (char*)&cdc_resp + read_so_far; iov.iov_len = sizeof(cdc_resp) - read_so_far; int read = kernel_recvmsg(shuckle_sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; goto out_sock; } read_so_far += read; } @@ -319,6 +323,7 @@ static int eggsfs_statfs(struct dentry* dentry, struct kstatfs* stats) { iov.iov_base = shuckle_resp_header + read_so_far; iov.iov_len = sizeof(shuckle_resp_header) - read_so_far; int read = kernel_recvmsg(shuckle_sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; eggsfs_info("could not recv msg err=%d", err); @@ -342,6 +347,7 @@ static int eggsfs_statfs(struct dentry* dentry, struct kstatfs* stats) { iov.iov_base = (char*)&shuckle_resp + read_so_far; iov.iov_len = sizeof(shuckle_resp) - read_so_far; int read = kernel_recvmsg(shuckle_sock, &msg, &iov, 1, iov.iov_len, 0); + if (read == 0) { err = -ETIMEDOUT; goto out_sock; } if (read < 0) { err = read; eggsfs_info("could not recv msg err=%d", err);