[PATCH][SMB3] check for and properly advertise directory lease support

ronnie sahlberg ronniesahlberg at gmail.com
Fri Aug 31 20:35:15 UTC 2018


Reviewed-by: Ronnie Sahlberg <lsahlber at redhat.com>


On Sat, Sep 1, 2018 at 6:24 AM, Steve French <smfrench at gmail.com> wrote:
> Although servers will typically ignore unsupported features,
> we should advertise the support for directory leases (as
> Windows e.g. does) in the negotiate protocol capabilities we
> pass to the server, and should check for the server capability
> (CAP_DIRECTORY_LEASING) before sending a lease request for an
> open of a directory.  This will prevent us from accidentally
> sending directory leases to SMB2.1 or SMB2 server for example.
>
> Signed-off-by: Steve French <stfrench at microsoft.com>
> CC: Stable <stable at vger.kernel.org>
> ---
>  fs/cifs/smb2ops.c | 10 +++++-----
>  fs/cifs/smb2pdu.c |  3 +++
>  2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 32cae6e49ea2..23118b7a2bbc 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -3654,7 +3654,7 @@ struct smb_version_values smb21_values = {
>  struct smb_version_values smb3any_values = {
>      .version_string = SMB3ANY_VERSION_STRING,
>      .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
> -    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION,
> +    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
>      .large_lock_type = 0,
>      .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
>      .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
> @@ -3675,7 +3675,7 @@ struct smb_version_values smb3any_values = {
>  struct smb_version_values smbdefault_values = {
>      .version_string = SMBDEFAULT_VERSION_STRING,
>      .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
> -    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION,
> +    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
>      .large_lock_type = 0,
>      .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
>      .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
> @@ -3696,7 +3696,7 @@ struct smb_version_values smbdefault_values = {
>  struct smb_version_values smb30_values = {
>      .version_string = SMB30_VERSION_STRING,
>      .protocol_id = SMB30_PROT_ID,
> -    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION,
> +    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
>      .large_lock_type = 0,
>      .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
>      .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
> @@ -3717,7 +3717,7 @@ struct smb_version_values smb30_values = {
>  struct smb_version_values smb302_values = {
>      .version_string = SMB302_VERSION_STRING,
>      .protocol_id = SMB302_PROT_ID,
> -    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION,
> +    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
>      .large_lock_type = 0,
>      .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
>      .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
> @@ -3738,7 +3738,7 @@ struct smb_version_values smb302_values = {
>  struct smb_version_values smb311_values = {
>      .version_string = SMB311_VERSION_STRING,
>      .protocol_id = SMB311_PROT_ID,
> -    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION,
> +    .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING
> | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES |
> SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
>      .large_lock_type = 0,
>      .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
>      .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index 2ddee7c9c7bf..f6b27bd9b788 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -2178,6 +2178,9 @@ SMB2_open_init(struct cifs_tcon *tcon, struct
> smb_rqst *rqst, __u8 *oplock,
>      if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) ||
>          *oplock == SMB2_OPLOCK_LEVEL_NONE)
>          req->RequestedOplockLevel = *oplock;
> +    else if (!(server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) &&
> +          (oparms->create_options & CREATE_NOT_FILE))
> +        req->RequestedOplockLevel = *oplock; /* no srv lease support */
>      else {
>          rc = add_lease_context(server, iov, &n_iov,
>                         oparms->fid->lease_key, oplock);
> --
> 2.17.1
>
>
> --
> Thanks,
>
> Steve



More information about the samba-technical mailing list