This sparse warning was introduced with patch 1.2000 (axboe).
In fs/bio.c (line 509),
if (copy_from_user(addr, (char *) p, bvec->bv_len))
should probably be
if (copy_from_user(addr, (char __user *) p, bvec->bv_len))
John
--------------------------------------------------------------
Compiler: gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Arch: i386
Summary:
New warnings = 1
Fixed warnings = 3
New warnings:
-------------
fs/bio.c:509:30: warning: incorrect type in argument 2 (different
address spaces)
fs/bio.c:509:30: expected void const [noderef] *from<asn:1>
fs/bio.c:509:30: got char *<noident>
Fixed warnings:
---------------
fs/bio.c:392:20: warning: incorrect type in argument 1 (different
address spaces)
fs/bio.c:392:20: expected void [noderef] *to<asn:1>
fs/bio.c:392:20: got char *uaddr
fs/bio.c:462:31: warning: incorrect type in argument 2 (different
address spaces)
fs/bio.c:462:31: expected void const [noderef] *from<asn:1>
fs/bio.c:462:31: got char *<noident>
kernel/sys.c:1737:34: warning: incorrect type in argument 2 (different
address spaces)
kernel/sys.c:1737:34: expected char const [noderef] *src<asn:1>
kernel/sys.c:1737:34: got char *<noident>
On Wed, Sep 29 2004, John Cherry wrote:
> This sparse warning was introduced with patch 1.2000 (axboe).
> In fs/bio.c (line 509),
>
> if (copy_from_user(addr, (char *) p, bvec->bv_len))
>
> should probably be
>
> if (copy_from_user(addr, (char __user *) p, bvec->bv_len))
It's not a new warning, just look at your own generated output:
> New warnings:
> -------------
> fs/bio.c:509:30: warning: incorrect type in argument 2 (different
> address spaces)
> fs/bio.c:509:30: expected void const [noderef] *from<asn:1>
> fs/bio.c:509:30: got char *<noident>
>
>
> Fixed warnings:
> ---------------
> fs/bio.c:462:31: warning: incorrect type in argument 2 (different
> address spaces)
> fs/bio.c:462:31: expected void const [noderef] *from<asn:1>
> fs/bio.c:462:31: got char *<noident>
The warning simply moved. This should fix it, though.
Signed-off-by: Jens Axboe <[email protected]>
===== fs/bio.c 1.67 vs edited =====
--- 1.67/fs/bio.c 2004-09-28 17:59:14 +02:00
+++ edited/fs/bio.c 2004-09-29 19:34:39 +02:00
@@ -497,7 +497,7 @@
* success
*/
if (!write_to_vm) {
- unsigned long p = uaddr;
+ char __user *p = (char __user *) uaddr;
/*
* for a write, copy in data to kernel pages
@@ -506,7 +506,7 @@
bio_for_each_segment(bvec, bio, i) {
char *addr = page_address(bvec->bv_page);
- if (copy_from_user(addr, (char *) p, bvec->bv_len))
+ if (copy_from_user(addr, p, bvec->bv_len))
goto cleanup;
p += bvec->bv_len;
}
--
Jens Axboe
On Wed, 2004-09-29 at 10:33, Jens Axboe wrote:
> On Wed, Sep 29 2004, John Cherry wrote:
> > This sparse warning was introduced with patch 1.2000 (axboe).
> > In fs/bio.c (line 509),
> >
> > if (copy_from_user(addr, (char *) p, bvec->bv_len))
> >
> > should probably be
> >
> > if (copy_from_user(addr, (char __user *) p, bvec->bv_len))
>
> It's not a new warning, just look at your own generated output:
Yes, this bug just moved. Thanks for the fix.
John
>
> > New warnings:
> > -------------
> > fs/bio.c:509:30: warning: incorrect type in argument 2 (different
> > address spaces)
> > fs/bio.c:509:30: expected void const [noderef] *from<asn:1>
> > fs/bio.c:509:30: got char *<noident>
> >
> >
> > Fixed warnings:
> > ---------------
> > fs/bio.c:462:31: warning: incorrect type in argument 2 (different
> > address spaces)
> > fs/bio.c:462:31: expected void const [noderef] *from<asn:1>
> > fs/bio.c:462:31: got char *<noident>
>
> The warning simply moved. This should fix it, though.
>
> Signed-off-by: Jens Axboe <[email protected]>
>
> ===== fs/bio.c 1.67 vs edited =====
> --- 1.67/fs/bio.c 2004-09-28 17:59:14 +02:00
> +++ edited/fs/bio.c 2004-09-29 19:34:39 +02:00
> @@ -497,7 +497,7 @@
> * success
> */
> if (!write_to_vm) {
> - unsigned long p = uaddr;
> + char __user *p = (char __user *) uaddr;
>
> /*
> * for a write, copy in data to kernel pages
> @@ -506,7 +506,7 @@
> bio_for_each_segment(bvec, bio, i) {
> char *addr = page_address(bvec->bv_page);
>
> - if (copy_from_user(addr, (char *) p, bvec->bv_len))
> + if (copy_from_user(addr, p, bvec->bv_len))
> goto cleanup;
> p += bvec->bv_len;
> }