]> www.infradead.org Git - linux-platform-drivers-x86.git/commitdiff
btrfs: merge PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK to PAGE_START_WRITEBACK
authorQu Wenruo <wqu@suse.com>
Tue, 26 Jan 2021 08:33:45 +0000 (16:33 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Feb 2021 21:59:01 +0000 (22:59 +0100)
PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK are two defines used in
__process_pages_contig(), to let the function know to clear page dirty
bit and then set page writeback.

However page writeback and dirty bits are conflicting (at least for
sector size == PAGE_SIZE case), this means these two have to be always
updated together.

This means we can merge PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK to
PAGE_START_WRITEBACK.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
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/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/inode.c

index edcdbd739a1e5de7c858ea2c73abe57988fec2f0..7c14ccf76838f1d8226c84e786bb01e684fb7e78 100644 (file)
@@ -1976,10 +1976,10 @@ static int __process_pages_contig(struct address_space *mapping,
                                pages_processed++;
                                continue;
                        }
-                       if (page_ops & PAGE_CLEAR_DIRTY)
+                       if (page_ops & PAGE_START_WRITEBACK) {
                                clear_page_dirty_for_io(pages[i]);
-                       if (page_ops & PAGE_SET_WRITEBACK)
                                set_page_writeback(pages[i]);
+                       }
                        if (page_ops & PAGE_SET_ERROR)
                                SetPageError(pages[i]);
                        if (page_ops & PAGE_END_WRITEBACK)
index 19221095c63588c2c20a4620ea57a12b23a2179b..2d8187c84812861afbf07494d70191a06dd83396 100644 (file)
@@ -35,12 +35,12 @@ enum {
 
 /* these are flags for __process_pages_contig */
 #define PAGE_UNLOCK            (1 << 0)
-#define PAGE_CLEAR_DIRTY       (1 << 1)
-#define PAGE_SET_WRITEBACK     (1 << 2)
-#define PAGE_END_WRITEBACK     (1 << 3)
-#define PAGE_SET_PRIVATE2      (1 << 4)
-#define PAGE_SET_ERROR         (1 << 5)
-#define PAGE_LOCK              (1 << 6)
+/* Page starts writeback, clear dirty bit and set writeback bit */
+#define PAGE_START_WRITEBACK   (1 << 1)
+#define PAGE_END_WRITEBACK     (1 << 2)
+#define PAGE_SET_PRIVATE2      (1 << 3)
+#define PAGE_SET_ERROR         (1 << 4)
+#define PAGE_LOCK              (1 << 5)
 
 /*
  * page->private values.  Every page that is controlled by the extent
index 04cd95899ac87c6dc204541b8e2fe2b8c5dacdc6..3337c8ee79280793bfe0cb2cca5c1e8b773762fb 100644 (file)
@@ -692,8 +692,7 @@ cont:
                                                     NULL,
                                                     clear_flags,
                                                     PAGE_UNLOCK |
-                                                    PAGE_CLEAR_DIRTY |
-                                                    PAGE_SET_WRITEBACK |
+                                                    PAGE_START_WRITEBACK |
                                                     page_error_op |
                                                     PAGE_END_WRITEBACK);
 
@@ -933,8 +932,7 @@ retry:
                                async_extent->start +
                                async_extent->ram_size - 1,
                                NULL, EXTENT_LOCKED | EXTENT_DELALLOC,
-                               PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
-                               PAGE_SET_WRITEBACK);
+                               PAGE_UNLOCK | PAGE_START_WRITEBACK);
                if (btrfs_submit_compressed_write(inode, async_extent->start,
                                    async_extent->ram_size,
                                    ins.objectid,
@@ -970,9 +968,8 @@ out_free:
                                     NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
                                     EXTENT_DELALLOC_NEW |
                                     EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING,
-                                    PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
-                                    PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK |
-                                    PAGE_SET_ERROR);
+                                    PAGE_UNLOCK | PAGE_START_WRITEBACK |
+                                    PAGE_END_WRITEBACK | PAGE_SET_ERROR);
        free_async_extent_pages(async_extent);
        kfree(async_extent);
        goto again;
@@ -1070,8 +1067,7 @@ static noinline int cow_file_range(struct btrfs_inode *inode,
                                     EXTENT_LOCKED | EXTENT_DELALLOC |
                                     EXTENT_DELALLOC_NEW | EXTENT_DEFRAG |
                                     EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
-                                    PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
-                                    PAGE_END_WRITEBACK);
+                                    PAGE_START_WRITEBACK | PAGE_END_WRITEBACK);
                        *nr_written = *nr_written +
                             (end - start + PAGE_SIZE) / PAGE_SIZE;
                        *page_started = 1;
@@ -1194,8 +1190,7 @@ out_reserve:
 out_unlock:
        clear_bits = EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
                EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV;
-       page_ops = PAGE_UNLOCK | PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
-               PAGE_END_WRITEBACK;
+       page_ops = PAGE_UNLOCK | PAGE_START_WRITEBACK | PAGE_END_WRITEBACK;
        /*
         * If we reserved an extent for our delalloc range (or a subrange) and
         * failed to create the respective ordered extent, then it means that
@@ -1320,9 +1315,8 @@ static int cow_file_range_async(struct btrfs_inode *inode,
                unsigned clear_bits = EXTENT_LOCKED | EXTENT_DELALLOC |
                        EXTENT_DELALLOC_NEW | EXTENT_DEFRAG |
                        EXTENT_DO_ACCOUNTING;
-               unsigned long page_ops = PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
-                       PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK |
-                       PAGE_SET_ERROR;
+               unsigned long page_ops = PAGE_UNLOCK | PAGE_START_WRITEBACK |
+                                        PAGE_END_WRITEBACK | PAGE_SET_ERROR;
 
                extent_clear_unlock_delalloc(inode, start, end, locked_page,
                                             clear_bits, page_ops);
@@ -1519,8 +1513,7 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
                                             EXTENT_LOCKED | EXTENT_DELALLOC |
                                             EXTENT_DO_ACCOUNTING |
                                             EXTENT_DEFRAG, PAGE_UNLOCK |
-                                            PAGE_CLEAR_DIRTY |
-                                            PAGE_SET_WRITEBACK |
+                                            PAGE_START_WRITEBACK |
                                             PAGE_END_WRITEBACK);
                return -ENOMEM;
        }
@@ -1842,8 +1835,7 @@ error:
                                             locked_page, EXTENT_LOCKED |
                                             EXTENT_DELALLOC | EXTENT_DEFRAG |
                                             EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
-                                            PAGE_CLEAR_DIRTY |
-                                            PAGE_SET_WRITEBACK |
+                                            PAGE_START_WRITEBACK |
                                             PAGE_END_WRITEBACK);
        btrfs_free_path(path);
        return ret;