diff options
Diffstat (limited to 'fs/cifs/transport.c')
-rw-r--r-- | fs/cifs/transport.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index d8865fbd876a..981ea0d8b9cd 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -59,7 +59,9 @@ AllocMidQEntry(struct smb_hdr *smb_buffer, struct cifsSesInfo *ses) | |||
59 | temp->pid = current->pid; | 59 | temp->pid = current->pid; |
60 | temp->command = smb_buffer->Command; | 60 | temp->command = smb_buffer->Command; |
61 | cFYI(1, ("For smb_command %d", temp->command)); | 61 | cFYI(1, ("For smb_command %d", temp->command)); |
62 | do_gettimeofday(&temp->when_sent); | 62 | /* do_gettimeofday(&temp->when_sent);*/ /* easier to use jiffies */ |
63 | /* when mid allocated can be before when sent */ | ||
64 | temp->when_alloc = jiffies; | ||
63 | temp->ses = ses; | 65 | temp->ses = ses; |
64 | temp->tsk = current; | 66 | temp->tsk = current; |
65 | } | 67 | } |
@@ -75,6 +77,9 @@ AllocMidQEntry(struct smb_hdr *smb_buffer, struct cifsSesInfo *ses) | |||
75 | static void | 77 | static void |
76 | DeleteMidQEntry(struct mid_q_entry *midEntry) | 78 | DeleteMidQEntry(struct mid_q_entry *midEntry) |
77 | { | 79 | { |
80 | #ifdef CONFIG_CIFS_STATS2 | ||
81 | unsigned long now; | ||
82 | #endif | ||
78 | spin_lock(&GlobalMid_Lock); | 83 | spin_lock(&GlobalMid_Lock); |
79 | midEntry->midState = MID_FREE; | 84 | midEntry->midState = MID_FREE; |
80 | list_del(&midEntry->qhead); | 85 | list_del(&midEntry->qhead); |
@@ -84,6 +89,22 @@ DeleteMidQEntry(struct mid_q_entry *midEntry) | |||
84 | cifs_buf_release(midEntry->resp_buf); | 89 | cifs_buf_release(midEntry->resp_buf); |
85 | else | 90 | else |
86 | cifs_small_buf_release(midEntry->resp_buf); | 91 | cifs_small_buf_release(midEntry->resp_buf); |
92 | #ifdef CONFIG_CIFS_STATS2 | ||
93 | now = jiffies; | ||
94 | /* commands taking longer than one second are indications that | ||
95 | something is wrong, unless it is quite a slow link or server */ | ||
96 | if((now - midEntry->when_alloc) > HZ) { | ||
97 | if((cifsFYI & CIFS_TIMER) && | ||
98 | (midEntry->command != SMB_COM_LOCKING_ANDX)) { | ||
99 | printk(KERN_DEBUG " CIFS slow rsp: cmd %d mid %d", | ||
100 | midEntry->command, midEntry->mid); | ||
101 | printk(" A: 0x%lx S: 0x%lx R: 0x%lx\n", | ||
102 | now - midEntry->when_alloc, | ||
103 | now - midEntry->when_sent, | ||
104 | now - midEntry->when_received); | ||
105 | } | ||
106 | } | ||
107 | #endif | ||
87 | mempool_free(midEntry, cifs_mid_poolp); | 108 | mempool_free(midEntry, cifs_mid_poolp); |
88 | } | 109 | } |
89 | 110 | ||
@@ -382,6 +403,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
382 | (struct sockaddr *) &(ses->server->addr.sockAddr)); | 403 | (struct sockaddr *) &(ses->server->addr.sockAddr)); |
383 | #ifdef CONFIG_CIFS_STATS2 | 404 | #ifdef CONFIG_CIFS_STATS2 |
384 | atomic_dec(&ses->server->inSend); | 405 | atomic_dec(&ses->server->inSend); |
406 | midQ->when_sent = jiffies; | ||
385 | #endif | 407 | #endif |
386 | if(rc < 0) { | 408 | if(rc < 0) { |
387 | DeleteMidQEntry(midQ); | 409 | DeleteMidQEntry(midQ); |
@@ -646,6 +668,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
646 | (struct sockaddr *) &(ses->server->addr.sockAddr)); | 668 | (struct sockaddr *) &(ses->server->addr.sockAddr)); |
647 | #ifdef CONFIG_CIFS_STATS2 | 669 | #ifdef CONFIG_CIFS_STATS2 |
648 | atomic_dec(&ses->server->inSend); | 670 | atomic_dec(&ses->server->inSend); |
671 | midQ->when_sent = jiffies; | ||
649 | #endif | 672 | #endif |
650 | if(rc < 0) { | 673 | if(rc < 0) { |
651 | DeleteMidQEntry(midQ); | 674 | DeleteMidQEntry(midQ); |