diff options
author | Andy Whitcroft <apw@canonical.com> | 2012-10-11 06:32:19 -0400 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2012-10-30 06:39:22 -0400 |
commit | 5c9b50ab8ca962bc085cfb49bae947910d73f794 (patch) | |
tree | 48fb43e7b68aa3bd6597774f8569cd846af7dcd1 /drivers/firmware | |
parent | 45a937a883c4411648b80e87341b237cc48009c1 (diff) |
efivarfs: efivarfs_fill_super() fix inode reference counts
When d_make_root() fails it will automatically drop the reference
on the root inode. We should not be doing so as well.
Signed-off-by: Andy Whitcroft <apw@canonical.com>
Acked-by: Matthew Garrett <mjg@redhat.com>
Acked-by: Jeremy Kerr <jeremy.kerr@canonical.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/efivars.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c index 6e5f367145f5..adfc4863202b 100644 --- a/drivers/firmware/efivars.c +++ b/drivers/firmware/efivars.c | |||
@@ -948,7 +948,6 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent) | |||
948 | struct dentry *root; | 948 | struct dentry *root; |
949 | struct efivar_entry *entry, *n; | 949 | struct efivar_entry *entry, *n; |
950 | struct efivars *efivars = &__efivars; | 950 | struct efivars *efivars = &__efivars; |
951 | int err; | ||
952 | 951 | ||
953 | efivarfs_sb = sb; | 952 | efivarfs_sb = sb; |
954 | 953 | ||
@@ -960,18 +959,14 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent) | |||
960 | sb->s_time_gran = 1; | 959 | sb->s_time_gran = 1; |
961 | 960 | ||
962 | inode = efivarfs_get_inode(sb, NULL, S_IFDIR | 0755, 0); | 961 | inode = efivarfs_get_inode(sb, NULL, S_IFDIR | 0755, 0); |
963 | if (!inode) { | 962 | if (!inode) |
964 | err = -ENOMEM; | 963 | return -ENOMEM; |
965 | goto fail; | ||
966 | } | ||
967 | inode->i_op = &efivarfs_dir_inode_operations; | 964 | inode->i_op = &efivarfs_dir_inode_operations; |
968 | 965 | ||
969 | root = d_make_root(inode); | 966 | root = d_make_root(inode); |
970 | sb->s_root = root; | 967 | sb->s_root = root; |
971 | if (!root) { | 968 | if (!root) |
972 | err = -ENOMEM; | 969 | return -ENOMEM; |
973 | goto fail; | ||
974 | } | ||
975 | 970 | ||
976 | list_for_each_entry_safe(entry, n, &efivars->list, list) { | 971 | list_for_each_entry_safe(entry, n, &efivars->list, list) { |
977 | struct inode *inode; | 972 | struct inode *inode; |
@@ -1012,9 +1007,6 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent) | |||
1012 | } | 1007 | } |
1013 | 1008 | ||
1014 | return 0; | 1009 | return 0; |
1015 | fail: | ||
1016 | iput(inode); | ||
1017 | return err; | ||
1018 | } | 1010 | } |
1019 | 1011 | ||
1020 | static struct dentry *efivarfs_mount(struct file_system_type *fs_type, | 1012 | static struct dentry *efivarfs_mount(struct file_system_type *fs_type, |