uint64_t trunc_size, __u32 trunc_seq,
Context *oncommit)
{
+ assert(m_ictx->owner_lock.is_locked());
uint64_t object_no = oid_to_object_no(oid.name, m_ictx->object_prefix);
write_result_d *result = new write_result_d(oid.name, oncommit);
return ++m_tid;
}
+ void LibrbdWriteback::get_client_lock() {
+ m_ictx->owner_lock.get_read();
+ }
+
+ void LibrbdWriteback::put_client_lock() {
+ m_ictx->owner_lock.put_read();
+ }
+
void LibrbdWriteback::complete_writes(const std::string& oid)
{
assert(m_lock.is_locked());
const bufferlist &bl, utime_t mtime, uint64_t trunc_size,
__u32 trunc_seq, Context *oncommit);
+ virtual void get_client_lock();
+ virtual void put_client_lock();
+
struct write_result_d {
bool done;
int ret;
void ObjectCacher::flusher_entry()
{
ldout(cct, 10) << "flusher start" << dendl;
+ writeback_handler.get_client_lock();
lock.Lock();
while (!flusher_stop) {
loff_t all = get_stat_tx() + get_stat_rx() + get_stat_clean() + get_stat_dirty();
if (!max) {
// back off the lock to avoid starving other threads
lock.Unlock();
+ writeback_handler.put_client_lock();
+ writeback_handler.get_client_lock();
lock.Lock();
continue;
}
}
if (flusher_stop)
break;
+
+ writeback_handler.put_client_lock();
flusher_cond.WaitInterval(cct, lock, utime_t(1,0));
+ lock.Unlock();
+
+ writeback_handler.get_client_lock();
+ lock.Lock();
}
/* Wait for reads to finish. This is only possible if handling
}
lock.Unlock();
+ writeback_handler.put_client_lock();
ldout(cct, 10) << "flusher finish" << dendl;
}
int op, int flags, Context *onack, Context *oncommit) {
assert(0 == "this WritebackHandler does not support the lock operation");
}
+
+ virtual void get_client_lock() {}
+ virtual void put_client_lock() {}
};
#endif