From e515cdf4e893cfe38ec27790dd034ecf4077baa4 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh-Weinraub Date: Tue, 8 Apr 2008 22:51:59 +0300 Subject: [PATCH] kclient: ctime updates handled differently --- src/include/ceph_fs.h | 2 +- src/kernel/inode.c | 18 ++++++++++++++---- src/mds/Locker.cc | 13 +++++++++++-- src/messages/MClientFileCaps.h | 1 + 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 3a7d6758c096a..67bc33de23304 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -509,7 +509,7 @@ struct ceph_mds_file_caps { __le64 ino; __le64 size, max_size; __le32 migrate_mds, migrate_seq; - struct ceph_timespec mtime, atime; + struct ceph_timespec mtime, atime, ctime; } __attribute__ ((packed)); diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 677ed52063e05..300f15b740af0 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -60,7 +60,7 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) unsigned blksize = 1 << blkbits; u64 size = le64_to_cpu(info->size); int issued; - struct timespec mtime, atime; + struct timespec mtime, atime, ctime; u64 blocks = size + blksize - 1; do_div(blocks, blksize); @@ -76,11 +76,11 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) inode->i_gid = le32_to_cpu(info->gid); inode->i_nlink = le32_to_cpu(info->nlink); inode->i_rdev = le32_to_cpu(info->rdev); - ceph_decode_timespec(&inode->i_ctime, &info->ctime); /* be careful with mtime, atime, size */ ceph_decode_timespec(&atime, &info->atime); ceph_decode_timespec(&mtime, &info->mtime); + ceph_decode_timespec(&ctime, &info->ctime); issued = __ceph_caps_issued(ci); spin_lock(&inode->i_lock); if (issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER)) { @@ -94,6 +94,8 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) inode->i_mtime = mtime; if (timespec_compare(&atime, &inode->i_atime) > 0) inode->i_atime = atime; + if (timespec_compare(&ctime, &inode->i_ctime) > 0) + inode->i_ctime = ctime; } } else { inode->i_size = size; @@ -101,6 +103,7 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) inode->i_blocks = blocks; inode->i_mtime = mtime; inode->i_atime = atime; + inode->i_atime = ctime; } spin_unlock(&inode->i_lock); @@ -880,7 +883,7 @@ int ceph_handle_cap_grant(struct inode *inode, struct ceph_mds_file_caps *grant, int ret = 0; u64 size = le64_to_cpu(grant->size); u64 max_size = le64_to_cpu(grant->max_size); - struct timespec mtime, atime; + struct timespec mtime, atime, ctime; int wake = 0; int writeback_now = 0; int invalidate = 0; @@ -907,13 +910,20 @@ int ceph_handle_cap_grant(struct inode *inode, struct ceph_mds_file_caps *grant, if ((issued & CEPH_CAP_EXCL) == 0) { ceph_decode_timespec(&mtime, &grant->mtime); ceph_decode_timespec(&atime, &grant->atime); + ceph_decode_timespec(&ctime, &grant->ctime); if (timespec_compare(&mtime, &inode->i_mtime) > 0) { dout(10, "mtime %lu.%09ld -> %lu.%.09ld\n", mtime.tv_sec, mtime.tv_nsec, inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec); inode->i_mtime = mtime; } - if (timespec_compare(&mtime, &inode->i_mtime) > 0) { + if (timespec_compare(&ctime, &inode->i_ctime) > 0) { + dout(10, "ctime %lu.%09ld -> %lu.%.09ld\n", + ctime.tv_sec, ctime.tv_nsec, + inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec); + inode->i_ctime = ctime; + } + if (timespec_compare(&atime, &inode->i_atime) > 0) { dout(10, "atime %lu.%09ld -> %lu.%09ld\n", atime.tv_sec, atime.tv_nsec, inode->i_atime.tv_sec, inode->i_atime.tv_nsec); diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index d5001ff31abe1..58d09ac00a329 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -882,6 +882,7 @@ void Locker::handle_client_file_caps(MClientFileCaps *m) utime_t atime = m->get_atime(); utime_t mtime = m->get_mtime(); + utime_t ctime = m->get_ctime(); off_t size = m->get_size(); // atime|mtime|size? @@ -889,16 +890,19 @@ void Locker::handle_client_file_caps(MClientFileCaps *m) bool excl = (had|has) & CEPH_CAP_EXCL; bool dirty_atime = false; bool dirty_mtime = false; + bool dirty_ctime = false; bool dirty_size = false; if (had_or_has_wr) { if (mtime > latest->mtime || (excl && mtime != latest->mtime)) dirty_mtime = true; + if (ctime > latest->ctime || (excl && ctime != latest->ctime)) + dirty_ctime = true; if (size > latest->size) dirty_size = true; } if (excl && atime != latest->atime) dirty_atime = true; - bool dirty = dirty_atime || dirty_mtime || dirty_size; + bool dirty = dirty_atime || dirty_mtime || dirty_ctime || dirty_size; // increase max_size? bool increase_max = false; @@ -913,7 +917,7 @@ void Locker::handle_client_file_caps(MClientFileCaps *m) if ((dirty || no_wr || increase_max) && !in->is_base()) { // FIXME.. what about root inode mtime/atime? - EUpdate *le = new EUpdate(mds->mdlog, "size|max_size|mtime|atime update"); + EUpdate *le = new EUpdate(mds->mdlog, "size|max_size|mtime|ctime|atime update"); inode_t *pi = in->project_inode(); pi->version = in->pre_dirty(); if (no_wr) { @@ -930,6 +934,11 @@ void Locker::handle_client_file_caps(MClientFileCaps *m) << " for " << *in << dendl; pi->mtime = mtime; } + if (dirty_ctime) { + dout(7) << " ctime " << pi->ctime << " -> " << ctime + << " for " << *in << dendl; + pi->ctime = ctime; + } if (dirty_size) { dout(7) << " size " << pi->size << " -> " << size << " for " << *in << dendl; diff --git a/src/messages/MClientFileCaps.h b/src/messages/MClientFileCaps.h index f1d1a2fbb9f52..832e882ea7cdf 100644 --- a/src/messages/MClientFileCaps.h +++ b/src/messages/MClientFileCaps.h @@ -43,6 +43,7 @@ class MClientFileCaps : public Message { inodeno_t get_ino() { return le64_to_cpu(h.ino); } __s64 get_size() { return le64_to_cpu(h.size); } __s64 get_max_size() { return le64_to_cpu(h.max_size); } + utime_t get_ctime() { return utime_t(h.ctime); } utime_t get_mtime() { return utime_t(h.mtime); } utime_t get_atime() { return utime_t(h.atime); } -- 2.39.5