SD::begin() looks like this:
boolean SDClass::begin(uint8_t csPin) {
/*
Performs the initialisation required by the sdfatlib library.
Return true if initialization succeeds, false otherwise.
*/
return card.init(SPI_HALF_SPEED, csPin) &&
volume.init(card) &&
root.openRoot(volume);
}
So, I presume that initializing the card more than once, or initializing the volume more than once, or opening the root more than once (especially as you don't close it), or more than one of the operations fails.
Moving the call to setup() means that you don't do any of those things more than once.