On Fri, Apr 3, 2020 at 10:47 PM Jeff Layton <jlayton@xxxxxxxxxx> wrote: > > Suggested-by: "Yan, Zheng" <zyan@xxxxxxxxxx> > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/ceph/caps.c | 47 +++++++++++++++++++++++++---------------------- > 1 file changed, 25 insertions(+), 22 deletions(-) > > diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c > index eb190e4e203c..b3460d52a305 100644 > --- a/fs/ceph/caps.c > +++ b/fs/ceph/caps.c > @@ -3700,6 +3700,27 @@ static bool handle_cap_trunc(struct inode *inode, > return queue_trunc; > } > > +/** > + * transplant_auth_cap - move inode to appropriate lists when auth caps change > + * @ci: inode to be moved > + * @session: new auth caps session > + */ > +static void transplant_auth_ses(struct ceph_inode_info *ci, > + struct ceph_mds_session *session) > +{ > + lockdep_assert_held(&ci->i_ceph_lock); > + > + if (list_empty(&ci->i_dirty_item) && list_empty(&ci->i_flushing_item)) > + return; > + > + spin_lock(&session->s_mdsc->cap_dirty_lock); > + if (!list_empty(&ci->i_dirty_item)) > + list_move(&ci->i_dirty_item, &session->s_cap_dirty); > + if (!list_empty(&ci->i_flushing_item)) > + list_move_tail(&ci->i_flushing_item, &session->s_cap_flushing); > + spin_unlock(&session->s_mdsc->cap_dirty_lock); > +} > + > /* > * Handle EXPORT from MDS. Cap is being migrated _from_ this mds to a > * different one. If we are the most recent migration we've seen (as > @@ -3771,22 +3792,9 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, > tcap->issue_seq = t_seq - 1; > tcap->issued |= issued; > tcap->implemented |= issued; > - if (cap == ci->i_auth_cap) > + if (cap == ci->i_auth_cap) { > ci->i_auth_cap = tcap; > - > - if (!list_empty(&ci->i_dirty_item)) { > - spin_lock(&mdsc->cap_dirty_lock); > - list_move(&ci->i_dirty_item, > - &tcap->session->s_cap_dirty); > - spin_unlock(&mdsc->cap_dirty_lock); > - } > - > - if (!list_empty(&ci->i_cap_flush_list) && > - ci->i_auth_cap == tcap) { > - spin_lock(&mdsc->cap_dirty_lock); > - list_move_tail(&ci->i_flushing_item, > - &tcap->session->s_cap_flushing); > - spin_unlock(&mdsc->cap_dirty_lock); > + transplant_auth_ses(ci, tcap->session); > } > } > __ceph_remove_cap(cap, false); > @@ -3798,13 +3806,8 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, > ceph_add_cap(inode, tsession, t_cap_id, issued, 0, > t_seq - 1, t_mseq, (u64)-1, flag, &new_cap); > > - if (!list_empty(&ci->i_cap_flush_list) && > - ci->i_auth_cap == tcap) { > - spin_lock(&mdsc->cap_dirty_lock); > - list_move_tail(&ci->i_flushing_item, > - &tcap->session->s_cap_flushing); > - spin_unlock(&mdsc->cap_dirty_lock); > - } > + if (ci->i_auth_cap == tcap) > + transplant_auth_ses(ci, tcap->session); > why not call transplant_auth_ses() inside ceph_add_cap() (replace code added by "ceph: convert mdsc->cap_dirty to a per-session list") > __ceph_remove_cap(cap, false); > goto out_unlock; > -- > 2.25.1 >