fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types)
PATCH 30/32 fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types)
Hi Cyrill,
FYI, there are new sparse warnings show up in
tree: git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git master head: 9283194882d18e3755c4ebc0b86db9f9a4f4c81a commit: c8506285ded8009f7c1ab937fc0021c6294ba424 [30/32] procfs: Move /proc/pid/fd[info] handling code to fd.[ch]
All sparse warnings:
+ fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types)
fs/proc/fd.c:87:55: expected unsigned int [unsigned] f_mode
fs/proc/fd.c:87:55: got restricted fmode_t [usertype] f_mode
+ fs/proc/fd.c:105:54: sparse: restricted fmode_t degrades to integer fs/proc/fd.c:107:54: sparse: restricted fmode_t degrades to integer
vim +87 fs/proc/fd.c
84 rcu_read_lock();
85 file = fcheck_files(files, fd);
86 if (file) {Quoted 1 line
87 unsigned
f_mode=file->f_mode;
88
89 rcu_read_unlock();
90 put_files_struct(files);---
0-DAY kernel build testing backend Open Source Technology Centre
Fengguang Wu <[email protected]> Intel Corporation
Re: [vfs:master 30/32] fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base typ
Quoted 16 lines · Fengguang Wu
Hi Cyrill,
FYI, there are new sparse warnings show up in
tree: git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git master head: 9283194882d18e3755c4ebc0b86db9f9a4f4c81a commit: c8506285ded8009f7c1ab937fc0021c6294ba424 [30/32] procfs: Move /proc/pid/fd[info] handling code to fd.[ch]All sparse warnings:
+
fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types)
fs/proc/fd.c:87:55: expected unsigned int [unsigned]f_mode
fs/proc/fd.c:87:55: got restrictedfmode_t[usertype]f_mode
+fs/proc/fd.c:105:54: sparse: restrictedfmode_tdegrades to integerfs/proc/fd.c:107:54: sparse: restrictedfmode_tdegrades to integer
Quoted 8 lines
vim +87
fs/proc/fd.c84 rcu_read_lock(); 85 file = fcheck_files(files, fd); 86 if (file) {Quoted 1 line
87 unsigned
f_mode=file->f_mode;88 89 rcu_read_unlock(); 90 put_files_struct(files);
Sigh. Thanks a lot, Fengguang! This routine has been moved from base.c (which had this nit already). Al, could you please make it unsigned int, and push fix intou your tree?
Cyrill
Re: [vfs:master 30/32] fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base typ
In reply to Fengguang WuQuoted 26 lines · Cyrill Gorcunov
Quoted 16 lines · Fengguang Wu
Hi Cyrill,
FYI, there are new sparse warnings show up in
tree: git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git master head: 9283194882d18e3755c4ebc0b86db9f9a4f4c81a commit: c8506285ded8009f7c1ab937fc0021c6294ba424 [30/32] procfs: Move /proc/pid/fd[info] handling code to fd.[ch]All sparse warnings:
+
fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types)
fs/proc/fd.c:87:55: expected unsigned int [unsigned]f_mode
fs/proc/fd.c:87:55: got restrictedfmode_t[usertype]f_mode
+fs/proc/fd.c:105:54: sparse: restrictedfmode_tdegrades to integerfs/proc/fd.c:107:54: sparse: restrictedfmode_tdegrades to integerQuoted 8 lines
vim +87
fs/proc/fd.c84 rcu_read_lock(); 85 file = fcheck_files(files, fd); 86 if (file) {Quoted 1 line
87 unsigned
f_mode=file->f_mode;88 89 rcu_read_unlock(); 90 put_files_struct(files);
Quoted 3 lines
Sigh. Thanks a lot, Fengguang! This routine has been moved from
base.c(which had this nit already). Al, could you please make it unsigned int, and push fix intou your tree?
This should fix the problem (if needed, since the next commit in series should drop this declaration). Also this patch changes type for i_mode, which I think a good idea.
---
From: Cyrill Gorcunov <[email protected]>
Subject: fs, proc: Fix sparse warning in tid_fd_revalidate
The following warnings have been caught
| + fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types) | fs/proc/fd.c:87:55: expected unsigned int [unsigned] f_mode | fs/proc/fd.c:87:55: got restricted fmode_t [usertype] f_mode | + fs/proc/fd.c:105:54: sparse: restricted fmode_t degrades to integer | fs/proc/fd.c:107:54: sparse: restricted fmode_t degrades to integer
make f_mode and i_mode declared with proper types.
--- fs/proc/fd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Index: linux-2.6.git/fs/proc/fd.c =================================--- linux-2.6.git.orig/fs/proc/fd.c +++ linux-2.6.git/fs/proc/fd.c
@@ -84,7 +84,7 @@ static int tid_fd_revalidate(struct dent
rcu_read_lock();
file = fcheck_files(files, fd); if (file) {
- unsigned f_mode = file->f_mode;
+ unsigned int f_mode = file->f_mode;
rcu_read_unlock(); put_files_struct(files);
@@ -101,7 +101,7 @@ static int tid_fd_revalidate(struct dent
}
if (S_ISLNK(inode->i_mode)) {
- unsigned i_mode = S_IFLNK;
+ umode_t i_mode = S_IFLNK;
if (f_mode & FMODE_READ)
i_mode |= S_IRUSR | S_IXUSR;
if (f_mode & FMODE_WRITE)
Re: [vfs:master 30/32] fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base typ
In reply to Fengguang WuReview
Quoted 2 lines · Cyrill Gorcunov
(quoted diff) +1
-1- unsigned f_mode = file->f_mode; + unsigned int f_mode = file->f_mode;
This changes nothing; unsigned and unsigned int are exactly the same. fmode_t isn't, from sparse POV, and that's what you want to use here.
Re: [vfs:master 30/32] fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base typ
In reply to Fengguang WuQuoted 6 lines · Al Viro
Review
Quoted 2 lines · Cyrill Gorcunov
(quoted diff) +1
-1- unsigned f_mode = file->f_mode; + unsigned int f_mode = file->f_mode;This changes nothing; unsigned and unsigned int are exactly the same.
fmode_tisn't, from sparse POV, and that's what you want to use here.
True. I get messed with this warning. Please see updated below.
---
From: Cyrill Gorcunov <[email protected]>
Subject: fs, proc: Fix sparse warning in tid_fd_revalidate
The following warnings have been caught
| + fs/proc/fd.c:87:55: sparse: incorrect type in initializer (different base types) | fs/proc/fd.c:87:55: expected unsigned int [unsigned] f_mode | fs/proc/fd.c:87:55: got restricted fmode_t [usertype] f_mode | + fs/proc/fd.c:105:54: sparse: restricted fmode_t degrades to integer | fs/proc/fd.c:107:54: sparse: restricted fmode_t degrades to integer
make f_mode and i_mode declared with proper types.
--- fs/proc/fd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Index: linux-2.6.git/fs/proc/fd.c =================================--- linux-2.6.git.orig/fs/proc/fd.c +++ linux-2.6.git/fs/proc/fd.c
@@ -84,7 +84,7 @@ static int tid_fd_revalidate(struct dent
rcu_read_lock();
file = fcheck_files(files, fd); if (file) {
- unsigned f_mode = file->f_mode;
+ fmode_t f_mode = file->f_mode;
rcu_read_unlock(); put_files_struct(files);
@@ -101,7 +101,7 @@ static int tid_fd_revalidate(struct dent
}
if (S_ISLNK(inode->i_mode)) {
- unsigned i_mode = S_IFLNK;
+ umode_t i_mode = S_IFLNK;
if (f_mode & FMODE_READ)
i_mode |= S_IRUSR | S_IXUSR;
if (f_mode & FMODE_WRITE)