Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[sfrench/cifs-2.6.git] / fs / cifs / smb2misc.c
index 7b8b58fb4d3fbdcf898d306a585c7332cd2c0ef5..0e3570e40ff8e8d233389063290ccdecdfb44a25 100644 (file)
@@ -517,7 +517,6 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp,
        __u8 lease_state;
        struct list_head *tmp;
        struct cifsFileInfo *cfile;
-       struct TCP_Server_Info *server = tcon->ses->server;
        struct cifs_pending_open *open;
        struct cifsInodeInfo *cinode;
        int ack_req = le32_to_cpu(rsp->Flags &
@@ -537,13 +536,25 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp,
                cifs_dbg(FYI, "lease key match, lease break 0x%x\n",
                         le32_to_cpu(rsp->NewLeaseState));
 
-               server->ops->set_oplock_level(cinode, lease_state, 0, NULL);
-
                if (ack_req)
                        cfile->oplock_break_cancelled = false;
                else
                        cfile->oplock_break_cancelled = true;
 
+               set_bit(CIFS_INODE_PENDING_OPLOCK_BREAK, &cinode->flags);
+
+               /*
+                * Set or clear flags depending on the lease state being READ.
+                * HANDLE caching flag should be added when the client starts
+                * to defer closing remote file handles with HANDLE leases.
+                */
+               if (lease_state & SMB2_LEASE_READ_CACHING_HE)
+                       set_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2,
+                               &cinode->flags);
+               else
+                       clear_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2,
+                                 &cinode->flags);
+
                queue_work(cifsoplockd_wq, &cfile->oplock_break);
                kfree(lw);
                return true;
@@ -648,13 +659,6 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
        if (rsp->sync_hdr.Command != SMB2_OPLOCK_BREAK)
                return false;
 
-       if (rsp->sync_hdr.CreditRequest) {
-               spin_lock(&server->req_lock);
-               server->credits += le16_to_cpu(rsp->sync_hdr.CreditRequest);
-               spin_unlock(&server->req_lock);
-               wake_up(&server->request_q);
-       }
-
        if (rsp->StructureSize !=
                                smb2_rsp_struct_sizes[SMB2_OPLOCK_BREAK_HE]) {
                if (le16_to_cpu(rsp->StructureSize) == 44)