2017-02-23 6:43 GMT-08:00 Aurelien Aptel <aaptel@xxxxxxxx>: > This series of patch tries to implement the get_dfs_refer operation > for SMB2+. > > In SMB2+, DFS resolving is now done through an FSCTL (patch #3). The > relevant Microsoft specifications for this are: > > MS-SMB2: 3.2.4.20 Application Requests an IO Control Code Operation > MS-SMB2: 3.2.4.20.3 Application Requests DFS Referral Information > MS-SMB2: 3.2.5.14 Receiving an SMB2 IOCTL Response > MS-SMB2: 3.2.5.14.4 Handling a DFS Referral Information Response > > MS-DFSC: 2.2 Message Syntax (but really the whole document is useful) > > The DFS response payload however is identical. Patch #1 moves the > DFS response parsing out of SMB1 code and makes it work on any version > of SMB. > > DFS code has 2 "main" entry points: initial mounting and automount > (when a DFS link is accessed/traversed). > > When automounting, cifs.ko calls build_path_from_dentry() which only > makes treename-prefixed paths when the tcon has the > SMB_IN_DFS_SHARE. This flag is checked in tcon->Flags which is never > touched by SMB2 code as it sets tcon->share_flags on connexion. > > * CIFS requires to prefix all pathnames with the treename prefix when > connected to a DFS server, so the current build_path_from_dentry() > makes sense for CIFS. > * For SMB2+ it seems only the Create request requires the treename > prefix. Simply making the function check for both CIFS SMB2+ flag > for DFS to add a prefix does not work as the server has different > expectations about which packet can have/require a DFS pathname. > > Patch #2 adds build_path_from_dentry_optional_prefix() with an extra > bool arg to decide to prefix or not. The automount code path always > ask for it. Patch #5 modifies SMB2_open() to add the treename prefix > to the given path if the server requires it. > > As part of the mouting process a IPC tcon is made (I suspect we don't > need it anymore in SMB3). This tcon doesn't respect the signing > requirement. This is fixed by patch #4. > > Finally the SMB2+ implementation of the get_dfs_referral operation is > added in all supported SMB versions in patch #6. > > I've sucessfuly tested this against a Windows Server 2016 DFS > setup. Samba requires a patch as currently it only accepts DFS > referrals requests on an IPC connexion, which is in violation of the > spec. A patch was sent on samba-technical: > > https://lists.samba.org/archive/samba-technical/2017-February/118859.html > > Changes since v1: > > * The fsctl is made on the first available tcon to the server, which > is allowed by the spec. This way we avoid hardcoding additional > rules in SMB2_ioctl(). > * add signing flag in smb2 header if required > * no copy/pasting, the DFS parsing code is now generic and works for > both SMB versions > * add treename prefix in SMB2_open() when required > > Aurelien Aptel (6): > CIFS: move DFS response parsing out of SMB1 code > CIFS: add build_path_from_dentry_optional_prefix() > CIFS: implement get_dfs_refer for SMB2+ > CIFS: set signing flag in SMB2+ TreeConnect if needed > CIFS: use DFS pathnames in SMB2+ Create requests > CIFS: enable get_dfs_refer for SMB2+ > > fs/cifs/cifs_dfs_ref.c | 4 +- > fs/cifs/cifspdu.h | 16 ++++--- > fs/cifs/cifsproto.h | 7 +++ > fs/cifs/cifssmb.c | 119 +++---------------------------------------------- > fs/cifs/dir.c | 13 +++++- > fs/cifs/misc.c | 105 +++++++++++++++++++++++++++++++++++++++++++ > fs/cifs/smb2ops.c | 76 +++++++++++++++++++++++++++++++ > fs/cifs/smb2pdu.c | 97 ++++++++++++++++++++++++++++++++-------- > fs/cifs/smb2pdu.h | 8 ++++ > 9 files changed, 305 insertions(+), 140 deletions(-) > > -- > 2.10.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html I would merge patches #3 and #6 because a static function which is introduced in #3 should raise compiler warnings. Other than that the patchset looks good. Reviewed-by: Pavel Shilovsky <pshilov@xxxxxxxxxxxxx> -- Best regards, Pavel Shilovsky -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html