From: Patrick Donnelly Date: Tue, 18 Jul 2023 00:52:13 +0000 (-0400) Subject: mds: acquire inode snaplock in open X-Git-Tag: v16.2.15~196^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F53185%2Fhead;p=ceph.git 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) --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 82f2a2e5e658..b43c0c907fdb 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; }