diff options
author | Sage Weil <sage@newdream.net> | 2009-02-20 16:56:11 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-02-20 17:16:23 -0800 |
commit | 02de9c368b81b2d33a4edb25631c622da16a1baa (patch) | |
tree | 4495a1d3a20db229853b62680d1e98288bbb96e0 | |
parent | 5ebb8d5c7c4f1583f253a8f2cedd25cdd3de16d8 (diff) | |
download | ceph-02de9c368b81b2d33a4edb25631c622da16a1baa.tar.gz |
mds: fix up create
-rw-r--r-- | src/mds/Locker.cc | 2 | ||||
-rw-r--r-- | src/mds/Server.cc | 20 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index b9eaf852fbc..211b6c22f0f 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -660,7 +660,7 @@ bool Locker::wrlock_start(SimpleLock *lock, MDRequest *mut, bool nowait) while (1) { // wrlock? if (lock->can_wrlock(client) || - (cap && in->get_loner() == client && (cap->pending() & CEPH_CAP_FILE_EXCL))) { + (cap && in->get_loner() == client && (cap->issued() & CEPH_CAP_FILE_EXCL))) { lock->get_wrlock(); mut->wrlocks.insert(lock); mut->locks.insert(lock); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 3c95a6805c5..2590594d4a2 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1440,7 +1440,9 @@ CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, b if (clientprealloc) { // we need to journal the client prealloc use +#warning write me mdr->used_client_alloc = useino; + in->inode.ino = useino; } else { // assign ino if (mdr->session->prealloc_inos.size()) { @@ -2582,7 +2584,8 @@ void Server::handle_client_create(MDRequest *mdr) if (!dn) return; mdr->now = g_clock.real_now(); - snapid_t follows = dn->get_dir()->inode->find_snaprealm()->get_newest_seq(); + SnapRealm *realm = dn->get_dir()->inode->find_snaprealm(); + snapid_t follows = realm->get_newest_seq(); CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino), true); assert(newi); @@ -2605,18 +2608,29 @@ void Server::handle_client_create(MDRequest *mdr) newi->symlink = req->get_path2(); + CDir *newdir = 0; + if (newi->inode.is_dir()) { + // ...and that new dir is empty. + newdir = newi->get_or_open_dirfrag(mds->mdcache, frag_t()); + newdir->mark_complete(); + newdir->pre_dirty(); + } + dn->first = newi->first = follows+1; - // prepare finisher + // journal mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "create"); le->metablob.add_client_req(req->get_reqid()); journal_allocated_inos(mdr, &le->metablob); mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1); le->metablob.add_primary_dentry(dn, true, newi); + if (newdir) + le->metablob.add_dir(newdir, true, true, true); // dirty AND complete AND new + // cap int client = mdr->get_client(); - Capability *cap = newi->get_client_cap(client); + Capability *cap = newi->add_client_cap(client, mdr->session, &mdcache->client_rdcaps, realm); int keep = req->head.args.create.caps; cap->set_wanted(req->head.args.create.wanted); cap->issue(keep); |