From 967e0cdfb06d01489e79f531456290e88f31bd39 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 12 Aug 2008 14:34:30 -0700 Subject: [PATCH] kclient: set snap_follows in MClientCap --- src/kernel/inode.c | 2 ++ src/kernel/mds_client.c | 16 +++++++++------- src/kernel/snap.c | 9 +++++---- src/messages/MClientCaps.h | 1 + 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 6f1e01f503f11..9eba15330afbb 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -1517,6 +1517,8 @@ int ceph_handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, ceph_encode_timespec(&grant->mtime, &inode->i_mtime); ceph_encode_timespec(&grant->atime, &inode->i_atime); grant->time_warp_seq = cpu_to_le64(ci->i_time_warp_seq); + grant->snap_follows = + cpu_to_le64(ci->i_snaprealm->cached_context->seq); reply = 1; wake = 1; } diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 1ec2172c45a59..2d4fc2541a618 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -1487,13 +1487,13 @@ static void check_new_map(struct ceph_mds_client *mdsc, static void send_cap_ack(struct ceph_mds_client *mdsc, __u64 ino, int caps, int wanted, __u32 seq, __u64 size, __u64 max_size, struct timespec *mtime, struct timespec *atime, - u64 time_warp_seq, int mds) + u64 time_warp_seq, u64 follows, int mds) { struct ceph_mds_caps *fc; struct ceph_msg *msg; - dout(10, "send_cap_ack ino %llx caps %d wanted %d seq %u size %llu\n", - ino, caps, wanted, (unsigned)seq, size); + dout(10, "send_cap_ack %llx ca %d wa %d seq %u follows %lld sz %llu\n", + ino, caps, wanted, (unsigned)seq, follows, size); msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, sizeof(*fc), 0, 0, 0); if (IS_ERR(msg)) @@ -1510,6 +1510,7 @@ static void send_cap_ack(struct ceph_mds_client *mdsc, __u64 ino, int caps, fc->ino = cpu_to_le64(ino); fc->size = cpu_to_le64(size); fc->max_size = cpu_to_le64(max_size); + fc->snap_follows = cpu_to_le64(follows); if (mtime) ceph_encode_timespec(&fc->mtime, mtime); if (atime) @@ -1564,7 +1565,7 @@ void ceph_mdsc_handle_caps(struct ceph_mds_client *mdsc, if (!inode) { dout(10, "i don't have ino %llx, sending release\n", vino.ino); - send_cap_ack(mdsc, vino.ino, 0, 0, seq, size, 0, 0, 0, 0, mds); + send_cap_ack(mdsc, vino.ino, 0, 0, seq, size, 0, 0, 0, 0, 0, mds); goto no_inode; } @@ -1629,8 +1630,8 @@ int __ceph_mdsc_send_cap(struct ceph_mds_client *mdsc, int revoking = cap->implemented & ~cap->issued; int dropping = cap->issued & ~wanted; int keep; - __u64 seq, time_warp_seq; - __u64 size, max_size; + u64 seq, time_warp_seq, follows; + u64 size, max_size; struct timespec mtime, atime; int removed_last = 0; int wake = 0; @@ -1653,6 +1654,7 @@ int __ceph_mdsc_send_cap(struct ceph_mds_client *mdsc, mtime = inode->i_mtime; atime = inode->i_atime; time_warp_seq = ci->i_time_warp_seq; + follows = ci->i_snaprealm->cached_context->seq; if (wanted == 0) { __ceph_remove_cap(cap); removed_last = list_empty(&ci->i_caps); @@ -1673,7 +1675,7 @@ int __ceph_mdsc_send_cap(struct ceph_mds_client *mdsc, send_cap_ack(mdsc, ceph_vino(inode).ino, keep, wanted, seq, size, max_size, &mtime, &atime, time_warp_seq, - session->s_mds); + follows, session->s_mds); if (wake) wake_up(&ci->i_cap_wq); diff --git a/src/kernel/snap.c b/src/kernel/snap.c index ff77f54e1ba9a..763ad5679f9f7 100644 --- a/src/kernel/snap.c +++ b/src/kernel/snap.c @@ -237,15 +237,16 @@ more: realm->num_prior_parent_snaps) < 0) goto fail; invalidate = 1; - } + } else if (!realm->cached_context) + invalidate = 1; + + if (p >= e && invalidate) + ceph_rebuild_snaprealms(realm); ceph_put_snaprealm(realm); if (p < e) goto more; - if (invalidate) - ceph_rebuild_snaprealms(realm); - return first; bad: diff --git a/src/messages/MClientCaps.h b/src/messages/MClientCaps.h index 082dcd743af37..cbc5418682a1d 100644 --- a/src/messages/MClientCaps.h +++ b/src/messages/MClientCaps.h @@ -65,6 +65,7 @@ class MClientCaps : public Message { int wanted, int mseq) : Message(CEPH_MSG_CLIENT_CAPS) { + memset(&h, 0, sizeof(h)); h.op = op; h.ino = inode.ino; h.seq = seq; -- 2.39.5