]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
FileStore: Move ftruncate to do_sparse_copy 3000/head
authorHaomai Wang <haomaiwang@gmail.com>
Sat, 6 Dec 2014 16:11:22 +0000 (00:11 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Sat, 6 Dec 2014 16:14:06 +0000 (00:14 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/os/FileStore.cc

index 285b63dc11372c8d395fa6bdf39b73ec96ae8a70..5c1e7b4ce59aa636c652a9df71810f5fc87ea248 100644 (file)
@@ -3100,10 +3100,6 @@ int FileStore::_clone(coll_t cid, const ghobject_t& oldoid, const ghobject_t& ne
       r = -errno;
       goto out3;
     }
-    r = ::ftruncate(**n, st.st_size);
-    if (r < 0) {
-      goto out3;
-    }
 
     dout(20) << "objectmap clone" << dendl;
     r = object_map->clone(oldoid, newoid, &spos);
@@ -3266,11 +3262,26 @@ int FileStore::_do_sparse_copy_range(int from, int to, uint64_t srcoff, uint64_t
   }
 
   if (r >= 0) {
-    r = written;
     if (m_filestore_sloppy_crc) {
       int rc = backend->_crc_update_clone_range(from, to, srcoff, len, dstoff);
       assert(rc >= 0);
     }
+    struct stat st;
+    r = ::fstat(to, &st);
+    if (r < 0) {
+      r = -errno;
+      derr << __func__ << ": fstat error at " << to << " " << cpp_strerror(r) << dendl;
+      goto out;
+    }
+    if (st.st_size < (int)(dstoff + len)) {
+      r = ::ftruncate(to, dstoff + len);
+      if (r < 0) {
+        r = -errno;
+        derr << __func__ << ": ftruncate error at " << dstoff+len << " " << cpp_strerror(r) << dendl;
+        goto out;
+      }
+    }
+    r = written;
   }
 
  out:
@@ -3359,7 +3370,6 @@ int FileStore::_clone_range(coll_t cid, const ghobject_t& oldoid, const ghobject
 
   int r;
   FDRef o, n;
-  struct stat st;
   r = lfn_open(cid, oldoid, false, &o);
   if (r < 0) {
     goto out2;
@@ -3374,21 +3384,6 @@ int FileStore::_clone_range(coll_t cid, const ghobject_t& oldoid, const ghobject
     goto out3;
   }
 
-  r = ::fstat(**n, &st);
-  if (r < 0) {
-    r = -errno;
-    derr << __func__ << ": fstat error at " << **n << " "<< cpp_strerror(r) << dendl;
-    goto out3;
-  }
-  if (st.st_size < (int)(dstoff + len)) {
-    r = ::ftruncate(**n, dstoff + len);
-    if (r < 0) {
-      r = -errno;
-      derr << __func__ << ": ftruncate error at " << dstoff + len << ", " << cpp_strerror(r) << dendl;
-      goto out3;
-    }
-  }
-
   // clone is non-idempotent; record our work.
   _set_replay_guard(**n, spos, &newoid);