diff options
Diffstat (limited to 'fs/btrfs/super.c')
| -rw-r--r-- | fs/btrfs/super.c | 16 | 
1 files changed, 16 insertions, 0 deletions
| diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 864ce334f696..4071fe2bd098 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -2241,6 +2241,13 @@ static int btrfs_freeze(struct super_block *sb)  	struct btrfs_trans_handle *trans;  	struct btrfs_root *root = btrfs_sb(sb)->tree_root; +	root->fs_info->fs_frozen = 1; +	/* +	 * We don't need a barrier here, we'll wait for any transaction that +	 * could be in progress on other threads (and do delayed iputs that +	 * we want to avoid on a frozen filesystem), or do the commit +	 * ourselves. +	 */  	trans = btrfs_attach_transaction_barrier(root);  	if (IS_ERR(trans)) {  		/* no transaction, don't bother */ @@ -2251,6 +2258,14 @@ static int btrfs_freeze(struct super_block *sb)  	return btrfs_commit_transaction(trans, root);  } +static int btrfs_unfreeze(struct super_block *sb) +{ +	struct btrfs_root *root = btrfs_sb(sb)->tree_root; + +	root->fs_info->fs_frozen = 0; +	return 0; +} +  static int btrfs_show_devname(struct seq_file *m, struct dentry *root)  {  	struct btrfs_fs_info *fs_info = btrfs_sb(root->d_sb); @@ -2299,6 +2314,7 @@ static const struct super_operations btrfs_super_ops = {  	.statfs		= btrfs_statfs,  	.remount_fs	= btrfs_remount,  	.freeze_fs	= btrfs_freeze, +	.unfreeze_fs	= btrfs_unfreeze,  };  static const struct file_operations btrfs_ctl_fops = { |