From: Venky Shankar Date: Thu, 5 May 2022 09:24:01 +0000 (-0400) Subject: mds: do not assert early on when issuing client leases X-Git-Tag: v18.0.0~748^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=907b1f41e5e08afea6ee1a91ecd6d05646727b09;p=ceph.git mds: do not assert early on when issuing client leases Move the relevant ceph_assert()'s when the MDS is issuing leases to clients since clients may not be capable of reading projected linkages. Fixes: http://tracker.ceph.com/issues/54701 Signed-off-by: Venky Shankar --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 12a59bb55c06e..102d13ca3c302 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -4252,8 +4252,8 @@ void Locker::handle_client_lease(const cref_t &m) } -void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, - utime_t now, bufferlist &bl) +void Locker::issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now, + bufferlist &bl) { client_t client = mdr->get_client(); Session *session = mdr->session; @@ -4264,6 +4264,17 @@ void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, !diri->is_stray() && // do not issue dn leases in stray dir! !diri->filelock.can_lease(client) && !(diri->get_client_cap_pending(client) & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL))) { + int mask = 0; + CDentry::linkage_t *dnl = dn->get_linkage(client, mdr); + if (dnl->is_primary()) { + ceph_assert(dnl->get_inode() == in); + mask = CEPH_LEASE_PRIMARY_LINK; + } else { + if (dnl->is_remote()) + ceph_assert(dnl->get_remote_ino() == in->ino()); + else + ceph_assert(!in); + } // issue a dentry lease ClientLease *l = dn->add_client_lease(client, session); session->touch_lease(l); @@ -4283,7 +4294,7 @@ void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, } else { // null lease LeaseStat lstat; - lstat.mask = mask; + lstat.mask = 0; lstat.alternate_name = std::string(dn->alternate_name); encode_lease(bl, session->info, lstat); dout(20) << "issue_client_lease no/null lease on " << *dn << dendl; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 78cd2898be245..3aff8db0bf17b 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -187,7 +187,7 @@ public: // -- client leases -- void handle_client_lease(const cref_t &m); - void issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, utime_t now, bufferlist &bl); + void issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now, bufferlist &bl); void revoke_client_leases(SimpleLock *lock); static void encode_lease(bufferlist& bl, const session_info_t& info, const LeaseStat& ls); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 7379c6dad0b83..2615b01818ec5 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2332,20 +2332,7 @@ void Server::set_trace_dist(const ref_t &reply, dout(20) << "set_trace_dist added dir " << *dir << dendl; encode(dn->get_name(), bl); - - int lease_mask = 0; - CDentry::linkage_t *dnl = dn->get_linkage(mdr->get_client(), mdr); - if (dnl->is_primary()) { - ceph_assert(dnl->get_inode() == in); - lease_mask = CEPH_LEASE_PRIMARY_LINK; - } else { - if (dnl->is_remote()) - ceph_assert(dnl->get_remote_ino() == in->ino()); - else - ceph_assert(!in); - } - mds->locker->issue_client_lease(dn, mdr, lease_mask, now, bl); - dout(20) << "set_trace_dist added dn " << snapid << " " << *dn << dendl; + mds->locker->issue_client_lease(dn, in, mdr, now, bl); } else reply->head.is_dentry = 0; @@ -4781,8 +4768,7 @@ void Server::handle_client_readdir(MDRequestRef& mdr) // dentry dout(12) << "including dn " << *dn << dendl; encode(dn->get_name(), dnbl); - int lease_mask = dnl->is_primary() ? CEPH_LEASE_PRIMARY_LINK : 0; - mds->locker->issue_client_lease(dn, mdr, lease_mask, now, dnbl); + mds->locker->issue_client_lease(dn, in, mdr, now, dnbl); // inode dout(12) << "including inode " << *in << dendl;