On Fri, 2020-09-25 at 10:08 -0400, Jeff Layton wrote: > Ilya noticed that the first access to a blacklisted mount would often > get back -EACCES, but then subsequent calls would be OK. The problem is > in __do_request. If the session is marked as REJECTED, a hard error is > returned instead of waiting for a new session to come into being. > > When the session is REJECTED and the mount was done with > recover_session=clean, queue the request to the waiting_for_map queue, > which will be awoken after tearing down the old session. > > URL: https://tracker.ceph.com/issues/47385 > Reported-by: Ilya Dryomov <idryomov@xxxxxxxxx> > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/ceph/mds_client.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c > index fd16db6ecb0a..b07e7adf146f 100644 > --- a/fs/ceph/mds_client.c > +++ b/fs/ceph/mds_client.c > @@ -2819,7 +2819,10 @@ static void __do_request(struct ceph_mds_client *mdsc, > if (session->s_state != CEPH_MDS_SESSION_OPEN && > session->s_state != CEPH_MDS_SESSION_HUNG) { > if (session->s_state == CEPH_MDS_SESSION_REJECTED) { > - err = -EACCES; > + if (ceph_test_mount_opt(mdsc->fsc, CLEANRECOVER)) > + list_add(&req->r_wait, &mdsc->waiting_for_map); > + else > + err = -EACCES; > goto out_session; > } > /* I think this is wrong when CEPH_MDS_R_ASYNC is set. I'll send a v2 set if we end up staying with this approach. -- Jeff Layton <jlayton@xxxxxxxxxx>