return false;
Session *session = static_cast<Session *>(m->get_connection()->get_priv());
- if (!session->check_access(in, MAY_WRITE, m->caller_uid, m->caller_gid, 0, 0)) {
+ if (session->check_access(in, MAY_WRITE,
+ m->caller_uid, m->caller_gid, 0, 0) < 0) {
dout(10) << "check_access failed, dropping cap update on " << *in << dendl;
return false;
}
*/
bool Server::check_access(MDRequestRef& mdr, CInode *in, unsigned mask)
{
- if (mdr->session && !mdr->session->check_access(
- in, mask,
- mdr->client_request->get_caller_uid(),
- mdr->client_request->get_caller_gid(),
- mdr->client_request->head.args.setattr.uid,
- mdr->client_request->head.args.setattr.gid)) {
- respond_to_request(mdr, -EACCES);
- return false;
+ if (mdr->session) {
+ int r = mdr->session->check_access(
+ in, mask,
+ mdr->client_request->get_caller_uid(),
+ mdr->client_request->get_caller_gid(),
+ mdr->client_request->head.args.setattr.uid,
+ mdr->client_request->head.args.setattr.gid);
+ if (r < 0) {
+ respond_to_request(mdr, r);
+ return false;
+ }
}
return true;
}
_update_human_name();
}
-bool Session::check_access(CInode *in, unsigned mask,
- int caller_uid, int caller_gid,
- int new_uid, int new_gid)
+int Session::check_access(CInode *in, unsigned mask,
+ int caller_uid, int caller_gid,
+ int new_uid, int new_gid)
{
string path;
CInode *diri = NULL;
if (path.length())
path = path.substr(1); // drop leading /
- if (auth_caps.is_capable(path, in->inode.uid, in->inode.gid, in->inode.mode,
- caller_uid, caller_gid, mask,
- new_uid, new_gid)) {
- return true;
+ if (in->inode.is_dir() &&
+ in->inode.has_layout() &&
+ in->inode.layout.pool_ns.length() &&
+ !connection->has_feature(CEPH_FEATURE_FS_FILE_LAYOUT_V2)) {
+ dout(10) << __func__ << " client doesn't support FS_FILE_LAYOUT_V2" << dendl;
+ return -EIO;
}
- return false;
+
+ if (!auth_caps.is_capable(path, in->inode.uid, in->inode.gid, in->inode.mode,
+ caller_uid, caller_gid, mask,
+ new_uid, new_gid)) {
+ return -EACCES;
+ }
+ return 0;
}
int SessionFilter::parse(
completed_requests_dirty = false;
}
- bool check_access(CInode *in, unsigned mask, int caller_uid, int caller_gid,
- int new_uid, int new_gid);
+ int check_access(CInode *in, unsigned mask, int caller_uid, int caller_gid,
+ int new_uid, int new_gid);
Session() :