All of lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] lightnvm: add ioctls for vector I/Os
@ 2017-01-21  4:56 Dan Carpenter
  2017-01-21 14:57 ` Matias Bjørling
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2017-01-21  4:56 UTC (permalink / raw)


Hello Matias Bj?rling,

The patch 3c6ff84da779: "lightnvm: add ioctls for vector I/Os" from
Nov 16, 2016, leads to the following static checker warning:

	drivers/nvme/host/lightnvm.c:695 nvme_nvm_submit_user_cmd()
	error: uninitialized symbol 'metadata_dma'.

	drivers/nvme/host/lightnvm.c:704 nvme_nvm_submit_user_cmd()
	error: uninitialized symbol 'ppa_dma'.

drivers/nvme/host/lightnvm.c
   627          if (ppa_buf && ppa_len) {
                    ^^^^^^^^^^^^^^^^^^
Here we assume that we can have a non-NULL buf and a zero len or the
reverse where len is non-zero but ppa_buf is NULL.

   628                  ppa_list = dma_pool_alloc(dev->dma_pool, GFP_KERNEL, &ppa_dma);
                                                                              ^^^^^^^
   629                  if (!ppa_list) {
   630                          ret = -ENOMEM;
   631                          goto err_rq;
   632                  }
   633                  if (copy_from_user(ppa_list, (void __user *)ppa_buf,
   634                                                  sizeof(u64) * (ppa_len + 1))) {
   635                          ret = -EFAULT;
   636                          goto err_ppa;
   637                  }
   638                  vcmd->ph_rw.spba = cpu_to_le64(ppa_dma);
   639          } else {
   640                  vcmd->ph_rw.spba = cpu_to_le64((uintptr_t)ppa_buf);
   641          }
   642  
   643          if (ubuf && bufflen) {
   644                  ret = blk_rq_map_user(q, rq, NULL, ubuf, bufflen, GFP_KERNEL);
   645                  if (ret)
   646                          goto err_ppa;
   647                  bio = rq->bio;
   648  
   649                  if (meta_buf && meta_len) {
                            ^^^^^^^^^^^^^^^^^^^^
Same assumptions, that the one doesn't imply the other.

   650                          metadata = dma_pool_alloc(dev->dma_pool, GFP_KERNEL,
   651                                                                  &metadata_dma);
                                                                        ^^^^^^^^^^^^^
   652                          if (!metadata) {
   653                                  ret = -ENOMEM;
   654                                  goto err_map;
   655                          }
   656  
   657                          if (write) {
   658                                  if (copy_from_user(metadata,
   659                                                  (void __user *)meta_buf,
   660                                                  meta_len)) {
   661                                          ret = -EFAULT;
   662                                          goto err_meta;
   663                                  }
   664                          }
   665                          vcmd->ph_rw.metadata = cpu_to_le64(metadata_dma);
   666                  }
   667  
   668                  if (!disk)
   669                          goto submit;
   670  
   671                  bio->bi_bdev = bdget_disk(disk, 0);
   672                  if (!bio->bi_bdev) {
   673                          ret = -ENODEV;
   674                          goto err_meta;
   675                  }
   676          }
   677  
   678  submit:
   679          blk_execute_rq_nowait(q, NULL, rq, 0, nvme_nvm_end_user_vio);
   680  
   681          wait_for_completion_io(&wait);
   682  
   683          ret = nvme_error_status(rq->errors);
   684          if (result)
   685                  *result = rq->errors & 0x7ff;
   686          if (status)
   687                  *status = le64_to_cpu(nvme_req(rq)->result.u64);
   688  
   689          if (metadata && !ret && !write) {
   690                  if (copy_to_user(meta_buf, (void *)metadata, meta_len))
   691                          ret = -EFAULT;
   692          }
   693  err_meta:
   694          if (meta_len)
   695                  dma_pool_free(dev->dma_pool, metadata, metadata_dma);
                                                               ^^^^^^^^^^^^

But here we assume that just testing meta_len is sufficient, that len
implies buf is non-NULL.  Could we clean these up so they're consistent
with each other?

   696  err_map:
   697          if (bio) {
   698                  if (disk && bio->bi_bdev)
   699                          bdput(bio->bi_bdev);
   700                  blk_rq_unmap_user(bio);
   701          }
   702  err_ppa:
   703          if (ppa_len)
   704                  dma_pool_free(dev->dma_pool, ppa_list, ppa_dma);
                                                               ^^^^^^^
Same.

   705  err_rq:
   706          blk_mq_free_request(rq);
   707  err_cmd:
   708          return ret;
   709  }


regards,
dan carpenter

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

* [bug report] lightnvm: add ioctls for vector I/Os
  2017-01-21  4:56 [bug report] lightnvm: add ioctls for vector I/Os Dan Carpenter
@ 2017-01-21 14:57 ` Matias Bjørling
  0 siblings, 0 replies; 2+ messages in thread
From: Matias Bjørling @ 2017-01-21 14:57 UTC (permalink / raw)


On 01/21/2017 05:56 AM, Dan Carpenter wrote:
> Hello Matias Bj?rling,
> 
> The patch 3c6ff84da779: "lightnvm: add ioctls for vector I/Os" from
> Nov 16, 2016, leads to the following static checker warning:
> 
> 	drivers/nvme/host/lightnvm.c:695 nvme_nvm_submit_user_cmd()
> 	error: uninitialized symbol 'metadata_dma'.
> 
> 	drivers/nvme/host/lightnvm.c:704 nvme_nvm_submit_user_cmd()
> 	error: uninitialized symbol 'ppa_dma'.
> 
> drivers/nvme/host/lightnvm.c
>    627          if (ppa_buf && ppa_len) {
>                     ^^^^^^^^^^^^^^^^^^
> Here we assume that we can have a non-NULL buf and a zero len or the
> reverse where len is non-zero but ppa_buf is NULL.
> 
>    628                  ppa_list = dma_pool_alloc(dev->dma_pool, GFP_KERNEL, &ppa_dma);
>                                                                               ^^^^^^^
>    629                  if (!ppa_list) {
>    630                          ret = -ENOMEM;
>    631                          goto err_rq;
>    632                  }
>    633                  if (copy_from_user(ppa_list, (void __user *)ppa_buf,
>    634                                                  sizeof(u64) * (ppa_len + 1))) {
>    635                          ret = -EFAULT;
>    636                          goto err_ppa;
>    637                  }
>    638                  vcmd->ph_rw.spba = cpu_to_le64(ppa_dma);
>    639          } else {
>    640                  vcmd->ph_rw.spba = cpu_to_le64((uintptr_t)ppa_buf);
>    641          }
>    642  
>    643          if (ubuf && bufflen) {
>    644                  ret = blk_rq_map_user(q, rq, NULL, ubuf, bufflen, GFP_KERNEL);
>    645                  if (ret)
>    646                          goto err_ppa;
>    647                  bio = rq->bio;
>    648  
>    649                  if (meta_buf && meta_len) {
>                             ^^^^^^^^^^^^^^^^^^^^
> Same assumptions, that the one doesn't imply the other.
> 
>    650                          metadata = dma_pool_alloc(dev->dma_pool, GFP_KERNEL,
>    651                                                                  &metadata_dma);
>                                                                         ^^^^^^^^^^^^^
>    652                          if (!metadata) {
>    653                                  ret = -ENOMEM;
>    654                                  goto err_map;
>    655                          }
>    656  
>    657                          if (write) {
>    658                                  if (copy_from_user(metadata,
>    659                                                  (void __user *)meta_buf,
>    660                                                  meta_len)) {
>    661                                          ret = -EFAULT;
>    662                                          goto err_meta;
>    663                                  }
>    664                          }
>    665                          vcmd->ph_rw.metadata = cpu_to_le64(metadata_dma);
>    666                  }
>    667  
>    668                  if (!disk)
>    669                          goto submit;
>    670  
>    671                  bio->bi_bdev = bdget_disk(disk, 0);
>    672                  if (!bio->bi_bdev) {
>    673                          ret = -ENODEV;
>    674                          goto err_meta;
>    675                  }
>    676          }
>    677  
>    678  submit:
>    679          blk_execute_rq_nowait(q, NULL, rq, 0, nvme_nvm_end_user_vio);
>    680  
>    681          wait_for_completion_io(&wait);
>    682  
>    683          ret = nvme_error_status(rq->errors);
>    684          if (result)
>    685                  *result = rq->errors & 0x7ff;
>    686          if (status)
>    687                  *status = le64_to_cpu(nvme_req(rq)->result.u64);
>    688  
>    689          if (metadata && !ret && !write) {
>    690                  if (copy_to_user(meta_buf, (void *)metadata, meta_len))
>    691                          ret = -EFAULT;
>    692          }
>    693  err_meta:
>    694          if (meta_len)
>    695                  dma_pool_free(dev->dma_pool, metadata, metadata_dma);
>                                                                ^^^^^^^^^^^^
> 
> But here we assume that just testing meta_len is sufficient, that len
> implies buf is non-NULL.  Could we clean these up so they're consistent
> with each other?
> 
>    696  err_map:
>    697          if (bio) {
>    698                  if (disk && bio->bi_bdev)
>    699                          bdput(bio->bi_bdev);
>    700                  blk_rq_unmap_user(bio);
>    701          }
>    702  err_ppa:
>    703          if (ppa_len)
>    704                  dma_pool_free(dev->dma_pool, ppa_list, ppa_dma);
>                                                                ^^^^^^^
> Same.
> 
>    705  err_rq:
>    706          blk_mq_free_request(rq);
>    707  err_cmd:
>    708          return ret;
>    709  }
> 
> 
> regards,
> dan carpenter
> 

Hi Dan,

Good catch, will fix it. Thanks!

-Matias

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

end of thread, other threads:[~2017-01-21 14:57 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-21  4:56 [bug report] lightnvm: add ioctls for vector I/Os Dan Carpenter
2017-01-21 14:57 ` Matias Bjørling

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.