fs/file.c:866:13: sparse: sparse: incorrect type in argument 1 (different address spaces)

From: kernel test robot
Date: Thu Nov 02 2023 - 19:58:36 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 4652b8e4f3ffa48c706ec334f048c217a7d9750d
commit: 0ede61d8589cc2d93aa78230d74ac58b5b8d0244 file: convert to SLAB_TYPESAFE_BY_RCU
date: 2 weeks ago
config: i386-randconfig-061-20231102 (https://download.01.org/0day-ci/archive/20231103/202311030740.46qJJF34-lkp@xxxxxxxxx/config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231103/202311030740.46qJJF34-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311030740.46qJJF34-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
fs/file.c:379:17: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file **old_fds @@ got struct file [noderef] __rcu **fd @@
fs/file.c:379:17: sparse: expected struct file **old_fds
fs/file.c:379:17: sparse: got struct file [noderef] __rcu **fd
fs/file.c:380:17: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file **new_fds @@ got struct file [noderef] __rcu **fd @@
fs/file.c:380:17: sparse: expected struct file **new_fds
fs/file.c:380:17: sparse: got struct file [noderef] __rcu **fd
fs/file.c:395:17: sparse: sparse: incompatible types in comparison expression (different address spaces):
fs/file.c:395:17: sparse: struct file [noderef] __rcu *
fs/file.c:395:17: sparse: struct file *
fs/file.c:430:54: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct file *file @@ got struct file [noderef] __rcu *[assigned] __ret @@
fs/file.c:470:28: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct fdtable [noderef] __rcu *fdt @@ got struct fdtable * @@
fs/file.c:646:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file *file @@ got struct file [noderef] __rcu * @@
fs/file.c:841:30: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file *file @@ got struct file [noderef] __rcu * @@
fs/file.c:862:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file [noderef] __rcu *file @@ got struct file * @@
>> fs/file.c:866:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct atomic_t [usertype] *v @@ got struct atomic_t [noderef] __rcu * @@
fs/file.c:869:23: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file [noderef] __rcu *file_reloaded @@ got struct file * @@
fs/file.c:892:24: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected struct file * @@ got struct file [noderef] __rcu *file_reloaded @@
fs/file.c:894:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct file * @@ got struct file [noderef] __rcu *file @@
fs/file.c:915:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file [noderef] __rcu *file @@ got struct file * @@
fs/file.c:922:24: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected struct file * @@ got struct file [noderef] __rcu *file @@
fs/file.c:1212:16: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file *tofree @@ got struct file [noderef] __rcu * @@

vim +866 fs/file.c

855
856 static struct file *__get_file_rcu(struct file __rcu **f)
857 {
858 struct file __rcu *file;
859 struct file __rcu *file_reloaded;
860 struct file __rcu *file_reloaded_cmp;
861
862 file = rcu_dereference_raw(*f);
863 if (!file)
864 return NULL;
865
> 866 if (unlikely(!atomic_long_inc_not_zero(&file->f_count)))
867 return ERR_PTR(-EAGAIN);
868
869 file_reloaded = rcu_dereference_raw(*f);
870
871 /*
872 * Ensure that all accesses have a dependency on the load from
873 * rcu_dereference_raw() above so we get correct ordering
874 * between reuse/allocation and the pointer check below.
875 */
876 file_reloaded_cmp = file_reloaded;
877 OPTIMIZER_HIDE_VAR(file_reloaded_cmp);
878
879 /*
880 * atomic_long_inc_not_zero() above provided a full memory
881 * barrier when we acquired a reference.
882 *
883 * This is paired with the write barrier from assigning to the
884 * __rcu protected file pointer so that if that pointer still
885 * matches the current file, we know we have successfully
886 * acquired a reference to the right file.
887 *
888 * If the pointers don't match the file has been reallocated by
889 * SLAB_TYPESAFE_BY_RCU.
890 */
891 if (file == file_reloaded_cmp)
892 return file_reloaded;
893
894 fput(file);
895 return ERR_PTR(-EAGAIN);
896 }
897

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki