filesystems mounted within an SMB share and REPARSE_TAG_MOUNT_POINT

Daniel Fussell dfussell at byu.edu
Thu Mar 2 00:51:54 UTC 2023


On 3/1/23 12:08, Jeremy Allison via samba-technical wrote:
> On Wed, Feb 22, 2023 at 03:30:04PM -0600, Andrew Walker via 
> samba-technical wrote:
>> I was recently reviewing fileid behavior in Samba for ZFS datasets 
>> mounted
>> within an SMB share and decided to see how a Windows server handles 
>> such a
>> situation (by mounting a separate NTFS volume within an SMB share on 
>> Server
>> 2022 and poking around at it). I can provide pcaps for the morbidly 
>> curious.
>>
>> SUBDS on Windows Server:
>> ```
>> PS C:\SHARE> Get-Item .\SUBDS | format-list
>>
>>
>>    Directory: C:\SHARE
>>
>>
>>
>> Name           : SUBDS
>> CreationTime   : 2/22/2023 10:45:52 AM
>> LastWriteTime  : 2/22/2023 10:45:52 AM
>> LastAccessTime : 2/22/2023 10:45:52 AM
>> Mode           : d----l
>> LinkType       : Junction
>> Target         : {Volume{5afcf2e4-f78f-4931-bfb1-a657a2577d06}\}
>> ```
>>
>> SMB2 QUERY_DIRECTORY with FileIdBothDirectoryInfo has
>> FILE_ATTRIBUTE_REPARSE_POINT set as well as REPARSE_TAG_MOUNT_POINT.
>> ```
>> FileIdBothDirectoryInfo: SUBDS
>>    Next Offset: 0
>>    File Index: 0x00000000
>>    Create: Feb 22, 2023 10:45:52.500407200 Pacific Standard Time
>>    Last Access: Feb 22, 2023 10:45:52.500407200 Pacific Standard Time
>>    Last Write: Feb 22, 2023 10:45:52.500407200 Pacific Standard Time
>>    Last Change: Feb 22, 2023 10:45:56.880741900 Pacific Standard Time
>>    End Of File: 0
>>    Allocation Size: 0
>>    File Attributes: 0x00000410
>>    Filename Length: 10
>>    Reparse Tag: REPARSE_TAG_MOUNT_POINT (0xa0000003)
>>    Short Name Length: 0
>>    Reserved: 00
>>    Reserved: 0000
>>    File Id: 0x001e00000000b590
>>    Filename: SUBS
>> ```
>>
>> FILE_ATTRIBUTE_REPARSE_POINT is also set in File Attributes on SMB2 
>> CREATE
>> response.
>>
>> Samba currently uses the device ID and inode number to generate 
>> 64-bit file
>> ids in subordinate filesystems within an SMB share, but it seems like 
>> this
>> can lead to potential collisions. Windows, for instance, appears to 
>> make no
>> change to the 64-bit file IDs returned for NTFS volumes mounted 
>> within an
>> SMB share.
>>
>> So this is a long way of asking, should we be flagging mounted 
>> filesystems
>> as reparse points and not altering the inode numbers?
>>
>> The advantages of this are:
>> 1. Windows File Explorer GUI clearly labels as a mounted filesystem 
>> and not
>> a directory
>> 2. Windows File Explorer GUI clearly shows size of the filesystem
>> separately from one being shared.
>> 3. REPARSE_TAG_MOUNT_POINT can be used by SMB clients to judge 
>> whether the
>> particular fileid should maybe be treated differently (since it may 
>> collide
>> with other volume mountpoints). (not sure if any non-MS clients do 
>> this).
>
> Very interesting findings Andrew, thanks !
>
> This does indeed look like the correct way forward to cope
> with traversing mount points, but the devil (as always) is
> in the details.
>
> Prototype code for this would be the next step IMHO.
>
> Jeremy.
>

I've got a new student employee forward-porting our patch from late 
2018/early 2019 for mountpoint detection and setting 
REPARSE_TAG_MOUNT_POINT.

Our first porting attempt didn't seem to work, I'm guessing because of 
the rewite to use *at() and different code paths.  We'd love to work 
with you on this.

Daniel



More information about the samba-technical mailing list