summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2025-03-18 02:30:45 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-03-18 02:30:45 +0100
commit27595346006c4df23b45eba169e428aaccb6c811 (patch)
tree35994f1f8c231b0a709d2cf0f7766d70a251022b
parente900fafc3b2d0885371acc35ef6bc41df86ac8fb (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.c48
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.