• Home
  • Raw
  • Download

Lines Matching refs:req

30 static int smb_request_send_req(struct smb_request *req);
61 struct smb_request *req; in smb_do_alloc_request() local
64 req = kmem_cache_zalloc(req_cachep, GFP_KERNEL); in smb_do_alloc_request()
65 VERBOSE("allocating request: %p\n", req); in smb_do_alloc_request()
66 if (!req) in smb_do_alloc_request()
72 kmem_cache_free(req_cachep, req); in smb_do_alloc_request()
77 req->rq_buffer = buf; in smb_do_alloc_request()
78 req->rq_bufsize = bufsize; in smb_do_alloc_request()
79 req->rq_server = server; in smb_do_alloc_request()
80 init_waitqueue_head(&req->rq_wait); in smb_do_alloc_request()
81 INIT_LIST_HEAD(&req->rq_queue); in smb_do_alloc_request()
82 atomic_set(&req->rq_count, 1); in smb_do_alloc_request()
85 return req; in smb_do_alloc_request()
90 struct smb_request *req = NULL; in smb_alloc_request() local
95 req = smb_do_alloc_request(server, bufsize); in smb_alloc_request()
96 if (req != NULL) in smb_alloc_request()
118 return req; in smb_alloc_request()
121 static void smb_free_request(struct smb_request *req) in smb_free_request() argument
123 atomic_dec(&req->rq_server->nr_requests); in smb_free_request()
124 if (req->rq_buffer && !(req->rq_flags & SMB_REQ_STATIC)) in smb_free_request()
125 kfree(req->rq_buffer); in smb_free_request()
126 kfree(req->rq_trans2buffer); in smb_free_request()
127 kmem_cache_free(req_cachep, req); in smb_free_request()
134 static void smb_rget(struct smb_request *req) in smb_rget() argument
136 atomic_inc(&req->rq_count); in smb_rget()
138 void smb_rput(struct smb_request *req) in smb_rput() argument
140 if (atomic_dec_and_test(&req->rq_count)) { in smb_rput()
141 list_del_init(&req->rq_queue); in smb_rput()
142 smb_free_request(req); in smb_rput()
147 static int smb_setup_bcc(struct smb_request *req) in smb_setup_bcc() argument
150 req->rq_rlen = smb_len(req->rq_header) + 4 - req->rq_bytes_recvd; in smb_setup_bcc()
152 if (req->rq_rlen > req->rq_bufsize) { in smb_setup_bcc()
154 req->rq_rlen, req->rq_bufsize); in smb_setup_bcc()
158 req->rq_iov[0].iov_base = req->rq_buffer; in smb_setup_bcc()
159 req->rq_iov[0].iov_len = req->rq_rlen; in smb_setup_bcc()
160 req->rq_iovlen = 1; in smb_setup_bcc()
168 static int smb_setup_request(struct smb_request *req) in smb_setup_request() argument
170 int len = smb_len(req->rq_header) + 4; in smb_setup_request()
171 req->rq_slen = len; in smb_setup_request()
174 if (req->rq_resp_bcc) in smb_setup_request()
175 req->rq_setup_read = smb_setup_bcc; in smb_setup_request()
178 req->rq_bytes_sent = 0; in smb_setup_request()
179 req->rq_rcls = 0; in smb_setup_request()
180 req->rq_err = 0; in smb_setup_request()
181 req->rq_errno = 0; in smb_setup_request()
182 req->rq_fragment = 0; in smb_setup_request()
183 kfree(req->rq_trans2buffer); in smb_setup_request()
184 req->rq_trans2buffer = NULL; in smb_setup_request()
192 static int smb_setup_trans2request(struct smb_request *req) in smb_setup_trans2request() argument
194 struct smb_sb_info *server = req->rq_server; in smb_setup_trans2request()
204 const int odata = ALIGN(oparam + req->rq_lparm, sizeof(u32)); in smb_setup_trans2request()
205 const int bcc = (req->rq_data ? odata + req->rq_ldata : in smb_setup_trans2request()
206 oparam + req->rq_lparm) - header; in smb_setup_trans2request()
210 smb_setup_header(req, SMBtrans2, smb_parameters, bcc); in smb_setup_trans2request()
221 mdata = req->rq_bufsize - mparam; in smb_setup_trans2request()
236 WSET(req->rq_header, smb_tpscnt, req->rq_lparm); in smb_setup_trans2request()
237 WSET(req->rq_header, smb_tdscnt, req->rq_ldata); in smb_setup_trans2request()
238 WSET(req->rq_header, smb_mprcnt, mparam); in smb_setup_trans2request()
239 WSET(req->rq_header, smb_mdrcnt, mdata); in smb_setup_trans2request()
240 WSET(req->rq_header, smb_msrcnt, 0); /* max setup always 0 ? */ in smb_setup_trans2request()
241 WSET(req->rq_header, smb_flags, 0); in smb_setup_trans2request()
242 DSET(req->rq_header, smb_timeout, 0); in smb_setup_trans2request()
243 WSET(req->rq_header, smb_pscnt, req->rq_lparm); in smb_setup_trans2request()
244 WSET(req->rq_header, smb_psoff, oparam - 4); in smb_setup_trans2request()
245 WSET(req->rq_header, smb_dscnt, req->rq_ldata); in smb_setup_trans2request()
246 WSET(req->rq_header, smb_dsoff, req->rq_data ? odata - 4 : 0); in smb_setup_trans2request()
247 *(req->rq_header + smb_suwcnt) = 0x01; /* setup count */ in smb_setup_trans2request()
248 *(req->rq_header + smb_suwcnt + 1) = 0x00; /* reserved */ in smb_setup_trans2request()
249 WSET(req->rq_header, smb_setup0, req->rq_trans2_command); in smb_setup_trans2request()
251 req->rq_iovlen = 2; in smb_setup_trans2request()
252 req->rq_iov[0].iov_base = (void *) req->rq_header; in smb_setup_trans2request()
253 req->rq_iov[0].iov_len = oparam; in smb_setup_trans2request()
254 req->rq_iov[1].iov_base = (req->rq_parm==NULL) ? padding : req->rq_parm; in smb_setup_trans2request()
255 req->rq_iov[1].iov_len = req->rq_lparm; in smb_setup_trans2request()
256 req->rq_slen = oparam + req->rq_lparm; in smb_setup_trans2request()
258 if (req->rq_data) { in smb_setup_trans2request()
259 req->rq_iovlen += 2; in smb_setup_trans2request()
260 req->rq_iov[2].iov_base = padding; in smb_setup_trans2request()
261 req->rq_iov[2].iov_len = odata - oparam - req->rq_lparm; in smb_setup_trans2request()
262 req->rq_iov[3].iov_base = req->rq_data; in smb_setup_trans2request()
263 req->rq_iov[3].iov_len = req->rq_ldata; in smb_setup_trans2request()
264 req->rq_slen = odata + req->rq_ldata; in smb_setup_trans2request()
268 req->rq_setup_read = smb_setup_bcc; in smb_setup_trans2request()
276 int smb_add_request(struct smb_request *req) in smb_add_request() argument
279 struct smb_sb_info *server = req->rq_server; in smb_add_request()
282 smb_setup_request(req); in smb_add_request()
283 if (req->rq_trans2_command) { in smb_add_request()
284 if (req->rq_buffer == NULL) { in smb_add_request()
288 result = smb_setup_trans2request(req); in smb_add_request()
294 add_xmit_stats(req); in smb_add_request()
311 req->rq_mid = server->mid++; in smb_add_request()
312 WSET(req->rq_header, smb_mid, req->rq_mid); in smb_add_request()
317 result = smb_request_send_req(req); in smb_add_request()
325 list_add_tail(&req->rq_queue, &server->xmitq); in smb_add_request()
326 smb_rget(req); in smb_add_request()
335 timeleft = wait_event_interruptible_timeout(req->rq_wait, in smb_add_request()
336 req->rq_flags & SMB_REQ_RECEIVED, 30*HZ); in smb_add_request()
345 if (!list_empty(&req->rq_queue)) { in smb_add_request()
346 list_del_init(&req->rq_queue); in smb_add_request()
347 smb_rput(req); in smb_add_request()
354 req, req->rq_mid); in smb_add_request()
355 VERBOSE("smb_com: %02x\n", *(req->rq_header + smb_com)); in smb_add_request()
356 VERBOSE("smb_rcls: %02x\n", *(req->rq_header + smb_rcls)); in smb_add_request()
357 VERBOSE("smb_flg: %02x\n", *(req->rq_header + smb_flg)); in smb_add_request()
358 VERBOSE("smb_tid: %04x\n", WVAL(req->rq_header, smb_tid)); in smb_add_request()
359 VERBOSE("smb_pid: %04x\n", WVAL(req->rq_header, smb_pid)); in smb_add_request()
360 VERBOSE("smb_uid: %04x\n", WVAL(req->rq_header, smb_uid)); in smb_add_request()
361 VERBOSE("smb_mid: %04x\n", WVAL(req->rq_header, smb_mid)); in smb_add_request()
362 VERBOSE("smb_wct: %02x\n", *(req->rq_header + smb_wct)); in smb_add_request()
364 req->rq_rcls = ERRSRV; in smb_add_request()
365 req->rq_err = ERRtimeout; in smb_add_request()
370 VERBOSE("woke up, rcls=%d\n", req->rq_rcls); in smb_add_request()
372 if (req->rq_rcls != 0) in smb_add_request()
373 req->rq_errno = smb_errno(req); in smb_add_request()
375 req->rq_errno = -ERESTARTSYS; in smb_add_request()
376 return req->rq_errno; in smb_add_request()
383 static int smb_request_send_req(struct smb_request *req) in smb_request_send_req() argument
385 struct smb_sb_info *server = req->rq_server; in smb_request_send_req()
388 if (req->rq_bytes_sent == 0) { in smb_request_send_req()
389 WSET(req->rq_header, smb_tid, server->opt.tid); in smb_request_send_req()
390 WSET(req->rq_header, smb_pid, 1); in smb_request_send_req()
391 WSET(req->rq_header, smb_uid, server->opt.server_uid); in smb_request_send_req()
394 result = smb_send_request(req); in smb_request_send_req()
399 if (!(req->rq_flags & SMB_REQ_TRANSMITTED)) in smb_request_send_req()
402 list_move_tail(&req->rq_queue, &server->recvq); in smb_request_send_req()
418 struct smb_request *req; in smb_request_send_server() local
425 req = NULL; in smb_request_send_server()
428 req = list_entry(head, struct smb_request, rq_queue); in smb_request_send_server()
430 if (!req) in smb_request_send_server()
433 result = smb_request_send_req(req); in smb_request_send_server()
436 list_move(&req->rq_queue, &server->xmitq); in smb_request_send_server()
452 struct smb_request *req = NULL; in find_request() local
455 req = list_entry(tmp, struct smb_request, rq_queue); in find_request()
456 if (req->rq_mid == mid) { in find_request()
459 req = NULL; in find_request()
462 if (!req) { in find_request()
468 return req; in find_request()
474 static int smb_init_request(struct smb_sb_info *server, struct smb_request *req) in smb_init_request() argument
478 memcpy(req->rq_header, server->header, SMB_HEADER_LEN); in smb_init_request()
480 wct = *(req->rq_header + smb_wct); in smb_init_request()
487 req->rq_resp_wct = wct; in smb_init_request()
491 req->rq_bytes_recvd = SMB_HEADER_LEN; in smb_init_request()
492 req->rq_rlen = hdrlen; in smb_init_request()
493 req->rq_iov[0].iov_base = req->rq_header; in smb_init_request()
494 req->rq_iov[0].iov_len = hdrlen; in smb_init_request()
495 req->rq_iovlen = 1; in smb_init_request()
507 static int smb_recv_param(struct smb_sb_info *server, struct smb_request *req) in smb_recv_param() argument
511 result = smb_receive(server, req); in smb_recv_param()
514 if (req->rq_bytes_recvd < req->rq_rlen) in smb_recv_param()
518 WVAL(req->rq_header, SMB_HEADER_LEN + in smb_recv_param()
519 (*(req->rq_header + smb_wct) * 2))); in smb_recv_param()
522 req->rq_iov[0].iov_base = NULL; in smb_recv_param()
523 req->rq_rlen = 0; in smb_recv_param()
524 if (req->rq_callback) in smb_recv_param()
525 req->rq_callback(req); in smb_recv_param()
526 else if (req->rq_setup_read) in smb_recv_param()
527 result = req->rq_setup_read(req); in smb_recv_param()
533 server->rstate = req->rq_rlen > 0 ? SMB_RECV_DATA : SMB_RECV_END; in smb_recv_param()
535 req->rq_bytes_recvd = 0; // recvd out of the iov in smb_recv_param()
537 VERBOSE("rlen: %d\n", req->rq_rlen); in smb_recv_param()
538 if (req->rq_rlen < 0) { in smb_recv_param()
549 static int smb_recv_data(struct smb_sb_info *server, struct smb_request *req) in smb_recv_data() argument
553 result = smb_receive(server, req); in smb_recv_data()
556 if (req->rq_bytes_recvd < req->rq_rlen) in smb_recv_data()
570 static int smb_recv_trans2(struct smb_sb_info *server, struct smb_request *req) in smb_recv_trans2() argument
575 int hdrlen = SMB_HEADER_LEN + req->rq_resp_wct*2 - 2; in smb_recv_trans2()
579 inbuf = req->rq_header; in smb_recv_trans2()
615 req->rq_ldata = data_count; in smb_recv_trans2()
616 req->rq_lparm = parm_count; in smb_recv_trans2()
617 req->rq_data = req->rq_buffer + data_offset; in smb_recv_trans2()
618 req->rq_parm = req->rq_buffer + parm_offset; in smb_recv_trans2()
619 if (unlikely(parm_offset + parm_count > req->rq_rlen)) in smb_recv_trans2()
621 if (unlikely(data_offset + data_count > req->rq_rlen)) in smb_recv_trans2()
628 req->rq_fragment, in smb_recv_trans2()
632 if (!req->rq_fragment) { in smb_recv_trans2()
636 req->rq_fragment = 1; in smb_recv_trans2()
637 req->rq_total_data = data_tot; in smb_recv_trans2()
638 req->rq_total_parm = parm_tot; in smb_recv_trans2()
639 req->rq_ldata = 0; in smb_recv_trans2()
640 req->rq_lparm = 0; in smb_recv_trans2()
646 req->rq_trans2bufsize = buf_len; in smb_recv_trans2()
647 req->rq_trans2buffer = kzalloc(buf_len, GFP_NOFS); in smb_recv_trans2()
648 if (!req->rq_trans2buffer) in smb_recv_trans2()
651 req->rq_parm = req->rq_trans2buffer; in smb_recv_trans2()
652 req->rq_data = req->rq_trans2buffer + parm_tot; in smb_recv_trans2()
653 } else if (unlikely(req->rq_total_data < data_tot || in smb_recv_trans2()
654 req->rq_total_parm < parm_tot)) in smb_recv_trans2()
657 if (unlikely(parm_disp + parm_count > req->rq_total_parm || in smb_recv_trans2()
658 parm_offset + parm_count > req->rq_rlen)) in smb_recv_trans2()
660 if (unlikely(data_disp + data_count > req->rq_total_data || in smb_recv_trans2()
661 data_offset + data_count > req->rq_rlen)) in smb_recv_trans2()
664 inbuf = req->rq_buffer; in smb_recv_trans2()
665 memcpy(req->rq_parm + parm_disp, inbuf + parm_offset, parm_count); in smb_recv_trans2()
666 memcpy(req->rq_data + data_disp, inbuf + data_offset, data_count); in smb_recv_trans2()
668 req->rq_ldata += data_count; in smb_recv_trans2()
669 req->rq_lparm += parm_count; in smb_recv_trans2()
675 if (req->rq_ldata >= data_tot && req->rq_lparm >= parm_tot) { in smb_recv_trans2()
676 req->rq_ldata = data_tot; in smb_recv_trans2()
677 req->rq_lparm = parm_tot; in smb_recv_trans2()
688 req->rq_trans2bufsize); in smb_recv_trans2()
689 req->rq_errno = -ENOMEM; in smb_recv_trans2()
702 req->rq_errno = -EIO; in smb_recv_trans2()
704 return req->rq_errno; in smb_recv_trans2()
718 struct smb_request *req = NULL; in smb_request_recv() local
752 req = find_request(server, WVAL(server->header, smb_mid)); in smb_request_recv()
753 if (!req) in smb_request_recv()
755 smb_init_request(server, req); in smb_request_recv()
756 req->rq_rcls = *(req->rq_header + smb_rcls); in smb_request_recv()
757 req->rq_err = WVAL(req->rq_header, smb_err); in smb_request_recv()
762 if (!req) in smb_request_recv()
763 req = find_request(server,WVAL(server->header,smb_mid)); in smb_request_recv()
764 if (!req) in smb_request_recv()
766 result = smb_recv_param(server, req); in smb_request_recv()
773 if (!req) in smb_request_recv()
774 req = find_request(server,WVAL(server->header,smb_mid)); in smb_request_recv()
775 if (!req) in smb_request_recv()
777 result = smb_recv_data(server, req); in smb_request_recv()
797 if (req->rq_trans2_command && req->rq_rcls == SUCCESS) in smb_request_recv()
798 result = smb_recv_trans2(server, req); in smb_request_recv()
812 list_del_init(&req->rq_queue); in smb_request_recv()
813 req->rq_flags |= SMB_REQ_RECEIVED; in smb_request_recv()
814 smb_rput(req); in smb_request_recv()
815 wake_up_interruptible(&req->rq_wait); in smb_request_recv()