diff --git a/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp b/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp index 39047d019e..5dc585a563 100644 --- a/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp @@ -1376,15 +1376,15 @@ dosfs_rename(fs_volume* volume, fs_vnode* fromDir, const char* fromName, fs_vnod ComponentName fromBsdName(ISLASTCN, NOCRED, RENAME, 0, fromName); ComponentName toBsdName(ISLASTCN, NOCRED, RENAME, 0, toName); - // Don't do 2 renames at the same time on the same volume. If moving to a new directory, - // and the destination directory of one thread is the origin directory of the other, - // and vice versa, a deadlock can occur. + // Eliminate the possibility that two move operations could deadlock, if they are + // locking the same two directories in the reverse order. MutexLocker volumeLocker(bsdVolume->mnt_mtx.haikuMutex); WriteLocker fromDirLocker(fromDirBsdNode->v_vnlock->haikuRW); WriteLocker toDirLocker; if (fromDirBsdNode != toDirBsdNode) toDirLocker.SetTo(toDirBsdNode->v_vnlock->haikuRW, false); + volumeLocker.Unlock(); status_t status = _dosfs_access(bsdVolume, fromDirBsdNode, W_OK); if (status == B_OK && fromDirBsdNode != toDirBsdNode)