Jeff Layton <jlayton@xxxxxxxxxx> writes: > When handle_cap_grant is called on an IMPORT op, then the snap_rwsem is > held and the function is expected to release it before returning. It > currently fails to do that in all cases which could lead to a deadlock. > > URL: https://tracker.ceph.com/issues/55857 This looks good. Maybe it could have here a 'Fixes: e8a4d26771547'. Otherwise: Reviewed-by: Luís Henriques <lhenriques@xxxxxxx> Cheers, -- Luís > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/ceph/caps.c | 27 +++++++++++++-------------- > 1 file changed, 13 insertions(+), 14 deletions(-) > > diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c > index 258093e9074d..0a48bf829671 100644 > --- a/fs/ceph/caps.c > +++ b/fs/ceph/caps.c > @@ -3579,24 +3579,23 @@ static void handle_cap_grant(struct inode *inode, > fill_inline = true; > } > > - if (ci->i_auth_cap == cap && > - le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) { > - if (newcaps & ~extra_info->issued) > - wake = true; > + if (le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) { > + if (ci->i_auth_cap == cap) { > + if (newcaps & ~extra_info->issued) > + wake = true; > + > + if (ci->i_requested_max_size > max_size || > + !(le32_to_cpu(grant->wanted) & CEPH_CAP_ANY_FILE_WR)) { > + /* re-request max_size if necessary */ > + ci->i_requested_max_size = 0; > + wake = true; > + } > > - if (ci->i_requested_max_size > max_size || > - !(le32_to_cpu(grant->wanted) & CEPH_CAP_ANY_FILE_WR)) { > - /* re-request max_size if necessary */ > - ci->i_requested_max_size = 0; > - wake = true; > + ceph_kick_flushing_inode_caps(session, ci); > } > - > - ceph_kick_flushing_inode_caps(session, ci); > - spin_unlock(&ci->i_ceph_lock); > up_read(&session->s_mdsc->snap_rwsem); > - } else { > - spin_unlock(&ci->i_ceph_lock); > } > + spin_unlock(&ci->i_ceph_lock); > > if (fill_inline) > ceph_fill_inline_data(inode, NULL, extra_info->inline_data, > -- > > 2.36.1 >