[Patch] dosmode: Compare block devices to detect reparse points
James Ashdown
james at et.byu.edu
Mon Jan 28 23:40:08 UTC 2019
Noel,
I'm attaching a revision of the patch that makes use of your idea to
re-use the parent directory stat on a FIND operation. Turns out that it
works beautifully, no additional stat calls needed there.
However, I encountered a snag when I implemented just that. It seems
that when a Windows 10 File Explorer client opens a reparsepoint-marked
directory sends a CREATE request targeting that directory, the client
overwrites its reparsepoint state for that directory. In effect, if you
enter a directory and then quickly leave and re-enter it, write and copy
operations "forget" that there was ever a reparsepoint file attribute set.
To fix that, I mimicked the CREATE flag that Windows File Server
returns. This is not in the file attributes bit field, but has the
effect of preserving the set FILE_ATTRIBUTE_REPARSEPOINT returned in the
FIND response. Detecting the mountpoint here requires an additional stat
for each CREATE that targets a directory.
Let me know what you think.
James
On 12/5/18 04:57, Noel Power wrote:
> Hi Jeremy
> On 04/12/2018 22:55, Jeremy Allison wrote:
>> On Tue, Dec 04, 2018 at 10:46:13PM +0000, Noel Power wrote:
>>>> We set it on MS-DFS links because we handle them the right way
>>>> in smbd on client query.
>>> I'll have to look into it but I don't see (like you said) any
>>> handling of
>>> FILE_OPEN_REPARSE_POINT for the tag IO_REPARSE_TAG_DFS So.. not sure
>>> which
>>> MS-DFS client queries you mean (but I know practically nothing about
>>> DFS)
>> Well you can't query IO_REPARSE_TAG_DFS over the network. Once it
>> hits an MS-DFS reparse point it returns the required error on
>> processing the pathname inside smbd - that's what I mean by
>> MS-DFS client queries :-).
>>
>>> well we could handle FILE_OPEN_REPARSE_POINT at least for
>>> mountpoints (only
>>> if we have a config option for it set) iirc when opening a reparse
>>> point you
>>> just need to return the tag associated with the reparse point (in
>>> this case
>>> IO_REPARSE_TAG_MOUNT_POINT) if and only if the file
>> No, it's much nastier than that. Reparse points have a hideously
>> complex set of requirements (you can mkdir, turn into a reparse
>> point, open it, remove the reparse tag, turn it back into a directory
>> etc. etc. etc.). And that's just for directories. The same thing
>> happens for files.
>
> But we are not trying to implement or handle any of what you are
> mentioning above, what I am suggesting here is to provide just a very
> very tight limited READ-ONLY handling of requests to do with
> IO_REPARSE_TAG_MOUNT_POINT type tags, nothing else
>
> If we want to handle open then we only handle it for a directory that
> *is* a mountpoint *and* if the appropriate config is set, otherwise do
> whatever we do currently (nothing or error)
>
> If we wish to allow the reparse point to be read (again only handle
> IO_REPARSE_TAG_MOUNT_POINTs) then its only a case of handling
> FSCTL_GET_REPARSE_POINT requests depending on the file handle (if it
> points to a mountpoint with the appropriate configuration set)
> otherwise reject or error out as appropriate
>
> The data to be provided is quite simple (see
> https://msdn.microsoft.com/en-us/library/cc232007.aspx)
>> Once we start returning FILE_ATTRIBUTE_REPARSE_POINT we've opened
>> a hideous can of worms. That's why in my POSIX tree I restrict
>> allowing reparse points to zero-length files only, no directories,
>> on a POSIX open handle only.
>>
>> You're planning to gung-ho add FILE_ATTRIBUTE_REPARSE_POINT to
>> a directory DOS attribute value. That's my nightmare :-).
> I'm not (or at least I don't think I am :-)) the patch adds
> FILE_ATTRIBUTE_REPARSE_POINT only for shares that have the the feature
> enabled and where a particular directory is seen to be a mountpoint.
> Even without supporting FILE_OPEN_REPARSE_POINT I still don't see this
> is much different from what we do for DFS currently
>
> Noel
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Detect-volume-mountpoint-reparsepoints-for-FIND-and-.patch
Type: text/x-patch
Size: 9601 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20190128/8d4a227a/0001-Detect-volume-mountpoint-reparsepoints-for-FIND-and-.bin>
More information about the samba-technical
mailing list