But file_read on file pointer doesn't work in the same way as read on file descriptor, even if it is in the same thread - right after file_open!
That would be surprising because read() just calls file_read(). I would expect the behaviors to be the same.
If there is a semaphore locking issue, I would first be suspicious of drivers/can/can.c.
Did you try enabling CAN debug. Perhaps, if you are lucky, it will show something of interest.