[bug report] block: introduce new block status code type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Christoph Hellwig,

The patch 2a842acab109: "block: introduce new block status code type"
from Jun 3, 2017, leads to the following static checker warning:

	fs/exofs/inode.c:1333 exofs_new_inode()
	error: passing non negative 255 to ERR_PTR

drivers/scsi/osd/osd_initiator.c
  1909  analyze:
  1910          if (!osi->key) {
  1911                  /* scsi sense is Empty, the request was never issued to target
  1912                   * linux return code might tell us what happened.
  1913                   */
  1914                  if (or->async_error == BLK_STS_RESOURCE)
  1915                          osi->osd_err_pri = OSD_ERR_PRI_RESOURCE;
  1916                  else
  1917                          osi->osd_err_pri = OSD_ERR_PRI_UNREACHABLE;
  1918                  ret = or->async_error;
                        ^^^^^^^^^^^^^^^^^^^^^
The problem is that we're mixing the new block codes and normal kernel
error codes.  It's disapointing that Sparse doesn't seem to complain
about this assignment.  Anyway, we propagate the error code back and
eventually pass it through ERR_PTR() and IS_ERR() and then dereference
it.

  1919          } else if (osi->key <= scsi_sk_recovered_error) {
  1920                  osi->osd_err_pri = 0;
  1921                  ret = 0;
  1922          } else if (osi->additional_code == scsi_invalid_field_in_cdb) {
  1923                  if (osi->cdb_field_offset == OSD_CFO_STARTING_BYTE) {
  1924                          osi->osd_err_pri = OSD_ERR_PRI_CLEAR_PAGES;
  1925                          ret = -EFAULT; /* caller should recover from this */
  1926                  } else if (osi->cdb_field_offset == OSD_CFO_OBJECT_ID) {
  1927                          osi->osd_err_pri = OSD_ERR_PRI_NOT_FOUND;
  1928                          ret = -ENOENT;
  1929                  } else if (osi->cdb_field_offset == OSD_CFO_PERMISSIONS) {
  1930                          osi->osd_err_pri = OSD_ERR_PRI_NO_ACCESS;
  1931                          ret = -EACCES;
  1932                  } else {
  1933                          osi->osd_err_pri = OSD_ERR_PRI_BAD_CRED;
  1934                          ret = -EINVAL;
  1935                  }
  1936          } else if (osi->additional_code == osd_quota_error) {
  1937                  osi->osd_err_pri = OSD_ERR_PRI_NO_SPACE;
  1938                  ret = -ENOSPC;
  1939          } else if (_is_osd_security_code(osi->additional_code)) {
  1940                  osi->osd_err_pri = OSD_ERR_PRI_BAD_CRED;
  1941                  ret = -EINVAL;
  1942          } else {

regards,
dan carpenter



[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux