}
-void Locker::set_xlocks_done(Mutation *mut, bool skip_dentry)
+void Locker::set_xlocks_done(MutationRef& mut, bool skip_dentry)
{
for (set<SimpleLock*>::iterator p = mut->xlocks.begin();
p != mut->xlocks.end();
}
}
-void Locker::_drop_rdlocks(Mutation *mut, set<CInode*> *pneed_issue)
+void Locker::_drop_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue)
{
while (!mut->rdlocks.empty()) {
bool ni = false;
}
}
-void Locker::_drop_non_rdlocks(Mutation *mut, set<CInode*> *pneed_issue)
+void Locker::_drop_non_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue)
{
set<int> slaves;
}
}
-void Locker::cancel_locking(Mutation *mut, set<CInode*> *pneed_issue)
+void Locker::cancel_locking(MutationRef& mut, set<CInode*> *pneed_issue)
{
SimpleLock *lock = mut->locking;
assert(lock);
mut->finish_locking(lock);
}
-void Locker::drop_locks(Mutation *mut, set<CInode*> *pneed_issue)
+void Locker::drop_locks(MutationRef& mut, set<CInode*> *pneed_issue)
{
// leftover locks
set<CInode*> my_need_issue;
mut->done_locking = false;
}
-void Locker::drop_non_rdlocks(Mutation *mut, set<CInode*> *pneed_issue)
+void Locker::drop_non_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue)
{
set<CInode*> my_need_issue;
if (!pneed_issue)
issue_caps_set(*pneed_issue);
}
-void Locker::drop_rdlocks(Mutation *mut, set<CInode*> *pneed_issue)
+void Locker::drop_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue)
{
set<CInode*> my_need_issue;
if (!pneed_issue)
mds->mdlog->flush();
}
-void Locker::rdlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue)
+void Locker::rdlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue)
{
// drop ref
lock->put_rdlock();
return true;
}
-void Locker::rdlock_take_set(set<SimpleLock*>& locks, Mutation *mut)
+void Locker::rdlock_take_set(set<SimpleLock*>& locks, MutationRef& mut)
{
dout(10) << "rdlock_take_set " << locks << dendl;
for (set<SimpleLock*>::iterator p = locks.begin(); p != locks.end(); ++p) {
// ------------------
// wrlock
-void Locker::wrlock_force(SimpleLock *lock, Mutation *mut)
+void Locker::wrlock_force(SimpleLock *lock, MutationRef& mut)
{
if (lock->get_type() == CEPH_LOCK_IVERSION ||
lock->get_type() == CEPH_LOCK_DVERSION)
return false;
}
-void Locker::wrlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue)
+void Locker::wrlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue)
{
if (lock->get_type() == CEPH_LOCK_IVERSION ||
lock->get_type() == CEPH_LOCK_DVERSION)
mut->more()->waiting_on_slave.insert(target);
}
-void Locker::remote_wrlock_finish(SimpleLock *lock, int target, Mutation *mut)
+void Locker::remote_wrlock_finish(SimpleLock *lock, int target,
+ MutationRef& mut)
{
// drop ref
mut->remote_wrlocks.erase(lock);
eval_gather(lock, true, pneed_issue);
}
-void Locker::xlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue)
+void Locker::xlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue)
{
if (lock->get_type() == CEPH_LOCK_IVERSION ||
lock->get_type() == CEPH_LOCK_DVERSION)
}
}
-void Locker::xlock_export(SimpleLock *lock, Mutation *mut)
+void Locker::xlock_export(SimpleLock *lock, MutationRef& mut)
{
dout(10) << "xlock_export on " << *lock << " " << *lock->get_parent() << dendl;
struct C_Locker_FileUpdate_finish : public Context {
Locker *locker;
CInode *in;
- Mutation *mut;
+ MutationRef mut;
bool share;
client_t client;
Capability *cap;
MClientCaps *ack;
- C_Locker_FileUpdate_finish(Locker *l, CInode *i, Mutation *m, bool e=false, client_t c=-1,
+ C_Locker_FileUpdate_finish(Locker *l, CInode *i, MutationRef& m,
+ bool e=false, client_t c=-1,
Capability *cp = 0,
MClientCaps *ac = 0) :
locker(l), in(i), mut(m), share(e), client(c), cap(cp),
}
};
-void Locker::file_update_finish(CInode *in, Mutation *mut, bool share, client_t client,
+void Locker::file_update_finish(CInode *in, MutationRef& mut, bool share, client_t client,
Capability *cap, MClientCaps *ack)
{
dout(10) << "file_update_finish on " << *in << dendl;
// auth unpin after issuing caps
mut->cleanup();
- delete mut;
}
Capability* Locker::issue_new_caps(CInode *in,
}
}
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
inode_t *pi = in->project_inode();
EUpdate *le = new EUpdate(mds->mdlog, "snap flush");
mds->mdlog->start_entry(le);
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
// normal metadata updates that we can apply to the head as well.
inode_t *pi = in->project_inode(px);
pi->version = in->pre_dirty();
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
_update_cap_fields(in, dirty, m, pi);
dout(10) << "scatter_writebehind " << in->inode.mtime << " on " << *lock << " on " << *in << dendl;
// journal
- Mutation *mut = new Mutation;
+ MutationRef mut(new MutationImpl);
mut->ls = mds->mdlog->get_current_segment();
// forcefully take a wrlock
mds->mdlog->wait_for_safe(new C_Locker_ScatterWB(this, lock, mut));
}
-void Locker::scatter_writebehind_finish(ScatterLock *lock, Mutation *mut)
+void Locker::scatter_writebehind_finish(ScatterLock *lock, MutationRef& mut)
{
CInode *in = static_cast<CInode*>(lock->get_parent());
dout(10) << "scatter_writebehind_finish on " << *lock << " on " << *in << dendl;
mut->apply();
drop_locks(mut);
mut->cleanup();
- delete mut;
if (lock->is_stable())
lock->finish_waiters(ScatterLock::WAIT_STABLE);
// ==========================================================================
// local lock
-void Locker::local_wrlock_grab(LocalLock *lock, Mutation *mut)
+void Locker::local_wrlock_grab(LocalLock *lock, MutationRef& mut)
{
dout(7) << "local_wrlock_grab on " << *lock
<< " on " << *lock->get_parent() << dendl;
}
}
-void Locker::local_wrlock_finish(LocalLock *lock, Mutation *mut)
+void Locker::local_wrlock_finish(LocalLock *lock, MutationRef& mut)
{
dout(7) << "local_wrlock_finish on " << *lock
<< " on " << *lock->get_parent() << dendl;
return true;
}
-void Locker::local_xlock_finish(LocalLock *lock, Mutation *mut)
+void Locker::local_xlock_finish(LocalLock *lock, MutationRef& mut)
{
dout(7) << "local_xlock_finish on " << *lock
<< " on " << *lock->get_parent() << dendl;
class CDir;
class CInode;
class CDentry;
-struct Mutation;
-struct MDRequest;
class EMetaBlob;
struct SnapRealm;
void send_lock_message(SimpleLock *lock, int msg, const bufferlist &data);
// -- locks --
- void _drop_rdlocks(Mutation *mut, set<CInode*> *pneed_issue);
- void _drop_non_rdlocks(Mutation *mut, set<CInode*> *pneed_issue);
+ void _drop_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue);
+ void _drop_non_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue);
public:
void include_snap_rdlocks(set<SimpleLock*>& rdlocks, CInode *in);
void include_snap_rdlocks_wlayout(set<SimpleLock*>& rdlocks, CInode *in,
CInode *auth_pin_freeze=NULL,
bool auth_pin_nonblock=false);
- void cancel_locking(Mutation *mut, set<CInode*> *pneed_issue);
- void drop_locks(Mutation *mut, set<CInode*> *pneed_issue=0);
- void set_xlocks_done(Mutation *mut, bool skip_dentry=false);
- void drop_non_rdlocks(Mutation *mut, set<CInode*> *pneed_issue=0);
- void drop_rdlocks(Mutation *mut, set<CInode*> *pneed_issue=0);
+ void cancel_locking(MutationRef& mut, set<CInode*> *pneed_issue);
+ void drop_locks(MutationRef& mut, set<CInode*> *pneed_issue=0);
+ void set_xlocks_done(MutationRef& mut, bool skip_dentry=false);
+ void drop_non_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue=0);
+ void drop_rdlocks(MutationRef& mut, set<CInode*> *pneed_issue=0);
void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, list<Context*> *pfinishers=0);
void eval(SimpleLock *lock, bool *need_issue);
bool _rdlock_kick(SimpleLock *lock, bool as_anon);
bool rdlock_try(SimpleLock *lock, client_t client, Context *c);
bool rdlock_start(SimpleLock *lock, MDRequestRef& mut, bool as_anon=false);
- void rdlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue);
+ void rdlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue);
bool can_rdlock_set(set<SimpleLock*>& locks);
bool rdlock_try_set(set<SimpleLock*>& locks);
- void rdlock_take_set(set<SimpleLock*>& locks, Mutation *mut);
+ void rdlock_take_set(set<SimpleLock*>& locks, MutationRef& mut);
- void wrlock_force(SimpleLock *lock, Mutation *mut);
+ void wrlock_force(SimpleLock *lock, MutationRef& mut);
bool wrlock_start(SimpleLock *lock, MDRequestRef& mut, bool nowait=false);
- void wrlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue);
+ void wrlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue);
void remote_wrlock_start(SimpleLock *lock, int target, MDRequestRef& mut);
- void remote_wrlock_finish(SimpleLock *lock, int target, Mutation *mut);
+ void remote_wrlock_finish(SimpleLock *lock, int target, MutationRef& mut);
bool xlock_start(SimpleLock *lock, MDRequestRef& mut);
void _finish_xlock(SimpleLock *lock, client_t xlocker, bool *pneed_issue);
- void xlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue);
+ void xlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue);
- void xlock_export(SimpleLock *lock, Mutation *mut);
+ void xlock_export(SimpleLock *lock, MutationRef& mut);
void xlock_import(SimpleLock *lock);
class C_Locker_ScatterWB : public Context {
Locker *locker;
ScatterLock *lock;
- Mutation *mut;
+ MutationRef mut;
public:
- C_Locker_ScatterWB(Locker *l, ScatterLock *sl, Mutation *m) : locker(l), lock(sl), mut(m) {}
+ C_Locker_ScatterWB(Locker *l, ScatterLock *sl, MutationRef& m) :
+ locker(l), lock(sl), mut(m) {}
void finish(int r) {
locker->scatter_writebehind_finish(lock, mut);
}
};
- void scatter_writebehind_finish(ScatterLock *lock, Mutation *mut);
+ void scatter_writebehind_finish(ScatterLock *lock, MutationRef& mut);
xlist<ScatterLock*> updated_scatterlocks;
public:
// local
public:
- void local_wrlock_grab(LocalLock *lock, Mutation *mut);
+ void local_wrlock_grab(LocalLock *lock, MutationRef& mut);
protected:
bool local_wrlock_start(LocalLock *lock, MDRequestRef& mut);
- void local_wrlock_finish(LocalLock *lock, Mutation *mut);
+ void local_wrlock_finish(LocalLock *lock, MutationRef& mut);
bool local_xlock_start(LocalLock *lock, MDRequestRef& mut);
- void local_xlock_finish(LocalLock *lock, Mutation *mut);
+ void local_xlock_finish(LocalLock *lock, MutationRef& mut);
// file
protected:
void handle_inode_file_caps(class MInodeFileCaps *m);
- void file_update_finish(CInode *in, Mutation *mut, bool share, client_t client, Capability *cap,
+ void file_update_finish(CInode *in, MutationRef& mut, bool share, client_t client, Capability *cap,
MClientCaps *ack);
public:
void calc_new_client_ranges(CInode *in, uint64_t size, map<client_t, client_writeable_range_t>& new_ranges);