예제 #1
0
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;
}
예제 #2
0
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);
}