summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-02-20 16:56:11 -0800
committerSage Weil <sage@newdream.net>2009-02-20 17:16:23 -0800
commit02de9c368b81b2d33a4edb25631c622da16a1baa (patch)
tree4495a1d3a20db229853b62680d1e98288bbb96e0
parent5ebb8d5c7c4f1583f253a8f2cedd25cdd3de16d8 (diff)
downloadceph-02de9c368b81b2d33a4edb25631c622da16a1baa.tar.gz
mds: fix up create
-rw-r--r--src/mds/Locker.cc2
-rw-r--r--src/mds/Server.cc20
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);