]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't decrease file size when recovering file 709/head
authorYan, Zheng <zheng.z.yan@intel.com>
Fri, 11 Oct 2013 07:13:22 +0000 (15:13 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Fri, 11 Oct 2013 09:13:11 +0000 (17:13 +0800)
Otherwise we may truncate sparse file to wrong size

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/Locker.cc
src/mds/MDCache.cc

index 19c9176f4141202a2783d4060d2dad54ecdb3525..7f85251971494ee70f252fa1382ed9b8a777f026 100644 (file)
@@ -2042,10 +2042,15 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock,
   inode_t *latest = in->get_projected_inode();
   map<client_t, client_writeable_range_t> new_ranges;
   uint64_t size = latest->size;
-  if (update_size)
-    size = new_size;
   bool new_max = update_max;
 
+  if (update_size) {
+    new_size = size = MAX(size, new_size);
+    new_mtime = MAX(new_mtime, latest->mtime);
+    if (latest->size == new_size && latest->mtime == new_mtime)
+      update_size = false;
+  }
+
   uint64_t client_range_size = update_max ? new_max_size : size;
 
   calc_new_client_ranges(in, client_range_size, new_ranges);
index 9dc1229fbb96336a99b045fe965734acaa48d3f6..c83bfcc71541e9ea45759d5ae3d416598d2dcf73 100644 (file)
@@ -5787,21 +5787,15 @@ void MDCache::do_file_recover()
       dout(10) << "do_file_recover skipping " << in->inode.size
               << " " << *in << dendl;
       in->state_clear(CInode::STATE_RECOVERING);
+      mds->locker->eval(in, CEPH_LOCK_IFILE);
       in->auth_unpin(this);
-      if (in->filelock.is_stable()) {
-       bool need_issue = false;
-       mds->locker->eval(&in->filelock, &need_issue);
-       if (in->is_head() && need_issue)
-         mds->locker->issue_caps(in);
-      } else
-       mds->locker->eval_gather(&in->filelock);
     }
   }
 }
 
 void MDCache::_recovered(CInode *in, int r, uint64_t size, utime_t mtime)
 {
-  dout(10) << "_recovered r=" << r << " size=" << in->inode.size << " mtime=" << in->inode.mtime
+  dout(10) << "_recovered r=" << r << " size=" << size << " mtime=" << mtime
           << " for " << *in << dendl;
 
   if (r != 0) {
@@ -5823,6 +5817,7 @@ void MDCache::_recovered(CInode *in, int r, uint64_t size, utime_t mtime)
   } else {
     // journal
     mds->locker->check_inode_max_size(in, true, true, size, false, 0, mtime);
+    mds->locker->eval(in, CEPH_LOCK_IFILE);
     in->auth_unpin(this);
   }