[Tux3] New blockget function

Daniel Phillips phillips at phunq.net
Wed Jan 14 18:30:07 PST 2009


Here is a new improved blockget function, a little more general than
the one we have been using so far:

  * Works for both volume metadata and file data.

  * We can define whether high memory is used per, mapping, by setting
    allocation mask when inode is created,

       mapping_set_gfp_mask(inode->mapping, gfp_mask);

  * Uses ERR_PTR return for better error reporting (need to fix the two
    callers to use this).

  * Returned buffer state is update if page was uptodate, dirty if page
    was dirty

  * Does not care about ->i_size: if we tell it to create a buffer
    above i_size, it will happily do so, unlike the block library
    functions.  Special data transfer semantics related to ->i_size are
    only for Posix file IO, which we will implement by other means that
    by building the limitation into our block access functions.

  * Appears SMP-safe, not tested.

  * Unit tested in UML

The plan is to build our blockread on top of this in the classic
getblk/bread style, slightly improved with ERR_PTR returns.  Because it
locks the page, we do not want to mix this with the block library
block_write_full_page, at least for our allocation map, because the
library function holds the page lock across the get_block -> map_region
call, which will deadlock if an allocation happens to occur on the same
page that is being written out via ->writepage.

I will post the full patch, including the in-kernel unit test, pretty
soon.

struct buffer_head *blockget(struct address_space *mapping, block_t block)
{
	unsigned blockbits = ((struct inode *)mapping->host)->i_blkbits;
	unsigned subshift = PAGE_CACHE_SHIFT - blockbits;
	struct page *page = grab_cache_page(mapping, block >> subshift);
	struct buffer_head *buffer;
	if (!page)
		return ERR_PTR(-ENOMEM);
	if (!page_has_buffers(page))
		create_empty_buffers(page, 1 << blockbits, 0);
	buffer = page_buffer(page, block & ~(-1 << subshift));
	get_bh(buffer);
	unlock_page(page);
	page_cache_release(page);
	return buffer;
}

_______________________________________________
Tux3 mailing list
Tux3 at tux3.org
http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3



More information about the Tux3 mailing list