for (i = 0; i < found_folios; i++) {
                        struct folio *folio = fbatch.folios[i];
-                       u32 len = end + 1 - start;
+                       u64 range_start;
+                       u32 range_len;
 
                        if (folio == locked_folio)
                                continue;
 
-                       if (btrfs_folio_start_writer_lock(fs_info, folio, start,
-                                                         len))
-                               goto out;
-
+                       folio_lock(folio);
                        if (!folio_test_dirty(folio) || folio->mapping != mapping) {
-                               btrfs_folio_end_writer_lock(fs_info, folio, start,
-                                                           len);
+                               folio_unlock(folio);
                                goto out;
                        }
+                       range_start = max_t(u64, folio_pos(folio), start);
+                       range_len = min_t(u64, folio_pos(folio) + folio_size(folio),
+                                         end + 1) - range_start;
+                       btrfs_folio_set_writer_lock(fs_info, folio, range_start, range_len);
 
-                       processed_end = folio_pos(folio) + folio_size(folio) - 1;
+                       processed_end = range_start + range_len - 1;
                }
                folio_batch_release(&fbatch);
                cond_resched();