Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cifs: Remove the server pointer from smb_message

Remove the server pointer from smb_message and instead pass it down to all
the things that access it.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
cc: Shyam Prasad N <sprasad@microsoft.com>
cc: Tom Talpey <tom@talpey.com> (RDMA, smbdirect)
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

David Howells and committed by
Steve French
87fba18a 6a86a4cc

+108 -113
+3 -4
fs/smb/client/cifsfs.c
··· 442 442 static struct kmem_cache *cifs_io_subrequest_cachep; 443 443 mempool_t *cifs_sm_req_poolp; 444 444 mempool_t *cifs_req_poolp; 445 - mempool_t *cifs_mid_poolp; 445 + mempool_t cifs_mid_pool; 446 446 mempool_t cifs_io_request_pool; 447 447 mempool_t cifs_io_subrequest_pool; 448 448 ··· 1846 1846 return -ENOMEM; 1847 1847 1848 1848 /* 3 is a reasonable minimum number of simultaneous operations */ 1849 - cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep); 1850 - if (cifs_mid_poolp == NULL) { 1849 + if (mempool_init_slab_pool(&cifs_mid_pool, 3, cifs_mid_cachep) < 0) { 1851 1850 kmem_cache_destroy(cifs_mid_cachep); 1852 1851 return -ENOMEM; 1853 1852 } ··· 1856 1857 1857 1858 static void destroy_mids(void) 1858 1859 { 1859 - mempool_destroy(cifs_mid_poolp); 1860 + mempool_exit(&cifs_mid_pool); 1860 1861 kmem_cache_destroy(cifs_mid_cachep); 1861 1862 } 1862 1863
+7 -7
fs/smb/client/cifsglob.h
··· 1671 1671 * - it will be called by cifsd, with no locks held 1672 1672 * - the mid will be removed from any lists 1673 1673 */ 1674 - typedef void (*mid_callback_t)(struct mid_q_entry *mid); 1674 + typedef void (*mid_callback_t)(struct TCP_Server_Info *srv, struct mid_q_entry *mid); 1675 1675 1676 1676 /* 1677 1677 * This is the protopyte for mid handle function. This is called once the mid ··· 1683 1683 /* one of these for every pending CIFS request to the server */ 1684 1684 struct mid_q_entry { 1685 1685 struct list_head qhead; /* mids waiting on reply from this server */ 1686 - struct kref refcount; 1687 - struct TCP_Server_Info *server; /* server corresponding to this mid */ 1686 + refcount_t refcount; 1688 1687 __u64 mid; /* multiplex id */ 1689 1688 __u16 credits; /* number of credits consumed by this mid */ 1690 1689 __u16 credits_received; /* number of credits from the response */ ··· 2108 2109 2109 2110 extern mempool_t *cifs_sm_req_poolp; 2110 2111 extern mempool_t *cifs_req_poolp; 2111 - extern mempool_t *cifs_mid_poolp; 2112 + extern mempool_t cifs_mid_pool; 2112 2113 extern mempool_t cifs_io_request_pool; 2113 2114 extern mempool_t cifs_io_subrequest_pool; 2114 2115 ··· 2355 2356 * Execute mid callback atomically - ensures callback runs exactly once 2356 2357 * and prevents sleeping in atomic context. 2357 2358 */ 2358 - static inline void mid_execute_callback(struct mid_q_entry *mid) 2359 + static inline void mid_execute_callback(struct TCP_Server_Info *server, 2360 + struct mid_q_entry *mid) 2359 2361 { 2360 - void (*callback)(struct mid_q_entry *mid); 2362 + mid_callback_t callback; 2361 2363 2362 2364 spin_lock(&mid->mid_lock); 2363 2365 callback = mid->callback; ··· 2366 2366 spin_unlock(&mid->mid_lock); 2367 2367 2368 2368 if (callback) 2369 - callback(mid); 2369 + callback(server, mid); 2370 2370 } 2371 2371 2372 2372 #define CIFS_REPARSE_SUPPORT(tcon) \
+14 -7
fs/smb/client/cifsproto.h
··· 82 82 int add_treename); 83 83 extern char *build_wildcard_path_from_dentry(struct dentry *direntry); 84 84 char *cifs_build_devname(char *nodename, const char *prepath); 85 - extern void delete_mid(struct mid_q_entry *mid); 86 - void __release_mid(struct kref *refcount); 87 - extern void cifs_wake_up_task(struct mid_q_entry *mid); 85 + void delete_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid); 86 + void __release_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid); 87 + void cifs_wake_up_task(struct TCP_Server_Info *server, struct mid_q_entry *mid); 88 88 extern int cifs_handle_standard(struct TCP_Server_Info *server, 89 89 struct mid_q_entry *mid); 90 90 extern char *smb3_fs_context_fullpath(const struct smb3_fs_context *ctx, ··· 180 180 extern int cifs_convert_address(struct sockaddr *dst, const char *src, int len); 181 181 extern void cifs_set_port(struct sockaddr *addr, const unsigned short int port); 182 182 extern int map_smb_to_linux_error(char *buf, bool logErr); 183 - extern int map_and_check_smb_error(struct mid_q_entry *mid, bool logErr); 183 + extern int map_and_check_smb_error(struct TCP_Server_Info *server, 184 + struct mid_q_entry *mid, bool logErr); 184 185 unsigned int header_assemble(struct smb_hdr *buffer, char smb_command, 185 186 const struct cifs_tcon *treeCon, int word_count 186 187 /* length of fixed section word count in two byte units */); ··· 264 263 __u64 nmode); 265 264 extern unsigned int setup_special_user_owner_ACE(struct smb_ace *pace); 266 265 267 - extern void dequeue_mid(struct mid_q_entry *mid, bool malformed); 266 + void dequeue_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid, bool malformed); 268 267 extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, 269 268 unsigned int to_read); 270 269 extern ssize_t cifs_discard_from_socket(struct TCP_Server_Info *server, ··· 768 767 return true; 769 768 } 770 769 771 - static inline void release_mid(struct mid_q_entry *mid) 770 + static inline void smb_get_mid(struct mid_q_entry *mid) 772 771 { 773 - kref_put(&mid->refcount, __release_mid); 772 + refcount_inc(&mid->refcount); 773 + } 774 + 775 + static inline void release_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid) 776 + { 777 + if (refcount_dec_and_test(&mid->refcount)) 778 + __release_mid(server, mid); 774 779 } 775 780 776 781 static inline void cifs_free_open_info(struct cifs_open_info_data *data)
+6 -9
fs/smb/client/cifssmb.c
··· 584 584 * FIXME: maybe we should consider checking that the reply matches request? 585 585 */ 586 586 static void 587 - cifs_echo_callback(struct mid_q_entry *mid) 587 + cifs_echo_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 588 588 { 589 - struct TCP_Server_Info *server = mid->callback_data; 590 589 struct cifs_credits credits = { .value = 1, .instance = 0 }; 591 590 592 - release_mid(mid); 591 + release_mid(server, mid); 593 592 add_credits(server, &credits, CIFS_ECHO_OP); 594 593 } 595 594 ··· 1316 1317 } 1317 1318 1318 1319 static void 1319 - cifs_readv_callback(struct mid_q_entry *mid) 1320 + cifs_readv_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 1320 1321 { 1321 1322 struct cifs_io_subrequest *rdata = mid->callback_data; 1322 1323 struct netfs_inode *ictx = netfs_inode(rdata->rreq->inode); 1323 1324 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); 1324 - struct TCP_Server_Info *server = tcon->ses->server; 1325 1325 struct smb_rqst rqst = { .rq_iov = rdata->iov, 1326 1326 .rq_nvec = 1, 1327 1327 .rq_iter = rdata->subreq.io_iter }; ··· 1418 1420 rdata->subreq.transferred += rdata->got_bytes; 1419 1421 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_progress); 1420 1422 netfs_read_subreq_terminated(&rdata->subreq); 1421 - release_mid(mid); 1423 + release_mid(server, mid); 1422 1424 add_credits(server, &credits, 0); 1423 1425 trace_smb3_rw_credits(rreq_debug_id, subreq_debug_index, 0, 1424 1426 server->credits, server->in_flight, ··· 1734 1736 * workqueue completion task. 1735 1737 */ 1736 1738 static void 1737 - cifs_writev_callback(struct mid_q_entry *mid) 1739 + cifs_writev_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 1738 1740 { 1739 1741 struct cifs_io_subrequest *wdata = mid->callback_data; 1740 - struct TCP_Server_Info *server = wdata->server; 1741 1742 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); 1742 1743 WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; 1743 1744 struct cifs_credits credits = { ··· 1800 1803 0, cifs_trace_rw_credits_write_response_clear); 1801 1804 wdata->credits.value = 0; 1802 1805 cifs_write_subrequest_terminated(wdata, result); 1803 - release_mid(mid); 1806 + release_mid(server, mid); 1804 1807 trace_smb3_rw_credits(credits.rreq_debug_id, credits.rreq_debug_index, 0, 1805 1808 server->credits, server->in_flight, 1806 1809 credits.value, cifs_trace_rw_credits_write_response_add);
+7 -8
fs/smb/client/cifstransport.c
··· 43 43 return NULL; 44 44 } 45 45 46 - temp = mempool_alloc(cifs_mid_poolp, GFP_NOFS); 46 + temp = mempool_alloc(&cifs_mid_pool, GFP_NOFS); 47 47 memset(temp, 0, sizeof(struct mid_q_entry)); 48 - kref_init(&temp->refcount); 48 + refcount_set(&temp->refcount, 1); 49 49 spin_lock_init(&temp->mid_lock); 50 50 temp->mid = get_mid(smb_buffer); 51 51 temp->pid = current->pid; ··· 54 54 /* easier to use jiffies */ 55 55 /* when mid allocated can be before when sent */ 56 56 temp->when_alloc = jiffies; 57 - temp->server = server; 58 57 59 58 /* 60 59 * The default is for the mid to be synchronous, so the ··· 118 119 119 120 rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); 120 121 if (rc) { 121 - release_mid(mid); 122 + release_mid(server, mid); 122 123 return ERR_PTR(rc); 123 124 } 124 125 ··· 178 179 } 179 180 180 181 /* BB special case reconnect tid and uid here? */ 181 - return map_and_check_smb_error(mid, log_error); 182 + return map_and_check_smb_error(server, mid, log_error); 182 183 } 183 184 184 185 struct mid_q_entry * 185 - cifs_setup_request(struct cifs_ses *ses, struct TCP_Server_Info *ignored, 186 + cifs_setup_request(struct cifs_ses *ses, struct TCP_Server_Info *server, 186 187 struct smb_rqst *rqst) 187 188 { 188 189 int rc; ··· 192 193 rc = allocate_mid(ses, hdr, &mid); 193 194 if (rc) 194 195 return ERR_PTR(rc); 195 - rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number); 196 + rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); 196 197 if (rc) { 197 - delete_mid(mid); 198 + delete_mid(server, mid); 198 199 return ERR_PTR(rc); 199 200 } 200 201 return mid;
+17 -17
fs/smb/client/connect.c
··· 325 325 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__); 326 326 spin_lock(&server->mid_queue_lock); 327 327 list_for_each_entry_safe(mid, nmid, &server->pending_mid_q, qhead) { 328 - kref_get(&mid->refcount); 328 + smb_get_mid(mid); 329 329 if (mid->mid_state == MID_REQUEST_SUBMITTED) 330 330 mid->mid_state = MID_RETRY_NEEDED; 331 331 list_move(&mid->qhead, &retry_list); ··· 337 337 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__); 338 338 list_for_each_entry_safe(mid, nmid, &retry_list, qhead) { 339 339 list_del_init(&mid->qhead); 340 - mid_execute_callback(mid); 341 - release_mid(mid); 340 + mid_execute_callback(server, mid); 341 + release_mid(server, mid); 342 342 } 343 343 } 344 344 ··· 882 882 */ 883 883 spin_lock(&server->mid_queue_lock); 884 884 list_for_each_entry_safe(mid, nmid, &server->pending_mid_q, qhead) { 885 - kref_get(&mid->refcount); 885 + smb_get_mid(mid); 886 886 list_move(&mid->qhead, &dispose_list); 887 887 mid->deleted_from_q = true; 888 888 } ··· 915 915 list_del_init(&mid->qhead); 916 916 mid->mid_rc = mid_rc; 917 917 mid->mid_state = MID_RC; 918 - mid_execute_callback(mid); 919 - release_mid(mid); 918 + mid_execute_callback(server, mid); 919 + release_mid(server, mid); 920 920 } 921 921 922 922 /* ··· 948 948 } 949 949 950 950 void 951 - dequeue_mid(struct mid_q_entry *mid, bool malformed) 951 + dequeue_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid, bool malformed) 952 952 { 953 953 #ifdef CONFIG_CIFS_STATS2 954 954 mid->when_received = jiffies; 955 955 #endif 956 - spin_lock(&mid->server->mid_queue_lock); 956 + spin_lock(&server->mid_queue_lock); 957 957 if (!malformed) 958 958 mid->mid_state = MID_RESPONSE_RECEIVED; 959 959 else ··· 963 963 * function has finished processing it is a bug. 964 964 */ 965 965 if (mid->deleted_from_q == true) { 966 - spin_unlock(&mid->server->mid_queue_lock); 966 + spin_unlock(&server->mid_queue_lock); 967 967 pr_warn_once("trying to dequeue a deleted mid\n"); 968 968 } else { 969 969 list_del_init(&mid->qhead); 970 970 mid->deleted_from_q = true; 971 - spin_unlock(&mid->server->mid_queue_lock); 971 + spin_unlock(&server->mid_queue_lock); 972 972 } 973 973 } 974 974 ··· 1004 1004 else 1005 1005 server->smallbuf = NULL; 1006 1006 } 1007 - dequeue_mid(mid, malformed); 1007 + dequeue_mid(server, mid, malformed); 1008 1008 } 1009 1009 1010 1010 int ··· 1101 1101 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) { 1102 1102 mid_entry = list_entry(tmp, struct mid_q_entry, qhead); 1103 1103 cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid); 1104 - kref_get(&mid_entry->refcount); 1104 + smb_get_mid(mid_entry); 1105 1105 mid_entry->mid_state = MID_SHUTDOWN; 1106 1106 list_move(&mid_entry->qhead, &dispose_list); 1107 1107 mid_entry->deleted_from_q = true; ··· 1113 1113 mid_entry = list_entry(tmp, struct mid_q_entry, qhead); 1114 1114 cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid); 1115 1115 list_del_init(&mid_entry->qhead); 1116 - mid_execute_callback(mid_entry); 1117 - release_mid(mid_entry); 1116 + mid_execute_callback(server, mid_entry); 1117 + release_mid(server, mid_entry); 1118 1118 } 1119 1119 /* 1/8th of sec is more than enough time for them to exit */ 1120 1120 msleep(125); ··· 1355 1355 if (length < 0) { 1356 1356 for (i = 0; i < num_mids; i++) 1357 1357 if (mids[i]) 1358 - release_mid(mids[i]); 1358 + release_mid(server, mids[i]); 1359 1359 continue; 1360 1360 } 1361 1361 ··· 1388 1388 } 1389 1389 1390 1390 if (!mids[i]->multiRsp || mids[i]->multiEnd) 1391 - mid_execute_callback(mids[i]); 1391 + mid_execute_callback(server, mids[i]); 1392 1392 1393 - release_mid(mids[i]); 1393 + release_mid(server, mids[i]); 1394 1394 } else if (server->ops->is_oplock_break && 1395 1395 server->ops->is_oplock_break(bufs[i], 1396 1396 server)) {
+3 -2
fs/smb/client/netmisc.c
··· 889 889 } 890 890 891 891 int 892 - map_and_check_smb_error(struct mid_q_entry *mid, bool logErr) 892 + map_and_check_smb_error(struct TCP_Server_Info *server, 893 + struct mid_q_entry *mid, bool logErr) 893 894 { 894 895 int rc; 895 896 struct smb_hdr *smb = (struct smb_hdr *)mid->resp_buf; ··· 905 904 if (class == ERRSRV && code == ERRbaduid) { 906 905 cifs_dbg(FYI, "Server returned 0x%x, reconnecting session...\n", 907 906 code); 908 - cifs_signal_cifsd_for_reconnect(mid->server, false); 907 + cifs_signal_cifsd_for_reconnect(server, false); 909 908 } 910 909 } 911 910
+2 -2
fs/smb/client/smb1ops.c
··· 146 146 if (compare_mid(mid->mid, buf) && 147 147 mid->mid_state == MID_REQUEST_SUBMITTED && 148 148 le16_to_cpu(mid->command) == buf->Command) { 149 - kref_get(&mid->refcount); 149 + smb_get_mid(mid); 150 150 spin_unlock(&server->mid_queue_lock); 151 151 return mid; 152 152 } ··· 448 448 return true; 449 449 /* All parts received or packet is malformed. */ 450 450 mid->multiEnd = true; 451 - dequeue_mid(mid, malformed); 451 + dequeue_mid(server, mid, malformed); 452 452 return true; 453 453 } 454 454 if (!server->large_buf) {
+11 -11
fs/smb/client/smb2ops.c
··· 406 406 if ((mid->mid == wire_mid) && 407 407 (mid->mid_state == MID_REQUEST_SUBMITTED) && 408 408 (mid->command == shdr->Command)) { 409 - kref_get(&mid->refcount); 409 + smb_get_mid(mid); 410 410 if (dequeue) { 411 411 list_del_init(&mid->qhead); 412 412 mid->deleted_from_q = true; ··· 4716 4716 if (is_offloaded) 4717 4717 mid->mid_state = MID_RESPONSE_RECEIVED; 4718 4718 else 4719 - dequeue_mid(mid, false); 4719 + dequeue_mid(server, mid, false); 4720 4720 return 0; 4721 4721 } 4722 4722 ··· 4743 4743 if (is_offloaded) 4744 4744 mid->mid_state = MID_RESPONSE_MALFORMED; 4745 4745 else 4746 - dequeue_mid(mid, rdata->result); 4746 + dequeue_mid(server, mid, rdata->result); 4747 4747 return 0; 4748 4748 } 4749 4749 ··· 4762 4762 if (is_offloaded) 4763 4763 mid->mid_state = MID_RESPONSE_MALFORMED; 4764 4764 else 4765 - dequeue_mid(mid, rdata->result); 4765 + dequeue_mid(server, mid, rdata->result); 4766 4766 return 0; 4767 4767 } 4768 4768 ··· 4772 4772 if (is_offloaded) 4773 4773 mid->mid_state = MID_RESPONSE_MALFORMED; 4774 4774 else 4775 - dequeue_mid(mid, rdata->result); 4775 + dequeue_mid(server, mid, rdata->result); 4776 4776 return 0; 4777 4777 } 4778 4778 ··· 4783 4783 if (is_offloaded) 4784 4784 mid->mid_state = MID_RESPONSE_MALFORMED; 4785 4785 else 4786 - dequeue_mid(mid, rdata->result); 4786 + dequeue_mid(server, mid, rdata->result); 4787 4787 return 0; 4788 4788 } 4789 4789 rdata->got_bytes = buffer_len; ··· 4802 4802 if (is_offloaded) 4803 4803 mid->mid_state = MID_RESPONSE_MALFORMED; 4804 4804 else 4805 - dequeue_mid(mid, rdata->result); 4805 + dequeue_mid(server, mid, rdata->result); 4806 4806 return 0; 4807 4807 } 4808 4808 4809 4809 if (is_offloaded) 4810 4810 mid->mid_state = MID_RESPONSE_RECEIVED; 4811 4811 else 4812 - dequeue_mid(mid, false); 4812 + dequeue_mid(server, mid, false); 4813 4813 return 0; 4814 4814 } 4815 4815 ··· 4856 4856 dw->server->ops->is_network_name_deleted(dw->buf, 4857 4857 dw->server); 4858 4858 4859 - mid_execute_callback(mid); 4859 + mid_execute_callback(dw->server, mid); 4860 4860 } else { 4861 4861 spin_lock(&dw->server->srv_lock); 4862 4862 if (dw->server->tcpStatus == CifsNeedReconnect) { ··· 4864 4864 mid->mid_state = MID_RETRY_NEEDED; 4865 4865 spin_unlock(&dw->server->mid_queue_lock); 4866 4866 spin_unlock(&dw->server->srv_lock); 4867 - mid_execute_callback(mid); 4867 + mid_execute_callback(dw->server, mid); 4868 4868 } else { 4869 4869 spin_lock(&dw->server->mid_queue_lock); 4870 4870 mid->mid_state = MID_REQUEST_SUBMITTED; ··· 4875 4875 spin_unlock(&dw->server->srv_lock); 4876 4876 } 4877 4877 } 4878 - release_mid(mid); 4878 + release_mid(dw->server, mid); 4879 4879 } 4880 4880 4881 4881 free_pages:
+11 -15
fs/smb/client/smb2pdu.c
··· 4091 4091 * FIXME: maybe we should consider checking that the reply matches request? 4092 4092 */ 4093 4093 static void 4094 - smb2_echo_callback(struct mid_q_entry *mid) 4094 + smb2_echo_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 4095 4095 { 4096 - struct TCP_Server_Info *server = mid->callback_data; 4097 4096 struct smb2_echo_rsp *rsp = (struct smb2_echo_rsp *)mid->resp_buf; 4098 4097 struct cifs_credits credits = { .value = 0, .instance = 0 }; 4099 4098 ··· 4102 4103 credits.instance = server->reconnect_instance; 4103 4104 } 4104 4105 4105 - release_mid(mid); 4106 + release_mid(server, mid); 4106 4107 add_credits(server, &credits, CIFS_ECHO_OP); 4107 4108 } 4108 4109 ··· 4517 4518 } 4518 4519 4519 4520 static void 4520 - smb2_readv_callback(struct mid_q_entry *mid) 4521 + smb2_readv_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 4521 4522 { 4522 4523 struct cifs_io_subrequest *rdata = mid->callback_data; 4523 4524 struct netfs_inode *ictx = netfs_inode(rdata->rreq->inode); 4524 4525 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); 4525 - struct TCP_Server_Info *server = rdata->server; 4526 - struct smb2_hdr *shdr = 4527 - (struct smb2_hdr *)rdata->iov[0].iov_base; 4526 + struct smb2_hdr *shdr = (struct smb2_hdr *)rdata->iov[0].iov_base; 4528 4527 struct cifs_credits credits = { 4529 4528 .value = 0, 4530 4529 .instance = 0, ··· 4537 4540 rqst.rq_iter = rdata->subreq.io_iter; 4538 4541 } 4539 4542 4540 - WARN_ONCE(rdata->server != mid->server, 4543 + WARN_ONCE(rdata->server != server, 4541 4544 "rdata server %p != mid server %p", 4542 - rdata->server, mid->server); 4545 + rdata->server, server); 4543 4546 4544 4547 cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%zu/%zu\n", 4545 4548 __func__, mid->mid, mid->mid_state, rdata->result, ··· 4640 4643 rdata->subreq.transferred += rdata->got_bytes; 4641 4644 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_progress); 4642 4645 netfs_read_subreq_terminated(&rdata->subreq); 4643 - release_mid(mid); 4646 + release_mid(server, mid); 4644 4647 trace_smb3_rw_credits(rreq_debug_id, subreq_debug_index, 0, 4645 4648 server->credits, server->in_flight, 4646 4649 credits.value, cifs_trace_rw_credits_read_response_add); ··· 4817 4820 * workqueue completion task. 4818 4821 */ 4819 4822 static void 4820 - smb2_writev_callback(struct mid_q_entry *mid) 4823 + smb2_writev_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 4821 4824 { 4822 4825 struct cifs_io_subrequest *wdata = mid->callback_data; 4823 4826 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); 4824 - struct TCP_Server_Info *server = wdata->server; 4825 4827 struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; 4826 4828 struct cifs_credits credits = { 4827 4829 .value = 0, ··· 4833 4837 ssize_t result = 0; 4834 4838 size_t written; 4835 4839 4836 - WARN_ONCE(wdata->server != mid->server, 4840 + WARN_ONCE(wdata->server != server, 4837 4841 "wdata server %p != mid server %p", 4838 - wdata->server, mid->server); 4842 + wdata->server, server); 4839 4843 4840 4844 switch (mid->mid_state) { 4841 4845 case MID_RESPONSE_RECEIVED: ··· 4925 4929 0, cifs_trace_rw_credits_write_response_clear); 4926 4930 wdata->credits.value = 0; 4927 4931 cifs_write_subrequest_terminated(wdata, result ?: written); 4928 - release_mid(mid); 4932 + release_mid(server, mid); 4929 4933 trace_smb3_rw_credits(rreq_debug_id, subreq_debug_index, 0, 4930 4934 server->credits, server->in_flight, 4931 4935 credits.value, cifs_trace_rw_credits_write_response_add);
+4 -5
fs/smb/client/smb2transport.c
··· 653 653 return NULL; 654 654 } 655 655 656 - temp = mempool_alloc(cifs_mid_poolp, GFP_NOFS); 656 + temp = mempool_alloc(&cifs_mid_pool, GFP_NOFS); 657 657 memset(temp, 0, sizeof(struct mid_q_entry)); 658 - kref_init(&temp->refcount); 658 + refcount_set(&temp->refcount, 1); 659 659 spin_lock_init(&temp->mid_lock); 660 660 temp->mid = le64_to_cpu(shdr->MessageId); 661 661 temp->credits = credits > 0 ? credits : 1; 662 662 temp->pid = current->pid; 663 663 temp->command = shdr->Command; /* Always LE */ 664 664 temp->when_alloc = jiffies; 665 - temp->server = server; 666 665 667 666 /* 668 667 * The default is for the mid to be synchronous, so the ··· 778 779 rc = smb2_sign_rqst(rqst, server); 779 780 if (rc) { 780 781 revert_current_mid_from_hdr(server, shdr); 781 - delete_mid(mid); 782 + delete_mid(server, mid); 782 783 return ERR_PTR(rc); 783 784 } 784 785 ··· 812 813 rc = smb2_sign_rqst(rqst, server); 813 814 if (rc) { 814 815 revert_current_mid_from_hdr(server, shdr); 815 - release_mid(mid); 816 + release_mid(server, mid); 816 817 return ERR_PTR(rc); 817 818 } 818 819
+23 -26
fs/smb/client/transport.c
··· 32 32 #include "compress.h" 33 33 34 34 void 35 - cifs_wake_up_task(struct mid_q_entry *mid) 35 + cifs_wake_up_task(struct TCP_Server_Info *server, struct mid_q_entry *mid) 36 36 { 37 37 if (mid->mid_state == MID_RESPONSE_RECEIVED) 38 38 mid->mid_state = MID_RESPONSE_READY; 39 39 wake_up_process(mid->callback_data); 40 40 } 41 41 42 - void __release_mid(struct kref *refcount) 42 + void __release_mid(struct TCP_Server_Info *server, struct mid_q_entry *midEntry) 43 43 { 44 - struct mid_q_entry *midEntry = 45 - container_of(refcount, struct mid_q_entry, refcount); 46 44 #ifdef CONFIG_CIFS_STATS2 47 - __le16 command = midEntry->server->vals->lock_cmd; 45 + __le16 command = server->vals->lock_cmd; 48 46 __u16 smb_cmd = le16_to_cpu(midEntry->command); 49 47 unsigned long now; 50 48 unsigned long roundtrip_time; 51 49 #endif 52 - struct TCP_Server_Info *server = midEntry->server; 53 50 54 51 if (midEntry->resp_buf && (midEntry->wait_cancelled) && 55 52 (midEntry->mid_state == MID_RESPONSE_RECEIVED || ··· 113 116 #endif 114 117 put_task_struct(midEntry->creator); 115 118 116 - mempool_free(midEntry, cifs_mid_poolp); 119 + mempool_free(midEntry, &cifs_mid_pool); 117 120 } 118 121 119 122 void 120 - delete_mid(struct mid_q_entry *mid) 123 + delete_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid) 121 124 { 122 - spin_lock(&mid->server->mid_queue_lock); 123 - if (mid->deleted_from_q == false) { 125 + spin_lock(&server->mid_queue_lock); 126 + 127 + if (!mid->deleted_from_q) { 124 128 list_del_init(&mid->qhead); 125 129 mid->deleted_from_q = true; 126 130 } 127 - spin_unlock(&mid->server->mid_queue_lock); 131 + spin_unlock(&server->mid_queue_lock); 128 132 129 - release_mid(mid); 133 + release_mid(server, mid); 130 134 } 131 135 132 136 /* ··· 725 727 if (rc < 0) { 726 728 revert_current_mid(server, mid->credits); 727 729 server->sequence_number -= 2; 728 - delete_mid(mid); 730 + delete_mid(server, mid); 729 731 } 730 732 731 733 cifs_server_unlock(server); ··· 775 777 spin_unlock(&server->mid_queue_lock); 776 778 777 779 sync_mid_done: 778 - release_mid(mid); 780 + release_mid(server, mid); 779 781 return rc; 780 782 } 781 783 782 784 static void 783 - cifs_compound_callback(struct mid_q_entry *mid) 785 + cifs_compound_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 784 786 { 785 - struct TCP_Server_Info *server = mid->server; 786 787 struct cifs_credits credits = { 787 788 .value = server->ops->get_credits(mid), 788 789 .instance = server->reconnect_instance, ··· 794 797 } 795 798 796 799 static void 797 - cifs_compound_last_callback(struct mid_q_entry *mid) 800 + cifs_compound_last_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 798 801 { 799 - cifs_compound_callback(mid); 800 - cifs_wake_up_task(mid); 802 + cifs_compound_callback(server, mid); 803 + cifs_wake_up_task(server, mid); 801 804 } 802 805 803 806 static void 804 - cifs_cancelled_callback(struct mid_q_entry *mid) 807 + cifs_cancelled_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid) 805 808 { 806 - cifs_compound_callback(mid); 807 - release_mid(mid); 809 + cifs_compound_callback(server, mid); 810 + release_mid(server, mid); 808 811 } 809 812 810 813 /* ··· 938 941 if (IS_ERR(mid[i])) { 939 942 revert_current_mid(server, i); 940 943 for (j = 0; j < i; j++) 941 - delete_mid(mid[j]); 944 + delete_mid(server, mid[j]); 942 945 cifs_server_unlock(server); 943 946 944 947 /* Update # of requests on wire to server */ ··· 1093 1096 */ 1094 1097 for (i = 0; i < num_rqst; i++) { 1095 1098 if (!cancelled_mid[i]) 1096 - delete_mid(mid[i]); 1099 + delete_mid(server, mid[i]); 1097 1100 } 1098 1101 1099 1102 return rc; ··· 1142 1145 int length; 1143 1146 1144 1147 length = cifs_discard_remaining_data(server); 1145 - dequeue_mid(mid, malformed); 1148 + dequeue_mid(server, mid, malformed); 1146 1149 mid->resp_buf = server->smallbuf; 1147 1150 server->smallbuf = NULL; 1148 1151 return length; ··· 1280 1283 if (server->total_read < buflen) 1281 1284 return cifs_readv_discard(server, mid); 1282 1285 1283 - dequeue_mid(mid, false); 1286 + dequeue_mid(server, mid, false); 1284 1287 mid->resp_buf = server->smallbuf; 1285 1288 server->smallbuf = NULL; 1286 1289 return length;