From: <vl...@us...> - 2008-01-04 17:30:03
|
Revision: 242 http://scst.svn.sourceforge.net/scst/?rev=242&view=rev Author: vlnb Date: 2008-01-04 09:29:58 -0800 (Fri, 04 Jan 2008) Log Message: ----------- - Fixes two problems on connection closing, leading to crashes and memory corruptions - Small logging improvements Modified Paths: -------------- trunk/iscsi-scst/kernel/iscsi.c trunk/iscsi-scst/kernel/nthread.c trunk/scst/src/scst_lib.c Modified: trunk/iscsi-scst/kernel/iscsi.c =================================================================== --- trunk/iscsi-scst/kernel/iscsi.c 2007-12-31 11:42:23 UTC (rev 241) +++ trunk/iscsi-scst/kernel/iscsi.c 2008-01-04 17:29:58 UTC (rev 242) @@ -261,6 +261,8 @@ TRACE_DBG("%p", req); + sBUG_ON(req == conn->read_cmnd); + if (flags & ISCSI_FORCE_RELEASE_WRITE) { spin_lock(&conn->write_list_lock); list_for_each_entry_safe(rsp, t, &conn->write_list, @@ -921,7 +923,7 @@ sBUG_ON(sg[idx].page == NULL); addr = page_address(sg[idx].page); sBUG_ON(addr == NULL); - conn->read_iov[i].iov_base = addr + offset; + conn->read_iov[i].iov_base = addr + offset; if (offset + size <= PAGE_SIZE) { TRACE_DBG("idx=%d, offset=%u, size=%d, addr=%p", idx, offset, size, addr); @@ -2478,6 +2480,8 @@ TRACE_ENTRY(); + /* This should be checked for immediate TM commands as well */ + switch(function) { default: if (before(sess->exp_cmd_sn, req_hdr->cmd_sn)) Modified: trunk/iscsi-scst/kernel/nthread.c =================================================================== --- trunk/iscsi-scst/kernel/nthread.c 2007-12-31 11:42:23 UTC (rev 241) +++ trunk/iscsi-scst/kernel/nthread.c 2008-01-04 17:29:58 UTC (rev 242) @@ -134,14 +134,15 @@ /* We want all our already send operations to complete */ conn->sock->ops->shutdown(conn->sock, RCV_SHUTDOWN); - conn_abort(conn); - if (conn->read_state != RX_INIT_BHS) { - req_cmnd_release_force(conn->read_cmnd, 0); + struct iscsi_cmnd *cmnd = conn->read_cmnd; conn->read_cmnd = NULL; conn->read_state = RX_INIT_BHS; + req_cmnd_release_force(cmnd, 0); } + conn_abort(conn); + /* ToDo: not the best way to wait */ while(atomic_read(&conn->conn_ref_cnt) != 0) { struct iscsi_cmnd *cmnd; @@ -372,6 +373,8 @@ struct msghdr msg; int res, first_len; + sBUG_ON(conn->read_cmnd == NULL); + if (unlikely(conn->closing)) { res = -EIO; goto out; @@ -559,12 +562,13 @@ sBUG(); } + conn->read_cmnd = NULL; + conn->read_state = RX_INIT_BHS; + cmnd_rx_end(cmnd); sBUG_ON(conn->read_size != 0); - conn->read_cmnd = NULL; - conn->read_state = RX_INIT_BHS; res = 0; out: Modified: trunk/scst/src/scst_lib.c =================================================================== --- trunk/scst/src/scst_lib.c 2007-12-31 11:42:23 UTC (rev 241) +++ trunk/scst/src/scst_lib.c 2008-01-04 17:29:58 UTC (rev 242) @@ -2291,17 +2291,27 @@ goto out; } else { - TRACE(TRACE_MGMT_MINOR, "Internal MODE SENSE to device " - "%d:%d:%d:%d failed: %x", dev->scsi_dev->host->host_no, - dev->scsi_dev->channel, dev->scsi_dev->id, - dev->scsi_dev->lun, res); - TRACE_BUFF_FLAG(TRACE_MGMT_MINOR, "MODE SENSE sense", - sense_buffer, sizeof(sense_buffer)); if ((status_byte(res) == CHECK_CONDITION) && SCST_SENSE_VALID(sense_buffer) && (sense_buffer[2] == ILLEGAL_REQUEST)) { + TRACE(TRACE_MGMT_MINOR, "Device %d:%d:%d:%d " + "doesn't support control mode page, using " + "defaults: TST %x, QUEUE ALG %x, SWP %x, " + "TAS %x, has_own_order_mgmt %d", + dev->scsi_dev->host->host_no, + dev->scsi_dev->channel, dev->scsi_dev->id, + dev->scsi_dev->lun, dev->tst, dev->queue_alg, + dev->swp, dev->tas, dev->has_own_order_mgmt); res = 0; goto out; + } else { + TRACE(TRACE_MGMT_MINOR, "Internal MODE SENSE to " + "device %d:%d:%d:%d failed: %x", + dev->scsi_dev->host->host_no, + dev->scsi_dev->channel, dev->scsi_dev->id, + dev->scsi_dev->lun, res); + TRACE_BUFF_FLAG(TRACE_MGMT_MINOR, "MODE SENSE sense", + sense_buffer, sizeof(sense_buffer)); } scst_check_internal_sense(dev, res, sense_buffer, sizeof(sense_buffer)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |