]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/bluefs: Rearrange locks in prealocate
authorAdam Kupczyk <akupczyk@redhat.com>
Tue, 10 Aug 2021 13:15:52 +0000 (15:15 +0200)
committerAdam Kupczyk <akupczyk@redhat.com>
Fri, 10 Sep 2021 07:53:24 +0000 (09:53 +0200)
Rearranged locks in preallocate to avoid possible deadlock with
compact_log_async_dump_metadata_NF.
Cycle was:
L->N rename/mkdir
N->F compact_log_async_dump_metadata_NF
F->L preallocate

Signed-off-by: Adam Kupczyk <akupczyk@redhat.com>
src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueFS.h

index ed255cb1b266c40e21ed8ef1490a3322dcd39e3e..7add76833705f0ef52e544e357a8ee803b536512 100644 (file)
@@ -3366,6 +3366,7 @@ int BlueFS::_allocate(uint8_t id, uint64_t len,
 
 int BlueFS::preallocate(FileRef f, uint64_t off, uint64_t len)
 {
+  std::lock_guard ll(log.lock);
   std::lock_guard fl(f->lock);
   dout(10) << __func__ << " file " << f->fnode << " 0x"
           << std::hex << off << "~" << len << std::dec << dendl;
@@ -3385,7 +3386,6 @@ int BlueFS::preallocate(FileRef f, uint64_t off, uint64_t len)
     vselector->add_usage(f->vselector_hint, f->fnode);
     if (r < 0)
       return r;
-    std::lock_guard ll(log.lock);
     log.t.op_file_update(f->fnode);
   }
   return 0;
index 444d2cadd90da669ea8a85534fe2bfdb58fc448f..a802443b60c63483b4cb5f524d43cc48cff6d6fb 100644 (file)
@@ -711,8 +711,8 @@ public:
  * log        L |     <   <         
  * dirty      D |                   
  * nodes      N |             <     
- * File       F | <                 
- * FileWriter W | <         <      
+ * File       F |                  
+ * FileWriter W | <   <       <      
  * 
  * Claim: Deadlock is possible IFF graph contains cycles.
  */