]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Revert "Handle mismatched open calls"
authorThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Mon, 8 May 2017 17:37:15 +0000 (14:37 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Wed, 28 Jun 2017 13:18:34 +0000 (10:18 -0300)
BugLink: http://bugs.launchpad.net/bugs/1670508
This reverts commit 35067b7fba326a76624769e03afeb4b5ff182041.

The revert is in favor of cherry-picking the upstream commit, so the
rest of the patchset can apply.

Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
fs/cifs/cifsglob.h
fs/cifs/cifssmb.c
fs/cifs/connect.c
fs/cifs/smb2misc.c
fs/cifs/smb2ops.c
fs/cifs/smb2proto.h
fs/cifs/smb2transport.c
fs/cifs/transport.c

index e2f6a79e9b012d695a33c90b684b3eaafa1cb6b2..94906aaa9b7c5ce3e3e6127427e9d9df04bc397f 100644 (file)
@@ -227,7 +227,6 @@ struct smb_version_operations {
        /* verify the message */
        int (*check_message)(char *, unsigned int);
        bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
-       int (*handle_cancelled_mid)(char *, struct TCP_Server_Info *);
        void (*downgrade_oplock)(struct TCP_Server_Info *,
                                        struct cifsInodeInfo *, bool);
        /* process transaction2 response */
@@ -1290,19 +1289,12 @@ struct mid_q_entry {
        void *callback_data;      /* general purpose pointer for callback */
        void *resp_buf;         /* pointer to received SMB header */
        int mid_state;  /* wish this were enum but can not pass to wait_event */
-       unsigned int mid_flags;
        __le16 command;         /* smb command code */
        bool large_buf:1;       /* if valid response, is pointer to large buf */
        bool multiRsp:1;        /* multiple trans2 responses for one request  */
        bool multiEnd:1;        /* both received */
 };
 
-struct close_cancelled_open {
-       struct cifs_fid         fid;
-       struct cifs_tcon        *tcon;
-       struct work_struct      work;
-};
-
 /*     Make code in transport.c a little cleaner by moving
        update of optional stats into function below */
 #ifdef CONFIG_CIFS_STATS2
@@ -1434,9 +1426,6 @@ static inline void free_dfs_info_array(struct dfs_info3_param *param,
 #define   MID_RESPONSE_MALFORMED 0x10
 #define   MID_SHUTDOWN          0x20
 
-/* Flags */
-#define   MID_WAIT_CANCELLED    1 /* Cancelled while waiting for response */
-
 /* Types of response buffer returned from SendReceive2 */
 #define   CIFS_NO_BUFFER        0    /* Response buffer not returned */
 #define   CIFS_SMALL_BUFFER     1
index b60150e5b5ceaab72954b82b1519bf4792fa1589..1ee7dc7ff6978cd68b305c3ae7051c230346af50 100644 (file)
@@ -1427,8 +1427,6 @@ cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 
        length = discard_remaining_data(server);
        dequeue_mid(mid, rdata->result);
-       mid->resp_buf = server->smallbuf;
-       server->smallbuf = NULL;
        return length;
 }
 
@@ -1543,8 +1541,6 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
                return cifs_readv_discard(server, mid);
 
        dequeue_mid(mid, false);
-       mid->resp_buf = server->smallbuf;
-       server->smallbuf = NULL;
        return length;
 }
 
index 1502cfd76d554ef11b402cc6bf73339ebc066537..487129f65ddd0d343bbf1899bb88651fbec6f539 100644 (file)
@@ -936,19 +936,10 @@ cifs_demultiplex_thread(void *p)
 
                server->lstrp = jiffies;
                if (mid_entry != NULL) {
-                       if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
-                            mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
-                                       server->ops->handle_cancelled_mid)
-                               server->ops->handle_cancelled_mid(
-                                                       mid_entry->resp_buf,
-                                                       server);
-
                        if (!mid_entry->multiRsp || mid_entry->multiEnd)
                                mid_entry->callback(mid_entry);
-               } else if (server->ops->is_oplock_break &&
-                          server->ops->is_oplock_break(buf, server)) {
-                       cifs_dbg(FYI, "Received oplock break\n");
-               } else {
+               } else if (!server->ops->is_oplock_break ||
+                          !server->ops->is_oplock_break(buf, server)) {
                        cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
                                 atomic_read(&midCount));
                        cifs_dump_mem("Received Data is: ", buf,
index 76ccf20fbfb7bd40773b0cb85a517e28fcf10b94..e5bc85e49be713d9148341a0339da234fc6d588e 100644 (file)
@@ -630,47 +630,3 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
        cifs_dbg(FYI, "Can not process oplock break for non-existent connection\n");
        return false;
 }
-
-void
-smb2_cancelled_close_fid(struct work_struct *work)
-{
-       struct close_cancelled_open *cancelled = container_of(work,
-                                       struct close_cancelled_open, work);
-
-       cifs_dbg(VFS, "Close unmatched open\n");
-
-       SMB2_close(0, cancelled->tcon, cancelled->fid.persistent_fid,
-                  cancelled->fid.volatile_fid);
-       cifs_put_tcon(cancelled->tcon);
-       kfree(cancelled);
-}
-
-int
-smb2_handle_cancelled_mid(char *buffer, struct TCP_Server_Info *server)
-{
-       struct smb2_hdr *hdr = (struct smb2_hdr *)buffer;
-       struct smb2_create_rsp *rsp = (struct smb2_create_rsp *)buffer;
-       struct cifs_tcon *tcon;
-       struct close_cancelled_open *cancelled;
-
-       if (hdr->Command != SMB2_CREATE || hdr->Status != STATUS_SUCCESS)
-               return 0;
-
-       cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL);
-       if (!cancelled)
-               return -ENOMEM;
-
-       tcon = smb2_find_smb_tcon(server, hdr->SessionId, hdr->TreeId);
-       if (!tcon) {
-               kfree(cancelled);
-               return -ENOENT;
-       }
-
-       cancelled->fid.persistent_fid = rsp->PersistentFileId;
-       cancelled->fid.volatile_fid = rsp->VolatileFileId;
-       cancelled->tcon = tcon;
-       INIT_WORK(&cancelled->work, smb2_cancelled_close_fid);
-       queue_work(cifsiod_wq, &cancelled->work);
-
-       return 0;
-}
index 087918c4612a870a3f459cf502a1e0ddf3d9df1b..be34b4860675f046cf8a475393eb994fe52f9fda 100644 (file)
@@ -1511,7 +1511,6 @@ struct smb_version_operations smb20_operations = {
        .clear_stats = smb2_clear_stats,
        .print_stats = smb2_print_stats,
        .is_oplock_break = smb2_is_valid_oplock_break,
-       .handle_cancelled_mid = smb2_handle_cancelled_mid,
        .downgrade_oplock = smb2_downgrade_oplock,
        .need_neg = smb2_need_neg,
        .negotiate = smb2_negotiate,
@@ -1590,7 +1589,6 @@ struct smb_version_operations smb21_operations = {
        .clear_stats = smb2_clear_stats,
        .print_stats = smb2_print_stats,
        .is_oplock_break = smb2_is_valid_oplock_break,
-       .handle_cancelled_mid = smb2_handle_cancelled_mid,
        .downgrade_oplock = smb2_downgrade_oplock,
        .need_neg = smb2_need_neg,
        .negotiate = smb2_negotiate,
@@ -1672,7 +1670,6 @@ struct smb_version_operations smb30_operations = {
        .print_stats = smb2_print_stats,
        .dump_share_caps = smb2_dump_share_caps,
        .is_oplock_break = smb2_is_valid_oplock_break,
-       .handle_cancelled_mid = smb2_handle_cancelled_mid,
        .downgrade_oplock = smb2_downgrade_oplock,
        .need_neg = smb2_need_neg,
        .negotiate = smb2_negotiate,
@@ -1760,7 +1757,6 @@ struct smb_version_operations smb311_operations = {
        .print_stats = smb2_print_stats,
        .dump_share_caps = smb2_dump_share_caps,
        .is_oplock_break = smb2_is_valid_oplock_break,
-       .handle_cancelled_mid = smb2_handle_cancelled_mid,
        .downgrade_oplock = smb2_downgrade_oplock,
        .need_neg = smb2_need_neg,
        .negotiate = smb2_negotiate,
index adc5234486c37b979ddeea1d834818a6f0ecef4d..0a406ae78129a3fbd5676a426ca0562bd5eaea23 100644 (file)
@@ -47,10 +47,6 @@ extern struct mid_q_entry *smb2_setup_request(struct cifs_ses *ses,
                              struct smb_rqst *rqst);
 extern struct mid_q_entry *smb2_setup_async_request(
                        struct TCP_Server_Info *server, struct smb_rqst *rqst);
-extern struct cifs_ses *smb2_find_smb_ses(struct TCP_Server_Info *server,
-                                          __u64 ses_id);
-extern struct cifs_tcon *smb2_find_smb_tcon(struct TCP_Server_Info *server,
-                                               __u64 ses_id, __u32  tid);
 extern int smb2_calc_signature(struct smb_rqst *rqst,
                                struct TCP_Server_Info *server);
 extern int smb3_calc_signature(struct smb_rqst *rqst,
@@ -161,9 +157,6 @@ extern int SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
 extern int SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon,
                             const u64 persistent_fid, const u64 volatile_fid,
                             const __u8 oplock_level);
-extern int smb2_handle_cancelled_mid(char *buffer,
-                                       struct TCP_Server_Info *server);
-void smb2_cancelled_close_fid(struct work_struct *work);
 extern int SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
                         u64 persistent_file_id, u64 volatile_file_id,
                         struct kstatfs *FSData);
index 69e3b322bbfe630a41b30ae09e309e654b7ee6a0..d4c5b6f109a7feaa6f2c99f21ca332ff41a2673f 100644 (file)
@@ -115,68 +115,22 @@ smb3_crypto_shash_allocate(struct TCP_Server_Info *server)
 }
 
 static struct cifs_ses *
-smb2_find_smb_ses_unlocked(struct TCP_Server_Info *server, __u64 ses_id)
+smb2_find_smb_ses(struct smb2_hdr *smb2hdr, struct TCP_Server_Info *server)
 {
        struct cifs_ses *ses;
 
+       spin_lock(&cifs_tcp_ses_lock);
        list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
-               if (ses->Suid != ses_id)
+               if (ses->Suid != smb2hdr->SessionId)
                        continue;
+               spin_unlock(&cifs_tcp_ses_lock);
                return ses;
        }
-
-       return NULL;
-}
-
-struct cifs_ses *
-smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id)
-{
-       struct cifs_ses *ses;
-
-       spin_lock(&cifs_tcp_ses_lock);
-       ses = smb2_find_smb_ses_unlocked(server, ses_id);
        spin_unlock(&cifs_tcp_ses_lock);
 
-       return ses;
-}
-
-static struct cifs_tcon *
-smb2_find_smb_sess_tcon_unlocked(struct cifs_ses *ses, __u32  tid)
-{
-       struct cifs_tcon *tcon;
-
-       list_for_each_entry(tcon, &ses->tcon_list, tcon_list) {
-               if (tcon->tid != tid)
-                       continue;
-               ++tcon->tc_count;
-               return tcon;
-       }
-
        return NULL;
 }
 
-/*
- * Obtain tcon corresponding to the tid in the given
- * cifs_ses
- */
-
-struct cifs_tcon *
-smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id, __u32 tid)
-{
-       struct cifs_ses *ses;
-       struct cifs_tcon *tcon;
-
-       spin_lock(&cifs_tcp_ses_lock);
-       ses = smb2_find_smb_ses_unlocked(server, ses_id);
-       if (!ses) {
-               spin_unlock(&cifs_tcp_ses_lock);
-               return NULL;
-       }
-       tcon = smb2_find_smb_sess_tcon_unlocked(ses, tid);
-       spin_unlock(&cifs_tcp_ses_lock);
-
-       return tcon;
-}
 
 int
 smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
@@ -189,7 +143,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
        struct smb2_hdr *smb2_pdu = (struct smb2_hdr *)iov[0].iov_base;
        struct cifs_ses *ses;
 
-       ses = smb2_find_smb_ses(server, smb2_pdu->SessionId);
+       ses = smb2_find_smb_ses(smb2_pdu, server);
        if (!ses) {
                cifs_dbg(VFS, "%s: Could not find session\n", __func__);
                return 0;
@@ -360,7 +314,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
        struct smb2_hdr *smb2_pdu = (struct smb2_hdr *)iov[0].iov_base;
        struct cifs_ses *ses;
 
-       ses = smb2_find_smb_ses(server, smb2_pdu->SessionId);
+       ses = smb2_find_smb_ses(smb2_pdu, server);
        if (!ses) {
                cifs_dbg(VFS, "%s: Could not find session\n", __func__);
                return 0;
index 54af10204e83c6c3e6d53515c203b3ecf0f49f1e..87abe8ed074c31962a969b178d55757e44bdc0d5 100644 (file)
@@ -786,11 +786,9 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
 
        rc = wait_for_response(ses->server, midQ);
        if (rc != 0) {
-               cifs_dbg(FYI, "Cancelling wait for mid %llu\n", midQ->mid);
                send_cancel(ses->server, buf, midQ);
                spin_lock(&GlobalMid_Lock);
                if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
-                       midQ->mid_flags |= MID_WAIT_CANCELLED;
                        midQ->callback = DeleteMidQEntry;
                        spin_unlock(&GlobalMid_Lock);
                        cifs_small_buf_release(buf);