There's another side to this and that I am not sure it is a backend crash.
Here is what I did to reproduce:
2 virtual disk images: 100mb for main data, 40 MB for WAL. work_mem set to 256MB. The idea is to test different out of space conditions.
Create table as ...; drop table; select pg_size_pretty(pg_current_xlog_location() - '0/0');
I played around with parameters to determine how different kinds of out of space errors were handled.
1. running out of temp space was cleaned up without a server restart needed.
2. A relation running out of disk space *seemed* to get cleaned up.
3. Running out of WAL space left *both* temp and non-temp files.
I wonder about a different solution. Would it be possible to special case vacuum to check for and remove (or just move to where they can be removed) files when vacuuming pg_class? At the point we are vacuuming pg_class, we ought to be able to know that a relfilenode shouldn't be used anymore, right?