commit 27595346006c4df23b45eba169e428aaccb6c811
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Tue Mar 18 02:30:45 2025 +0100

    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.

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.
