From 1bad07f5b7886f0648d9766404c43f8f71bba0dd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 28 Jul 2008 16:33:15 -0700 Subject: [PATCH] mds: include snapid in MDSCacheObjectInfo (used to identify locks, remote auth pins, etc.) --- src/mds/CDentry.cc | 9 ++++++--- src/mds/CInode.cc | 1 + src/mds/CInode.h | 4 +++- src/mds/Locker.cc | 4 ++-- src/mds/MDCache.cc | 4 ++-- src/mds/mdstypes.h | 8 ++++++-- 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/mds/CDentry.cc b/src/mds/CDentry.cc index ffddfb7a1f944..99a69375122a7 100644 --- a/src/mds/CDentry.cc +++ b/src/mds/CDentry.cc @@ -103,9 +103,11 @@ ostream& operator<<(ostream& out, CDentry& dn) bool operator<(const CDentry& l, const CDentry& r) { - if (l.get_dir()->ino() < r.get_dir()->ino()) return true; - if (l.get_dir()->ino() == r.get_dir()->ino() && - l.get_name() < r.get_name()) return true; + if ((l.get_dir()->ino() < r.get_dir()->ino()) || + (l.get_dir()->ino() == r.get_dir()->ino() && + (l.get_name() < r.get_name() || + (l.get_name() == r.get_name() && l.last < r.last)))) + return true; return false; } @@ -381,6 +383,7 @@ void CDentry::set_object_info(MDSCacheObjectInfo &info) { info.dirfrag = dir->dirfrag(); info.dname = name; + info.snapid = last; } void CDentry::encode_lock_state(int type, bufferlist& bl) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 97732cc108ae4..5a92ccb88489f 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -529,6 +529,7 @@ void CInode::mark_clean() void CInode::set_object_info(MDSCacheObjectInfo &info) { info.ino = ino(); + info.snapid = last; } void CInode::encode_lock_state(int type, bufferlist& bl) diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 0b22f913feefb..d676348a953f5 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -340,7 +340,9 @@ private: CInode *get_parent_inode(); bool is_lt(const MDSCacheObject *r) const { - return ino() < ((CInode*)r)->ino(); + CInode *o = (CInode*)r; + return ino() < o->ino() || + (ino() == o->ino() && last < o->last); } int64_t get_layout_size_increment() { diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 1fc8e0adb656b..a8854ad90c331 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1319,7 +1319,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info) fg = diri->pick_dirfrag(info.dname); dir = diri->get_dirfrag(fg); if (dir) - dn = dir->lookup(info.dname); + dn = dir->lookup(info.dname, info.snapid); } if (!dn) { dout(7) << "get_lock don't have dn " << info.dirfrag.ino << " " << info.dname << dendl; @@ -1337,7 +1337,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info) case CEPH_LOCK_IXATTR: case CEPH_LOCK_ISNAP: { - CInode *in = mdcache->get_inode(info.ino); + CInode *in = mdcache->get_inode(info.ino, info.snapid); if (!in) { dout(7) << "get_lock don't have ino " << info.ino << dendl; return 0; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 6db129068e520..4a745a8efb224 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -322,14 +322,14 @@ MDSCacheObject *MDCache::get_object(MDSCacheObjectInfo &info) { // inode? if (info.ino) - return get_inode(info.ino); + return get_inode(info.ino, info.snapid); // dir or dentry. CDir *dir = get_dirfrag(info.dirfrag); if (!dir) return 0; if (info.dname.length()) - return dir->lookup(info.dname); + return dir->lookup(info.dname, info.snapid); else return dir; } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 3c7a17359c86e..66881338796a3 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -841,6 +841,7 @@ public: inodeno_t ino; dirfrag_t dirfrag; nstring dname; + snapid_t snapid; MDSCacheObjectInfo() : ino(0) {} @@ -848,11 +849,13 @@ public: ::encode(ino, bl); ::encode(dirfrag, bl); ::encode(dname, bl); + ::encode(snapid, bl); } void decode(bufferlist::iterator& p) { ::decode(ino, p); ::decode(dirfrag, p); ::decode(dname, p); + ::decode(snapid, p); } }; @@ -1179,8 +1182,9 @@ inline ostream& operator<<(ostream& out, MDSCacheObject &o) { } inline ostream& operator<<(ostream& out, const MDSCacheObjectInfo &info) { - if (info.ino) return out << info.ino; - if (info.dname.length()) return out << info.dirfrag << "/" << info.dname; + if (info.ino) return out << info.ino << "." << info.snapid; + if (info.dname.length()) return out << info.dirfrag << "/" << info.dname + << " snap " << info.snapid; return out << info.dirfrag; } -- 2.39.5