--- y/mm/filemap.c
+++ f/mm/filemap.c
@@ -3523,16 +3523,21 @@ repeat:
 filler:
 		err = filler(file, folio);
 		if (err < 0) {
+			if (folio_test_locked(folio))
+				folio_unlock(folio);
 			folio_put(folio);
 			return ERR_PTR(err);
 		}
 
-		folio_wait_locked(folio);
 		if (!folio_test_uptodate(folio)) {
+			if (folio_test_locked(folio))
+				folio_unlock(folio);
 			folio_put(folio);
 			return ERR_PTR(-EIO);
 		}
 
+		if (folio_test_locked(folio))
+			folio_unlock(folio);
 		goto out;
 	}
 	if (folio_test_uptodate(folio))