mirror of
https://github.com/ceph/ceph
synced 2025-01-19 09:32:00 +00:00
client: do not move f->pos untill success write
writes maybe failed in Client::_write, so do not move f->pos when write successfully. Signed-off-by: Junhui Tang <tangjunhui@sangfor.com.cn> Fixes: https://tracker.ceph.com/issues/37546
This commit is contained in:
parent
578f7e082e
commit
0fdfc0c5bc
@ -9392,6 +9392,8 @@ int Client::_preadv_pwritev(int fd, const struct iovec *iov, unsigned iovcnt, in
|
||||
int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf,
|
||||
const struct iovec *iov, int iovcnt)
|
||||
{
|
||||
uint64_t fpos = 0;
|
||||
|
||||
if ((uint64_t)(offset+size) > mdsmap->get_max_filesize()) //too large!
|
||||
return -EFBIG;
|
||||
|
||||
@ -9430,7 +9432,7 @@ int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf,
|
||||
}
|
||||
}
|
||||
offset = f->pos;
|
||||
f->pos = offset+size;
|
||||
fpos = offset+size;
|
||||
unlock_fh_pos(f);
|
||||
}
|
||||
|
||||
@ -9569,6 +9571,11 @@ success:
|
||||
lat -= start;
|
||||
logger->tinc(l_c_wrlat, lat);
|
||||
|
||||
if (fpos) {
|
||||
lock_fh_pos(f);
|
||||
f->pos = fpos;
|
||||
unlock_fh_pos(f);
|
||||
}
|
||||
totalwritten = size;
|
||||
r = (int64_t)totalwritten;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user