btrfs: simplify code flow in btrfs_delayed_inode_reserve_metadata
authorNikolay Borisov <nborisov@suse.com>
Mon, 22 Feb 2021 16:40:47 +0000 (18:40 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:15 +0000 (17:25 +0200)
btrfs_block_rsv_add can return only ENOSPC since it's called with
NO_FLUSH modifier. This so simplify the logic in
btrfs_delayed_inode_reserve_metadata to exploit this invariant.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ add assert and comment ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c

index 1133ddb..a40025d 100644 (file)
@@ -632,29 +632,14 @@ static int btrfs_delayed_inode_reserve_metadata(
                        return ret;
                ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes,
                                          BTRFS_RESERVE_NO_FLUSH);
-               /*
-                * Since we're under a transaction reserve_metadata_bytes could
-                * try to commit the transaction which will make it return
-                * EAGAIN to make us stop the transaction we have, so return
-                * ENOSPC instead so that btrfs_dirty_inode knows what to do.
-                */
-               if (ret == -EAGAIN) {
-                       ret = -ENOSPC;
-                       btrfs_qgroup_free_meta_prealloc(root, num_bytes);
-               }
-               if (!ret) {
-                       node->bytes_reserved = num_bytes;
-                       trace_btrfs_space_reservation(fs_info,
-                                                     "delayed_inode",
-                                                     node->inode_id,
-                                                     num_bytes, 1);
-               } else {
+               /* NO_FLUSH could only fail with -ENOSPC */
+               ASSERT(ret == 0 || ret == -ENOSPC);
+               if (ret)
                        btrfs_qgroup_free_meta_prealloc(root, num_bytes);
-               }
-               return ret;
+       } else {
+               ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, true);
        }
 
-       ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, true);
        if (!ret) {
                trace_btrfs_space_reservation(fs_info, "delayed_inode",
                                              node->inode_id, num_bytes, 1);