Author: trasz
Date: Wed May  7 07:33:56 2014
New Revision: 265510
URL: http://svnweb.freebsd.org/changeset/base/265510

Log:
  MFC r264527:
  
  Make it possible to interrupt login when running in proxy mode.
  
  Sponsored by: The FreeBSD Foundation

Modified:
  stable/10/sys/cam/ctl/ctl_frontend_iscsi.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cam/ctl/ctl_frontend_iscsi.c
==============================================================================
--- stable/10/sys/cam/ctl/ctl_frontend_iscsi.c  Wed May  7 07:32:45 2014        
(r265509)
+++ stable/10/sys/cam/ctl/ctl_frontend_iscsi.c  Wed May  7 07:33:56 2014        
(r265510)
@@ -1130,6 +1130,9 @@ cfiscsi_session_terminate(struct cfiscsi
                return;
        cs->cs_terminating = 1;
        cv_signal(&cs->cs_maintenance_cv);
+#ifdef ICL_KERNEL_PROXY
+       cv_signal(&cs->cs_login_cv);
+#endif
 }
 
 static int
@@ -1864,6 +1867,7 @@ cfiscsi_ioctl_receive(struct ctl_iscsi *
        struct cfiscsi_session *cs;
        struct icl_pdu *ip;
        void *data;
+       int error;
 
        cirp = (struct ctl_iscsi_receive_params *)&(ci->data);
 
@@ -1874,7 +1878,8 @@ cfiscsi_ioctl_receive(struct ctl_iscsi *
        }
        if (cs == NULL) {
                mtx_unlock(&cfiscsi_softc.lock);
-               snprintf(ci->error_str, sizeof(ci->error_str), "connection not 
found");
+               snprintf(ci->error_str, sizeof(ci->error_str),
+                   "connection not found");
                ci->status = CTL_ISCSI_ERROR;
                return;
        }
@@ -1886,12 +1891,21 @@ cfiscsi_ioctl_receive(struct ctl_iscsi *
 #endif
 
        CFISCSI_SESSION_LOCK(cs);
-       while (cs->cs_login_pdu == NULL &&
-           cs->cs_terminating == false)
-               cv_wait(&cs->cs_login_cv, &cs->cs_lock);
+       while (cs->cs_login_pdu == NULL && cs->cs_terminating == false) {
+               error = cv_wait_sig(&cs->cs_login_cv, &cs->cs_lock);
+               if (error != 0) {
+                       CFISCSI_SESSION_UNLOCK(cs);
+                       snprintf(ci->error_str, sizeof(ci->error_str),
+                           "interrupted by signal");
+                       ci->status = CTL_ISCSI_ERROR;
+                       return;
+               }
+       }
+
        if (cs->cs_terminating) {
                CFISCSI_SESSION_UNLOCK(cs);
-               snprintf(ci->error_str, sizeof(ci->error_str), "connection 
terminating");
+               snprintf(ci->error_str, sizeof(ci->error_str),
+                   "connection terminating");
                ci->status = CTL_ISCSI_ERROR;
                return;
        }
@@ -1901,7 +1915,8 @@ cfiscsi_ioctl_receive(struct ctl_iscsi *
 
        if (ip->ip_data_len > cirp->data_segment_len) {
                icl_pdu_free(ip);
-               snprintf(ci->error_str, sizeof(ci->error_str), "data segment 
too big");
+               snprintf(ci->error_str, sizeof(ci->error_str),
+                   "data segment too big");
                ci->status = CTL_ISCSI_ERROR;
                return;
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to