Re: [cel:nfsd-testing 110/222] fs/nfsd/nfs4xdr.c:4200:18: sparse: sparse: incorrect type in assignment (different base types)

"Chuck Lever" <[email protected]> Fri, 31 Jul 2026 10:35:39 -0400
Newsgroups dev.linux.lists.oe-kbuild-all
Message-ID <[email protected]>

On Thu, Jul 30, 2026, at 4:37 PM, kernel test robot wrote:
> tree:   https://git.kernel.org/pub/scm/linux/kernel/git/cel/linux 
> nfsd-testing
> head:   67be65963a6470b667125cc648b56161ed3dfdce
> commit: 4b64b811f368bcd98a5a11f7079f863db3a2e1c5 [110/222] nfsd: add 
> notification handlers for dir events
> config: m68k-randconfig-r122-20260730 
> (https://download.01.org/0day-ci/archive/20260731/[email protected]/config)
> compiler: m68k-linux-gcc (GCC) 13.4.0
> sparse: v0.6.5-rc1
> reproduce (this is a W=1 build): 
> (https://download.01.org/0day-ci/archive/20260731/[email protected]/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 <[email protected]>
> | Closes: 
> https://lore.kernel.org/oe-kbuild-all/[email protected]/
>
> sparse warnings: (new ones prefixed by >>)
>>> fs/nfsd/nfs4xdr.c:4200:18: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] *attrmask @@     got restricted __be32 [usertype] * @@
>    fs/nfsd/nfs4xdr.c:4200:18: sparse:     expected unsigned int 
> [usertype] *attrmask
>    fs/nfsd/nfs4xdr.c:4200:18: sparse:     got restricted __be32 
> [usertype] *
>
> vim +4200 fs/nfsd/nfs4xdr.c
>
>   4191	
>   4192	static bool
>   4193	nfsd4_setup_notify_entry4(struct notify_entry4 *ne, struct 
> xdr_stream *xdr,
>   4194				  struct dentry *dentry, struct nfs4_delegation *dp,
>   4195				  struct nfsd_file *nf, char *name, u32 namelen)
>   4196	{
>   4197		uint32_t *attrmask;
>   4198	
>   4199		/* Reserve space for attrmask */
>> 4200		attrmask = xdr_reserve_space(xdr, 3 * sizeof(uint32_t));
>   4201		if (!attrmask)
>   4202			return false;
>   4203	
>   4204		ne->ne_file.data = name;
>   4205		ne->ne_file.len = namelen;
>   4206		ne->ne_attrs.attrmask.element = attrmask;
>   4207	
>   4208		attrmask[0] = 0;
>   4209		attrmask[1] = 0;
>   4210		attrmask[2] = 0;
>   4211		ne->ne_attrs.attr_vals.data = NULL;
>   4212		ne->ne_attrs.attr_vals.len = 0;
>   4213		ne->ne_attrs.attrmask.count = 1;
>   4214		return true;
>   4215	}
>   4216	
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki

Jeff, I actually can't tell how to fix this.

The obvious problem is that xdr_reserve_space() returns a
__be32 * not a uint32_t * ... then the code sets the values
of the attribute mask, in an XDR buffer, to host-endian
zeroes instead of network-endian zeroes. (equivalent but
not semantically the same). If the attrmask.count is 1,
why set three bitmask4 entries? Or is this reserving
buffer space for more than just the bitmask4 ?


-- 
Chuck Lever