Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ead8ecff authored by Ryusuke Konishi's avatar Ryusuke Konishi Committed by Linus Torvalds
Browse files

nilfs2: use set_mask_bits() for operations on buffer state bitmap



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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6fb7a61e
Loading
Loading
Loading
Loading
+10 −14
Original line number Original line Diff line number Diff line
@@ -89,18 +89,16 @@ struct buffer_head *nilfs_grab_buffer(struct inode *inode,
void nilfs_forget_buffer(struct buffer_head *bh)
void nilfs_forget_buffer(struct buffer_head *bh)
{
{
	struct page *page = bh->b_page;
	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);
	lock_buffer(bh);
	clear_buffer_nilfs_volatile(bh);
	set_mask_bits(&bh->b_state, clear_bits, 0);
	clear_buffer_nilfs_checked(bh);
	clear_buffer_nilfs_redirected(bh);
	clear_buffer_async_write(bh);
	clear_buffer_dirty(bh);
	if (nilfs_page_buffers_clean(page))
	if (nilfs_page_buffers_clean(page))
		__nilfs_clear_page_dirty(page);
		__nilfs_clear_page_dirty(page);


	clear_buffer_uptodate(bh);
	clear_buffer_mapped(bh);
	bh->b_blocknr = -1;
	bh->b_blocknr = -1;
	ClearPageUptodate(page);
	ClearPageUptodate(page);
	ClearPageMappedToDisk(page);
	ClearPageMappedToDisk(page);
@@ -421,6 +419,10 @@ void nilfs_clear_dirty_page(struct page *page, bool silent)


	if (page_has_buffers(page)) {
	if (page_has_buffers(page)) {
		struct buffer_head *bh, *head;
		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);
		bh = head = page_buffers(page);
		do {
		do {
@@ -430,13 +432,7 @@ void nilfs_clear_dirty_page(struct page *page, bool silent)
					"discard block %llu, size %zu",
					"discard block %llu, size %zu",
					(u64)bh->b_blocknr, bh->b_size);
					(u64)bh->b_blocknr, bh->b_size);
			}
			}
			clear_buffer_async_write(bh);
			set_mask_bits(&bh->b_state, clear_bits, 0);
			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);
			unlock_buffer(bh);
			unlock_buffer(bh);
		} while (bh = bh->b_this_page, bh != head);
		} while (bh = bh->b_this_page, bh != head);
	}
	}
+8 −6
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@
#include <linux/pagemap.h>
#include <linux/pagemap.h>
#include <linux/buffer_head.h>
#include <linux/buffer_head.h>
#include <linux/writeback.h>
#include <linux/writeback.h>
#include <linux/bitops.h>
#include <linux/bio.h>
#include <linux/bio.h>
#include <linux/completion.h>
#include <linux/completion.h>
#include <linux/blkdev.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,
		list_for_each_entry(bh, &segbuf->sb_payload_buffers,
				    b_assoc_buffers) {
				    b_assoc_buffers) {
			set_buffer_uptodate(bh);
			const unsigned long set_bits = (1 << BH_Uptodate);
			clear_buffer_dirty(bh);
			const unsigned long clear_bits =
			clear_buffer_async_write(bh);
				(1 << BH_Dirty | 1 << BH_Async_Write |
			clear_buffer_delay(bh);
				 1 << BH_Delay | 1 << BH_NILFS_Volatile |
			clear_buffer_nilfs_volatile(bh);
				 1 << BH_NILFS_Redirected);
			clear_buffer_nilfs_redirected(bh);

			set_mask_bits(&bh->b_state, clear_bits, set_bits);
			if (bh == segbuf->sb_super_root) {
			if (bh == segbuf->sb_super_root) {
				if (bh->b_page != bd_page) {
				if (bh->b_page != bd_page) {
					end_page_writeback(bd_page);
					end_page_writeback(bd_page);