@@ -239,13 +239,6 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
239239 return - EIO ;
240240 }
241241
242- spin_lock (& server -> srv_lock );
243- if (server -> tcpStatus == CifsExiting ) {
244- spin_unlock (& server -> srv_lock );
245- return - ENOENT ;
246- }
247- spin_unlock (& server -> srv_lock );
248-
249242 /* Ensure that we do not send more than 50 overlapping requests
250243 to the same server. We may make this configurable later or
251244 use ses->maxReq */
@@ -261,193 +254,11 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
261254 if (rc < 0 )
262255 return rc ;
263256
264- * pbytes_returned = resp_iov .iov_len ;
265- if (resp_iov .iov_len )
266- memcpy (out_buf , resp_iov .iov_base , resp_iov .iov_len );
267- free_rsp_buf (resp_buf_type , resp_iov .iov_base );
268- return rc ;
269- }
270-
271- /* We send a LOCKINGX_CANCEL_LOCK to cause the Windows
272- blocking lock to return. */
273-
274- static int
275- send_lock_cancel (const unsigned int xid , struct cifs_tcon * tcon ,
276- struct smb_hdr * in_buf , unsigned int in_len ,
277- struct smb_hdr * out_buf )
278- {
279- int bytes_returned ;
280- struct cifs_ses * ses = tcon -> ses ;
281- LOCK_REQ * pSMB = (LOCK_REQ * )in_buf ;
282-
283- /* We just modify the current in_buf to change
284- the type of lock from LOCKING_ANDX_SHARED_LOCK
285- or LOCKING_ANDX_EXCLUSIVE_LOCK to
286- LOCKING_ANDX_CANCEL_LOCK. */
287-
288- pSMB -> LockType = LOCKING_ANDX_CANCEL_LOCK |LOCKING_ANDX_LARGE_FILES ;
289- pSMB -> Timeout = 0 ;
290- pSMB -> hdr .Mid = get_next_mid (ses -> server );
291-
292- return SendReceive (xid , ses , in_buf , in_len , out_buf ,
293- & bytes_returned , 0 );
294- }
295-
296- int SendReceiveBlockingLock (const unsigned int xid , struct cifs_tcon * tcon ,
297- struct smb_hdr * in_buf , unsigned int in_len ,
298- struct smb_hdr * out_buf , int * pbytes_returned )
299- {
300- int rc = 0 ;
301- int rstart = 0 ;
302- struct mid_q_entry * mid ;
303- struct cifs_ses * ses ;
304- struct kvec iov = { .iov_base = in_buf , .iov_len = in_len };
305- struct smb_rqst rqst = { .rq_iov = & iov , .rq_nvec = 1 };
306- unsigned int instance ;
307- struct TCP_Server_Info * server ;
308-
309- if (WARN_ON_ONCE (in_len > 0xffffff ))
310- return - EIO ;
311- if (tcon == NULL || tcon -> ses == NULL ) {
312- cifs_dbg (VFS , "Null smb session\n" );
313- return - EIO ;
314- }
315- ses = tcon -> ses ;
316- server = ses -> server ;
317-
318- if (server == NULL ) {
319- cifs_dbg (VFS , "Null tcp session\n" );
320- return - EIO ;
321- }
322-
323- spin_lock (& server -> srv_lock );
324- if (server -> tcpStatus == CifsExiting ) {
325- spin_unlock (& server -> srv_lock );
326- return - ENOENT ;
327- }
328- spin_unlock (& server -> srv_lock );
329-
330- /* Ensure that we do not send more than 50 overlapping requests
331- to the same server. We may make this configurable later or
332- use ses->maxReq */
333-
334- if (in_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE ) {
335- cifs_tcon_dbg (VFS , "Invalid length, greater than maximum frame, %d\n" ,
336- in_len );
337- return - EIO ;
338- }
339-
340- rc = wait_for_free_request (server , CIFS_BLOCKING_OP , & instance );
341- if (rc )
342- return rc ;
343-
344- /* make sure that we sign in the same order that we send on this socket
345- and avoid races inside tcp sendmsg code that could cause corruption
346- of smb data */
347-
348- cifs_server_lock (server );
349-
350- rc = allocate_mid (ses , in_buf , & mid );
351- if (rc ) {
352- cifs_server_unlock (server );
353- return rc ;
354- }
355-
356- rc = cifs_sign_rqst (& rqst , server , & mid -> sequence_number );
357- if (rc ) {
358- delete_mid (mid );
359- cifs_server_unlock (server );
360- return rc ;
361- }
362-
363- mid -> mid_state = MID_REQUEST_SUBMITTED ;
364- rc = __smb_send_rqst (server , 1 , & rqst );
365- cifs_save_when_sent (mid );
366-
367- if (rc < 0 )
368- server -> sequence_number -= 2 ;
369-
370- cifs_server_unlock (server );
371-
372- if (rc < 0 ) {
373- delete_mid (mid );
374- return rc ;
375- }
376-
377- /* Wait for a reply - allow signals to interrupt. */
378- rc = wait_event_interruptible (server -> response_q ,
379- (!(mid -> mid_state == MID_REQUEST_SUBMITTED ||
380- mid -> mid_state == MID_RESPONSE_RECEIVED )) ||
381- ((server -> tcpStatus != CifsGood ) &&
382- (server -> tcpStatus != CifsNew )));
383-
384- /* Were we interrupted by a signal ? */
385- spin_lock (& server -> srv_lock );
386- if ((rc == - ERESTARTSYS ) &&
387- (mid -> mid_state == MID_REQUEST_SUBMITTED ||
388- mid -> mid_state == MID_RESPONSE_RECEIVED ) &&
389- ((server -> tcpStatus == CifsGood ) ||
390- (server -> tcpStatus == CifsNew ))) {
391- spin_unlock (& server -> srv_lock );
392-
393- if (in_buf -> Command == SMB_COM_TRANSACTION2 ) {
394- /* POSIX lock. We send a NT_CANCEL SMB to cause the
395- blocking lock to return. */
396- rc = send_cancel (server , & rqst , mid );
397- if (rc ) {
398- delete_mid (mid );
399- return rc ;
400- }
401- } else {
402- /* Windows lock. We send a LOCKINGX_CANCEL_LOCK
403- to cause the blocking lock to return. */
404-
405- rc = send_lock_cancel (xid , tcon , in_buf , in_len , out_buf );
406-
407- /* If we get -ENOLCK back the lock may have
408- already been removed. Don't exit in this case. */
409- if (rc && rc != - ENOLCK ) {
410- delete_mid (mid );
411- return rc ;
412- }
413- }
414-
415- rc = wait_for_response (server , mid );
416- if (rc ) {
417- send_cancel (server , & rqst , mid );
418- spin_lock (& mid -> mid_lock );
419- if (mid -> callback ) {
420- /* no longer considered to be "in-flight" */
421- mid -> callback = release_mid ;
422- spin_unlock (& mid -> mid_lock );
423- return rc ;
424- }
425- spin_unlock (& mid -> mid_lock );
426- }
427-
428- /* We got the response - restart system call. */
429- rstart = 1 ;
430- spin_lock (& server -> srv_lock );
431- }
432- spin_unlock (& server -> srv_lock );
433-
434- rc = cifs_sync_mid_result (mid , server );
435- if (rc != 0 )
436- return rc ;
437-
438- /* rcvd frame is ok */
439- if (out_buf == NULL || mid -> mid_state != MID_RESPONSE_READY ) {
440- rc = - EIO ;
441- cifs_tcon_dbg (VFS , "Bad MID state?\n" );
442- goto out ;
257+ if (out_buf ) {
258+ * pbytes_returned = resp_iov .iov_len ;
259+ if (resp_iov .iov_len )
260+ memcpy (out_buf , resp_iov .iov_base , resp_iov .iov_len );
443261 }
444-
445- * pbytes_returned = mid -> response_pdu_len ;
446- memcpy (out_buf , mid -> resp_buf , * pbytes_returned );
447- rc = cifs_check_receive (mid , server , 0 );
448- out :
449- delete_mid (mid );
450- if (rstart && rc == - EACCES )
451- return - ERESTARTSYS ;
262+ free_rsp_buf (resp_buf_type , resp_iov .iov_base );
452263 return rc ;
453264}
0 commit comments