* [zen-kernel-zen-kernel:5.8/zen-sauce 2/26] drivers/scsi/vhba/vhba.c:559:22: sparse: sparse: cast removes address space '__user' of expression
@ 2020-08-07 10:44 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2020-08-07 10:44 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 9025 bytes --]
tree: https://github.com/zen-kernel/zen-kernel 5.8/zen-sauce
head: 4ae00f4cbefe933616f33bf79935393ec49dbfa3
commit: 5664a4e6b6af231e79f53494742a7d7a08ba72d7 [2/26] ZEN: Add VHBA driver
config: h8300-randconfig-s032-20200807 (attached as .config)
compiler: h8300-linux-gcc (GCC) 9.3.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.2-118-ge1578773-dirty
git checkout 5664a4e6b6af231e79f53494742a7d7a08ba72d7
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=h8300
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
drivers/scsi/vhba/vhba.c:483:1: sparse: sparse: symbol 'vhba_queuecommand' was not declared. Should it be static?
>> drivers/scsi/vhba/vhba.c:559:22: sparse: sparse: cast removes address space '__user' of expression
>> drivers/scsi/vhba/vhba.c:573:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *to @@ got unsigned char *[assigned] uaddr @@
>> drivers/scsi/vhba/vhba.c:573:34: sparse: expected void [noderef] __user *to
drivers/scsi/vhba/vhba.c:573:34: sparse: got unsigned char *[assigned] uaddr
drivers/scsi/vhba/vhba.c:629:22: sparse: sparse: cast removes address space '__user' of expression
>> drivers/scsi/vhba/vhba.c:639:48: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void const [noderef] __user *from @@ got unsigned char *[assigned] uaddr @@
>> drivers/scsi/vhba/vhba.c:639:48: sparse: expected void const [noderef] __user *from
drivers/scsi/vhba/vhba.c:639:48: sparse: got unsigned char *[assigned] uaddr
>> drivers/scsi/vhba/vhba.c:845:35: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *to @@ got void * @@
drivers/scsi/vhba/vhba.c:845:35: sparse: expected void [noderef] __user *to
drivers/scsi/vhba/vhba.c:845:35: sparse: got void *
drivers/scsi/vhba/vhba.c:856:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *to @@ got void * @@
drivers/scsi/vhba/vhba.c:856:31: sparse: expected void [noderef] __user *to
drivers/scsi/vhba/vhba.c:856:31: sparse: got void *
drivers/scsi/vhba/vhba.c:963:13: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __poll_t ( *poll )( ... ) @@ got unsigned int ( * )( ... ) @@
drivers/scsi/vhba/vhba.c:963:13: sparse: expected restricted __poll_t ( *poll )( ... )
drivers/scsi/vhba/vhba.c:963:13: sparse: got unsigned int ( * )( ... )
vim +/__user +559 drivers/scsi/vhba/vhba.c
521
522 static ssize_t do_request (struct vhba_device *vdev, unsigned long cmd_serial_number, struct scsi_cmnd *cmd, char __user *buf, size_t buf_len)
523 {
524 struct vhba_request vreq;
525 ssize_t ret;
526
527 scmd_dbg(cmd, "request %lu (%p), cdb 0x%x, bufflen %d, sg count %d\n",
528 cmd_serial_number, cmd, cmd->cmnd[0], scsi_bufflen(cmd), scsi_sg_count(cmd));
529
530 ret = sizeof(vreq);
531 if (DATA_TO_DEVICE(cmd->sc_data_direction)) {
532 ret += scsi_bufflen(cmd);
533 }
534
535 if (ret > buf_len) {
536 scmd_dbg(cmd, "buffer too small (%zd < %zd) for a request\n", buf_len, ret);
537 return -EIO;
538 }
539
540 vreq.tag = cmd_serial_number;
541 vreq.lun = cmd->device->lun;
542 memcpy(vreq.cdb, cmd->cmnd, MAX_COMMAND_SIZE);
543 vreq.cdb_len = cmd->cmd_len;
544 vreq.data_len = scsi_bufflen(cmd);
545
546 if (copy_to_user(buf, &vreq, sizeof(vreq))) {
547 return -EFAULT;
548 }
549
550 if (DATA_TO_DEVICE(cmd->sc_data_direction) && vreq.data_len) {
551 buf += sizeof(vreq);
552
553 if (scsi_sg_count(cmd)) {
554 unsigned char *kaddr, *uaddr;
555 struct scatterlist *sglist = scsi_sglist(cmd);
556 struct scatterlist *sg;
557 int i;
558
> 559 uaddr = (unsigned char *) buf;
560
561 for_each_sg(sglist, sg, scsi_sg_count(cmd), i) {
562 size_t len = sg->length;
563
564 if (len > vdev->kbuf_size) {
565 scmd_dbg(cmd, "segment size (%zu) exceeds kbuf size (%zu)!", len, vdev->kbuf_size);
566 len = vdev->kbuf_size;
567 }
568
569 kaddr = kmap_atomic(sg_page(sg));
570 memcpy(vdev->kbuf, kaddr + sg->offset, len);
571 kunmap_atomic(kaddr);
572
> 573 if (copy_to_user(uaddr, vdev->kbuf, len)) {
574 return -EFAULT;
575 }
576 uaddr += len;
577 }
578 } else {
579 if (copy_to_user(buf, scsi_sglist(cmd), vreq.data_len)) {
580 return -EFAULT;
581 }
582 }
583 }
584
585 return ret;
586 }
587
588 static ssize_t do_response (struct vhba_device *vdev, unsigned long cmd_serial_number, struct scsi_cmnd *cmd, const char __user *buf, size_t buf_len, struct vhba_response *res)
589 {
590 ssize_t ret = 0;
591
592 scmd_dbg(cmd, "response %lu (%p), status %x, data len %d, sg count %d\n",
593 cmd_serial_number, cmd, res->status, res->data_len, scsi_sg_count(cmd));
594
595 if (res->status) {
596 unsigned char sense_stack[SCSI_SENSE_BUFFERSIZE];
597
598 if (res->data_len > SCSI_SENSE_BUFFERSIZE) {
599 scmd_dbg(cmd, "truncate sense (%d < %d)", SCSI_SENSE_BUFFERSIZE, res->data_len);
600 res->data_len = SCSI_SENSE_BUFFERSIZE;
601 }
602
603 /* Copy via temporary buffer on stack in order to avoid problems
604 with PAX on grsecurity-enabled kernels */
605 if (copy_from_user(sense_stack, buf, res->data_len)) {
606 return -EFAULT;
607 }
608 memcpy(cmd->sense_buffer, sense_stack, res->data_len);
609
610 cmd->result = res->status;
611
612 ret += res->data_len;
613 } else if (DATA_FROM_DEVICE(cmd->sc_data_direction) && scsi_bufflen(cmd)) {
614 size_t to_read;
615
616 if (res->data_len > scsi_bufflen(cmd)) {
617 scmd_dbg(cmd, "truncate data (%d < %d)\n", scsi_bufflen(cmd), res->data_len);
618 res->data_len = scsi_bufflen(cmd);
619 }
620
621 to_read = res->data_len;
622
623 if (scsi_sg_count(cmd)) {
624 unsigned char *kaddr, *uaddr;
625 struct scatterlist *sglist = scsi_sglist(cmd);
626 struct scatterlist *sg;
627 int i;
628
629 uaddr = (unsigned char *)buf;
630
631 for_each_sg(sglist, sg, scsi_sg_count(cmd), i) {
632 size_t len = (sg->length < to_read) ? sg->length : to_read;
633
634 if (len > vdev->kbuf_size) {
635 scmd_dbg(cmd, "segment size (%zu) exceeds kbuf size (%zu)!", len, vdev->kbuf_size);
636 len = vdev->kbuf_size;
637 }
638
> 639 if (copy_from_user(vdev->kbuf, uaddr, len)) {
640 return -EFAULT;
641 }
642 uaddr += len;
643
644 kaddr = kmap_atomic(sg_page(sg));
645 memcpy(kaddr + sg->offset, vdev->kbuf, len);
646 kunmap_atomic(kaddr);
647
648 to_read -= len;
649 if (to_read == 0) {
650 break;
651 }
652 }
653 } else {
654 if (copy_from_user(scsi_sglist(cmd), buf, res->data_len)) {
655 return -EFAULT;
656 }
657
658 to_read -= res->data_len;
659 }
660
661 scsi_set_resid(cmd, to_read);
662
663 ret += res->data_len - to_read;
664 }
665
666 return ret;
667 }
668
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 23518 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-08-07 10:44 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-07 10:44 [zen-kernel-zen-kernel:5.8/zen-sauce 2/26] drivers/scsi/vhba/vhba.c:559:22: sparse: sparse: cast removes address space '__user' of expression 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.