if (objectcacher->file_is_cached(&in->oset, &in->layout, in->snapid, off, min))
ldout(cct, 20) << "readahead already have min" << dendl;
else {
- objectcacher->file_read(&in->oset, &in->layout, in->snapid, off, l, NULL, 0, 0);
- ldout(cct, 20) << "readahead initiated" << dendl;
+ Context *onfinish = new C_Readahead(this, in);
+ int r = objectcacher->file_read(&in->oset, &in->layout, in->snapid,
+ off, l,
+ NULL, 0, onfinish);
+ if (r == 0) {
+ ldout(cct, 20) << "readahead initiated, c " << onfinish << dendl;
+ in->get();
+ } else {
+ ldout(cct, 20) << "readahead was no-op, already cached" << dendl;
+ delete onfinish;
+ }
}
}
}
Fh *_create_fh(Inode *in, int flags, int cmode);
int _release_fh(Fh *fh);
+
+ struct C_Readahead : public Context {
+ Client *client;
+ Inode *inode;
+ C_Readahead(Client *c, Inode *i)
+ : client(c),
+ inode(i) { }
+ void finish(int r) {
+ lsubdout(client->cct, client, 20) << "C_Readahead on " << inode << dendl;
+ client->put_inode(inode, 1);
+ }
+ };
+
int _read_sync(Fh *f, uint64_t off, uint64_t len, bufferlist *bl);
int _read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl);