]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: use num_extent_folios() in for loop bounds
authorDavid Sterba <dsterba@suse.com>
Tue, 25 Feb 2025 17:24:46 +0000 (18:24 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 18 Mar 2025 19:35:47 +0000 (20:35 +0100)
As the helper num_extent_folios() is now __pure, we can use it in for
loop without storing its value in a variable explicitly, the compiler
will do this for us.

The effects on btrfs.ko is -200 bytes and there are stack space savings
too:

btrfs_clone_extent_buffer                               -8 (32 -> 24)
btrfs_clear_buffer_dirty                                -8 (48 -> 40)
clear_extent_buffer_uptodate                            -8 (40 -> 32)
set_extent_buffer_dirty                                 -8 (32 -> 24)
write_one_eb                                            -8 (88 -> 80)
set_extent_buffer_uptodate                              -8 (40 -> 32)
read_extent_buffer_pages_nowait                        -16 (64 -> 48)
find_extent_buffer                                      -8 (32 -> 24)

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/extent_io.c

index 574795f30167a248e37a103acebd0b9b29089a5b..1c6ae187d6a25bc444b82977b6dc0426fe583426 100644 (file)
@@ -182,13 +182,12 @@ static int btrfs_repair_eb_io_failure(const struct extent_buffer *eb,
                                      int mirror_num)
 {
        struct btrfs_fs_info *fs_info = eb->fs_info;
-       int num_folios = num_extent_folios(eb);
        int ret = 0;
 
        if (sb_rdonly(fs_info->sb))
                return -EROFS;
 
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                struct folio *folio = eb->folios[i];
                u64 start = max_t(u64, eb->start, folio_pos(folio));
                u64 end = min_t(u64, eb->start + eb->len,
index 5239ad70ac3e22c10275aba3a402ab9c4beec5fe..bdf75435b5f95599a1a07504b8bfc3736a31314d 100644 (file)
@@ -1779,7 +1779,6 @@ static noinline_for_stack void write_one_eb(struct extent_buffer *eb,
 {
        struct btrfs_fs_info *fs_info = eb->fs_info;
        struct btrfs_bio *bbio;
-       const int num_folios = num_extent_folios(eb);
 
        prepare_eb_write(eb);
 
@@ -1791,7 +1790,7 @@ static noinline_for_stack void write_one_eb(struct extent_buffer *eb,
        wbc_init_bio(wbc, &bbio->bio);
        bbio->inode = BTRFS_I(eb->fs_info->btree_inode);
        bbio->file_offset = eb->start;
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                struct folio *folio = eb->folios[i];
                u64 range_start = max_t(u64, eb->start, folio_pos(folio));
                u32 range_len = min_t(u64, folio_pos(folio) + folio_size(folio),
@@ -2667,7 +2666,6 @@ static struct extent_buffer *__alloc_extent_buffer(struct btrfs_fs_info *fs_info
 struct extent_buffer *btrfs_clone_extent_buffer(const struct extent_buffer *src)
 {
        struct extent_buffer *new;
-       int num_folios = num_extent_folios(src);
        int ret;
 
        new = __alloc_extent_buffer(src->fs_info, src->start);
@@ -2687,7 +2685,7 @@ struct extent_buffer *btrfs_clone_extent_buffer(const struct extent_buffer *src)
                return NULL;
        }
 
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(src); i++) {
                struct folio *folio = new->folios[i];
 
                ret = attach_extent_buffer_folio(new, folio, NULL);
@@ -2707,7 +2705,6 @@ struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
                                                u64 start)
 {
        struct extent_buffer *eb;
-       int num_folios = 0;
        int ret;
 
        eb = __alloc_extent_buffer(fs_info, start);
@@ -2716,13 +2713,12 @@ struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
 
        ret = alloc_eb_folio_array(eb, false);
        if (ret)
-               goto err;
+               goto out;
 
-       num_folios = num_extent_folios(eb);
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                ret = attach_extent_buffer_folio(eb, eb->folios[i], NULL);
                if (ret < 0)
-                       goto err;
+                       goto out_detach;
        }
 
        set_extent_buffer_uptodate(eb);
@@ -2730,13 +2726,15 @@ struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
        set_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags);
 
        return eb;
-err:
-       for (int i = 0; i < num_folios; i++) {
+
+out_detach:
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                if (eb->folios[i]) {
                        detach_extent_buffer_folio(eb, eb->folios[i]);
                        folio_put(eb->folios[i]);
                }
        }
+out:
        kmem_cache_free(extent_buffer_cache, eb);
        return NULL;
 }
@@ -2779,11 +2777,9 @@ static void check_buffer_tree_ref(struct extent_buffer *eb)
 
 static void mark_extent_buffer_accessed(struct extent_buffer *eb)
 {
-       int num_folios= num_extent_folios(eb);
-
        check_buffer_tree_ref(eb);
 
-       for (int i = 0; i < num_folios; i++)
+       for (int i = 0; i < num_extent_folios(eb); i++)
                folio_mark_accessed(eb->folios[i]);
 }
 
@@ -3015,7 +3011,6 @@ finish:
 struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
                                          u64 start, u64 owner_root, int level)
 {
-       int num_folios;
        int attached = 0;
        struct extent_buffer *eb;
        struct extent_buffer *existing_eb = NULL;
@@ -3079,9 +3074,8 @@ reallocate:
                goto out;
        }
 
-       num_folios = num_extent_folios(eb);
        /* Attach all pages to the filemap. */
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                struct folio *folio;
 
                ret = attach_eb_folio_to_filemap(eb, i, prealloc, &existing_eb);
@@ -3175,7 +3169,7 @@ again:
         * btree_release_folio will correctly detect that a page belongs to a
         * live buffer and won't free them prematurely.
         */
-       for (int i = 0; i < num_folios; i++)
+       for (int i = 0; i < num_extent_folios(eb); i++)
                folio_unlock(eb->folios[i]);
        return eb;
 
@@ -3321,7 +3315,6 @@ void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
                              struct extent_buffer *eb)
 {
        struct btrfs_fs_info *fs_info = eb->fs_info;
-       const int num_folios = num_extent_folios(eb);
 
        btrfs_assert_tree_write_locked(eb);
 
@@ -3348,7 +3341,7 @@ void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
        percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, -eb->len,
                                 fs_info->dirty_metadata_batch);
 
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                struct folio *folio = eb->folios[i];
                bool last;
 
@@ -3365,14 +3358,12 @@ void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
 
 void set_extent_buffer_dirty(struct extent_buffer *eb)
 {
-       int num_folios;
        bool was_dirty;
 
        check_buffer_tree_ref(eb);
 
        was_dirty = test_and_set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags);
 
-       num_folios = num_extent_folios(eb);
        WARN_ON(atomic_read(&eb->refs) == 0);
        WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
        WARN_ON(test_bit(EXTENT_BUFFER_ZONED_ZEROOUT, &eb->bflags));
@@ -3393,7 +3384,7 @@ void set_extent_buffer_dirty(struct extent_buffer *eb)
                 */
                if (subpage)
                        folio_lock(eb->folios[0]);
-               for (int i = 0; i < num_folios; i++)
+               for (int i = 0; i < num_extent_folios(eb); i++)
                        btrfs_meta_folio_set_dirty(eb->folios[i], eb);
                if (subpage)
                        folio_unlock(eb->folios[0]);
@@ -3402,17 +3393,16 @@ void set_extent_buffer_dirty(struct extent_buffer *eb)
                                         eb->fs_info->dirty_metadata_batch);
        }
 #ifdef CONFIG_BTRFS_DEBUG
-       for (int i = 0; i < num_folios; i++)
+       for (int i = 0; i < num_extent_folios(eb); i++)
                ASSERT(folio_test_dirty(eb->folios[i]));
 #endif
 }
 
 void clear_extent_buffer_uptodate(struct extent_buffer *eb)
 {
-       int num_folios = num_extent_folios(eb);
 
        clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                struct folio *folio = eb->folios[i];
 
                if (!folio)
@@ -3424,10 +3414,9 @@ void clear_extent_buffer_uptodate(struct extent_buffer *eb)
 
 void set_extent_buffer_uptodate(struct extent_buffer *eb)
 {
-       int num_folios = num_extent_folios(eb);
 
        set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
-       for (int i = 0; i < num_folios; i++)
+       for (int i = 0; i < num_extent_folios(eb); i++)
                btrfs_meta_folio_set_uptodate(eb->folios[i], eb);
 }
 
@@ -3472,7 +3461,6 @@ static void end_bbio_meta_read(struct btrfs_bio *bbio)
 int read_extent_buffer_pages_nowait(struct extent_buffer *eb, int mirror_num,
                                    const struct btrfs_tree_parent_check *check)
 {
-       const int num_folios = num_extent_folios(eb);
        struct btrfs_bio *bbio;
 
        if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
@@ -3513,7 +3501,7 @@ int read_extent_buffer_pages_nowait(struct extent_buffer *eb, int mirror_num,
        bbio->inode = BTRFS_I(eb->fs_info->btree_inode);
        bbio->file_offset = eb->start;
        memcpy(&bbio->parent_check, check, sizeof(*check));
-       for (int i = 0; i < num_folios; i++) {
+       for (int i = 0; i < num_extent_folios(eb); i++) {
                struct folio *folio = eb->folios[i];
                u64 range_start = max_t(u64, eb->start, folio_pos(folio));
                u32 range_len = min_t(u64, folio_pos(folio) + folio_size(folio),