]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
client: do not move f->pos untill success write
authorTang Junhui <tangjunhui@sangfor.com>
Thu, 15 Nov 2018 07:07:24 +0000 (15:07 +0800)
committerJunhui Tang <tangjunhui@sangfor.com.cn>
Sun, 9 Dec 2018 02:09:37 +0000 (10:09 +0800)
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
src/client/Client.cc

index 426abac9cfe3cb9d27b639798f4a63ee9bbc8cd4..1f09e363db6de41dd9515cc2600d2f6a1aca3b60 100644 (file)
@@ -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;