int btrfs_wait_marked_extents(struct btrfs_root *root, struct extent_io_tree *dirty_pages, int mark) { int ret; int err = 0; int werr = 0; struct page *page; struct inode *btree_inode = root->fs_info->btree_inode; u64 start = 0; u64 end; unsigned long index; while (1) { ret = find_first_extent_bit(dirty_pages, start, &start, &end, mark); if (ret) break; clear_extent_bits(dirty_pages, start, end, mark, GFP_NOFS); while (start <= end) { index = start >> PAGE_CACHE_SHIFT; start = (u64)(index + 1) << PAGE_CACHE_SHIFT; page = find_get_page(btree_inode->i_mapping, index); if (!page) continue; if (PageDirty(page)) { btree_lock_page_hook(page); wait_on_page_writeback(page); err = write_one_page(page, 0); if (err) werr = err; } wait_on_page_writeback(page); page_cache_release(page); cond_resched(); } } if (err) werr = err; return werr; }
int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask) { return clear_extent_bits(tree, start, end, EXTENT_DIRTY, mask); }