]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: raid56: avoid double for loop inside alloc_rbio_essential_pages()
authorQu Wenruo <wqu@suse.com>
Wed, 8 Jun 2022 00:34:34 +0000 (08:34 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:35 +0000 (17:45 +0200)
The double loop is just checking if the page for the vertical stripe
is allocated.

We can easily convert it to single loop and get rid of @stripe variable.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/raid56.c

index ae4556b98060487a1e7ce06a40d1671e2e50f1bc..41cdeff63a6b784e407e494e1c3e3ea7e8e65a17 100644 (file)
@@ -2380,23 +2380,22 @@ void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
 static int alloc_rbio_essential_pages(struct btrfs_raid_bio *rbio)
 {
        const u32 sectorsize = rbio->bioc->fs_info->sectorsize;
-       int stripe;
-       int sectornr;
-
-       for_each_set_bit(sectornr, &rbio->dbitmap, rbio->stripe_nsectors) {
-               for (stripe = 0; stripe < rbio->real_stripes; stripe++) {
-                       struct page *page;
-                       int index = (stripe * rbio->stripe_nsectors + sectornr) *
-                                   sectorsize >> PAGE_SHIFT;
+       int total_sector_nr;
 
-                       if (rbio->stripe_pages[index])
-                               continue;
+       for (total_sector_nr = 0; total_sector_nr < rbio->nr_sectors;
+            total_sector_nr++) {
+               struct page *page;
+               int sectornr = total_sector_nr % rbio->stripe_nsectors;
+               int index = (total_sector_nr * sectorsize) >> PAGE_SHIFT;
 
-                       page = alloc_page(GFP_NOFS);
-                       if (!page)
-                               return -ENOMEM;
-                       rbio->stripe_pages[index] = page;
-               }
+               if (!test_bit(sectornr, &rbio->dbitmap))
+                       continue;
+               if (rbio->stripe_pages[index])
+                       continue;
+               page = alloc_page(GFP_NOFS);
+               if (!page)
+                       return -ENOMEM;
+               rbio->stripe_pages[index] = page;
        }
        index_stripe_sectors(rbio);
        return 0;