Repository navigation
mv: recreate special files in directories moved across devices - #15123
abendrothj wants to merge 5 commits into
Conversation
|
GNU testsuite comparison: |
Merging this PR will degrade performance by 16.18%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ❌ | Memory | dd_copy_default |
19.7 KB | 28.6 KB | -31.08% |
| ❌ | Memory | dd_copy_4k_blocks |
23.1 KB | 31.9 KB | -27.83% |
| ❌ | Memory | dd_copy_partial |
23.1 KB | 32 KB | -27.82% |
| ❌ | Memory | dd_copy_with_skip |
23.4 KB | 32.3 KB | -27.56% |
| ❌ | Memory | dd_copy_with_seek |
23.4 KB | 32.3 KB | -27.56% |
| ❌ | Memory | dd_copy_8k_blocks |
27.1 KB | 35.9 KB | -24.73% |
| ❌ | Simulation | three_39_bit_primes |
583.2 ms | 669.2 ms | -12.84% |
| ❌ | Memory | dd_copy_64k_blocks |
83.1 KB | 91.9 KB | -9.67% |
| ❌ | Simulation | five_38_bit_primes |
1.6 s | 1.7 s | -6.89% |
| ❌ | Memory | dd_copy_separate_blocks |
185.4 KB | 194.8 KB | -4.83% |
| ❌ |
Simulation | hostname_ip_lookup[100000] |
169.5 µs | 177.2 µs | -4.32% |
| ⚡ |
Simulation | cksum_crc |
33.6 ms | 32.6 ms | +3.25% |
| ⚡ |
Simulation | cksum_default |
33.9 ms | 32.8 ms | +3.13% |
Tip
Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.
Comparing abendrothj:mv-special-files-in-moved-dirs (5b7ce0f) with main (6292c03)
Footnotes
-
54 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
1091c4d to
60d24ea
Compare
Move the temporary name and renameat logic of replace_link into replace_entry_at, which creates the entry through a callback relative to an open directory, so other callers can replace entries the same way. The parent is now opened with DirFd::open_anchor, so ln -sf replacing a link in a directory with write and search but no read permission works, as it does with GNU, instead of failing with EACCES.
Create fifos, sockets and device nodes relative to an open directory. nix and rustix do not provide mknodat on Apple targets, so this calls libc directly.
A cross-device move of a socket or device node went through the regular file copy, which removed the destination and then failed to open the source. A fifo also removed the destination before creating the new one, and lost its mode. Fifos, sockets and device nodes are now created with their mode and ownership in a private directory next to the destination and renamed over it, so the destination is kept if the node cannot be created, and the ownership and mode cannot land on another file linked over the destination name meanwhile. The private directory is made 0700 by name right after it is created, before it is opened, without changing the umask; the check after the open rejects a directory moved there in between. As for regular files, setuid and setgid are dropped when the ownership cannot be kept. Fixes uutils#13145
Sockets and device nodes inside a directory moved across devices went through the regular file copy, which cannot open them, so the move failed. Fifos were recreated with mode 0666 minus the umask. Recreate all of them with copy_special_file, which keeps the mode.
60d24ea to
5b7ce0f
Compare
Sockets and device nodes inside a directory moved across devices went through the regular file copy, which can't open them, so the move failed. FIFOs were recreated with mode 0666 minus the umask. All of them now go through
copy_special_file, which keeps the mode. Run on macOS and Linux. On Debian GNU/Hurd the mv tests fail only where main does (the new ones are Linux-only), and a cross-device move of a 0640 FIFO, alone or in a directory, keeps its mode as with GNU 9.10. AIX is only cross-checked with clippy.Based on #13334.
Closes #15113
Related to #13145