All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.