Did you perhaps transfer your image to a different card?
You may have copied a working image from one SD card to another slightly smaller card. Not all cards advertised as for instance 16 GB have the exact same number of blocks. When mounting the root partition at boot time the kernel then tries to read blocks which are beyond the size of the card.
In that case you need to shrink the Linux partition with resize2fs. Note that this only resizes the file system. You also have the shrink the partition in the partition table with parted or fdisk.
Another strategy is to take the card to a Linux PC and try to mount the root filesystem there.
You may then be able to deduce what is wrong with it, run
fsck if need be etc.