Skip to content

Conversation

@wdcui
Copy link
Member

@wdcui wdcui commented Feb 2, 2026

Summary

This PR implements the positioned vectored I/O syscalls:

  • preadv: read from fd at offset into multiple buffers
  • pwritev: write to fd at offset from multiple buffers
  • preadv2: like preadv with RWF_* flags support
  • pwritev2: like pwritev with RWF_* flags support

Implementation Details

New Types

  • RwfFlags bitflags type with support for:
    • RWF_HIPRI: High priority request
    • RWF_DSYNC: Per-I/O O_DSYNC
    • RWF_SYNC: Per-I/O O_SYNC
    • RWF_NOWAIT: Non-blocking operation
    • RWF_APPEND: Per-I/O O_APPEND

Syscall Behavior

  • offset=-1 in v2 variants falls back to readv/writev behavior (uses current file position)
  • Returns ESPIPE for pipes/sockets (positioned I/O not supported)
  • Returns EINVAL for negative offsets
  • Returns EINVAL for RWF_APPEND on read operations
  • Returns EOPNOTSUPP for unknown flags
  • Handles x86 vs x86_64 ABI differences for offset parameter

Files Modified

  • litebox_common_linux/src/lib.rs: Added RwfFlags type, syscall request variants, and parsing
  • litebox_shim_linux/src/lib.rs: Added syscall dispatch cases
  • litebox_shim_linux/src/syscalls/file.rs: Implemented syscall handlers
  • litebox_shim_linux/src/syscalls/tests.rs: Added unit tests

Testing

  • All 174 existing tests pass
  • Added new tests:
    • test_preadv_pwritev_basic: Tests basic preadv and pwritev operations
    • test_preadv2_offset_minus_one: Tests preadv2 fallback to readv when offset=-1
    • test_preadv_invalid_offset: Tests EINVAL for negative offset
    • test_preadv2_invalid_flags: Tests EINVAL for RWF_APPEND on read

References

  • Linux man pages: man 2 preadv, man 2 preadv2
  • Linux source: fs/read_write.c

wdcui added 2 commits February 2, 2026 02:57
This commit adds support for positioned vectored I/O syscalls:

- preadv: read from fd at offset into multiple buffers
- pwritev: write to fd at offset from multiple buffers
- preadv2: like preadv with RWF_* flags support
- pwritev2: like pwritev with RWF_* flags support

Key features:
- Supports RWF_HIPRI, RWF_DSYNC, RWF_SYNC, RWF_NOWAIT, RWF_APPEND flags
- offset=-1 in v2 variants falls back to readv/writev behavior
- Returns ESPIPE for pipes/sockets (no positioned I/O)
- Returns EINVAL for negative offsets
- Returns EOPNOTSUPP for unknown flags
- Handles x86 vs x86_64 ABI differences

Includes unit tests for:
- Basic preadv/pwritev operations
- preadv2 with offset=-1 fallback
- Invalid offset handling
- Invalid flags handling
Address code review feedback by adding validation for iovcnt parameter.
This prevents potential resource exhaustion from extremely large iovcnt
values by limiting it to 1024 (Linux's UIO_MAXIOV).
@github-actions
Copy link

github-actions bot commented Feb 2, 2026

🤖 SemverChecks 🤖 ⚠️ Potential breaking API changes detected ⚠️

Click for details
--- failure enum_no_repr_variant_discriminant_changed: enum variant had its discriminant change value ---

Description:
The enum's variant had its discriminant value change. This breaks downstream code that used its value via a numeric cast like `as isize`.
        ref: https://doc.rust-lang.org/reference/items/enumerations.html#assigning-discriminant-values
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_no_repr_variant_discriminant_changed.ron

Failed in:
  variant SyscallRequest::Access 27 -> 31 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2009
  variant SyscallRequest::Madvise 28 -> 32 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2013
  variant SyscallRequest::Dup 29 -> 33 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2018
  variant SyscallRequest::Socket 30 -> 34 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2023
  variant SyscallRequest::Socketpair 31 -> 35 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2033
  variant SyscallRequest::Connect 32 -> 36 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2039
  variant SyscallRequest::Accept 33 -> 37 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2044
  variant SyscallRequest::Sendto 34 -> 38 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2050
  variant SyscallRequest::Sendmsg 35 -> 39 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2058
  variant SyscallRequest::Recvfrom 36 -> 40 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2063
  variant SyscallRequest::Bind 37 -> 41 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2071
  variant SyscallRequest::Listen 38 -> 42 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2076
  variant SyscallRequest::Setsockopt 39 -> 43 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2080
  variant SyscallRequest::Getsockopt 40 -> 44 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2087
  variant SyscallRequest::Getsockname 41 -> 45 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2094
  variant SyscallRequest::Getpeername 42 -> 46 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2099
  variant SyscallRequest::Uname 43 -> 47 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2104
  variant SyscallRequest::Fcntl 44 -> 48 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2107
  variant SyscallRequest::Getcwd 45 -> 49 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2111
  variant SyscallRequest::EpollCtl 46 -> 50 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2115
  variant SyscallRequest::EpollPwait 47 -> 51 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2121
  variant SyscallRequest::EpollCreate 48 -> 52 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2129
  variant SyscallRequest::Ppoll 49 -> 53 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2133
  variant SyscallRequest::Pselect 50 -> 54 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2140
  variant SyscallRequest::ArchPrctl 51 -> 55 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2148
  variant SyscallRequest::Readlink 52 -> 56 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2151
  variant SyscallRequest::Readlinkat 53 -> 57 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2156
  variant SyscallRequest::Openat 54 -> 58 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2162
  variant SyscallRequest::Ftruncate 55 -> 59 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2168
  variant SyscallRequest::Unlinkat 56 -> 60 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2172
  variant SyscallRequest::Newfstatat 57 -> 61 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2178
  variant SyscallRequest::Eventfd2 58 -> 62 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2191
  variant SyscallRequest::Pipe2 59 -> 63 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2195
  variant SyscallRequest::Clone 60 -> 64 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2199
  variant SyscallRequest::Clone3 61 -> 65 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2202
  variant SyscallRequest::SetThreadArea 62 -> 66 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2207
  variant SyscallRequest::ClockGettime 63 -> 67 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2210
  variant SyscallRequest::ClockGetres 64 -> 68 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2214
  variant SyscallRequest::ClockNanosleep 65 -> 69 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2218
  variant SyscallRequest::Gettimeofday 66 -> 70 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2224
  variant SyscallRequest::Time 67 -> 71 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2228
  variant SyscallRequest::Getrlimit 68 -> 72 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2231
  variant SyscallRequest::Setrlimit 69 -> 73 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2235
  variant SyscallRequest::Prlimit 70 -> 74 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2239
  variant SyscallRequest::SetTidAddress 71 -> 75 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2250
  variant SyscallRequest::Gettid 72 -> 76 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2253
  variant SyscallRequest::SetRobustList 73 -> 77 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2254
  variant SyscallRequest::GetRobustList 74 -> 78 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2257
  variant SyscallRequest::GetRandom 75 -> 79 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2262
  variant SyscallRequest::Getpid 76 -> 80 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2267
  variant SyscallRequest::Getppid 77 -> 81 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2268
  variant SyscallRequest::Getuid 78 -> 82 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2269
  variant SyscallRequest::Geteuid 79 -> 83 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2270
  variant SyscallRequest::Getgid 80 -> 84 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2271
  variant SyscallRequest::Getegid 81 -> 85 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2272
  variant SyscallRequest::Sysinfo 82 -> 86 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2273
  variant SyscallRequest::CapGet 83 -> 87 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2276
  variant SyscallRequest::GetDirent64 84 -> 88 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2280
  variant SyscallRequest::SchedGetAffinity 85 -> 89 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2285
  variant SyscallRequest::SchedYield 86 -> 90 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2290
  variant SyscallRequest::Futex 87 -> 91 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2291
  variant SyscallRequest::Execve 88 -> 92 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2294
  variant SyscallRequest::Umask 89 -> 93 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2299
  variant SyscallRequest::Prctl 90 -> 94 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2302
  variant SyscallRequest::Alarm 91 -> 95 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2305
  variant SyscallRequest::SetITimer 92 -> 96 in /home/runner/work/litebox/litebox/litebox_common_linux/src/lib.rs:2308

@wdcui wdcui closed this Feb 2, 2026
@wdcui wdcui deleted the wdcui/preadv-pwritev branch February 2, 2026 22:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants