From 417f24782cfcf45827dff74adf8df2283b2a2c72 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Fri, 12 Aug 2022 08:41:53 +0800 Subject: [PATCH] mds: clear the STATE_UNLINKING state when the unlink fails Signed-off-by: Xiubo Li --- src/mds/Server.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 36b2d7502dc..4ed20fb552d 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -6732,6 +6732,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); @@ -7818,11 +7819,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; } @@ -7830,6 +7833,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; } @@ -7837,8 +7841,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? -- @@ -7877,6 +7883,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; } -- 2.47.3