Btrfs: fix free space leak
authorJosef Bacik <jbacik@redhat.com>
Tue, 18 Nov 2008 02:11:49 +0000 (21:11 -0500)
committerChris Mason <chris.mason@oracle.com>
Tue, 18 Nov 2008 02:11:49 +0000 (21:11 -0500)
In my batch delete/update/insert patch I introduced a free space leak.  The
extent that we do the original search on in free_extents is never pinned, so we
always update the block saying that it has free space, but the free space never
actually gets added to the free space tree, since op->del will always be 0 and
it's never actually added to the pinned extents tree.

This patch fixes this problem by making sure we call pin_down_bytes on the
pending extent op and set op->del to the return value of pin_down_bytes so
update_block_group is called with the right value.  This seems to fix the case
where we were getting ENOSPC when there was plenty of space available.

Signed-off-by: Josef Bacik <jbacik@redhat.com>
fs/btrfs/extent-tree.c

index 197422c1dc4b384cda45c95ae2fa5c26c30d7dde..6c29669d81a29e7bd78db36c6d0fea099cd7026c 100644 (file)
@@ -999,6 +999,14 @@ search:
                path->slots[0] = extent_slot;
                bytes_freed = op->num_bytes;
 
+               mutex_lock(&info->pinned_mutex);
+               ret = pin_down_bytes(trans, extent_root, op->bytenr,
+                                    op->num_bytes, op->level >=
+                                    BTRFS_FIRST_FREE_OBJECTID);
+               mutex_unlock(&info->pinned_mutex);
+               BUG_ON(ret < 0);
+               op->del = ret;
+
                /*
                 * we need to see if we can delete multiple things at once, so
                 * start looping through the list of extents we are wanting to