diff options
Diffstat (limited to 'fs/dax.c')
-rw-r--r-- | fs/dax.c | 23 |
1 files changed, 22 insertions, 1 deletions
@@ -58,6 +58,26 @@ static void dax_unmap_atomic(struct block_device *bdev, | |||
58 | blk_queue_exit(bdev->bd_queue); | 58 | blk_queue_exit(bdev->bd_queue); |
59 | } | 59 | } |
60 | 60 | ||
61 | struct page *read_dax_sector(struct block_device *bdev, sector_t n) | ||
62 | { | ||
63 | struct page *page = alloc_pages(GFP_KERNEL, 0); | ||
64 | struct blk_dax_ctl dax = { | ||
65 | .size = PAGE_SIZE, | ||
66 | .sector = n & ~((((int) PAGE_SIZE) / 512) - 1), | ||
67 | }; | ||
68 | long rc; | ||
69 | |||
70 | if (!page) | ||
71 | return ERR_PTR(-ENOMEM); | ||
72 | |||
73 | rc = dax_map_atomic(bdev, &dax); | ||
74 | if (rc < 0) | ||
75 | return ERR_PTR(rc); | ||
76 | memcpy_from_pmem(page_address(page), dax.addr, PAGE_SIZE); | ||
77 | dax_unmap_atomic(bdev, &dax); | ||
78 | return page; | ||
79 | } | ||
80 | |||
61 | /* | 81 | /* |
62 | * dax_clear_blocks() is called from within transaction context from XFS, | 82 | * dax_clear_blocks() is called from within transaction context from XFS, |
63 | * and hence this means the stack from this point must follow GFP_NOFS | 83 | * and hence this means the stack from this point must follow GFP_NOFS |
@@ -338,7 +358,8 @@ static int dax_radix_entry(struct address_space *mapping, pgoff_t index, | |||
338 | void *entry; | 358 | void *entry; |
339 | 359 | ||
340 | WARN_ON_ONCE(pmd_entry && !dirty); | 360 | WARN_ON_ONCE(pmd_entry && !dirty); |
341 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); | 361 | if (dirty) |
362 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); | ||
342 | 363 | ||
343 | spin_lock_irq(&mapping->tree_lock); | 364 | spin_lock_irq(&mapping->tree_lock); |
344 | 365 | ||