}
int64_t Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl,
- Context *onfinish)
+ Context *onfinish, bool read_for_write)
{
ceph_assert(ceph_mutex_is_locked_by_me(client_lock));
ldout(cct, 10) << __func__ << " " << *in << " " << offset << "~" << size << dendl;
- if ((f->mode & CEPH_FILE_MODE_RD) == 0)
+ if ((f->mode & CEPH_FILE_MODE_RD) == 0 && !read_for_write)
return -EBADF;
//bool lazy = f->mode == CEPH_FILE_MODE_LAZY;
return 0;
}
-int Client::WriteEncMgr::read_async(uint64_t off, uint64_t len, bufferlist *bl,
+int Client::WriteEncMgr::read(uint64_t off, uint64_t len, bufferlist *bl,
iofinish_method_ctx<WriteEncMgr> *ioctx)
{
- ldout(cct, 10) << __func__ << dendl;
+ ldout(cct, 20) << __func__ << dendl;
get();
if (off >= in->size) {
return 0;
}
- int r = clnt->_read_async(f, off, len, bl, ioctx->ctx());
+ int r = clnt->_read(f, off, len, bl, ioctx->ctx(), true);
if (r < 0) {
ioctx->cancel(r);
put();
if (read_start_size > 0) {
finish_read_start_ctx.reset(new iofinish_method_ctx<WriteEncMgr>(*this, &WriteEncMgr::finish_read_start_cb, &aioc));
- r = read_async(start_block_ofs, read_start_size, &startbl, finish_read_start_ctx.get());
+ r = read(start_block_ofs, read_start_size, &startbl, finish_read_start_ctx.get());
if (r < 0) {
finish_read_start_ctx.reset();
if (need_read_end) {
finish_read_end_ctx.reset(new iofinish_method_ctx<WriteEncMgr>(*this, &WriteEncMgr::finish_read_end_cb, &aioc));
- r = read_async(end_block_ofs, FSCRYPT_BLOCK_SIZE, &endbl, finish_read_end_ctx.get());
+ r = read(end_block_ofs, FSCRYPT_BLOCK_SIZE, &endbl, finish_read_end_ctx.get());
if (r < 0) {
finish_read_end_ctx.reset();
return is_finished;
}
- int read_async(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx<WriteEncMgr> *ioctx);
+ int read(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx<WriteEncMgr> *ioctx);
protected:
virtual int do_write() = 0;
loff_t _lseek(Fh *fh, loff_t offset, int whence);
int64_t _read(Fh *fh, int64_t offset, uint64_t size, bufferlist *bl,
- Context *onfinish = nullptr);
+ Context *onfinish = nullptr, bool read_for_write = false);
void do_readahead(Fh *f, Inode *in, uint64_t off, uint64_t len);
int64_t _write_success(Fh *fh, utime_t start, uint64_t fpos,
int64_t request_offset, uint64_t request_size,