It's strange that I could not read the file to BytesMut. But I could do it with u8 slice.
let mut f = File::open(path).unwrap();
let mut buf = BytesMut::with_capacity(1024*10);
let count = f.read(&mut buf[..]).unwrap();
println!("read {:?}", count);
The io::Read interface is not good fit for this. It only knows how to append to a Vec. Read into a Vec, and if you have to have a Buf, then convert the Vec to Buf later (I hope it has a no-copy way for these).