struct C_MDC_CreateSystemFile : public Context {
MDCache *cache;
- Mutation *mut;
+ MutationRef mut;
CDentry *dn;
version_t dpv;
Context *fin;
- C_MDC_CreateSystemFile(MDCache *c, Mutation *mu, CDentry *d, version_t v, Context *f) :
+ C_MDC_CreateSystemFile(MDCache *c, MutationRef& mu, CDentry *d, version_t v, Context *f) :
cache(c), mut(mu), dn(d), dpv(v), fin(f) {}
void finish(int r) {
cache->_create_system_file_finish(mut, dn, dpv, fin);
SnapRealm *realm = dir->get_inode()->find_snaprealm();
dn->first = in->first = realm->get_newest_seq() + 1;
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
// force some locks. hacky.
mds->locker->wrlock_force(&dir->inode->filelock, mut);
mds->mdlog->flush();
}
-void MDCache::_create_system_file_finish(Mutation *mut, CDentry *dn, version_t dpv, Context *fin)
+void MDCache::_create_system_file_finish(MutationRef& mut, CDentry *dn, version_t dpv, Context *fin)
{
dout(10) << "_create_system_file_finish " << *dn << dendl;
mut->apply();
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
fin->complete(0);
class C_MDC_SubtreeMergeWB : public Context {
MDCache *mdcache;
CInode *in;
- Mutation *mut;
+ MutationRef mut;
public:
- C_MDC_SubtreeMergeWB(MDCache *mdc, CInode *i, Mutation *m) : mdcache(mdc), in(i), mut(m) {}
+ C_MDC_SubtreeMergeWB(MDCache *mdc, CInode *i, MutationRef& m) : mdcache(mdc), in(i), mut(m) {}
void finish(int r) {
mdcache->subtree_merge_writebehind_finish(in, mut);
}
inode_t *pi = in->project_inode();
pi->version = in->pre_dirty();
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
EUpdate *le = new EUpdate(mds->mdlog, "subtree merge writebehind");
mds->mdlog->start_entry(le);
show_subtrees(15);
}
-void MDCache::subtree_merge_writebehind_finish(CInode *in, Mutation *mut)
+void MDCache::subtree_merge_writebehind_finish(CInode *in, MutationRef& mut)
{
dout(10) << "subtree_merge_writebehind_finish on " << in << dendl;
in->pop_and_dirty_projected_inode(mut->ls);
mut->apply();
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
in->auth_unpin(this);
}
return oldin;
}
-void MDCache::journal_cow_dentry(Mutation *mut, EMetaBlob *metablob, CDentry *dn, snapid_t follows,
+void MDCache::journal_cow_dentry(MutationRef& mut, EMetaBlob *metablob,
+ CDentry *dn, snapid_t follows,
CInode **pcow_inode, CDentry::linkage_t *dnl)
{
if (!dn) {
}
-void MDCache::journal_cow_inode(Mutation *mut, EMetaBlob *metablob, CInode *in, snapid_t follows,
+void MDCache::journal_cow_inode(MutationRef& mut, EMetaBlob *metablob,
+ CInode *in, snapid_t follows,
CInode **pcow_inode)
{
dout(10) << "journal_cow_inode follows " << follows << " on " << *in << dendl;
journal_cow_dentry(mut, metablob, dn, follows, pcow_inode);
}
-void MDCache::journal_dirty_inode(Mutation *mut, EMetaBlob *metablob, CInode *in, snapid_t follows)
+void MDCache::journal_dirty_inode(MutationRef& mut, EMetaBlob *metablob, CInode *in, snapid_t follows)
{
if (in->is_base()) {
metablob->add_root(true, in, in->get_projected_inode());
* accounted_rstat on scatterlock sync may not match our current
* rstat. this is normal and expected.
*/
-void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
+void MDCache::predirty_journal_parents(MutationRef& mut, EMetaBlob *blob,
CInode *in, CDir *parent,
int flags, int linkunlink,
snapid_t cfollows)
}
}
+ // can cast only because i'm passing nowait=true in the sole user
+ MDRequestRef mdmut =
+ ceph::static_pointer_cast<MDRequestImpl,MutationImpl>(mut);
if (!stop &&
mut->wrlocks.count(&pin->nestlock) == 0 &&
(!pin->versionlock.can_wrlock() || // make sure we can take versionlock, too
//true
- !mds->locker->wrlock_start(&pin->nestlock, static_cast<MDRequest*>(mut), true) // can cast only because i'm passing nowait=true
+ !mds->locker->wrlock_start(&pin->nestlock, mdmut, true)
)) { // ** do not initiate.. see above comment **
dout(10) << "predirty_journal_parents can't wrlock one of " << pin->versionlock << " or " << pin->nestlock
<< " on " << *pin << dendl;
struct C_MDC_QueuedCow : public Context {
MDCache *mdcache;
CInode *in;
- Mutation *mut;
- C_MDC_QueuedCow(MDCache *mdc, CInode *i, Mutation *m) : mdcache(mdc), in(i), mut(m) {}
+ MutationRef mut;
+ C_MDC_QueuedCow(MDCache *mdc, CInode *i, MutationRef& m) :
+ mdcache(mdc), in(i), mut(m) {}
void finish(int r) {
mdcache->_queued_file_recover_cow(in, mut);
}
inode_t *pi = in->project_inode();
pi->version = in->pre_dirty();
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
EUpdate *le = new EUpdate(mds->mdlog, "queue_file_recover cow");
mds->mdlog->start_entry(le);
_queue_file_recover(in);
}
-void MDCache::_queued_file_recover_cow(CInode *in, Mutation *mut)
+void MDCache::_queued_file_recover_cow(CInode *in, MutationRef& mut)
{
in->pop_and_dirty_projected_inode(mut->ls);
mut->apply();
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
}
void MDCache::_queue_file_recover(CInode *in)
struct C_MDC_TruncateLogged : public Context {
MDCache *mdc;
CInode *in;
- Mutation *mut;
- C_MDC_TruncateLogged(MDCache *m, CInode *i, Mutation *mu) : mdc(m), in(i), mut(mu) {}
+ MutationRef mut;
+ C_MDC_TruncateLogged(MDCache *m, CInode *i, MutationRef& mu) :
+ mdc(m), in(i), mut(mu) {}
void finish(int r) {
mdc->truncate_inode_logged(in, mut);
}
pi->truncate_from = 0;
pi->truncate_pending--;
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
mut->add_projected_inode(in);
mds->mdlog->flush();
}
-void MDCache::truncate_inode_logged(CInode *in, Mutation *mut)
+void MDCache::truncate_inode_logged(CInode *in, MutationRef& mut)
{
dout(10) << "truncate_inode_logged " << *in << dendl;
mut->apply();
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
in->put(CInode::PIN_TRUNCATING);
in->auth_unpin(this);
MDCache *cache;
CInode *in;
version_t atid;
- Mutation *mut;
+ MutationRef mut;
public:
- C_MDC_AnchorLogged(MDCache *c, CInode *i, version_t t, Mutation *m) :
+ C_MDC_AnchorLogged(MDCache *c, CInode *i, version_t t, MutationRef& m) :
cache(c), in(i), atid(t), mut(m) {}
void finish(int r) {
cache->_anchor_logged(in, atid, mut);
}
pi->version = in->pre_dirty();
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
EUpdate *le = new EUpdate(mds->mdlog, add ? "anchor_create":"anchor_destroy");
mds->mdlog->start_entry(le);
}
-void MDCache::_anchor_logged(CInode *in, version_t atid, Mutation *mut)
+void MDCache::_anchor_logged(CInode *in, version_t atid, MutationRef& mut)
{
dout(10) << "_anchor_logged on " << *in << dendl;
// drop locks and finish
mds->locker->drop_locks(mut);
mut->cleanup();
- delete mut;
// trigger waiters
in->finish_waiting(CInode::WAIT_ANCHORED|CInode::WAIT_UNANCHORED, 0);
struct C_MDC_snaprealm_create_finish : public Context {
MDCache *cache;
MDRequestRef mdr;
- Mutation *mut;
+ MutationRef mut;
CInode *in;
- C_MDC_snaprealm_create_finish(MDCache *c, MDRequestRef& m, Mutation *mu, CInode *i) :
+ C_MDC_snaprealm_create_finish(MDCache *c, MDRequestRef& m,
+ MutationRef& mu, CInode *i) :
cache(c), mdr(m), mut(mu), in(i) {}
void finish(int r) {
cache->_snaprealm_create_finish(mdr, mut, in);
return;
}
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
EUpdate *le = new EUpdate(mds->mdlog, "snaprealm_create");
mds->mdlog->start_entry(le);
send_snaps(updates);
}
-void MDCache::_snaprealm_create_finish(MDRequestRef& mdr, Mutation *mut, CInode *in)
+void MDCache::_snaprealm_create_finish(MDRequestRef& mdr, MutationRef& mut, CInode *in)
{
dout(10) << "_snaprealm_create_finish " << *in << dendl;
// tell table we've committed
mds->snapclient->commit(mdr->more()->stid, mut->ls);
- delete mut;
-
// create
bufferlist::iterator p = mdr->more()->snapidbl.begin();
snapid_t seq;
class ESubtreeMap;
-struct Mutation;
struct MDRequestImpl;
typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
struct MDSlaveUpdate;
void map_dirfrag_set(list<dirfrag_t>& dfs, set<CDir*>& result);
void try_subtree_merge(CDir *root);
void try_subtree_merge_at(CDir *root, bool do_eval=true);
- void subtree_merge_writebehind_finish(CInode *in, Mutation *mut);
+ void subtree_merge_writebehind_finish(CInode *in, MutationRef& mut);
void eval_subtree_root(CInode *diri);
CDir *get_subtree_root(CDir *dir);
CDir *get_projected_subtree_root(CDir *dir);
// journal/snap helpers
CInode *pick_inode_snap(CInode *in, snapid_t follows);
CInode *cow_inode(CInode *in, snapid_t last);
- void journal_cow_dentry(Mutation *mut, EMetaBlob *metablob, CDentry *dn, snapid_t follows=CEPH_NOSNAP,
+ void journal_cow_dentry(MutationRef& mut, EMetaBlob *metablob, CDentry *dn,
+ snapid_t follows=CEPH_NOSNAP,
CInode **pcow_inode=0, CDentry::linkage_t *dnl=0);
- void journal_cow_inode(Mutation *mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP,
+ void journal_cow_inode(MutationRef& mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP,
CInode **pcow_inode=0);
- void journal_dirty_inode(Mutation *mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
+ void journal_dirty_inode(MutationRef& mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink);
void _project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
void project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accounted_rstat,
snapid_t ofirst, snapid_t last,
CInode *pin, bool cow_head);
- void predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
+ void predirty_journal_parents(MutationRef& mut, EMetaBlob *blob,
CInode *in, CDir *parent,
int flags, int linkunlink=0,
snapid_t follows=CEPH_NOSNAP);
void queue_file_recover(CInode *in);
void unqueue_file_recover(CInode *in);
- void _queued_file_recover_cow(CInode *in, Mutation *mut);
+ void _queued_file_recover_cow(CInode *in, MutationRef& mut);
void _queue_file_recover(CInode *in);
void identify_files_to_recover(vector<CInode*>& recover_q, vector<CInode*>& check_q);
void start_files_to_recover(vector<CInode*>& recover_q, vector<CInode*>& check_q);
void truncate_inode(CInode *in, LogSegment *ls);
void _truncate_inode(CInode *in, LogSegment *ls);
void truncate_inode_finish(CInode *in, LogSegment *ls);
- void truncate_inode_logged(CInode *in, Mutation *mut);
+ void truncate_inode_logged(CInode *in, MutationRef& mut);
void add_recovered_truncate(CInode *in, LogSegment *ls);
void remove_recovered_truncate(CInode *in, LogSegment *ls);
void populate_mydir();
void _create_system_file(CDir *dir, const char *name, CInode *in, Context *fin);
- void _create_system_file_finish(Mutation *mut, CDentry *dn, version_t dpv, Context *fin);
+ void _create_system_file_finish(MutationRef& mut, CDentry *dn,
+ version_t dpv, Context *fin);
void open_foreign_mdsdir(inodeno_t ino, Context *c);
CDentry *get_or_create_stray_dentry(CInode *in);
void anchor_destroy(CInode *in, Context *onfinish);
protected:
void _anchor_prepared(CInode *in, version_t atid, bool add);
- void _anchor_logged(CInode *in, version_t atid, Mutation *mut);
+ void _anchor_logged(CInode *in, version_t atid, MutationRef& mut);
friend class C_MDC_AnchorPrepared;
friend class C_MDC_AnchorLogged;
// -- snaprealms --
public:
void snaprealm_create(MDRequestRef& mdr, CInode *in);
- void _snaprealm_create_finish(MDRequestRef& mdr, Mutation *mut, CInode *in);
+ void _snaprealm_create_finish(MDRequestRef& mdr, MutationRef& mut, CInode *in);
// -- stray --
public: