diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-03-18 02:30:45 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-03-18 02:30:45 +0100 |
commit | 27595346006c4df23b45eba169e428aaccb6c811 (patch) | |
tree | 35994f1f8c231b0a709d2cf0f7766d70a251022b | |
parent | e900fafc3b2d0885371acc35ef6bc41df86ac8fb (diff) |
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.
-rw-r--r-- | ext2fs/ialloc.c | 48 |
1 files 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. |