btrfs_truncate

Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 4d4fc48..176c6dc 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -171,20 +171,21 @@
 	struct btrfs_header *header;
 	struct buffer_head *bh;
 
-	bh = sb_find_get_block(root->fs_info->sb, blocknr);
-	if (bh) {
-		header = btrfs_buffer_header(bh);
-		if (btrfs_header_generation(header) ==
-		    root->fs_info->running_transaction->transid) {
+	if (!pending) {
+		bh = sb_find_get_block(root->fs_info->sb, blocknr);
+		if (bh) {
+			header = btrfs_buffer_header(bh);
+			if (btrfs_header_generation(header) ==
+			    root->fs_info->running_transaction->transid) {
+				brelse(bh);
+				return 0;
+			}
 			brelse(bh);
-			return 0;
 		}
-		brelse(bh);
-	}
-	if (pending)
-		err = set_radix_bit(&root->fs_info->pending_del_radix, blocknr);
-	else
 		err = set_radix_bit(&root->fs_info->pinned_radix, blocknr);
+	} else {
+		err = set_radix_bit(&root->fs_info->pending_del_radix, blocknr);
+	}
 	BUG_ON(err);
 	return 0;
 }
@@ -223,6 +224,7 @@
 	BUG_ON(ei->refs == 0);
 	refs = btrfs_extent_refs(ei) - 1;
 	btrfs_set_extent_refs(ei, refs);
+	mark_buffer_dirty(path.nodes[0]);
 	if (refs == 0) {
 		u64 super_blocks_used;
 
@@ -240,7 +242,6 @@
 		if (ret)
 			BUG();
 	}
-	mark_buffer_dirty(path.nodes[0]);
 	btrfs_release_path(extent_root, &path);
 	finish_current_insert(trans, extent_root);
 	return ret;