http://sn.1w6.org/file/mk-20140627T095400-6rvjhd9.html
@mcscx another last-resort technique can be used if the bad blocks are localized near each other: partition "around" them, by creating 2 or more partitions that avoid the bad area. That's another technique I've used successfully under DOS :) This should be possible under Linux as well - you just need to be able to calculate exactly where the bad areas are (or find a tool that shows this).