diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/transport.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index b9eb0cffa003..801726b11e1e 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -63,9 +63,6 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) | |||
63 | 63 | ||
64 | atomic_inc(&midCount); | 64 | atomic_inc(&midCount); |
65 | temp->midState = MID_REQUEST_ALLOCATED; | 65 | temp->midState = MID_REQUEST_ALLOCATED; |
66 | spin_lock(&GlobalMid_Lock); | ||
67 | list_add_tail(&temp->qhead, &server->pending_mid_q); | ||
68 | spin_unlock(&GlobalMid_Lock); | ||
69 | return temp; | 66 | return temp; |
70 | } | 67 | } |
71 | 68 | ||
@@ -75,10 +72,7 @@ DeleteMidQEntry(struct mid_q_entry *midEntry) | |||
75 | #ifdef CONFIG_CIFS_STATS2 | 72 | #ifdef CONFIG_CIFS_STATS2 |
76 | unsigned long now; | 73 | unsigned long now; |
77 | #endif | 74 | #endif |
78 | spin_lock(&GlobalMid_Lock); | ||
79 | midEntry->midState = MID_FREE; | 75 | midEntry->midState = MID_FREE; |
80 | list_del(&midEntry->qhead); | ||
81 | spin_unlock(&GlobalMid_Lock); | ||
82 | atomic_dec(&midCount); | 76 | atomic_dec(&midCount); |
83 | if (midEntry->largeBuf) | 77 | if (midEntry->largeBuf) |
84 | cifs_buf_release(midEntry->resp_buf); | 78 | cifs_buf_release(midEntry->resp_buf); |
@@ -103,6 +97,16 @@ DeleteMidQEntry(struct mid_q_entry *midEntry) | |||
103 | mempool_free(midEntry, cifs_mid_poolp); | 97 | mempool_free(midEntry, cifs_mid_poolp); |
104 | } | 98 | } |
105 | 99 | ||
100 | static void | ||
101 | delete_mid(struct mid_q_entry *mid) | ||
102 | { | ||
103 | spin_lock(&GlobalMid_Lock); | ||
104 | list_del(&mid->qhead); | ||
105 | spin_unlock(&GlobalMid_Lock); | ||
106 | |||
107 | DeleteMidQEntry(mid); | ||
108 | } | ||
109 | |||
106 | static int | 110 | static int |
107 | smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) | 111 | smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) |
108 | { | 112 | { |
@@ -308,6 +312,9 @@ static int allocate_mid(struct cifsSesInfo *ses, struct smb_hdr *in_buf, | |||
308 | *ppmidQ = AllocMidQEntry(in_buf, ses->server); | 312 | *ppmidQ = AllocMidQEntry(in_buf, ses->server); |
309 | if (*ppmidQ == NULL) | 313 | if (*ppmidQ == NULL) |
310 | return -ENOMEM; | 314 | return -ENOMEM; |
315 | spin_lock(&GlobalMid_Lock); | ||
316 | list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q); | ||
317 | spin_unlock(&GlobalMid_Lock); | ||
311 | return 0; | 318 | return 0; |
312 | } | 319 | } |
313 | 320 | ||
@@ -508,7 +515,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
508 | } | 515 | } |
509 | } | 516 | } |
510 | spin_unlock(&GlobalMid_Lock); | 517 | spin_unlock(&GlobalMid_Lock); |
511 | DeleteMidQEntry(midQ); | 518 | delete_mid(midQ); |
512 | /* Update # of requests on wire to server */ | 519 | /* Update # of requests on wire to server */ |
513 | atomic_dec(&ses->server->inFlight); | 520 | atomic_dec(&ses->server->inFlight); |
514 | wake_up(&ses->server->request_q); | 521 | wake_up(&ses->server->request_q); |
@@ -564,14 +571,14 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
564 | if ((flags & CIFS_NO_RESP) == 0) | 571 | if ((flags & CIFS_NO_RESP) == 0) |
565 | midQ->resp_buf = NULL; /* mark it so buf will | 572 | midQ->resp_buf = NULL; /* mark it so buf will |
566 | not be freed by | 573 | not be freed by |
567 | DeleteMidQEntry */ | 574 | delete_mid */ |
568 | } else { | 575 | } else { |
569 | rc = -EIO; | 576 | rc = -EIO; |
570 | cFYI(1, "Bad MID state?"); | 577 | cFYI(1, "Bad MID state?"); |
571 | } | 578 | } |
572 | 579 | ||
573 | out: | 580 | out: |
574 | DeleteMidQEntry(midQ); | 581 | delete_mid(midQ); |
575 | atomic_dec(&ses->server->inFlight); | 582 | atomic_dec(&ses->server->inFlight); |
576 | wake_up(&ses->server->request_q); | 583 | wake_up(&ses->server->request_q); |
577 | 584 | ||
@@ -699,7 +706,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
699 | } | 706 | } |
700 | } | 707 | } |
701 | spin_unlock(&GlobalMid_Lock); | 708 | spin_unlock(&GlobalMid_Lock); |
702 | DeleteMidQEntry(midQ); | 709 | delete_mid(midQ); |
703 | /* Update # of requests on wire to server */ | 710 | /* Update # of requests on wire to server */ |
704 | atomic_dec(&ses->server->inFlight); | 711 | atomic_dec(&ses->server->inFlight); |
705 | wake_up(&ses->server->request_q); | 712 | wake_up(&ses->server->request_q); |
@@ -755,7 +762,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
755 | } | 762 | } |
756 | 763 | ||
757 | out: | 764 | out: |
758 | DeleteMidQEntry(midQ); | 765 | delete_mid(midQ); |
759 | atomic_dec(&ses->server->inFlight); | 766 | atomic_dec(&ses->server->inFlight); |
760 | wake_up(&ses->server->request_q); | 767 | wake_up(&ses->server->request_q); |
761 | 768 | ||
@@ -863,7 +870,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
863 | 870 | ||
864 | rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number); | 871 | rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number); |
865 | if (rc) { | 872 | if (rc) { |
866 | DeleteMidQEntry(midQ); | 873 | delete_mid(midQ); |
867 | mutex_unlock(&ses->server->srv_mutex); | 874 | mutex_unlock(&ses->server->srv_mutex); |
868 | return rc; | 875 | return rc; |
869 | } | 876 | } |
@@ -880,7 +887,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
880 | mutex_unlock(&ses->server->srv_mutex); | 887 | mutex_unlock(&ses->server->srv_mutex); |
881 | 888 | ||
882 | if (rc < 0) { | 889 | if (rc < 0) { |
883 | DeleteMidQEntry(midQ); | 890 | delete_mid(midQ); |
884 | return rc; | 891 | return rc; |
885 | } | 892 | } |
886 | 893 | ||
@@ -902,7 +909,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
902 | 909 | ||
903 | rc = send_nt_cancel(tcon, in_buf, midQ); | 910 | rc = send_nt_cancel(tcon, in_buf, midQ); |
904 | if (rc) { | 911 | if (rc) { |
905 | DeleteMidQEntry(midQ); | 912 | delete_mid(midQ); |
906 | return rc; | 913 | return rc; |
907 | } | 914 | } |
908 | } else { | 915 | } else { |
@@ -914,7 +921,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
914 | /* If we get -ENOLCK back the lock may have | 921 | /* If we get -ENOLCK back the lock may have |
915 | already been removed. Don't exit in this case. */ | 922 | already been removed. Don't exit in this case. */ |
916 | if (rc && rc != -ENOLCK) { | 923 | if (rc && rc != -ENOLCK) { |
917 | DeleteMidQEntry(midQ); | 924 | delete_mid(midQ); |
918 | return rc; | 925 | return rc; |
919 | } | 926 | } |
920 | } | 927 | } |
@@ -951,7 +958,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
951 | } | 958 | } |
952 | } | 959 | } |
953 | spin_unlock(&GlobalMid_Lock); | 960 | spin_unlock(&GlobalMid_Lock); |
954 | DeleteMidQEntry(midQ); | 961 | delete_mid(midQ); |
955 | return rc; | 962 | return rc; |
956 | } | 963 | } |
957 | 964 | ||
@@ -1001,7 +1008,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
1001 | BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); | 1008 | BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); |
1002 | 1009 | ||
1003 | out: | 1010 | out: |
1004 | DeleteMidQEntry(midQ); | 1011 | delete_mid(midQ); |
1005 | if (rstart && rc == -EACCES) | 1012 | if (rstart && rc == -EACCES) |
1006 | return -ERESTARTSYS; | 1013 | return -ERESTARTSYS; |
1007 | return rc; | 1014 | return rc; |