]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: issue caps on regular files created via MKNOD
authorSage Weil <sage@newdream.net>
Sat, 18 Dec 2010 00:51:32 +0000 (16:51 -0800)
committerSage Weil <sage@newdream.net>
Sat, 18 Dec 2010 00:52:05 +0000 (16:52 -0800)
Give the client some caps to write with.  This is similar to the current
MKDIR behavior, but with different bits.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/Server.cc

index 4bf765fc86adf17c22e117a7f06b2d763fecee5c..d1d2fe10eb874b8e8254e839aa4d7bd184a9ee55 100644 (file)
@@ -3266,7 +3266,8 @@ void Server::handle_client_mknod(MDRequest *mdr)
     return;
   }
 
-  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),
@@ -3289,8 +3290,20 @@ void Server::handle_client_mknod(MDRequest *mdr)
     newi->inode.client_ranges[client].range.last = newi->inode.get_layout_size_increment();
     newi->inode.client_ranges[client].follows = follows;
 
-    newi->authlock.set_state(LOCK_EXCL);
-    newi->xattrlock.set_state(LOCK_EXCL);
+    // issue a cap on the file
+    int cmode = CEPH_FILE_MODE_RDWR;
+    Capability *cap = mds->locker->issue_new_caps(newi, cmode, mdr->session, realm, req->is_replay());
+    if (cap) {
+      cap->set_wanted(0);
+
+      // put locks in excl mode
+      newi->filelock.set_state(LOCK_EXCL);
+      newi->authlock.set_state(LOCK_EXCL);
+      newi->xattrlock.set_state(LOCK_EXCL);
+      cap->issue_norevoke(CEPH_CAP_AUTH_EXCL|CEPH_CAP_AUTH_SHARED|
+                         CEPH_CAP_XATTR_EXCL|CEPH_CAP_XATTR_SHARED|
+                         CEPH_CAP_ANY_FILE_WR);
+    }
   }
 
   if (follows >= dn->first)