]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: issue cap on mkdir; set authlock to EXCL on open O_CREAT.
authorSage Weil <sage@newdream.net>
Mon, 12 Jan 2009 22:56:39 +0000 (14:56 -0800)
committerSage Weil <sage@newdream.net>
Mon, 12 Jan 2009 23:06:44 +0000 (15:06 -0800)
src/TODO
src/mds/Server.cc
src/mds/SimpleLock.h

index af6567f4afe6e8835163271bfef99aeabb2a80b0..8fac658aafd44f1a68fed9928a85281ef6e9ca39 100644 (file)
--- 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
index 48e8f110ce37445e5fe77cba0814ac5beb52567d..8652e4d3dbea0d74969732ab414f782d46a9a9ec 100644 (file)
@@ -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;
 
index fea7c92f0b7d1a1aba4374533bd286749d499332..a93c54c205d0264188a9f669a07047e4ac97dcfa 100644 (file)
@@ -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;
     }
   }