]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use null snap context for purge if no realm
authorSage Weil <sage@newdream.net>
Wed, 12 Nov 2008 18:23:15 +0000 (10:23 -0800)
committerSage Weil <sage@newdream.net>
Wed, 12 Nov 2008 21:09:47 +0000 (13:09 -0800)
The inode may be unlinked, e.g. when we are replaying a journaled
purge_inode EUpdate.  The snapc is not really important, as the
OSD will use the newer snapc it has for the object.  And we only
really care when we're purging the HEAD anyway.

src/mds/MDCache.cc

index df3a8d1bfe9520176d6e4c5d24d257ba2f664244..3326b5e4808e165a28ee0cc346e99eccbce7273e 100644 (file)
@@ -4081,16 +4081,23 @@ void MDCache::purge_inode(CInode *in, loff_t newsize, loff_t oldsize, LogSegment
 
 void MDCache::_do_purge_inode(CInode *in, loff_t newsize, loff_t oldsize)
 {
+  SnapContext nullsnap;
   in->get(CInode::PIN_PURGING);
 
   // remove
   if (newsize < oldsize) {
     SnapRealm *realm = in->find_snaprealm();
-    assert(realm);
-    dout(10) << "_do_purge_inode realm " << *realm << dendl;
-    const SnapContext& snapc = realm->get_snap_context();
+    const SnapContext *snapc;
+    if (realm) {
+      dout(10) << "_do_purge_inode realm " << *realm << dendl;
+      snapc = &realm->get_snap_context();
+    } else {
+      dout(10) << "_do_purge_inode NO realm, using null context" << dendl;
+      snapc = &nullsnap;
+      assert(in->last == CEPH_NOSNAP);
+    }
     dout(10) << "_do_purge_inode snapc " << snapc << " on " << *in << dendl;
-    mds->filer->remove(in->inode.ino, &in->inode.layout, snapc,
+    mds->filer->remove(in->inode.ino, &in->inode.layout, *snapc,
                       newsize, oldsize-newsize, 0,
                       0, new C_MDC_PurgeFinish(this, in, newsize, oldsize));
   } else {