Btrfs: do not release metadata for space cache inodes
authorJosef Bacik <jbacik@fusionio.com>
Fri, 27 Sep 2013 18:57:43 +0000 (14:57 -0400)
committerChris Mason <chris.mason@fusionio.com>
Tue, 12 Nov 2013 02:53:36 +0000 (21:53 -0500)
I've been testing our error paths and I was tripping the BUG_ON() in
drop_outstanding_extent because our outstanding_extents is 0 for space cache
inodes.  This is because we don't reserve metadata space for these inodes since
we depend on the global block reserve for our space.  To fix this we need to
make sure the DO_ACCOUNTING stuff doesn't actually call release_metadata for
space cache inodes.  With this patch I'm no longer panicing.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/inode.c

index 939dd1ff34a7b93dbc08bf00f951786f6bd61a2a..c0dcb4c3d72dab3c3d6b93c2f8e20a2cee06b1db 100644 (file)
@@ -1551,7 +1551,13 @@ static void btrfs_clear_bit_hook(struct inode *inode,
                        spin_unlock(&BTRFS_I(inode)->lock);
                }
 
-               if (*bits & EXTENT_DO_ACCOUNTING)
+               /*
+                * We don't reserve metadata space for space cache inodes so we
+                * don't need to call dellalloc_release_metadata if there is an
+                * error.
+                */
+               if (*bits & EXTENT_DO_ACCOUNTING &&
+                   root != root->fs_info->tree_root)
                        btrfs_delalloc_release_metadata(inode, len);
 
                if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID