1. 22 Aug, 2011 3 commits
    • Roland Dreier's avatar
      target: Convert acl_node_lock to be IRQ-disabling · 28638887
      Roland Dreier authored
      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: [<ffffffffa026f872>] transport_deregister_session+0x92/0x140 [target_core_mod]
      
          and this task is already holding:
           (&(&ha->hardware_lock)->rlock){-.-...}, at: [<ffffffffa017c5e7>] 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: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      28638887
    • Nicholas Bellinger's avatar
      target: Fix task count > 1 handling breakage and use max_sector page alignment · 525a48a2
      Nicholas Bellinger authored
      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: default avatarChris Boot <bootc@bootc.net>
      Cc: Kiran Patil <kiran.patil@intel.com>
      Cc: Andy Grover <agrover@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      525a48a2
    • Nicholas Bellinger's avatar
      target: Make standard INQUIRY return 'not connected' for tpg_virt_lun0 · 052605c6
      Nicholas Bellinger authored
      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: default avatarRoland Dreier <roland@purestorage.com>
      Cc: Andrew Vasquez <andrew.vasquez@qlogic.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@risingtidesystems.com>
      052605c6
  2. 22 Jul, 2011 12 commits
    • Nicholas Bellinger's avatar
      target: Update QUEUE ALGORITHM MODIFIER control page default · 5de619a3
      Nicholas Bellinger authored
      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: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@risingtidesystems.com>
      5de619a3
    • Andy Grover's avatar
      target: Follow up core updates from AGrover and HCH (round 4) · 6708bb27
      Andy Grover authored
      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: default avatarAndy Grover <agrover@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      6708bb27
    • Andy Grover's avatar
      target: Make all control CDBs scatter-gather · 05d1c7c0
      Andy Grover authored
      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: default avatarAndy Grover <agrover@redhat.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      05d1c7c0
    • Roland Dreier's avatar
      target: Implement Block Device Characteristics VPD page · e22a7f07
      Roland Dreier authored
      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: default avatarRoland Dreier <roland@purestorage.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      e22a7f07
    • Roland Dreier's avatar
      target: Make se_tmr_lock IRQ-safe · 5e1be919
      Roland Dreier authored
      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: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      5e1be919
    • Roland Dreier's avatar
      target: Make se_dev_check_online() locking IRQ-safe · 56e34ee2
      Roland Dreier authored
      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: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      56e34ee2
    • Roland Dreier's avatar
      target: Make transport_lookup_cmd_lun() locking IRQ-safe · 78faae37
      Roland Dreier authored
      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: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      78faae37
    • Andy Grover's avatar
      target: Updates from AGrover and HCH (round 3) · a1d8b49a
      Andy Grover authored
      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 sg<->buf 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: default avatarAndy Grover <agrover@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      a1d8b49a
    • Andy Grover's avatar
      target: More core cleanups from AGrover (round 2) · 5951146d
      Andy Grover authored
      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: default avatarAndy Grover <agrover@redhat.com>
      Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      5951146d
    • Andy Grover's avatar
      target: Core cleanups from AGrover (round 1) · e3d6f909
      Andy Grover authored
      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: default avatarAndy Grover <agrover@redhat.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      e3d6f909
    • Nicholas Bellinger's avatar
      target: Remove unnecessary *cdb transport_get_lun_for_cmd parameter · efa4988d
      Nicholas Bellinger authored
      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: default avatarFubo Chen <fubo.chen@gmail.com>
      Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      efa4988d
    • Fubo Chen's avatar
      target: Check LUN numbers in transport_get_lun_for_[cmd,tmr] · d8144955
      Fubo Chen authored
      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: default avatarFubo Chen <fubo.chen@gmail.com>
      Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      d8144955
  3. 23 Jun, 2011 2 commits
    • Dan Carpenter's avatar
      target: Fix incorrect strlen() NULL terminator checks · 60d645a4
      Dan Carpenter authored
      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: default avatarDan Carpenter <error27@gmail.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      60d645a4
    • Nicholas Bellinger's avatar
      target: Fix transport_get_lun_for_tmr failure cases · 7fd29aa9
      Nicholas Bellinger authored
      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: [<ffffffff81035ec4>] __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:[<ffffffff81035ec4>] [<ffffffff81035ec4>]__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:
      <IRQ>
           [<ffffffff812cf039>] do_raw_spin_trylock+0x19/0x50
           [<ffffffff8157071e>] _raw_spin_lock+0x3e/0x70
           [<ffffffffa028a1dc>] ? core_tmr_release_req+0x2c/0x60 [target_core_mod]
           [<ffffffffa028a1dc>] core_tmr_release_req+0x2c/0x60 [target_core_mod]
           [<ffffffffa028d0d2>] transport_free_se_cmd+0x22/0x50 [target_core_mod]
           [<ffffffffa028d120>] transport_release_cmd_to_pool+0x20/0x40 [target_core_mod]
           [<ffffffffa028e525>] transport_generic_free_cmd+0xa5/0xb0 [target_core_mod]
           [<ffffffffa0147cc4>] tcm_qla2xxx_handle_tmr+0xc4/0xd0 [tcm_qla2xxx]
           [<ffffffffa0191ba3>] __qla24xx_handle_abts+0xd3/0x150 [qla2xxx]
           [<ffffffffa0197651>] qla_tgt_response_pkt+0x171/0x520 [qla2xxx]
           [<ffffffffa0197a2d>] qla_tgt_response_pkt_all_vps+0x2d/0x220 [qla2xxx]
           [<ffffffffa0171dd3>] qla24xx_process_response_queue+0x1a3/0x670 [qla2xxx]
           [<ffffffffa0196281>] ? qla24xx_atio_pkt+0x81/0x120 [qla2xxx]
           [<ffffffffa0174025>] ? qla24xx_msix_default+0x45/0x2a0 [qla2xxx]
           [<ffffffffa0174198>] qla24xx_msix_default+0x1b8/0x2a0 [qla2xxx]
           [<ffffffff810dadb4>] handle_irq_event_percpu+0x54/0x210
           [<ffffffff810dafb8>] handle_irq_event+0x48/0x70
           [<ffffffff810dd5ee>] ? handle_edge_irq+0x1e/0x110
           [<ffffffff810dd647>] handle_edge_irq+0x77/0x110
           [<ffffffff8100d362>] handle_irq+0x22/0x40
           [<ffffffff8157b28d>] do_IRQ+0x5d/0xe0
           [<ffffffff81571413>] common_interrupt+0x13/0x13
      <EOI>
           [<ffffffff813003f7>] ? intel_idle+0xd7/0x130
           [<ffffffff813003f0>] ? intel_idle+0xd0/0x130
           [<ffffffff8144832b>] cpuidle_idle_call+0xab/0x1c0
           [<ffffffff8100a26b>] cpu_idle+0xab/0xf0
           [<ffffffff81566c59>] start_secondary+0x1cb/0x1d2
      Reported-by: default avatarRoland Dreier <roland@purestorage.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      7fd29aa9
  4. 27 May, 2011 2 commits
  5. 24 May, 2011 2 commits
  6. 31 Mar, 2011 1 commit
  7. 23 Mar, 2011 2 commits
    • Dan Carpenter's avatar
      [SCSI] target: Minor sparse warning fixes and annotations · 5dd7ed2e
      Dan Carpenter authored
      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: default avatarDan Carpenter <error27@gmail.com>
      Signed-off-by: default avatarFubo Chen <fubo.chen@gmail.com>
      Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
      5dd7ed2e
    • Fubo Chen's avatar
      [SCSI] target: Remove unnecessary hba_dev_list walk and se_clear_dev_ports legacy code · 05aea6e7
      Fubo Chen authored
      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/<symlink>
      
      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: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
      Reported-by: default avatarFubo Chen <fubo.chen@gmail.com>
      Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
      05aea6e7
  8. 01 Mar, 2011 1 commit
  9. 12 Feb, 2011 3 commits
    • Nicholas Bellinger's avatar
      [SCSI] target: Remove procfs based target_core_mib.c code · e89d15ee
      Nicholas Bellinger authored
      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: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
      e89d15ee
    • Fubo Chen's avatar
      [SCSI] target: fixed missing lock drop in error path · 85dc98d9
      Fubo Chen authored
      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: default avatarFubo Chen <fubo.chen@gmail.com>
      Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
      85dc98d9
    • Nicholas Bellinger's avatar
      [SCSI] target: Fix demo-mode MappedLUN shutdown UA/PR breakage · 29fe609d
      Nicholas Bellinger authored
      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:[<ffffffffa00aaa16>]  [<ffffffffa00aaa16>] __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]  [<ffffffff810ea236>] ? __slab_free+0x89/0x11c
      [  704.380403]  [<ffffffffa00ab781>] core_scsi3_free_all_registrations+0x3e/0x157 [target_core_mod]
      [  704.380479]  [<ffffffffa00a752b>] se_release_device_for_hba+0xa6/0xd8 [target_core_mod]
      [  704.380479]  [<ffffffffa00a7598>] se_free_virtual_device+0x3b/0x45 [target_core_mod]
      [  704.383750]  [<ffffffffa00a3177>] target_core_drop_subdev+0x13a/0x18d [target_core_mod]
      [  704.384068]  [<ffffffffa00960db>] client_drop_item+0x25/0x31 [configfs]
      [  704.384263]  [<ffffffffa00967b5>] configfs_rmdir+0x1a1/0x223 [configfs]
      [  704.384459]  [<ffffffff810fa8cd>] vfs_rmdir+0x7e/0xd3
      [  704.384631]  [<ffffffff810fc3be>] do_rmdir+0xa3/0xf4
      [  704.384895]  [<ffffffff810eed15>] ? filp_close+0x67/0x72
      [  704.386485]  [<ffffffff810fc446>] sys_rmdir+0x11/0x13
      [  704.387893]  [<ffffffff81002a92>] 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 <48> 8b 80 90 01 00 00 48 89 45 a0 31 c0 f3 aa c7 45 ac 00 00 00
      [  704.388763] RIP  [<ffffffffa00aaa16>] __core_scsi3_complete_pro_release+0x31/0x133 [target_core_mod]
      [  704.389142]  RSP <ffff88001e5ffcb8>
      [  704.389572] ---[ end trace 2a3614f3cd6261a5 ]---
      Signed-off-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
      29fe609d
  10. 14 Jan, 2011 1 commit
    • Nicholas Bellinger's avatar
      [SCSI] target: Add LIO target core v4.0.0-rc6 · c66ac9db
      Nicholas Bellinger authored
      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: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
      c66ac9db