From: Sage Weil Date: Mon, 12 Jan 2009 22:56:39 +0000 (-0800) Subject: mds: issue cap on mkdir; set authlock to EXCL on open O_CREAT. X-Git-Tag: v0.6~1^2~81 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c7c72b44dd0c09d4e99c938f71b960fd57bbefe0;p=ceph.git mds: issue cap on mkdir; set authlock to EXCL on open O_CREAT. --- diff --git a/src/TODO b/src/TODO index af6567f4afe6..8fac658aafd4 100644 --- a/src/TODO +++ b/src/TODO @@ -1,6 +1,8 @@ v0.6 /- fold observer into cmonctl/ceph? /- osd scrub +/- async metadata +- async lstat v0.7 - ENOSPC diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 48e8f110ce37..8652e4d3dbea 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2375,7 +2375,8 @@ void Server::handle_client_mkdir(MDRequest *mdr) if (!dn) return; // new inode - 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(); mdr->now = g_clock.real_now(); CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino)); @@ -2410,6 +2411,22 @@ void Server::handle_client_mkdir(MDRequest *mdr) le->metablob.add_primary_dentry(dn, true, newi, &newi->inode); le->metablob.add_dir(newdir, true, true, true); // dirty AND complete AND new + // issue a cap on the directory + bool is_new = false; + int cmode = CEPH_FILE_MODE_RDWR; + Capability *cap = mds->locker->issue_new_caps(newi, cmode, mdr->session, is_new, realm); + if (is_new) + cap->dec_suppress(); + cap->set_wanted(0); + + // put locks in excl mode + newi->filelock.set_state(LOCK_LONER); + + // make sure this inode gets into the journal + le->metablob.add_opened_ino(newi->ino()); + LogSegment *ls = mds->mdlog->get_current_segment(); + ls->open_files.push_back(&newi->xlist_open_file); + // allow the same client rdlock|lease the dentry dn->lock.set_xlock_done(); @@ -5131,6 +5148,8 @@ void Server::handle_client_openc(MDRequest *mdr) if (is_new) cap->dec_suppress(); + in->authlock.set_state(LOCK_EXCL); + // stick cap, snapbl info in mdr mdr->cap = cap; diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index fea7c92f0b7d..a93c54c205d0 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -90,6 +90,11 @@ public: case LOCK_SYNC_LOCK: return "sync->lock"; case LOCK_LOCK_SYNC: return "lock->sync"; case LOCK_REMOTEXLOCK: return "remote_xlock"; + case LOCK_EXCL: return "excl"; + case LOCK_EXCL_SYNC: return "excl->sync"; + case LOCK_EXCL_LOCK: return "excl->lock"; + case LOCK_SYNC_EXCL: return "sync->excl"; + case LOCK_LOCK_EXCL: return "lock->excl"; default: assert(0); return 0; } }