session->requests.begin(member_offset(MDRequestImpl,
item_session_request));
while (!p.end()) {
- MDRequestImpl *mdr = *p;
+ MDRequestRef mdrp = (*p)->self_ref.lock();
+ assert(mdr);
++p;
mdcache->request_kill(mdr);
}
/*******
* some generic stuff for finishing off requests
*/
-/* This function takes responsibility for the passed mdr*/
-void Server::journal_and_reply(MDRequest *mdr, CInode *in, CDentry *dn, LogEvent *le, Context *fin)
+void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEvent *le, Context *fin)
{
dout(10) << "journal_and_reply tracei " << in << " tracedn " << dn << dendl;
/*
* send generic response (just an error code), clean up mdr
*/
-void Server::reply_request(MDRequest *mdr, int r, CInode *tracei, CDentry *tracedn)
+void Server::reply_request(MDRequestRef& mdr, int r, CInode *tracei, CDentry *tracedn)
{
reply_request(mdr, new MClientReply(mdr->client_request, r), tracei, tracedn);
}
-void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn)
+void Server::early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn)
{
if (!g_conf->mds_early_reply)
return;
* include a trace to tracei
* Clean up mdr
*/
-void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei, CDentry *tracedn)
+void Server::reply_request(MDRequestRef& mdr, MClientReply *reply, CInode *tracei, CDentry *tracedn)
{
- assert(mdr);
+ assert(mdr.get());
MClientRequest *req = mdr->client_request;
char buf[80];
// clean up request
mdcache->request_finish(mdr);
- mdr = 0;
- req = 0;
// take a closer look at tracei, if it happens to be a remote link
if (tracei &&
CInode *in, CDentry *dn,
snapid_t snapid,
int dentry_wanted,
- MDRequest *mdr)
+ MDRequestRef& mdr)
{
// skip doing this for debugging purposes?
if (g_conf->mds_inject_traceless_reply_probability &&
return;
}
-/* This function takes responsibility for the passed mdr*/
-void Server::dispatch_client_request(MDRequest *mdr)
+void Server::dispatch_client_request(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
return;
}
- MDRequest *mdr = mdcache->request_get(m->get_reqid());
- if (!mdr) {
+ MDRequestRef mdr = mdcache->request_get(m->get_reqid());
+ if (!mdr.get()) {
dout(10) << "handle_slave_request_reply ignoring reply from unknown reqid " << m->get_reqid() << dendl;
m->put();
return;
}
/* This function DOES put the mdr->slave_request before returning*/
-void Server::dispatch_slave_request(MDRequest *mdr)
+void Server::dispatch_slave_request(MDRequestRef& mdr)
{
dout(7) << "dispatch_slave_request " << *mdr << " " << *mdr->slave_request << dendl;
}
/* This function DOES put the mdr->slave_request before returning*/
-void Server::handle_slave_auth_pin(MDRequest *mdr)
+void Server::handle_slave_auth_pin(MDRequestRef& mdr)
{
dout(10) << "handle_slave_auth_pin " << *mdr << dendl;
}
/* This function DOES NOT put the passed ack before returning*/
-void Server::handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
{
dout(10) << "handle_slave_auth_pin_ack on " << *mdr << " " << *ack << dendl;
int from = ack->get_source().num();
* verify that the dir exists and would own the dname.
* do not check if the dentry exists.
*/
-CDir *Server::validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dname)
+CDir *Server::validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname)
{
// make sure parent is a dir?
if (!diri->is_dir()) {
* prepare a null (or existing) dentry in given dir.
* wait for any dn lock.
*/
-CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dname, bool okexist)
+CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist)
{
dout(10) << "prepare_null_dentry " << dname << " in " << *dir << dendl;
assert(dir->is_auth());
return dn;
}
-CDentry* Server::prepare_stray_dentry(MDRequest *mdr, CInode *in)
+CDentry* Server::prepare_stray_dentry(MDRequestRef& mdr, CInode *in)
{
CDentry *straydn = mdr->straydn;
if (straydn) {
*
* create a new inode. set c/m/atime. hit dir pop.
*/
-CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, unsigned mode,
+CInode* Server::prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
ceph_file_layout *layout)
{
CInode *in = new CInode(mdcache);
return in;
}
-void Server::journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob)
+void Server::journal_allocated_inos(MDRequestRef& mdr, EMetaBlob *blob)
{
dout(20) << "journal_allocated_inos sessionmapv " << mds->sessionmap.projected
<< " inotablev " << mds->inotable->get_projected_version()
mds->inotable->get_projected_version());
}
-void Server::apply_allocated_inos(MDRequest *mdr)
+void Server::apply_allocated_inos(MDRequestRef& mdr)
{
Session *session = mdr->session;
dout(10) << "apply_allocated_inos " << mdr->alloc_ino
-CDir *Server::traverse_to_auth_dir(MDRequest *mdr, vector<CDentry*> &trace, filepath refpath)
+CDir *Server::traverse_to_auth_dir(MDRequestRef& mdr, vector<CDentry*> &trace, filepath refpath)
{
// figure parent dir vs dname
if (refpath.depth() == 0) {
class C_MDS_TryFindInode : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
public:
- C_MDS_TryFindInode(Server *s, MDRequest *r) : server(s), mdr(r) {
- mdr->get();
- }
+ C_MDS_TryFindInode(Server *s, MDRequestRef& r) : server(s), mdr(r) {}
virtual void finish(int r) {
if (r == -ESTALE) // :( find_ino_peers failed
server->reply_request(mdr, r);
else
server->dispatch_client_request(mdr);
- mdr->put();
}
};
/* If this returns null, the request has been handled
* as appropriate: forwarded on, or the client's been replied to */
-CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n,
+CInode* Server::rdlock_path_pin_ref(MDRequestRef& mdr, int n,
set<SimpleLock*> &rdlocks,
bool want_auth,
bool no_want_auth, /* for readdir, who doesn't want auth _even_if_ it's
* create null dentry in place (or use existing if okexist).
* get rdlocks on traversed dentries, xlock on new dentry.
*/
-CDentry* Server::rdlock_path_xlock_dentry(MDRequest *mdr, int n,
+CDentry* Server::rdlock_path_xlock_dentry(MDRequestRef& mdr, int n,
set<SimpleLock*>& rdlocks, set<SimpleLock*>& wrlocks, set<SimpleLock*>& xlocks,
bool okexist, bool mustexist, bool alwaysxlock,
ceph_file_layout **layout)
* @param mdr request
* @returns the pointer, or NULL if it had to be delayed (but mdr is taken care of)
*/
-CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr)
+CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequestRef& mdr)
{
CDir *dir = diri->get_dirfrag(fg);
// ===============================================================================
// STAT
-void Server::handle_client_getattr(MDRequest *mdr, bool is_lookup)
+void Server::handle_client_getattr(MDRequestRef& mdr, bool is_lookup)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
struct C_MDS_LookupIno2 : public Context {
Server *server;
- MDRequest *mdr;
- C_MDS_LookupIno2(Server *s, MDRequest *r) : server(s), mdr(r) {}
+ MDRequestRef mdr;
+ C_MDS_LookupIno2(Server *s, MDRequestRef& r) : server(s), mdr(r) {}
void finish(int r) {
server->_lookup_ino_2(mdr, r);
}
/*
* filepath: ino
*/
-void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry)
+void Server::handle_client_lookup_ino(MDRequestRef& mdr,
+ bool want_parent, bool want_dentry)
{
MClientRequest *req = mdr->client_request;
}
}
-void Server::_lookup_ino_2(MDRequest *mdr, int r)
+void Server::_lookup_ino_2(MDRequestRef& mdr, int r)
{
inodeno_t ino = mdr->client_request->get_filepath().get_ino();
- dout(10) << "_lookup_ino_2 " << mdr << " ino " << ino << " r=" << r << dendl;
+ dout(10) << "_lookup_ino_2 " << mdr.get() << " ino " << ino << " r=" << r << dendl;
if (r >= 0) {
if (r == mds->get_nodeid())
dispatch_client_request(mdr);
/* This function takes responsibility for the passed mdr*/
-void Server::handle_client_open(MDRequest *mdr)
+void Server::handle_client_open(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
class C_MDS_openc_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *dn;
CInode *newi;
snapid_t follows;
public:
- C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, snapid_t f) :
+ C_MDS_openc_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) :
mds(m), mdr(r), dn(d), newi(ni), follows(f) {}
void finish(int r) {
assert(r == 0);
};
/* This function takes responsibility for the passed mdr*/
-void Server::handle_client_openc(MDRequest *mdr)
+void Server::handle_client_openc(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
client_t client = mdr->get_client();
-void Server::handle_client_readdir(MDRequest *mdr)
+void Server::handle_client_readdir(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
client_t client = req->get_source().num();
*/
class C_MDS_inode_update_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CInode *in;
bool truncating_smaller, changed_ranges;
public:
- C_MDS_inode_update_finish(MDS *m, MDRequest *r, CInode *i,
+ C_MDS_inode_update_finish(MDS *m, MDRequestRef& r, CInode *i,
bool sm=false, bool cr=false) :
mds(m), mdr(r), in(i), truncating_smaller(sm), changed_ranges(cr) { }
void finish(int r) {
}
};
-void Server::handle_client_file_setlock(MDRequest *mdr)
+void Server::handle_client_file_setlock(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
dout(10) << " state after lock change: " << *lock_state << dendl;
}
-void Server::handle_client_file_readlock(MDRequest *mdr)
+void Server::handle_client_file_readlock(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
reply_request(mdr, reply);
}
-void Server::handle_client_setattr(MDRequest *mdr)
+void Server::handle_client_setattr(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
}
/* Takes responsibility for mdr */
-void Server::do_open_truncate(MDRequest *mdr, int cmode)
+void Server::do_open_truncate(MDRequestRef& mdr, int cmode)
{
CInode *in = mdr->in[0];
client_t client = mdr->get_client();
/* This function cleans up the passed mdr */
-void Server::handle_client_setlayout(MDRequest *mdr)
+void Server::handle_client_setlayout(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
}
-void Server::handle_client_setdirlayout(MDRequest *mdr)
+void Server::handle_client_setdirlayout(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
return 0;
}
-void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur,
+void Server::handle_set_vxattr(MDRequestRef& mdr, CInode *cur,
ceph_file_layout *dir_layout,
set<SimpleLock*> rdlocks,
set<SimpleLock*> wrlocks,
reply_request(mdr, -EINVAL);
}
-void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur,
+void Server::handle_remove_vxattr(MDRequestRef& mdr, CInode *cur,
set<SimpleLock*> rdlocks,
set<SimpleLock*> wrlocks,
set<SimpleLock*> xlocks)
class C_MDS_inode_xattr_update_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CInode *in;
public:
- C_MDS_inode_xattr_update_finish(MDS *m, MDRequest *r, CInode *i) :
+ C_MDS_inode_xattr_update_finish(MDS *m, MDRequestRef& r, CInode *i) :
mds(m), mdr(r), in(i) { }
void finish(int r) {
assert(r == 0);
}
};
-void Server::handle_client_setxattr(MDRequest *mdr)
+void Server::handle_client_setxattr(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
string name(req->get_path2());
journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
}
-void Server::handle_client_removexattr(MDRequest *mdr)
+void Server::handle_client_removexattr(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
string name(req->get_path2());
class C_MDS_mknod_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *dn;
CInode *newi;
snapid_t follows;
public:
- C_MDS_mknod_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, snapid_t f) :
+ C_MDS_mknod_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) :
mds(m), mdr(r), dn(d), newi(ni), follows(f) {}
void finish(int r) {
assert(r == 0);
};
-void Server::handle_client_mknod(MDRequest *mdr)
+void Server::handle_client_mknod(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
client_t client = mdr->get_client();
// MKDIR
/* This function takes responsibility for the passed mdr*/
-void Server::handle_client_mkdir(MDRequest *mdr)
+void Server::handle_client_mkdir(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
// SYMLINK
-void Server::handle_client_symlink(MDRequest *mdr)
+void Server::handle_client_symlink(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
set<SimpleLock*> rdlocks, wrlocks, xlocks;
// LINK
-void Server::handle_client_link(MDRequest *mdr)
+void Server::handle_client_link(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
class C_MDS_link_local_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *dn;
CInode *targeti;
version_t dnpv;
version_t tipv;
public:
- C_MDS_link_local_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ti,
+ C_MDS_link_local_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ti,
version_t dnpv_, version_t tipv_) :
mds(m), mdr(r), dn(d), targeti(ti),
dnpv(dnpv_), tipv(tipv_) { }
};
-void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti)
+void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti)
{
dout(10) << "_link_local " << *dn << " to " << *targeti << dendl;
journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_local_finish(mds, mdr, dn, targeti, dnpv, tipv));
}
-void Server::_link_local_finish(MDRequest *mdr, CDentry *dn, CInode *targeti,
+void Server::_link_local_finish(MDRequestRef& mdr, CDentry *dn, CInode *targeti,
version_t dnpv, version_t tipv)
{
dout(10) << "_link_local_finish " << *dn << " to " << *targeti << dendl;
class C_MDS_link_remote_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
bool inc;
CDentry *dn;
CInode *targeti;
version_t dpv;
public:
- C_MDS_link_remote_finish(MDS *m, MDRequest *r, bool i, CDentry *d, CInode *ti) :
+ C_MDS_link_remote_finish(MDS *m, MDRequestRef& r, bool i, CDentry *d, CInode *ti) :
mds(m), mdr(r), inc(i), dn(d), targeti(ti),
dpv(d->get_projected_version()) {}
void finish(int r) {
}
};
-void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti)
+void Server::_link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti)
{
dout(10) << "_link_remote "
<< (inc ? "link ":"unlink ")
journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_remote_finish(mds, mdr, inc, dn, targeti));
}
-void Server::_link_remote_finish(MDRequest *mdr, bool inc,
+void Server::_link_remote_finish(MDRequestRef& mdr, bool inc,
CDentry *dn, CInode *targeti,
version_t dpv)
{
class C_MDS_SlaveLinkPrep : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
CInode *targeti;
public:
- C_MDS_SlaveLinkPrep(Server *s, MDRequest *r, CInode *t) :
+ C_MDS_SlaveLinkPrep(Server *s, MDRequestRef& r, CInode *t) :
server(s), mdr(r), targeti(t) { }
void finish(int r) {
assert(r == 0);
class C_MDS_SlaveLinkCommit : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
CInode *targeti;
public:
- C_MDS_SlaveLinkCommit(Server *s, MDRequest *r, CInode *t) :
+ C_MDS_SlaveLinkCommit(Server *s, MDRequestRef& r, CInode *t) :
server(s), mdr(r), targeti(t) { }
void finish(int r) {
server->_commit_slave_link(mdr, r, targeti);
};
/* This function DOES put the mdr->slave_request before returning*/
-void Server::handle_slave_link_prep(MDRequest *mdr)
+void Server::handle_slave_link_prep(MDRequestRef& mdr)
{
dout(10) << "handle_slave_link_prep " << *mdr
<< " on " << mdr->slave_request->get_object_info()
mdlog->flush();
}
-void Server::_logged_slave_link(MDRequest *mdr, CInode *targeti)
+void Server::_logged_slave_link(MDRequestRef& mdr, CInode *targeti)
{
dout(10) << "_logged_slave_link " << *mdr
<< " " << *targeti << dendl;
struct C_MDS_CommittedSlave : public Context {
Server *server;
- MDRequest *mdr;
- C_MDS_CommittedSlave(Server *s, MDRequest *m) : server(s), mdr(m) {}
+ MDRequestRef mdr;
+ C_MDS_CommittedSlave(Server *s, MDRequestRef& m) : server(s), mdr(m) {}
void finish(int r) {
server->_committed_slave(mdr);
}
};
-void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti)
+void Server::_commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti)
{
dout(10) << "_commit_slave_link " << *mdr
<< " r=" << r
}
}
-void Server::_committed_slave(MDRequest *mdr)
+void Server::_committed_slave(MDRequestRef& mdr)
{
dout(10) << "_committed_slave " << *mdr << dendl;
struct C_MDS_LoggedLinkRollback : public Context {
Server *server;
Mutation *mut;
- MDRequest *mdr;
- C_MDS_LoggedLinkRollback(Server *s, Mutation *m, MDRequest *r) : server(s), mut(m), mdr(r) {}
+ MDRequestRef mdr;
+ C_MDS_LoggedLinkRollback(Server *s, Mutation *m, MDRequestRef& r) : server(s), mut(m), mdr(r) {}
void finish(int r) {
server->_link_rollback_finish(mut, mdr);
}
};
-void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
+void Server::do_link_rollback(bufferlist &rbl, int master, MDRequestRef& mdr)
{
link_rollback rollback;
bufferlist::iterator p = rbl.begin();
mdlog->flush();
}
-void Server::_link_rollback_finish(Mutation *mut, MDRequest *mdr)
+void Server::_link_rollback_finish(Mutation *mut, MDRequestRef& mdr)
{
dout(10) << "_link_rollback_finish" << dendl;
/* This function DOES NOT put the passed message before returning*/
-void Server::handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m)
+void Server::handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m)
{
dout(10) << "handle_slave_link_prep_ack " << *mdr
<< " " << *m << dendl;
// UNLINK
-void Server::handle_client_unlink(MDRequest *mdr)
+void Server::handle_client_unlink(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
client_t client = mdr->get_client();
class C_MDS_unlink_local_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *dn;
CDentry *straydn;
version_t dnpv; // deleted dentry
public:
- C_MDS_unlink_local_finish(MDS *m, MDRequest *r, CDentry *d, CDentry *sd) :
+ C_MDS_unlink_local_finish(MDS *m, MDRequestRef& r, CDentry *d, CDentry *sd) :
mds(m), mdr(r), dn(d), straydn(sd),
dnpv(d->get_projected_version()) {}
void finish(int r) {
}
};
-void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
+void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn)
{
dout(10) << "_unlink_local " << *dn << dendl;
journal_and_reply(mdr, 0, dn, le, new C_MDS_unlink_local_finish(mds, mdr, dn, straydn));
}
-void Server::_unlink_local_finish(MDRequest *mdr,
+void Server::_unlink_local_finish(MDRequestRef& mdr,
CDentry *dn, CDentry *straydn,
version_t dnpv)
{
dn->get_dir()->try_remove_unlinked_dn(dn);
}
-bool Server::_rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn)
+bool Server::_rmdir_prepare_witness(MDRequestRef& mdr, int who, CDentry *dn, CDentry *straydn)
{
if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
dout(10) << "_rmdir_prepare_witness mds." << who << " is not active" << dendl;
struct C_MDS_SlaveRmdirPrep : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *dn, *straydn;
- C_MDS_SlaveRmdirPrep(Server *s, MDRequest *r, CDentry *d, CDentry *st)
+ C_MDS_SlaveRmdirPrep(Server *s, MDRequestRef& r, CDentry *d, CDentry *st)
: server(s), mdr(r), dn(d), straydn(st) {}
void finish(int r) {
server->_logged_slave_rmdir(mdr, dn, straydn);
struct C_MDS_SlaveRmdirCommit : public Context {
Server *server;
- MDRequest *mdr;
- C_MDS_SlaveRmdirCommit(Server *s, MDRequest *r)
+ MDRequestRef mdr;
+ C_MDS_SlaveRmdirCommit(Server *s, MDRequestRef& r)
: server(s), mdr(r) { }
void finish(int r) {
server->_commit_slave_rmdir(mdr, r);
}
};
-void Server::handle_slave_rmdir_prep(MDRequest *mdr)
+void Server::handle_slave_rmdir_prep(MDRequestRef& mdr)
{
dout(10) << "handle_slave_rmdir_prep " << *mdr
<< " " << mdr->slave_request->srcdnpath
mdlog->flush();
}
-void Server::_logged_slave_rmdir(MDRequest *mdr, CDentry *dn, CDentry *straydn)
+void Server::_logged_slave_rmdir(MDRequestRef& mdr, CDentry *dn, CDentry *straydn)
{
dout(10) << "_logged_slave_rmdir " << *mdr << " on " << *dn << dendl;
}
}
-void Server::handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
{
dout(10) << "handle_slave_rmdir_prep_ack " << *mdr
<< " " << *ack << dendl;
dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl;
}
-void Server::_commit_slave_rmdir(MDRequest *mdr, int r)
+void Server::_commit_slave_rmdir(MDRequestRef& mdr, int r)
{
dout(10) << "_commit_slave_rmdir " << *mdr << " r=" << r << dendl;
struct C_MDS_LoggedRmdirRollback : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
metareqid_t reqid;
CDentry *dn;
CDentry *straydn;
- C_MDS_LoggedRmdirRollback(Server *s, MDRequest *m, metareqid_t mr, CDentry *d, CDentry *st)
+ C_MDS_LoggedRmdirRollback(Server *s, MDRequestRef& m, metareqid_t mr, CDentry *d, CDentry *st)
: server(s), mdr(m), reqid(mr), dn(d), straydn(st) {}
void finish(int r) {
server->_rmdir_rollback_finish(mdr, reqid, dn, straydn);
}
};
-void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr)
+void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequestRef& mdr)
{
// unlink the other rollback methods, the rmdir rollback is only
// needed to record the subtree changes in the journal for inode
mdlog->flush();
}
-void Server::_rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn)
+void Server::_rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn)
{
dout(10) << "_rmdir_rollback_finish " << reqid << dendl;
* the unlocked varient this is a fastpath check. we can't really be
* sure until we rdlock the filelock.
*/
-bool Server::_dir_is_nonempty_unlocked(MDRequest *mdr, CInode *in)
+bool Server::_dir_is_nonempty_unlocked(MDRequestRef& mdr, CInode *in)
{
dout(10) << "dir_is_nonempty_unlocked " << *in << dendl;
assert(in->is_auth());
return false;
}
-bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in)
+bool Server::_dir_is_nonempty(MDRequestRef& mdr, CInode *in)
{
dout(10) << "dir_is_nonempty " << *in << dendl;
assert(in->is_auth());
class C_MDS_rename_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *srcdn;
CDentry *destdn;
CDentry *straydn;
public:
- C_MDS_rename_finish(MDS *m, MDRequest *r,
+ C_MDS_rename_finish(MDS *m, MDRequestRef& r,
CDentry *sdn, CDentry *ddn, CDentry *stdn) :
mds(m), mdr(r),
srcdn(sdn), destdn(ddn), straydn(stdn) { }
*
* This function takes responsibility for the passed mdr.
*/
-void Server::handle_client_rename(MDRequest *mdr)
+void Server::handle_client_rename(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
dout(7) << "handle_client_rename " << *req << dendl;
}
-void Server::_rename_finish(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
+void Server::_rename_finish(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
{
dout(10) << "_rename_finish " << *mdr << dendl;
// helpers
-bool Server::_rename_prepare_witness(MDRequest *mdr, int who, set<int> &witnesse,
+bool Server::_rename_prepare_witness(MDRequestRef& mdr, int who, set<int> &witnesse,
CDentry *srcdn, CDentry *destdn, CDentry *straydn)
{
if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
return true;
}
-version_t Server::_rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferlist *client_map_bl)
+version_t Server::_rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, bufferlist *client_map_bl)
{
version_t oldpv = mdr->more()->inode_import_v;
return force_journal;
}
-void Server::_rename_prepare(MDRequest *mdr,
+void Server::_rename_prepare(MDRequestRef& mdr,
EMetaBlob *metablob, bufferlist *client_map_bl,
CDentry *srcdn, CDentry *destdn, CDentry *straydn)
{
}
-void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
+void Server::_rename_apply(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
{
dout(10) << "_rename_apply " << *mdr << " " << *srcdn << " " << *destdn << dendl;
dout(10) << " pvs " << mdr->more()->pvmap << dendl;
class C_MDS_SlaveRenamePrep : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *srcdn, *destdn, *straydn;
public:
- C_MDS_SlaveRenamePrep(Server *s, MDRequest *m, CDentry *sr, CDentry *de, CDentry *st) :
+ C_MDS_SlaveRenamePrep(Server *s, MDRequestRef& m, CDentry *sr, CDentry *de, CDentry *st) :
server(s), mdr(m), srcdn(sr), destdn(de), straydn(st) {}
void finish(int r) {
server->_logged_slave_rename(mdr, srcdn, destdn, straydn);
class C_MDS_SlaveRenameCommit : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *srcdn, *destdn, *straydn;
public:
- C_MDS_SlaveRenameCommit(Server *s, MDRequest *m, CDentry *sr, CDentry *de, CDentry *st) :
+ C_MDS_SlaveRenameCommit(Server *s, MDRequestRef& m, CDentry *sr, CDentry *de, CDentry *st) :
server(s), mdr(m), srcdn(sr), destdn(de), straydn(st) {}
void finish(int r) {
server->_commit_slave_rename(mdr, r, srcdn, destdn, straydn);
class C_MDS_SlaveRenameSessionsFlushed : public Context {
Server *server;
- MDRequest *mdr;
+ MDRequestRef mdr;
public:
- C_MDS_SlaveRenameSessionsFlushed(Server *s, MDRequest *r) :
- server(s), mdr(r) {
- mdr->get();
- }
+ C_MDS_SlaveRenameSessionsFlushed(Server *s, MDRequestRef& r) :
+ server(s), mdr(r) {}
void finish(int r) {
server->_slave_rename_sessions_flushed(mdr);
- mdr->put();
}
};
/* This function DOES put the mdr->slave_request before returning*/
-void Server::handle_slave_rename_prep(MDRequest *mdr)
+void Server::handle_slave_rename_prep(MDRequestRef& mdr)
{
dout(10) << "handle_slave_rename_prep " << *mdr
<< " " << mdr->slave_request->srcdnpath
mdlog->flush();
}
-void Server::_logged_slave_rename(MDRequest *mdr,
+void Server::_logged_slave_rename(MDRequestRef& mdr,
CDentry *srcdn, CDentry *destdn, CDentry *straydn)
{
dout(10) << "_logged_slave_rename " << *mdr << dendl;
}
}
-void Server::_commit_slave_rename(MDRequest *mdr, int r,
+void Server::_commit_slave_rename(MDRequestRef& mdr, int r,
CDentry *srcdn, CDentry *destdn, CDentry *straydn)
{
dout(10) << "_commit_slave_rename " << *mdr << " r=" << r << dendl;
struct C_MDS_LoggedRenameRollback : public Context {
Server *server;
Mutation *mut;
- MDRequest *mdr;
+ MDRequestRef mdr;
CDentry *srcdn;
version_t srcdnpv;
CDentry *destdn;
CDentry *straydn;
bool finish_mdr;
- C_MDS_LoggedRenameRollback(Server *s, Mutation *m, MDRequest *r,
+ C_MDS_LoggedRenameRollback(Server *s, Mutation *m, MDRequestRef& r,
CDentry *sd, version_t pv, CDentry *dd,
CDentry *st, bool f) :
server(s), mut(m), mdr(r), srcdn(sd), srcdnpv(pv), destdn(dd),
}
};
-void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr,
+void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequestRef& mdr,
bool finish_mdr)
{
rename_rollback rollback;
mdlog->flush();
}
-void Server::_rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *srcdn,
+void Server::_rename_rollback_finish(Mutation *mut, MDRequestRef& mdr, CDentry *srcdn,
version_t srcdnpv, CDentry *destdn,
CDentry *straydn, bool finish_mdr)
{
}
/* This function DOES put the passed message before returning*/
-void Server::handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
{
dout(10) << "handle_slave_rename_prep_ack " << *mdr
<< " witnessed by " << ack->get_source()
dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl;
}
-void Server::handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_rename_notify_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
{
dout(10) << "handle_slave_rename_notify_ack " << *mdr << " from mds."
<< ack->get_source() << dendl;
}
}
-void Server::_slave_rename_sessions_flushed(MDRequest *mdr)
+void Server::_slave_rename_sessions_flushed(MDRequestRef& mdr)
{
dout(10) << "_slave_rename_sessions_flushed " << *mdr << dendl;
// snaps
/* This function takes responsibility for the passed mdr*/
-void Server::handle_client_lssnap(MDRequest *mdr)
+void Server::handle_client_lssnap(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
struct C_MDS_mksnap_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CInode *diri;
SnapInfo info;
- C_MDS_mksnap_finish(MDS *m, MDRequest *r, CInode *di, SnapInfo &i) :
+ C_MDS_mksnap_finish(MDS *m, MDRequestRef& r, CInode *di, SnapInfo &i) :
mds(m), mdr(r), diri(di), info(i) {}
void finish(int r) {
mds->server->_mksnap_finish(mdr, diri, info);
};
/* This function takes responsibility for the passed mdr*/
-void Server::handle_client_mksnap(MDRequest *mdr)
+void Server::handle_client_mksnap(MDRequestRef& mdr)
{
if (!mds->mdsmap->allows_snaps()) {
// you can't make snapshots until you set an option right now
mdlog->flush();
}
-void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info)
+void Server::_mksnap_finish(MDRequestRef& mdr, CInode *diri, SnapInfo &info)
{
dout(10) << "_mksnap_finish " << *mdr << " " << info << dendl;
struct C_MDS_rmsnap_finish : public Context {
MDS *mds;
- MDRequest *mdr;
+ MDRequestRef mdr;
CInode *diri;
snapid_t snapid;
- C_MDS_rmsnap_finish(MDS *m, MDRequest *r, CInode *di, snapid_t sn) :
+ C_MDS_rmsnap_finish(MDS *m, MDRequestRef& r, CInode *di, snapid_t sn) :
mds(m), mdr(r), diri(di), snapid(sn) {}
void finish(int r) {
mds->server->_rmsnap_finish(mdr, diri, snapid);
};
/* This function takes responsibility for the passed mdr*/
-void Server::handle_client_rmsnap(MDRequest *mdr)
+void Server::handle_client_rmsnap(MDRequestRef& mdr)
{
MClientRequest *req = mdr->client_request;
mdlog->flush();
}
-void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid)
+void Server::_rmsnap_finish(MDRequestRef& mdr, CInode *diri, snapid_t snapid)
{
dout(10) << "_rmsnap_finish " << *mdr << " " << snapid << dendl;
snapid_t stid = mdr->more()->stid;
class PerfCounters;
class LogEvent;
-struct MDRequest;
-struct Mutation;
class EMetaBlob;
class EUpdate;
class MMDSSlaveRequest;
struct SnapInfo;
+struct MutationImpl;
+struct MDRequestImpl;
+typedef ceph::shared_ptr<MutationImpl> MutationRef;
+typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
+
enum {
l_mdss_first = 1000,
l_mdss_hcreq,
// -- requests --
void handle_client_request(MClientRequest *m);
- void journal_and_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn,
+ void journal_and_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn,
LogEvent *le, Context *fin);
- void dispatch_client_request(MDRequest *mdr);
- void early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn);
- void reply_request(MDRequest *mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0);
- void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
+ void dispatch_client_request(MDRequestRef& mdr);
+ void early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn);
+ void reply_request(MDRequestRef& mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0);
+ void reply_request(MDRequestRef& mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
snapid_t snapid,
int num_dentries_wanted,
- MDRequest *mdr);
+ MDRequestRef& mdr);
void encode_empty_dirstat(bufferlist& bl);
void encode_infinite_lease(bufferlist& bl);
void handle_slave_request(MMDSSlaveRequest *m);
void handle_slave_request_reply(MMDSSlaveRequest *m);
- void dispatch_slave_request(MDRequest *mdr);
- void handle_slave_auth_pin(MDRequest *mdr);
- void handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack);
+ void dispatch_slave_request(MDRequestRef& mdr);
+ void handle_slave_auth_pin(MDRequestRef& mdr);
+ void handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack);
// some helpers
- CDir *validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dname);
- CDir *traverse_to_auth_dir(MDRequest *mdr, vector<CDentry*> &trace, filepath refpath);
- CDentry *prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dname, bool okexist=false);
- CDentry *prepare_stray_dentry(MDRequest *mdr, CInode *in);
- CInode* prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, unsigned mode,
+ CDir *validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname);
+ CDir *traverse_to_auth_dir(MDRequestRef& mdr, vector<CDentry*> &trace, filepath refpath);
+ CDentry *prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist=false);
+ CDentry *prepare_stray_dentry(MDRequestRef& mdr, CInode *in);
+ CInode* prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
ceph_file_layout *layout=NULL);
- void journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob);
- void apply_allocated_inos(MDRequest *mdr);
+ void journal_allocated_inos(MDRequestRef& mdr, EMetaBlob *blob);
+ void apply_allocated_inos(MDRequestRef& mdr);
- CInode* rdlock_path_pin_ref(MDRequest *mdr, int n, set<SimpleLock*>& rdlocks, bool want_auth,
+ CInode* rdlock_path_pin_ref(MDRequestRef& mdr, int n, set<SimpleLock*>& rdlocks, bool want_auth,
bool no_want_auth=false,
ceph_file_layout **layout=NULL,
bool no_lookup=false);
- CDentry* rdlock_path_xlock_dentry(MDRequest *mdr, int n, set<SimpleLock*>& rdlocks, set<SimpleLock*>& wrlocks,
- set<SimpleLock*>& xlocks, bool okexist, bool mustexist, bool alwaysxlock,
+ CDentry* rdlock_path_xlock_dentry(MDRequestRef& mdr, int n,
+ set<SimpleLock*>& rdlocks,
+ set<SimpleLock*>& wrlocks,
+ set<SimpleLock*>& xlocks, bool okexist,
+ bool mustexist, bool alwaysxlock,
ceph_file_layout **layout=NULL);
- CDir* try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr);
+ CDir* try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequestRef& mdr);
// requests on existing inodes.
- void handle_client_getattr(MDRequest *mdr, bool is_lookup);
- void handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry);
- void _lookup_ino_2(MDRequest *mdr, int r);
- void handle_client_readdir(MDRequest *mdr);
- void handle_client_file_setlock(MDRequest *mdr);
- void handle_client_file_readlock(MDRequest *mdr);
-
- void handle_client_setattr(MDRequest *mdr);
- void handle_client_setlayout(MDRequest *mdr);
- void handle_client_setdirlayout(MDRequest *mdr);
+ void handle_client_getattr(MDRequestRef& mdr, bool is_lookup);
+ void handle_client_lookup_ino(MDRequestRef& mdr,
+ bool want_parent, bool want_dentry);
+ void _lookup_ino_2(MDRequestRef& mdr, int r);
+ void handle_client_readdir(MDRequestRef& mdr);
+ void handle_client_file_setlock(MDRequestRef& mdr);
+ void handle_client_file_readlock(MDRequestRef& mdr);
+
+ void handle_client_setattr(MDRequestRef& mdr);
+ void handle_client_setlayout(MDRequestRef& mdr);
+ void handle_client_setdirlayout(MDRequestRef& mdr);
int parse_layout_vxattr(string name, string value, ceph_file_layout *layout);
- void handle_set_vxattr(MDRequest *mdr, CInode *cur,
+ void handle_set_vxattr(MDRequestRef& mdr, CInode *cur,
ceph_file_layout *dir_layout,
set<SimpleLock*> rdlocks,
set<SimpleLock*> wrlocks,
set<SimpleLock*> xlocks);
- void handle_remove_vxattr(MDRequest *mdr, CInode *cur,
+ void handle_remove_vxattr(MDRequestRef& mdr, CInode *cur,
set<SimpleLock*> rdlocks,
set<SimpleLock*> wrlocks,
set<SimpleLock*> xlocks);
- void handle_client_setxattr(MDRequest *mdr);
- void handle_client_removexattr(MDRequest *mdr);
+ void handle_client_setxattr(MDRequestRef& mdr);
+ void handle_client_removexattr(MDRequestRef& mdr);
- void handle_client_fsync(MDRequest *mdr);
+ void handle_client_fsync(MDRequestRef& mdr);
// open
- void handle_client_open(MDRequest *mdr);
- void handle_client_openc(MDRequest *mdr); // O_CREAT variant.
- void do_open_truncate(MDRequest *mdr, int cmode); // O_TRUNC variant.
+ void handle_client_open(MDRequestRef& mdr);
+ void handle_client_openc(MDRequestRef& mdr); // O_CREAT variant.
+ void do_open_truncate(MDRequestRef& mdr, int cmode); // O_TRUNC variant.
// namespace changes
- void handle_client_mknod(MDRequest *mdr);
- void handle_client_mkdir(MDRequest *mdr);
- void handle_client_symlink(MDRequest *mdr);
+ void handle_client_mknod(MDRequestRef& mdr);
+ void handle_client_mkdir(MDRequestRef& mdr);
+ void handle_client_symlink(MDRequestRef& mdr);
// link
- void handle_client_link(MDRequest *mdr);
- void _link_local(MDRequest *mdr, CDentry *dn, CInode *targeti);
- void _link_local_finish(MDRequest *mdr,
+ void handle_client_link(MDRequestRef& mdr);
+ void _link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti);
+ void _link_local_finish(MDRequestRef& mdr,
CDentry *dn, CInode *targeti,
version_t, version_t);
- void _link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti);
- void _link_remote_finish(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti,
+ void _link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti);
+ void _link_remote_finish(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti,
version_t);
- void handle_slave_link_prep(MDRequest *mdr);
- void _logged_slave_link(MDRequest *mdr, CInode *targeti);
- void _commit_slave_link(MDRequest *mdr, int r, CInode *targeti);
- void _committed_slave(MDRequest *mdr); // use for rename, too
- void handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m);
- void do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr);
- void _link_rollback_finish(Mutation *mut, MDRequest *mdr);
+ void handle_slave_link_prep(MDRequestRef& mdr);
+ void _logged_slave_link(MDRequestRef& mdr, CInode *targeti);
+ void _commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti);
+ void _committed_slave(MDRequestRef& mdr); // use for rename, too
+ void handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m);
+ void do_link_rollback(bufferlist &rbl, int master, MDRequestRef& mdr);
+ void _link_rollback_finish(Mutation *mut, MDRequestRef& mdr);
// unlink
- void handle_client_unlink(MDRequest *mdr);
- bool _dir_is_nonempty_unlocked(MDRequest *mdr, CInode *rmdiri);
- bool _dir_is_nonempty(MDRequest *mdr, CInode *rmdiri);
- void _unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn);
- void _unlink_local_finish(MDRequest *mdr,
+ void handle_client_unlink(MDRequestRef& mdr);
+ bool _dir_is_nonempty_unlocked(MDRequestRef& mdr, CInode *rmdiri);
+ bool _dir_is_nonempty(MDRequestRef& mdr, CInode *rmdiri);
+ void _unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn);
+ void _unlink_local_finish(MDRequestRef& mdr,
CDentry *dn, CDentry *straydn,
version_t);
- bool _rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn);
- void handle_slave_rmdir_prep(MDRequest *mdr);
- void _logged_slave_rmdir(MDRequest *mdr, CDentry *srcdn, CDentry *straydn);
- void _commit_slave_rmdir(MDRequest *mdr, int r);
- void handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack);
- void do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr);
- void _rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn);
+ bool _rmdir_prepare_witness(MDRequestRef& mdr, int who, CDentry *dn, CDentry *straydn);
+ void handle_slave_rmdir_prep(MDRequestRef& mdr);
+ void _logged_slave_rmdir(MDRequestRef& mdr, CDentry *srcdn, CDentry *straydn);
+ void _commit_slave_rmdir(MDRequestRef& mdr, int r);
+ void handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack);
+ void do_rmdir_rollback(bufferlist &rbl, int master, MDRequestRef& mdr);
+ void _rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn);
// rename
- void handle_client_rename(MDRequest *mdr);
- void _rename_finish(MDRequest *mdr,
+ void handle_client_rename(MDRequestRef& mdr);
+ void _rename_finish(MDRequestRef& mdr,
CDentry *srcdn, CDentry *destdn, CDentry *straydn);
- void handle_client_lssnap(MDRequest *mdr);
- void handle_client_mksnap(MDRequest *mdr);
- void _mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info);
- void handle_client_rmsnap(MDRequest *mdr);
- void _rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid);
+ void handle_client_lssnap(MDRequestRef& mdr);
+ void handle_client_mksnap(MDRequestRef& mdr);
+ void _mksnap_finish(MDRequestRef& mdr, CInode *diri, SnapInfo &info);
+ void handle_client_rmsnap(MDRequestRef& mdr);
+ void _rmsnap_finish(MDRequestRef& mdr, CInode *diri, snapid_t snapid);
// helpers
- bool _rename_prepare_witness(MDRequest *mdr, int who, set<int> &witnesse,
+ bool _rename_prepare_witness(MDRequestRef& mdr, int who, set<int> &witnesse,
CDentry *srcdn, CDentry *destdn, CDentry *straydn);
- version_t _rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferlist *client_map_bl);
+ version_t _rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, bufferlist *client_map_bl);
bool _need_force_journal(CInode *diri, bool empty);
- void _rename_prepare(MDRequest *mdr,
+ void _rename_prepare(MDRequestRef& mdr,
EMetaBlob *metablob, bufferlist *client_map_bl,
CDentry *srcdn, CDentry *destdn, CDentry *straydn);
/* set not_journaling=true if you're going to discard the results --
* this bypasses the asserts to make sure we're journaling the right
* things on the right nodes */
- void _rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
+ void _rename_apply(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
// slaving
- void handle_slave_rename_prep(MDRequest *mdr);
- void handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m);
- void handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *m);
- void _slave_rename_sessions_flushed(MDRequest *mdr);
- void _logged_slave_rename(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
- void _commit_slave_rename(MDRequest *mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
- void do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr, bool finish_mdr=false);
- void _rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *srcdn, version_t srcdnpv,
+ void handle_slave_rename_prep(MDRequestRef& mdr);
+ void handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m);
+ void handle_slave_rename_notify_ack(MDRequestRef& mdr, MMDSSlaveRequest *m);
+ void _slave_rename_sessions_flushed(MDRequestRef& mdr);
+ void _logged_slave_rename(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
+ void _commit_slave_rename(MDRequestRef& mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
+ void do_rename_rollback(bufferlist &rbl, int master, MDRequestRef& mdr, bool finish_mdr=false);
+ void _rename_rollback_finish(Mutation *mut, MDRequestRef& mdr, CDentry *srcdn, version_t srcdnpv,
CDentry *destdn, CDentry *staydn, bool finish_mdr);
};