]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: push errors up from add_async_extent()
authorDavid Sterba <dsterba@suse.com>
Wed, 24 Jan 2024 16:26:25 +0000 (17:26 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 4 Mar 2024 15:24:50 +0000 (16:24 +0100)
The memory allocation error in add_async_extent() is not handled
properly, return an error and push the BUG_ON to the caller. Handling it
there is not trivial so at least make it visible.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index 20a66c6652a7b5054f307726f348833ca5c5e221..bda91f3100bd84685f2f4b9e0fe1aefa6e4989b4 100644 (file)
@@ -738,7 +738,8 @@ static noinline int add_async_extent(struct async_chunk *cow,
        struct async_extent *async_extent;
 
        async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS);
-       BUG_ON(!async_extent); /* -ENOMEM */
+       if (!async_extent)
+               return -ENOMEM;
        async_extent->start = start;
        async_extent->ram_size = ram_size;
        async_extent->compressed_size = compressed_size;
@@ -1025,8 +1026,9 @@ again:
         * The async work queues will take care of doing actual allocation on
         * disk for these compressed pages, and will submit the bios.
         */
-       add_async_extent(async_chunk, start, total_in, total_compressed, pages,
-                        nr_pages, compress_type);
+       ret = add_async_extent(async_chunk, start, total_in, total_compressed, pages,
+                              nr_pages, compress_type);
+       BUG_ON(ret);
        if (start + total_in < end) {
                start += total_in;
                cond_resched();
@@ -1038,8 +1040,9 @@ mark_incompressible:
        if (!btrfs_test_opt(fs_info, FORCE_COMPRESS) && !inode->prop_compress)
                inode->flags |= BTRFS_INODE_NOCOMPRESS;
 cleanup_and_bail_uncompressed:
-       add_async_extent(async_chunk, start, end - start + 1, 0, NULL, 0,
-                        BTRFS_COMPRESS_NONE);
+       ret = add_async_extent(async_chunk, start, end - start + 1, 0, NULL, 0,
+                              BTRFS_COMPRESS_NONE);
+       BUG_ON(ret);
 free_pages:
        if (pages) {
                for (i = 0; i < nr_pages; i++) {