Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

udf: Fix file counting in LVID

numFiles entry in LVID should actually contain number for non-dir file
entries, not the number of non-dir inodes. Move the counting from inode
allocation / deallocation into directory entry handling functions.

Signed-off-by: Jan Kara <jack@suse.cz>

Jan Kara 085cf7b7 c2efd13a

+25 -28
+3 -28
fs/udf/ialloc.c
··· 28 28 29 29 void udf_free_inode(struct inode *inode) 30 30 { 31 - struct super_block *sb = inode->i_sb; 32 - struct udf_sb_info *sbi = UDF_SB(sb); 33 - struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); 34 - 35 - if (lvidiu) { 36 - mutex_lock(&sbi->s_alloc_mutex); 37 - if (S_ISDIR(inode->i_mode)) 38 - le32_add_cpu(&lvidiu->numDirs, -1); 39 - else 40 - le32_add_cpu(&lvidiu->numFiles, -1); 41 - udf_updated_lvid(sb); 42 - mutex_unlock(&sbi->s_alloc_mutex); 43 - } 44 - 45 - udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); 31 + udf_free_blocks(inode->i_sb, NULL, &UDF_I(inode)->i_location, 0, 1); 46 32 } 47 33 48 34 struct inode *udf_new_inode(struct inode *dir, umode_t mode) ··· 40 54 uint32_t start = UDF_I(dir)->i_location.logicalBlockNum; 41 55 struct udf_inode_info *iinfo; 42 56 struct udf_inode_info *dinfo = UDF_I(dir); 43 - struct logicalVolIntegrityDescImpUse *lvidiu; 44 57 int err; 45 58 46 59 inode = new_inode(sb); ··· 77 92 return ERR_PTR(err); 78 93 } 79 94 80 - lvidiu = udf_sb_lvidiu(sb); 81 - if (lvidiu) { 82 - iinfo->i_unique = lvid_get_unique_id(sb); 83 - inode->i_generation = iinfo->i_unique; 84 - mutex_lock(&sbi->s_alloc_mutex); 85 - if (S_ISDIR(mode)) 86 - le32_add_cpu(&lvidiu->numDirs, 1); 87 - else 88 - le32_add_cpu(&lvidiu->numFiles, 1); 89 - udf_updated_lvid(sb); 90 - mutex_unlock(&sbi->s_alloc_mutex); 91 - } 95 + iinfo->i_unique = lvid_get_unique_id(sb); 96 + inode->i_generation = iinfo->i_unique; 92 97 93 98 inode_init_owner(&init_user_ns, inode, dir, mode); 94 99 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET))
+22
fs/udf/namei.c
··· 336 336 udf_fiiter_write_fi(iter, NULL); 337 337 } 338 338 339 + static void udf_add_fid_counter(struct super_block *sb, bool dir, int val) 340 + { 341 + struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); 342 + 343 + if (!lvidiu) 344 + return; 345 + mutex_lock(&UDF_SB(sb)->s_alloc_mutex); 346 + if (dir) 347 + le32_add_cpu(&lvidiu->numDirs, val); 348 + else 349 + le32_add_cpu(&lvidiu->numFiles, val); 350 + udf_updated_lvid(sb); 351 + mutex_unlock(&UDF_SB(sb)->s_alloc_mutex); 352 + } 353 + 339 354 static int udf_add_nondir(struct dentry *dentry, struct inode *inode) 340 355 { 341 356 struct udf_inode_info *iinfo = UDF_I(inode); ··· 372 357 dir->i_ctime = dir->i_mtime = current_time(dir); 373 358 mark_inode_dirty(dir); 374 359 udf_fiiter_release(&iter); 360 + udf_add_fid_counter(dir->i_sb, false, 1); 375 361 d_instantiate_new(dentry, inode); 376 362 377 363 return 0; ··· 473 457 iter.fi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; 474 458 udf_fiiter_write_fi(&iter, NULL); 475 459 udf_fiiter_release(&iter); 460 + udf_add_fid_counter(dir->i_sb, true, 1); 476 461 inc_nlink(dir); 477 462 dir->i_ctime = dir->i_mtime = current_time(dir); 478 463 mark_inode_dirty(dir); ··· 526 509 clear_nlink(inode); 527 510 inode->i_size = 0; 528 511 inode_dec_link_count(dir); 512 + udf_add_fid_counter(dir->i_sb, true, -1); 529 513 inode->i_ctime = dir->i_ctime = dir->i_mtime = 530 514 current_time(inode); 531 515 mark_inode_dirty(dir); ··· 562 544 dir->i_ctime = dir->i_mtime = current_time(dir); 563 545 mark_inode_dirty(dir); 564 546 inode_dec_link_count(inode); 547 + udf_add_fid_counter(dir->i_sb, false, -1); 565 548 inode->i_ctime = dir->i_ctime; 566 549 ret = 0; 567 550 end_unlink: ··· 749 730 udf_fiiter_release(&iter); 750 731 751 732 inc_nlink(inode); 733 + udf_add_fid_counter(dir->i_sb, false, 1); 752 734 inode->i_ctime = current_time(inode); 753 735 mark_inode_dirty(inode); 754 736 dir->i_ctime = dir->i_mtime = current_time(dir); ··· 874 854 if (new_inode) { 875 855 new_inode->i_ctime = current_time(new_inode); 876 856 inode_dec_link_count(new_inode); 857 + udf_add_fid_counter(old_dir->i_sb, S_ISDIR(new_inode->i_mode), 858 + -1); 877 859 } 878 860 old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir); 879 861 new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);