Commit Graph

144 Commits

Author SHA1 Message Date
Bart Van Assche
b85002b263 Made sure that if a work completion reports an error status that
completion queue processing is not aborted but that the remaining
completion queue entries are processed.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1446 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-11 19:00:03 +00:00
Bart Van Assche
530ecf06c2 Converted a WARN_ON() into a PRINT_ERROR() statement.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1445 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-11 18:41:55 +00:00
Bart Van Assche
661ecd52d2 Close IB channel after session unregistration instead of before in order
to prevent the following errors to occur:
ib_srpt: srpt_completion:1737:***ERROR***: failed sending response status= 4
ib_srpt: srpt_completion:1737:***ERROR***: failed sending response status= 5


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1444 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-11 11:30:08 +00:00
Bart Van Assche
5cc522712e Fixed the following race conditions:
- With thread=1, the kernel thread was stopped before all I/O was stopped.
  This could result in IB completions for responses sent to the initiator
  not being processed, scst_tgt_cmd_done() not being called for certain
  SCST commands and hence this race could cause "rmmod ib_srpt" to hang.
- ib_unregister_event_handler() was called after cancel_work_sync(). This
  could cause srpt_event_handler() to queue new work, work that could be
  executed after the data it operates on had been deallocated.
Change: simplified module unloading by calling ib_destroy_cm_id(sdev->cm_id)
  before calling scst_unregister(). This made the variable "cleaning_up"
  superfluous.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1441 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-09 20:14:13 +00:00
Bart Van Assche
7bf99a3584 Removed some TRACE_ENTRY() / TRACE_EXIT() statements.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1434 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-06 20:47:08 +00:00
Bart Van Assche
ca9004962d Changes:
- srpt_release_channel_by_cmid(): the sdev->spinlock and scst_mgmt_lock are
  no longer locked nested.
- srpt_find_channel(): does now return NULL when the channel is not found
  (which never happens).


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1432 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-06 20:11:24 +00:00
Bart Van Assche
6a523b3c13 Added more debugging code.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1430 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-04 20:56:00 +00:00
Bart Van Assche
45c93135f8 Changes:
- Removed references to SCST core internal state names.
- Does no longer accept new connections while unloading.
- Module unloading should now really no longer cause a hang.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1429 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-04 20:26:19 +00:00
Bart Van Assche
af086e27a8 Merged two lines.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1428 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-04 20:13:04 +00:00
Bart Van Assche
a8a72c1b51 Fixed sporadic lockup triggered by removing the ib_srpt kernel module.
The following complaint was logged by the kernel when this happened:

INFO: task rmmod:26637 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
rmmod         D 00000000ffffffff     0 26637  26629
 ffff88009ce9dbd8 0000000000000046 ffff88009ce9dbf8 ffffffff8052466e
 0000000000000000 0000000000000001 0000000000000001 0000000000000001
 ffff88003c24d070 00000000001d17c0 000000000000c8a0 ffff88003c24d078
Call Trace:
 [<ffffffff8052466e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
 [<ffffffff80522408>] schedule+0x18/0x40
 [<ffffffff805227a5>] schedule_timeout+0x165/0x1a0
 [<ffffffff80525320>] ? _spin_unlock_irq+0x30/0x60
 [<ffffffff8023f4d9>] ? sub_preempt_count+0xa9/0xe0
 [<ffffffff80521756>] wait_for_common+0x116/0x1a0
 [<ffffffff80248850>] ? default_wake_function+0x0/0x20
 [<ffffffff8052189d>] wait_for_completion+0x1d/0x20
 [<ffffffffa06983e1>] scst_unregister_session+0x101/0x240 [scst]
 [<ffffffffa070f52f>] srpt_release+0xef/0x1e0 [ib_srpt]
 [<ffffffff805252d5>] ? _spin_unlock_irqrestore+0x65/0x80
 [<ffffffffa0693f60>] scst_unregister+0x70/0x380 [scst]
 [<ffffffff805252b2>] ? _spin_unlock_irqrestore+0x42/0x80
 [<ffffffffa0711982>] srpt_remove_one+0xa2/0x190 [ib_srpt]
 [<ffffffffa03b3105>] ib_unregister_client+0x65/0x120 [ib_core]
 [<ffffffff8027a02d>] ? trace_hardirqs_on+0xd/0x10
 [<ffffffffa0715114>] srpt_cleanup_module+0x70/0xd4 [ib_srpt]
 [<ffffffff80284f87>] sys_delete_module+0x1a7/0x270
 [<ffffffff8020cc6d>] ? retint_swapgs+0xe/0x13
 [<ffffffff80279e79>] ? trace_hardirqs_on_caller+0x29/0x1d0
 [<ffffffff8052466e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
 [<ffffffff8020c21b>] system_call_fastpath+0x16/0x1b
INFO: lockdep is turned off.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1425 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-02 13:56:12 +00:00
Bart Van Assche
d124f1cc8e Changes:
- Decreased number of target-to-initiator request send buffers from two
  to one such that a clear error message can be printed when the SRP
  initiator did not respond to the SRP_CRED_REQ information unit.
- Bug fix: don't modify ch->last_response_req_lim when sending an SRP
  information unit that contains the REQUEST LIMIT DELTA field failed.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1424 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-02 12:27:32 +00:00
Bart Van Assche
e1de778c3a Changes related to credit-based SRP buffer management:
- Bug fix: don't set the REQUEST LIMIT DELTA field to SRPT_RQ_SIZE when
  sending the first reponse to the initiator but to the proper value
  (a small integer).
- An SRP_CRED_REQ information unit is now sent to the initiator if the
  number of I/O contexts available for receiving dropped below two I/O
  contexts (see also the SRP standard for more information). This change
  is required to fix the SRP initiator lockup that happens when the
  initiator sends requests faster than the target can process them. In
  order to fix the lockup, it is  also necessary to implement SRP_CRED_REQ
  support in the SRP initiator in the vanilla Linux kernel and in OFED.
  Neither kernel version 2.6.32 nor OFED 1.5 nor any previous
  version of these components supports SRP_CRED_REQ information units.
  See also http://bugzilla.kernel.org/show_bug.cgi?id=14235 for more
  information about the initiator lockup.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1423 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-01 17:48:07 +00:00
Bart Van Assche
0d4ba05ae8 Added and commented out the following statement:
EXTRA_CFLAGS += -DCONFIG_SCST_EXTRACHECKS


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1422 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-01-01 17:06:38 +00:00
Bart Van Assche
d1e5f40622 Changes:
- Convert sense data to/from fixed format / descriptor format before
  sending back a response.
- Print an error message to the kernel log when an unsupported IB event
  has been received.
- Return the SCSI status BUSY instead of CHECK CONDITION when allocating
  an SCST command failed (until r1409, the SCSI status in the SRP_RSP
  information unit was set to TASK SET FULL in this case).


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1419 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-28 19:31:51 +00:00
Bart Van Assche
2fbe389419 Behavior changes:
- Fixed: the SCSOLNT and UCSOLNT bits were ignored in received SRP requests,
  and the SOLNT bit was not set in responses when required. This is required
  by the SRP protocol specification.
- Fixed: SRP_RSP messages must be limited to the MAXIMUM TARGET TO INITIATOR
  IU LENGTH  field indicated in the SRP_LOGIN_RSP response instead of the
  maximum message size supported by SRPT. This is also required by the SRP
  protocol specification.
- Fixed: the STATUS field of response messages with status GOOD and that
  contain sense data is no longer modified into CHECK CONDITION.
Internal changes (refactoring):
- Replaced the SCSI sense data handling data structures and code in SRPT by
  those of the SCST core.
- Moved the code for building an error response from srpt_handle_cmd() and
  srpt_handle_tsk_mgmt() to srpt_handle_new_iu().
- Removed the ioctx::data_len member.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1416 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-25 15:26:42 +00:00
Bart Van Assche
50c6585066 Made sure that all log lines generated by the ib_srpt kernel module
have an "ib_srpt: " prefix. Thanks to Stanley Sufficool for the patch.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1409 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-18 19:11:24 +00:00
Bart Van Assche
9e72c9bade Bug fix: SRQ availability counter is no longer decremented when ib_post_send() fails.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1388 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-13 17:59:44 +00:00
Bart Van Assche
345cd34aae Whitespace-only change: fixed a checkpatch complaint.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1386 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-09 12:03:35 +00:00
Bart Van Assche
ca81d05dd7 Update: the __same_type() macro has been introduced in kernel version 2.6.31, not in 2.6.30.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1383 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-07 08:51:58 +00:00
Bart Van Assche
e4b93a83c0 - Fixed a checkpatch complaint.
- Made sure that the SRPT source code compiles again on systems with a 2.6.29
  or older kernel.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1382 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-07 08:07:58 +00:00
Bart Van Assche
799820d44b - Simplified error handling in srpt_get_desc_tbl(): incorrect indirect
descriptors are now reported by returning -EINVAL instead of setting the
  third argument to true. Removed the third argument of this function.
- Added support for SRP_CMD requests with non-zero ADDITIONAL CDB LENGTH.
  Note: support for these requests has not yet been tested -- I do not know
  of any SRP initiator that generates such requests.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1380 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-06 19:00:25 +00:00
Bart Van Assche
0486e8404c - Moved two constants from ib_srpt.c to ib_srpt.h.
- Changed default value of srp_max_message_size from 4096 to 2116. This
  size corresponds to the size of an SRP_CMD request message containing
  an indirect buffer list with 128 elements.
- A warning is now printed when an SRP_CMD request is received containing
  more than one CDB -- this kind of messages is not yet supported.
- Switched back from multiple ib_dma_sync_single_for_cpu() calls to a
  single call because the latter results in better performance.
- An error message is now printed if a corrupt SRP_CMD request has been
  received. Before these were ignored silently.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1377 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-12-05 10:10:53 +00:00
Bart Van Assche
7a330f2e09 Should have been included in the previous commit (r1371).
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1372 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-30 10:59:40 +00:00
Bart Van Assche
b371630185 Avoid dangling pointer dereferences by resetting ioctx->scmnd in srpt_on_free_cmd().
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1371 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-30 09:51:17 +00:00
Bart Van Assche
7cdcbc8c69 Cleanup:
- Removed a spinlock that became superfluous.
- Fixed checkpatch and sparse complaints.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1370 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-28 18:40:15 +00:00
Bart Van Assche
418e7fb3d6 - Split srpt_find_channel into two functions: srpt_find_channel() and
srpt_release_channel_by_cmid().
- Removed tracing statements from srpt_unmap_sg_to_ib_sge() because this
  function is now invoked while performing I/O.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1369 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-28 17:20:22 +00:00
Bart Van Assche
ec2e199060 Bug fixes (some introduced in the previous revision, some long-standing):
- Fixed system lockup triggered by "rmmod ib_srpt" while the SRP was writing
  data. This lockup occurred because srpt_reset_ioctx() was not resetting
  the pointers to the memory it freed, which indirectly triggered a kernel
  oops in the IB interrupt handler.
- Fixed BUG() during "rmmod ib_srpt" triggered by calling scst_rx_cmd()
  after scst_unregister_session(). This has been fixed by making sure that
  the channel state is set to RDMA_CHANNEL_DISCONNECTING before calling
  scst_unregister_session().
Performance improvements:
- Simplified cmd_wait_list manipulation code.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1368 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-28 16:36:53 +00:00
Bart Van Assche
f50ce17866 Bug fixes:
- Fixed races on srpt_ioctx::state manipulation by declaring this variable
  atomic.
- Fixed races on srpt_rdma_ch::state manipulation by declaring this variable
  atomic.
- Fixed bug in srpt_abort_scst_cmd(): SRPT_STATE_DATA_IN was not yet handled.
- Fixed races on srpt_rdma_ch::cm_id destruction. Clearly documented which
  object owns the cm_id at which time.
Performance improvements:
- Eliminated the list of active commands (active_scmnd_list) because this
  list was a duplicated of a list already kept by the SCST core.
- Switched to double-checked locking in srpt_handle_new_iu(). This saves one
  spin_lock_irqsave() and one spin_unlock_irqrestore() call in the common
  case (that is, a live channel).
- Eliminated RDMA channel state tests in SCST command handling callback
  functions -- removed the function srpt_abort_if_disconnecting().


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1367 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-28 14:03:55 +00:00
Bart Van Assche
e6f5aa8865 Changes:
- The message that sense data is truncated is now generated via the
  PRINT_WARNING() macro instead of TRACE_DBG().
- Cleaned up code for sense data truncation.
- Compiles again on RHEL and CentOS systems.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1363 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-27 17:52:47 +00:00
Bart Van Assche
1065e2d317 Log sense data truncation when debugging is enabled.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1362 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-27 12:10:59 +00:00
Bart Van Assche
10530125a5 Whitespace-only change.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1354 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-23 08:40:51 +00:00
Bart Van Assche
495257b44e - Added counter that keeps track of the number of work requests posted on
the per-channel queue pair. This counter is used to prevent that
  ib_post_send() triggers a queue overflow.
- Fixed error handling in srpt_xfer_data(): srpt_unmap_sg_to_ib_sge() is now
  called before returning an error code.
- Simplified implementation of the sysfs attribute login_info.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1353 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-22 18:42:35 +00:00
Bart Van Assche
a57d10033f Added more comments.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1344 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-17 18:01:16 +00:00
Bart Van Assche
9d65e4fe05 Removed a BUILD_BUG_ON() statement that was too restrictive.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1343 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-17 18:00:23 +00:00
Bart Van Assche
9955ef7627 Since the expression "sizeof(*sense) + sizeof(*sense) % 4" did not make
sense, replaced this expression by "sizeof(*sense)" and a BUILD_BUG_ON()
statement that verifies that sizeof(*sense) is a multiple of four. Should
the first expression have been "roundup(sizeof(*sense), 4)" ?


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1336 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-15 13:14:40 +00:00
Bart Van Assche
bcec50e065 - Small performance improvement: ib_dma_sync_for_device() and
ib_dma_sync_for_cpu() calls do now only synchronize the data areas used.
- Removed per-command mutex again because it's not a full solution with
  regard to avoiding races between module unloading / IB error handling and
  SCST's command handling.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1335 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-15 13:11:46 +00:00
Bart Van Assche
5c208ca261 - Fixed races between command abortion code and regular command processing
code.
- Fixed the bug that new commands could be queued for a channel that was
  being closed.
- Bug fix: ib_dma_unmap_sg() is now called by srpt_xmit_response() when
  aborting commands.
- Changed default value of the kernel module parameter 'thread' from zero
  to one because using thread=0 can cause the Linux and the OFED SRP
  initiator to lock up -- see also
  http://bugzilla.kernel.org/show_bug.cgi?id=14235 and
  https://bugs.openfabrics.org/show_bug.cgi?id=1745.
- Made disconnect logging more detailed -- added cm_id in output.
- Changed argument type of second argument of srpt_release_channel() from
  int to bool.
- Eliminated srpt_abort_scst_cmd's 'tell_initiator' argument because this
  argument always has the same value (i.e. true).
- Simplified abortion of commands in state SRPT_STATE_NEW. Simplified
  implementation of srpt_on_free_cmd().


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1332 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-11 18:44:05 +00:00
Bart Van Assche
a6e1b94e5b - Changed default maximum control message size from 996 to 4096 bytes.
As a result, the maximum number of sg list elements that an initiator
  can pass in one message increased from 58 to 251.
- Added kernel module parameter srp_max_message_size, which allows to
  specify the maximum size of SRP control messages.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1328 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-07 11:56:51 +00:00
Bart Van Assche
cdbd65daeb Removed trailing whitespace.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1313 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-03 07:46:39 +00:00
Bart Van Assche
d5cd0c893a - Fixed uninitialized variable read that was introduced in r1307.
- Introduced new kernel module parameter srp_max_rdma_size. This parameter
  allows to configure the maximum size of SRP RDMA transfers.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1312 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-02 19:45:45 +00:00
Bart Van Assche
b9f64a7c61 - Fixed a bug introduced in the previous commit.
- Added more debug tracing related to command abortion.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1308 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-01 20:11:30 +00:00
Bart Van Assche
c9f49128bb Fixed the following issues found by Vladislav Bolkhovitin via source reading:
- Inserted tests such that ib_dma_unmap_sg() is never called with a NULL
  second argument.
- Fixed race conditions triggered by ioctx->state manipulations.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1307 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-11-01 17:01:08 +00:00
Bart Van Assche
ec836491e4 Should have been included in the previous commit.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1303 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-29 19:42:53 +00:00
Bart Van Assche
eb46362a7b Added more debug code.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1299 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-29 18:56:23 +00:00
Bart Van Assche
debe7f1152 Added and commented out compiler flags that make it easier to locate the statement that triggered a kernel oops.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1298 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-29 18:42:53 +00:00
Bart Van Assche
773146af26 Added and commented out -DCONFIG_SCST_TRACING.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1270 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-25 09:39:55 +00:00
Bart Van Assche
87be4a7213 More #undef CONFIG_SCST_PROC fixes.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1269 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-25 09:39:27 +00:00
Bart Van Assche
942aef8387 Compiles now with CONFIG_SCST_PROC undefined.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1255 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-23 10:56:44 +00:00
Bart Van Assche
77af82d2c3 Compiles again on RHEL 5 / CentOS 5 with CONFIG_SCST_DEBUG enabled.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1176 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-10-04 08:31:04 +00:00
Bart Van Assche
994b61e39b Added more error injection code.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1154 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-09-26 15:51:58 +00:00