bluestore: declare intrusive_ptr_* functions for Onode BlueStore.h defines intrusive_ptr_add_ref()/intrusive_ptr_release() for BlueStore::Onode at the end of the header, after the BlueStore class definition. However, OnodeRef can already be destroyed inside BlueStore, for example in the inline member function BlueStore::debug_get_onode(): > OnodeRef debug_get_onode(const coll_t& cid, const ghobject_t& hoid) { > ... > return OnodeRef(); > ... > } As a result, these functions are not visible to ADL, causing a compilation error: > error: no matching function for call to 'intrusive_ptr_release' Declare the functions as friends inside Onode, following the existing pattern used by SharedBlob and Blob. This makes them discoverable through ADL and grants access to Onode::get() and put(). Remove the old file-scope static inline definitions to avoid conflicting declarations and ambiguous overloads: > error: static declaration of 'intrusive_ptr_add_ref' follows non-static declaration > error: call to 'intrusive_ptr_add_ref' is ambiguous This issue does not apply upstream, where Onode has been moved into the bluestore namespace in BlueStore_objects.h. --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1451,6 +1451,9 @@ void get(); void put(); + friend void intrusive_ptr_add_ref(Onode *o) { o->get(); } + friend void intrusive_ptr_release(Onode *o) { o->put(); } + inline bool is_cached() const { return cached; } @@ -4236,13 +4239,6 @@ << s.values[BlueStore::volatile_statfs::STATFS_COMPRESSED_ALLOCATED]; } -static inline void intrusive_ptr_add_ref(BlueStore::Onode *o) { - o->get(); -} -static inline void intrusive_ptr_release(BlueStore::Onode *o) { - o->put(); -} - static inline void intrusive_ptr_add_ref(BlueStore::OpSequencer *o) { o->get(); }