btrfs: sysfs: protect reading label by lock
authorDavid Sterba <dsterba@suse.com>
Tue, 26 Apr 2016 14:22:06 +0000 (16:22 +0200)
committerDavid Sterba <dsterba@suse.com>
Fri, 6 May 2016 13:22:49 +0000 (15:22 +0200)
If the label setting ioctl races with sysfs label handler, we could get
mixed result in the output, part old part new. We should either get the
old or new label. The chances to hit this race are low.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/sysfs.c

index 3d14618ce54be8f8c484010632aa275f2da46184..4879656bda3cdebefbcd6390bf6ab6597e616ac0 100644 (file)
@@ -367,7 +367,13 @@ static ssize_t btrfs_label_show(struct kobject *kobj,
 {
        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
        char *label = fs_info->super_copy->label;
-       return snprintf(buf, PAGE_SIZE, label[0] ? "%s\n" : "%s", label);
+       ssize_t ret;
+
+       spin_lock(&fs_info->super_lock);
+       ret = snprintf(buf, PAGE_SIZE, label[0] ? "%s\n" : "%s", label);
+       spin_unlock(&fs_info->super_lock);
+
+       return ret;
 }
 
 static ssize_t btrfs_label_store(struct kobject *kobj,