/* part of tail2extent. replace tail items with extent one. Content of tail
   items (@count bytes) being cut are copied already into
   pages. extent_writepage method is called to create extents corresponding to
   those pages */
static int replace(struct inode *inode, struct page **pages, unsigned nr_pages, int count)
{
	int result;
	unsigned i;
	STORE_COUNTERS;

	if (nr_pages == 0)
		return 0;

	assert("vs-596", pages[0]);

	/* cut copied items */
	result = cut_formatting_items(inode, page_offset(pages[0]), count);
	if (result)
		return result;

	CHECK_COUNTERS;

	/* put into tree replacement for just removed items: extent item, namely */
	for (i = 0; i < nr_pages; i++) {
		result = add_to_page_cache_lru(pages[i], inode->i_mapping,
					       pages[i]->index,
					       mapping_gfp_mask(inode->
								i_mapping));
		if (result)
			break;
		unlock_page(pages[i]);
		result = find_or_create_extent(pages[i]);
		if (result)
			break;
		SetPageUptodate(pages[i]);
	}
	return result;
}
Beispiel #2
0
/* part of tail2extent. replace tail items with extent one. Content of tail
   items (@count bytes) being cut are copied already into
   pages. extent_writepage method is called to create extents corresponding to
   those pages */
static int replace(struct inode *inode, struct page **pages, unsigned nr_pages, int count)
{
    int result;
    unsigned i;
    STORE_COUNTERS;

    if (nr_pages == 0)
        return 0;

    assert("vs-596", pages[0]);

    /* cut copied items */
    result = cut_formatting_items(inode, page_offset(pages[0]), count);
    if (result)
        return result;

    CHECK_COUNTERS;

    /* put into tree replacement for just removed items: extent item, namely */
    for (i = 0; i < nr_pages; i++) {
        result = add_to_page_cache_lru(pages[i], inode->i_mapping,
                                       pages[i]->index,
                                       mapping_gfp_mask(inode->
                                               i_mapping));
        if (result)
            break;
        unlock_page(pages[i]);
        result = find_or_create_extent(pages[i]);
        if (result) {
            /*
             * Unsuccess in critical place:
             * tail has been removed,
             * but extent hasn't been created
             */
            warning("edward-1572",
                    "Report the error code %i to developers. Run FSCK",
                    result);
            break;
        }
        SetPageUptodate(pages[i]);
    }
    return result;
}