Commit Graph

110 Commits

Author SHA1 Message Date
Bart Van Assche
4decd55808 - Removed blank lines from kernel log.
- When a session is being released, it is now logged why.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1090 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-09-13 19:13:31 +00:00
Bart Van Assche
9d78dc61b7 - Renamed PFX macro to LOG_PFX such that it is recognized by the
PRINT_INFO() and related macro's.
- Replaced printk(KERN_INFO PFX and printk(KERN_ERROR PFX by
  PRINT_INFO( and PRINT_ERROR( respectively.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1089 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-09-13 18:15:05 +00:00
Bart Van Assche
7d65deaac8 Updated SRPT to do list.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1069 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-09-02 16:43:54 +00:00
Bart Van Assche
097f5151cb Refinements for SRPT command processing state management.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1059 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-16 13:27:01 +00:00
Bart Van Assche
28cb02f78b Minor documentation updates.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1056 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-15 13:54:36 +00:00
Bart Van Assche
1e1b800f8b - Changed the identification string displayed by the ibsrpdm tool from
"Mellanox OFED SRP target" to "SCST SRP target" to reflect that this
  version of the SRP target is distributed through the SCST project.
- Added kernel parameter use_port_guid_in_session_name that allows to
  use the original session naming scheme of the SRP target. This should
  make it again possible to connect to a multiport SRP target by masking
  out redundant paths on the target.
- Made sure that whenever a login is rejected that a kernel message is
  generated (printk()) such that this information ends up in
  /var/log/messages.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1055 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-15 13:48:12 +00:00
Bart Van Assche
6f191159e9 Added more comments.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1054 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-15 13:33:24 +00:00
Bart Van Assche
e6bd69006a Changed terminology in comments and one printk() message such that it
matches the terminology used in the SRP spec.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1046 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-13 19:05:31 +00:00
Bart Van Assche
fdfb159727 Fixed typo.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1042 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-13 09:33:28 +00:00
Bart Van Assche
63b8d248ce Removed the one_guid_per_ioc kernel parameter again because it did not
solve the connectivity problem between WinOF and an SRP target
equipped with multiple IB ports.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1039 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-11 19:58:48 +00:00
Bart Van Assche
92ef2de4a5 Added a note about the size of struct ib_qp_attr.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1038 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-11 19:24:30 +00:00
Bart Van Assche
fb6bad5bd9 Should have been included in the previous commit (r1034).
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1035 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-10 15:44:22 +00:00
Bart Van Assche
64f93b6add - Implemented kernel module parameter one_guid_per_ioc. Setting this
parameter to true should make it possible to connect from a WinOF
  initiator to an SRP target when there is more than one IB path
  between initiator and target.
- Renamed mellanox_ioc_guid into global_ioc_guid.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1034 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-10 15:28:03 +00:00
Bart Van Assche
3d227b8f73 - Added consistency checking for the SRPT command state management
introduced in r1026.
- Removed WARN_ON() statements that could trigger a warning when nothing
  was wrong because these were reading uninitialized memory. These statements
  were introduced in r1026. The call stack of the warning logged in the
  kernel log is as follows:
  <IRQ>  [<ffffffffa057f578>] ? srpt_handle_new_iu+0x818/0xaf0 [ib_srpt]
  [<ffffffff80243f18>] warn_slowpath_common+0x78/0xd0
  [<ffffffff80243f7f>] warn_slowpath_null+0xf/0x20
  [<ffffffffa057f578>] srpt_handle_new_iu+0x818/0xaf0 [ib_srpt]
  [<ffffffffa057f9ab>] srpt_completion+0x15b/0x230 [ib_srpt]
  [<ffffffffa04351f2>] mlx4_ib_cq_comp+0x12/0x20 [mlx4_ib]
  [<ffffffffa01eb1aa>] mlx4_cq_completion+0x3a/0x80 [mlx4_core]
  [<ffffffffa01ec475>] mlx4_eq_int+0x2a5/0x2e0 [mlx4_core]
  [<ffffffffa01ec59a>] mlx4_msi_x_interrupt+0x6a/0x90 [mlx4_core]
  [<ffffffff8027c0aa>] handle_IRQ_event+0x3a/0xf0
  [<ffffffff8027dee1>] handle_edge_irq+0xc1/0x160
  [<ffffffff8020ec3f>] handle_irq+0x1f/0x30
  [<ffffffff8020e37a>] do_IRQ+0x6a/0xf0
  [<ffffffff8020c7d3>] ret_from_intr+0x0/0xa
  <EOI>  [<ffffffffa0012e52>] ? acpi_idle_enter_simple+0x159/0x187 [processor]
  [<ffffffffa0012e48>] ? acpi_idle_enter_simple+0x14f/0x187 [processor]
  [<ffffffff804323e5>] ? cpuidle_idle_call+0xa5/0x100
  [<ffffffff8020b0a2>] ? cpu_idle+0x62/0xd0
  [<ffffffff804be614>] ? rest_init+0x84/0x90
  [<ffffffff8067ecc5>] ? start_kernel+0x35a/0x415
  [<ffffffff8067e289>] ? x86_64_start_reservations+0x99/0xb9
  [<ffffffff8067e389>] ? x86_64_start_kernel+0xe0/0xf2


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1030 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-10 09:57:30 +00:00
Bart Van Assche
bbad4dfcaa - Fixed memory leak in srpt_handle_tsk_mgmt() error path.
- Modified srpt_build_cmd_rsp() and srpt_build_tskmgmt_rsp() such that
  these two functions now return the number of bytes of the response PDU
  built.
- Converted a printk() statement to TRACE_DBG().


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1029 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-08 15:02:19 +00:00
Bart Van Assche
375a72b685 Added more comments.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1028 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-08 14:59:28 +00:00
Bart Van Assche
1b516fab15 Implemented SRPT command state management. The SRPT target code does no
longer rely on the struct scst_cmd state managed by the SCST core.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1026 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-08 11:52:46 +00:00
Bart Van Assche
c7572cd2cb Updated SRPT documentation.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1024 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-07 14:14:19 +00:00
Bart Van Assche
79b9d3141c Fixed the following checkpatch complaint: return is not a function,
parentheses are not required.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1019 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-06 13:42:28 +00:00
Bart Van Assche
7286d22319 Fixed data races on manipulation of the srpt_devices list by eliminating
this list. Only the number of IB devices is relevant for the SRPT
implementation. Introduced a new counter that tracks the number of IB
devices.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1016 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-06 10:05:10 +00:00
Bart Van Assche
e9feb2e818 - Refactoring: split srpt_ch_qp_rtr_rts() into two functions, namely
srpt_ch_qp_rtr() and srpt_ch_qp_rts().
- Replaced dynamic memory allocation (kmalloc()/kfree()) in the aforementioned
  two functions by stack allocation.
- Compiles again on pre-2.6.22 kernels (RHEL / CentOS systems).


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1015 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-06 09:12:37 +00:00
Bart Van Assche
8ca3e36e99 - Fixed race conditions related to channel state manipulation.
- Inlined srpt_disconnect_channel().
- Modified error handling coding style in srpt_cm_req_recv() to the usual
  kernel coding style: upon error, jump to the error handling code.
- Added more comments.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1014 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-05 19:48:16 +00:00
Bart Van Assche
6dc8835e7e - Bug fix: if processing of any of the SRP task management functions by
the SCST core fails (abort task, LUN reset, ...), an SRP_RSP PDU is
  now sent back to the initiator.
- Added more debug tracing statements.
- Improved readability of some parts of the source code.
- Added more comments.
- Partially reverted one hunk of r1003: while casting an unsigned 64-bit
  value to the type u64 and printing such values via %llx works fine on
  x86 systems, the same code triggers a compiler warning on PowerPC
  systems. So while r1003 changed some (unsigned long long) casts to (u64)
  casts, this revision changes these back to (unsigned long long) casts.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1012 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-04 18:45:46 +00:00
Bart Van Assche
70110ec078 Fixed race conditions on RDMA channel manipulations found via source reading:
- Added a second argument to srpt_find_channel() that specified whether or not
  the channel should be removed from the channel list if found.
- Moved list_del() statement from the body of the srpt_release_channel()
  function to its callers.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1005 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-03 16:00:36 +00:00
Bart Van Assche
7234de012f Multiple cosmetic source code changes.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1004 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-03 15:06:00 +00:00
Bart Van Assche
47d7742f4e - Enabled the LUN reset task management function.
- Changed return type of srpt_release_channel() from int to void
  because the return value did depend in a trivial way on the function
  arguments. Changed the return type of srpt_find_and_release_channel()
  and several of its callers also from int to void. Instead
  srpt_cm_handler() now directly sets its own return value.
- Converted a list_for_each_entry_safe() into a list_for_each_entry() loop
  because no elements are added or deleted in the loop body.
- Converted debug-printk() statements into TRACE_DBG().
- Changed indentation of one statement from 12 to 16 (was not reported by
  checkpatch).


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1003 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-02 18:57:48 +00:00
Bart Van Assche
7cb9d95684 Added even more comments.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1002 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-02 18:45:40 +00:00
Bart Van Assche
c49f89cec1 Whitespace-only change: fixed a checkpatch complaint.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1000 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-01 06:50:36 +00:00
Bart Van Assche
7c25f55ad9 Only call scst_tgt_cmd_done() if scst_rx_data() has not been called.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@999 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-08-01 06:03:55 +00:00
Bart Van Assche
58eb630bd0 Fixed the issue that 'rmmod ib_srpt' with ongoing SRP I/O could trigger
a deadlock.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@998 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-31 11:40:10 +00:00
Bart Van Assche
f5097d6263 Whitespace-only changes: fixed checkpatch complaints introduced in the previous commit.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@997 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-31 11:33:26 +00:00
Bart Van Assche
221ce1846b Added more comments.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@996 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-31 11:27:54 +00:00
Bart Van Assche
745a852fbe - Fixed a buffer overrun: a service entry name occupying 35 bytes was
written into a buffer with a size of 32 bytes. Enlarged the buffer
  to 36 bytes.
- Converted sprintf() calls to snprintf() calls.
- Added more TRACE_ENTRY() / TRACE_EXIT() statements.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@992 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-30 12:48:06 +00:00
Bart Van Assche
57f4019ed5 Moved /sys/class/infiniband_srpt/trace_level to
/proc/scsi_tgt/ib_srpt/trace_level such that the behavior of the
ib_srpt target is consistent with that of other SCST drivers.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@991 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-30 08:32:23 +00:00
Bart Van Assche
3bf7d6dca1 Compiles again with tracing disabled.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@990 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-30 06:38:15 +00:00
Bart Van Assche
3e18defd73 Should have been included in the previous commit (r988).
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@989 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-29 18:14:41 +00:00
Bart Van Assche
5d67fefe37 - Fixed a race condition found via source reading: srpt_remove_one() did not
wait until srpt_refresh_port_work() finished. This race condition could be
  triggered during module removal.
- Added a kernel module parameter called "trace_flag" that allows to set the
  trace flags for the ib_srpt module before module initialization starts.
- Added sysfs variable /sys/class/infiniband_srpt/trace_level that allows to
  display and to modify the enabled trace flags in a human-readable form.
- Added several TRACE_ENTRY() / TRACE_EXIT() statements.
- Added more comments.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@988 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-29 16:57:00 +00:00
Bart Van Assche
2de35d6ad4 Fixed the following issue reported by lockdep:
------------[ cut here ]------------
WARNING: at kernel/lockdep.c:2197 trace_hardirqs_on_caller+0x14c/0x1b0()
Call Trace:
 <IRQ>
 [<ffffffff8024636f>] warn_slowpath+0xaf/0x110
 [<ffffffff8026e1be>] ? check_usage_forwards+0x5e/0xc0
 [<ffffffff8026e818>] ? mark_lock+0x538/0xcc0
 [<ffffffff802ccfc1>] ? cache_alloc_refill+0x191/0x2b0
 [<ffffffff804ee62b>] ? _spin_unlock_irq+0x2b/0x40
 [<ffffffff8026f23c>] trace_hardirqs_on_caller+0x14c/0x1b0
 [<ffffffff8026f2ad>] trace_hardirqs_on+0xd/0x10
 [<ffffffff804ee62b>] _spin_unlock_irq+0x2b/0x40
 [<ffffffffa0657711>] srpt_handle_new_iu+0x2f1/0x630 [ib_srpt]
 [<ffffffffa0657bab>] srpt_completion+0x15b/0x300 [ib_srpt]
 [<ffffffffa04321f2>] mlx4_ib_cq_comp+0x12/0x20 [mlx4_ib]
 [<ffffffffa01f42aa>] mlx4_cq_completion+0x3a/0x80 [mlx4_core]
 [<ffffffffa01f5585>] mlx4_eq_int+0x295/0x2a0 [mlx4_core]
 [<ffffffffa01f561f>] mlx4_msi_x_interrupt+0xf/0x20 [mlx4_core]
 [<ffffffff80288565>] handle_IRQ_event+0x35/0x70
 [<ffffffff8028a144>] handle_edge_irq+0xb4/0x150
 [<ffffffff8020eb71>] do_IRQ+0x81/0x110
 [<ffffffff8020ced3>] ret_from_intr+0x0/0xf
 <EOI>
 [<ffffffff803b1a88>] ? cfb_imageblit+0x578/0x5a0
 [<ffffffff803aaf09>] ? bit_putcs+0x3d9/0x6a0
 [<ffffffff8026f252>] ? trace_hardirqs_on_caller+0x162/0x1b0
 [<ffffffff8026f2ad>] ? trace_hardirqs_on+0xd/0x10
 [<ffffffff804eb425>] ? thread_return+0x3d/0x928
 [<ffffffff803ab49b>] ? soft_cursor+0x1ab/0x220
 [<ffffffff803aaac7>] ? bit_cursor+0x647/0x6b0
 [<ffffffff803a4a9b>] ? fbcon_putcs+0x1cb/0x320
 [<ffffffff803aab30>] ? bit_putcs+0x0/0x6a0
 [<ffffffff803a7506>] ? fbcon_redraw+0x166/0x1d0
 [<ffffffff803a7770>] ? fbcon_scroll+0x200/0xd50
 [<ffffffff803f7af0>] ? scrup+0x100/0x110
 [<ffffffff803f7c7d>] ? lf+0x6d/0x70
 [<ffffffff803fbb1d>] ? do_con_write+0x9dd/0x2300
 [<ffffffff8026eff6>] ? mark_held_locks+0x56/0xa0
 [<ffffffff8026f252>] ? trace_hardirqs_on_caller+0x162/0x1b0
 [<ffffffff803fd499>] ? con_write+0x19/0x30
 [<ffffffff803ea683>] ? n_tty_write+0x383/0x480
 [<ffffffff8026f2ad>] ? trace_hardirqs_on+0xd/0x10
 [<ffffffff8023d7d0>] ? default_wake_function+0x0/0x10
 [<ffffffff803e76f4>] ? tty_write+0x1b4/0x280
 [<ffffffff803ea300>] ? n_tty_write+0x0/0x480
 [<ffffffff802d312b>] ? vfs_write+0xcb/0x170
 [<ffffffff802d32c0>] ? sys_write+0x50/0x90
 [<ffffffff8020c51b>] ? system_call_fastpath+0x16/0x1b
 ---[ end trace 954f4d9b9b9cdecc ]---


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@931 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-07-03 19:15:15 +00:00
Bart Van Assche
23e57ce05d Compiles now against vanilla 2.6.18 kernel headers.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@926 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-06-29 19:00:10 +00:00
Bart Van Assche
7084cac82e Display which kernel headers are used during compilation of the SRP target driver.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@913 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-06-18 18:35:05 +00:00
Bart Van Assche
010750bf7c Ported to 2.6.30 kernel.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@898 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-06-14 07:45:12 +00:00
Bart Van Assche
fd89f0427b Updated SRPT documentation.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@881 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-22 10:59:16 +00:00
Bart Van Assche
262a538807 - Compiles again on RHEL 5.
- RHEL 5 + OFED: fixed kernel oops that was triggered by the reception of
  an asynchronous InfiniBand event.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@880 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-22 06:39:42 +00:00
Bart Van Assche
4f8bd9a517 Removed the scst_released synchronization object because the previous
commit made it superfluous.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@879 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-21 12:41:53 +00:00
Bart Van Assche
7519550fcb Moved scst_register() call from srpt_detect() to srpt_add_one(). Added
call to scst_unregister() in srpt_remove_one(). Result:
- The kernel oops triggered by loading the ib_srpt kernel module before
  the InfiniBand subnet manager became active is now fixed.
- It is now possible to log in via the SRP protocol through HCA's that
  became active after the ib_srpt kernel module finished module
  initialization.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@878 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-21 12:34:11 +00:00
Bart Van Assche
106acdb7d6 - Switched to a more traditional error handling style with regard to MAD
handler registration: sport->mad_agent is now reset to NULL when MAD
  handler registration fails.
- Fixed bug in srpt_refresh_port(): this function now returns a negative
  value instead of zero when MAD registration fails.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@877 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-21 11:28:09 +00:00
Bart Van Assche
00dcebdb41 Fixed bug that was introduced through the previous commit (r875): a warning message was printed by srpt_remove_one() when sdev != NULL instead of when sdev == NULL.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@876 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-21 10:57:20 +00:00
Bart Van Assche
b2d0960b57 Moved the code for freeing the ring of I/O context structures to a separate function.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@875 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-21 06:54:42 +00:00
Bart Van Assche
2959a19435 Moved the code for unregistering the MAD agent into a separate function.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@874 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-21 06:33:38 +00:00
Bart Van Assche
7617a71367 Added more comments.
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@863 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2009-05-19 17:58:06 +00:00