From: John Spray Date: Tue, 29 Nov 2016 17:13:29 +0000 (+0000) Subject: client: simplify remove_cap interface X-Git-Tag: v12.0.0~257^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d6a6b03a0dd239a889332fd641cc6a3e99b961c1;p=ceph.git client: simplify remove_cap interface All this complexity only existed to handle the case where trim wanted to iterate over an xlist without getting disturbed by a deletion. We can simply increment the iterator before maybe-deleting the Cap. Signed-off-by: John Spray --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 790c51549983..b3808a2b9c8f 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3885,12 +3885,9 @@ void Client::remove_cap(Cap *cap, bool queue_release) assert(in->caps.count(mds)); in->caps.erase(mds); - if (cap == session->s_cap_iterator) { - cap->inode = NULL; - } else { - cap->cap_item.remove_myself(); - delete cap; - } + cap->cap_item.remove_myself(); + delete cap; + cap = nullptr; if (!in->is_any_caps()) { ldout(cct, 15) << "remove_cap last one, closing snaprealm " << in->snaprealm << dendl; @@ -3985,9 +3982,12 @@ void Client::trim_caps(MetaSession *s, int max) xlist::iterator p = s->caps.begin(); while ((caps_size - trimmed) > max && !p.end()) { Cap *cap = *p; - s->s_cap_iterator = cap; Inode *in = cap->inode; + // Increment p early because it will be invalidated if cap + // is deleted inside remove_cap + ++p; + if (in->caps.size() > 1 && cap != in->auth_cap) { int mine = cap->issued | cap->implemented; int oissued = in->auth_cap ? in->auth_cap->issued : 0; @@ -4023,14 +4023,7 @@ void Client::trim_caps(MetaSession *s, int max) trimmed++; } } - - ++p; - if (!cap->inode) { - cap->cap_item.remove_myself(); - delete cap; - } } - s->s_cap_iterator = NULL; if (s->caps.size() > max) _invalidate_kernel_dcache(); diff --git a/src/client/MetaSession.h b/src/client/MetaSession.h index 0d8c15263557..af84615fc1d8 100644 --- a/src/client/MetaSession.h +++ b/src/client/MetaSession.h @@ -47,15 +47,13 @@ struct MetaSession { std::set flushing_caps_tids; std::set early_flushing_caps; - Cap *s_cap_iterator; - MClientCapRelease *release; MetaSession() : mds_num(-1), con(NULL), seq(0), cap_gen(0), cap_renew_seq(0), num_caps(0), state(STATE_NEW), mds_state(0), readonly(false), - s_cap_iterator(NULL), release(NULL) + release(NULL) {} ~MetaSession();