@@ -500,22 +500,26 @@ void CDentry::decode_lock_state(int type, const bufferlist& bl)
500500}
501501
502502
503- ClientLease *CDentry::add_client_lease (client_t c, Session *session)
504- {
505- ClientLease *l;
506- if (client_lease_map.count (c))
507- l = client_lease_map[c];
508- else {
509- dout (20 ) << __func__ << " client." << c << " on " << lock << dendl;
510- if (client_lease_map.empty ()) {
503+ client_t ClientLease::get_client () const
504+ {
505+ return session->get_client ();
506+ }
507+
508+ ClientLease *CDentry::add_client_lease (Session *session)
509+ {
510+ client_t client = session->get_client ();
511+ auto em = client_leases.emplace (std::piecewise_construct,
512+ std::forward_as_tuple (client),
513+ std::forward_as_tuple (this , session));
514+ ClientLease *l = &em.first ->second ;
515+ if (em.second ) {
516+ dout (20 ) << __func__ << " client." << client << " on " << lock << dendl;
517+ if (client_leases.size () == 1 ) {
511518 get (PIN_CLIENTLEASE);
512519 lock.get_client_lease ();
513520 }
514- l = client_lease_map[c] = new ClientLease (c, this );
515521 l->seq = ++session->lease_seq ;
516-
517522 }
518-
519523 return l;
520524}
521525
@@ -524,15 +528,14 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
524528 ceph_assert (l->parent == this );
525529
526530 bool gather = false ;
531+ client_t client = l->get_client ();
532+ dout (20 ) << __func__ << " client." << client << " on " << lock << dendl;
527533
528- dout (20 ) << __func__ << " client." << l->client << " on " << lock << dendl;
529-
530- client_lease_map.erase (l->client );
531534 l->item_lease .remove_myself ();
532535 l->item_session_lease .remove_myself ();
533- delete l ;
536+ client_leases. erase (client) ;
534537
535- if (client_lease_map .empty ()) {
538+ if (client_leases .empty ()) {
536539 gather = !lock.is_stable ();
537540 lock.put_client_lease ();
538541 put (PIN_CLIENTLEASE);
@@ -544,8 +547,8 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
544547
545548void CDentry::remove_client_leases (Locker *locker)
546549{
547- while (!client_lease_map .empty ())
548- remove_client_lease (client_lease_map .begin ()->second , locker);
550+ while (!client_leases .empty ())
551+ remove_client_lease (&client_leases .begin ()->second , locker);
549552}
550553
551554void CDentry::_put ()
0 commit comments