From: Greg Farnum Date: Thu, 23 Oct 2014 00:16:31 +0000 (-0700) Subject: client: cast m->get_client_tid() to compare to 16-bit Inode::flushing_cap_tid X-Git-Tag: v0.88~16^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F2786%2Fhead;p=ceph.git client: cast m->get_client_tid() to compare to 16-bit Inode::flushing_cap_tid m->get_client_tid() is 64 bits (as it should be), but Inode::flushing_cap_tid is only 16 bits. 16 bits should be plenty to let the cap flush updates pipeline appropriately, but we need to cast in the proper direction when comparing these differently-sized versions. So downcast the 64-bit one to 16 bits. Fixes: #9869 Backport: giant, firefly, dumpling Signed-off-by: Greg Farnum --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 29b92d964c6..749e67d4e62 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3860,9 +3860,10 @@ void Client::handle_cap_flush_ack(MetaSession *session, Inode *in, Cap *cap, MCl mds_rank_t mds = session->mds_num; int dirty = m->get_dirty(); int cleaned = 0; + uint16_t flush_ack_tid = static_cast(m->get_client_tid()); for (int i = 0; i < CEPH_CAP_BITS; ++i) { if ((dirty & (1 << i)) && - (m->get_client_tid() == in->flushing_cap_tid[i])) + (flush_ack_tid == in->flushing_cap_tid[i])) cleaned |= 1 << i; }