The difference is that with the fix, PostgreSQL should not silently lose data (confirmed transactions).
What was possible before is:
1) transaction committed OK (which involves fsync of WAL, but that's it)
2) during checkpoint (essentially asynchronous writes to data files in the background), something went wrong and OS just discarded the dirty pages on fsync()
3) PostgreSQL assumed it can retry the fsync and the pages will be written again
So in the end, the contents of data files mismatched what's in WAL.
What this change does is it "crashes" the database after step (2), forcing the database into a recovery which re-applies the writes done in (1) from WAL. Of course, if the I/O error is permanent, this this won't change a thing. But PostgreSQL won't lie to you returning stale data etc.
Note: This assumes all the layers (notably kernel + filesystem) do the right thing, i.e. report errors reliably. That may or may not be the case, depending on the kernel version etc.