From e3967543d1960c4ab3f99be0c3eae3fc5b4b52af Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 16 Apr 2025 15:59:44 +0200 Subject: [PATCH] ioctl: retry ioctl on EINTR return value Recent changes in the nvme-tcp transport started to return EINTR due to a signal while reading from a socket. The transport could retry the operation but so far this hasn't been implemented. Thus we retry in userpace the connect call when EINTR is returned. Signed-off-by: Daniel Wagner --- src/nvme/ioctl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/nvme/ioctl.c b/src/nvme/ioctl.c index 2417863d3..93010b151 100644 --- a/src/nvme/ioctl.c +++ b/src/nvme/ioctl.c @@ -52,7 +52,7 @@ int nvme_subsystem_reset(int fd) ret = nvme_verify_chr(fd); if (ret) return ret; - return ioctl(fd, NVME_IOCTL_SUBSYS_RESET); + return TFR(ioctl(fd, NVME_IOCTL_SUBSYS_RESET)); } int nvme_ctrl_reset(int fd) @@ -62,7 +62,7 @@ int nvme_ctrl_reset(int fd) ret = nvme_verify_chr(fd); if (ret) return ret; - return ioctl(fd, NVME_IOCTL_RESET); + return TFR(ioctl(fd, NVME_IOCTL_RESET)); } int nvme_ns_rescan(int fd) @@ -72,13 +72,13 @@ int nvme_ns_rescan(int fd) ret = nvme_verify_chr(fd); if (ret) return ret; - return ioctl(fd, NVME_IOCTL_RESCAN); + return TFR(ioctl(fd, NVME_IOCTL_RESCAN)); } int nvme_get_nsid(int fd, __u32 *nsid) { errno = 0; - *nsid = ioctl(fd, NVME_IOCTL_ID); + *nsid = TFR(ioctl(fd, NVME_IOCTL_ID)); return -1 * (errno != 0); } @@ -87,7 +87,7 @@ int nvme_submit_passthru64(int fd, unsigned long ioctl_cmd, struct nvme_passthru_cmd64 *cmd, __u64 *result) { - int err = ioctl(fd, ioctl_cmd, cmd); + int err = TFR(ioctl(fd, ioctl_cmd, cmd)); if (err >= 0 && result) *result = cmd->result; @@ -98,7 +98,7 @@ __attribute__((weak)) int nvme_submit_passthru(int fd, unsigned long ioctl_cmd, struct nvme_passthru_cmd *cmd, __u32 *result) { - int err = ioctl(fd, ioctl_cmd, cmd); + int err = TFR(ioctl(fd, ioctl_cmd, cmd)); if (err >= 0 && result) *result = cmd->result;