@@ -1642,21 +1642,20 @@ static noinline int search_ioctl(struct inode *inode,
key.offset = sk->min_offset;
while (1) {
- ret = -EFAULT;
/*
* Ensure that the whole user buffer is faulted in at sub-page
* granularity, otherwise the loop may live-lock.
*/
if (fault_in_subpage_writeable(ubuf + sk_offset,
- *buf_size - sk_offset))
+ *buf_size - sk_offset)) {
+ ret = -EFAULT;
break;
+ }
ret = btrfs_search_forward(root, &key, path, sk->min_transid);
- if (ret != 0) {
- if (ret > 0)
- ret = 0;
- goto err;
- }
+ if (ret)
+ break;
+
ret = copy_to_sk(path, &key, sk, buf_size, ubuf,
&sk_offset, &num_found);
btrfs_release_path(path);
@@ -1666,7 +1665,7 @@ static noinline int search_ioctl(struct inode *inode,
}
if (ret > 0)
ret = 0;
-err:
+
sk->nr_items = num_found;
btrfs_put_root(root);
btrfs_free_path(path);
This commit addresses two code issues in the search_ioctl() function: 1. Move the assignment of ret = -EFAULT to within the error condition check in fault_in_subpage_writeable(). The previous placement outside the condition could lead to the error value being overwritten by subsequent assignments, cause unnecessary assignments. 2. Simplify loop exit logic by removing redundant `goto`. The original code used `goto err` to bypass post-loop processing after handling errors from `btrfs_search_forward()`. However, the loop's termination naturally falls through to the post-loop section, which already handles `ret` values. Replacing `goto err` with `break` eliminates redundant control flow, consolidates error handling, and makes the loop's exit conditions explicit. The changes ensure proper error propagation and make the loop's exit conditions clearer while maintaining functional equivalence. Signed-off-by: Sun YangKai <sunk67188@gmail.com> --- fs/btrfs/ioctl.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)