From bbde5258dec2562b710af31f8a842bac93b5d4cc Mon Sep 17 00:00:00 2001 From: Dhairya Parmar Date: Fri, 24 Nov 2023 19:23:25 +0530 Subject: [PATCH] client: make sure the callback is finished when returning ENOTCONN when the client is not mounted Fixes: https://tracker.ceph.com/issues/63629 Signed-off-by: Dhairya Parmar --- src/client/Client.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 58a289d1a23..8682423ea1e 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -15948,12 +15948,21 @@ int64_t Client::ll_preadv_pwritev(struct Fh *fh, const struct iovec *iov, bool do_fsync, bool syncdataonly) { RWRef_t mref_reader(mount_state, CLIENT_MOUNTING); - if (!mref_reader.is_state_satisfied()) - return -CEPHFS_ENOTCONN; + if (!mref_reader.is_state_satisfied()) { + int64_t rc = -CEPHFS_ENOTCONN; + if (onfinish != nullptr) { + onfinish->complete(rc); + /* async call should always return zero to caller and allow the + caller to wait on callback for the actual errno. */ + rc = 0; + } + return rc; + } std::scoped_lock cl(client_lock); return _preadv_pwritev_locked(fh, iov, iovcnt, offset, write, true, onfinish, bl, do_fsync, syncdataonly); + } int Client::ll_flush(Fh *fh) -- 2.39.5