All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Mahoney <jeffm@suse.com>
To: fdmanana@gmail.com
Cc: linux-btrfs <linux-btrfs@vger.kernel.org>,
	Josef Bacik <jbacik@fusionio.com>
Subject: Re: [PATCH] btrfs: fix leaks during sysfs teardown
Date: Thu, 21 Nov 2013 10:05:26 -0500	[thread overview]
Message-ID: <528E2136.3090404@suse.com> (raw)
In-Reply-To: <CAL3q7H7eW50NgOT2jQAJFei8h7wPee5WiQ6fjKgVCBGG3H0O5Q@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 21012 bytes --]

On 11/21/13, 8:07 AM, Filipe David Manana wrote:
> On Wed, Nov 20, 2013 at 9:59 PM, Jeff Mahoney <jeffm@suse.com> wrote:
>> Filipe noticed that we were leaking the features attribute group
>> after umount. His fix of just calling sysfs_remove_group() wasn't enough
>> since that removes just the supported features and not the unknown
>> features (but a regular test wouldn't show that).
>>
>> This patch changes the unknown feature handling to add them individually
>> so we can skip the kmalloc and uses the same iteration to tear them down
>> later.
>>
>> We also fix the error handling during mount so that we catch the
>> failing creation of the per-super kobject, and handle proper teardown
>> of a half-setup sysfs context.
>>
>> Reported-by: Filipe David Borba Manana <fdmanana@gmail.com>
>> Signed-off-by: Jeff Mahoney <jeffm@suse.com>
> 
> Hi Jeff, I tested this patch (reverted my patch and applied yours) and
> after about 20 minutes of running xfstests I had 169 kmemleak
> warnings, see below some of the stack traces. Thanks.

*sigh*

I missed the original sysfs_remove_group that was the point of all this.
(Well done, Jeff.)

-Jeff

> unreferenced object 0xffff8807424bdb90 (size 64):
>   comm "mount", pid 20697, jiffies 4295160287 (age 1117.544s)
>   hex dump (first 32 bytes):
>     64 36 61 34 61 30 64 30 2d 39 62 31 63 2d 34 31  d6a4a0d0-9b1c-41
>     37 62 2d 38 31 30 37 2d 34 36 66 32 39 63 30 39  7b-8107-46f29c09
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8119061b>] __kmalloc_track_caller+0x1cb/0x240
>     [<ffffffff81157102>] kstrdup+0x42/0x70
>     [<ffffffff81219271>] sysfs_new_dirent+0x31/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219aa9>] sysfs_create_dir+0x89/0xe0
>     [<ffffffff813e3416>] kobject_add_internal+0x96/0x210
>     [<ffffffff813e37a3>] kobject_init_and_add+0x63/0x90
>     [<ffffffffa06adadd>] btrfs_sysfs_add_one+0x7d/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
> unreferenced object 0xffff8800968254f8 (size 160):
>   comm "mount", pid 20697, jiffies 4295160287 (age 1117.544s)
>   hex dump (first 32 bytes):
>     01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219aa9>] sysfs_create_dir+0x89/0xe0
>     [<ffffffff813e3416>] kobject_add_internal+0x96/0x210
>     [<ffffffff813e37a3>] kobject_init_and_add+0x63/0x90
>     [<ffffffffa06adadd>] btrfs_sysfs_add_one+0x7d/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> unreferenced object 0xffff8806b3cf22b0 (size 16):
>   comm "mount", pid 20697, jiffies 4295160287 (age 1117.544s)
>   hex dump (first 16 bytes):
>     66 65 61 74 75 72 65 73 00 6b 6b 6b 6b 6b 6b a5  features.kkkkkk.
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8119061b>] __kmalloc_track_caller+0x1cb/0x240
>     [<ffffffff81157102>] kstrdup+0x42/0x70
>     [<ffffffff81219271>] sysfs_new_dirent+0x31/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219a0f>] sysfs_create_subdir+0x1f/0x30
>     [<ffffffff8121b51e>] internal_create_group+0x5e/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
> unreferenced object 0xffff880096825310 (size 160):
>   comm "mount", pid 20697, jiffies 4295160287 (age 1117.648s)
>   hex dump (first 32 bytes):
>     03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219a0f>] sysfs_create_subdir+0x1f/0x30
>     [<ffffffff8121b51e>] internal_create_group+0x5e/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> unreferenced object 0xffff880096824b70 (size 160):
>   comm "mount", pid 20697, jiffies 4295160287 (age 1117.648s)
>   hex dump (first 32 bytes):
>     01 00 00 00 00 00 00 00 b8 4d 72 a0 ff ff ff ff  .........Mr.....
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff8121847a>] sysfs_add_file_mode+0x6a/0x110
>     [<ffffffff8121b5a1>] internal_create_group+0xe1/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> unreferenced object 0xffff880096825128 (size 160):
>   comm "mount", pid 20697, jiffies 4295160287 (age 1117.648s)
>   hex dump (first 32 bytes):
>     01 00 00 00 00 00 00 00 38 4f 72 a0 ff ff ff ff  ........8Or.....
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff8121847a>] sysfs_add_file_mode+0x6a/0x110
>     [<ffffffff8121b5a1>] internal_create_group+0xe1/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> unreferenced object 0xffff880758bbb6f8 (size 64):
>   comm "mount", pid 20762, jiffies 4295160425 (age 1117.192s)
>   hex dump (first 32 bytes):
>     34 62 31 39 39 65 37 35 2d 30 62 31 32 2d 34 34  4b199e75-0b12-44
>     64 39 2d 61 31 61 34 2d 31 32 39 31 66 37 63 30  d9-a1a4-1291f7c0
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8119061b>] __kmalloc_track_caller+0x1cb/0x240
>     [<ffffffff81157102>] kstrdup+0x42/0x70
>     [<ffffffff81219271>] sysfs_new_dirent+0x31/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219aa9>] sysfs_create_dir+0x89/0xe0
>     [<ffffffff813e3416>] kobject_add_internal+0x96/0x210
>     [<ffffffff813e37a3>] kobject_init_and_add+0x63/0x90
>     [<ffffffffa06adadd>] btrfs_sysfs_add_one+0x7d/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
> unreferenced object 0xffff8806649361e8 (size 160):
>   comm "mount", pid 20762, jiffies 4295160425 (age 1117.192s)
>   hex dump (first 32 bytes):
>     01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219aa9>] sysfs_create_dir+0x89/0xe0
>     [<ffffffff813e3416>] kobject_add_internal+0x96/0x210
>     [<ffffffff813e37a3>] kobject_init_and_add+0x63/0x90
>     [<ffffffffa06adadd>] btrfs_sysfs_add_one+0x7d/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> unreferenced object 0xffff8806b3cf32d0 (size 16):
>   comm "mount", pid 20762, jiffies 4295160425 (age 1117.192s)
>   hex dump (first 16 bytes):
>     66 65 61 74 75 72 65 73 00 6b 6b 6b 6b 6b 6b a5  features.kkkkkk.
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8119061b>] __kmalloc_track_caller+0x1cb/0x240
>     [<ffffffff81157102>] kstrdup+0x42/0x70
>     [<ffffffff81219271>] sysfs_new_dirent+0x31/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219a0f>] sysfs_create_subdir+0x1f/0x30
>     [<ffffffff8121b51e>] internal_create_group+0x5e/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
> unreferenced object 0xffff8806649363d0 (size 160):
>   comm "mount", pid 20762, jiffies 4295160425 (age 1117.272s)
>   hex dump (first 32 bytes):
>     03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff812196e2>] create_dir+0x42/0xd0
>     [<ffffffff81219a0f>] sysfs_create_subdir+0x1f/0x30
>     [<ffffffff8121b51e>] internal_create_group+0x5e/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> unreferenced object 0xffff8806649378c8 (size 160):
>   comm "mount", pid 20762, jiffies 4295160425 (age 1117.272s)
>   hex dump (first 32 bytes):
>     01 00 00 00 00 00 00 00 b8 4d 72 a0 ff ff ff ff  .........Mr.....
>     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<ffffffff8175f606>] kmemleak_alloc+0x26/0x50
>     [<ffffffff8118f294>] kmem_cache_alloc+0x114/0x200
>     [<ffffffff81219291>] sysfs_new_dirent+0x51/0x130
>     [<ffffffff8121847a>] sysfs_add_file_mode+0x6a/0x110
>     [<ffffffff8121b5a1>] internal_create_group+0xe1/0x270
>     [<ffffffff8121b763>] sysfs_create_group+0x13/0x20
>     [<ffffffffa06adb07>] btrfs_sysfs_add_one+0xa7/0x1b0 [btrfs]
>     [<ffffffffa0693792>] open_ctree+0x17d2/0x21f0 [btrfs]
>     [<ffffffffa066983a>] btrfs_mount+0x53a/0x7d0 [btrfs]
>     [<ffffffff811a3ae3>] mount_fs+0x43/0x1b0
>     [<ffffffff811bfa66>] vfs_kern_mount+0x76/0x120
>     [<ffffffff811c1d87>] do_mount+0x237/0xa70
>     [<ffffffff811c2650>] SyS_mount+0x90/0xe0
>     [<ffffffff8177ef12>] system_call_fastpath+0x16/0x1b
>     [<ffffffffffffffff>] 0xffffffffffffffff
> 
> 
> 
>> ---
>>  fs/btrfs/sysfs.c |  132 ++++++++++++++++++++++++++++++-------------------------
>>  1 file changed, 72 insertions(+), 60 deletions(-)
>>
>> --- a/fs/btrfs/sysfs.c  2013-11-20 14:58:40.907456459 -0500
>> +++ b/fs/btrfs/sysfs.c  2013-11-20 16:59:02.359951682 -0500
>> @@ -417,28 +417,83 @@ static inline struct btrfs_fs_info *to_f
>>         return container_of(kobj, struct btrfs_fs_info, super_kobj);
>>  }
>>
>> -void btrfs_sysfs_remove_one(struct btrfs_fs_info *fs_info)
>> +#define NUM_FEATURE_BITS 64
>> +static char btrfs_unknown_feature_names[3][NUM_FEATURE_BITS][13];
>> +static struct btrfs_feature_attr btrfs_feature_attrs[3][NUM_FEATURE_BITS];
>> +
>> +static u64 supported_feature_masks[3] = {
>> +       [FEAT_COMPAT]    = BTRFS_FEATURE_COMPAT_SUPP,
>> +       [FEAT_COMPAT_RO] = BTRFS_FEATURE_COMPAT_RO_SUPP,
>> +       [FEAT_INCOMPAT]  = BTRFS_FEATURE_INCOMPAT_SUPP,
>> +};
>> +
>> +static int addrm_unknown_feature_attrs(struct btrfs_fs_info *fs_info, bool add)
>> +{
>> +       int set;
>> +
>> +       for (set = 0; set < FEAT_MAX; set++) {
>> +               int i;
>> +               struct attribute *attrs[2];
>> +               struct attribute_group agroup = {
>> +                       .name = "features",
>> +                       .attrs = attrs,
>> +               };
>> +               u64 features = get_features(fs_info, set);
>> +               features &= ~supported_feature_masks[set];
>> +
>> +               if (!features)
>> +                       continue;
>> +
>> +               attrs[1] = NULL;
>> +               for (i = 0; i < NUM_FEATURE_BITS; i++) {
>> +                       struct btrfs_feature_attr *fa;
>> +
>> +                       if (!(features & (1ULL << i)))
>> +                               continue;
>> +
>> +                       fa = &btrfs_feature_attrs[set][i];
>> +                       attrs[0] = &fa->kobj_attr.attr;
>> +                       if (add) {
>> +                               int ret;
>> +                               ret = sysfs_merge_group(&fs_info->super_kobj,
>> +                                                       &agroup);
>> +                               if (ret)
>> +                                       return ret;
>> +                       } else
>> +                               sysfs_unmerge_group(&fs_info->super_kobj,
>> +                                                   &agroup);
>> +               }
>> +
>> +       }
>> +       return 0;
>> +}
>> +
>> +static void __btrfs_sysfs_remove_one(struct btrfs_fs_info *fs_info)
>>  {
>> -       sysfs_remove_files(fs_info->space_info_kobj, allocation_attrs);
>> -       kobject_del(fs_info->device_dir_kobj);
>> -       kobject_put(fs_info->device_dir_kobj);
>> -       kobject_del(fs_info->space_info_kobj);
>> -       kobject_put(fs_info->space_info_kobj);
>>         kobject_del(&fs_info->super_kobj);
>>         kobject_put(&fs_info->super_kobj);
>>         wait_for_completion(&fs_info->kobj_unregister);
>>  }
>>
>> +void btrfs_sysfs_remove_one(struct btrfs_fs_info *fs_info)
>> +{
>> +       if (fs_info->space_info_kobj) {
>> +               sysfs_remove_files(fs_info->space_info_kobj, allocation_attrs);
>> +               kobject_del(fs_info->space_info_kobj);
>> +               kobject_put(fs_info->space_info_kobj);
>> +       }
>> +       kobject_del(fs_info->device_dir_kobj);
>> +       kobject_put(fs_info->device_dir_kobj);
>> +       addrm_unknown_feature_attrs(fs_info, false);
>> +       __btrfs_sysfs_remove_one(fs_info);
>> +}
>> +
>>  const char * const btrfs_feature_set_names[3] = {
>>         [FEAT_COMPAT]    = "compat",
>>         [FEAT_COMPAT_RO] = "compat_ro",
>>         [FEAT_INCOMPAT]  = "incompat",
>>  };
>>
>> -#define NUM_FEATURE_BITS 64
>> -static char btrfs_unknown_feature_names[3][NUM_FEATURE_BITS][13];
>> -static struct btrfs_feature_attr btrfs_feature_attrs[3][NUM_FEATURE_BITS];
>> -
>>  char *btrfs_printable_features(enum btrfs_feature_set set, u64 flags)
>>  {
>>         size_t bufsize = 4096; /* safe max, 64 names * 64 bytes */
>> @@ -508,53 +563,6 @@ static void init_feature_attrs(void)
>>         }
>>  }
>>
>> -static u64 supported_feature_masks[3] = {
>> -       [FEAT_COMPAT]    = BTRFS_FEATURE_COMPAT_SUPP,
>> -       [FEAT_COMPAT_RO] = BTRFS_FEATURE_COMPAT_RO_SUPP,
>> -       [FEAT_INCOMPAT]  = BTRFS_FEATURE_INCOMPAT_SUPP,
>> -};
>> -
>> -static int add_unknown_feature_attrs(struct btrfs_fs_info *fs_info)
>> -{
>> -       int set;
>> -
>> -       for (set = 0; set < FEAT_MAX; set++) {
>> -               int i, count, ret, index = 0;
>> -               struct attribute **attrs;
>> -               struct attribute_group agroup = {
>> -                       .name = "features",
>> -               };
>> -               u64 features = get_features(fs_info, set);
>> -               features &= ~supported_feature_masks[set];
>> -
>> -               count = hweight64(features);
>> -
>> -               if (!count)
>> -                       continue;
>> -
>> -               attrs = kcalloc(count + 1, sizeof(void *), GFP_KERNEL);
>> -
>> -               for (i = 0; i < NUM_FEATURE_BITS; i++) {
>> -                       struct btrfs_feature_attr *fa;
>> -
>> -                       if (!(features & (1ULL << i)))
>> -                               continue;
>> -
>> -                       fa = &btrfs_feature_attrs[set][i];
>> -                       attrs[index++] = &fa->kobj_attr.attr;
>> -               }
>> -
>> -               attrs[index] = NULL;
>> -               agroup.attrs = attrs;
>> -
>> -               ret = sysfs_merge_group(&fs_info->super_kobj, &agroup);
>> -               kfree(attrs);
>> -               if (ret)
>> -                       return ret;
>> -       }
>> -       return 0;
>> -}
>> -
>>  static int add_device_membership(struct btrfs_fs_info *fs_info)
>>  {
>>         int error = 0;
>> @@ -590,13 +598,17 @@ int btrfs_sysfs_add_one(struct btrfs_fs_
>>         fs_info->super_kobj.kset = btrfs_kset;
>>         error = kobject_init_and_add(&fs_info->super_kobj, &btrfs_ktype, NULL,
>>                                      "%pU", fs_info->fsid);
>> +       if (error)
>> +               return error;
>>
>>         error = sysfs_create_group(&fs_info->super_kobj,
>>                                    &btrfs_feature_attr_group);
>> -       if (error)
>> -               goto failure;
>> +       if (error) {
>> +               __btrfs_sysfs_remove_one(fs_info);
>> +               return error;
>> +       }
>>
>> -       error = add_unknown_feature_attrs(fs_info);
>> +       error = addrm_unknown_feature_attrs(fs_info, true);
>>         if (error)
>>                 goto failure;
>>
>>
>>
>> --
>> Jeff Mahoney
>> SUSE Labs
> 
> 
> 


-- 
Jeff Mahoney
SUSE Labs


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 841 bytes --]

      reply	other threads:[~2013-11-21 15:06 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-20 21:59 [PATCH] btrfs: fix leaks during sysfs teardown Jeff Mahoney
2013-11-21 13:07 ` Filipe David Manana
2013-11-21 15:05   ` Jeff Mahoney [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=528E2136.3090404@suse.com \
    --to=jeffm@suse.com \
    --cc=fdmanana@gmail.com \
    --cc=jbacik@fusionio.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.