#include "events/EString.h"
#include "events/EUpdate.h"
+#include "events/EOpen.h"
#include "msg/Messenger.h"
LogSegment *ls;
bool share;
C_Locker_FileUpdate_finish(Locker *l, CInode *i, LogSegment *s, bool e=false) :
- locker(l), in(i), ls(s), share(e) {}
+ locker(l), in(i), ls(s), share(e) {
+ in->get(CInode::PIN_PTRWAITER);
+ }
void finish(int r) {
in->pop_and_dirty_projected_inode(ls);
in->put(CInode::PIN_PTRWAITER);
inode_t *pi = in->project_inode();
pi->version = in->pre_dirty();
pi->max_size = new_max;
- EUpdate *le = new EUpdate(mds->mdlog, "max_size increase on open");
+ EOpen *le = new EOpen(mds->mdlog);
le->metablob.add_dir_context(in->get_parent_dir());
le->metablob.add_primary_dentry(in->parent, true, 0, pi);
LogSegment *ls = mds->mdlog->get_current_segment();
- in->get(CInode::PIN_PTRWAITER);
+ le->add_ino(in->ino());
+ ls->open_files.push_back(&in->xlist_open_file);
mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, ls, true));
}
Locker *locker;
CInode *in;
public:
- C_MDL_RequestInodeFileCaps(Locker *l, CInode *i) : locker(l), in(i) {}
+ C_MDL_RequestInodeFileCaps(Locker *l, CInode *i) : locker(l), in(i) {
+ in->get(CInode::PIN_PTRWAITER);
+ }
void finish(int r) {
in->put(CInode::PIN_PTRWAITER);
if (!in->is_auth())
// wait for single auth
if (in->is_ambiguous_auth()) {
- in->get(CInode::PIN_PTRWAITER);
in->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH,
new C_MDL_RequestInodeFileCaps(this, in));
return;
le->metablob.add_dir_context(in->get_parent_dir());
le->metablob.add_primary_dentry(in->parent, true, 0, pi);
LogSegment *ls = mds->mdlog->get_current_segment();
- in->get(CInode::PIN_PTRWAITER);
mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, ls));
}
}
Locker *locker;
ScatterLock *lock;
public:
- C_Locker_ScatterEval(Locker *l, ScatterLock *lk) : locker(l), lock(lk) {}
+ C_Locker_ScatterEval(Locker *l, ScatterLock *lk) : locker(l), lock(lk) {
+ lock->get_parent()->get(CInode::PIN_PTRWAITER);
+ }
void finish(int r) {
lock->get_parent()->put(CInode::PIN_PTRWAITER);
locker->try_scatter_eval(lock);
lock->get_parent()->is_ambiguous_auth()) {
dout(7) << "try_scatter_eval not stable and ambiguous auth, waiting on " << *lock->get_parent() << dendl;
//if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
- lock->get_parent()->get(CInode::PIN_PTRWAITER);
lock->get_parent()->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, new C_Locker_ScatterEval(this, lock));
return;
}
if (!lock->get_parent()->can_auth_pin()) {
dout(7) << "try_scatter_eval can't auth_pin, waiting on " << *lock->get_parent() << dendl;
//if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
- lock->get_parent()->get(CInode::PIN_PTRWAITER);
lock->get_parent()->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_Locker_ScatterEval(this, lock));
return;
}
Locker *locker;
FileLock *lock;
public:
- C_Locker_FileEval(Locker *l, FileLock *lk) : locker(l), lock(lk) {}
+ C_Locker_FileEval(Locker *l, FileLock *lk) : locker(l), lock(lk) {
+ lock->get_parent()->get(CInode::PIN_PTRWAITER);
+ }
void finish(int r) {
lock->get_parent()->put(CInode::PIN_PTRWAITER);
locker->try_file_eval(lock);
in->is_ambiguous_auth()) {
dout(7) << "try_file_eval not stable and ambiguous auth, waiting on " << *in << dendl;
//if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
- in->get(CInode::PIN_PTRWAITER);
in->add_waiter(CInode::WAIT_SINGLEAUTH, new C_Locker_FileEval(this, lock));
return;
}
if (!lock->get_parent()->can_auth_pin()) {
dout(7) << "try_file_eval can't auth_pin, waiting on " << *in << dendl;
//if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
- in->get(CInode::PIN_PTRWAITER);
in->add_waiter(CInode::WAIT_UNFREEZE, new C_Locker_FileEval(this, lock));
return;
}