From: Xiubo Li Date: Fri, 12 Aug 2022 00:41:53 +0000 (+0800) Subject: mds: clear the STATE_UNLINKING state when the unlink fails X-Git-Tag: v16.2.11~78^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=203773cf43323104a48b58f32e73f7ae073a984f;p=ceph.git mds: clear the STATE_UNLINKING state when the unlink fails Signed-off-by: Xiubo Li (cherry picked from commit 417f24782cfcf45827dff74adf8df2283b2a2c72) --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index a9e84d03a4f..15107db1765 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -6628,6 +6628,7 @@ bool Server::is_unlink_pending(CDentry *dn) void Server::wait_for_pending_unlink(CDentry *dn, MDRequestRef& mdr) { + dout(20) << __func__ << " dn " << *dn << dendl; mds->locker->drop_locks(mdr.get()); auto fin = new C_MDS_RetryRequest(mdcache, mdr); dn->get(CDentry::PIN_PURGING); @@ -7714,11 +7715,13 @@ void Server::handle_client_unlink(MDRequestRef& mdr) if (rmdir) { // do empty directory checks if (_dir_is_nonempty_unlocked(mdr, in)) { - respond_to_request(mdr, -CEPHFS_ENOTEMPTY); + dn->state_clear(CDentry::STATE_UNLINKING); + respond_to_request(mdr, -CEPHFS_ENOTEMPTY); return; } } else { dout(7) << "handle_client_unlink on dir " << *in << ", returning error" << dendl; + dn->state_clear(CDentry::STATE_UNLINKING); respond_to_request(mdr, -CEPHFS_EISDIR); return; } @@ -7726,6 +7729,7 @@ void Server::handle_client_unlink(MDRequestRef& mdr) if (rmdir) { // unlink dout(7) << "handle_client_rmdir on non-dir " << *in << ", returning error" << dendl; + dn->state_clear(CDentry::STATE_UNLINKING); respond_to_request(mdr, -CEPHFS_ENOTDIR); return; } @@ -7733,8 +7737,10 @@ void Server::handle_client_unlink(MDRequestRef& mdr) CInode *diri = dn->get_dir()->get_inode(); if ((!mdr->has_more() || mdr->more()->witnessed.empty())) { - if (!check_access(mdr, diri, MAY_WRITE)) + if (!check_access(mdr, diri, MAY_WRITE)) { + dn->state_clear(CDentry::STATE_UNLINKING); return; + } } // -- create stray dentry? -- @@ -7773,6 +7779,7 @@ void Server::handle_client_unlink(MDRequestRef& mdr) if (in->is_dir() && _dir_is_nonempty(mdr, in)) { respond_to_request(mdr, -CEPHFS_ENOTEMPTY); + dn->state_clear(CDentry::STATE_UNLINKING); return; }