]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: move drop_locks to directly after rdonly check
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 16 Apr 2024 01:20:15 +0000 (21:20 -0400)
committerPatrick Donnelly <pdonnell@ibm.com>
Thu, 9 Jan 2025 19:50:56 +0000 (14:50 -0500)
The code logic had a serious defect that it would only execute xlock_policylock
once such that a retry would then proceed to executing the vxattr setting.

Fixes: https://tracker.ceph.com/issues/65496
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 2931860c4fe115a308c5d3a41d57bc3fbd416f36)

Conflicts:
src/mds/Server.cc: quiesce.block does not exist in reef

src/mds/Server.cc

index e6bc99233624257303b3af8555089e77830b1e7c..4dab5e7c77a16d4590de9347b4d8bd29e467e35d 100644 (file)
@@ -6230,29 +6230,25 @@ void Server::handle_client_setvxattr(MDRequestRef& mdr, CInode *cur)
      * rdlock.
      */
     if (!mdr->more()->rdonly_checks) {
-      if (!(mdr->locking_state & MutationImpl::ALL_LOCKED)) {
-        lov.add_rdlock(&cur->snaplock);
-        if (!mds->locker->acquire_locks(mdr, lov))
-          return;
-        mdr->locking_state |= MutationImpl::ALL_LOCKED;
-      }
+      lov.add_rdlock(&cur->snaplock);
+      if (!mds->locker->acquire_locks(mdr, lov))
+        return;
+
       const auto srnode = cur->get_projected_srnode();
       if (val == (srnode && srnode->is_subvolume())) {
         dout(20) << "already marked subvolume" << dendl;
         respond_to_request(mdr, 0);
         return;
       }
-      mdr->more()->rdonly_checks = true;
-    }
 
-    if ((mdr->locking_state & MutationImpl::ALL_LOCKED) && !mdr->is_xlocked(&cur->snaplock)) {
-      /* drop the rdlock and acquire xlocks */
+      mdr->more()->rdonly_checks = true;
       dout(20) << "dropping rdlocks" << dendl;
       mds->locker->drop_locks(mdr.get());
-      if (!xlock_policylock(mdr, cur, false, true))
-        return;
     }
 
+    if (!xlock_policylock(mdr, cur, false, true))
+      return;
+
     /* repeat rdonly checks in case changed between rdlock -> xlock */
     SnapRealm *realm = cur->find_snaprealm();
     if (val) {