-
Notifications
You must be signed in to change notification settings - Fork 13.8k
minimal dirfd implementation (1/4) #146341
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
c3278f6
to
6982a46
Compare
This comment has been minimized.
This comment has been minimized.
6982a46
to
313c731
Compare
This comment has been minimized.
This comment has been minimized.
313c731
to
1b3d7d6
Compare
This comment has been minimized.
This comment has been minimized.
1b3d7d6
to
be0d761
Compare
@ChrisDenton I'll need your help for the Windows review |
be0d761
to
3083d58
Compare
@rustbot ready |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks pretty good to me, just a few mechanical things here. There are a couple left over from the previous review, #146341 (comment), #146341 (comment), and (newly) #146341 (comment).
let mut handle = ptr::null_mut(); | ||
let mut io_status = c::IO_STATUS_BLOCK::PENDING; | ||
let access = opts.get_access_mode()? | c::SYNCHRONIZE; | ||
let options = create_options | c::FILE_SYNCHRONOUS_IO_NONALERT; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you add a note about why this flag is set?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I no longer remember why I chose this one, and looking at it now, I'm not sure whether we should set this one, FILE_SYNCHRONOUS_IO_ALERT
, or neither. Maybe @ChrisDenton has thoughts?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update, using neither causes an error, so I've added back FILE_SYNCHRONOUS_IO_NONALERT
From the top post:
I think it would be fine to include the
That is quite alright, there is no hurry :) For reference, the |
This comment was marked as outdated.
This comment was marked as outdated.
minimal dirfd implementation (1/4) try-job: aarch64-apple try-job: dist-various* try-job: test-various* try-job: x86_64-msvc* try-job: x86_64-mingw
This comment has been minimized.
This comment has been minimized.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
minimal dirfd implementation (1/4) try-job: aarch64-apple try-job: dist-various* try-job: test-various* try-job: x86_64-msvc* try-job: x86_64-mingw*
This comment has been minimized.
This comment has been minimized.
💔 Test for ba4037e failed: CI. Failed jobs:
|
@@ -1,5 +1,6 @@ | |||
use rand::RngCore; | |||
|
|||
use super::Dir; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This needs a gate on miri
to not be unused
20bd04e
to
73435f8
Compare
@bors2 try |
minimal dirfd implementation (1/4) try-job: aarch64-apple try-job: dist-various* try-job: test-various* try-job: x86_64-msvc* try-job: x86_64-mingw*
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
💔 Test for 26d8112 failed: CI. Failed jobs:
|
1f8f886
to
109188b
Compare
@bors2 try |
This comment has been minimized.
This comment has been minimized.
minimal dirfd implementation (1/4) try-job: aarch64-apple try-job: dist-various* try-job: test-various* try-job: x86_64-msvc* try-job: x86_64-mingw*
This comment has been minimized.
This comment has been minimized.
💔 Test for d36ef83 failed: CI. Failed jobs:
|
109188b
to
a37578d
Compare
if path.is_absolute() { | ||
return File::open(path, opts); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does nt_create_file
not accept absolute paths if a root is specified? A comment about why this is needed would be helpful.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When the check is removed (and add the check shown in the error message), I get this error.
thread 'fs::tests::test_dir_read_file' (6364) panicked at library\std\src\fs\tests.rs:2251:17:
dir.open_file(tmpdir.join("foo.txt")) failed with: The filename, directory name, or volume label syntax is incorrect. (os error 123)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Huh, does calling maybe_verbatim
make a difference? Speculating, but maybe it doesn't like the Unix path join. Could you maybe debug dump the buffer from object_attributes.ObjectName
in nt_create_file
to see what it's trying to open?
and add the check shown in the error message
Which check is this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
dir.open_file(tmpdir.join("foo.txt"))
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure what you mean by unix path join. TempDir::join
calls out to Path::join
, which uses PathBuf::push
, which appears to have lots of Windows-specific logic (although it's largely not cfg-gated, so I could be wrong).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I confirmed that the path it's attempting to open is consistent with tmpdir path + "foo.txt".
For reference (from https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile describing RootDirectory):
If this value is non-NULL, the ObjectName member specifies a file name relative to this directory.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was thinking that .join()
used a forward slash separator even on Windows - but I guess that's not accurate, looks like MAIN_SEP_STR
is used. It would still be good to print it if you're able, to make sure it looks like a valid path, and to try to repro in C.
The error condition still seems weird - I don't see any mention of absolute paths at https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile. We should at least be able to explain what's going on before adding our own check.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you see my last message? I haven't reproduced in C, but I'm not sure I want to in a VM. The quote in my previous message seems ambiguous to me, so I'm not super surprised that it's a hard error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indeed I did not thanks. GH never seems to let me know if a new message appears while I'm typing.
Started some scratch work to test this out (not yet working for relative paths either though) https://godbolt.org/z/x81M1jdvf.
@bors2 try |
This comment has been minimized.
This comment has been minimized.
minimal dirfd implementation (1/4) try-job: aarch64-apple try-job: dist-various* try-job: test-various* try-job: x86_64-msvc-1 try-job: x86_64-mingw*
a37578d
to
cfbcd8b
Compare
library/std/src/fs/tests.rs
Outdated
use crate::test_helpers::{TempDir, tmpdir}; | ||
use crate::time::{Duration, Instant, SystemTime}; | ||
use crate::{env, str, thread}; | ||
use crate::{env, io, str, thread}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
io
needs the cfg(not(miri))
gate as well
Status update: the current implementation looks pretty good to me, but I'd Chris or somebody more familiar with Windows to take a look at that bit. It would still be good to add comments about the flags used to make the incantation a bit less magic without referring to the docs (e.g. FILE_SYNCHRONOUS_IO_NONALERT, FILE_FLAG_BACKUP_SEMANTICS). |
cfbcd8b
to
18a93b3
Compare
@ChrisDenton would you be able to take a look at the windows impl here? Feel free to punt this bit to somebody else as well, just needs a second set of eyes since I'm not super familiar here. |
@ChrisDenton friendly ping |
This is the first of four smaller PRs that will eventually be equivalent to #139514.
A few notes:
new
toopen
becauseopen_dir
takes&self
and opens a subdirectory.open
toopen_file
.impl AsRawFd
and friends because thecommon
implementation usesPathBuf
s. How should I proceed here?The other PRs will be based on this one, so I'll make drafts and mark them ready as their predecessors get merged. They might take a bit though; I've never done this particular thing with git before.
Tracking issue: #120426
r? @tgross35
try-job: aarch64-apple
try-job: dist-various*
try-job: test-various*
try-job: x86_64-msvc-1
try-job: x86_64-mingw*