From df7e3ffd0bd6b9179d570621b11a9f99fe2216ca Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 17 Dec 2010 16:51:32 -0800 Subject: [PATCH] mds: issue caps on regular files created via MKNOD 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 --- src/mds/Server.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 4bf765fc86adf..d1d2fe10eb874 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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) -- 2.39.5