[PATCH 3.12 38/82] ipr: Fix incorrect trace indexing

2015-08-24 Thread Jiri Slaby
From: Brian King 

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

===

commit bb7c54339e6a10ecce5c4961adf5e75b3cf0af30 upstream.

When ipr's internal driver trace was changed to an atomic, a signed/unsigned
bug slipped in which results in us indexing backwards in our memory buffer
writing on memory that does not belong to us. This patch fixes this by removing
the modulo and instead just mask off the low bits.

Tested-by: Wen Xiong 
Reviewed-by: Wen Xiong 
Reviewed-by: Gabriel Krisman Bertazi 
Signed-off-by: Brian King 
Reviewed-by: Martin K. Petersen 
Signed-off-by: James Bottomley 
Signed-off-by: Jiri Slaby 
---
 drivers/scsi/ipr.c | 5 +++--
 drivers/scsi/ipr.h | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 5f06ca46e187..fa55ad47cf65 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -592,9 +592,10 @@ static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
 {
struct ipr_trace_entry *trace_entry;
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
+   unsigned int trace_index;
 
-   trace_entry = _cfg->trace[atomic_add_return
-   (1, _cfg->trace_index)%IPR_NUM_TRACE_ENTRIES];
+   trace_index = atomic_add_return(1, _cfg->trace_index) & 
IPR_TRACE_INDEX_MASK;
+   trace_entry = _cfg->trace[trace_index];
trace_entry->time = jiffies;
trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0];
trace_entry->type = type;
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
index f6d379725a00..06b3b4bb2911 100644
--- a/drivers/scsi/ipr.h
+++ b/drivers/scsi/ipr.h
@@ -1462,6 +1462,7 @@ struct ipr_ioa_cfg {
 
 #define IPR_NUM_TRACE_INDEX_BITS   8
 #define IPR_NUM_TRACE_ENTRIES  (1 << IPR_NUM_TRACE_INDEX_BITS)
+#define IPR_TRACE_INDEX_MASK   (IPR_NUM_TRACE_ENTRIES - 1)
 #define IPR_TRACE_SIZE (sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES)
char trace_start[8];
 #define IPR_TRACE_START_LABEL  "trace"
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3.12 38/82] ipr: Fix incorrect trace indexing

2015-08-24 Thread Jiri Slaby
From: Brian King brk...@linux.vnet.ibm.com

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

===

commit bb7c54339e6a10ecce5c4961adf5e75b3cf0af30 upstream.

When ipr's internal driver trace was changed to an atomic, a signed/unsigned
bug slipped in which results in us indexing backwards in our memory buffer
writing on memory that does not belong to us. This patch fixes this by removing
the modulo and instead just mask off the low bits.

Tested-by: Wen Xiong wenxi...@linux.vnet.ibm.com
Reviewed-by: Wen Xiong wenxi...@linux.vnet.ibm.com
Reviewed-by: Gabriel Krisman Bertazi kris...@linux.vnet.ibm.com
Signed-off-by: Brian King brk...@linux.vnet.ibm.com
Reviewed-by: Martin K. Petersen martin.peter...@oracle.com
Signed-off-by: James Bottomley jbottom...@odin.com
Signed-off-by: Jiri Slaby jsl...@suse.cz
---
 drivers/scsi/ipr.c | 5 +++--
 drivers/scsi/ipr.h | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 5f06ca46e187..fa55ad47cf65 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -592,9 +592,10 @@ static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
 {
struct ipr_trace_entry *trace_entry;
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd-ioa_cfg;
+   unsigned int trace_index;
 
-   trace_entry = ioa_cfg-trace[atomic_add_return
-   (1, ioa_cfg-trace_index)%IPR_NUM_TRACE_ENTRIES];
+   trace_index = atomic_add_return(1, ioa_cfg-trace_index)  
IPR_TRACE_INDEX_MASK;
+   trace_entry = ioa_cfg-trace[trace_index];
trace_entry-time = jiffies;
trace_entry-op_code = ipr_cmd-ioarcb.cmd_pkt.cdb[0];
trace_entry-type = type;
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
index f6d379725a00..06b3b4bb2911 100644
--- a/drivers/scsi/ipr.h
+++ b/drivers/scsi/ipr.h
@@ -1462,6 +1462,7 @@ struct ipr_ioa_cfg {
 
 #define IPR_NUM_TRACE_INDEX_BITS   8
 #define IPR_NUM_TRACE_ENTRIES  (1  IPR_NUM_TRACE_INDEX_BITS)
+#define IPR_TRACE_INDEX_MASK   (IPR_NUM_TRACE_ENTRIES - 1)
 #define IPR_TRACE_SIZE (sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES)
char trace_start[8];
 #define IPR_TRACE_START_LABEL  trace
-- 
2.5.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/