]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/inode.c
vfs: pull ext4's double-i_mutex-locking into common code
[mirror_ubuntu-artful-kernel.git] / fs / inode.c
index bf7a8b3ab937644a5fa7eb9e3cb87d1cb118fa21..ef25afdf39069d69153c9cb6ab702400824de86e 100644 (file)
@@ -942,6 +942,42 @@ void unlock_new_inode(struct inode *inode)
 }
 EXPORT_SYMBOL(unlock_new_inode);
 
+/**
+ * lock_two_nondirectories - take two i_mutexes on non-directory objects
+ * @inode1: first inode to lock
+ * @inode2: second inode to lock
+ */
+void lock_two_nondirectories(struct inode *inode1, struct inode *inode2)
+{
+       WARN_ON_ONCE(S_ISDIR(inode1->i_mode));
+       if (inode1 == inode2 || !inode2) {
+               mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT);
+               return;
+       }
+       WARN_ON_ONCE(S_ISDIR(inode2->i_mode));
+       if (inode1 < inode2) {
+               mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT);
+               mutex_lock_nested(&inode2->i_mutex, I_MUTEX_CHILD);
+       } else {
+               mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT);
+               mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD);
+       }
+}
+EXPORT_SYMBOL(lock_two_nondirectories);
+
+/**
+ * unlock_two_nondirectories - release locks from lock_two_nondirectories()
+ * @inode1: first inode to unlock
+ * @inode2: second inode to unlock
+ */
+void unlock_two_nondirectories(struct inode *inode1, struct inode *inode2)
+{
+       mutex_unlock(&inode1->i_mutex);
+       if (inode2 && inode2 != inode1)
+               mutex_unlock(&inode2->i_mutex);
+}
+EXPORT_SYMBOL(unlock_two_nondirectories);
+
 /**
  * iget5_locked - obtain an inode from a mounted file system
  * @sb:                super block of file system