#endif
/* We can't return bytes written larger than INT_MAX, clamp size to that */
size = std::min(size, (loff_t)INT_MAX);
- int r = _write(fh, offset, size, buf, NULL, false);
+ bufferlist bl;
+ bl.append(buf, size);
+ int r = _write(fh, offset, size, std::move(bl));
ldout(cct, 3) << "write(" << fd << ", \"...\", " << size << ", " << offset << ") = " << r << dendl;
return r;
}
if(iovcnt < 0) {
return -CEPHFS_EINVAL;
}
- loff_t totallen = 0;
+ size_t totallen = 0;
for (int i = 0; i < iovcnt; i++) {
totallen += iov[i].iov_len;
}
* 32-bit signed integers. Clamp the I/O sizes in those functions so that
* we don't do I/Os larger than the values we can return.
*/
+ bufferlist data;
if (clamp_to_int) {
- totallen = std::min(totallen, (loff_t)INT_MAX);
+ totallen = std::min(totallen, (size_t)INT_MAX);
+ size_t total_appended = 0;
+ for (int i = 0; i < iovcnt; i++) {
+ if (iov[i].iov_len > 0) {
+ if (total_appended + iov[i].iov_len >= totallen) {
+ data.append((const char *)iov[i].iov_base, totallen - total_appended);
+ break;
+ } else {
+ data.append((const char *)iov[i].iov_base, iov[i].iov_len);
+ total_appended += iov[i].iov_len;
+ }
+ }
+ }
+ } else {
+ for (int i = 0; i < iovcnt; i++) {
+ data.append((const char *)iov[i].iov_base, iov[i].iov_len);
+ }
}
if (write) {
- int64_t w = _write(fh, offset, totallen, NULL, iov, iovcnt, onfinish, do_fsync, syncdataonly);
+ int64_t w = _write(fh, offset, totallen, std::move(data), onfinish, do_fsync, syncdataonly);
ldout(cct, 3) << "pwritev(" << fh << ", \"...\", " << totallen << ", " << offset << ") = " << w << dendl;
return w;
} else {
return false;
}
-int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf,
- const struct iovec *iov, int iovcnt, Context *onfinish,
- bool do_fsync, bool syncdataonly)
+int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, bufferlist bl,
+ Context *onfinish, bool do_fsync, bool syncdataonly)
{
ceph_assert(ceph_mutex_is_locked_by_me(client_lock));
ceph_assert(in->inline_version > 0);
}
- // copy into fresh buffer (since our write may be resub, async)
- bufferlist bl;
- if (buf) {
- if (size > 0)
- bl.append(buf, size);
- } else if (iov){
- for (int i = 0; i < iovcnt; i++) {
- if (iov[i].iov_len > 0) {
- bl.append((const char *)iov[i].iov_base, iov[i].iov_len);
- }
- }
- }
-
int want, have;
if (f->mode & CEPH_FILE_MODE_LAZY)
want = CEPH_CAP_FILE_BUFFER | CEPH_CAP_FILE_LAZYIO;
tout(cct) << off << std::endl;
tout(cct) << len << std::endl;
- int r = _write(fh, off, len, data, NULL, 0);
+ bufferlist bl;
+ bl.append(data, len);
+ int r = _write(fh, off, len, std::move(bl));
ldout(cct, 3) << "ll_write " << fh << " " << off << "~" << len << " = " << r
<< dendl;
return r;
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 offset, uint64_t size, Inode *in);
- int64_t _write(Fh *fh, int64_t offset, uint64_t size, const char *buf,
- const struct iovec *iov, int iovcnt, Context *onfinish = nullptr,
- bool do_fsync = false, bool syncdataonly = false);
+ int64_t _write(Fh *fh, int64_t offset, uint64_t size, bufferlist bl,
+ Context *onfinish = nullptr, bool do_fsync = false,
+ bool syncdataonly = false);
int64_t _preadv_pwritev_locked(Fh *fh, const struct iovec *iov,
int iovcnt, int64_t offset,
bool write, bool clamp_to_int,