...and pass it around appropriately.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
void Client::update_inode_file_bits(Inode *in,
uint64_t truncate_seq, uint64_t truncate_size,
- uint64_t size,
+ uint64_t size, uint64_t change_attr,
uint64_t time_warp_seq, utime_t ctime,
utime_t mtime,
utime_t atime,
ldout(cct, 30) << "Yay have enough caps to look at our times" << dendl;
if (ctime > in->ctime)
in->ctime = ctime;
+ if (change_attr > in->change_attr)
+ in->change_attr = change_attr;
if (time_warp_seq > in->time_warp_seq) {
ldout(cct, 10) << "mds time_warp_seq " << time_warp_seq << " on inode " << *in
<< " is higher than local time_warp_seq "
}
update_inode_file_bits(in, st->truncate_seq, st->truncate_size, st->size,
- st->time_warp_seq, st->ctime, st->mtime, st->atime,
- st->inline_version, st->inline_data,
- issued);
+ st->change_attr, st->time_warp_seq, st->ctime,
+ st->mtime, st->atime, st->inline_version,
+ st->inline_data, issued);
} else if (st->inline_version > in->inline_version) {
in->inline_data = st->inline_data;
in->inline_version = st->inline_version;
m->ctime = in->ctime;
m->btime = in->btime;
m->time_warp_seq = in->time_warp_seq;
+ m->change_attr = in->change_attr;
if (flush & CEPH_CAP_FILE_WR) {
m->inline_version = in->inline_version;
capsnap->atime = in->atime;
capsnap->ctime = in->ctime;
capsnap->time_warp_seq = in->time_warp_seq;
+ capsnap->change_attr = in->change_attr;
capsnap->dirty |= in->caps_dirty();
m->mtime = capsnap->mtime;
m->atime = capsnap->atime;
m->time_warp_seq = capsnap->time_warp_seq;
+ m->change_attr = capsnap->change_attr;
if (capsnap->dirty & CEPH_CAP_FILE_WR) {
m->inline_version = in->inline_version;
int issued = in->caps_issued(&implemented) | in->caps_dirty();
issued |= implemented;
update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(),
- m->get_size(), m->get_time_warp_seq(), m->get_ctime(),
- m->get_mtime(), m->get_atime(),
- m->inline_version, m->inline_data,
- issued);
+ m->get_size(), m->get_change_attr(), m->get_time_warp_seq(),
+ m->get_ctime(), m->get_mtime(), m->get_atime(),
+ m->inline_version, m->inline_data, issued);
m->put();
}
in->xattr_version = m->head.xattr_version;
}
update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(), m->get_size(),
- m->get_time_warp_seq(), m->get_ctime(), m->get_mtime(), m->get_atime(),
+ m->get_change_attr(), m->get_time_warp_seq(), m->get_ctime(),
+ m->get_mtime(), m->get_atime(),
m->inline_version, m->inline_data, issued);
// max_size
in->ctime = diri->ctime;
in->btime = diri->btime;
in->size = diri->size;
+ in->change_attr = diri->change_attr;
in->dirfragtree.clear();
in->snapdir_parent = diri;
void clear_dir_complete_and_ordered(Inode *diri, bool complete);
void insert_readdir_results(MetaRequest *request, MetaSession *session, Inode *diri);
Inode* insert_trace(MetaRequest *request, MetaSession *session);
- void update_inode_file_bits(Inode *in,
- uint64_t truncate_seq, uint64_t truncate_size, uint64_t size,
- uint64_t time_warp_seq, utime_t ctime, utime_t mtime, utime_t atime,
- version_t inline_version, bufferlist& inline_data,
- int issued);
+ void update_inode_file_bits(Inode *in, uint64_t truncate_seq, uint64_t truncate_size, uint64_t size,
+ uint64_t change_attr, uint64_t time_warp_seq, utime_t ctime,
+ utime_t mtime, utime_t atime, version_t inline_version,
+ bufferlist& inline_data, int issued);
Inode *add_update_inode(InodeStat *st, utime_t ttl, MetaSession *session);
Dentry *insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dlease,
Inode *in, utime_t from, MetaSession *session,
f->dump_stream("mtime") << mtime;
f->dump_stream("atime") << atime;
f->dump_int("time_warp_seq", time_warp_seq);
+ f->dump_int("change_attr", change_attr);
f->dump_object("layout", layout);
if (is_dir()) {
uint64_t size;
utime_t ctime, btime, mtime, atime;
version_t time_warp_seq;
+ uint64_t change_attr;
uint32_t mode;
uid_t uid;
gid_t gid;
uint64_t flush_tid;
explicit CapSnap(Inode *i)
- : in(i), issued(0), dirty(0),
- size(0), time_warp_seq(0), mode(0), uid(0), gid(0), xattr_version(0),
- inline_version(0), writing(false), dirty_data(false), flush_tid(0)
+ : in(i), issued(0), dirty(0), size(0), time_warp_seq(0), change_attr(0),
+ mode(0), uid(0), gid(0), xattr_version(0), inline_version(0),
+ writing(false), dirty_data(false), flush_tid(0)
{}
void dump(Formatter *f) const;
utime_t mtime; // file data modify time.
utime_t atime; // file data access time.
uint32_t time_warp_seq; // count of (potential) mtime/atime timewarps (i.e., utimes())
+ uint64_t change_attr;
uint64_t max_size; // max size we can write to
: client(c), ino(vino.ino), snapid(vino.snapid), faked_ino(0),
rdev(0), mode(0), uid(0), gid(0), nlink(0),
size(0), truncate_seq(1), truncate_size(-1),
- time_warp_seq(0), max_size(0), version(0), xattr_version(0),
- inline_version(0), flags(0),
+ time_warp_seq(0), change_attr(0), max_size(0), version(0),
+ xattr_version(0), inline_version(0), flags(0),
dir(0), dir_release_count(1), dir_ordered_count(1),
dir_hashed(false), dir_replicated(false), auth_cap(NULL),
cap_dirtier_uid(-1), cap_dirtier_gid(-1),
m->mtime = i->mtime;
m->atime = i->atime;
m->ctime = i->ctime;
+ m->change_attr = i->change_attr;
m->time_warp_seq = i->time_warp_seq;
if (cap->client_inline_version < i->inline_data.version) {
pi->ctime = m->get_ctime();
}
+ if (dirty && m->get_change_attr() > pi->change_attr) {
+ dout(7) << " change_attr " << pi->change_attr << " -> " << m->get_change_attr()
+ << " for " << *in << dendl;
+ pi->change_attr = m->get_change_attr();
+ }
+
// file
if (dirty & (CEPH_CAP_FILE_EXCL|CEPH_CAP_FILE_WR)) {
utime_t atime = m->get_atime();
public:
struct ceph_mds_caps_head head;
- uint64_t size, max_size, truncate_size;
+ uint64_t size, max_size, truncate_size, change_attr;
uint32_t truncate_seq;
utime_t mtime, atime, ctime, btime;
file_layout_t layout;
utime_t get_btime() { return btime; }
utime_t get_mtime() { return mtime; }
utime_t get_atime() { return atime; }
+ __u64 get_change_attr() { return change_attr; }
__u32 get_time_warp_seq() { return time_warp_seq; }
const file_layout_t& get_layout() {
size(0),
max_size(0),
truncate_size(0),
+ change_attr(0),
truncate_seq(0),
time_warp_seq(0),
osd_epoch_barrier(0),
size(0),
max_size(0),
truncate_size(0),
+ change_attr(0),
truncate_seq(0),
time_warp_seq(0),
osd_epoch_barrier(oeb),
size(0),
max_size(0),
truncate_size(0),
+ change_attr(0),
truncate_seq(0),
time_warp_seq(0),
osd_epoch_barrier(oeb),
}
if (header.version >= 9) {
::decode(btime, p);
+ ::decode(change_attr, p);
}
}
void encode_payload(uint64_t features) {
::encode(layout.pool_ns, payload);
::encode(btime, payload);
+ ::encode(change_attr, payload);
}
};