|
@@ -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 = {
|