tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: c4ef528bd006febc7de444d9775b28706d924f78 commit: aa30eccb24e5a66a2cf7f7b34a69c3651d12cc6a [5968/6619] fs/ntfs3: Fallocate (FALLOC_FL_INSERT_RANGE) implementation config: i386-randconfig-s002-20220627 (https://download.01.org/0day-ci/archive/20220629/202206292052.LsFui3zO-lkp@xxxxxxxxx/config) compiler: gcc-11 (Debian 11.3.0-3) 11.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=aa30eccb24e5a66a2cf7f7b34a69c3651d12cc6a git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git fetch --no-tags linux-next master git checkout aa30eccb24e5a66a2cf7f7b34a69c3651d12cc6a # save the config file mkdir build_dir && cp config build_dir/.config make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash fs/ntfs3/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@xxxxxxxxx> sparse warnings: (new ones prefixed by >>) >> fs/ntfs3/attrib.c:2145:38: sparse: sparse: restricted __le16 degrades to integer >> fs/ntfs3/attrib.c:2229:34: sparse: sparse: cast to restricted __le64 >> fs/ntfs3/attrib.c:2229:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le64 [usertype] data_size @@ got unsigned long long [usertype] @@ fs/ntfs3/attrib.c:2229:32: sparse: expected restricted __le64 [usertype] data_size fs/ntfs3/attrib.c:2229:32: sparse: got unsigned long long [usertype] fs/ntfs3/attrib.c:2230:35: sparse: sparse: cast to restricted __le64 >> fs/ntfs3/attrib.c:2230:33: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le64 [usertype] alloc_size @@ got unsigned long long [usertype] @@ fs/ntfs3/attrib.c:2230:33: sparse: expected restricted __le64 [usertype] alloc_size fs/ntfs3/attrib.c:2230:33: sparse: got unsigned long long [usertype] vim +2145 fs/ntfs3/attrib.c 2084 2085 /* 2086 * attr_insert_range - Insert range (hole) in file. 2087 * Not for normal files. 2088 */ 2089 int attr_insert_range(struct ntfs_inode *ni, u64 vbo, u64 bytes) 2090 { 2091 int err = 0; 2092 struct runs_tree *run = &ni->file.run; 2093 struct ntfs_sb_info *sbi = ni->mi.sbi; 2094 struct ATTRIB *attr = NULL, *attr_b; 2095 struct ATTR_LIST_ENTRY *le, *le_b; 2096 struct mft_inode *mi, *mi_b; 2097 CLST vcn, svcn, evcn1, len, next_svcn; 2098 u64 data_size, alloc_size; 2099 u32 mask; 2100 __le16 a_flags; 2101 2102 if (!bytes) 2103 return 0; 2104 2105 le_b = NULL; 2106 attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL, 0, NULL, &mi_b); 2107 if (!attr_b) 2108 return -ENOENT; 2109 2110 if (!is_attr_ext(attr_b)) { 2111 /* It was checked above. See fallocate. */ 2112 return -EOPNOTSUPP; 2113 } 2114 2115 if (!attr_b->non_res) { 2116 data_size = le32_to_cpu(attr_b->res.data_size); 2117 mask = sbi->cluster_mask; /* cluster_size - 1 */ 2118 } else { 2119 data_size = le64_to_cpu(attr_b->nres.data_size); 2120 mask = (sbi->cluster_size << attr_b->nres.c_unit) - 1; 2121 } 2122 2123 if (vbo > data_size) { 2124 /* Insert range after the file size is not allowed. */ 2125 return -EINVAL; 2126 } 2127 2128 if ((vbo & mask) || (bytes & mask)) { 2129 /* Allow to insert only frame aligned ranges. */ 2130 return -EINVAL; 2131 } 2132 2133 vcn = vbo >> sbi->cluster_bits; 2134 len = bytes >> sbi->cluster_bits; 2135 2136 down_write(&ni->file.run_lock); 2137 2138 if (!attr_b->non_res) { 2139 err = attr_set_size(ni, ATTR_DATA, NULL, 0, run, 2140 data_size + bytes, NULL, false, &attr); 2141 if (err) 2142 goto out; 2143 if (!attr->non_res) { 2144 /* Still resident. */ > 2145 char *data = Add2Ptr(attr, attr->res.data_off); 2146 2147 memmove(data + bytes, data, bytes); 2148 memset(data, 0, bytes); 2149 err = 0; 2150 goto out; 2151 } 2152 /* Resident files becomes nonresident. */ 2153 le_b = NULL; 2154 attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL, 0, NULL, 2155 &mi_b); 2156 if (!attr_b) 2157 return -ENOENT; 2158 if (!attr_b->non_res) { 2159 err = -EINVAL; 2160 goto out; 2161 } 2162 data_size = le64_to_cpu(attr_b->nres.data_size); 2163 alloc_size = le64_to_cpu(attr_b->nres.alloc_size); 2164 } 2165 2166 /* 2167 * Enumerate all attribute segments and shift start vcn. 2168 */ 2169 a_flags = attr_b->flags; 2170 svcn = le64_to_cpu(attr_b->nres.svcn); 2171 evcn1 = le64_to_cpu(attr_b->nres.evcn) + 1; 2172 2173 if (svcn <= vcn && vcn < evcn1) { 2174 attr = attr_b; 2175 le = le_b; 2176 mi = mi_b; 2177 } else if (!le_b) { 2178 err = -EINVAL; 2179 goto out; 2180 } else { 2181 le = le_b; 2182 attr = ni_find_attr(ni, attr_b, &le, ATTR_DATA, NULL, 0, &vcn, 2183 &mi); 2184 if (!attr) { 2185 err = -EINVAL; 2186 goto out; 2187 } 2188 2189 svcn = le64_to_cpu(attr->nres.svcn); 2190 evcn1 = le64_to_cpu(attr->nres.evcn) + 1; 2191 } 2192 2193 run_truncate(run, 0); /* clear cached values. */ 2194 err = attr_load_runs(attr, ni, run, NULL); 2195 if (err) 2196 goto out; 2197 2198 if (!run_insert_range(run, vcn, len)) { 2199 err = -ENOMEM; 2200 goto out; 2201 } 2202 2203 /* Try to pack in current record as much as possible. */ 2204 err = mi_pack_runs(mi, attr, run, evcn1 + len - svcn); 2205 if (err) 2206 goto out; 2207 2208 next_svcn = le64_to_cpu(attr->nres.evcn) + 1; 2209 run_truncate_head(run, next_svcn); 2210 2211 while ((attr = ni_enum_attr_ex(ni, attr, &le, &mi)) && 2212 attr->type == ATTR_DATA && !attr->name_len) { 2213 le64_add_cpu(&attr->nres.svcn, len); 2214 le64_add_cpu(&attr->nres.evcn, len); 2215 if (le) { 2216 le->vcn = attr->nres.svcn; 2217 ni->attr_list.dirty = true; 2218 } 2219 mi->dirty = true; 2220 } 2221 2222 /* 2223 * Update primary attribute segment in advance. 2224 * pointer attr_b may become invalid (layout of mft is changed) 2225 */ 2226 if (vbo <= ni->i_valid) 2227 ni->i_valid += bytes; 2228 > 2229 attr_b->nres.data_size = le64_to_cpu(data_size + bytes); > 2230 attr_b->nres.alloc_size = le64_to_cpu(alloc_size + bytes); -- 0-DAY CI Kernel Test Service https://01.org/lkp