The FD is always going to be in-cache within a single operation unless you allow more simultaneous ops than open FDs in the cache (and in that case, the op's FDRef will hold it open anyway). That's one of the reasons we want to have it, because then we don't need to do as many syscalls per op in order to obtain the descriptors (plus, with our implementation we handle all the lifetime stuff that is broken by this patch series). Plus, as you say, the cache makes it easy to limit the number of descriptors in use by the OSD.
Finally it's important for reasons relating to spinning disk access that we really can't set aside.

If as you suggest elsewhere and eliminate passing the fd out to the OSD (as a partial fix for the encapsulation issue), then the only advantages this version holds are
1) not using our (currently slow) FDCache (but that can be fixed by making the fdcache fast).
2) using the faster lookup functions that don't do as much duplicate string manipulation.