From d666068be7489a7ff49b3ac3f6b61ccee0839972 Mon Sep 17 00:00:00 2001 From: vrtgs Date: Wed, 24 Dec 2025 18:18:25 +0300 Subject: [PATCH] fs: handle `EINTR` in `fs::write` for io-uring (#7786) --- tokio/src/fs/write.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tokio/src/fs/write.rs b/tokio/src/fs/write.rs index c70a1978..76387134 100644 --- a/tokio/src/fs/write.rs +++ b/tokio/src/fs/write.rs @@ -72,12 +72,14 @@ async fn write_uring(path: &Path, mut buf: OwnedBuf) -> io::Result<()> { let mut buf_offset: usize = 0; let mut file_offset: u64 = 0; while buf_offset < total { - let (n, _buf, _fd) = Op::write_at(fd, buf, buf_offset, file_offset)?.await; - // TODO: handle EINT here - let n = n?; - if n == 0 { - return Err(io::ErrorKind::WriteZero.into()); - } + let (res, _buf, _fd) = Op::write_at(fd, buf, buf_offset, file_offset)?.await; + + let n = match res { + Ok(0) => return Err(io::ErrorKind::WriteZero.into()), + Ok(n) => n, + Err(e) if e.kind() == io::ErrorKind::Interrupted => 0, + Err(e) => return Err(e), + }; buf = _buf; fd = _fd; -- 2.43.0