btrfs: do not BUG_ON() on failure to reserve metadata for delayed item
authorFilipe Manana <fdmanana@suse.com>
Tue, 31 May 2022 15:06:41 +0000 (16:06 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:44:35 +0000 (17:44 +0200)
At btrfs_insert_delayed_dir_index(), we don't expect the metadata
reservation for the delayed dir index item insertion to fail, because the
caller is supposed to have reserved 1 unit of metadata space for that.
All callers are able to deal with an error in case that happens, so there
is no need for something so drastic as a BUG_ON() in case of failure.
Instead just emit a warning, so that's easily noticed during development
(fstests in particular), and return the error to the caller.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c

index d9be90a..6019c35 100644 (file)
@@ -1386,10 +1386,13 @@ int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans,
 
        ret = btrfs_delayed_item_reserve_metadata(trans, dir->root, delayed_item);
        /*
-        * we have reserved enough space when we start a new transaction,
-        * so reserving metadata failure is impossible
+        * Space was reserved for a dir index item insertion when we started the
+        * transaction, so getting a failure here should be impossible.
         */
-       BUG_ON(ret);
+       if (WARN_ON(ret)) {
+               btrfs_release_delayed_item(delayed_item);
+               goto release_node;
+       }
 
        mutex_lock(&delayed_node->mutex);
        ret = __btrfs_add_delayed_insertion_item(delayed_node, delayed_item);