Btrfs: always pin metadata in discard mode
authorChris Mason <chris.mason@oracle.com>
Wed, 14 Oct 2009 13:38:28 +0000 (09:38 -0400)
committerChris Mason <chris.mason@oracle.com>
Wed, 14 Oct 2009 14:32:50 +0000 (10:32 -0400)
We have an optimization in btrfs to allow blocks to be
immediately freed if they were allocated in this transaction and never
written.  Otherwise they are pinned and freed when the transaction
commits.

This isn't optimal for discard mode because immediately freeing
them means immediately discarding them.  It is better to give the
block to the pinning code and letting the (slow) discard happen later.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c

index d4a35283d99e13e7cd9f4ad27140d51789ceed37..c56f91639dc13562dbe107dcd5d2d0f0e72683eb 100644 (file)
@@ -3686,6 +3686,14 @@ static int pin_down_bytes(struct btrfs_trans_handle *trans,
        if (is_data)
                goto pinit;
 
+       /*
+        * discard is sloooow, and so triggering discards on
+        * individual btree blocks isn't a good plan.  Just
+        * pin everything in discard mode.
+        */
+       if (btrfs_test_opt(root, DISCARD))
+               goto pinit;
+
        buf = btrfs_find_tree_block(root, bytenr, num_bytes);
        if (!buf)
                goto pinit;