void BlueFS::add_block_extent(unsigned id, uint64_t offset, uint64_t length)
{
- std::lock_guard<std::mutex> l(lock);
+ std::unique_lock<std::mutex> l(lock);
dout(1) << __func__ << " bdev " << id
<< " 0x" << std::hex << offset << "~" << length << std::dec
<< dendl;
if (alloc.size()) {
log_t.op_alloc_add(id, offset, length);
- int r = _flush_and_sync_log();
+ int r = _flush_and_sync_log(l);
assert(r == 0);
alloc[id]->init_add_free(offset, length);
}
int BlueFS::reclaim_blocks(unsigned id, uint64_t want,
uint64_t *offset, uint32_t *length)
{
- std::lock_guard<std::mutex> l(lock);
+ std::unique_lock<std::mutex> l(lock);
dout(1) << __func__ << " bdev " << id
<< " want 0x" << std::hex << want << std:: dec << dendl;
assert(id < alloc.size());
block_all[id].erase(*offset, *length);
block_total[id] -= *length;
log_t.op_alloc_rm(id, *offset, *length);
- r = _flush_and_sync_log();
+ r = _flush_and_sync_log(l);
assert(r == 0);
if (logger)
int BlueFS::mkfs(uuid_d osd_uuid)
{
- std::lock_guard<std::mutex> l(lock);
+ std::unique_lock<std::mutex> l(lock);
dout(1) << __func__
<< " osd_uuid " << osd_uuid
<< dendl;
log_t.op_alloc_add(bdev, q.get_start(), q.get_len());
}
}
- _flush_and_sync_log();
+ _flush_and_sync_log(l);
// write supers
super.log_fnode = log_file->fnode;
}
}
-int BlueFS::_flush_and_sync_log()
+int BlueFS::_flush_and_sync_log(std::unique_lock<std::mutex>& l)
{
uint64_t seq = log_t.seq = ++log_seq;
log_t.uuid = super.uuid;
return 0;
}
-void BlueFS::_fsync(FileWriter *h)
+void BlueFS::_fsync(FileWriter *h, std::unique_lock<std::mutex>& l)
{
dout(10) << __func__ << " " << h << " " << h->file->fnode << dendl;
_flush(h, true);
uint64_t s = log_seq;
dout(20) << __func__ << " file metadata was dirty (" << old_dirty_seq
<< ") on " << h->file->fnode << ", flushing log" << dendl;
- _flush_and_sync_log();
+ _flush_and_sync_log(l);
assert(h->file->dirty_seq == 0 || // cleaned
h->file->dirty_seq > s); // or redirtied by someone else
}
void BlueFS::sync_metadata()
{
- std::lock_guard<std::mutex> l(lock);
+ std::unique_lock<std::mutex> l(lock);
if (log_t.empty()) {
dout(10) << __func__ << " - no pending log events" << dendl;
return;
p->commit_start();
}
}
- _flush_and_sync_log();
+ _flush_and_sync_log(l);
for (auto p : alloc) {
if (p) {
p->commit_finish();
int _flush_range(FileWriter *h, uint64_t offset, uint64_t length);
int _flush(FileWriter *h, bool force);
void wait_for_aio(FileWriter *h); // safe to call without a lock
- void _fsync(FileWriter *h);
+ void _fsync(FileWriter *h, std::unique_lock<std::mutex>& l);
- int _flush_and_sync_log();
+ int _flush_and_sync_log(std::unique_lock<std::mutex>& l);
uint64_t _estimate_log_size();
void _maybe_compact_log();
void _compact_log();
_flush_range(h, offset, length);
}
void fsync(FileWriter *h) {
- std::lock_guard<std::mutex> l(lock);
- _fsync(h);
+ std::unique_lock<std::mutex> l(lock);
+ _fsync(h, l);
}
int read(FileReader *h, FileReaderBuffer *buf, uint64_t offset, size_t len,
bufferlist *outbl, char *out) {