Cannot send data via i2c to master raspberry pi

data = bus.read_i2c_block_data(0x08, 0x90, 4)

Don't use a length var for read_i2c_block_data, as odds are you're receiving more data over the bus than you're telling the hardware to expect and that causes misbehavior. Just use the address and command. The return from the call will be a 32-byte buffer, the maximum amount of data that can be sent across an I2C bus in a single exchange, so the next step afterward is to parse the buffer - I2C considers a 0xFF to be a null or not-a-character, so as long as you're sending strings (which should always end with a 0x00) and never send a 0xFF as a character, you can simply read the buffer into a string until you hit a 0xFF.

Here's how I read I2C data on a master Odroid C2 (DietPi, Python 2.7.9) from a slave Arduino Mega acting as an external watchdog:

def read_from_slave(address, command, i2cbus):
    data = ""
    result = ""
    try:
        # Read an entire 32-byte data block from the slave.
        data = i2cbus.read_i2c_block_data(address, command)

        # Since the data block can contain any character but a 255 means no
        # string character, we'll convert the series of bytes into a Python-
        # compatible string, char-by-char.
        index = 0
        while (data[index] != 255):
            result += chr(data[index])
            index += 1
        return result
    except:
        pass

The slave is configured to send literally anything and everything it's going to send via I2C, regardless of its actual type, as a string. This is because it's super-easy to "stringify" other (especially numeric) types like floats thanks to commands like dtostrf(), and it's super-easy to cast or convert types in Python. Basically the Arduino sends a number as a series of ASCII codes representing the digits of a number (including sign and decimal point) and this code converts those back to ASCII text. If the slave sent a number as ASCII-encoded digits/sign/decimal, just doing a float() cast on the returned string gives you back a workable numeric value.

Using my read function, "data = bus.read_i2c_block_data(0x08, 0x90, 4)" would become "data = read_from_slave(0x08, 0x90, bus)".

Please note that this function should NOT be used to read I2C devices that send in a clearly specified format. For best results, write handlers for them that are specific to their datastream formats. It's intended to work as a generic slave-read function for slaves that send string data, and works nicely with Arduino slaves since you can control their datastream formats and thus can "stringify" everything being sent out.