Sfoglia il codice sorgente

Btrfs: Fix releasepage to properly keep dirty and writeback pages

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason 16 anni fa
parent
commit
98509cfc5a
2 ha cambiato i file con 6 aggiunte e 1 eliminazioni
  1. 4 1
      fs/btrfs/disk-io.c
  2. 2 0
      fs/btrfs/inode.c

+ 4 - 1
fs/btrfs/disk-io.c

@@ -346,7 +346,7 @@ int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
 	eb = alloc_extent_buffer(tree, start, len, page, GFP_NOFS);
 
 	found_start = btrfs_header_bytenr(eb);
-	if (found_start != start) {
+	if (0 && found_start != start) {
 		printk("bad tree block start %llu %llu\n",
 		       (unsigned long long)found_start,
 		       (unsigned long long)eb->start);
@@ -592,6 +592,9 @@ static int btree_releasepage(struct page *page, gfp_t gfp_flags)
 	struct extent_map_tree *map;
 	int ret;
 
+	if (PageWriteback(page) || PageDirty(page))
+	    return 0;
+
 	tree = &BTRFS_I(page->mapping->host)->io_tree;
 	map = &BTRFS_I(page->mapping->host)->extent_tree;
 

+ 2 - 0
fs/btrfs/inode.c

@@ -3060,6 +3060,8 @@ static int __btrfs_releasepage(struct page *page, gfp_t gfp_flags)
 
 static int btrfs_releasepage(struct page *page, gfp_t gfp_flags)
 {
+	if (PageWriteback(page) || PageDirty(page))
+		return 0;
 	return __btrfs_releasepage(page, gfp_flags);
 }