}
Client::C_Readahead::C_Readahead(Client *c, Fh *f) :
- client(c), f(f) {
- f->get();
+ client(c), f(f) {
+ f->get();
+ f->readahead.inc_pending();
+}
+
+Client::C_Readahead::~C_Readahead() {
+ f->readahead.dec_pending();
+ client->_put_fh(f);
}
void Client::C_Readahead::finish(int r) {
lgeneric_subdout(client->cct, client, 20) << "client." << client->get_nodeid() << " " << "C_Readahead on " << f->inode << dendl;
client->put_cap_ref(f->inode.get(), CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE);
- f->readahead.dec_pending();
- client->_put_fh(f);
}
int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl)
ldout(cct, 20) << "readahead " << readahead_extent.first << "~" << readahead_extent.second
<< " (caller wants " << off << "~" << len << ")" << dendl;
Context *onfinish2 = new C_Readahead(this, f);
- f->readahead.inc_pending();
int r2 = objectcacher->file_read(&in->oset, &in->layout, in->snapid,
readahead_extent.first, readahead_extent.second,
NULL, 0, onfinish2);
ldout(cct, 20) << "readahead initiated, c " << onfinish2 << dendl;
get_cap_ref(in, CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE);
} else {
- f->readahead.dec_pending();
ldout(cct, 20) << "readahead was no-op, already cached" << dendl;
delete onfinish2;
}