Reviewed-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx> On Sat, Sep 1, 2018 at 6:24 AM, Steve French <smfrench@xxxxxxxxx> 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@xxxxxxxxxxxxx> > CC: Stable <stable@xxxxxxxxxxxxxxx> > --- > 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