diff --git a/monoio/src/driver/op/read.rs b/monoio/src/driver/op/read.rs index 70d3de28..f58c306d 100644 --- a/monoio/src/driver/op/read.rs +++ b/monoio/src/driver/op/read.rs @@ -74,30 +74,14 @@ impl OpAble for Read { #[cfg(all(unix, feature = "legacy"))] fn legacy_call(&mut self) -> io::Result { let fd = self.fd.as_raw_fd(); - if self.offset != 0 { - let seek_offset = libc::off_t::try_from(self.offset) - .map_err(|_| io::Error::new(io::ErrorKind::Other, "offset too big"))?; - let neg_seek_offset = seek_offset - .checked_neg() - .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "offset too big"))?; - syscall_u32!(lseek(fd, seek_offset, libc::SEEK_CUR))?; - syscall_u32!(read( - fd, - self.buf.write_ptr() as _, - self.buf.bytes_total().min(u32::MAX as usize) - )) - .map_err(|e| { - // seek back if read fail... - let _ = syscall_u32!(lseek(fd, neg_seek_offset, libc::SEEK_CUR)); - e - }) - } else { - syscall_u32!(read( - fd, - self.buf.write_ptr() as _, - self.buf.bytes_total().min(u32::MAX as usize) - )) - } + let seek_offset = libc::off_t::try_from(self.offset) + .map_err(|_| io::Error::new(io::ErrorKind::Other, "offset too big"))?; + syscall_u32!(pread64( + fd, + self.buf.write_ptr() as _, + self.buf.bytes_total(), + seek_offset + )) } } diff --git a/monoio/src/driver/op/write.rs b/monoio/src/driver/op/write.rs index 046a71aa..4ca43a59 100644 --- a/monoio/src/driver/op/write.rs +++ b/monoio/src/driver/op/write.rs @@ -63,28 +63,12 @@ impl OpAble for Write { let fd = self.fd.as_raw_fd(); let seek_offset = libc::off_t::try_from(self.offset) .map_err(|_| io::Error::new(io::ErrorKind::Other, "offset too big"))?; - let neg_seek_offset = seek_offset - .checked_neg() - .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "offset too big"))?; - if self.offset != 0 { - syscall_u32!(lseek(fd, seek_offset, libc::SEEK_CUR))?; - syscall_u32!(write( - fd, - self.buf.read_ptr() as _, - self.buf.bytes_init().min(u32::MAX as usize) - )) - .map_err(|e| { - // seek back if read fail... - let _ = syscall_u32!(lseek(fd, neg_seek_offset, libc::SEEK_CUR)); - e - }) - } else { - syscall_u32!(write( - fd, - self.buf.read_ptr() as _, - self.buf.bytes_init().min(u32::MAX as usize) - )) - } + syscall_u32!(pwrite64( + fd, + self.buf.read_ptr() as _, + self.buf.bytes_init(), + seek_offset + )) } }