From 38d7ee36926e59e4d4e1eeec77d2af6cac731fad Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Mon, 17 Jul 2023 20:52:13 -0400 Subject: [PATCH] mds: acquire inode snaplock in open It doesn't make sense that open("file", O_CREAT|...) will acquire a readlock on the file's snaplock when the file already exists, but: open("file", ...) will not. Fixes: https://tracker.ceph.com/issues/62058 Fixes: c1d7f93d7bd06d773b8035359548c0c9216398e3 Signed-off-by: Patrick Donnelly (cherry picked from commit c04ab6f0868a7385e695c85486cf3e7bbdfa9ab5) --- src/mds/Server.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 82f2a2e5e6587..b43c0c907fdb3 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -4392,6 +4392,7 @@ void Server::handle_client_open(MDRequestRef& mdr) } MutationImpl::LockOpVec lov; + lov.add_rdlock(&cur->snaplock); unsigned mask = req->head.args.open.mask; if (mask) { @@ -4564,11 +4565,6 @@ void Server::handle_client_openc(MDRequestRef& mdr) // it existed. ceph_assert(mdr.get()->is_rdlocked(&dn->lock)); - MutationImpl::LockOpVec lov; - lov.add_rdlock(&dnl->get_inode()->snaplock); - if (!mds->locker->acquire_locks(mdr, lov)) - return; - handle_client_open(mdr); return; } -- 2.39.5