From: Sage Weil Date: Wed, 12 Nov 2008 18:23:15 +0000 (-0800) Subject: mds: use null snap context for purge if no realm X-Git-Tag: v0.5~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=eddb8794bea24693c0f7b64ee7c688003ecc19a5;p=ceph.git mds: use null snap context for purge if no realm 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. --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index df3a8d1bfe952..3326b5e4808e1 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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 {