]> www.infradead.org Git - linux.git/commitdiff
ext4: factor out a common helper to query extent map
authorZhang Yi <yi.zhang@huawei.com>
Fri, 17 May 2024 12:39:56 +0000 (20:39 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 27 Jun 2024 22:04:49 +0000 (18:04 -0400)
Factor out a new common helper ext4_map_query_blocks() from the
ext4_da_map_blocks(), it query and return the extent map status on the
inode's extent path, no logic changes.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Link: https://patch.msgid.link/20240517124005.347221-2-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index 4bae9ccf5fe01619fc1f05bf651b2a69b814f0a0..168819b4db0190de40424f66ba6a81c4068a0100 100644 (file)
@@ -453,6 +453,35 @@ static void ext4_map_blocks_es_recheck(handle_t *handle,
 }
 #endif /* ES_AGGRESSIVE_TEST */
 
+static int ext4_map_query_blocks(handle_t *handle, struct inode *inode,
+                                struct ext4_map_blocks *map)
+{
+       unsigned int status;
+       int retval;
+
+       if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
+               retval = ext4_ext_map_blocks(handle, inode, map, 0);
+       else
+               retval = ext4_ind_map_blocks(handle, inode, map, 0);
+
+       if (retval <= 0)
+               return retval;
+
+       if (unlikely(retval != map->m_len)) {
+               ext4_warning(inode->i_sb,
+                            "ES len assertion failed for inode "
+                            "%lu: retval %d != map->m_len %d",
+                            inode->i_ino, retval, map->m_len);
+               WARN_ON(1);
+       }
+
+       status = map->m_flags & EXT4_MAP_UNWRITTEN ?
+                       EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
+       ext4_es_insert_extent(inode, map->m_lblk, map->m_len,
+                             map->m_pblk, status);
+       return retval;
+}
+
 /*
  * The ext4_map_blocks() function tries to look up the requested blocks,
  * and returns if the blocks are already mapped.
@@ -1744,33 +1773,11 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,
        down_read(&EXT4_I(inode)->i_data_sem);
        if (ext4_has_inline_data(inode))
                retval = 0;
-       else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
-               retval = ext4_ext_map_blocks(NULL, inode, map, 0);
        else
-               retval = ext4_ind_map_blocks(NULL, inode, map, 0);
-       if (retval < 0) {
-               up_read(&EXT4_I(inode)->i_data_sem);
-               return retval;
-       }
-       if (retval > 0) {
-               unsigned int status;
-
-               if (unlikely(retval != map->m_len)) {
-                       ext4_warning(inode->i_sb,
-                                    "ES len assertion failed for inode "
-                                    "%lu: retval %d != map->m_len %d",
-                                    inode->i_ino, retval, map->m_len);
-                       WARN_ON(1);
-               }
-
-               status = map->m_flags & EXT4_MAP_UNWRITTEN ?
-                               EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
-               ext4_es_insert_extent(inode, map->m_lblk, map->m_len,
-                                     map->m_pblk, status);
-               up_read(&EXT4_I(inode)->i_data_sem);
-               return retval;
-       }
+               retval = ext4_map_query_blocks(NULL, inode, map);
        up_read(&EXT4_I(inode)->i_data_sem);
+       if (retval)
+               return retval;
 
 add_delayed:
        down_write(&EXT4_I(inode)->i_data_sem);