diff options
-rw-r--r-- | drivers/target/target_core_transport.c | 21 | ||||
-rw-r--r-- | include/target/target_core_base.h | 2 |
2 files changed, 22 insertions, 1 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index c974e1373c77..87d64add7874 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1991,10 +1991,29 @@ static inline void transport_free_sgl(struct scatterlist *sgl, int nents) | |||
1991 | kfree(sgl); | 1991 | kfree(sgl); |
1992 | } | 1992 | } |
1993 | 1993 | ||
1994 | static inline void transport_reset_sgl_orig(struct se_cmd *cmd) | ||
1995 | { | ||
1996 | /* | ||
1997 | * Check for saved t_data_sg that may be used for COMPARE_AND_WRITE | ||
1998 | * emulation, and free + reset pointers if necessary.. | ||
1999 | */ | ||
2000 | if (!cmd->t_data_sg_orig) | ||
2001 | return; | ||
2002 | |||
2003 | kfree(cmd->t_data_sg); | ||
2004 | cmd->t_data_sg = cmd->t_data_sg_orig; | ||
2005 | cmd->t_data_sg_orig = NULL; | ||
2006 | cmd->t_data_nents = cmd->t_data_nents_orig; | ||
2007 | cmd->t_data_nents_orig = 0; | ||
2008 | } | ||
2009 | |||
1994 | static inline void transport_free_pages(struct se_cmd *cmd) | 2010 | static inline void transport_free_pages(struct se_cmd *cmd) |
1995 | { | 2011 | { |
1996 | if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) | 2012 | if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) { |
2013 | transport_reset_sgl_orig(cmd); | ||
1997 | return; | 2014 | return; |
2015 | } | ||
2016 | transport_reset_sgl_orig(cmd); | ||
1998 | 2017 | ||
1999 | transport_free_sgl(cmd->t_data_sg, cmd->t_data_nents); | 2018 | transport_free_sgl(cmd->t_data_sg, cmd->t_data_nents); |
2000 | cmd->t_data_sg = NULL; | 2019 | cmd->t_data_sg = NULL; |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 4a26a18a24d6..7fdb3fae2961 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -478,7 +478,9 @@ struct se_cmd { | |||
478 | struct work_struct work; | 478 | struct work_struct work; |
479 | 479 | ||
480 | struct scatterlist *t_data_sg; | 480 | struct scatterlist *t_data_sg; |
481 | struct scatterlist *t_data_sg_orig; | ||
481 | unsigned int t_data_nents; | 482 | unsigned int t_data_nents; |
483 | unsigned int t_data_nents_orig; | ||
482 | void *t_data_vmap; | 484 | void *t_data_vmap; |
483 | struct scatterlist *t_bidi_data_sg; | 485 | struct scatterlist *t_bidi_data_sg; |
484 | unsigned int t_bidi_data_nents; | 486 | unsigned int t_bidi_data_nents; |