nilfs_forget_buffer(), nilfs_clear_dirty_page(), and
nilfs_segctor_complete_write() are using a bunch of atomic bit
operations against buffer state bitmap.

This reduces the number of them by utilizing set_mask_bits() macro.

Signed-off-by: Ryusuke Konishi <konishi.ryus...@lab.ntt.co.jp>
---
 fs/nilfs2/page.c    | 24 ++++++++++--------------
 fs/nilfs2/segment.c | 14 ++++++++------
 2 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/fs/nilfs2/page.c b/fs/nilfs2/page.c
index 700ecbc..45d650a 100644
--- a/fs/nilfs2/page.c
+++ b/fs/nilfs2/page.c
@@ -89,18 +89,16 @@ struct buffer_head *nilfs_grab_buffer(struct inode *inode,
 void nilfs_forget_buffer(struct buffer_head *bh)
 {
        struct page *page = bh->b_page;
+       const unsigned long clear_bits =
+               (1 << BH_Uptodate | 1 << BH_Dirty | 1 << BH_Mapped |
+                1 << BH_Async_Write | 1 << BH_NILFS_Volatile |
+                1 << BH_NILFS_Checked | 1 << BH_NILFS_Redirected);
 
        lock_buffer(bh);
-       clear_buffer_nilfs_volatile(bh);
-       clear_buffer_nilfs_checked(bh);
-       clear_buffer_nilfs_redirected(bh);
-       clear_buffer_async_write(bh);
-       clear_buffer_dirty(bh);
+       set_mask_bits(&bh->b_state, clear_bits, 0);
        if (nilfs_page_buffers_clean(page))
                __nilfs_clear_page_dirty(page);
 
-       clear_buffer_uptodate(bh);
-       clear_buffer_mapped(bh);
        bh->b_blocknr = -1;
        ClearPageUptodate(page);
        ClearPageMappedToDisk(page);
@@ -421,6 +419,10 @@ void nilfs_clear_dirty_page(struct page *page, bool silent)
 
        if (page_has_buffers(page)) {
                struct buffer_head *bh, *head;
+               const unsigned long clear_bits =
+                       (1 << BH_Uptodate | 1 << BH_Dirty | 1 << BH_Mapped |
+                        1 << BH_Async_Write | 1 << BH_NILFS_Volatile |
+                        1 << BH_NILFS_Checked | 1 << BH_NILFS_Redirected);
 
                bh = head = page_buffers(page);
                do {
@@ -430,13 +432,7 @@ void nilfs_clear_dirty_page(struct page *page, bool silent)
                                        "discard block %llu, size %zu",
                                        (u64)bh->b_blocknr, bh->b_size);
                        }
-                       clear_buffer_async_write(bh);
-                       clear_buffer_dirty(bh);
-                       clear_buffer_nilfs_volatile(bh);
-                       clear_buffer_nilfs_checked(bh);
-                       clear_buffer_nilfs_redirected(bh);
-                       clear_buffer_uptodate(bh);
-                       clear_buffer_mapped(bh);
+                       set_mask_bits(&bh->b_state, clear_bits, 0);
                        unlock_buffer(bh);
                } while (bh = bh->b_this_page, bh != head);
        }
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index c9a4e60..c6abbad9 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -24,6 +24,7 @@
 #include <linux/pagemap.h>
 #include <linux/buffer_head.h>
 #include <linux/writeback.h>
+#include <linux/bitops.h>
 #include <linux/bio.h>
 #include <linux/completion.h>
 #include <linux/blkdev.h>
@@ -1785,12 +1786,13 @@ static void nilfs_segctor_complete_write(struct 
nilfs_sc_info *sci)
                 */
                list_for_each_entry(bh, &segbuf->sb_payload_buffers,
                                    b_assoc_buffers) {
-                       set_buffer_uptodate(bh);
-                       clear_buffer_dirty(bh);
-                       clear_buffer_async_write(bh);
-                       clear_buffer_delay(bh);
-                       clear_buffer_nilfs_volatile(bh);
-                       clear_buffer_nilfs_redirected(bh);
+                       const unsigned long set_bits = (1 << BH_Uptodate);
+                       const unsigned long clear_bits =
+                               (1 << BH_Dirty | 1 << BH_Async_Write |
+                                1 << BH_Delay | 1 << BH_NILFS_Volatile |
+                                1 << BH_NILFS_Redirected);
+
+                       set_mask_bits(&bh->b_state, clear_bits, set_bits);
                        if (bh == segbuf->sb_super_root) {
                                if (bh->b_page != bd_page) {
                                        end_page_writeback(bd_page);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to