Hello Sakthivel K,

This is a semi-automatic email about new static checker warnings.

The patch 1cde970c1025: "[SCSI] pm80xx: NCQ error handling changes"
from Mar 19, 2013, leads to the following Smatch complaint:

drivers/scsi/pm8001/pm8001_hwi.c:4393 pm8001_chip_sata_req()
         warn: variable dereferenced before check 'pm8001_ha_dev' (see line 
4362)

drivers/scsi/pm8001/pm8001_hwi.c
  4361          sata_cmd.tag = cpu_to_le32(tag);
  4362          sata_cmd.device_id = cpu_to_le32(pm8001_ha_dev->device_id);
                                                 ^^^^^^^^^^^^^
Old dereference.

  4363          sata_cmd.data_len = cpu_to_le32(task->total_xfer_len);
  4364          sata_cmd.ncqtag_atap_dir_m =
  4365                  cpu_to_le32(((ncg_tag & 0xff)<<16)|((ATAP & 0x3f) << 
10) | dir);
  4366          sata_cmd.sata_fis = task->ata_task.fis;
  4367          if (likely(!task->ata_task.device_control_reg_update))
  4368                  sata_cmd.sata_fis.flags |= 0x80;/* C=1: update ATA cmd 
reg */
  4369          sata_cmd.sata_fis.flags &= 0xF0;/* PM_PORT field shall be 0 */
  4370          /* fill in PRD (scatter/gather) table, if any */
  4371          if (task->num_scatter > 1) {
  4372                  pm8001_chip_make_sg(task->scatter, ccb->n_elem, 
ccb->buf_prd);
  4373                  phys_addr = ccb->ccb_dma_handle +
  4374                                  offsetof(struct pm8001_ccb_info, 
buf_prd[0]);
  4375                  sata_cmd.addr_low = lower_32_bits(phys_addr);
  4376                  sata_cmd.addr_high = upper_32_bits(phys_addr);
  4377                  sata_cmd.esgl = cpu_to_le32(1 << 31);
  4378          } else if (task->num_scatter == 1) {
  4379                  u64 dma_addr = sg_dma_address(task->scatter);
  4380                  sata_cmd.addr_low = lower_32_bits(dma_addr);
  4381                  sata_cmd.addr_high = upper_32_bits(dma_addr);
  4382                  sata_cmd.len = cpu_to_le32(task->total_xfer_len);
  4383                  sata_cmd.esgl = 0;
  4384          } else if (task->num_scatter == 0) {
  4385                  sata_cmd.addr_low = 0;
  4386                  sata_cmd.addr_high = 0;
  4387                  sata_cmd.len = cpu_to_le32(task->total_xfer_len);
  4388                  sata_cmd.esgl = 0;
  4389          }
  4390  
  4391          /* Check for read log for failed drive and return */
  4392          if (sata_cmd.sata_fis.command == 0x2f) {
  4393                  if (pm8001_ha_dev && ((pm8001_ha_dev->id & 
NCQ_READ_LOG_FLAG) ||
                            ^^^^^^^^^^^^^
New check.  Probably this check is unneeded and can be removed.

  4394                          (pm8001_ha_dev->id & NCQ_ABORT_ALL_FLAG) ||
  4395                          (pm8001_ha_dev->id & NCQ_2ND_RLE_FLAG))) {

regards,
dan carpenter
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to