};
-bool Locker::check_inode_max_size(CInode *in, bool force_wrlock, bool update_size, __u64 new_size)
+bool Locker::check_inode_max_size(CInode *in, bool force_wrlock,
+ bool update_size, __u64 new_size, utime_t new_mtime)
{
assert(in->is_auth());
dout(10) << "check_inode_max_size size " << pi->size << " -> " << new_size << dendl;
pi->size = new_size;
pi->rstat.rbytes = new_size;
+ dout(10) << "check_inode_max_size mtime " << pi->mtime << " -> " << new_mtime << dendl;
+ pi->mtime = new_mtime;
}
// use EOpen if the file is still open; otherwise, use EUpdate.
void file_update_finish(CInode *in, Mutation *mut, bool share, int client, Capability *cap,
MClientCaps *ack);
public:
- bool check_inode_max_size(CInode *in, bool force_wrlock=false, bool update_size=false, __u64 newsize=0);
+ bool check_inode_max_size(CInode *in, bool force_wrlock=false, bool update_size=false, __u64 newsize=0,
+ utime_t mtime=utime_t());
private:
void share_inode_max_size(CInode *in);
struct C_MDC_Recover : public Context {
MDCache *mdc;
CInode *in;
- C_MDC_Recover(MDCache *m, CInode *i) : mdc(m), in(i) {}
+ __u64 size;
+ utime_t mtime;
+ C_MDC_Recover(MDCache *m, CInode *i) : mdc(m), in(i), size(0) {}
void finish(int r) {
- mdc->_recovered(in, r);
+ mdc->_recovered(in, r, size, mtime);
}
};
<< " " << *in << dendl;
file_recovering.insert(in);
- __u64 max = in->inode.get_max_size();
-
+ C_MDC_Recover *fin = new C_MDC_Recover(this, in);
mds->filer->probe(in->inode.ino, &in->inode.layout, in->last,
- max, &in->inode.size, &in->inode.mtime, false,
- 0, new C_MDC_Recover(this, in));
+ in->get_projected_inode()->get_max_size(), &fin->size, &fin->mtime, false,
+ 0, fin);
} else {
dout(10) << "do_file_recover skipping " << in->inode.size
<< " " << *in << dendl;
}
}
-void MDCache::_recovered(CInode *in, int r)
+void MDCache::_recovered(CInode *in, int r, __u64 size, utime_t mtime)
{
dout(10) << "_recovered r=" << r << " size=" << in->inode.size << " mtime=" << in->inode.mtime
<< " for " << *in << dendl;
remove_inode(in);
} else {
// journal
- mds->locker->check_inode_max_size(in, true, true, in->inode.size);
+ mds->locker->check_inode_max_size(in, true, true, size, mtime);
in->auth_unpin(this);
}
void _queue_file_recover(CInode *in);
void identify_files_to_recover();
void do_file_recover();
- void _recovered(CInode *in, int r);
+ void _recovered(CInode *in, int r, __u64 size, utime_t mtime);
void purge_prealloc_ino(inodeno_t ino, Context *fin);