mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	vfs: lock_two_nondirectories: allow directory args
lock_two_nondirectories warned if either of its args was a directory. Instead just ignore the directory args. This is needed for locking in cross rename. Signed-off-by: J. Bruce Fields <bfields@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
This commit is contained in:
		
							parent
							
								
									0b3974eb04
								
							
						
					
					
						commit
						4fd699ae3f
					
				
					 1 changed files with 12 additions and 13 deletions
				
			
		
							
								
								
									
										25
									
								
								fs/inode.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								fs/inode.c
									
									
									
									
									
								
							|  | @ -944,24 +944,22 @@ EXPORT_SYMBOL(unlock_new_inode); | |||
| 
 | ||||
| /**
 | ||||
|  * lock_two_nondirectories - take two i_mutexes on non-directory objects | ||||
|  * | ||||
|  * Lock any non-NULL argument that is not a directory. | ||||
|  * Zero, one or two objects may be locked by this function. | ||||
|  * | ||||
|  * @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(&inode1->i_mutex); | ||||
| 		return; | ||||
| 	} | ||||
| 	WARN_ON_ONCE(S_ISDIR(inode2->i_mode)); | ||||
| 	if (inode1 < inode2) { | ||||
| 	if (inode1 > inode2) | ||||
| 		swap(inode1, inode2); | ||||
| 
 | ||||
| 	if (inode1 && !S_ISDIR(inode1->i_mode)) | ||||
| 		mutex_lock(&inode1->i_mutex); | ||||
| 	if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1) | ||||
| 		mutex_lock_nested(&inode2->i_mutex, I_MUTEX_NONDIR2); | ||||
| 	} else { | ||||
| 		mutex_lock(&inode2->i_mutex); | ||||
| 		mutex_lock_nested(&inode1->i_mutex, I_MUTEX_NONDIR2); | ||||
| 	} | ||||
| } | ||||
| EXPORT_SYMBOL(lock_two_nondirectories); | ||||
| 
 | ||||
|  | @ -972,8 +970,9 @@ EXPORT_SYMBOL(lock_two_nondirectories); | |||
|  */ | ||||
| void unlock_two_nondirectories(struct inode *inode1, struct inode *inode2) | ||||
| { | ||||
| 	mutex_unlock(&inode1->i_mutex); | ||||
| 	if (inode2 && inode2 != inode1) | ||||
| 	if (inode1 && !S_ISDIR(inode1->i_mode)) | ||||
| 		mutex_unlock(&inode1->i_mutex); | ||||
| 	if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1) | ||||
| 		mutex_unlock(&inode2->i_mutex); | ||||
| } | ||||
| EXPORT_SYMBOL(unlock_two_nondirectories); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 J. Bruce Fields
						J. Bruce Fields