btrfs: support page uptodate assertions in subpage mode
[linux-2.6-microblaze.git] / fs / btrfs / extent_io.c
index 7c195d8..0902d54 100644 (file)
@@ -6217,12 +6217,34 @@ int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
        return ret;
 }
 
+/*
+ * Check that the extent buffer is uptodate.
+ *
+ * For regular sector size == PAGE_SIZE case, check if @page is uptodate.
+ * For subpage case, check if the range covered by the eb has EXTENT_UPTODATE.
+ */
+static void assert_eb_page_uptodate(const struct extent_buffer *eb,
+                                   struct page *page)
+{
+       struct btrfs_fs_info *fs_info = eb->fs_info;
+
+       if (fs_info->sectorsize < PAGE_SIZE) {
+               bool uptodate;
+
+               uptodate = btrfs_subpage_test_uptodate(fs_info, page,
+                                                      eb->start, eb->len);
+               WARN_ON(!uptodate);
+       } else {
+               WARN_ON(!PageUptodate(page));
+       }
+}
+
 void write_extent_buffer_chunk_tree_uuid(const struct extent_buffer *eb,
                const void *srcv)
 {
        char *kaddr;
 
-       WARN_ON(!PageUptodate(eb->pages[0]));
+       assert_eb_page_uptodate(eb, eb->pages[0]);
        kaddr = page_address(eb->pages[0]) + get_eb_offset_in_page(eb, 0);
        memcpy(kaddr + offsetof(struct btrfs_header, chunk_tree_uuid), srcv,
                        BTRFS_FSID_SIZE);
@@ -6232,7 +6254,7 @@ void write_extent_buffer_fsid(const struct extent_buffer *eb, const void *srcv)
 {
        char *kaddr;
 
-       WARN_ON(!PageUptodate(eb->pages[0]));
+       assert_eb_page_uptodate(eb, eb->pages[0]);
        kaddr = page_address(eb->pages[0]) + get_eb_offset_in_page(eb, 0);
        memcpy(kaddr + offsetof(struct btrfs_header, fsid), srcv,
                        BTRFS_FSID_SIZE);
@@ -6257,7 +6279,7 @@ void write_extent_buffer(const struct extent_buffer *eb, const void *srcv,
 
        while (len > 0) {
                page = eb->pages[i];
-               WARN_ON(!PageUptodate(page));
+               assert_eb_page_uptodate(eb, page);
 
                cur = min(len, PAGE_SIZE - offset);
                kaddr = page_address(page);
@@ -6286,7 +6308,7 @@ void memzero_extent_buffer(const struct extent_buffer *eb, unsigned long start,
 
        while (len > 0) {
                page = eb->pages[i];
-               WARN_ON(!PageUptodate(page));
+               assert_eb_page_uptodate(eb, page);
 
                cur = min(len, PAGE_SIZE - offset);
                kaddr = page_address(page);
@@ -6344,7 +6366,7 @@ void copy_extent_buffer(const struct extent_buffer *dst,
 
        while (len > 0) {
                page = dst->pages[i];
-               WARN_ON(!PageUptodate(page));
+               assert_eb_page_uptodate(dst, page);
 
                cur = min(len, (unsigned long)(PAGE_SIZE - offset));
 
@@ -6406,7 +6428,7 @@ int extent_buffer_test_bit(const struct extent_buffer *eb, unsigned long start,
 
        eb_bitmap_offset(eb, start, nr, &i, &offset);
        page = eb->pages[i];
-       WARN_ON(!PageUptodate(page));
+       assert_eb_page_uptodate(eb, page);
        kaddr = page_address(page);
        return 1U & (kaddr[offset] >> (nr & (BITS_PER_BYTE - 1)));
 }
@@ -6431,7 +6453,7 @@ void extent_buffer_bitmap_set(const struct extent_buffer *eb, unsigned long star
 
        eb_bitmap_offset(eb, start, pos, &i, &offset);
        page = eb->pages[i];
-       WARN_ON(!PageUptodate(page));
+       assert_eb_page_uptodate(eb, page);
        kaddr = page_address(page);
 
        while (len >= bits_to_set) {
@@ -6442,7 +6464,7 @@ void extent_buffer_bitmap_set(const struct extent_buffer *eb, unsigned long star
                if (++offset >= PAGE_SIZE && len > 0) {
                        offset = 0;
                        page = eb->pages[++i];
-                       WARN_ON(!PageUptodate(page));
+                       assert_eb_page_uptodate(eb, page);
                        kaddr = page_address(page);
                }
        }
@@ -6474,7 +6496,7 @@ void extent_buffer_bitmap_clear(const struct extent_buffer *eb,
 
        eb_bitmap_offset(eb, start, pos, &i, &offset);
        page = eb->pages[i];
-       WARN_ON(!PageUptodate(page));
+       assert_eb_page_uptodate(eb, page);
        kaddr = page_address(page);
 
        while (len >= bits_to_clear) {
@@ -6485,7 +6507,7 @@ void extent_buffer_bitmap_clear(const struct extent_buffer *eb,
                if (++offset >= PAGE_SIZE && len > 0) {
                        offset = 0;
                        page = eb->pages[++i];
-                       WARN_ON(!PageUptodate(page));
+                       assert_eb_page_uptodate(eb, page);
                        kaddr = page_address(page);
                }
        }