diff options
Diffstat (limited to 'fs/btrfs/super.c')
| -rw-r--r-- | fs/btrfs/super.c | 19 | 
1 files changed, 11 insertions, 8 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 8c6e61d6eed..83d6f9f9c22 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -100,10 +100,6 @@ static void __save_error_info(struct btrfs_fs_info *fs_info)  	fs_info->fs_state = BTRFS_SUPER_FLAG_ERROR;  } -/* NOTE: - *	We move write_super stuff at umount in order to avoid deadlock - *	for umount hold all lock. - */  static void save_error_info(struct btrfs_fs_info *fs_info)  {  	__save_error_info(fs_info); @@ -842,7 +838,6 @@ int btrfs_sync_fs(struct super_block *sb, int wait)  	struct btrfs_trans_handle *trans;  	struct btrfs_fs_info *fs_info = btrfs_sb(sb);  	struct btrfs_root *root = fs_info->tree_root; -	int ret;  	trace_btrfs_sync_fs(wait); @@ -853,11 +848,17 @@ int btrfs_sync_fs(struct super_block *sb, int wait)  	btrfs_wait_ordered_extents(root, 0, 0); -	trans = btrfs_start_transaction(root, 0); +	spin_lock(&fs_info->trans_lock); +	if (!fs_info->running_transaction) { +		spin_unlock(&fs_info->trans_lock); +		return 0; +	} +	spin_unlock(&fs_info->trans_lock); + +	trans = btrfs_join_transaction(root);  	if (IS_ERR(trans))  		return PTR_ERR(trans); -	ret = btrfs_commit_transaction(trans, root); -	return ret; +	return btrfs_commit_transaction(trans, root);  }  static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) @@ -1534,6 +1535,8 @@ static int btrfs_show_devname(struct seq_file *m, struct dentry *root)  	while (cur_devices) {  		head = &cur_devices->devices;  		list_for_each_entry(dev, head, dev_list) { +			if (dev->missing) +				continue;  			if (!first_dev || dev->devid < first_dev->devid)  				first_dev = dev;  		}  |