Long story short alot of people are plagued by this, I found a very simple work around is the following.
It will let you ignore the error and keep tx/rx-ing, calling i2cdetect seems to reinitialize the bus somehow instead of the arduino disappearing from it.
i posted an explanation of how i found this solution here (waiting mod approval right now)
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=41&t=52517
try:
bus.write_i2c_block_data(address, signal, data)
except IOError:
subprocess.call(['i2cdetect', '-y', '1'])
flag = 1 #optional flag to signal your code to resend or something
Even though this allows the Pi to keep transmitting bad data is still being sent to the arduino. The simplest way I found to get around this was to add an extra check-sum byte to the end of my data blocks.
I added up each byte of the message inside a byte variable allowing the value to rollover, then assign the check-sum byte whatever value necessary to sum the whole message out to zero.
The arduino can then check each incoming transmission by summing all the bytes. If the message does not sum out to zero, it is ignored as an erroneous transmission.
I also assigned my messages a one byte message id which increments after each successful transmission, eliminating the possibility of accidental double sends. But that may not really be necessary.
bus = SMBus(1)
instead ofbus = SMBus(0)
(I'm using the 512 MB RPi). I don't know if this is the solution to your problem.