From: Yan, Zheng Date: Mon, 4 May 2015 08:13:19 +0000 (+0800) Subject: mds: properly set null dentry's first X-Git-Tag: v9.0.2~178^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=886096dc92d293dd3dcd3236982860bd94180327;p=ceph.git mds: properly set null dentry's first we should set new null dentry's first when it's created. Otherwise if the request that creates the new dentry fails, the leftover null dentry will affect later snap dentry lookup. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index a73843c53955..39a4465aa331 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2138,6 +2138,8 @@ CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& respond_to_request(mdr, -EEXIST); return 0; } + } else { + dn->first = dir->inode->find_snaprealm()->get_newest_seq() + 1; } return dn; @@ -2151,7 +2153,7 @@ CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& } // create - dn = dir->add_null_dentry(dname); + dn = dir->add_null_dentry(dname, dir->inode->find_snaprealm()->get_newest_seq() + 1); dn->mark_new(); dout(10) << "prepare_null_dentry added " << *dn << dendl; return dn; @@ -3065,8 +3067,7 @@ void Server::handle_client_openc(MDRequestRef& mdr) } in->inode.rstat.rfiles = 1; - if (follows >= dn->first) - dn->first = follows+1; + assert(dn->first == follows+1); in->first = dn->first; // prepare finisher @@ -4306,10 +4307,9 @@ class C_MDS_mknod_finish : public MDSInternalContext { MDRequestRef mdr; CDentry *dn; CInode *newi; - snapid_t follows; public: - C_MDS_mknod_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) : - MDSInternalContext(m), mdr(r), dn(d), newi(ni), follows(f) {} + C_MDS_mknod_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni) : + MDSInternalContext(m), mdr(r), dn(d), newi(ni) {} void finish(int r) { assert(r == 0); @@ -4417,8 +4417,7 @@ void Server::handle_client_mknod(MDRequestRef& mdr) } } - if (follows >= dn->first) - dn->first = follows + 1; + assert(dn->first == follows + 1); newi->first = dn->first; dout(10) << "mknod mode " << newi->inode.mode << " rdev " << newi->inode.rdev << dendl; @@ -4434,7 +4433,7 @@ void Server::handle_client_mknod(MDRequestRef& mdr) PREDIRTY_PRIMARY|PREDIRTY_DIR, 1); le->metablob.add_primary_dentry(dn, newi, true, true, true); - journal_and_reply(mdr, newi, dn, le, new C_MDS_mknod_finish(mds, mdr, dn, newi, follows)); + journal_and_reply(mdr, newi, dn, le, new C_MDS_mknod_finish(mds, mdr, dn, newi)); } @@ -4474,8 +4473,7 @@ void Server::handle_client_mkdir(MDRequestRef& mdr) newi->inode.update_backtrace(); dout(12) << " follows " << follows << dendl; - if (follows >= dn->first) - dn->first = follows + 1; + assert(dn->first == follows + 1); newi->first = dn->first; // ...and that new dir is empty. @@ -4512,7 +4510,7 @@ void Server::handle_client_mkdir(MDRequestRef& mdr) LogSegment *ls = mds->mdlog->get_current_segment(); ls->open_files.push_back(&newi->item_open_file); - journal_and_reply(mdr, newi, dn, le, new C_MDS_mknod_finish(mds, mdr, dn, newi, follows)); + journal_and_reply(mdr, newi, dn, le, new C_MDS_mknod_finish(mds, mdr, dn, newi)); } @@ -4533,8 +4531,6 @@ void Server::handle_client_symlink(MDRequestRef& mdr) if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks)) return; - snapid_t follows = dn->get_dir()->inode->find_snaprealm()->get_newest_seq(); - unsigned mode = S_IFLNK | 0777; CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino), mode); assert(newi); @@ -4549,8 +4545,6 @@ void Server::handle_client_symlink(MDRequestRef& mdr) newi->inode.version = dn->pre_dirty(); newi->inode.update_backtrace(); - if (follows >= dn->first) - dn->first = follows + 1; newi->first = dn->first; // prepare finisher @@ -4562,7 +4556,7 @@ void Server::handle_client_symlink(MDRequestRef& mdr) mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1); le->metablob.add_primary_dentry(dn, newi, true, true); - journal_and_reply(mdr, newi, dn, le, new C_MDS_mknod_finish(mds, mdr, dn, newi, follows)); + journal_and_reply(mdr, newi, dn, le, new C_MDS_mknod_finish(mds, mdr, dn, newi)); } @@ -4649,10 +4643,6 @@ void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti) pi->ctime = mdr->get_op_stamp(); pi->version = tipv; - snapid_t follows = dn->get_dir()->inode->find_snaprealm()->get_newest_seq(); - if (follows >= dn->first) - dn->first = follows; - // log + wait EUpdate *le = new EUpdate(mdlog, "link_local"); mdlog->start_entry(le);