diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/cifsglob.h | 25 | ||||
-rw-r--r-- | fs/cifs/cifsproto.h | 3 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 10 | ||||
-rw-r--r-- | fs/cifs/connect.c | 4 | ||||
-rw-r--r-- | fs/cifs/misc.c | 19 | ||||
-rw-r--r-- | fs/cifs/smb1ops.c | 28 | ||||
-rw-r--r-- | fs/cifs/transport.c | 23 |
7 files changed, 62 insertions, 50 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 1001924f594a..2396456c4edc 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -169,6 +169,9 @@ struct smb_version_operations { | |||
169 | /* check response: verify signature, map error */ | 169 | /* check response: verify signature, map error */ |
170 | int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *, | 170 | int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *, |
171 | bool); | 171 | bool); |
172 | void (*add_credits)(struct TCP_Server_Info *, const unsigned int); | ||
173 | void (*set_credits)(struct TCP_Server_Info *, const int); | ||
174 | int * (*get_credits_field)(struct TCP_Server_Info *); | ||
172 | /* data offset from read response message */ | 175 | /* data offset from read response message */ |
173 | unsigned int (*read_data_offset)(char *); | 176 | unsigned int (*read_data_offset)(char *); |
174 | /* data length from read response message */ | 177 | /* data length from read response message */ |
@@ -372,16 +375,6 @@ in_flight(struct TCP_Server_Info *server) | |||
372 | return num; | 375 | return num; |
373 | } | 376 | } |
374 | 377 | ||
375 | static inline int* | ||
376 | get_credits_field(struct TCP_Server_Info *server) | ||
377 | { | ||
378 | /* | ||
379 | * This will change to switch statement when we reserve slots for echos | ||
380 | * and oplock breaks. | ||
381 | */ | ||
382 | return &server->credits; | ||
383 | } | ||
384 | |||
385 | static inline bool | 378 | static inline bool |
386 | has_credits(struct TCP_Server_Info *server, int *credits) | 379 | has_credits(struct TCP_Server_Info *server, int *credits) |
387 | { | 380 | { |
@@ -392,6 +385,18 @@ has_credits(struct TCP_Server_Info *server, int *credits) | |||
392 | return num > 0; | 385 | return num > 0; |
393 | } | 386 | } |
394 | 387 | ||
388 | static inline void | ||
389 | add_credits(struct TCP_Server_Info *server, const unsigned int add) | ||
390 | { | ||
391 | server->ops->add_credits(server, add); | ||
392 | } | ||
393 | |||
394 | static inline void | ||
395 | set_credits(struct TCP_Server_Info *server, const int val) | ||
396 | { | ||
397 | server->ops->set_credits(server, val); | ||
398 | } | ||
399 | |||
395 | /* | 400 | /* |
396 | * Macros to allow the TCP_Server_Info->net field and related code to drop out | 401 | * Macros to allow the TCP_Server_Info->net field and related code to drop out |
397 | * when CONFIG_NET_NS isn't set. | 402 | * when CONFIG_NET_NS isn't set. |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 57af64220747..5ec21ecf7980 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
@@ -90,9 +90,6 @@ extern int SendReceiveBlockingLock(const unsigned int xid, | |||
90 | struct smb_hdr *in_buf , | 90 | struct smb_hdr *in_buf , |
91 | struct smb_hdr *out_buf, | 91 | struct smb_hdr *out_buf, |
92 | int *bytes_returned); | 92 | int *bytes_returned); |
93 | extern void cifs_add_credits(struct TCP_Server_Info *server, | ||
94 | const unsigned int add); | ||
95 | extern void cifs_set_credits(struct TCP_Server_Info *server, const int val); | ||
96 | extern int checkSMB(char *buf, unsigned int length); | 93 | extern int checkSMB(char *buf, unsigned int length); |
97 | extern bool is_valid_oplock_break(char *, struct TCP_Server_Info *); | 94 | extern bool is_valid_oplock_break(char *, struct TCP_Server_Info *); |
98 | extern bool backup_cred(struct cifs_sb_info *); | 95 | extern bool backup_cred(struct cifs_sb_info *); |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index b1f375135f48..b5ad716b2642 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -460,7 +460,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifs_ses *ses) | |||
460 | server->maxReq = min_t(unsigned int, | 460 | server->maxReq = min_t(unsigned int, |
461 | le16_to_cpu(rsp->MaxMpxCount), | 461 | le16_to_cpu(rsp->MaxMpxCount), |
462 | cifs_max_pending); | 462 | cifs_max_pending); |
463 | cifs_set_credits(server, server->maxReq); | 463 | set_credits(server, server->maxReq); |
464 | server->maxBuf = le16_to_cpu(rsp->MaxBufSize); | 464 | server->maxBuf = le16_to_cpu(rsp->MaxBufSize); |
465 | server->max_vcs = le16_to_cpu(rsp->MaxNumberVcs); | 465 | server->max_vcs = le16_to_cpu(rsp->MaxNumberVcs); |
466 | /* even though we do not use raw we might as well set this | 466 | /* even though we do not use raw we might as well set this |
@@ -568,7 +568,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifs_ses *ses) | |||
568 | little endian */ | 568 | little endian */ |
569 | server->maxReq = min_t(unsigned int, le16_to_cpu(pSMBr->MaxMpxCount), | 569 | server->maxReq = min_t(unsigned int, le16_to_cpu(pSMBr->MaxMpxCount), |
570 | cifs_max_pending); | 570 | cifs_max_pending); |
571 | cifs_set_credits(server, server->maxReq); | 571 | set_credits(server, server->maxReq); |
572 | /* probably no need to store and check maxvcs */ | 572 | /* probably no need to store and check maxvcs */ |
573 | server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize); | 573 | server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize); |
574 | server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); | 574 | server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); |
@@ -720,7 +720,7 @@ cifs_echo_callback(struct mid_q_entry *mid) | |||
720 | struct TCP_Server_Info *server = mid->callback_data; | 720 | struct TCP_Server_Info *server = mid->callback_data; |
721 | 721 | ||
722 | DeleteMidQEntry(mid); | 722 | DeleteMidQEntry(mid); |
723 | cifs_add_credits(server, 1); | 723 | add_credits(server, 1); |
724 | } | 724 | } |
725 | 725 | ||
726 | int | 726 | int |
@@ -1563,7 +1563,7 @@ cifs_readv_callback(struct mid_q_entry *mid) | |||
1563 | 1563 | ||
1564 | queue_work(cifsiod_wq, &rdata->work); | 1564 | queue_work(cifsiod_wq, &rdata->work); |
1565 | DeleteMidQEntry(mid); | 1565 | DeleteMidQEntry(mid); |
1566 | cifs_add_credits(server, 1); | 1566 | add_credits(server, 1); |
1567 | } | 1567 | } |
1568 | 1568 | ||
1569 | /* cifs_async_readv - send an async write, and set up mid to handle result */ | 1569 | /* cifs_async_readv - send an async write, and set up mid to handle result */ |
@@ -2010,7 +2010,7 @@ cifs_writev_callback(struct mid_q_entry *mid) | |||
2010 | 2010 | ||
2011 | queue_work(cifsiod_wq, &wdata->work); | 2011 | queue_work(cifsiod_wq, &wdata->work); |
2012 | DeleteMidQEntry(mid); | 2012 | DeleteMidQEntry(mid); |
2013 | cifs_add_credits(tcon->ses->server, 1); | 2013 | add_credits(tcon->ses->server, 1); |
2014 | } | 2014 | } |
2015 | 2015 | ||
2016 | /* cifs_async_writev - send an async write, and set up mid to handle result */ | 2016 | /* cifs_async_writev - send an async write, and set up mid to handle result */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index ce033d74f315..c71c11c9caab 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -4099,11 +4099,11 @@ int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses) | |||
4099 | if (server->maxBuf != 0) | 4099 | if (server->maxBuf != 0) |
4100 | return 0; | 4100 | return 0; |
4101 | 4101 | ||
4102 | cifs_set_credits(server, 1); | 4102 | set_credits(server, 1); |
4103 | rc = CIFSSMBNegotiate(xid, ses); | 4103 | rc = CIFSSMBNegotiate(xid, ses); |
4104 | if (rc == -EAGAIN) { | 4104 | if (rc == -EAGAIN) { |
4105 | /* retry only once on 1st time connection */ | 4105 | /* retry only once on 1st time connection */ |
4106 | cifs_set_credits(server, 1); | 4106 | set_credits(server, 1); |
4107 | rc = CIFSSMBNegotiate(xid, ses); | 4107 | rc = CIFSSMBNegotiate(xid, ses); |
4108 | if (rc == -EAGAIN) | 4108 | if (rc == -EAGAIN) |
4109 | rc = -EHOSTDOWN; | 4109 | rc = -EHOSTDOWN; |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index d2bb1e75ee96..e2552d2b2e42 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
@@ -653,22 +653,3 @@ backup_cred(struct cifs_sb_info *cifs_sb) | |||
653 | 653 | ||
654 | return false; | 654 | return false; |
655 | } | 655 | } |
656 | |||
657 | void | ||
658 | cifs_add_credits(struct TCP_Server_Info *server, const unsigned int add) | ||
659 | { | ||
660 | spin_lock(&server->req_lock); | ||
661 | server->credits += add; | ||
662 | server->in_flight--; | ||
663 | spin_unlock(&server->req_lock); | ||
664 | wake_up(&server->request_q); | ||
665 | } | ||
666 | |||
667 | void | ||
668 | cifs_set_credits(struct TCP_Server_Info *server, const int val) | ||
669 | { | ||
670 | spin_lock(&server->req_lock); | ||
671 | server->credits = val; | ||
672 | server->oplocks = val > 1 ? enable_oplocks : false; | ||
673 | spin_unlock(&server->req_lock); | ||
674 | } | ||
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c index ddc8ca6c3090..d9d615fbed3f 100644 --- a/fs/cifs/smb1ops.c +++ b/fs/cifs/smb1ops.c | |||
@@ -100,11 +100,39 @@ cifs_find_mid(struct TCP_Server_Info *server, char *buffer) | |||
100 | return NULL; | 100 | return NULL; |
101 | } | 101 | } |
102 | 102 | ||
103 | static void | ||
104 | cifs_add_credits(struct TCP_Server_Info *server, const unsigned int add) | ||
105 | { | ||
106 | spin_lock(&server->req_lock); | ||
107 | server->credits += add; | ||
108 | server->in_flight--; | ||
109 | spin_unlock(&server->req_lock); | ||
110 | wake_up(&server->request_q); | ||
111 | } | ||
112 | |||
113 | static void | ||
114 | cifs_set_credits(struct TCP_Server_Info *server, const int val) | ||
115 | { | ||
116 | spin_lock(&server->req_lock); | ||
117 | server->credits = val; | ||
118 | server->oplocks = val > 1 ? enable_oplocks : false; | ||
119 | spin_unlock(&server->req_lock); | ||
120 | } | ||
121 | |||
122 | static int * | ||
123 | cifs_get_credits_field(struct TCP_Server_Info *server) | ||
124 | { | ||
125 | return &server->credits; | ||
126 | } | ||
127 | |||
103 | struct smb_version_operations smb1_operations = { | 128 | struct smb_version_operations smb1_operations = { |
104 | .send_cancel = send_nt_cancel, | 129 | .send_cancel = send_nt_cancel, |
105 | .compare_fids = cifs_compare_fids, | 130 | .compare_fids = cifs_compare_fids, |
106 | .setup_request = cifs_setup_request, | 131 | .setup_request = cifs_setup_request, |
107 | .check_receive = cifs_check_receive, | 132 | .check_receive = cifs_check_receive, |
133 | .add_credits = cifs_add_credits, | ||
134 | .set_credits = cifs_set_credits, | ||
135 | .get_credits_field = cifs_get_credits_field, | ||
108 | .read_data_offset = cifs_read_data_offset, | 136 | .read_data_offset = cifs_read_data_offset, |
109 | .read_data_length = cifs_read_data_length, | 137 | .read_data_length = cifs_read_data_length, |
110 | .map_error = map_smb_to_linux_error, | 138 | .map_error = map_smb_to_linux_error, |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 87bd998cfbec..1b36ffe6a47b 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -304,7 +304,8 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int optype, | |||
304 | static int | 304 | static int |
305 | wait_for_free_request(struct TCP_Server_Info *server, const int optype) | 305 | wait_for_free_request(struct TCP_Server_Info *server, const int optype) |
306 | { | 306 | { |
307 | return wait_for_free_credits(server, optype, get_credits_field(server)); | 307 | return wait_for_free_credits(server, optype, |
308 | server->ops->get_credits_field(server)); | ||
308 | } | 309 | } |
309 | 310 | ||
310 | static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf, | 311 | static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf, |
@@ -396,7 +397,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, | |||
396 | rc = cifs_setup_async_request(server, iov, nvec, &mid); | 397 | rc = cifs_setup_async_request(server, iov, nvec, &mid); |
397 | if (rc) { | 398 | if (rc) { |
398 | mutex_unlock(&server->srv_mutex); | 399 | mutex_unlock(&server->srv_mutex); |
399 | cifs_add_credits(server, 1); | 400 | add_credits(server, 1); |
400 | wake_up(&server->request_q); | 401 | wake_up(&server->request_q); |
401 | return rc; | 402 | return rc; |
402 | } | 403 | } |
@@ -418,7 +419,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, | |||
418 | return rc; | 419 | return rc; |
419 | out_err: | 420 | out_err: |
420 | delete_mid(mid); | 421 | delete_mid(mid); |
421 | cifs_add_credits(server, 1); | 422 | add_credits(server, 1); |
422 | wake_up(&server->request_q); | 423 | wake_up(&server->request_q); |
423 | return rc; | 424 | return rc; |
424 | } | 425 | } |
@@ -582,7 +583,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses, | |||
582 | mutex_unlock(&ses->server->srv_mutex); | 583 | mutex_unlock(&ses->server->srv_mutex); |
583 | cifs_small_buf_release(buf); | 584 | cifs_small_buf_release(buf); |
584 | /* Update # of requests on wire to server */ | 585 | /* Update # of requests on wire to server */ |
585 | cifs_add_credits(ses->server, 1); | 586 | add_credits(ses->server, 1); |
586 | return rc; | 587 | return rc; |
587 | } | 588 | } |
588 | 589 | ||
@@ -612,7 +613,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses, | |||
612 | midQ->callback = DeleteMidQEntry; | 613 | midQ->callback = DeleteMidQEntry; |
613 | spin_unlock(&GlobalMid_Lock); | 614 | spin_unlock(&GlobalMid_Lock); |
614 | cifs_small_buf_release(buf); | 615 | cifs_small_buf_release(buf); |
615 | cifs_add_credits(ses->server, 1); | 616 | add_credits(ses->server, 1); |
616 | return rc; | 617 | return rc; |
617 | } | 618 | } |
618 | spin_unlock(&GlobalMid_Lock); | 619 | spin_unlock(&GlobalMid_Lock); |
@@ -622,7 +623,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses, | |||
622 | 623 | ||
623 | rc = cifs_sync_mid_result(midQ, ses->server); | 624 | rc = cifs_sync_mid_result(midQ, ses->server); |
624 | if (rc != 0) { | 625 | if (rc != 0) { |
625 | cifs_add_credits(ses->server, 1); | 626 | add_credits(ses->server, 1); |
626 | return rc; | 627 | return rc; |
627 | } | 628 | } |
628 | 629 | ||
@@ -648,7 +649,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses, | |||
648 | midQ->resp_buf = NULL; | 649 | midQ->resp_buf = NULL; |
649 | out: | 650 | out: |
650 | delete_mid(midQ); | 651 | delete_mid(midQ); |
651 | cifs_add_credits(ses->server, 1); | 652 | add_credits(ses->server, 1); |
652 | 653 | ||
653 | return rc; | 654 | return rc; |
654 | } | 655 | } |
@@ -698,7 +699,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, | |||
698 | if (rc) { | 699 | if (rc) { |
699 | mutex_unlock(&ses->server->srv_mutex); | 700 | mutex_unlock(&ses->server->srv_mutex); |
700 | /* Update # of requests on wire to server */ | 701 | /* Update # of requests on wire to server */ |
701 | cifs_add_credits(ses->server, 1); | 702 | add_credits(ses->server, 1); |
702 | return rc; | 703 | return rc; |
703 | } | 704 | } |
704 | 705 | ||
@@ -730,7 +731,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, | |||
730 | /* no longer considered to be "in-flight" */ | 731 | /* no longer considered to be "in-flight" */ |
731 | midQ->callback = DeleteMidQEntry; | 732 | midQ->callback = DeleteMidQEntry; |
732 | spin_unlock(&GlobalMid_Lock); | 733 | spin_unlock(&GlobalMid_Lock); |
733 | cifs_add_credits(ses->server, 1); | 734 | add_credits(ses->server, 1); |
734 | return rc; | 735 | return rc; |
735 | } | 736 | } |
736 | spin_unlock(&GlobalMid_Lock); | 737 | spin_unlock(&GlobalMid_Lock); |
@@ -738,7 +739,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, | |||
738 | 739 | ||
739 | rc = cifs_sync_mid_result(midQ, ses->server); | 740 | rc = cifs_sync_mid_result(midQ, ses->server); |
740 | if (rc != 0) { | 741 | if (rc != 0) { |
741 | cifs_add_credits(ses->server, 1); | 742 | add_credits(ses->server, 1); |
742 | return rc; | 743 | return rc; |
743 | } | 744 | } |
744 | 745 | ||
@@ -754,7 +755,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, | |||
754 | rc = cifs_check_receive(midQ, ses->server, 0); | 755 | rc = cifs_check_receive(midQ, ses->server, 0); |
755 | out: | 756 | out: |
756 | delete_mid(midQ); | 757 | delete_mid(midQ); |
757 | cifs_add_credits(ses->server, 1); | 758 | add_credits(ses->server, 1); |
758 | 759 | ||
759 | return rc; | 760 | return rc; |
760 | } | 761 | } |