if ((need & CEPH_CAP_FILE_WR) &&
((in->auth_cap && in->auth_cap->session->readonly) ||
// (is locked)
- (in->is_fscrypt_enabled() && is_inode_locked(in))))
+ (in->is_fscrypt_enabled() && is_inode_locked(in) && cct->_conf.get_val<bool>("client_fscrypt_as"))))
return -EROFS;
if (in->flags & I_CAP_DROPPED) {
ldout(cct, 20) << __func__ << " " << *in << "; " << perms << dendl;
unsigned want = 0;
- if (!in->is_dir() && is_inode_locked(in))
+ if (!in->is_dir() && is_inode_locked(in) && cct->_conf.get_val<bool>("client_fscrypt_as"))
return -ENOKEY;
if ((flags & O_ACCMODE) == O_WRONLY)
int Client::may_create(const InodeRef& dir, const UserPerm& perms)
{
ldout(cct, 20) << __func__ << " " << *dir << "; " << perms << dendl;
- if (dir->is_dir() && is_inode_locked(dir))
+ if (dir->is_dir() && is_inode_locked(dir) && cct->_conf.get_val<bool>("client_fscrypt_as"))
return -ENOKEY;
int r = _getattr_for_perm(dir, perms);
default: 16
services:
- mds_client
- min: 1
\ No newline at end of file
+ min: 1
+- name: client_fscrypt_as
+ type: bool
+ level: advanced
+ desc: Enable fscrypt access semantics
+ long_desc: Enable fscrypt access semantics for locked/unlocked states.
+ default: true
+ services:
+ - mds_client
+ flags:
+ - runtime