fs/file.c:862:14: sparse: sparse: incorrect type in assignment (different address spaces)

From: kernel test robot
Date: Sat Jan 06 2024 - 22:36:18 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 52b1853b080a082ec3749c3a9577f6c71b1d4a90
commit: 0ede61d8589cc2d93aa78230d74ac58b5b8d0244 file: convert to SLAB_TYPESAFE_BY_RCU
date: 3 months ago
config: x86_64-randconfig-123-20240106 (https://download.01.org/0day-ci/archive/20240107/202401071109.RJ9OQWsn-lkp@xxxxxxxxx/config)
compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240107/202401071109.RJ9OQWsn-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/202401071109.RJ9OQWsn-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 atomic64_t [usertype] *v @@ got struct atomic64_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 +862 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
898 /**
899 * get_file_rcu - try go get a reference to a file under rcu
900 * @f: the file to get a reference on
901 *
902 * This function tries to get a reference on @f carefully verifying that
903 * @f hasn't been reused.
904 *
905 * This function should rarely have to be used and only by users who
906 * understand the implications of SLAB_TYPESAFE_BY_RCU. Try to avoid it.
907 *
908 * Return: Returns @f with the reference count increased or NULL.
909 */
910 struct file *get_file_rcu(struct file __rcu **f)
911 {
912 for (;;) {
913 struct file __rcu *file;
914
915 file = __get_file_rcu(f);
916 if (unlikely(!file))
917 return NULL;
918
919 if (unlikely(IS_ERR(file)))
920 continue;
921
> 922 return file;
923 }
924 }
925 EXPORT_SYMBOL_GPL(get_file_rcu);
926

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