From: Dhairya Parmar Date: Fri, 24 Nov 2023 13:53:25 +0000 (+0530) Subject: client: make sure the callback is finished when returning ENOTCONN X-Git-Tag: v19.3.0~24^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bbde5258dec2562b710af31f8a842bac93b5d4cc;p=ceph.git 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 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 58a289d1a23a..8682423ea1e1 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)