If I understand data storage correctly, all storage devices are unreliable to some extent, which is why most have hardware-level abstraction layers. Hard drives use error correction. If a sector is read and ECC detects an error (whether it was from the original writing or from random bit flipping over time), ECC is used to try to recover from the error and that sector is potentially marked bad and remapped to the spare sector pool. Some hardware devices don't have any of that, though, especially things like flash memory on embedded systems, which gets accessed directly, with no hardware level error-checking layer between it and the kernel.
Does linux provide methods, like special filesystems or logical volumes (by logical volumes, I mean things like cryptsetup or lvm2), that can deal directly with such "raw" devices, doing all of the checksumming, bad sector remapping, error correction, etc. on the software level? Would the method of error checking depend on the type or the properties of the raw storage?