* create a new inode. set c/m/atime. hit dir pop.
*/
CInode* Server::prepare_new_inode(const MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
- const file_layout_t *layout, bool referent_inode)
+ const file_layout_t *layout)
{
CInode *in = new CInode(mdcache);
auto _inode = in->_get_inode();
_inode->mode |= S_ISGID;
}
} else {
- if (!referent_inode) {
- _inode->gid = mdr->client_request->get_owner_gid();
- ceph_assert(_inode->gid != (unsigned)-1);
- }
- }
-
- if (!referent_inode) {
- _inode->uid = mdr->client_request->get_owner_uid();
- ceph_assert(_inode->uid != (unsigned)-1);
+ _inode->gid = mdr->client_request->get_owner_gid();
+ ceph_assert(_inode->gid != (unsigned)-1);
}
- /* The referent inode is created on hardlink, so the client request wouldn't
- * have uid, gid set. So don't use uid and gid from client if it's a referent
- * inode.
- */
- if (referent_inode) {
- _inode->gid = 0;
- _inode->uid = 0;
- }
+ _inode->uid = mdr->client_request->get_owner_uid();
+ ceph_assert(_inode->uid != (unsigned)-1);
_inode->btime = _inode->ctime = _inode->mtime = _inode->atime =
mdr->get_op_stamp();
class C_MDS_link_local_finish : public ServerLogContext {
CDentry *dn;
CInode *targeti;
- CInode *referenti;
version_t dnpv;
version_t tipv;
bool adjust_realm;
public:
- C_MDS_link_local_finish(Server *s, const MDRequestRef& r, CDentry *d, CInode *ti, CInode *ri,
+ C_MDS_link_local_finish(Server *s, const MDRequestRef& r, CDentry *d, CInode *ti,
version_t dnpv_, version_t tipv_, bool ar) :
- ServerLogContext(s, r), dn(d), targeti(ti), referenti(ri),
+ ServerLogContext(s, r), dn(d), targeti(ti),
dnpv(dnpv_), tipv(tipv_), adjust_realm(ar) { }
void finish(int r) override {
ceph_assert(r == 0);
- server->_link_local_finish(mdr, dn, targeti, referenti, dnpv, tipv, adjust_realm);
+ server->_link_local_finish(mdr, dn, targeti, dnpv, tipv, adjust_realm);
}
};
pi.inode->change_attr++;
pi.inode->version = tipv;
- // create referent inode. Don't re-create on retry
- CInode *newi = nullptr;
- if (mds->mdsmap->allow_referent_inodes()) {
- if (!mdr->alloc_ino && !mdr->used_prealloc_ino)
- newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(0), pi.inode->mode, nullptr, true);
- else
- newi = mdcache->get_inode(mdr->alloc_ino ? mdr->alloc_ino : mdr->used_prealloc_ino);
- ceph_assert(newi);
-
- auto _inode = newi->_get_inode();
- _inode->version = dnpv;
- _inode->update_backtrace();
-
- /* NOTE: layout, rstat accounting and snapshot related inode updates are not
- * required and hence not done for referent inodes.
- */
- }
-
bool adjust_realm = false;
if (!target_realm->get_subvolume_ino() && !targeti->is_projected_snaprealm_global()) {
sr_t *newsnap = targeti->project_snaprealm();
le->metablob.add_client_req(mdr->reqid, mdr->client_request->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, 1); // new dn
mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, 0, PREDIRTY_PRIMARY); // targeti
- dout(20) << __func__ << " calling metablob add_remote_dentry with referent_ino= " << (newi ? newi->ino() : inodeno_t(0)) << dendl;
- le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type(), newi ? newi->ino() : inodeno_t(0), newi); // new remote
+ // TODO: Pass referent inode upon creation. It's adding just remote dentry now
+ le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type(), 0, nullptr); // new remote
mdcache->journal_dirty_inode(mdr.get(), &le->metablob, targeti);
// do this after predirty_*, to avoid funky extra dnl arg
- if (newi) {
- // journal allocated referent inode and push the linkage with referent inode
- journal_allocated_inos(mdr, &le->metablob);
- dn->push_projected_linkage(newi, targeti->ino(), newi->ino());
- } else {
- dn->push_projected_linkage(targeti->ino(), targeti->d_type());
- }
+ dn->push_projected_linkage(targeti->ino(), targeti->d_type());
journal_and_reply(mdr, targeti, dn, le,
- new C_MDS_link_local_finish(this, mdr, dn, targeti, newi, dnpv, tipv, adjust_realm));
+ new C_MDS_link_local_finish(this, mdr, dn, targeti, dnpv, tipv, adjust_realm));
}
-void Server::_link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, CInode *referenti,
+void Server::_link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti,
version_t dnpv, version_t tipv, bool adjust_realm)
{
dout(10) << "_link_local_finish " << *dn << " to " << *targeti << dendl;
dn->link_remote(dnl, targeti);
dn->mark_dirty(dnpv, mdr->ls);
- if (referenti) {
- // dirty referent inode
- referenti->mark_dirty(mdr->ls);
- referenti->mark_dirty_parent(mdr->ls, true);
- }
-
// target inode
mdr->apply();
bool _check_access(Session *session, CInode *in, unsigned mask, int caller_uid, int caller_gid, int setattr_uid, int setattr_gid);
CDentry *prepare_stray_dentry(const MDRequestRef& mdr, CInode *in);
CInode* prepare_new_inode(const MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
- const file_layout_t *layout=nullptr, bool referent_inode=false);
+ const file_layout_t *layout=nullptr);
void journal_allocated_inos(const MDRequestRef& mdr, EMetaBlob *blob);
void apply_allocated_inos(const MDRequestRef& mdr, Session *session);
// link
void handle_client_link(const MDRequestRef& mdr);
void _link_local(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, SnapRealm *target_realm);
- void _link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, CInode *referenti,
+ void _link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti,
version_t, version_t, bool);
void _link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti);