if (in->snapid == CEPH_NOSNAP) {
FSCryptKeyHandlerRef kh;
get_keyhandler(in->fscrypt_ctx, kh);
- if (kh && kh->di) {
- kh->di->del_inode(in->ino);
+ if (kh) {
+ auto& di = kh->get_di();
+ if (di) {
+ di->del_inode(in->ino);
+ }
}
if (in->put_open_ref(f->mode)) {
_flush(in, new C_Client_FlushComplete(this, in));
FSCryptKeyHandlerRef kh;
get_keyhandler(in->fscrypt_ctx, kh);
- if (kh && kh->di) {
- kh->di->add_inode(in->ino);
+ if (kh) {
+ auto& di = kh->get_di();
+ if (di) {
+ di->add_inode(in->ino);
+ }
}
in->get_open_ref(cmode); // make note of pending open, since it effects _wanted_ caps.
} else {
FSCryptKeyHandlerRef kh;
get_keyhandler(in->fscrypt_ctx, kh);
- if (kh && kh->di) {
- kh->di->del_inode(in->ino);
+ if (kh) {
+ auto& di = kh->get_di();
+ if (di) {
+ di->del_inode(in->ino);
+ }
}
in->put_open_ref(cmode);
}
if(fhp) {
FSCryptKeyHandlerRef kh;
get_keyhandler((*inp)->fscrypt_ctx, kh);
- if (kh && kh->di) {
- kh->di->add_inode((*inp)->ino);
+ if (kh) {
+ auto& di = kh->get_di();
+ if (di) {
+ di->add_inode((*inp)->ino);
+ }
}
(*inp)->get_open_ref(cmode);
int Client::get_keyhandler(FSCryptContextRef fscrypt_ctx, FSCryptKeyHandlerRef& kh){
if (fscrypt_ctx) {
int r = fscrypt->get_key_store().find(fscrypt_ctx->master_key_identifier, kh);
- if (kh)
- if (kh && kh->di)
+ if (kh) {
+ auto& di = kh->get_di();
+ if (di) {
return r;
+ }
+ }
}
return 0;
}
return key;
}
+FSCryptDecryptedInodesRef& FSCryptKeyHandler::get_di()
+{
+ std::shared_lock rl{lock};
+ return di;
+}
+
//taken from fs/crypto/keyring.h
bool FSCryptKeyStore::valid_key_spec(const struct fscrypt_key_specifier& k)
{
return 0; //returns 0 regardless
}
key_handler->present = true;
- key_handler->di = new FSCryptDecryptedInodes();
+
+ auto di = new FSCryptDecryptedInodes();
+ key_handler->di = std::shared_ptr<FSCryptDecryptedInodes>((FSCryptDecryptedInodes *)di);
m[id] = key_handler;
}
//do a final clean up
if (!kh->present && kh->di->get_inodes().empty()) {
kh->reset(++epoch, nullptr);
- free(kh->di);
m.erase(id);
} else {
r = 0;
}
};
+using FSCryptDecryptedInodesRef = std::shared_ptr<FSCryptDecryptedInodes>;
+
class FSCryptKeyHandler {
ceph::shared_mutex lock = ceph::make_shared_mutex("FSCryptKeyHandler");
int64_t epoch = -1;
void reset(int64_t epoch, FSCryptKeyRef k);
int64_t get_epoch();
+ FSCryptDecryptedInodesRef di;
std::list<int>& get_users() { return users; }
FSCryptKeyRef& get_key();
- FSCryptDecryptedInodes* di;
+ FSCryptDecryptedInodesRef& get_di();
bool present = false;
};