]> www.infradead.org Git - linux.git/commitdiff
ext4: factor out a helper to check the cluster allocation state
authorZhang Yi <yi.zhang@huawei.com>
Fri, 17 May 2024 12:40:03 +0000 (20:40 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 27 Jun 2024 22:04:50 +0000 (18:04 -0400)
Factor out a common helper ext4_clu_alloc_state(), check whether the
cluster containing a delalloc block to be added has been allocated or
has delalloc reservation, no logic changes.

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

index 8e5815b30b5facfc9c6d520193a6d9cda4b2d676..4d8c9ab1ddb1e63792e9dad72133e26626acdf6f 100644 (file)
@@ -1649,6 +1649,35 @@ static void ext4_print_free_blocks(struct inode *inode)
        return;
 }
 
+/*
+ * Check whether the cluster containing lblk has been allocated or has
+ * delalloc reservation.
+ *
+ * Returns 0 if the cluster doesn't have either, 1 if it has delalloc
+ * reservation, 2 if it's already been allocated, negative error code on
+ * failure.
+ */
+static int ext4_clu_alloc_state(struct inode *inode, ext4_lblk_t lblk)
+{
+       struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+       int ret;
+
+       /* Has delalloc reservation? */
+       if (ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk))
+               return 1;
+
+       /* Already been allocated? */
+       if (ext4_es_scan_clu(inode, &ext4_es_is_mapped, lblk))
+               return 2;
+       ret = ext4_clu_mapped(inode, EXT4_B2C(sbi, lblk));
+       if (ret < 0)
+               return ret;
+       if (ret > 0)
+               return 2;
+
+       return 0;
+}
+
 /*
  * ext4_insert_delayed_block - adds a delayed block to the extents status
  *                             tree, incrementing the reserved cluster/block
@@ -1682,23 +1711,15 @@ static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk)
                if (ret != 0)   /* ENOSPC */
                        return ret;
        } else {   /* bigalloc */
-               if (!ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk)) {
-                       if (!ext4_es_scan_clu(inode,
-                                             &ext4_es_is_mapped, lblk)) {
-                               ret = ext4_clu_mapped(inode,
-                                                     EXT4_B2C(sbi, lblk));
-                               if (ret < 0)
-                                       return ret;
-                               if (ret == 0) {
-                                       ret = ext4_da_reserve_space(inode, 1);
-                                       if (ret != 0)   /* ENOSPC */
-                                               return ret;
-                               } else {
-                                       allocated = true;
-                               }
-                       } else {
-                               allocated = true;
-                       }
+               ret = ext4_clu_alloc_state(inode, lblk);
+               if (ret < 0)
+                       return ret;
+               if (ret == 2)
+                       allocated = true;
+               if (ret == 0) {
+                       ret = ext4_da_reserve_space(inode, 1);
+                       if (ret != 0)   /* ENOSPC */
+                               return ret;
                }
        }