return out;
}
-void BlueFS::_drop_link_D(FileRef file)
+void BlueFS::_drop_link_DF(FileRef file)
{
dout(20) << __func__ << " had refs " << file->refs
<< " on " << lock_fnode_print(file) << dendl;
log.t.op_file_remove(file->fnode.ino);
nodes.file_map.erase(file->fnode.ino);
logger->set(l_bluefs_num_files, nodes.file_map.size());
- file->deleted = true;
-
std::lock_guard dl(dirty.lock);
+ std::lock_guard fl(file->lock);
+ // setting `deleted` is under log+nodes+dirty+file locks
+ // so it is enough to held one of those locks to make sure it does not change
+ file->deleted = true;
for (auto& r : file->fnode.extents) {
dirty.pending_release[r.bdev].insert(r.offset, r.length);
}
<< " to " << h->file->fnode
<< " hint " << h->file->vselector_hint
<< dendl;
- if (h->file->deleted) {
- dout(10) << __func__ << " deleted, no-op" << dendl;
- return 0;
- }
bool buffered = cct->_conf->bluefs_buffered_io;
<< dendl;
}
std::lock_guard file_lock(h->file->lock);
+ if (h->file->deleted) {
+ dout(10) << __func__ << " deleted, no-op" << dendl;
+ return 0;
+ }
ceph_assert(offset <= h->file->fnode.size);
uint64_t allocated = h->file->fnode.get_allocated();
{
std::lock_guard hl(h->lock);
auto& fnode = h->file->fnode;
- dout(10) << __func__ << " 0x" << std::hex << offset << std::dec
- << " file " << fnode << dendl;
- if (h->file->deleted) {
- dout(10) << __func__ << " deleted, no-op" << dendl;
- return 0;
- }
// we never truncate internal log files
ceph_assert(fnode.ino > 1);
+ dout(10) << __func__ << " 0x" << std::hex << offset << std::dec
+ << " file " << fnode << dendl;
+
// truncate off unflushed data?
if (h->pos < offset &&
h->pos + h->get_buffer_length() > offset) {
{
std::lock_guard ll(log.lock);
std::lock_guard dl(dirty.lock);
+ if (h->file->deleted) {
+ dout(10) << __func__ << " deleted, no-op" << dendl;
+ return 0;
+ }
bool changed_extents = false;
vselector->sub_usage(h->file->vselector_hint, fnode);
uint64_t x_off = 0;
<< " already exists, unlinking" << dendl;
ceph_assert(q->second != file);
log.t.op_dir_unlink(new_dirname, new_filename);
- _drop_link_D(q->second);
+ _drop_link_DF(q->second);
}
dout(10) << __func__ << " " << new_dirname << "/" << new_filename << " "
}
dir->file_map.erase(string{filename});
log.t.op_dir_unlink(dirname, filename);
- _drop_link_D(file);
+ _drop_link_DF(file);
+
return 0;
}