--file->refs;
if (file->refs == 0) {
dout(20) << __func__ << " destroying " << file->fnode << dendl;
+ assert(file->num_reading.read() == 0);
log_t.op_file_remove(file->fnode.ino);
for (auto r : file->fnode.extents) {
alloc[r.bdev]->release(r.offset, r.length);
Mutex::Locker l(h->lock);
dout(10) << __func__ << " h " << h << " " << off << "~" << len
<< " from " << h->file->fnode << dendl;
+
+ h->file->num_reading.inc();
+
if (!h->ignore_eof &&
off + len > h->file->fnode.size) {
if (off > h->file->fnode.size)
dout(20) << __func__ << " got " << ret << dendl;
assert(!outbl || (int)outbl->length() == ret);
+ h->file->num_reading.dec();
return ret;
}
<< " " << offset << "~" << length
<< " to " << h->file->fnode << dendl;
assert(!h->file->deleted);
+ assert(h->file->num_readers.read() == 0);
if (offset + length <= h->pos)
return 0;
boost::intrusive::list_member_hook<> dirty_item;
atomic_t num_readers, num_writers;
+ atomic_t num_reading;
File()
: RefCountedObject(0),
~File() {
assert(num_readers.read() == 0);
assert(num_writers.read() == 0);
+ assert(num_reading.read() == 0);
}
friend void intrusive_ptr_add_ref(File *f) {