From 27595346006c4df23b45eba169e428aaccb6c811 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 18 Mar 2025 02:30:45 +0100 Subject: ext2fs: Always clean just-allocated inode So that if we get a lazily-cleaned inode, we do not get disturbed by the values, notably i_file_acl and i_dir_acl were not cleaned, and i_block_group not checked. b0ff48880bb40 ("Formerly ialloc.c.~6~") introduced only setting dn_set_ctime when cleanup was missing, but we always want to set the ctime for a new inode anyway. --- ext2fs/ialloc.c | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/ext2fs/ialloc.c b/ext2fs/ialloc.c index 707ce142..c2588fc4 100644 --- a/ext2fs/ialloc.c +++ b/ext2fs/ialloc.c @@ -314,40 +314,38 @@ diskfs_alloc_node (struct node *dir, mode_t mode, struct node **node) st = &np->dn_stat; - if (st->st_blocks) - { - st->st_blocks = 0; - np->dn_set_ctime = 1; - } + np->dn_set_ctime = 1; + np->allocsize = 0; + st->st_blocks = 0; + st->st_mode &= ~S_IPTRANS; + st->st_size = 0; + st->st_flags = 0; + + diskfs_node_disknode (np)->info_i_translator = 0; /* Zero out the block pointers in case there's some noise left on disk. */ for (block = 0; block < EXT2_N_BLOCKS; block++) - if (diskfs_node_disknode (np)->info.i_data[block] != 0) - { - diskfs_node_disknode (np)->info.i_data[block] = 0; - np->dn_set_ctime = 1; - } - - if (diskfs_node_disknode (np)->info_i_translator != 0) - { - diskfs_node_disknode (np)->info_i_translator = 0; - np->dn_set_ctime = 1; - } - - st->st_mode &= ~S_IPTRANS; - if (np->allocsize) - { - st->st_size = 0; - np->allocsize = 0; - np->dn_set_ctime = 1; - } + diskfs_node_disknode (np)->info.i_data[block] = 0; /* Propagate initial inode flags from the directory, as Linux does. */ diskfs_node_disknode (np)->info.i_flags = ext2_mask_flags(mode, diskfs_node_disknode (dir)->info.i_flags & EXT2_FL_INHERITED); - st->st_flags = 0; + diskfs_node_disknode (np)->info.i_faddr = 0; + diskfs_node_disknode (np)->info.i_frag_no = 0; + diskfs_node_disknode (np)->info.i_frag_size = 0; + diskfs_node_disknode (np)->info.i_osync = 0; + diskfs_node_disknode (np)->info.i_file_acl = 0; + diskfs_node_disknode (np)->info.i_dir_acl = 0; + diskfs_node_disknode (np)->info.i_dtime = 0; + /* diskfs_node_disknode (np)->info.not_used_1 */ + diskfs_node_disknode (np)->info.i_block_group = inode_group_num (np->cache_id); + diskfs_node_disknode (np)->info.i_next_alloc_block = 0; + diskfs_node_disknode (np)->info.i_next_alloc_goal = 0; + diskfs_node_disknode (np)->info.i_prealloc_block = 0; + diskfs_node_disknode (np)->info.i_prealloc_count = 0; + /* diskfs_node_disknode (np)->info.i_new_inode */ /* * Set up a new generation number for this inode. -- cgit v1.2.3