size_t from = offset_in_folio(folio, pos), to = from + len;
        size_t poff, plen;
 
-       if (folio_test_uptodate(folio))
+       /*
+        * If the write completely overlaps the current folio, then
+        * entire folio will be dirtied so there is no need for
+        * per-block state tracking structures to be attached to this folio.
+        */
+       if (pos <= folio_pos(folio) &&
+           pos + len >= folio_pos(folio) + folio_size(folio))
                return 0;
-       folio_clear_error(folio);
 
        ifs = ifs_alloc(iter->inode, folio, iter->flags);
        if ((iter->flags & IOMAP_NOWAIT) && !ifs && nr_blocks > 1)
                return -EAGAIN;
 
+       if (folio_test_uptodate(folio))
+               return 0;
+       folio_clear_error(folio);
+
        do {
                iomap_adjust_read_range(iter->inode, folio, &block_start,
                                block_end - block_start, &poff, &plen);