I've discovered a few things since my first posting.
It doesn't have to be FIO access; I can put a printf statement at the bottom of the IRQ and it will work fine. If I remove the print statement then I just get the start condition again. Even stranger, the length of the print statement affects how much of the I2C message is transmitted or received! If the print message is just a newline character then it works great, my test program of sending or receiving 5 bytes works perfectly. If the print message is "hello" then I only get half of the message. If the print message is "hello world" then I only get two bytes of it. Extremely bizzare! There is something I'm not seeing...