OSDN Git Service

btrfs: move commit out of sysfs when changing features
authorDavid Sterba <dsterba@suse.cz>
Wed, 12 Nov 2014 13:22:21 +0000 (14:22 +0100)
committerDavid Sterba <dsterba@suse.cz>
Wed, 12 Nov 2014 15:53:14 +0000 (16:53 +0100)
Signed-off-by: David Sterba <dsterba@suse.cz>
fs/btrfs/sysfs.c

index b2e7bb4..226f726 100644 (file)
@@ -111,7 +111,6 @@ static ssize_t btrfs_feature_attr_store(struct kobject *kobj,
 {
        struct btrfs_fs_info *fs_info;
        struct btrfs_feature_attr *fa = to_btrfs_feature_attr(a);
-       struct btrfs_trans_handle *trans;
        u64 features, set, clear;
        unsigned long val;
        int ret;
@@ -153,10 +152,6 @@ static ssize_t btrfs_feature_attr_store(struct kobject *kobj,
        btrfs_info(fs_info, "%s %s feature flag",
                   val ? "Setting" : "Clearing", fa->kobj_attr.attr.name);
 
-       trans = btrfs_start_transaction(fs_info->fs_root, 0);
-       if (IS_ERR(trans))
-               return PTR_ERR(trans);
-
        spin_lock(&fs_info->super_lock);
        features = get_features(fs_info, fa->feature_set);
        if (val)
@@ -166,9 +161,11 @@ static ssize_t btrfs_feature_attr_store(struct kobject *kobj,
        set_features(fs_info, fa->feature_set, features);
        spin_unlock(&fs_info->super_lock);
 
-       ret = btrfs_commit_transaction(trans, fs_info->fs_root);
-       if (ret)
-               return ret;
+       /*
+        * We don't want to do full transaction commit from inside sysfs
+        */
+       btrfs_set_pending(fs_info, COMMIT);
+       wake_up_process(fs_info->transaction_kthread);
 
        return count;
 }