ext4: factor out ext4_fill_raw_inode()
authorZhang Yi <yi.zhang@huawei.com>
Wed, 1 Sep 2021 02:09:53 +0000 (10:09 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 4 Nov 2021 14:33:25 +0000 (10:33 -0400)
Factor out ext4_fill_raw_inode() from ext4_do_update_inode(), which is
use to fill the in-mem inode contents into the inode table buffer, in
preparation for initializing the exclusive inode buffer without reading
the block in __ext4_get_inode_loc().

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20210901020955.1657340-2-yi.zhang@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index 9097fccdc68897ed6d51ac84a66050d4f8549733..791958088e57e736c8a12f57662d97fc85e64cf2 100644 (file)
@@ -4852,9 +4852,8 @@ bad_inode:
        return ERR_PTR(ret);
 }
 
-static int ext4_inode_blocks_set(handle_t *handle,
-                               struct ext4_inode *raw_inode,
-                               struct ext4_inode_info *ei)
+static int ext4_inode_blocks_set(struct ext4_inode *raw_inode,
+                                struct ext4_inode_info *ei)
 {
        struct inode *inode = &(ei->vfs_inode);
        u64 i_blocks = READ_ONCE(inode->i_blocks);
@@ -4957,37 +4956,16 @@ static void ext4_update_other_inodes_time(struct super_block *sb,
        rcu_read_unlock();
 }
 
-/*
- * Post the struct inode info into an on-disk inode location in the
- * buffer-cache.  This gobbles the caller's reference to the
- * buffer_head in the inode location struct.
- *
- * The caller must have write access to iloc->bh.
- */
-static int ext4_do_update_inode(handle_t *handle,
-                               struct inode *inode,
-                               struct ext4_iloc *iloc)
+static int ext4_fill_raw_inode(struct inode *inode, struct ext4_inode *raw_inode)
 {
-       struct ext4_inode *raw_inode = ext4_raw_inode(iloc);
        struct ext4_inode_info *ei = EXT4_I(inode);
-       struct buffer_head *bh = iloc->bh;
-       struct super_block *sb = inode->i_sb;
-       int err = 0, block;
-       int need_datasync = 0, set_large_file = 0;
        uid_t i_uid;
        gid_t i_gid;
        projid_t i_projid;
+       int block;
+       int err;
 
-       spin_lock(&ei->i_raw_lock);
-
-       /*
-        * For fields not tracked in the in-memory inode, initialise them
-        * to zero for new inodes.
-        */
-       if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
-               memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
-
-       err = ext4_inode_blocks_set(handle, raw_inode, ei);
+       err = ext4_inode_blocks_set(raw_inode, ei);
 
        raw_inode->i_mode = cpu_to_le16(inode->i_mode);
        i_uid = i_uid_read(inode);
@@ -5029,16 +5007,8 @@ static int ext4_do_update_inode(handle_t *handle,
                raw_inode->i_file_acl_high =
                        cpu_to_le16(ei->i_file_acl >> 32);
        raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl);
-       if (READ_ONCE(ei->i_disksize) != ext4_isize(inode->i_sb, raw_inode)) {
-               ext4_isize_set(raw_inode, ei->i_disksize);
-               need_datasync = 1;
-       }
-       if (ei->i_disksize > 0x7fffffffULL) {
-               if (!ext4_has_feature_large_file(sb) ||
-                               EXT4_SB(sb)->s_es->s_rev_level ==
-                   cpu_to_le32(EXT4_GOOD_OLD_REV))
-                       set_large_file = 1;
-       }
+       ext4_isize_set(raw_inode, ei->i_disksize);
+
        raw_inode->i_generation = cpu_to_le32(inode->i_generation);
        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
                if (old_valid_dev(inode->i_rdev)) {
@@ -5078,6 +5048,45 @@ static int ext4_do_update_inode(handle_t *handle,
                raw_inode->i_projid = cpu_to_le32(i_projid);
 
        ext4_inode_csum_set(inode, raw_inode, ei);
+       return err;
+}
+
+/*
+ * Post the struct inode info into an on-disk inode location in the
+ * buffer-cache.  This gobbles the caller's reference to the
+ * buffer_head in the inode location struct.
+ *
+ * The caller must have write access to iloc->bh.
+ */
+static int ext4_do_update_inode(handle_t *handle,
+                               struct inode *inode,
+                               struct ext4_iloc *iloc)
+{
+       struct ext4_inode *raw_inode = ext4_raw_inode(iloc);
+       struct ext4_inode_info *ei = EXT4_I(inode);
+       struct buffer_head *bh = iloc->bh;
+       struct super_block *sb = inode->i_sb;
+       int err;
+       int need_datasync = 0, set_large_file = 0;
+
+       spin_lock(&ei->i_raw_lock);
+
+       /*
+        * For fields not tracked in the in-memory inode, initialise them
+        * to zero for new inodes.
+        */
+       if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
+               memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
+
+       if (READ_ONCE(ei->i_disksize) != ext4_isize(inode->i_sb, raw_inode))
+               need_datasync = 1;
+       if (ei->i_disksize > 0x7fffffffULL) {
+               if (!ext4_has_feature_large_file(sb) ||
+                   EXT4_SB(sb)->s_es->s_rev_level == cpu_to_le32(EXT4_GOOD_OLD_REV))
+                       set_large_file = 1;
+       }
+
+       err = ext4_fill_raw_inode(inode, raw_inode);
        spin_unlock(&ei->i_raw_lock);
        if (err) {
                EXT4_ERROR_INODE(inode, "corrupted inode contents");