Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 9 Feb 2018 22:49:46 +0000 (14:49 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 9 Feb 2018 22:49:46 +0000 (14:49 -0800)
Pull SCSI target updates from Nicholas Bellinger:
 "The highlights include:

   - numerous target-core-user improvements related to queue full and
     timeout handling. (MNC)

   - prevent target-core-user corruption when invalid data page is
     requested. (MNC)

   - add target-core device action configfs attributes to allow
     user-space to trigger events separate from existing attributes
     exposed to end-users. (MNC)

   - fix iscsi-target NULL pointer dereference 4.6+ regression in CHAP
     error path. (David Disseldorp)

   - avoid target-core backend UNMAP callbacks if range is zero. (Andrei
     Vagin)

   - fix a iscsi-target 4.14+ regression related multiple PDU logins,
     that was exposed due to removal of TCP prequeue support. (Florian
     Westphal + MNC)

  Also, there is a iser-target bug still being worked on for post -rc1
  code to address a long standing issue resulting in persistent
  ib_post_send() failures, for RNICs with small max_send_sge"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (36 commits)
  iscsi-target: make sure to wake up sleeping login worker
  tcmu: Fix trailing semicolon
  tcmu: fix cmd user after free
  target: fix destroy device in target_configure_device
  tcmu: allow userspace to reset ring
  target core: add device action configfs files
  tcmu: fix error return code in tcmu_configure_device()
  target_core_user: add cmd id to broken ring message
  target: add SAM_STAT_BUSY sense reason
  tcmu: prevent corruption when invalid data page requested
  target: don't call an unmap callback if a range length is zero
  target/iscsi: avoid NULL dereference in CHAP auth error path
  cxgbit: call neigh_event_send() to update MAC address
  target: tcm_loop: Use seq_puts() in tcm_loop_show_info()
  target: tcm_loop: Delete an unnecessary return statement in tcm_loop_submission_work()
  target: tcm_loop: Delete two unnecessary variable initialisations in tcm_loop_issue_tmr()
  target: tcm_loop: Combine substrings for 26 messages
  target: tcm_loop: Improve a size determination in two functions
  target: tcm_loop: Delete an error message for a failed memory allocation in four functions
  sbp-target: Delete an error message for a failed memory allocation in three functions
  ...

1  2 
drivers/target/target_core_transport.c

index c03a78ee26cd6b811cdbd3d186396c1d0b71c62a,74b646f165d4e4fea16c955884dcf2a119cb82c3..4558f2e1fe1bb5ae3b4907f6ba4b86cb7f1d2e3a
@@@ -1774,6 -1774,9 +1774,9 @@@ void transport_generic_request_failure(
        case TCM_OUT_OF_RESOURCES:
                cmd->scsi_status = SAM_STAT_TASK_SET_FULL;
                goto queue_status;
+       case TCM_LUN_BUSY:
+               cmd->scsi_status = SAM_STAT_BUSY;
+               goto queue_status;
        case TCM_RESERVATION_CONFLICT:
                /*
                 * No SENSE Data payload for this case, set SCSI Status
@@@ -2300,7 -2303,13 +2303,7 @@@ queue_full
  
  void target_free_sgl(struct scatterlist *sgl, int nents)
  {
 -      struct scatterlist *sg;
 -      int count;
 -
 -      for_each_sg(sgl, sg, nents, count)
 -              __free_page(sg_page(sg));
 -
 -      kfree(sgl);
 +      sgl_free_n_order(sgl, nents, 0);
  }
  EXPORT_SYMBOL(target_free_sgl);
  
  target_alloc_sgl(struct scatterlist **sgl, unsigned int *nents, u32 length,
                 bool zero_page, bool chainable)
  {
 -      struct scatterlist *sg;
 -      struct page *page;
 -      gfp_t zero_flag = (zero_page) ? __GFP_ZERO : 0;
 -      unsigned int nalloc, nent;
 -      int i = 0;
 -
 -      nalloc = nent = DIV_ROUND_UP(length, PAGE_SIZE);
 -      if (chainable)
 -              nalloc++;
 -      sg = kmalloc_array(nalloc, sizeof(struct scatterlist), GFP_KERNEL);
 -      if (!sg)
 -              return -ENOMEM;
 +      gfp_t gfp = GFP_KERNEL | (zero_page ? __GFP_ZERO : 0);
  
 -      sg_init_table(sg, nalloc);
 -
 -      while (length) {
 -              u32 page_len = min_t(u32, length, PAGE_SIZE);
 -              page = alloc_page(GFP_KERNEL | zero_flag);
 -              if (!page)
 -                      goto out;
 -
 -              sg_set_page(&sg[i], page, page_len, 0);
 -              length -= page_len;
 -              i++;
 -      }
 -      *sgl = sg;
 -      *nents = nent;
 -      return 0;
 -
 -out:
 -      while (i > 0) {
 -              i--;
 -              __free_page(sg_page(&sg[i]));
 -      }
 -      kfree(sg);
 -      return -ENOMEM;
 +      *sgl = sgl_alloc_order(length, 0, chainable, gfp, nents);
 +      return *sgl ? 0 : -ENOMEM;
  }
  EXPORT_SYMBOL(target_alloc_sgl);