diff options
Diffstat (limited to 'fs/btrfs/super.c')
| -rw-r--r-- | fs/btrfs/super.c | 74 | 
1 files changed, 50 insertions, 24 deletions
| diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 83d6f9f9c22..915ac14c206 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -243,12 +243,18 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,  			       struct btrfs_root *root, const char *function,  			       unsigned int line, int errno)  { -	WARN_ONCE(1, KERN_DEBUG "btrfs: Transaction aborted"); +	WARN_ONCE(1, KERN_DEBUG "btrfs: Transaction aborted\n");  	trans->aborted = errno;  	/* Nothing used. The other threads that have joined this  	 * transaction may be able to continue. */  	if (!trans->blocks_used) { -		btrfs_printk(root->fs_info, "Aborting unused transaction.\n"); +		char nbuf[16]; +		const char *errstr; + +		errstr = btrfs_decode_error(root->fs_info, errno, nbuf); +		btrfs_printk(root->fs_info, +			     "%s:%d: Aborting unused transaction(%s).\n", +			     function, line, errstr);  		return;  	}  	trans->transaction->aborted = errno; @@ -407,7 +413,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  			btrfs_set_opt(info->mount_opt, NODATASUM);  			break;  		case Opt_nodatacow: -			printk(KERN_INFO "btrfs: setting nodatacow\n"); +			if (!btrfs_test_opt(root, COMPRESS) || +				!btrfs_test_opt(root, FORCE_COMPRESS)) { +					printk(KERN_INFO "btrfs: setting nodatacow, compression disabled\n"); +			} else { +				printk(KERN_INFO "btrfs: setting nodatacow\n"); +			} +			info->compress_type = BTRFS_COMPRESS_NONE; +			btrfs_clear_opt(info->mount_opt, COMPRESS); +			btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);  			btrfs_set_opt(info->mount_opt, NODATACOW);  			btrfs_set_opt(info->mount_opt, NODATASUM);  			break; @@ -422,10 +436,14 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  				compress_type = "zlib";  				info->compress_type = BTRFS_COMPRESS_ZLIB;  				btrfs_set_opt(info->mount_opt, COMPRESS); +				btrfs_clear_opt(info->mount_opt, NODATACOW); +				btrfs_clear_opt(info->mount_opt, NODATASUM);  			} else if (strcmp(args[0].from, "lzo") == 0) {  				compress_type = "lzo";  				info->compress_type = BTRFS_COMPRESS_LZO;  				btrfs_set_opt(info->mount_opt, COMPRESS); +				btrfs_clear_opt(info->mount_opt, NODATACOW); +				btrfs_clear_opt(info->mount_opt, NODATASUM);  				btrfs_set_fs_incompat(info, COMPRESS_LZO);  			} else if (strncmp(args[0].from, "no", 2) == 0) {  				compress_type = "no"; @@ -543,11 +561,11 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  			btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG);  			break;  		case Opt_defrag: -			printk(KERN_INFO "btrfs: enabling auto defrag"); +			printk(KERN_INFO "btrfs: enabling auto defrag\n");  			btrfs_set_opt(info->mount_opt, AUTO_DEFRAG);  			break;  		case Opt_recovery: -			printk(KERN_INFO "btrfs: enabling auto recovery"); +			printk(KERN_INFO "btrfs: enabling auto recovery\n");  			btrfs_set_opt(info->mount_opt, RECOVERY);  			break;  		case Opt_skip_balance: @@ -846,18 +864,15 @@ int btrfs_sync_fs(struct super_block *sb, int wait)  		return 0;  	} -	btrfs_wait_ordered_extents(root, 0, 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); +	btrfs_wait_ordered_extents(root, 0); -	trans = btrfs_join_transaction(root); -	if (IS_ERR(trans)) +	trans = btrfs_attach_transaction(root); +	if (IS_ERR(trans)) { +		/* no transaction, don't bother */ +		if (PTR_ERR(trans) == -ENOENT) +			return 0;  		return PTR_ERR(trans); +	}  	return btrfs_commit_transaction(trans, root);  } @@ -1508,17 +1523,21 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,  static int btrfs_freeze(struct super_block *sb)  { -	struct btrfs_fs_info *fs_info = btrfs_sb(sb); -	mutex_lock(&fs_info->transaction_kthread_mutex); -	mutex_lock(&fs_info->cleaner_mutex); -	return 0; +	struct btrfs_trans_handle *trans; +	struct btrfs_root *root = btrfs_sb(sb)->tree_root; + +	trans = btrfs_attach_transaction(root); +	if (IS_ERR(trans)) { +		/* no transaction, don't bother */ +		if (PTR_ERR(trans) == -ENOENT) +			return 0; +		return PTR_ERR(trans); +	} +	return btrfs_commit_transaction(trans, root);  }  static int btrfs_unfreeze(struct super_block *sb)  { -	struct btrfs_fs_info *fs_info = btrfs_sb(sb); -	mutex_unlock(&fs_info->cleaner_mutex); -	mutex_unlock(&fs_info->transaction_kthread_mutex);  	return 0;  } @@ -1595,7 +1614,7 @@ static int btrfs_interface_init(void)  static void btrfs_interface_exit(void)  {  	if (misc_deregister(&btrfs_misc) < 0) -		printk(KERN_INFO "misc_deregister failed for control device"); +		printk(KERN_INFO "btrfs: misc_deregister failed for control device\n");  }  static int __init init_btrfs_fs(void) @@ -1620,10 +1639,14 @@ static int __init init_btrfs_fs(void)  	if (err)  		goto free_extent_io; -	err = btrfs_delayed_inode_init(); +	err = ordered_data_init();  	if (err)  		goto free_extent_map; +	err = btrfs_delayed_inode_init(); +	if (err) +		goto free_ordered_data; +  	err = btrfs_interface_init();  	if (err)  		goto free_delayed_inode; @@ -1641,6 +1664,8 @@ unregister_ioctl:  	btrfs_interface_exit();  free_delayed_inode:  	btrfs_delayed_inode_exit(); +free_ordered_data: +	ordered_data_exit();  free_extent_map:  	extent_map_exit();  free_extent_io: @@ -1657,6 +1682,7 @@ static void __exit exit_btrfs_fs(void)  {  	btrfs_destroy_cachep();  	btrfs_delayed_inode_exit(); +	ordered_data_exit();  	extent_map_exit();  	extent_io_exit();  	btrfs_interface_exit(); | 
