btrfs: introduce btrfs_subpage for data inodes
[linux-2.6-microblaze.git] / fs / btrfs / inode.c
index 3337c8e..5522e9d 100644 (file)
@@ -4720,6 +4720,9 @@ again:
                ret = -ENOMEM;
                goto out;
        }
+       ret = set_page_extent_mapped(page);
+       if (ret < 0)
+               goto out_unlock;
 
        if (!PageUptodate(page)) {
                ret = btrfs_readpage(NULL, page);
@@ -4737,7 +4740,6 @@ again:
        wait_on_page_writeback(page);
 
        lock_extent_bits(io_tree, block_start, block_end, &cached_state);
-       set_page_extent_mapped(page);
 
        ordered = btrfs_lookup_ordered_extent(inode, block_start);
        if (ordered) {
@@ -8125,7 +8127,7 @@ static int __btrfs_releasepage(struct page *page, gfp_t gfp_flags)
 {
        int ret = try_release_extent_mapping(page, gfp_flags);
        if (ret == 1)
-               detach_page_private(page);
+               clear_page_extent_mapped(page);
        return ret;
 }
 
@@ -8285,7 +8287,7 @@ again:
        }
 
        ClearPageChecked(page);
-       detach_page_private(page);
+       clear_page_extent_mapped(page);
 }
 
 /*
@@ -8364,7 +8366,12 @@ again:
        wait_on_page_writeback(page);
 
        lock_extent_bits(io_tree, page_start, page_end, &cached_state);
-       set_page_extent_mapped(page);
+       ret2 = set_page_extent_mapped(page);
+       if (ret2 < 0) {
+               ret = vmf_error(ret2);
+               unlock_extent_cached(io_tree, page_start, page_end, &cached_state);
+               goto out_unlock;
+       }
 
        /*
         * we can't set the delalloc bits if there are pending ordered