};
-bool Locker::check_inode_max_size(CInode *in, bool forcewrlock)
+bool Locker::check_inode_max_size(CInode *in, bool forceupdate, __u64 new_size)
{
assert(in->is_auth());
- if (!forcewrlock && !in->filelock.can_wrlock()) {
+ if (!forceupdate && !in->filelock.can_wrlock()) {
// try again later
in->filelock.add_waiter(SimpleLock::WAIT_STABLE, new C_MDL_CheckMaxSize(this, in));
dout(10) << "check_inode_max_size can't wrlock, waiting on " << *in << dendl;
new_max = 0;
else if ((latest->size << 1) >= latest->max_size)
new_max = latest->max_size ? (latest->max_size << 1):in->get_layout_size_increment();
-
- if (new_max == latest->max_size)// && !force_journal)
+
+ if (new_max == latest->max_size && !forceupdate)
return false; // no change.
dout(10) << "check_inode_max_size " << latest->max_size << " -> " << new_max
inode_t *pi = in->project_inode();
pi->version = in->pre_dirty();
pi->max_size = new_max;
+ if (forceupdate) {
+ dout(10) << "check_inode_max_size also forcing size "
+ << pi->size << " -> " << new_size << dendl;
+ pi->size = new_size;
+ pi->dirstat.rbytes = new_size;
+ }
+
EOpen *le = new EOpen(mds->mdlog);
- le->metablob.add_dir_context(in->get_parent_dir());
+ if (forceupdate) // FIXME if/when we do max_size nested accounting
+ predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY);
+ else
+ le->metablob.add_dir_context(in->get_parent_dir());
le->metablob.add_primary_dentry(in->parent, true, 0, pi);
le->add_ino(in->ino());
mut->ls->open_files.push_back(&in->xlist_open_file);
mut->ls = mds->mdlog->get_current_segment();
file_wrlock_force(&in->filelock, mut); // wrlock for duration of journal
mut->auth_pin(in);
- predirty_nested(mut, &le->metablob, in, 0, true, false);
- le->metablob.add_dir_context(in->get_parent_dir());
+ predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(in->parent, true, 0, pi);
mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, mut, change_max));
}
lock->clear_updated();
EUpdate *le = new EUpdate(mds->mdlog, "scatter_writebehind");
- predirty_nested(mut, &le->metablob, in, 0, true, false);
+ predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi);
mds->mdlog->submit_entry(le);
assert(in->is_auth());
assert(lock->is_stable());
- if (lock->get_state() == LOCK_LOCK) {
- if (in->is_replicated()) {
- bufferlist softdata;
- lock->encode_locked_state(softdata);
- send_lock_message(lock, LOCK_AC_SYNC, softdata);
- }
-
- // change lock
- lock->set_state(LOCK_SYNC);
- issue_caps(in); // reissue caps
- return true;
- } else {
+ if (lock->get_state() != LOCK_LOCK) {
// gather?
switch (lock->get_state()) {
case LOCK_MIXED: lock->set_state(LOCK_GSYNCM); break;
}
int gather = 0;
- if (in->is_replicated()) {
- bufferlist softdata;
- lock->encode_locked_state(softdata);
- send_lock_message(lock, LOCK_AC_SYNC, softdata);
- if (lock->get_state() != LOCK_GSYNCL) { // loner replica is already LOCK
- lock->init_gather();
- gather++;
- }
- }
int issued = in->get_caps_issued();
if (issued & ~lock->caps_allowed()) {
issue_caps(in);
gather++;
}
- if (gather)
+ if (gather) {
lock->get_parent()->auth_pin();
- else {
- lock->set_state(LOCK_SYNC);
- issue_caps(in);
- return true;
+ return false;
}
}
- return false;
+ assert(!lock->is_wrlocked()); // FIXME if we hit this we need a new gsynck state or somethin'
+
+ // ok
+ if (in->is_replicated()) {
+ bufferlist softdata;
+ lock->encode_locked_state(softdata);
+ send_lock_message(lock, LOCK_AC_SYNC, softdata);
+ }
+
+ lock->set_state(LOCK_SYNC);
+ issue_caps(in);
+ return true;
}
assert(in->count_nonstale_caps() == 1 && in->mds_caps_wanted.empty());
- if (lock->get_state() == LOCK_LOCK) {
- // change lock. ignore replicas; they don't know about LONER.
- lock->set_state(LOCK_LONER);
- issue_caps(in);
- } else {
+ if (lock->get_state() != LOCK_LOCK) { // LONER replicas are LOCK
switch (lock->get_state()) {
case LOCK_SYNC: lock->set_state(LOCK_GLONERR); break;
case LOCK_MIXED: lock->set_state(LOCK_GLONERM); break;
gather++;
}
- if (gather)
+ if (gather) {
lock->get_parent()->auth_pin();
- else {
- lock->set_state(LOCK_LONER);
- issue_caps(in);
+ return;
}
}
+
+ lock->set_state(LOCK_LONER);
+ issue_caps(in);
}
void file_update_finish(CInode *in, Mutation *mut, bool share);
public:
- bool check_inode_max_size(CInode *in, bool forcewrlock=false);
+ bool check_inode_max_size(CInode *in, bool forceupdate=false, __u64 newsize=0);
private:
void share_inode_max_size(CInode *in);
{
dout(10) << "_recovered r=" << r << " size=" << in->inode.size << " for " << *in << dendl;
- // make sure this is in "newest" inode struct, and doesn't get thrown out..
- in->get_projected_inode()->size = in->inode.size;
-
file_recovering.erase(in);
in->state_clear(CInode::STATE_RECOVERING);
- in->auth_unpin();
+ // make sure this is in "newest" inode struct, and gets journaled
+ in->get_projected_inode()->size = in->inode.size;
+ mds->locker->check_inode_max_size(in, true, in->inode.size);
- mds->locker->check_inode_max_size(in, true);
+ in->auth_unpin();
do_file_recover();
}
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "utime");
le->metablob.add_client_req(req->get_reqid());
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "chmod");
le->metablob.add_client_req(req->get_reqid());
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "chown");
le->metablob.add_client_req(req->get_reqid());
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "setxattr");
le->metablob.add_client_req(req->get_reqid());
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
mdr->ls = mdlog->get_current_segment();
EUpdate *le = new EUpdate(mdlog, "removexattr");
le->metablob.add_client_req(req->get_reqid());
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
pi->ctime = ctime;
pi->version = pdv;
pi->size = le64_to_cpu(req->head.args.truncate.length);
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, fin);
pi->ctime = ctime;
pi->version = pdv;
pi->size = 0;
- mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, true, false);
+ mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
mdlog->submit_entry(le, fin);