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
next prev 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).