[PATCH] Revert bd_mount_mutex back to a semaphore
Revert bd_mount_mutex back to a semaphore so that xfs_freeze -f /mnt/newtest; xfs_freeze -u /mnt/newtest works safely and doesn't produce lockdep warnings. (XFS unlocks the semaphore from a different task, by design. The mutex code warns about this) Signed-off-by: Dave Chinner <dgc@sgi.com> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
				
					committed by
					
						 Linus Torvalds
						Linus Torvalds
					
				
			
			
				
	
			
			
			
						parent
						
							88bf7b391d
						
					
				
				
					commit
					f73ca1b76c
				
			| @@ -411,7 +411,7 @@ static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flag | ||||
| 	{ | ||||
| 		memset(bdev, 0, sizeof(*bdev)); | ||||
| 		mutex_init(&bdev->bd_mutex); | ||||
| 		mutex_init(&bdev->bd_mount_mutex); | ||||
| 		sema_init(&bdev->bd_mount_sem, 1); | ||||
| 		INIT_LIST_HEAD(&bdev->bd_inodes); | ||||
| 		INIT_LIST_HEAD(&bdev->bd_list); | ||||
| #ifdef CONFIG_SYSFS | ||||
|   | ||||
| @@ -180,7 +180,7 @@ int fsync_bdev(struct block_device *bdev) | ||||
|  * freeze_bdev  --  lock a filesystem and force it into a consistent state | ||||
|  * @bdev:	blockdevice to lock | ||||
|  * | ||||
|  * This takes the block device bd_mount_mutex to make sure no new mounts | ||||
|  * This takes the block device bd_mount_sem to make sure no new mounts | ||||
|  * happen on bdev until thaw_bdev() is called. | ||||
|  * If a superblock is found on this device, we take the s_umount semaphore | ||||
|  * on it to make sure nobody unmounts until the snapshot creation is done. | ||||
| @@ -189,7 +189,7 @@ struct super_block *freeze_bdev(struct block_device *bdev) | ||||
| { | ||||
| 	struct super_block *sb; | ||||
|  | ||||
| 	mutex_lock(&bdev->bd_mount_mutex); | ||||
| 	down(&bdev->bd_mount_sem); | ||||
| 	sb = get_super(bdev); | ||||
| 	if (sb && !(sb->s_flags & MS_RDONLY)) { | ||||
| 		sb->s_frozen = SB_FREEZE_WRITE; | ||||
| @@ -231,7 +231,7 @@ void thaw_bdev(struct block_device *bdev, struct super_block *sb) | ||||
| 		drop_super(sb); | ||||
| 	} | ||||
|  | ||||
| 	mutex_unlock(&bdev->bd_mount_mutex); | ||||
| 	up(&bdev->bd_mount_sem); | ||||
| } | ||||
| EXPORT_SYMBOL(thaw_bdev); | ||||
|  | ||||
|   | ||||
| @@ -867,9 +867,9 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags, | ||||
| 		error = -EBUSY; | ||||
| 		goto error; | ||||
| 	} | ||||
| 	mutex_lock(&sb->s_bdev->bd_mount_mutex); | ||||
| 	down(&sb->s_bdev->bd_mount_sem); | ||||
| 	new = sget(fs_type, test_bdev_super, set_bdev_super, sb->s_bdev); | ||||
| 	mutex_unlock(&sb->s_bdev->bd_mount_mutex); | ||||
| 	up(&sb->s_bdev->bd_mount_sem); | ||||
| 	if (IS_ERR(new)) { | ||||
| 		error = PTR_ERR(new); | ||||
| 		goto error; | ||||
|   | ||||
| @@ -753,9 +753,9 @@ int get_sb_bdev(struct file_system_type *fs_type, | ||||
| 	 * will protect the lockfs code from trying to start a snapshot | ||||
| 	 * while we are mounting | ||||
| 	 */ | ||||
| 	mutex_lock(&bdev->bd_mount_mutex); | ||||
| 	down(&bdev->bd_mount_sem); | ||||
| 	s = sget(fs_type, test_bdev_super, set_bdev_super, bdev); | ||||
| 	mutex_unlock(&bdev->bd_mount_mutex); | ||||
| 	up(&bdev->bd_mount_sem); | ||||
| 	if (IS_ERR(s)) | ||||
| 		goto error_s; | ||||
|  | ||||
|   | ||||
| @@ -459,7 +459,7 @@ struct block_device { | ||||
| 	struct inode *		bd_inode;	/* will die */ | ||||
| 	int			bd_openers; | ||||
| 	struct mutex		bd_mutex;	/* open/close mutex */ | ||||
| 	struct mutex		bd_mount_mutex;	/* mount mutex */ | ||||
| 	struct semaphore	bd_mount_sem; | ||||
| 	struct list_head	bd_inodes; | ||||
| 	void *			bd_holder; | ||||
| 	int			bd_holders; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user