06 Dec, 2011

4 commits

  • If an attribute is present (but not yet supported) it should be OK
    to write 0 (a no-op) to the attribute.

    This is an issue because userspace should be able to save and restore all
    set attribute values without error.

    Signed-off-by: Andy Grover
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • We already have a perfectly valid se_device pointer in the command, so
    remove the mostly useless duplicates.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • This patch removes legacy usage of PYX_TRANSPORT_* return codes in a number
    of locations and addresses cases where transport_generic_request_failure()
    was returning the incorrect sense upon CHECK_CONDITION status after the
    v3.1 converson to use errno return codes.

    This includes the conversion of transport_generic_request_failure() to
    process cmd->scsi_sense_reason and handle extra TCM_RESERVATION_CONFLICT
    before calling transport_send_check_condition_and_sense() to queue up
    response status. It also drops PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES legacy
    usgae, and returns TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE w/ a response
    for these cases.

    transport_generic_allocate_tasks(), transport_generic_new_cmd(), backend
    SCF_SCSI_DATA_SG_IO_CDB ->do_task(), and emulated ->execute_task() have
    all been updated to set se_cmd->scsi_sense_reason and return errno codes
    universally upon failure. This includes cmd->scsi_sense_reason assignment
    in target_core_alua.c, target_core_pr.c and target_core_cdb.c emulation code.

    Finally it updates fabric modules to remove the legacy usage, and for
    TFO->new_cmd_map() callers forwards return values outside of fabric code.
    iscsi-target has also been updated to remove a handful of special cases
    related to the cleanup and signaling QUEUE_FULL handling w/ ft_write_pending()

    (v2: Drop extra SCF_SCSI_CDB_EXCEPTION check during failure from
    transport_generic_new_cmd, and re-add missing task->task_error_status
    assignment in transport_complete_task)

    Cc: Christoph Hellwig
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

07 Nov, 2011

1 commit

  • * 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux: (230 commits)
    Revert "tracing: Include module.h in define_trace.h"
    irq: don't put module.h into irq.h for tracking irqgen modules.
    bluetooth: macroize two small inlines to avoid module.h
    ip_vs.h: fix implicit use of module_get/module_put from module.h
    nf_conntrack.h: fix up fallout from implicit moduleparam.h presence
    include: replace linux/module.h with "struct module" wherever possible
    include: convert various register fcns to macros to avoid include chaining
    crypto.h: remove unused crypto_tfm_alg_modname() inline
    uwb.h: fix implicit use of asm/page.h for PAGE_SIZE
    pm_runtime.h: explicitly requires notifier.h
    linux/dmaengine.h: fix implicit use of bitmap.h and asm/page.h
    miscdevice.h: fix up implicit use of lists and types
    stop_machine.h: fix implicit use of smp.h for smp_processor_id
    of: fix implicit use of errno.h in include/linux/of.h
    of_platform.h: delete needless include
    acpi: remove module.h include from platform/aclinux.h
    miscdevice.h: delete unnecessary inclusion of module.h
    device_cgroup.h: delete needless include
    net: sch_generic remove redundant use of
    net: inet_timewait_sock doesnt need
    ...

    Fix up trivial conflicts (other header files, and removal of the ab3550 mfd driver) in
    - drivers/media/dvb/frontends/dibx000_common.c
    - drivers/media/video/{mt9m111.c,ov6650.c}
    - drivers/mfd/ab3550-core.c
    - include/linux/dmaengine.h

    Linus Torvalds
     

04 Nov, 2011

2 commits

  • All ->execute_task instances now need to complete the I/O explicitly,
    which can either happen synchronously or asynchronously.

    Note that a lot of the CDB emulations appear to return success even if
    some lowlevel operations failed. Given that this is an existing issue
    this patch doesn't change that fact.

    (nab: Adding missing switch breaks in PR-IN + PR_OUT)

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • We want to be able to handle all CDBs through it and remove hacks like
    always using the first task in a CDB in target_report_luns.

    Also rename the callback to ->execute_task to better describe its use.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     

01 Nov, 2011

1 commit


24 Oct, 2011

2 commits

  • This patch removes the legacy usage of se_task->task_timer and associated
    infrastructure that originally was used as a way to help manage buggy backend
    SCSI LLDs that in certain cases would never return back an outstanding task.

    This includes the removal of target_complete_timeout_work(), timeout logic
    from transport_complete_task(), transport_task_timeout_handler(),
    transport_start_task_timer(), the per device task_timeout configfs attribute,
    and all task_timeout associated structure members and defines in
    target_core_base.h

    This is being removed in preparation to make transport_complete_task() run
    in lock-less mode.

    Cc: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • Remove the dpo_emulated, fua_write_emulated, fua_read_emulated and
    write_cache_emulated methods, and replace them with a simple bitfields in
    se_subsystem_api in those cases where they ever returned one.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     

23 Aug, 2011

3 commits

  • With qla2xxx, acl_node_lock is taken inside qla2xxx's hardware_lock,
    which is taken in hardirq context. This means acl_node_lock must become
    an IRQ-disabling lock; in particular this fixes lockdep warnings along
    the lines of

    ======================================================
    [ INFO: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected ]

    (&(&se_tpg->acl_node_lock)->rlock){+.....}, at: [] transport_deregister_session+0x92/0x140 [target_core_mod]

    and this task is already holding:
    (&(&ha->hardware_lock)->rlock){-.-...}, at: [] qla_tgt_stop_phase1+0x57/0x2c0 [qla2xxx]
    which would create a new lock dependency:
    (&(&ha->hardware_lock)->rlock){-.-...} -> (&(&se_tpg->acl_node_lock)->rlock){+.....}

    but this new dependency connects a HARDIRQ-irq-safe lock:
    (&(&ha->hardware_lock)->rlock){-.-...}

    to a HARDIRQ-irq-unsafe lock:
    (&(&se_tpg->acl_node_lock)->rlock){+.....}

    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • This patch addresses recent breakage with multiple se_task (task_count > 1)
    operation following backend dev->se_sub_dev->se_dev_attrib.max_sectors in new
    transport_allocate_data_tasks() code. The initial bug here was a bogus
    task->task_sg_nents assignment in transport_allocate_data_tasks() based on
    the passed parameter, which now uses DIV_ROUND_UP(task_size, PAGE_SIZE) to
    determine the proper number of per task SGL entries for the (task_count > 1)
    case.

    This also means we now need to enforce a PAGE_SIZE aligned max_sector count
    value for this to work as expected without bringing back the pre v3.1
    transport_map_mem_to_sg() logic to handle SGL offsets across multiple tasks.
    So this patch adds se_dev_align_max_sectors() to round down max_sectors as
    necessary to ensure this alignment via se_dev_set_default_attribs() and
    se_dev_align_max_sectors() and keeps it simple for (task_count > 1)
    operation.

    So far this bugfix has been tested with (task_count > 1) operation
    using iscsi-target and iblock backends.

    Reported-by: Chris Boot
    Cc: Kiran Patil
    Cc: Andy Grover
    Cc: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • This patch changes target_emulate_inquiry_std() to set the 'not connected'
    (0x35) bit in standard INQUIRY response data when we are processing a
    request to a virtual LUN=0 mapping from struct se_device *g_lun0_dev that
    have been setup for us in transport_lookup_cmd_lun().

    This addresses an issue where qla2xxx FC clients need to be able
    to create demo-mode I_T FC Nexuses by default, but should not be
    exposing the default set of TPG LUNs to all FC clients. This includes
    adding an new optional target_core_fabric_ops->tpg_check_demo_mode_login_only()
    caller to allow demo_mode nexuses to skip the old default of bulding
    a demo-mode MappedLUNs list via core_tpg_add_node_to_devs().

    (roland: Add missing tpg_check_demo_mode_login_only check in core_dev_add_lun)

    Reported-by: Roland Dreier
    Cc: Andrew Vasquez
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

22 Jul, 2011

12 commits

  • This patch adds the default 'Unrestricted reordering allowed' for SCSI
    control mode page QUEUE ALGORITHM MODIFIER on a per se_device basis in
    target_modesense_control() following spc4r23. This includes a new
    emuluate_rest_reord configfs attribute that currently (only) accepts
    zero to signal 'Unrestricted reordering allowed' in control mode page
    usage by the backend target device.

    Reported-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • This patch contains the squashed version of forth round series cleanups
    from Andy and Christoph following the post heavy lifting in the preceeding:
    'Eliminate usage of struct se_mem' and 'Make all control CDBs scatter-gather'
    changes. This also includes a conversion of target core and the v3.0
    mainline fabric modules (loopback and tcm_fc) to use pr_debug and the
    CONFIG_DYNAMIC_DEBUG infrastructure!

    These have been squashed into this third and final round for v3.1.

    target: Remove ifdeffed code in t_g_process_write
    target: Remove direct ramdisk code
    target: Rename task_sg_num to task_sg_nents
    target: Remove custom debug macros for pr_debug. Use pr_err().
    target: Remove custom debug macros in mainline fabrics
    target: Set WSNZ=1 in block limits VPD. Abort if WRITE_SAME sectors = 0
    target: Remove transport do_se_mem_map callback
    target: Further simplify transport_free_pages
    target: Redo task allocation return value handling
    target: Remove extra parentheses
    target: change alloc_task call to take *cdb, not *cmd

    (nab: Fix bogus struct file assignments in fd_do_readv and fd_do_writev)

    Signed-off-by: Andy Grover
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • Previously, some control CDBs did not allocate memory in pages for their
    data buffer, but just did a kmalloc. This patch makes all cdbs allocate
    pages.

    This has the benefit of streamlining some paths that had to behave
    differently when we used two allocation methods. The downside is that
    all accesses to the data buffer need to kmap it before use, and need to
    handle data in page-sized chunks if more than a page is needed for a given
    command's data buffer.

    Finally, note that cdbs with no data buffers are handled a little
    differently. Before, SCSI_NON_DATA_CDBs would not call get_mem at all
    (they'd be in the final else in transport_allocate_resources) but now
    these will make it into generic_get_mem, but just not allocate any
    buffers.

    Signed-off-by: Andy Grover
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • Implement page B1h, Block Device Characteristics, so that we can report
    a medium rotation rate of 1 (non-rotating / solid state) if the
    is_nonrot device attribute is set; we update the iblock backend to set
    this attribute if the underlying Linux block device has its nonrot
    flag set.

    Signed-off-by: Roland Dreier
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • transport_lookup_tmr_lun() can be called from interrupt context and
    therefore needs to use IRQ-safe spinlock functions. Fix this up, and
    to make the locking work, convert the other uses of se_tmr_lock to be
    IRQ-disabling.

    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • se_dev_check_online() is called from transport_lookup_cmd_lun(), which
    as discussed before may be called from interrupt context. So it needs
    to use spin_lock_irqsave() instead of spin_lock_irq() to avoid
    enabling interrupts at the wrong time.

    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • transport_lookup_cmd_lun() may be called from interrupt context (eg
    tcm_loop_allocate_core_cmd() calls it, and it has a comment that says,
    "Can be called from interrupt context"), so it needs to use
    spin_lock_irqsave() instead of spin_lock_irq() to avoid enabling
    interrupts at the wrong time.

    (And indeed the last set of lock operations, on lun_cmd_lock, were
    already using spin_lock_irqsave(), so we just need to fix the other
    two locks we take)

    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • This patch contains a squashed version of third round series cleanups,
    improvements ,and simplfications from Andy and Christoph ahead of the
    heavy lifting between round 3 -> 4 for the target core SGL conversion.

    This include cleanups to the main target I/O path and other miscellaneous
    updates.

    target: Replace custom sgbuf functions with lib funcs
    target: Simplify sector limiting code
    target: get_cdb should never return NULL
    target: Simplify transport_memcpy_se_mem_read_contig
    target: Use assignment rather than increment for t_task_cdbs
    target: Don't pass dma_size to generic_get_mem
    target: Pass sg with type scatterlist in transport_map_sg_to_mem
    target: Move task_sg_num next to task_sg in struct se_task
    target: inline struct se_transport_task into struct se_cmd
    target: Change name & semantics of transport_get_sectors()
    target: Remove unused members of se_cmd
    target: Rename se_cmd.t_task_cdbs to t_task_list_num
    target: Fix some spelling
    target: Remove unused var from transport_generic_do_tmr
    target: map_sg_to_mem: return sg_count in return value
    target/pscsi: Use min_t for sector limits
    target/pscsi: Unused param for pscsi_get_bio()
    target: Rename get_cdb_count to allocate_tasks
    target: Make transport_generic_new_cmd() available for iscsi-target
    target: Remove fabric callback to allocate iovecs
    target: Fix transport_generic_new_cmd WRITE comment

    (hch: Use __GFP_ZERO usage for alloc_pages() usage)

    Signed-off-by: Andy Grover
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • This patch contains the squashed version of second round of target core
    cleanups and simplifications and Andy and Co. It also contains a handful
    of fixes to address bugs the original series and other minor cleanups.

    Here is the condensed shortlog:

    target: Remove unneeded casts to void*
    target: Rename get_lun_for_{cmd,tmr} to lookup_{cmd,tmr}_lun
    target: Make t_task a member of se_cmd, not a pointer
    target: Handle functions returning "-2"
    target: Use cmd->se_dev over cmd->se_lun->lun_se_dev
    target: Embed qr in struct se_cmd
    target: Replace embedded struct se_queue_req with a list_head
    target: Rename list_heads that are nodes in struct se_cmd to "*_node"
    target: Fold transport_device_setup_cmd() into lookup_{tmr,cmd}_lun()
    target: Make t_mem_list and t_mem_list_bidi members of t_task
    target: Add comment & cleanup transport_map_sg_to_mem()
    target: Remove unneeded checks in transport_free_pages()

    (Roland: Fix se_queue_req removal leftovers OOPs)
    (nab: Fix transport_lookup_tmr_lun failure case)
    (nab: Fix list_empty(&cmd->t_task.t_mem_bidi_list) inversion bugs)

    Signed-off-by: Andy Grover
    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • This patch contains the squashed version of a number of cleanups and
    minor fixes from Andy's initial series (round 1) for target core this
    past spring. The condensed log looks like:

    target: use errno values instead of returning -1 for everything
    target: Rename transport_calc_sg_num to transport_init_task_sg
    target: Fix leak in error path in transport_init_task_sg
    target/pscsi: Remove pscsi_get_sh() usage
    target: Make two runtime checks into WARN_ONs
    target: Remove hba queue depth and convert to spin_lock_irq usage
    target: dev->dev_status_queue_obj is unused
    target: Make struct se_queue_req.cmd type struct se_cmd *
    target: Remove __transport_get_qr_from_queue()
    target: Rename se_dev->g_se_dev_list to se_dev_node
    target: Remove struct se_global
    target: Simplify scsi mib index table code
    target: Make dev_queue_obj a member of se_device instead of a pointer
    target: remove extraneous returns at end of void functions
    target: Ensure transport_dump_vpd_ident_type returns null-terminated str
    target: Function pointers don't need to use '&' to be assigned
    target: Fix comment in __transport_execute_tasks()
    target: Misc style cleanups
    target: rename struct pr_reservation_template to pr_reservation
    target: Remove #defines that just perform indirection
    target: Inline transport_get_task_from_execute_queue()
    target: Minor header comment fixes

    Signed-off-by: Andy Grover
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • This patch removes the now unnecessary 'unsigned char *cdb' function
    parameter from transport_get_lun_for_cmd(). This also includes updating
    lio-target, tcm_loop and tcm_fc usage of transport_get_lun_for_cmd().

    Reported-by: Fubo Chen
    Signed-off-by: Nicholas A. Bellinger

    Nicholas Bellinger
     
  • This patch checks the passed 'unpacked_lun' against TRANSPORT_MAX_LUNS_PER_TPG
    before reading from struct se_node_acl->device_list[].

    Signed-off-by: Fubo Chen
    Signed-off-by: Nicholas A. Bellinger

    Fubo Chen
     

24 Jun, 2011

2 commits

  • This patch fixes a number of cases in target core using an incorrectly

    if (strlen(foo) > SOME_MAX_SIZE)

    As strlen() returns the number of characters in the string not counting
    the NULL character at the end. So if you do something like:

    char buf[10];

    if (strlen("0123456789") > 10)
    return -ETOOLONG;
    snprintf(buf, 10, "0123456789");
    printf("%s\n", buf);

    then the last "9" gets chopped off and only "012345678" is printed.

    Plus I threw in one small related cleanup.

    Signed-off-by: Dan Carpenter
    Signed-off-by: Nicholas Bellinger

    Dan Carpenter
     
  • This patch fixes two possible NULL pointer dereferences in target v4.0
    code where se_tmr release path in core_tmr_release_req() can OOPs upon
    transport_get_lun_for_tmr() failure by attempting to access se_device or
    se_tmr->tmr_list without a valid member of se_device->tmr_list during
    transport_free_se_cmd() release. This patch moves the se_tmr->tmr_dev
    pointer assignment in transport_get_lun_for_tmr() until after possible
    -ENODEV failures during unpacked_lun lookup.

    This addresses an OOPs originally reported with LIO v4.1 upstream on
    .39 code here:

    TARGET_CORE[qla2xxx]: Detected NON_EXISTENT_LUN Access for 0x00000000
    BUG: unable to handle kernel NULL pointer dereference at 0000000000000550
    IP: [] __ticket_spin_trylock+0x4/0x20
    PGD 0
    Oops: 0000 [#1] SMP
    last sysfs file: /sys/devices/system/cpu/cpu23/cache/index2/shared_cpu_map
    CPU 1
    Modules linked in: netconsole target_core_pscsi target_core_file
    tcm_qla2xxx target_core_iblock tcm_loop target_core_mod configfs
    ipmi_devintf ipmi_si ipmi_msghandler serio_raw i7core_edac ioatdma dca
    edac_core ps_bdrv ses enclosure usbhid usb_storage ahci qla2xxx hid
    uas e1000e mpt2sas libahci mlx4_core scsi_transport_fc
    scsi_transport_sas raid_class scsi_tgt [last unloaded: netconsole]

    Pid: 0, comm: kworker/0:0 Tainted: G W 2.6.39+ #1 Xyratex Storage Server
    RIP: 0010:[] []__ticket_spin_trylock+0x4/0x20
    RSP: 0018:ffff88063e803c08 EFLAGS: 00010286
    RAX: ffff880619ab45e0 RBX: 0000000000000550 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000550
    RBP: ffff88063e803c08 R08: 0000000000000002 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000568
    R13: 0000000000000001 R14: 0000000000000000 R15: ffff88060cd96a20
    FS: 0000000000000000(0000) GS:ffff88063e800000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 0000000000000550 CR3: 0000000001a03000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process kworker/0:0 (pid: 0, threadinfo ffff880619ab8000, task ffff880619ab45e0)
    Stack:
    ffff88063e803c28 ffffffff812cf039 0000000000000550 0000000000000568
    ffff88063e803c58 ffffffff8157071e ffffffffa028a1dc ffff88060f7e4600
    0000000000000550 ffff880616961480 ffff88063e803c78 ffffffffa028a1dc
    Call Trace:

    [] do_raw_spin_trylock+0x19/0x50
    [] _raw_spin_lock+0x3e/0x70
    [] ? core_tmr_release_req+0x2c/0x60 [target_core_mod]
    [] core_tmr_release_req+0x2c/0x60 [target_core_mod]
    [] transport_free_se_cmd+0x22/0x50 [target_core_mod]
    [] transport_release_cmd_to_pool+0x20/0x40 [target_core_mod]
    [] transport_generic_free_cmd+0xa5/0xb0 [target_core_mod]
    [] tcm_qla2xxx_handle_tmr+0xc4/0xd0 [tcm_qla2xxx]
    [] __qla24xx_handle_abts+0xd3/0x150 [qla2xxx]
    [] qla_tgt_response_pkt+0x171/0x520 [qla2xxx]
    [] qla_tgt_response_pkt_all_vps+0x2d/0x220 [qla2xxx]
    [] qla24xx_process_response_queue+0x1a3/0x670 [qla2xxx]
    [] ? qla24xx_atio_pkt+0x81/0x120 [qla2xxx]
    [] ? qla24xx_msix_default+0x45/0x2a0 [qla2xxx]
    [] qla24xx_msix_default+0x1b8/0x2a0 [qla2xxx]
    [] handle_irq_event_percpu+0x54/0x210
    [] handle_irq_event+0x48/0x70
    [] ? handle_edge_irq+0x1e/0x110
    [] handle_edge_irq+0x77/0x110
    [] handle_irq+0x22/0x40
    [] do_IRQ+0x5d/0xe0
    [] common_interrupt+0x13/0x13

    [] ? intel_idle+0xd7/0x130
    [] ? intel_idle+0xd0/0x130
    [] cpuidle_idle_call+0xab/0x1c0
    [] cpu_idle+0xab/0xf0
    [] start_secondary+0x1cb/0x1d2

    Reported-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

27 May, 2011

2 commits

  • This patch converts transport_core_report_lun_response() to use
    drivers/scsi/scsi_scan.c:int_to_scsilun instead of using the
    struct target_core_fabric_ops->pack_lun() fabric provided API vector.

    It also removes the tfo->pack_lun check from target_fabric_tf_ops_check()
    and removes from struct target_core_fabric_ops->pack_lun() from
    target_core_fabric_ops.h, and the following mainline scsi-misc fabric
    modules:

    *) tcm_loop: Drop tcm_loop_pack_lun() usage
    *) tcm_fc: Drop ft_pack_lun() usage

    Reported-by: Mike Christie
    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Nicholas Bellinger
     
  • This patch fixes two bugs wrt to the interrupt context usage of target
    core with HW target mode drivers. It first converts the usage of struct
    se_device->stats_lock in transport_get_lun_for_cmd() and core_tmr_lun_reset()
    to properly use spin_lock_irq() to address an BUG with CONFIG_LOCKDEP_SUPPORT=y
    enabled.

    This patch also adds a 'in_interrupt()' check to allow GFP_ATOMIC usage from
    core_tmr_alloc_req() to fix a 'sleeping in interrupt context' BUG with HW
    target fabrics that require this logic to function.

    Signed-off-by: Nicholas Bellinger
    Cc: stable@kernel.org
    Signed-off-by: James Bottomley

    Nicholas Bellinger
     

31 Mar, 2011

1 commit


24 Mar, 2011

2 commits

  • This patch addresses the majority of sparse warnings and adds
    proper locking annotations. It also fixes the dubious one-bit signed
    bitfield, for which the signed one-bit types can be 0 or -1 which can
    cause a problem if someone ever checks if (foo->lu_gp_assoc == 1).
    The current code is fine because everyone just checks zero vs non-zero.
    But Sparse complains about it so lets change it. The warnings look like
    this:

    include/target/target_core_base.h:228:26: error: dubious one-bit signed bitfield

    Signed-off-by: Dan Carpenter
    Signed-off-by: Fubo Chen
    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Dan Carpenter
     
  • This patch removes a legacy struct se_hba->hba_dev_list -> se_release_device_for_hba()
    list walk in core_delete_hba(), which is no longer required while using configfs
    VFS level parent/child struct config_group dependency referencing. The reason
    is because any struct se_hba->hba_dev_list-> struct se_device members are going
    to have to be released via:

    rmdir /sys/kernel/config/target/core/$HBA/*

    before rmdir release of struct se_hba via target_core_configfs.c:
    target_core_call_delhbafromtarget() -> core_delete_hba()

    rmdir /sys/kernel/config/target/core/$HBA

    to release struct se_hba in core_delete_hba().

    This patch also removes the legacy se_clear_dev_ports() function, which is
    left-over pre-configfs shutdown logic for when se_free_virtual_device()
    was responsible for walking struct se_device->dev_sep_list and calling
    core_dev_del_lun() for each individual active struct se_port->se_lun.

    The reason this can be removed is because all struct se_device->dev_sep_list
    -> struct se_port communication is done via configfs symlinks, which
    means that an target fabric module's endpoints containg active struct
    se_port(s) will have to be released via target_core_fabric_configfs.c:
    target_fabric_port_unlink() via:

    unlink /sys/kernel/config/target/$FABRIC_MOD/$ENDPOINT/tpgt_$TPGT/lun/lun_$LUN_ID/

    before rmdir release of struct se_device in target_core_configfs.c:
    target_core_drop_subdev() -> se_free_virtual_device() can happen via:

    rmdir /sys/kernel/config/target/core/$HBA/*

    to release struct se_subsystem_dev in target_core_drop_subdev()

    Reported-by: Stefan Richter
    Reported-by: Fubo Chen
    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Fubo Chen
     

02 Mar, 2011

1 commit


13 Feb, 2011

3 commits

  • This patch removes the legacy procfs based target_core_mib.c code,
    and moves the necessary scsi_index_tables functions and defines into
    target_core_transport.c and target_core_base.h code to allow existing
    fabric independent statistics to function.

    This includes the removal of a handful of 'atomic_t mib_ref_count'
    counters used in struct se_node_acl, se_session and se_hba to prevent
    removal while using seq_list procfs walking logic.

    [jejb: fix up compile failures]
    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Nicholas Bellinger
     
  • The struct se_node_acl->device_list_lock needs to be released if either
    sanity check for struct se_dev_entry->se_lun_acl or deve->se_lun fails.

    Signed-off-by: Fubo Chen
    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Fubo Chen
     
  • This patch fixes a bug in core_update_device_list_for_node() where
    individual demo-mode generated MappedLUN's UA + Persistent
    Reservations metadata where being leaked, instead of falling through
    and calling existing core_scsi3_ua_release_all() and
    core_scsi3_free_pr_reg_from_nacl() at the end of
    core_update_device_list_for_node().

    This bug would manifest itself with the following OOPs w/ TPG
    demo-mode endpoints (tfo->tpg_check_demo_mode()=1), and PROUT
    REGISTER+RESERVE -> explict struct se_session logout -> struct
    se_device shutdown:

    [ 697.021139] LIO_iblock used greatest stack depth: 2704 bytes left
    [ 702.235017] general protection fault: 0000 [#1] SMP
    [ 702.235074] last sysfs file: /sys/devices/virtual/net/lo/operstate
    [ 704.372695] CPU 0
    [ 704.372725] Modules linked in: crc32c target_core_stgt scsi_tgt target_core_pscsi target_core_file target_core_iblock target_core_mod configfs sr_mod cdrom sd_mod ata_piix mptspi mptscsih libata mptbase [last unloaded: iscsi_target_mod]
    [ 704.375442]
    [ 704.375563] Pid: 4964, comm: tcm_node Not tainted 2.6.37+ #1 440BX Desktop Reference Platform/VMware Virtual Platform
    [ 704.375912] RIP: 0010:[] [] __core_scsi3_complete_pro_release+0x31/0x133 [target_core_mod]
    [ 704.376017] RSP: 0018:ffff88001e5ffcb8 EFLAGS: 00010296
    [ 704.376017] RAX: 6d32335b1b0a0d0a RBX: ffff88001d952cb0 RCX: 0000000000000015
    [ 704.376017] RDX: ffff88001b428000 RSI: ffff88001da5a4c0 RDI: ffff88001e5ffcd8
    [ 704.376017] RBP: ffff88001e5ffd28 R08: ffff88001e5ffcd8 R09: ffff88001d952080
    [ 704.377116] R10: ffff88001dfc5480 R11: ffff88001df8abb0 R12: ffff88001d952cb0
    [ 704.377319] R13: 0000000000000000 R14: ffff88001df8abb0 R15: ffff88001b428000
    [ 704.377521] FS: 00007f033d15c6e0(0000) GS:ffff88001fa00000(0000) knlGS:0000000000000000
    [ 704.377861] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 704.378043] CR2: 00007fff09281510 CR3: 000000001e5db000 CR4: 00000000000006f0
    [ 704.378110] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 704.378110] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 704.378110] Process tcm_node (pid: 4964, threadinfo ffff88001e5fe000, task ffff88001d99c260)
    [ 704.378110] Stack:
    [ 704.378110] ffffea0000678980 ffff88001da5a4c0 ffffea0000678980 ffff88001f402b00
    [ 704.378110] ffff88001e5ffd08 ffffffff810ea236 ffff88001e5ffd18 0000000000000282
    [ 704.379772] ffff88001d952080 ffff88001d952cb0 ffff88001d952cb0 ffff88001dc79010
    [ 704.380082] Call Trace:
    [ 704.380220] [] ? __slab_free+0x89/0x11c
    [ 704.380403] [] core_scsi3_free_all_registrations+0x3e/0x157 [target_core_mod]
    [ 704.380479] [] se_release_device_for_hba+0xa6/0xd8 [target_core_mod]
    [ 704.380479] [] se_free_virtual_device+0x3b/0x45 [target_core_mod]
    [ 704.383750] [] target_core_drop_subdev+0x13a/0x18d [target_core_mod]
    [ 704.384068] [] client_drop_item+0x25/0x31 [configfs]
    [ 704.384263] [] configfs_rmdir+0x1a1/0x223 [configfs]
    [ 704.384459] [] vfs_rmdir+0x7e/0xd3
    [ 704.384631] [] do_rmdir+0xa3/0xf4
    [ 704.384895] [] ? filp_close+0x67/0x72
    [ 704.386485] [] sys_rmdir+0x11/0x13
    [ 704.387893] [] system_call_fastpath+0x16/0x1b
    [ 704.388083] Code: 4c 8d 45 b0 41 56 49 89 d7 41 55 41 89 cd 41 54 b9 15 00 00 00 53 48 89 fb 48 83 ec 48 4c 89 c7 48 89 75 98 48 8b 86 28 01 00 00 8b 80 90 01 00 00 48 89 45 a0 31 c0 f3 aa c7 45 ac 00 00 00
    [ 704.388763] RIP [] __core_scsi3_complete_pro_release+0x31/0x133 [target_core_mod]
    [ 704.389142] RSP
    [ 704.389572] ---[ end trace 2a3614f3cd6261a5 ]---

    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Nicholas Bellinger
     

15 Jan, 2011

1 commit

  • LIO target is a full featured in-kernel target framework with the
    following feature set:

    High-performance, non-blocking, multithreaded architecture with SIMD
    support.

    Advanced SCSI feature set:

    * Persistent Reservations (PRs)
    * Asymmetric Logical Unit Assignment (ALUA)
    * Protocol and intra-nexus multiplexing, load-balancing and failover (MC/S)
    * Full Error Recovery (ERL=0,1,2)
    * Active/active task migration and session continuation (ERL=2)
    * Thin LUN provisioning (UNMAP and WRITE_SAMExx)

    Multiprotocol target plugins

    Storage media independence:

    * Virtualization of all storage media; transparent mapping of IO to LUNs
    * No hard limits on number of LUNs per Target; maximum LUN size ~750 TB
    * Backstores: SATA, SAS, SCSI, BluRay, DVD, FLASH, USB, ramdisk, etc.

    Standards compliance:

    * Full compliance with IETF (RFC 3720)
    * Full implementation of SPC-4 PRs and ALUA

    Significant code cleanups done by Christoph Hellwig.

    [jejb: fix up for new block bdev exclusive interface. Minor fixes from
    Randy Dunlap and Dan Carpenter.]
    Signed-off-by: Nicholas A. Bellinger
    Signed-off-by: James Bottomley

    Nicholas Bellinger