stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Luis Henriques <luis.henriques@canonical.com>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
	kernel-team@lists.ubuntu.com
Cc: Or Gerlitz <ogerlitz@mellanox.com>,
	Nicholas Bellinger <nab@linux-iscsi.org>,
	Luis Henriques <luis.henriques@canonical.com>
Subject: [PATCH 3.11 66/70] iser-target: Add missing se_cmd put for WRITE_PENDING in tx_comp_err
Date: Wed,  7 May 2014 14:13:09 +0100	[thread overview]
Message-ID: <1399468393-10140-67-git-send-email-luis.henriques@canonical.com> (raw)
In-Reply-To: <1399468393-10140-1-git-send-email-luis.henriques@canonical.com>

3.11.10.10 -stable review patch.  If anyone has any objections, please let me know.

------------------

From: Nicholas Bellinger <nab@linux-iscsi.org>

commit 03e7848a64ed535a30f5d7fc6dede2d5a6a2534b upstream.

This patch fixes a bug where outstanding RDMA_READs with WRITE_PENDING
status require an extra target_put_sess_cmd() in isert_put_cmd() code
when called from isert_cq_tx_comp_err() + isert_cq_drain_comp_llist()
context during session shutdown.

The extra kref PUT is required so that transport_generic_free_cmd()
invokes the last target_put_sess_cmd() -> target_release_cmd_kref(),
which will complete(&se_cmd->cmd_wait_comp) the outstanding se_cmd
descriptor with WRITE_PENDING status, and awake the completion in
target_wait_for_sess_cmds() to invoke TFO->release_cmd().

The bug was manifesting itself in target_wait_for_sess_cmds() where
a se_cmd descriptor with WRITE_PENDING status would end up sleeping
indefinately.

Acked-by: Sagi Grimberg <sagig@mellanox.com>
Cc: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
[ luis: backported to 3.11: based on nab's backport to 3.10 ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
---
 drivers/infiniband/ulp/isert/ib_isert.c | 31 ++++++++++++++++++++++---------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index 5430b4a..0e28266 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -1266,7 +1266,7 @@ isert_unmap_cmd(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn)
 }
 
 static void
-isert_put_cmd(struct isert_cmd *isert_cmd)
+isert_put_cmd(struct isert_cmd *isert_cmd, bool comp_err)
 {
 	struct iscsi_cmd *cmd = &isert_cmd->iscsi_cmd;
 	struct isert_conn *isert_conn = isert_cmd->conn;
@@ -1281,8 +1281,21 @@ isert_put_cmd(struct isert_cmd *isert_cmd)
 			list_del_init(&cmd->i_conn_node);
 		spin_unlock_bh(&conn->cmd_lock);
 
-		if (cmd->data_direction == DMA_TO_DEVICE)
+		if (cmd->data_direction == DMA_TO_DEVICE) {
 			iscsit_stop_dataout_timer(cmd);
+			/*
+			 * Check for special case during comp_err where
+			 * WRITE_PENDING has been handed off from core,
+			 * but requires an extra target_put_sess_cmd()
+			 * before transport_generic_free_cmd() below.
+			 */
+			if (comp_err &&
+			    cmd->se_cmd.t_state == TRANSPORT_WRITE_PENDING) {
+				struct se_cmd *se_cmd = &cmd->se_cmd;
+
+				target_put_sess_cmd(se_cmd->se_sess, se_cmd);
+			}
+		}
 
 		isert_unmap_cmd(isert_cmd, isert_conn);
 		transport_generic_free_cmd(&cmd->se_cmd, 0);
@@ -1337,7 +1350,7 @@ isert_unmap_tx_desc(struct iser_tx_desc *tx_desc, struct ib_device *ib_dev)
 
 static void
 isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd,
-		     struct ib_device *ib_dev)
+		     struct ib_device *ib_dev, bool comp_err)
 {
 	if (isert_cmd->pdu_buf_dma != 0) {
 		pr_debug("Calling ib_dma_unmap_single for isert_cmd->pdu_buf_dma\n");
@@ -1347,7 +1360,7 @@ isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd,
 	}
 
 	isert_unmap_tx_desc(tx_desc, ib_dev);
-	isert_put_cmd(isert_cmd);
+	isert_put_cmd(isert_cmd, comp_err);
 }
 
 static void
@@ -1402,14 +1415,14 @@ isert_do_control_comp(struct work_struct *work)
 		iscsit_tmr_post_handler(cmd, cmd->conn);
 
 		cmd->i_state = ISTATE_SENT_STATUS;
-		isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev);
+		isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false);
 		break;
 	case ISTATE_SEND_REJECT:
 		pr_debug("Got isert_do_control_comp ISTATE_SEND_REJECT: >>>\n");
 		atomic_dec(&isert_conn->post_send_buf_count);
 
 		cmd->i_state = ISTATE_SENT_STATUS;
-		isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev);
+		isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false);
 		break;
 	case ISTATE_SEND_LOGOUTRSP:
 		pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n");
@@ -1423,7 +1436,7 @@ isert_do_control_comp(struct work_struct *work)
 	case ISTATE_SEND_TEXTRSP:
 		atomic_dec(&isert_conn->post_send_buf_count);
 		cmd->i_state = ISTATE_SENT_STATUS;
-		isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev);
+		isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false);
 		break;
 	default:
 		pr_err("Unknown do_control_comp i_state %d\n", cmd->i_state);
@@ -1454,7 +1467,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc,
 	atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count);
 
 	cmd->i_state = ISTATE_SENT_STATUS;
-	isert_completion_put(tx_desc, isert_cmd, ib_dev);
+	isert_completion_put(tx_desc, isert_cmd, ib_dev, false);
 }
 
 static void
@@ -1508,7 +1521,7 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn
 	if (!isert_cmd)
 		isert_unmap_tx_desc(tx_desc, ib_dev);
 	else
-		isert_completion_put(tx_desc, isert_cmd, ib_dev);
+		isert_completion_put(tx_desc, isert_cmd, ib_dev, true);
 }
 
 static void
-- 
1.9.1


  parent reply	other threads:[~2014-05-07 13:13 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-07 13:12 [3.11.y.z extended stable] Linux 3.11.10.10 stable review Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 01/70] core, nfqueue, openvswitch: Orphan frags in skb_zerocopy and handle errors Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 02/70] KVM: ioapic: fix assignment of ioapic->rtc_status.pending_eoi (CVE-2014-0155) Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 03/70] iio: querying buffer scan_mask should return 0/1 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 04/70] pata_at91: fix ata_host_activate() failure handling Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 05/70] ext4: note the error in ext4_end_bio() Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 06/70] ext4: fix jbd2 warning under heavy xattr load Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 07/70] ext4: use i_size_read in ext4_unaligned_aio() Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 08/70] locks: allow __break_lease to sleep even when break_time is 0 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 09/70] usb: gadget: zero: Fix SuperSpeed enumeration for alternate setting 1 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 10/70] ahci: do not request irq for dummy port Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 11/70] genirq: Allow forcing cpu affinity of interrupts Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 12/70] irqchip: Gic: Support forced affinity setting Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 13/70] clocksource: Exynos_mct: Register clock event after request_irq() Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 14/70] nfsd: set timeparms.to_maxval in setup_callback_client Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 15/70] ahci: Do not receive interrupts sent by dummy ports Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 16/70] libata/ahci: accommodate tag ordered controllers Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 17/70] Input: synaptics - add min/max quirk for ThinkPad T431s, L440, L540, S1 Yoga and X1 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 18/70] drm/radeon: fix count in cik_sdma_ring_test() Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 19/70] drm/radeon/pm: don't walk the crtc list before it has been initialized (v2) Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 20/70] drm/radeon: fix ATPX detection on non-VGA GPUs Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 21/70] mm: make fixup_user_fault() check the vma access rights too Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 22/70] ARM: 8027/1: fix do_div() bug in big-endian systems Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 23/70] ARM: 8030/1: ARM : kdump : add arch_crash_save_vmcoreinfo Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 24/70] USB: serial: fix sysfs-attribute removal deadlock Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 25/70] 8250_core: Fix unwanted TX chars write Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 26/70] serial: 8250: Fix thread unsafe __dma_tx_complete function Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 27/70] Btrfs: fix inode caching vs tree log Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 28/70] usb: xhci: Prefer endpoint context dequeue pointer over stopped_trb Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 29/70] xhci: Switch Intel Lynx Point ports to EHCI on shutdown Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 30/70] usb/xhci: fix compilation warning when !CONFIG_PCI && !CONFIG_PM Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 31/70] USB: io_ti: fix firmware download on big-endian machines Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 32/70] usb: qcserial: add Sierra Wireless EM7355 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 33/70] usb: qcserial: add Sierra Wireless MC73xx Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 34/70] usb: qcserial: add Sierra Wireless MC7305/MC7355 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 35/70] usb: option: add Olivetti Olicard 500 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 36/70] usb: option: add Alcatel L800MA Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 37/70] usb: option: add and update a number of CMOTech devices Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 38/70] crypto: crypto_wq - Fix late crypto work queue initialization Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 39/70] i2c: i801: Add Device IDs for Intel Wildcat Point-LP PCH Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 40/70] i2c: i801: enable Intel BayTrail SMBUS Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 41/70] ftrace/x86: One more missing sync after fixup of function modification failure Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 42/70] Bluetooth: Add support for Intel Bluetooth device [8087:0a2a] Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 43/70] ARM: 8007/1: Remove extraneous kcmp syscall ignore Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 44/70] ARM: mvebu: ensure the mdio node has a clock reference on Armada 370/XP Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 45/70] ARM: OMAP3: hwmod data: Correct clock domains for USB modules Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 46/70] ARM: OMAP4: Fix definition of IS_PM44XX_ERRATUM Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 47/70] xhci: extend quirk for Renesas cards Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 48/70] [SCSI] qla2xxx: fix error handling of qla2x00_mem_alloc() Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 49/70] [SCSI] arcmsr: upper 32 of dma address lost Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 50/70] ARM: 7840/1: LPAE: don't reject mapping /dev/mem above 4GB Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 51/70] s390/chsc: fix SEI usage on old FW levels Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 52/70] drm/i915: Don't check gmch state on inherited configs Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 53/70] drm/vmwgfx: Make sure user-space can't DMA across buffer object boundaries v2 Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 54/70] s390/bpf,jit: initialize A register if 1st insn is BPF_S_LDX_B_MSH Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 55/70] arm: KVM: fix possible misalignment of PGDs and bounce page Luis Henriques
2014-05-07 13:12 ` [PATCH 3.11 56/70] KVM: ARM: vgic: Fix sgi dispatch problem Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 57/70] ftrace/module: Hardcode ftrace_module_init() call into load_module() Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 58/70] [SCSI] mpt2sas: Don't disable device twice at suspend Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 59/70] [SCSI] virtio-scsi: Skip setting affinity on uninitialized vq Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 60/70] drivercore: deferral race condition fix Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 61/70] hrtimer: Prevent all reprogramming if hang detected Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 62/70] hrtimer: Prevent remote enqueue of leftmost timers Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 63/70] timer: Prevent overflow in apply_slack Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 64/70] ARC: Entry Handler tweaks: Optimize away redundant IRQ_DISABLE_SAVE Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 65/70] ARC: !PREEMPT: Ensure Return to kernel mode is IRQ safe Luis Henriques
2014-05-07 13:13 ` Luis Henriques [this message]
2014-05-07 13:13 ` [PATCH 3.11 67/70] floppy: ignore kernel-only members in FDRAWCMD ioctl input Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 68/70] floppy: don't write kernel-only members to FDRAWCMD ioctl output Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 69/70] n_tty: Fix n_tty_write crash when echoing in raw mode Luis Henriques
2014-05-07 13:13 ` [PATCH 3.11 70/70] KVM: s390: Optimize ucontrol path Luis Henriques

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1399468393-10140-67-git-send-email-luis.henriques@canonical.com \
    --to=luis.henriques@canonical.com \
    --cc=kernel-team@lists.ubuntu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nab@linux-iscsi.org \
    --cc=ogerlitz@mellanox.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).