Re: [PATCH 2/2] block: use DAX for partition table reads

From: Dan Williams
Date: Fri Jan 29 2016 - 12:54:34 EST


On Fri, Jan 29, 2016 at 9:46 AM, Jens Axboe <axboe@xxxxxx> wrote:
> On 01/29/2016 08:18 AM, Dan Williams wrote:
>>
>> +unsigned char *read_dev_sector(struct block_device *bdev, sector_t n,
>> Sector *p)
>> +{
>> struct page *page;
>>
>> - page = read_mapping_page(mapping, (pgoff_t)(n >>
>> (PAGE_CACHE_SHIFT-9)),
>> - NULL);
>> + /* don't populate page cache for dax capable devices */
>> + if (IS_DAX(bdev->bd_inode))
>> + page = read_dax_sector(bdev, n);
>> + else
>> + page = read_pagecache_sector(bdev, n);
>> +
>
>
> Fall back to non-dax, if dax fails?

I think we need to fail hard otherwise we're back to the original
problem of confusing the dax code that expects to find an empty page
cache.

>
>> +struct page *read_dax_sector(struct block_device *bdev, sector_t n)
>> +{
>> + struct page *page = __page_cache_alloc(GFP_KERNEL | __GFP_COLD);
>
>
> Why isn't that just alloc_pages()?

Just for symmetry with the same allocation that the pagecache path
makes, but alloc_pages() works too...