ceph_sync_write has assumed that a zero result in req->r_result means success. Testing with a recent cluster however shows the OSD returning a non-zero length written here. I'm not sure whether and when this changed, but fix the code to accept either result. Assume a negative result means error, and anything else is a success. If we're given a short length, then return a short write. Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> --- fs/ceph/file.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 86265713a743..c0b2c8968be9 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -1632,11 +1632,19 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos, req->r_end_latency, len, ret); out: ceph_osdc_put_request(req); - if (ret != 0) { + if (ret < 0) { ceph_set_error_write(ci); break; } + /* + * FIXME: it's unclear whether all OSD versions return the + * length written on a write. For now, assume that a 0 return + * means that everything got written. + */ + if (ret && ret < len) + len = ret; + ceph_clear_error_write(ci); pos += len; written += len; -- 2.37.2