I sent these patches a few weeks ago. Due to the recent changes in pstore,
these patched might not apply anymore. So I refresh and resend them.
---
Changes in v2:
- refresh the patches.
---
Geliang Tang (3):
pstore: check PSTORE_FLAGS_FRAGILE in pstore_unregister
efi-pstore: implement efivars_pstore_exit()
pstore: drop file opened reference count
drivers/firmware/efi/efi-pstore.c | 7 +++++++
fs/pstore/inode.c | 1 -
fs/pstore/platform.c | 9 ++++++---
3 files changed, 13 insertions(+), 4 deletions(-)
--
2.5.0
When PSTORE_FLAGS_FRAGILE flag is set, only kmsg is registered in
pstore_register. So, under these circumstances, only kmsg needs to
be unregistered in pstore_unregister.
Signed-off-by: Geliang Tang <[email protected]>
---
fs/pstore/platform.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 588461b..5b8f1eb 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -497,9 +497,12 @@ EXPORT_SYMBOL_GPL(pstore_register);
void pstore_unregister(struct pstore_info *psi)
{
- pstore_unregister_pmsg();
- pstore_unregister_ftrace();
- pstore_unregister_console();
+ if ((psi->flags & PSTORE_FLAGS_FRAGILE) == 0) {
+ pstore_unregister_pmsg();
+ pstore_unregister_ftrace();
+ pstore_unregister_console();
+ }
+
pstore_unregister_kmsg();
free_buf_for_compression();
--
2.5.0
The original efivars_pstore_exit() is empty. I
1) add a bufsize check statement.
2) call pstore_unregister as it is defined now.
3) free the memory and set bufsize to 0.
Signed-off-by: Geliang Tang <[email protected]>
---
drivers/firmware/efi/efi-pstore.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
index eac76a7..62d57d8 100644
--- a/drivers/firmware/efi/efi-pstore.c
+++ b/drivers/firmware/efi/efi-pstore.c
@@ -393,6 +393,13 @@ static __init int efivars_pstore_init(void)
static __exit void efivars_pstore_exit(void)
{
+ if (!efi_pstore_info.bufsize)
+ return;
+
+ pstore_unregister(&efi_pstore_info);
+ kfree(efi_pstore_info.buf);
+ efi_pstore_info.buf = NULL;
+ efi_pstore_info.bufsize = 0;
}
module_init(efivars_pstore_init);
--
2.5.0
In my recent commit, I added '.owner = THIS_MODULE' in both
pstore_fs_type and pstore_file_operations to increase a reference count
when pstore filesystem is mounted and pstore file is opened.[1]
But, it's repetitive. There is no need to increase the opened reference
count. We only need to increase the mounted reference count. When a file
is opened, the filesystem can't be unmounted. Hence the pstore module
can't be unloaded either.
So I drop the opened reference count in this patch.
[1] https://lkml.org/lkml/2015/10/20/84
Signed-off-by: Geliang Tang <[email protected]>
---
Here is the reference count test:
$ sudo /sbin/insmod lib/zlib_deflate/zlib_deflate.ko
$ sudo /sbin/insmod fs/pstore/pstore.ko
$ lsmod
Module Size Used by
pstore 13301 0
zlib_deflate 20156 1 pstore
$ sudo mount -t pstore pstore /sys/fs/pstore
$ lsmod
Module Size Used by
pstore 13301 1
zlib_deflate 20156 1 pstore
$ sudo /sbin/insmod lib/reed_solomon/reed_solomon.ko
$ sudo /sbin/insmod fs/pstore/ramoops.ko mem_address=0x80000000 mem_size=0x40000 ecc=1
$ lsmod
Module Size Used by
ramoops 11156 0
reed_solomon 5878 1 ramoops
pstore 13301 2 ramoops
zlib_deflate 20156 1 pstore
$ sudo rmmod ramoops
$ lsmod
Module Size Used by
reed_solomon 5878 0
pstore 13301 1
zlib_deflate 20156 1 pstore
$ tail -f /sys/fs/pstore/console-ramoops-0 &
[1] 4479
$ lsmod
Module Size Used by
reed_solomon 5878 0
pstore 13301 1
zlib_deflate 20156 1 pstore
$ sudo umount /sys/fs/pstore
umount: /sys/fs/pstore: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
$ kill -9 4479
[1]+ Killed tail -f /sys/fs/pstore/console-ramoops-0
$ lsmod
Module Size Used by
reed_solomon 5878 0
pstore 13301 1
zlib_deflate 20156 1 pstore
$ sudo umount /sys/fs/pstore
$ lsmod
Module Size Used by
reed_solomon 5878 0
pstore 13301 0
zlib_deflate 20156 1 pstore
$ sudo rmmod pstore
$ lsmod
Module Size Used by
reed_solomon 5878 0
zlib_deflate 20156 0
---
fs/pstore/inode.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c
index d8c439d..ac6c78fe 100644
--- a/fs/pstore/inode.c
+++ b/fs/pstore/inode.c
@@ -178,7 +178,6 @@ static loff_t pstore_file_llseek(struct file *file, loff_t off, int whence)
}
static const struct file_operations pstore_file_operations = {
- .owner = THIS_MODULE,
.open = pstore_file_open,
.read = pstore_file_read,
.llseek = pstore_file_llseek,
--
2.5.0
On Sat, 07 Nov, at 12:43:48PM, Geliang Tang wrote:
> The original efivars_pstore_exit() is empty. I
> 1) add a bufsize check statement.
> 2) call pstore_unregister as it is defined now.
> 3) free the memory and set bufsize to 0.
>
> Signed-off-by: Geliang Tang <[email protected]>
> ---
> drivers/firmware/efi/efi-pstore.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
> index eac76a7..62d57d8 100644
> --- a/drivers/firmware/efi/efi-pstore.c
> +++ b/drivers/firmware/efi/efi-pstore.c
> @@ -393,6 +393,13 @@ static __init int efivars_pstore_init(void)
>
> static __exit void efivars_pstore_exit(void)
> {
> + if (!efi_pstore_info.bufsize)
> + return;
> +
> + pstore_unregister(&efi_pstore_info);
> + kfree(efi_pstore_info.buf);
> + efi_pstore_info.buf = NULL;
> + efi_pstore_info.bufsize = 0;
> }
>
> module_init(efivars_pstore_init);
Looks OK to me. Kees, are you picking this up?
On Wed, Nov 11, 2015 at 8:59 AM, Matt Fleming <[email protected]> wrote:
> On Sat, 07 Nov, at 12:43:48PM, Geliang Tang wrote:
>> The original efivars_pstore_exit() is empty. I
>> 1) add a bufsize check statement.
>> 2) call pstore_unregister as it is defined now.
>> 3) free the memory and set bufsize to 0.
>>
>> Signed-off-by: Geliang Tang <[email protected]>
>> ---
>> drivers/firmware/efi/efi-pstore.c | 7 +++++++
>> 1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
>> index eac76a7..62d57d8 100644
>> --- a/drivers/firmware/efi/efi-pstore.c
>> +++ b/drivers/firmware/efi/efi-pstore.c
>> @@ -393,6 +393,13 @@ static __init int efivars_pstore_init(void)
>>
>> static __exit void efivars_pstore_exit(void)
>> {
>> + if (!efi_pstore_info.bufsize)
>> + return;
>> +
>> + pstore_unregister(&efi_pstore_info);
>> + kfree(efi_pstore_info.buf);
>> + efi_pstore_info.buf = NULL;
>> + efi_pstore_info.bufsize = 0;
>> }
>>
>> module_init(efivars_pstore_init);
>
> Looks OK to me. Kees, are you picking this up?
I can, though usually it goes through Tony.
-Kees
--
Kees Cook
Chrome OS Security
>>> module_init(efivars_pstore_init);
>>
>> Looks OK to me. Kees, are you picking this up?
>
> I can, though usually it goes through Tony.
Can I count that as "Acked-by" from both of you?
-Tony
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m????????????I?
On Wed, Nov 11, 2015 at 3:23 PM, Luck, Tony <[email protected]> wrote:
>>>> module_init(efivars_pstore_init);
>>>
>>> Looks OK to me. Kees, are you picking this up?
>>
>> I can, though usually it goes through Tony.
>
> Can I count that as "Acked-by" from both of you?
Yup, sorry. I thought I'd acked them already. :) My bad!
Acked-by: Kees Cook <[email protected]>
-Kees
--
Kees Cook
Chrome OS Security
On Wed, 11 Nov, at 11:23:15PM, Luck, Tony wrote:
> >>> module_init(efivars_pstore_init);
> >>
> >> Looks OK to me. Kees, are you picking this up?
> >
> > I can, though usually it goes through Tony.
>
> Can I count that as "Acked-by" from both of you?
Yep, Acked-by: Matt Fleming <[email protected]>