On 12/6/2019 9:34 AM, Corinna Vinschen wrote: > On Dec 6 12:07, Corinna Vinschen wrote: >> Right. Cygwin uses a simple mechanism to check the drives to show >> under /cygdrive. Basically it just calls the Win32 function >> GetLogicalDriveStrings(), then, for each drive, it checks the >> QueryDosDevice mapping. Right now it only accepts cdrom, floppy, >> harddrive, LanmanRedirector (SMB) and MRxNfs (NFS). All other >> drive types are treated as "no disk". This is fixable with probably not >> too much effort. > > Ah, yes, there's a problem. When listing /cygdrive, we're trying to do > this as quick as possible. For network drives, we check if they are > available using a function NetUseGetInfo, which only takes a few ms, > even if the drive is unavailable. > > As soon as this function returns the state "disconnected", Cygwin > skips the drive in /cygdrive. > > However, this function does not know anything about client side caching > (CSC). To find out if the drive is available via CSC, the drive > has to be opened and checked for filesystem information, which reflects > the state that the filesystem is still available offline. > > The problem with this approach is, it would have to be called for > each unavailable drive in /cygdrive. This takes multiple secs per > drive. That's exacly what we tried to avoid when calling the > aforementioned NetUseGetInfo function in the first place. > > Checking for a CSC-ed drive when disconnected would make /cygdrive > listing very slow, just as in the old days...
I don't have any words of wisdom here, but I need to correct something I said earlier. On 12/4/2019 3:50 PM, Ken Brown wrote: > I don't have time to check this carefully at the moment, but it looks like > what's happening is the following: > > path_conv::check is called on 'Z:\'. It strips the trailing backslash and > calls > mount_info::conv_to_win32_path on 'Z:'. NtCreateFile fails with > STATUS_OBJECT_NAME_NOT_FOUND, which triggers the code containing the > assertion. > The assertion fails because 'Z:' doesn't contain a backslash. This is not quite right. It's true that path_conv::check strips the trailing backslash from Z:\, but then it adds it back before calling symlink_info::check: /* If path is only a drivename, Windows interprets it as the current working directory on this drive instead of the root dir which is what we want. So we need the trailing backslash in this case. */ if (full_path[0] && full_path[1] == ':' && full_path[2] == '\0') { full_path[2] = '\\'; full_path[3] = '\0'; } Thus symlink_info::check is in fact called on Z:\, but the assertion fails because the code at path.cc:2905 is looking for a backslash prior to the trailing backslash. So maybe the right fix for the assertion failure is the following: --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2895,7 +2895,8 @@ restart: slow down normal operation. This extra check only kicks in if we encountered a STATUS_OBJECT_NAME_NOT_FOUND *and* we didn't already attach a suffix. */ - if (!restarted && !*ext_here && !(mount_flags & MOUNT_DOS)) + if (!restarted && !*ext_here && ext_here[-1] != '\\' + && !(mount_flags & MOUNT_DOS)) { /* Check for trailing dot or space or leading space in last component. */ Ken -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple