Re: [PATCH v2] ext4: replace strcpy() with '.' assignment

kernel test robot
2025-05-19T05:58:55Z

Hi Ethan,

kernel test robot noticed the following build errors:

[auto build test ERROR on 5723cc3450bccf7f98f227b9723b5c9f6b3af1c5]

url: https://github.com/intel-lab-lkp/linux/commits/Ethan-Carter-Edwards/ext4-replace-strcpy-with-assignment/20250519-115601
base: 5723cc3450bccf7f98f227b9723b5c9f6b3af1c5
patch link: https://lore.kernel.org/r/20250518-ext4-strcpy-v2-1-80d316325046%40ethancedwards.com
patch subject: [PATCH v2] ext4: replace strcpy() with '.' assignment
config: csky-randconfig-002-20250519 (https://download.01.org/0day-ci/archive/20250519/202505191316.JJMnPobO-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250519/202505191316.JJMnPobO-lkp@intel.com/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@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202505191316.JJMnPobO-lkp@intel.com/

All errors (new ones prefixed by >>):

fs/ext4/inline.c: In function 'ext4_inlinedir_to_tree':
>> fs/ext4/inline.c:1317:38: error: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
1317 | fake.name[0] = ".";
| ^
fs/ext4/inline.c:1327:53: error: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
1327 | fake.name[0] = fake.name[1] = ".";
| ^

vim +1317 fs/ext4/inline.c

1259
1260 /*
1261 * This function fills a red-black tree with information from an
1262 * inlined dir. It returns the number directory entries loaded
1263 * into the tree. If there is an error it is returned in err.
1264 */
1265 int ext4_inlinedir_to_tree(struct file *dir_file,
1266 struct inode *dir, ext4_lblk_t block,
1267 struct dx_hash_info *hinfo,
1268 __u32 start_hash, __u32 start_minor_hash,
1269 int *has_inline_data)
1270 {
1271 int err = 0, count = 0;
1272 unsigned int parent_ino;
1273 int pos;
1274 struct ext4_dir_entry_2 *de;
1275 struct inode *inode = file_inode(dir_file);
1276 int ret, inline_size = 0;
1277 struct ext4_iloc iloc;
1278 void *dir_buf = NULL;
1279 struct ext4_dir_entry_2 fake;
1280 struct fscrypt_str tmp_str;
1281
1282 ret = ext4_get_inode_loc(inode, &iloc);
1283 if (ret)
1284 return ret;
1285
1286 down_read(&EXT4_I(inode)->xattr_sem);
1287 if (!ext4_has_inline_data(inode)) {
1288 up_read(&EXT4_I(inode)->xattr_sem);
1289 *has_inline_data = 0;
1290 goto out;
1291 }
1292
1293 inline_size = ext4_get_inline_size(inode);
1294 dir_buf = kmalloc(inline_size, GFP_NOFS);
1295 if (!dir_buf) {
1296 ret = -ENOMEM;
1297 up_read(&EXT4_I(inode)->xattr_sem);
1298 goto out;
1299 }
1300
1301 ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc);
1302 up_read(&EXT4_I(inode)->xattr_sem);
1303 if (ret < 0)
1304 goto out;
1305
1306 pos = 0;
1307 parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode);
1308 while (pos < inline_size) {
1309 /*
1310 * As inlined dir doesn't store any information about '.' and
1311 * only the inode number of '..' is stored, we have to handle
1312 * them differently.
1313 */
1314 if (pos == 0) {
1315 fake.inode = cpu_to_le32(inode->i_ino);
1316 fake.name_len = 1;
> 1317 fake.name[0] = ".";
1318 fake.rec_len = ext4_rec_len_to_disk(
1319 ext4_dir_rec_len(fake.name_len, NULL),
1320 inline_size);
1321 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR);
1322 de = &fake;
1323 pos = EXT4_INLINE_DOTDOT_OFFSET;
1324 } else if (pos == EXT4_INLINE_DOTDOT_OFFSET) {
1325 fake.inode = cpu_to_le32(parent_ino);
1326 fake.name_len = 2;
1327 fake.name[0] = fake.name[1] = ".";
1328 fake.rec_len = ext4_rec_len_to_disk(
1329 ext4_dir_rec_len(fake.name_len, NULL),
1330 inline_size);
1331 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR);
1332 de = &fake;
1333 pos = EXT4_INLINE_DOTDOT_SIZE;
1334 } else {
1335 de = (struct ext4_dir_entry_2 *)(dir_buf + pos);
1336 pos += ext4_rec_len_from_disk(de->rec_len, inline_size);
1337 if (ext4_check_dir_entry(inode, dir_file, de,
1338 iloc.bh, dir_buf,
1339 inline_size, pos)) {
1340 ret = count;
1341 goto out;
1342 }
1343 }
1344
1345 if (ext4_hash_in_dirent(dir)) {
1346 hinfo->hash = EXT4_DIRENT_HASH(de);
1347 hinfo->minor_hash = EXT4_DIRENT_MINOR_HASH(de);
1348 } else {
1349 err = ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
1350 if (err) {
1351 ret = err;
1352 goto out;
1353 }
1354 }
1355 if ((hinfo->hash < start_hash) ||
1356 ((hinfo->hash == start_hash) &&
1357 (hinfo->minor_hash < start_minor_hash)))
1358 continue;
1359 if (de->inode == 0)
1360 continue;
1361 tmp_str.name = de->name;
1362 tmp_str.len = de->name_len;
1363 err = ext4_htree_store_dirent(dir_file, hinfo->hash,
1364 hinfo->minor_hash, de, &tmp_str);
1365 if (err) {
1366 ret = err;
1367 goto out;
1368 }
1369 count++;
1370 }
1371 ret = count;
1372 out:
1373 kfree(dir_buf);
1374 brelse(iloc.bh);
1375 return ret;
1376 }
1377

--
0-DAY CI Kernel Test Service