]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: simplify early error checking in btrfs_page_mkwrite()
authorFilipe Manana <fdmanana@suse.com>
Tue, 13 May 2025 09:27:44 +0000 (10:27 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 15 May 2025 16:24:23 +0000 (18:24 +0200)
We have this entangled error checks early at btrfs_page_mkwrite():

1) Try to reserve delalloc space by calling btrfs_delalloc_reserve_space()
   and storing the return value in the ret2 variable;

2) If the reservation succeed, call file_update_time() and store the
   return value in ret2 and also set the local variable 'reserved' to
   true (1);

3) Then do an error check on ret2 to see if any of the previous calls
   failed and if so, jump either to the 'out' label or to the
   'out_noreserve' label, depending on whether 'reserved' is true or
   not.

This is unnecessarily complex. Instead change this to a simpler and
more straightforward approach:

1) Call btrfs_delalloc_reserve_space(), if that returns an error jump to
   the 'out_noreserve' label;

2) The call file_update_time() and if that returns an error jump to the
   'out' label.

Like this there's less nested if statements, no need to use a local
variable to track if space was reserved and if statements are used only
to check errors.

Also move the call to extent_changeset_free() out of the 'out_noreserve'
label and under the 'out' label  since the changeset is allocated only if
the call to reserve delalloc space succeeded.

Reviewed-by: Qu Wenruo <wqu@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/file.c

index a2b1fc536fdd21313542d8ce1623297ec9f5fc37..9ecb9f3bd057e1939e9a6e12889ff4a7d9832d46 100644 (file)
@@ -1843,7 +1843,6 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf)
        size_t fsize = folio_size(folio);
        vm_fault_t ret;
        int ret2;
-       int reserved = 0;
        u64 reserved_space;
        u64 page_start;
        u64 page_end;
@@ -1866,17 +1865,17 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf)
         */
        ret2 = btrfs_delalloc_reserve_space(BTRFS_I(inode), &data_reserved,
                                            page_start, reserved_space);
-       if (!ret2) {
-               ret2 = file_update_time(vmf->vma->vm_file);
-               reserved = 1;
-       }
        if (ret2) {
                ret = vmf_error(ret2);
-               if (reserved)
-                       goto out;
                goto out_noreserve;
        }
 
+       ret2 = file_update_time(vmf->vma->vm_file);
+       if (ret2) {
+               ret = vmf_error(ret2);
+               goto out;
+       }
+
        /* Make the VM retry the fault. */
        ret = VM_FAULT_NOPAGE;
 again:
@@ -1972,9 +1971,9 @@ out:
        btrfs_delalloc_release_extents(BTRFS_I(inode), fsize);
        btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved, page_start,
                                     reserved_space, true);
+       extent_changeset_free(data_reserved);
 out_noreserve:
        sb_end_pagefault(inode->i_sb);
-       extent_changeset_free(data_reserved);
        return ret;
 }