linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Nicholas A. Bellinger" <nab@daterainc.com>
To: target-devel <target-devel@vger.kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	linux-scsi <linux-scsi@vger.kernel.org>,
	Christoph Hellwig <hch@lst.de>, Hannes Reinecke <hare@suse.de>,
	Martin Petersen <martin.petersen@oracle.com>,
	Chris Mason <chris.mason@fusionio.com>,
	James Bottomley <JBottomley@Parallels.com>,
	Nicholas Bellinger <nab@linux-iscsi.org>,
	Nicholas Bellinger <nab@daterainc.com>
Subject: [PATCH 7/9] target: Add transport_reset_sgl_orig() for COMPARE_AND_WRITE
Date: Tue, 20 Aug 2013 20:07:58 +0000	[thread overview]
Message-ID: <1377029280-19144-8-git-send-email-nab@daterainc.com> (raw)
In-Reply-To: <1377029280-19144-1-git-send-email-nab@daterainc.com>

From: Nicholas Bellinger <nab@daterainc.com>

After COMPARE_AND_WRITE completes it's comparision, the WRITE
payload SGLs head expect to be updated to point from the verify
instance of user data, to the write instance of user data.

So for this special case, add transport_reset_sgl_orig() usage
within transport_free_pages() and add se_cmd->t_data_[sg,nents]_orig
members to save the original assignments.

Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Martin Petersen <martin.petersen@oracle.com>
Cc: Chris Mason <chris.mason@fusionio.com>
Cc: James Bottomley <JBottomley@Parallels.com>
Cc: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Nicholas Bellinger <nab@daterainc.com>
---
 drivers/target/target_core_transport.c |   21 ++++++++++++++++++++-
 include/target/target_core_base.h      |    2 ++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 60d1336..bb98684 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1994,10 +1994,29 @@ static inline void transport_free_sgl(struct scatterlist *sgl, int nents)
 	kfree(sgl);
 }
 
+static inline void transport_reset_sgl_orig(struct se_cmd *cmd)
+{
+	/*
+	 * Check for saved t_data_sg that may be used for COMPARE_AND_WRITE
+	 * emulation, and free + reset pointers if necessary..
+	 */
+	if (!cmd->t_data_sg_orig)
+		return;
+
+	kfree(cmd->t_data_sg);
+	cmd->t_data_sg = cmd->t_data_sg_orig;
+	cmd->t_data_sg_orig = NULL;
+	cmd->t_data_nents = cmd->t_data_nents_orig;
+	cmd->t_data_nents_orig = 0;
+}
+
 static inline void transport_free_pages(struct se_cmd *cmd)
 {
-	if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)
+	if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) {
+		transport_reset_sgl_orig(cmd);
 		return;
+	}
+	transport_reset_sgl_orig(cmd);
 
 	transport_free_sgl(cmd->t_data_sg, cmd->t_data_nents);
 	cmd->t_data_sg = NULL;
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index e1e0843..2f9a438 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -476,7 +476,9 @@ struct se_cmd {
 	struct work_struct	work;
 
 	struct scatterlist	*t_data_sg;
+	struct scatterlist	*t_data_sg_orig;
 	unsigned int		t_data_nents;
+	unsigned int		t_data_nents_orig;
 	void			*t_data_vmap;
 	struct scatterlist	*t_bidi_data_sg;
 	unsigned int		t_bidi_data_nents;
-- 
1.7.10.4


  parent reply	other threads:[~2013-08-20 20:24 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-20 20:07 [PATCH 0/9] target: Add support for COMPARE_AND_WRITE (VAAI) emulation Nicholas A. Bellinger
2013-08-20 20:07 ` [PATCH 1/9] scsi: Add CDB definition for COMPARE_AND_WRITE Nicholas A. Bellinger
2013-08-21  6:30   ` Christoph Hellwig
2013-08-20 20:07 ` [PATCH 2/9] target: Add return for se_cmd->transport_complete_callback Nicholas A. Bellinger
2013-08-20 20:07 ` [PATCH 3/9] target: Add memory allocation for bidirectional commands Nicholas A. Bellinger
2013-08-20 20:07 ` [PATCH 4/9] target: Add TCM_MISCOMPARE_VERIFY sense handling Nicholas A. Bellinger
2013-08-20 20:07 ` [PATCH 5/9] target: Skip ->queue_data_in() callbacks for COMPARE_AND_WRITE Nicholas A. Bellinger
2013-08-21  6:32   ` Christoph Hellwig
2013-08-21  7:20     ` Nicholas A. Bellinger
2013-08-20 20:07 ` [PATCH 6/9] target: Allow sbc_ops->execute_rw() to accept SGLs + data_direction Nicholas A. Bellinger
2013-08-21  6:35   ` Christoph Hellwig
2013-08-21  7:26     ` Nicholas A. Bellinger
2013-08-20 20:07 ` Nicholas A. Bellinger [this message]
2013-08-20 20:07 ` [PATCH 8/9] target: Add support for COMPARE_AND_WRITE emulation Nicholas A. Bellinger
2013-08-21 16:14   ` Christoph Hellwig
2013-08-21 17:47     ` Nicholas A. Bellinger
2013-08-20 20:08 ` [PATCH 9/9] tcm_qla2xxx: Add special case for COMPARE_AND_WRITE data_direction Nicholas A. Bellinger
2013-08-21  6:37   ` Christoph Hellwig
2013-08-21  7:31     ` Nicholas A. Bellinger
2013-08-21 16:04       ` Christoph Hellwig
2013-08-21 14:38   ` Roland Dreier
2013-08-21 15:53     ` Christoph Hellwig
2013-08-21 17:52       ` Nicholas A. Bellinger
2013-08-21 16:47     ` Roland Dreier
2013-08-20 21:29 ` [PATCH 0/9] target: Add support for COMPARE_AND_WRITE (VAAI) emulation Christoph Hellwig
2013-08-20 21:53   ` Nicholas A. Bellinger
2013-08-20 22:01     ` Douglas Gilbert
2013-08-20 22:19       ` Nicholas A. Bellinger

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=1377029280-19144-8-git-send-email-nab@daterainc.com \
    --to=nab@daterainc.com \
    --cc=JBottomley@Parallels.com \
    --cc=chris.mason@fusionio.com \
    --cc=hare@suse.de \
    --cc=hch@lst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=nab@linux-iscsi.org \
    --cc=target-devel@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).