All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] [SCSI] megaraid_sas: Fix possible divide-by-zero bugs in megaraid_sas_fp.c
@ 2021-08-11 13:16 Tuo Li
  2021-08-11 13:58 ` James Bottomley
  0 siblings, 1 reply; 3+ messages in thread
From: Tuo Li @ 2021-08-11 13:16 UTC (permalink / raw)
  To: kashyap.desai, sumit.saxena, shivasharan.srikanteshwara, jejb,
	martin.petersen
  Cc: megaraidlinux.pdl, linux-scsi, linux-kernel, baijiaju1990,
	Tuo Li, TOTE Robot

In the function mega_mod64(). the variable is checked in:
  if (!divisor)

This indicates that divisor can be zero.
If so, a divide-by-zero bug will occur:
  remainder = do_div(d, divisor);

Also, in the function mega_div64_32(), a divide-by-zero bug can also occur 
if divisor is NULL.

To fix these divide-by-zero bugs, the functions return 0 if divisor is 
zero.

Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
Signed-off-by: Tuo Li <islituo@gmail.com>
---
 drivers/scsi/megaraid/megaraid_sas_fp.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c b/drivers/scsi/megaraid/megaraid_sas_fp.c
index 83f69c33b01a..05eb0d201aed 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fp.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
@@ -72,8 +72,10 @@ u32 mega_mod64(u64 dividend, u32 divisor)
 	u64 d;
 	u32 remainder;
 
-	if (!divisor)
+	if (!divisor) {
 		printk(KERN_ERR "megasas : DIVISOR is zero, in div fn\n");
+		return 0;
+	}
 	d = dividend;
 	remainder = do_div(d, divisor);
 	return remainder;
@@ -90,8 +92,10 @@ static u64 mega_div64_32(uint64_t dividend, uint32_t divisor)
 {
 	u64 d = dividend;
 
-	if (!divisor)
+	if (!divisor) {
 		printk(KERN_ERR "megasas : DIVISOR is zero in mod fn\n");
+		return 0;
+	}
 
 	do_div(d, divisor);
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] [SCSI] megaraid_sas: Fix possible divide-by-zero bugs in megaraid_sas_fp.c
  2021-08-11 13:16 [PATCH] [SCSI] megaraid_sas: Fix possible divide-by-zero bugs in megaraid_sas_fp.c Tuo Li
@ 2021-08-11 13:58 ` James Bottomley
  0 siblings, 0 replies; 3+ messages in thread
From: James Bottomley @ 2021-08-11 13:58 UTC (permalink / raw)
  To: Tuo Li, kashyap.desai, sumit.saxena, shivasharan.srikanteshwara,
	martin.petersen
  Cc: megaraidlinux.pdl, linux-scsi, linux-kernel, baijiaju1990, TOTE Robot

On Wed, 2021-08-11 at 06:16 -0700, Tuo Li wrote:
> In the function mega_mod64(). the variable is checked in:
>   if (!divisor)
> 
> This indicates that divisor can be zero.
> If so, a divide-by-zero bug will occur:
>   remainder = do_div(d, divisor);
> 
> Also, in the function mega_div64_32(), a divide-by-zero bug can also
> occur if divisor is NULL.
> 
> To fix these divide-by-zero bugs, the functions return 0 if divisor
> is zero.

How exactly is this fixing anything?  Simply returning zero because
there is a dividion by zero isn't a fix unless you know what that
return is going to do.  If you look at the inputs to all the
mega_div/mod functions, they're already checked for zero divisor before
calling, so the error handling is already being done correctly and this
"fix" would add nothing to that.  You can argue that the check and
print is pointless since the condition never occurs, but it's not
exactly fast path code.

James





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] [SCSI] megaraid_sas: Fix possible divide-by-zero bugs in megaraid_sas_fp.c
@ 2021-08-21 19:14 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-08-21 19:14 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 20868 bytes --]

CC: clang-built-linux(a)googlegroups.com
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20210811131647.9300-1-islituo@gmail.com>
References: <20210811131647.9300-1-islituo@gmail.com>
TO: Tuo Li <islituo@gmail.com>
TO: kashyap.desai(a)broadcom.com
TO: sumit.saxena(a)broadcom.com
TO: shivasharan.srikanteshwara(a)broadcom.com
TO: jejb(a)linux.ibm.com
TO: martin.petersen(a)oracle.com
CC: megaraidlinux.pdl(a)broadcom.com
CC: linux-scsi(a)vger.kernel.org
CC: linux-kernel(a)vger.kernel.org
CC: baijiaju1990(a)gmail.com
CC: Tuo Li <islituo@gmail.com>

Hi Tuo,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mkp-scsi/for-next]
[also build test WARNING on scsi/for-next linux/master linus/master v5.14-rc6 next-20210820]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Tuo-Li/megaraid_sas-Fix-possible-divide-by-zero-bugs-in-megaraid_sas_fp-c/20210811-211944
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
:::::: branch date: 10 days ago
:::::: commit date: 10 days ago
config: x86_64-randconfig-c001-20210810 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project d39ebdae674c8efc84ebe8dc32716ec353220530)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/5397652c5a3ddb7ddee62fa672ab5fd2065b1e5c
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Tuo-Li/megaraid_sas-Fix-possible-divide-by-zero-bugs-in-megaraid_sas_fp-c/20210811-211944
        git checkout 5397652c5a3ddb7ddee62fa672ab5fd2065b1e5c
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
           if (req->long_data) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:352:9: note: Calling 'ms_transfer_data'
                   err = ms_transfer_data(host, req->data_dir,
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:137:18: note: Assuming field 'type' is not equal to MEMSTICK_TYPE_PRO
           bool pro_card = card->id.type == MEMSTICK_TYPE_PRO;
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:140:20: note: Assuming 'data_dir' is equal to 0
                           __func__, tpc, (data_dir == READ) ? "READ" : "WRITE",
                                           ^
   include/linux/dev_printk.h:126:46: note: expanded from macro 'dev_dbg'
           dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
                                                       ^~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:140:19: note: '?' condition is true
                           __func__, tpc, (data_dir == READ) ? "READ" : "WRITE",
                                          ^
   drivers/memstick/host/rtsx_pci_ms.c:143:6: note: 'data_dir' is equal to READ
           if (data_dir == READ) {
               ^~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:143:2: note: Taking true branch
           if (data_dir == READ) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:145:16: note: 'pro_card' is false
                   trans_mode = pro_card ? MS_TM_AUTO_READ : MS_TM_NORMAL_READ;
                                ^~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:145:16: note: '?' condition is false
   drivers/memstick/host/rtsx_pci_ms.c:154:6: note: 'pro_card' is false
           if (pro_card) {
               ^~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:154:2: note: Taking false branch
           if (pro_card) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:180:8: note: Value assigned to field 'need_card_int', which participates in a condition later
           err = rtsx_pci_transfer_data(pcr, sg, 1, data_dir == READ, 10000);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:181:6: note: Assuming 'err' is >= 0
           if (err < 0) {
               ^~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:181:2: note: Taking false branch
           if (err < 0) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:187:6: note: 'pro_card' is false
           if (pro_card) {
               ^~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:187:2: note: Taking false branch
           if (pro_card) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:192:7: note: Assuming the condition is false
                   if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT))
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:192:3: note: Taking false branch
                   if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT))
                   ^
   drivers/memstick/host/rtsx_pci_ms.c:352:9: note: Returning from 'ms_transfer_data'
                   err = ms_transfer_data(host, req->data_dir,
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:363:6: note: 'err' is >= 0
           if (err < 0)
               ^~~
   drivers/memstick/host/rtsx_pci_ms.c:363:2: note: Taking false branch
           if (err < 0)
           ^
   drivers/memstick/host/rtsx_pci_ms.c:366:6: note: Assuming field 'need_card_int' is not equal to 0
           if (req->need_card_int && (host->ifmode == MEMSTICK_SERIAL)) {
               ^~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:366:6: note: Left side of '&&' is true
   drivers/memstick/host/rtsx_pci_ms.c:366:29: note: Assuming field 'ifmode' is not equal to MEMSTICK_SERIAL
           if (req->need_card_int && (host->ifmode == MEMSTICK_SERIAL)) {
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:366:2: note: Taking false branch
           if (req->need_card_int && (host->ifmode == MEMSTICK_SERIAL)) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:373:11: note: Field 'need_card_int' is not equal to 0
           if (req->need_card_int) {
                    ^
   drivers/memstick/host/rtsx_pci_ms.c:373:2: note: Taking true branch
           if (req->need_card_int) {
           ^
   drivers/memstick/host/rtsx_pci_ms.c:374:3: note: 4th function call argument is an uninitialized value
                   dev_dbg(ms_dev(host), "int_reg: 0x%02x\n", int_reg);
                   ^
   include/linux/dev_printk.h:126:2: note: expanded from macro 'dev_dbg'
           dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
           ^                                           ~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:451:4: warning: Value stored to 'err' is never read [clang-analyzer-deadcode.DeadStores]
                           err = ms_power_on(host);
                           ^     ~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:451:4: note: Value stored to 'err' is never read
                           err = ms_power_on(host);
                           ^     ~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:453:4: warning: Value stored to 'err' is never read [clang-analyzer-deadcode.DeadStores]
                           err = ms_power_off(host);
                           ^     ~~~~~~~~~~~~~~~~~~
   drivers/memstick/host/rtsx_pci_ms.c:453:4: note: Value stored to 'err' is never read
                           err = ms_power_off(host);
                           ^     ~~~~~~~~~~~~~~~~~~
   Suppressed 7 warnings (7 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
>> drivers/scsi/megaraid/megaraid_sas_fp.c:951:34: warning: The result of the left shift is undefined because the left operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult]
                                       (u16)(rightmostParityArm << RAID_CTX_R56_P_ARM_SHIFT);
                                                                ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1013:6: note: Assuming field 'rowDataSize' is not equal to 0
           if (raid->rowDataSize == 0) {
               ^~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1013:2: note: Taking false branch
           if (raid->rowDataSize == 0) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1043:15: note: Field 'IoforUnevenSpan' is 0
           if (io_info->IoforUnevenSpan) {
                        ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1043:2: note: Taking false branch
           if (io_info->IoforUnevenSpan) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1088:6: note: Assuming field 'fpCapable' is 0
           if (raid->capability.fpCapable) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1088:2: note: Taking false branch
           if (raid->capability.fpCapable) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1102:6: note: Assuming 'numRows' is equal to 1
           if (numRows == 1) {
               ^~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1102:2: note: Taking true branch
           if (numRows == 1) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1104:7: note: Assuming 'num_strips' is not equal to 1
                   if (num_strips == 1) {
                       ^~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1104:3: note: Taking false branch
                   if (num_strips == 1) {
                   ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1157:15: note: Assuming field 'fpIoTimeoutForLd' is not equal to 0
                   cpu_to_le16(raid->fpIoTimeoutForLd ?
                               ^
   include/linux/byteorder/generic.h:90:21: note: expanded from macro 'cpu_to_le16'
   #define cpu_to_le16 __cpu_to_le16
                       ^
   include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__cpu_to_le16'
   #define __cpu_to_le16(x) ((__force __le16)(__u16)(x))
                                                     ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1157:15: note: '?' condition is true
                   cpu_to_le16(raid->fpIoTimeoutForLd ?
                               ^
   include/linux/byteorder/generic.h:90:21: note: expanded from macro 'cpu_to_le16'
   #define cpu_to_le16 __cpu_to_le16
                       ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1160:6: note: Assuming field 'adapter_type' is not equal to INVADER_SERIES
           if (instance->adapter_type == INVADER_SERIES)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1160:2: note: Taking false branch
           if (instance->adapter_type == INVADER_SERIES)
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1163:11: note: Assuming field 'adapter_type' is not equal to THUNDERBOLT_SERIES
           else if (instance->adapter_type == THUNDERBOLT_SERIES)
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1163:7: note: Taking false branch
           else if (instance->adapter_type == THUNDERBOLT_SERIES)
                ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1174:6: note: Assuming field 'r56_div_offload' is true
           if (fusion->r56_div_offload && (raid->level >= 5) && !isRead) {
               ^~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1174:6: note: Left side of '&&' is true
   drivers/scsi/megaraid/megaraid_sas_fp.c:1174:34: note: Assuming field 'level' is >= 5
           if (fusion->r56_div_offload && (raid->level >= 5) && !isRead) {
                                           ^~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1174:6: note: Left side of '&&' is true
           if (fusion->r56_div_offload && (raid->level >= 5) && !isRead) {
               ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1174:55: note: Assuming 'isRead' is 0
           if (fusion->r56_div_offload && (raid->level >= 5) && !isRead) {
                                                                ^~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1174:2: note: Taking true branch
           if (fusion->r56_div_offload && (raid->level >= 5) && !isRead) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1175:3: note: Calling 'mr_get_phy_params_r56_rmw'
                   mr_get_phy_params_r56_rmw(instance, ld, start_strip, io_info,
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:923:2: note: The value -1 is assigned to 'rightmostParityArm'
           rightmostParityArm = (arms - 1) - mega_mod64(rowNum, arms);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:930:6: note: Assuming field 'spanDepth' is equal to 1
           if (raid->spanDepth == 1) {
               ^~~~~~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:930:2: note: Taking true branch
           if (raid->spanDepth == 1) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:938:6: note: Assuming field 'level' is not equal to 6
           if (raid->level == 6) {
               ^~~~~~~~~~~~~~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:938:2: note: Taking false branch
           if (raid->level == 6) {
           ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:951:34: note: The result of the left shift is undefined because the left operand is negative
                                       (u16)(rightmostParityArm << RAID_CTX_R56_P_ARM_SHIFT);
                                             ~~~~~~~~~~~~~~~~~~ ^
   drivers/scsi/megaraid/megaraid_sas_fp.c:1386:3: warning: Value stored to 'bestArm' is never read [clang-analyzer-deadcode.DeadStores]
                   bestArm = arm;
                   ^         ~~~
   drivers/scsi/megaraid/megaraid_sas_fp.c:1386:3: note: Value stored to 'bestArm' is never read

vim +951 drivers/scsi/megaraid/megaraid_sas_fp.c

9c915a8c99bce6 Adam Radford       2010-12-21  893  
7fc557005c454f Chandrakanth Patil 2019-06-25  894  /*
7fc557005c454f Chandrakanth Patil 2019-06-25  895   * mr_get_phy_params_r56_rmw -  Calculate parameters for R56 CTIO write operation
7fc557005c454f Chandrakanth Patil 2019-06-25  896   * @instance:			Adapter soft state
7fc557005c454f Chandrakanth Patil 2019-06-25  897   * @ld:				LD index
7fc557005c454f Chandrakanth Patil 2019-06-25  898   * @stripNo:			Strip Number
7fc557005c454f Chandrakanth Patil 2019-06-25  899   * @io_info:			IO info structure pointer
7fc557005c454f Chandrakanth Patil 2019-06-25  900   * pRAID_Context:		RAID context pointer
7fc557005c454f Chandrakanth Patil 2019-06-25  901   * map:				RAID map pointer
7fc557005c454f Chandrakanth Patil 2019-06-25  902   *
7fc557005c454f Chandrakanth Patil 2019-06-25  903   * This routine calculates the logical arm, data Arm, row number and parity arm
7fc557005c454f Chandrakanth Patil 2019-06-25  904   * for R56 CTIO write operation.
7fc557005c454f Chandrakanth Patil 2019-06-25  905   */
7fc557005c454f Chandrakanth Patil 2019-06-25  906  static void mr_get_phy_params_r56_rmw(struct megasas_instance *instance,
7fc557005c454f Chandrakanth Patil 2019-06-25  907  			    u32 ld, u64 stripNo,
7fc557005c454f Chandrakanth Patil 2019-06-25  908  			    struct IO_REQUEST_INFO *io_info,
7fc557005c454f Chandrakanth Patil 2019-06-25  909  			    struct RAID_CONTEXT_G35 *pRAID_Context,
7fc557005c454f Chandrakanth Patil 2019-06-25  910  			    struct MR_DRV_RAID_MAP_ALL *map)
7fc557005c454f Chandrakanth Patil 2019-06-25  911  {
7fc557005c454f Chandrakanth Patil 2019-06-25  912  	struct MR_LD_RAID  *raid = MR_LdRaidGet(ld, map);
7fc557005c454f Chandrakanth Patil 2019-06-25  913  	u8          span, dataArms, arms, dataArm, logArm;
7fc557005c454f Chandrakanth Patil 2019-06-25  914  	s8          rightmostParityArm, PParityArm;
7fc557005c454f Chandrakanth Patil 2019-06-25  915  	u64         rowNum;
7fc557005c454f Chandrakanth Patil 2019-06-25  916  	u64 *pdBlock = &io_info->pdBlock;
7fc557005c454f Chandrakanth Patil 2019-06-25  917  
7fc557005c454f Chandrakanth Patil 2019-06-25  918  	dataArms = raid->rowDataSize;
7fc557005c454f Chandrakanth Patil 2019-06-25  919  	arms = raid->rowSize;
7fc557005c454f Chandrakanth Patil 2019-06-25  920  
7fc557005c454f Chandrakanth Patil 2019-06-25  921  	rowNum =  mega_div64_32(stripNo, dataArms);
7fc557005c454f Chandrakanth Patil 2019-06-25  922  	/* parity disk arm, first arm is 0 */
7fc557005c454f Chandrakanth Patil 2019-06-25  923  	rightmostParityArm = (arms - 1) - mega_mod64(rowNum, arms);
7fc557005c454f Chandrakanth Patil 2019-06-25  924  
7fc557005c454f Chandrakanth Patil 2019-06-25  925  	/* logical arm within row */
7fc557005c454f Chandrakanth Patil 2019-06-25  926  	logArm =  mega_mod64(stripNo, dataArms);
7fc557005c454f Chandrakanth Patil 2019-06-25  927  	/* physical arm for data */
7fc557005c454f Chandrakanth Patil 2019-06-25  928  	dataArm = mega_mod64((rightmostParityArm + 1 + logArm), arms);
7fc557005c454f Chandrakanth Patil 2019-06-25  929  
7fc557005c454f Chandrakanth Patil 2019-06-25  930  	if (raid->spanDepth == 1) {
7fc557005c454f Chandrakanth Patil 2019-06-25  931  		span = 0;
7fc557005c454f Chandrakanth Patil 2019-06-25  932  	} else {
7fc557005c454f Chandrakanth Patil 2019-06-25  933  		span = (u8)MR_GetSpanBlock(ld, rowNum, pdBlock, map);
7fc557005c454f Chandrakanth Patil 2019-06-25  934  		if (span == SPAN_INVALID)
7fc557005c454f Chandrakanth Patil 2019-06-25  935  			return;
7fc557005c454f Chandrakanth Patil 2019-06-25  936  	}
7fc557005c454f Chandrakanth Patil 2019-06-25  937  
7fc557005c454f Chandrakanth Patil 2019-06-25  938  	if (raid->level == 6) {
7fc557005c454f Chandrakanth Patil 2019-06-25  939  		/* P Parity arm, note this can go negative adjust if negative */
7fc557005c454f Chandrakanth Patil 2019-06-25  940  		PParityArm = (arms - 2) - mega_mod64(rowNum, arms);
7fc557005c454f Chandrakanth Patil 2019-06-25  941  
7fc557005c454f Chandrakanth Patil 2019-06-25  942  		if (PParityArm < 0)
7fc557005c454f Chandrakanth Patil 2019-06-25  943  			PParityArm += arms;
7fc557005c454f Chandrakanth Patil 2019-06-25  944  
7fc557005c454f Chandrakanth Patil 2019-06-25  945  		/* rightmostParityArm is P-Parity for RAID 5 and Q-Parity for RAID */
7fc557005c454f Chandrakanth Patil 2019-06-25  946  		pRAID_Context->flow_specific.r56_arm_map = rightmostParityArm;
7fc557005c454f Chandrakanth Patil 2019-06-25  947  		pRAID_Context->flow_specific.r56_arm_map |=
7fc557005c454f Chandrakanth Patil 2019-06-25  948  				    (u16)(PParityArm << RAID_CTX_R56_P_ARM_SHIFT);
7fc557005c454f Chandrakanth Patil 2019-06-25  949  	} else {
7fc557005c454f Chandrakanth Patil 2019-06-25  950  		pRAID_Context->flow_specific.r56_arm_map |=
7fc557005c454f Chandrakanth Patil 2019-06-25 @951  				    (u16)(rightmostParityArm << RAID_CTX_R56_P_ARM_SHIFT);
7fc557005c454f Chandrakanth Patil 2019-06-25  952  	}
7fc557005c454f Chandrakanth Patil 2019-06-25  953  
7fc557005c454f Chandrakanth Patil 2019-06-25  954  	pRAID_Context->reg_lock_row_lba = cpu_to_le64(rowNum);
7fc557005c454f Chandrakanth Patil 2019-06-25  955  	pRAID_Context->flow_specific.r56_arm_map |=
7fc557005c454f Chandrakanth Patil 2019-06-25  956  				   (u16)(logArm << RAID_CTX_R56_LOG_ARM_SHIFT);
7fc557005c454f Chandrakanth Patil 2019-06-25  957  	cpu_to_le16s(&pRAID_Context->flow_specific.r56_arm_map);
7fc557005c454f Chandrakanth Patil 2019-06-25  958  	pRAID_Context->span_arm = (span << RAID_CTX_SPANARM_SPAN_SHIFT) | dataArm;
7fc557005c454f Chandrakanth Patil 2019-06-25  959  	pRAID_Context->raid_flags = (MR_RAID_FLAGS_IO_SUB_TYPE_R56_DIV_OFFLOAD <<
7fc557005c454f Chandrakanth Patil 2019-06-25  960  				    MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT);
7fc557005c454f Chandrakanth Patil 2019-06-25  961  
7fc557005c454f Chandrakanth Patil 2019-06-25  962  	return;
7fc557005c454f Chandrakanth Patil 2019-06-25  963  }
7fc557005c454f Chandrakanth Patil 2019-06-25  964  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36323 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-08-21 19:14 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-11 13:16 [PATCH] [SCSI] megaraid_sas: Fix possible divide-by-zero bugs in megaraid_sas_fp.c Tuo Li
2021-08-11 13:58 ` James Bottomley
2021-08-21 19:14 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.