this allow us to increase reference count of MetaRequest while not holding
the client_lock
Signed-off-by: Yan, Zheng <zyan@redhat.com>
(cherry picked from commit
e464a7765230c504b3e3b88bcb1106f67b7c3eb9)
void Client::put_request(MetaRequest *request)
{
- if (request->get_num_ref() == 1) {
+ if (request->_put()) {
if (request->inode())
put_inode(request->take_inode());
if (request->old_inode())
put_inode(request->take_old_inode());
if (request->other_inode())
put_inode(request->take_other_inode());
+ delete request;
}
- request->_put();
}
int Client::encode_inode_release(Inode *in, MetaRequest *req,
#include "msg/msg_types.h"
#include "include/xlist.h"
#include "include/filepath.h"
+#include "include/atomic.h"
#include "mds/mdstypes.h"
#include "common/Mutex.h"
__u32 sent_on_mseq; // mseq at last submission of this request
int num_fwd; // # of times i've been forwarded
int retry_attempt;
- int ref;
+ atomic_t ref;
MClientReply *reply; // the reply
bool kick;
Dentry *old_dentry();
MetaRequest* get() {
- ++ref;
+ ref.inc();
return this;
}
/// psuedo-private put method; use Client::put_request()
- void _put() {
- if (--ref == 0)
- delete this;
- }
- int get_num_ref() {
- return ref;
+ bool _put() {
+ int v = ref.dec();
+ return v == 0;
}
// normal fields