A method for transferring data, the method comprising: receiving, at a front end processor (350, 465) via a local switch (330, 480), a data transfer command when a processor (322, 340, 450, 470) needs access to a block-addressable input/output, I/O, device (334, 462); byte addressable processing, by the front end processor, in response to the data transfer command requiring byte addressable processing being received via a first path; checking if a byte requested in the data transfer command is in a cache (352, 467) associated with the front end processor in the event of byte addressable processing; when the data transfer command is a read: reading a block containing the byte from the block-addressable I/O device in the event the byte is absent in the cache; and directly transferring, from the front end processor via the local switch, the byte to a target processor in response to the requested byte being present in the cache; block addressable processing, by the front end processor, in response to the data transfer command requiring block addressable processing being received via a second path; checking if a requested block in the data transfer command is in a cache associated with the front end processor in the event of block addressable processing; and reading the requested block from the device and then transferring, from the front end processor via the local switch to the target processor, the requested block via block I/O processing if the requested block is not present in the cache or transferring the requested block via block I/O processing if the requested block is present in the cache. receiving, at a front end processor (350, 465) via a local switch (330, 480), a data transfer command when a processor (322, 340, 450, 470) needs access to a block-addressable input/output, I/O, device (334, 462); byte addressable processing, by the front end processor, in response to the data transfer command requiring byte addressable processing being received via a first path; checking if a byte requested in the data transfer command is in a cache (352, 467) associated with the front end processor in the event of byte addressable processing; when the data transfer command is a read: reading a block containing the byte from the block-addressable I/O device in the event the byte is absent in the cache; and directly transferring, from the front end processor via the local switch, the byte to a target processor in response to the requested byte being present in the cache; reading a block containing the byte from the block-addressable I/O device in the event the byte is absent in the cache; and directly transferring, from the front end processor via the local switch, the byte to a target processor in response to the requested byte being present in the cache; block addressable processing, by the front end processor, in response to the data transfer command requiring block addressable processing being received via a second path; checking if a requested block in the data transfer command is in a cache associated with the front end processor in the event of block addressable processing; and reading the requested block from the device and then transferring, from the front end processor via the local switch to the target processor, the requested block via block I/O processing if the requested block is not present in the cache or transferring the requested block via block I/O processing if the requested block is present in the cache.