A method for transferring data, the method comprising: receiving, at a front end processor via a local switch , a data transfer command when a processor needs access to a block-addressable input/output, I/O, device ; 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 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 via a local switch , a data transfer command when a processor needs access to a block-addressable input/output, I/O, device ; 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 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. <EOS>