17 Sep, 2020

2 commits

  • commit ed43ffea78dcc97db3f561da834f1a49c8961e33 upstream.

    The iSCSI target login thread might get stuck with the following stack:

    cat /proc/`pidof iscsi_np`/stack
    [] down_interruptible+0x42/0x50
    [] iscsit_access_np+0xe3/0x167
    [] iscsi_target_locate_portal+0x695/0x8ac
    [] __iscsi_target_login_thread+0x855/0xb82
    [] iscsi_target_login_thread+0x2f/0x5a
    [] kthread+0xfa/0x130
    [] ret_from_fork+0x1f/0x30

    This can be reproduced via the following steps:

    1. Initiator A tries to log in to iqn1-tpg1 on port 3260. After finishing
    PDU exchange in the login thread and before the negotiation is finished
    the the network link goes down. At this point A has not finished login
    and tpg->np_login_sem is held.

    2. Initiator B tries to log in to iqn2-tpg1 on port 3260. After finishing
    PDU exchange in the login thread the target expects to process remaining
    login PDUs in workqueue context.

    3. Initiator A' tries to log in to iqn1-tpg1 on port 3260 from a new
    socket. A' will wait for tpg->np_login_sem with np->np_login_timer
    loaded to wait for at most 15 seconds. The lock is held by A so A'
    eventually times out.

    4. Before A' got timeout initiator B gets negotiation failed and calls
    iscsi_target_login_drop()->iscsi_target_login_sess_out(). The
    np->np_login_timer is canceled and initiator A' will hang forever.
    Because A' is now in the login thread, no new login requests can be
    serviced.

    Fix this by moving iscsi_stop_login_thread_timer() out of
    iscsi_target_login_sess_out(). Also remove iscsi_np parameter from
    iscsi_target_login_sess_out().

    Link: https://lore.kernel.org/r/20200729130343.24976-1-houpu@bytedance.com
    Cc: stable@vger.kernel.org
    Reviewed-by: Mike Christie
    Signed-off-by: Hou Pu
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Hou Pu
     
  • commit 5528d03183fe5243416c706f64b1faa518b05130 upstream.

    Current code does not consider 'page_off' in data digest calculation. To
    fix this, add a local variable 'first_sg' and set first_sg.offset to
    sg->offset + page_off.

    Link: https://lore.kernel.org/r/1598358910-3052-1-git-send-email-varun@chelsio.com
    Fixes: e48354ce078c ("iscsi-target: Add iSCSI fabric support for target v4.1")
    Cc:
    Reviewed-by: Mike Christie
    Signed-off-by: Varun Prakash
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Varun Prakash
     

05 Sep, 2020

2 commits

  • commit 3c58f737231e2c8cbf543a09d84d8c8e80e05e43 upstream.

    (scatter|gather)_data_area() need to flush dcache after writing data to or
    before reading data from a page in uio data area. The two routines are
    able to handle data transfer to/from such a page in fragments and flush the
    cache after each fragment was copied by calling the wrapper
    tcmu_flush_dcache_range().

    That means:

    1) flush_dcache_page() can be called multiple times for the same page.

    2) Calling flush_dcache_page() indirectly using the wrapper does not make
    sense, because each call of the wrapper is for one single page only and
    the calling routine already has the correct page pointer.

    Change (scatter|gather)_data_area() such that, instead of calling
    tcmu_flush_dcache_range() before/after each memcpy, it now calls
    flush_dcache_page() before unmapping a page (when writing is complete for
    that page) or after mapping a page (when starting to read the page).

    After this change only calls to tcmu_flush_dcache_range() for addresses in
    vmalloc'ed command ring are left over.

    The patch was tested on ARM with kernel 4.19.118 and 5.7.2

    Link: https://lore.kernel.org/r/20200618131632.32748-2-bstroesser@ts.fujitsu.com
    Tested-by: JiangYu
    Tested-by: Daniel Meyerholt
    Acked-by: Mike Christie
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bodo Stroesser
     
  • commit 8c4e0f212398cdd1eb4310a5981d06a723cdd24f upstream.

    1) If remaining ring space before the end of the ring is smaller then the
    next cmd to write, tcmu writes a padding entry which fills the remaining
    space at the end of the ring.

    Then tcmu calls tcmu_flush_dcache_range() with the size of struct
    tcmu_cmd_entry as data length to flush. If the space filled by the
    padding was smaller then tcmu_cmd_entry, tcmu_flush_dcache_range() is
    called for an address range reaching behind the end of the vmalloc'ed
    ring.

    tcmu_flush_dcache_range() in a loop calls
    flush_dcache_page(virt_to_page(start)); for every page being part of the
    range. On x86 the line is optimized out by the compiler, as
    flush_dcache_page() is empty on x86.

    But I assume the above can cause trouble on other architectures that
    really have a flush_dcache_page(). For paddings only the header part of
    an entry is relevant due to alignment rules the header always fits in
    the remaining space, if padding is needed. So tcmu_flush_dcache_range()
    can safely be called with sizeof(entry->hdr) as the length here.

    2) After it has written a command to cmd ring, tcmu calls
    tcmu_flush_dcache_range() using the size of a struct tcmu_cmd_entry as
    data length to flush. But if a command needs many iovecs, the real size
    of the command may be bigger then tcmu_cmd_entry, so a part of the
    written command is not flushed then.

    Link: https://lore.kernel.org/r/20200528193108.9085-1-bstroesser@ts.fujitsu.com
    Acked-by: Mike Christie
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bodo Stroesser
     

03 Sep, 2020

2 commits

  • [ Upstream commit 3c006c7d23aac928279f7cbe83bbac4361255d53 ]

    transport_init_session can allocate memory via percpu_ref_init, and
    target_xcopy_release_pt never frees it. This adds a
    transport_uninit_session function to handle cleanup of resources allocated
    in the init function.

    Link: https://lore.kernel.org/r/1593654203-12442-3-git-send-email-michael.christie@oracle.com
    Signed-off-by: Mike Christie
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Mike Christie
     
  • [ Upstream commit 5a0c256d96f020e4771f6fd5524b80f89a2d3132 ]

    If tcmu_handle_completions() has to process a padding shorter than
    sizeof(struct tcmu_cmd_entry), the current call to
    tcmu_flush_dcache_range() with sizeof(struct tcmu_cmd_entry) as length
    param is wrong and causes crashes on e.g. ARM, because
    tcmu_flush_dcache_range() in this case calls
    flush_dcache_page(vmalloc_to_page(start)); with start being an invalid
    address above the end of the vmalloc'ed area.

    The fix is to use the minimum of remaining ring space and sizeof(struct
    tcmu_cmd_entry) as the length param.

    The patch was tested on kernel 4.19.118.

    See https://bugzilla.kernel.org/show_bug.cgi?id=208045#c10

    Link: https://lore.kernel.org/r/20200629093756.8947-1-bstroesser@ts.fujitsu.com
    Tested-by: JiangYu
    Acked-by: Mike Christie
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bodo Stroesser
     

26 Aug, 2020

1 commit

  • [ Upstream commit 3145550a7f8b08356c8ff29feaa6c56aca12901d ]

    This patch fixes the following crash (see
    https://bugzilla.kernel.org/show_bug.cgi?id=208045)

    Process iscsi_trx (pid: 7496, stack limit = 0x0000000010dd111a)
    CPU: 0 PID: 7496 Comm: iscsi_trx Not tainted 4.19.118-0419118-generic
    #202004230533
    Hardware name: Greatwall QingTian DF720/F601, BIOS 601FBE20 Sep 26 2019
    pstate: 80400005 (Nzcv daif +PAN -UAO)
    pc : flush_dcache_page+0x18/0x40
    lr : is_ring_space_avail+0x68/0x2f8 [target_core_user]
    sp : ffff000015123a80
    x29: ffff000015123a80 x28: 0000000000000000
    x27: 0000000000001000 x26: ffff000023ea5000
    x25: ffffcfa25bbe08b8 x24: 0000000000000078
    x23: ffff7e0000000000 x22: ffff000023ea5001
    x21: ffffcfa24b79c000 x20: 0000000000000fff
    x19: ffff7e00008fa940 x18: 0000000000000000
    x17: 0000000000000000 x16: ffff2d047e709138
    x15: 0000000000000000 x14: 0000000000000000
    x13: 0000000000000000 x12: ffff2d047fbd0a40
    x11: 0000000000000000 x10: 0000000000000030
    x9 : 0000000000000000 x8 : ffffc9a254820a00
    x7 : 00000000000013b0 x6 : 000000000000003f
    x5 : 0000000000000040 x4 : ffffcfa25bbe08e8
    x3 : 0000000000001000 x2 : 0000000000000078
    x1 : ffffcfa25bbe08b8 x0 : ffff2d040bc88a18
    Call trace:
    flush_dcache_page+0x18/0x40
    is_ring_space_avail+0x68/0x2f8 [target_core_user]
    queue_cmd_ring+0x1f8/0x680 [target_core_user]
    tcmu_queue_cmd+0xe4/0x158 [target_core_user]
    __target_execute_cmd+0x30/0xf0 [target_core_mod]
    target_execute_cmd+0x294/0x390 [target_core_mod]
    transport_generic_new_cmd+0x1e8/0x358 [target_core_mod]
    transport_handle_cdb_direct+0x50/0xb0 [target_core_mod]
    iscsit_execute_cmd+0x2b4/0x350 [iscsi_target_mod]
    iscsit_sequence_cmd+0xd8/0x1d8 [iscsi_target_mod]
    iscsit_process_scsi_cmd+0xac/0xf8 [iscsi_target_mod]
    iscsit_get_rx_pdu+0x404/0xd00 [iscsi_target_mod]
    iscsi_target_rx_thread+0xb8/0x130 [iscsi_target_mod]
    kthread+0x130/0x138
    ret_from_fork+0x10/0x18
    Code: f9000bf3 aa0003f3 aa1e03e0 d503201f (f9400260)
    ---[ end trace 1e451c73f4266776 ]---

    The solution is based on patch:

    "scsi: target: tcmu: Optimize use of flush_dcache_page"

    which restricts the use of tcmu_flush_dcache_range() to addresses from
    vmalloc'ed areas only.

    This patch now replaces the virt_to_page() call in
    tcmu_flush_dcache_range() - which is wrong for vmalloced addrs - by
    vmalloc_to_page().

    The patch was tested on ARM with kernel 4.19.118 and 5.7.2

    Link: https://lore.kernel.org/r/20200618131632.32748-3-bstroesser@ts.fujitsu.com
    Tested-by: JiangYu
    Tested-by: Daniel Meyerholt
    Acked-by: Mike Christie
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bodo Stroesser
     

24 Jun, 2020

3 commits

  • [ Upstream commit 9d7464b18892332e35ff37f0b024429a1a9835e6 ]

    The pr_debug() dereferences "cmd" after we already freed it by calling
    tcmu_free_cmd(cmd). The debug printk needs to be done earlier.

    Link: https://lore.kernel.org/r/20200523101129.GB98132@mwanda
    Fixes: 61fb24822166 ("scsi: target: tcmu: Userspace must not complete queued commands")
    Reviewed-by: Mike Christie
    Reviewed-by: David Disseldorp
    Signed-off-by: Dan Carpenter
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Dan Carpenter
     
  • [ Upstream commit 61fb2482216679b9e1e797440c148bb143a5040a ]

    When tcmu queues a new command - no matter whether in command ring or in
    qfull_queue - a cmd_id from IDR udev->commands is assigned to the command.

    If userspace sends a wrong command completion containing the cmd_id of a
    command on the qfull_queue, tcmu_handle_completions() finds the command in
    the IDR and calls tcmu_handle_completion() for it. This might do some nasty
    things because commands in qfull_queue do not have a valid dbi list.

    To fix this bug, we no longer add queued commands to the idr. Instead the
    cmd_id is assign when a command is written to the command ring.

    Due to this change I had to adapt the source code at several places where
    up to now an idr_for_each had been done.

    [mkp: fix checkpatch warnings]

    Link: https://lore.kernel.org/r/20200518164833.12775-1-bstroesser@ts.fujitsu.com
    Acked-by: Mike Christie
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bodo Stroesser
     
  • [ Upstream commit c68a56736c129f5dd1632856956f9c3e04bae200 ]

    We use tcm_loop with tape emulations running on tcmu.

    In case application reads a short tape block with a longer READ, or a long
    tape block with a short READ, according to SCC spec data has to be
    tranferred _and_ sensebytes with ILI set and information field containing
    the residual count. Similar problem also exists when using fixed block
    size in READ.

    Up to now tcm_loop is not prepared to handle sensebytes if input data is
    provided, as in tcm_loop_queue_data_in() it only sets SAM_STAT_GOOD and, if
    necessary, the residual count.

    To fix the bug, the same handling for sensebytes as present in
    tcm_loop_queue_status() must be done in tcm_loop_queue_data_in() also.

    After adding this handling, the two function now are nearly identical, so I
    created a single function with two wrappers.

    Link: https://lore.kernel.org/r/20200428182617.32726-1-bstroesser@ts.fujitsu.com
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bodo Stroesser
     

27 May, 2020

1 commit

  • commit f2e6b75f6ee82308ef7b00f29e71e5f1c6b3d52a upstream.

    Testing with Loopback I found that, after a Loopback LUN has executed a
    TMR, I can no longer unlink the LUN. The rm command hangs in
    transport_clear_lun_ref() at wait_for_completion(&lun->lun_shutdown_comp)
    The reason is, that transport_lun_remove_cmd() is not called at the end of
    target_tmr_work().

    It seems, that in other fabrics this call happens implicitly when the
    fabric drivers call transport_generic_free_cmd() during their
    ->queue_tm_rsp().

    Unfortunately Loopback seems to not comply to the common way
    of calling transport_generic_free_cmd() from ->queue_*().
    Instead it calls transport_generic_free_cmd() from its
    ->check_stop_free() only.

    But the ->check_stop_free() is called by
    transport_cmd_check_stop_to_fabric() after it has reset the se_cmd->se_lun
    pointer. Therefore the following transport_generic_free_cmd() skips the
    transport_lun_remove_cmd().

    So this patch re-adds the transport_lun_remove_cmd() at the end of
    target_tmr_work(), which was removed during commit 2c9fa49e100f ("scsi:
    target/core: Make ABORT and LUN RESET handling synchronous").

    For fabrics using transport_generic_free_cmd() in the usual way the double
    call to transport_lun_remove_cmd() doesn't harm, as
    transport_lun_remove_cmd() checks for this situation and does not release
    lun_ref twice.

    Link: https://lore.kernel.org/r/20200513153443.3554-1-bstroesser@ts.fujitsu.com
    Fixes: 2c9fa49e100f ("scsi: target/core: Make ABORT and LUN RESET handling synchronous")
    Cc: stable@vger.kernel.org
    Tested-by: Bryant G. Ly
    Reviewed-by: Bart van Assche
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bodo Stroesser
     

06 May, 2020

1 commit

  • commit 1d2ff149b263c9325875726a7804a0c75ef7112e upstream.

    SBC4 specifies that WRITE SAME requests with the UNMAP bit set to zero
    "shall perform the specified write operation to each LBA specified by the
    command". Commit 2237498f0b5c ("target/iblock: Convert WRITE_SAME to
    blkdev_issue_zeroout") modified the iblock backend to call
    blkdev_issue_zeroout() when handling WRITE SAME requests with UNMAP=0 and a
    zero data segment.

    The iblock blkdev_issue_zeroout() call incorrectly provides a flags
    parameter of 0 (bool false), instead of BLKDEV_ZERO_NOUNMAP. The bool
    false parameter reflects the blkdev_issue_zeroout() API prior to commit
    ee472d835c26 ("block: add a flags argument to (__)blkdev_issue_zeroout")
    which was merged shortly before 2237498f0b5c.

    Link: https://lore.kernel.org/r/20200419163109.11689-1-ddiss@suse.de
    Fixes: 2237498f0b5c ("target/iblock: Convert WRITE_SAME to blkdev_issue_zeroout")
    Reviewed-by: Bart Van Assche
    Signed-off-by: David Disseldorp
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    David Disseldorp
     

02 May, 2020

2 commits

  • [ Upstream commit 066f79a5fd6d1b9a5cc57b5cd445b3e4bb68a5b2 ]

    In case command ring buffer becomes inconsistent, tcmu sets device flag
    TCMU_DEV_BIT_BROKEN. If the bit is set, tcmu rejects new commands from LIO
    core with TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, and no longer processes
    completions from the ring. The reset_ring attribute can be used to
    completely clean up the command ring, so after reset_ring the ring no
    longer is inconsistent.

    Therefore reset_ring also should reset bit TCMU_DEV_BIT_BROKEN to allow
    normal processing.

    Link: https://lore.kernel.org/r/20200409101026.17872-1-bstroesser@ts.fujitsu.com
    Acked-by: Mike Christie
    Signed-off-by: Bodo Stroesser
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bodo Stroesser
     
  • [ Upstream commit 8fed04eb79a74cbf471dfaa755900a51b37273ab ]

    Creation of the response to READ FULL STATUS fails for FC based
    reservations. Reason is the too high loop limit (< 24) in
    fc_get_pr_transport_id(). The string representation of FC WWPN is 23 chars
    long only ("11:22:33:44:55:66:77:88"). So when i is 23, the loop body is
    executed a last time for the ending '\0' of the string and thus hex2bin()
    reports an error.

    Link: https://lore.kernel.org/r/20200408132610.14623-3-bstroesser@ts.fujitsu.com
    Signed-off-by: Bodo Stroesser
    Reviewed-by: Mike Christie
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bodo Stroesser
     

21 Apr, 2020

2 commits

  • [ Upstream commit 57c46e9f33da530a2485fa01aa27b6d18c28c796 ]

    A number of hangs have been reported against the target driver; they are
    due to the fact that multiple threads may try to destroy the iscsi session
    at the same time. This may be reproduced for example when a "targetcli
    iscsi/iqn.../tpg1 disable" command is executed while a logout operation is
    underway.

    When this happens, two or more threads may end up sleeping and waiting for
    iscsit_close_connection() to execute "complete(session_wait_comp)". Only
    one of the threads will wake up and proceed to destroy the session
    structure, the remaining threads will hang forever.

    Note that if the blocked threads are somehow forced to wake up with
    complete_all(), they will try to free the same iscsi session structure
    destroyed by the first thread, causing double frees, memory corruptions
    etc...

    With this patch, the threads that want to destroy the iscsi session will
    increase the session refcount and will set the "session_close" flag to 1;
    then they wait for the driver to close the remaining active connections.
    When the last connection is closed, iscsit_close_connection() will wake up
    all the threads and will wait for the session's refcount to reach zero;
    when this happens, iscsit_close_connection() will destroy the session
    structure because no one is referencing it anymore.

    INFO: task targetcli:5971 blocked for more than 120 seconds.
    Tainted: P OE 4.15.0-72-generic #81~16.04.1
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    targetcli D 0 5971 1 0x00000080
    Call Trace:
    __schedule+0x3d6/0x8b0
    ? vprintk_func+0x44/0xe0
    schedule+0x36/0x80
    schedule_timeout+0x1db/0x370
    ? __dynamic_pr_debug+0x8a/0xb0
    wait_for_completion+0xb4/0x140
    ? wake_up_q+0x70/0x70
    iscsit_free_session+0x13d/0x1a0 [iscsi_target_mod]
    iscsit_release_sessions_for_tpg+0x16b/0x1e0 [iscsi_target_mod]
    iscsit_tpg_disable_portal_group+0xca/0x1c0 [iscsi_target_mod]
    lio_target_tpg_enable_store+0x66/0xe0 [iscsi_target_mod]
    configfs_write_file+0xb9/0x120
    __vfs_write+0x1b/0x40
    vfs_write+0xb8/0x1b0
    SyS_write+0x5c/0xe0
    do_syscall_64+0x73/0x130
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2

    Link: https://lore.kernel.org/r/20200313170656.9716-3-mlombard@redhat.com
    Reported-by: Matt Coleman
    Tested-by: Matt Coleman
    Tested-by: Rahul Kundu
    Signed-off-by: Maurizio Lombardi
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Maurizio Lombardi
     
  • [ Upstream commit e49a7d994379278d3353d7ffc7994672752fb0ad ]

    iscsit_free_session() is equivalent to iscsit_stop_session() followed by a
    call to iscsit_close_session().

    Link: https://lore.kernel.org/r/20200313170656.9716-2-mlombard@redhat.com
    Tested-by: Rahul Kundu
    Signed-off-by: Maurizio Lombardi
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Maurizio Lombardi
     

29 Feb, 2020

3 commits

  • commit 807b9515b7d044cf77df31f1af9d842a76ecd5cb upstream.

    Since commit e9d3009cb936 introduced a regression and since the fix for
    that regression was not perfect, revert this commit.

    Link: https://marc.info/?l=target-devel&m=158157054906195
    Cc: Rahul Kundu
    Cc: Mike Marciniszyn
    Cc: Sagi Grimberg
    Reported-by: Dakshaja Uppalapati
    Fixes: e9d3009cb936 ("scsi: target: iscsi: Wait for all commands to finish before freeing a session")
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     
  • commit 76261ada16dcc3be610396a46d35acc3efbda682 upstream.

    Since commit 04060db41178 introduces soft lockups when toggling network
    interfaces, revert it.

    Link: https://marc.info/?l=target-devel&m=158157054906196
    Cc: Rahul Kundu
    Cc: Mike Marciniszyn
    Cc: Sagi Grimberg
    Reported-by: Dakshaja Uppalapati
    Fixes: 04060db41178 ("scsi: RDMA/isert: Fix a recently introduced regression related to logout")
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     
  • commit c14335ebb92a98646ddbf447e6cacc66de5269ad upstream.

    Commit 83f85b8ec305 postponed the percpu_ref_put(&se_cmd->se_lun->lun_ref)
    call from command completion to the time when the final command reference
    is dropped. That approach is not compatible with the iSCSI target driver
    because the iSCSI target driver keeps the command with the highest stat_sn
    after it has completed until the next command is received (see also
    iscsit_ack_from_expstatsn()). Fix this regression by reverting commit
    83f85b8ec305.

    Fixes: 83f85b8ec305 ("scsi: target/core: Inline transport_lun_remove_cmd()")
    Cc: Pavel Zakharov
    Cc: Mike Christie
    Cc:
    Link: https://lore.kernel.org/r/20200210051202.12934-1-bvanassche@acm.org
    Reported-by: Pavel Zakharov
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     

29 Jan, 2020

1 commit

  • commit 04060db41178c7c244f2c7dcd913e7fd331de915 upstream.

    iscsit_close_connection() calls isert_wait_conn(). Due to commit
    e9d3009cb936 both functions call target_wait_for_sess_cmds() although that
    last function should be called only once. Fix this by removing the
    target_wait_for_sess_cmds() call from isert_wait_conn() and by only calling
    isert_wait_conn() after target_wait_for_sess_cmds().

    Fixes: e9d3009cb936 ("scsi: target: iscsi: Wait for all commands to finish before freeing a session").
    Link: https://lore.kernel.org/r/20200116044737.19507-1-bvanassche@acm.org
    Reported-by: Rahul Kundu
    Signed-off-by: Bart Van Assche
    Tested-by: Mike Marciniszyn
    Acked-by: Sagi Grimberg
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     

23 Jan, 2020

1 commit

  • commit c941e0d172605731de9b4628bd4146d35cf2e7d6 upstream.

    Print the string for which conversion failed instead of printing the
    function name twice.

    Fixes: 2650d71e244f ("target: move transport ID handling to the core")
    Cc: Christoph Hellwig
    Link: https://lore.kernel.org/r/20191107215525.64415-1-bvanassche@acm.org
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     

18 Jan, 2020

1 commit

  • [ Upstream commit e4dc9a4c31fe10d1751c542702afc85be8a5c56a ]

    The sector size of the block layer is 512 bytes, but integrity interval
    size might be different (in case of 4K block size of the media). At the
    initiator side the virtual start sector is the one that was originally
    submitted by the block layer (512 bytes) for the Reftag usage. The
    initiator converts the Reftag to integrity interval units and sends it to
    the target. So the target virtual start sector should be calculated at
    integrity interval units. prepare_fn() and complete_fn() don't remap
    correctly the Reftag when using incorrect units of the virtual start
    sector, which leads to the following protection error at the device:

    "blk_update_request: protection error, dev sdb, sector 2048 op 0x0:(READ)
    flags 0x10000 phys_seg 1 prio class 0"

    To fix that, set the seed in integrity interval units.

    Link: https://lore.kernel.org/r/1576078562-15240-1-git-send-email-israelr@mellanox.com
    Signed-off-by: Israel Rukshin
    Reviewed-by: Max Gurtovoy
    Reviewed-by: Sagi Grimberg
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Israel Rukshin
     

05 Jan, 2020

3 commits

  • [ Upstream commit e9d3009cb936bd0faf0719f68d98ad8afb1e613b ]

    The iSCSI target driver is the only target driver that does not wait for
    ongoing commands to finish before freeing a session. Make the iSCSI target
    driver wait for ongoing commands to finish before freeing a session. This
    patch fixes the following KASAN complaint:

    BUG: KASAN: use-after-free in __lock_acquire+0xb1a/0x2710
    Read of size 8 at addr ffff8881154eca70 by task kworker/0:2/247

    CPU: 0 PID: 247 Comm: kworker/0:2 Not tainted 5.4.0-rc1-dbg+ #6
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
    Workqueue: target_completion target_complete_ok_work [target_core_mod]
    Call Trace:
    dump_stack+0x8a/0xd6
    print_address_description.constprop.0+0x40/0x60
    __kasan_report.cold+0x1b/0x33
    kasan_report+0x16/0x20
    __asan_load8+0x58/0x90
    __lock_acquire+0xb1a/0x2710
    lock_acquire+0xd3/0x200
    _raw_spin_lock_irqsave+0x43/0x60
    target_release_cmd_kref+0x162/0x7f0 [target_core_mod]
    target_put_sess_cmd+0x2e/0x40 [target_core_mod]
    lio_check_stop_free+0x12/0x20 [iscsi_target_mod]
    transport_cmd_check_stop_to_fabric+0xd8/0xe0 [target_core_mod]
    target_complete_ok_work+0x1b0/0x790 [target_core_mod]
    process_one_work+0x549/0xa40
    worker_thread+0x7a/0x5d0
    kthread+0x1bc/0x210
    ret_from_fork+0x24/0x30

    Allocated by task 889:
    save_stack+0x23/0x90
    __kasan_kmalloc.constprop.0+0xcf/0xe0
    kasan_slab_alloc+0x12/0x20
    kmem_cache_alloc+0xf6/0x360
    transport_alloc_session+0x29/0x80 [target_core_mod]
    iscsi_target_login_thread+0xcd6/0x18f0 [iscsi_target_mod]
    kthread+0x1bc/0x210
    ret_from_fork+0x24/0x30

    Freed by task 1025:
    save_stack+0x23/0x90
    __kasan_slab_free+0x13a/0x190
    kasan_slab_free+0x12/0x20
    kmem_cache_free+0x146/0x400
    transport_free_session+0x179/0x2f0 [target_core_mod]
    transport_deregister_session+0x130/0x180 [target_core_mod]
    iscsit_close_session+0x12c/0x350 [iscsi_target_mod]
    iscsit_logout_post_handler+0x136/0x380 [iscsi_target_mod]
    iscsit_response_queue+0x8de/0xbe0 [iscsi_target_mod]
    iscsi_target_tx_thread+0x27f/0x370 [iscsi_target_mod]
    kthread+0x1bc/0x210
    ret_from_fork+0x24/0x30

    The buggy address belongs to the object at ffff8881154ec9c0
    which belongs to the cache se_sess_cache of size 352
    The buggy address is located 176 bytes inside of
    352-byte region [ffff8881154ec9c0, ffff8881154ecb20)
    The buggy address belongs to the page:
    page:ffffea0004553b00 refcount:1 mapcount:0 mapping:ffff888101755400 index:0x0 compound_mapcount: 0
    flags: 0x2fff000000010200(slab|head)
    raw: 2fff000000010200 dead000000000100 dead000000000122 ffff888101755400
    raw: 0000000000000000 0000000080130013 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected

    Memory state around the buggy address:
    ffff8881154ec900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ffff8881154ec980: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
    >ffff8881154eca00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ^
    ffff8881154eca80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ffff8881154ecb00: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc

    Cc: Mike Christie
    Link: https://lore.kernel.org/r/20191113220508.198257-3-bvanassche@acm.org
    Reviewed-by: Roman Bolshakov
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bart Van Assche
     
  • [ Upstream commit 80647a89eaf3f2549741648f3230cd6ff68c23b4 ]

    The SCSI specs require releasing SPC-2 reservations when a session is
    closed. Make sure that the target core does this.

    Running the libiscsi tests triggers the KASAN complaint shown below. This
    patch fixes that use-after-free.

    BUG: KASAN: use-after-free in target_check_reservation+0x171/0x980 [target_core_mod]
    Read of size 8 at addr ffff88802ecd1878 by task iscsi_trx/17200

    CPU: 0 PID: 17200 Comm: iscsi_trx Not tainted 5.4.0-rc1-dbg+ #1
    Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
    Call Trace:
    dump_stack+0x8a/0xd6
    print_address_description.constprop.0+0x40/0x60
    __kasan_report.cold+0x1b/0x34
    kasan_report+0x16/0x20
    __asan_load8+0x58/0x90
    target_check_reservation+0x171/0x980 [target_core_mod]
    __target_execute_cmd+0xb1/0xf0 [target_core_mod]
    target_execute_cmd+0x22d/0x4d0 [target_core_mod]
    transport_generic_new_cmd+0x31f/0x5b0 [target_core_mod]
    transport_handle_cdb_direct+0x6f/0x90 [target_core_mod]
    iscsit_execute_cmd+0x381/0x3f0 [iscsi_target_mod]
    iscsit_sequence_cmd+0x13b/0x1f0 [iscsi_target_mod]
    iscsit_process_scsi_cmd+0x4c/0x130 [iscsi_target_mod]
    iscsit_get_rx_pdu+0x8e8/0x15f0 [iscsi_target_mod]
    iscsi_target_rx_thread+0x105/0x1b0 [iscsi_target_mod]
    kthread+0x1bc/0x210
    ret_from_fork+0x24/0x30

    Allocated by task 1079:
    save_stack+0x23/0x90
    __kasan_kmalloc.constprop.0+0xcf/0xe0
    kasan_slab_alloc+0x12/0x20
    kmem_cache_alloc+0xfe/0x3a0
    transport_alloc_session+0x29/0x80 [target_core_mod]
    iscsi_target_login_thread+0xceb/0x1920 [iscsi_target_mod]
    kthread+0x1bc/0x210
    ret_from_fork+0x24/0x30

    Freed by task 17193:
    save_stack+0x23/0x90
    __kasan_slab_free+0x13a/0x190
    kasan_slab_free+0x12/0x20
    kmem_cache_free+0xc8/0x3e0
    transport_free_session+0x179/0x2f0 [target_core_mod]
    transport_deregister_session+0x121/0x170 [target_core_mod]
    iscsit_close_session+0x12c/0x350 [iscsi_target_mod]
    iscsit_logout_post_handler+0x136/0x380 [iscsi_target_mod]
    iscsit_response_queue+0x8fa/0xc00 [iscsi_target_mod]
    iscsi_target_tx_thread+0x28e/0x390 [iscsi_target_mod]
    kthread+0x1bc/0x210
    ret_from_fork+0x24/0x30

    The buggy address belongs to the object at ffff88802ecd1860
    which belongs to the cache se_sess_cache of size 352
    The buggy address is located 24 bytes inside of
    352-byte region [ffff88802ecd1860, ffff88802ecd19c0)
    The buggy address belongs to the page:
    page:ffffea0000bb3400 refcount:1 mapcount:0 mapping:ffff8880bef2ed00 index:0x0 compound_mapcount: 0
    flags: 0x1000000000010200(slab|head)
    raw: 1000000000010200 dead000000000100 dead000000000122 ffff8880bef2ed00
    raw: 0000000000000000 0000000080270027 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected

    Memory state around the buggy address:
    ffff88802ecd1700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ffff88802ecd1780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    >ffff88802ecd1800: fb fb fb fb fc fc fc fc fc fc fc fc fb fb fb fb
    ^
    ffff88802ecd1880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ffff88802ecd1900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb

    Cc: Mike Christie
    Link: https://lore.kernel.org/r/20191113220508.198257-2-bvanassche@acm.org
    Reviewed-by: Roman Bolshakov
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    Bart Van Assche
     
  • [ Upstream commit 9cef2a7955f2754257a7cddedec16edae7b587d0 ]

    RFC 2307 states:

    For CHAP [RFC1994], in the first step, the initiator MUST send:

    CHAP_A=

    Where A1,A2... are proposed algorithms, in order of preference.
    ...
    For the Algorithm, as stated in [RFC1994], one value is required to
    be implemented:

    5 (CHAP with MD5)

    LIO currently checks for this value by only comparing a single byte in
    the tokenized Algorithm string, which means that any value starting with
    a '5' (e.g. "55") is interpreted as "CHAP with MD5". Fix this by
    comparing the entire tokenized string.

    Reviewed-by: Lee Duncan
    Reviewed-by: Mike Christie
    Signed-off-by: David Disseldorp
    Link: https://lore.kernel.org/r/20190912095547.22427-2-ddiss@suse.de
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin

    David Disseldorp
     

03 Nov, 2019

1 commit

  • Pull SCSI fixes from James Bottomley:
    "Nine changes, eight in drivers [ufs, target, lpfc x 2, qla2xxx x 4]
    and one core change in sd that fixes an I/O failure on DIF type 3
    devices"

    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
    scsi: qla2xxx: stop timer in shutdown path
    scsi: sd: define variable dif as unsigned int instead of bool
    scsi: target: cxgbit: Fix cxgbit_fw4_ack()
    scsi: qla2xxx: Fix partial flash write of MBI
    scsi: qla2xxx: Initialized mailbox to prevent driver load failure
    scsi: lpfc: Honor module parameter lpfc_use_adisc
    scsi: ufs-bsg: Wake the device before sending raw upiu commands
    scsi: lpfc: Check queue pointer before use
    scsi: qla2xxx: fixup incorrect usage of host_byte

    Linus Torvalds
     

26 Oct, 2019

1 commit

  • Pull SCSI fixes from James Bottomley:
    "Nine changes, eight to drivers (qla2xxx, hpsa, lpfc, alua, ch,
    53c710[x2], target) and one core change that tries to close a race
    between sysfs delete and module removal"

    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
    scsi: lpfc: remove left-over BUILD_NVME defines
    scsi: core: try to get module before removing device
    scsi: hpsa: add missing hunks in reset-patch
    scsi: target: core: Do not overwrite CDB byte 1
    scsi: ch: Make it possible to open a ch device multiple times again
    scsi: fix kconfig dependency warning related to 53C700_LE_ON_BE
    scsi: sni_53c710: fix compilation error
    scsi: scsi_dh_alua: handle RTPG sense code correctly during state transitions
    scsi: qla2xxx: fix a potential NULL pointer dereference

    Linus Torvalds
     

25 Oct, 2019

1 commit

  • Use the pointer 'p' after having tested that pointer instead of before.

    Fixes: 5cadafb236df ("target/cxgbit: Fix endianness annotations")
    Cc: Varun Prakash
    Cc: Nicholas Bellinger
    Cc:
    Link: https://lore.kernel.org/r/20191023202150.22173-1-bvanassche@acm.org
    Reported-by: Dan Carpenter
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen

    Bart Van Assche
     

18 Oct, 2019

1 commit

  • passthrough_parse_cdb() - used by TCMU and PSCSI - attepts to reset the LUN
    field of SCSI-2 CDBs (bits 5,6,7 of byte 1). The current code is wrong as
    for newer commands not having the LUN field it overwrites relevant command
    bits (e.g. for SECURITY PROTOCOL IN / OUT). We think this code was
    unnecessary from the beginning or at least it is no longer useful. So we
    remove it entirely.

    Link: https://lore.kernel.org/r/12498eab-76fd-eaad-1316-c2827badb76a@ts.fujitsu.com
    Signed-off-by: Bodo Stroesser
    Reviewed-by: Bart Van Assche
    Reviewed-by: Hannes Reinecke
    Signed-off-by: Martin K. Petersen

    Bodo Stroesser
     

25 Sep, 2019

1 commit

  • Patch series "Make working with compound pages easier", v2.

    These three patches add three helpers and convert the appropriate
    places to use them.

    This patch (of 3):

    It's unnecessarily hard to find out the size of a potentially huge page.
    Replace 'PAGE_SIZE << compound_order(page)' with page_size(page).

    Link: http://lkml.kernel.org/r/20190721104612.19120-2-willy@infradead.org
    Signed-off-by: Matthew Wilcox (Oracle)
    Acked-by: Michal Hocko
    Reviewed-by: Andrew Morton
    Reviewed-by: Ira Weiny
    Acked-by: Kirill A. Shutemov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Matthew Wilcox (Oracle)
     

22 Sep, 2019

1 commit

  • Pull SCSI updates from James Bottomley:
    "This is mostly update of the usual drivers: qla2xxx, ufs, smartpqi,
    lpfc, hisi_sas, qedf, mpt3sas; plus a whole load of minor updates. The
    only core change this time around is the addition of request batching
    for virtio. Since batching requires an additional flag to use, it
    should be invisible to the rest of the drivers"

    * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (264 commits)
    scsi: hisi_sas: Fix the conflict between device gone and host reset
    scsi: hisi_sas: Add BIST support for phy loopback
    scsi: hisi_sas: Add hisi_sas_debugfs_alloc() to centralise allocation
    scsi: hisi_sas: Remove some unused function arguments
    scsi: hisi_sas: Remove redundant work declaration
    scsi: hisi_sas: Remove hisi_sas_hw.slot_complete
    scsi: hisi_sas: Assign NCQ tag for all NCQ commands
    scsi: hisi_sas: Update all the registers after suspend and resume
    scsi: hisi_sas: Retry 3 times TMF IO for SAS disks when init device
    scsi: hisi_sas: Remove sleep after issue phy reset if sas_smp_phy_control() fails
    scsi: hisi_sas: Directly return when running I_T_nexus reset if phy disabled
    scsi: hisi_sas: Use true/false as input parameter of sas_phy_reset()
    scsi: hisi_sas: add debugfs auto-trigger for internal abort time out
    scsi: virtio_scsi: unplug LUNs when events missed
    scsi: scsi_dh_rdac: zero cdb in send_mode_select()
    scsi: fcoe: fix null-ptr-deref Read in fc_release_transport
    scsi: ufs-hisi: use devm_platform_ioremap_resource() to simplify code
    scsi: ufshcd: use devm_platform_ioremap_resource() to simplify code
    scsi: hisi_sas: use devm_platform_ioremap_resource() to simplify code
    scsi: ufs: Use kmemdup in ufshcd_read_string_desc()
    ...

    Linus Torvalds
     

28 Aug, 2019

1 commit


15 Aug, 2019

1 commit

  • In tcmu_handle_completion() function, the variable called read_len is
    always initialized with a value taken from se_cmd structure. If this
    function is called to complete an expired (timed out) out command, the
    session command pointed by se_cmd is likely to be already deallocated by
    the target core at that moment. As the result, this access triggers a
    use-after-free warning from KASAN.

    This patch fixes the code not to touch se_cmd when completing timed out
    TCMU commands. It also resets the pointer to se_cmd at the time when the
    TCMU_CMD_BIT_EXPIRED flag is set because it is going to become invalid
    after calling target_complete_cmd() later in the same function,
    tcmu_check_expired_cmd().

    Signed-off-by: Dmitry Fomichev
    Acked-by: Mike Christie
    Reviewed-by: Damien Le Moal
    Signed-off-by: Martin K. Petersen

    Dmitry Fomichev
     

08 Aug, 2019

1 commit

  • If the userspace process crashes while we send the nl msg, it is possible
    that the cmd in curr_nl_cmd of tcmu_dev never gets reset to 0, and and
    returns busy for other commands after the userspace process is restartd.

    More details below:

    /backstores/user:file/file> set attribute dev_size=2048
    Cannot set attribute dev_size: [Errno 3] No such process
    /backstores/user:file/file> set attribute dev_size=2048
    Cannot set attribute dev_size: [Errno 16] Device or resource busy

    with following kernel messages:
    [173605.747169] Unable to reconfigure device
    [173616.686674] tcmu daemon: command reply support 1.
    [173623.866978] netlink cmd 3 already executing on file
    [173623.866984] Unable to reconfigure device

    Also, it is not safe to leave the nl_cmd in the list, and not get deleted.

    This patch removes the nl_cmd from the list, and clear its data if it is
    not sent successfully.

    Signed-off-by: Li Zhong
    Acked-by: Mike Christie
    Signed-off-by: Martin K. Petersen

    Li Zhong
     

07 Aug, 2019

1 commit


31 Jul, 2019

1 commit


25 Jul, 2019

1 commit


23 Jul, 2019

2 commits


12 Jul, 2019

1 commit

  • Pull SCSI updates from James Bottomley:
    "This is mostly update of the usual drivers: qla2xxx, hpsa, lpfc, ufs,
    mpt3sas, ibmvscsi, megaraid_sas, bnx2fc and hisi_sas as well as the
    removal of the osst driver (I heard from Willem privately that he
    would like the driver removed because all his test hardware has
    failed). Plus number of minor changes, spelling fixes and other
    trivia.

    The big merge conflict this time around is the SPDX licence tags.
    Following discussion on linux-next, we believe our version to be more
    accurate than the one in the tree, so the resolution is to take our
    version for all the SPDX conflicts"

    Note on the SPDX license tag conversion conflicts: the SCSI tree had
    done its own SPDX conversion, which in some cases conflicted with the
    treewide ones done by Thomas & co.

    In almost all cases, the conflicts were purely syntactic: the SCSI tree
    used the old-style SPDX tags ("GPL-2.0" and "GPL-2.0+") while the
    treewide conversion had used the new-style ones ("GPL-2.0-only" and
    "GPL-2.0-or-later").

    In these cases I picked the new-style one.

    In a few cases, the SPDX conversion was actually different, though. As
    explained by James above, and in more detail in a pre-pull-request
    thread:

    "The other problem is actually substantive: In the libsas code Luben
    Tuikov originally specified gpl 2.0 only by dint of stating:

    * This file is licensed under GPLv2.

    In all the libsas files, but then muddied the water by quoting GPLv2
    verbatim (which includes the or later than language). So for these
    files Christoph did the conversion to v2 only SPDX tags and Thomas
    converted to v2 or later tags"

    So in those cases, where the spdx tag substantially mattered, I took the
    SCSI tree conversion of it, but then also took the opportunity to turn
    the old-style "GPL-2.0" into a new-style "GPL-2.0-only" tag.

    Similarly, when there were whitespace differences or other differences
    to the comments around the copyright notices, I took the version from
    the SCSI tree as being the more specific conversion.

    Finally, in the spdx conversions that had no conflicts (because the
    treewide ones hadn't been done for those files), I just took the SCSI
    tree version as-is, even if it was old-style. The old-style conversions
    are perfectly valid, even if the "-only" and "-or-later" versions are
    perhaps more descriptive.

    * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (185 commits)
    scsi: qla2xxx: move IO flush to the front of NVME rport unregistration
    scsi: qla2xxx: Fix NVME cmd and LS cmd timeout race condition
    scsi: qla2xxx: on session delete, return nvme cmd
    scsi: qla2xxx: Fix kernel crash after disconnecting NVMe devices
    scsi: megaraid_sas: Update driver version to 07.710.06.00-rc1
    scsi: megaraid_sas: Introduce various Aero performance modes
    scsi: megaraid_sas: Use high IOPS queues based on IO workload
    scsi: megaraid_sas: Set affinity for high IOPS reply queues
    scsi: megaraid_sas: Enable coalescing for high IOPS queues
    scsi: megaraid_sas: Add support for High IOPS queues
    scsi: megaraid_sas: Add support for MPI toolbox commands
    scsi: megaraid_sas: Offload Aero RAID5/6 division calculations to driver
    scsi: megaraid_sas: RAID1 PCI bandwidth limit algorithm is applicable for only Ventura
    scsi: megaraid_sas: megaraid_sas: Add check for count returned by HOST_DEVICE_LIST DCMD
    scsi: megaraid_sas: Handle sequence JBOD map failure at driver level
    scsi: megaraid_sas: Don't send FPIO to RL Bypass queue
    scsi: megaraid_sas: In probe context, retry IOC INIT once if firmware is in fault
    scsi: megaraid_sas: Release Mutex lock before OCR in case of DCMD timeout
    scsi: megaraid_sas: Call disable_irq from process IRQ poll
    scsi: megaraid_sas: Remove few debug counters from IO path
    ...

    Linus Torvalds