diff mbox series

cifs: Fix memory leak on the deferred close

Message ID 20220818135044.2251342-1-zhangxiaoxu5@huawei.com (mailing list archive)
State New, archived
Headers show
Series cifs: Fix memory leak on the deferred close | expand

Commit Message

Zhang Xiaoxu Aug. 18, 2022, 1:50 p.m. UTC
xfstests on smb21 report kmemleak as below:

  unreferenced object 0xffff8881767d6200 (size 64):
    comm "xfs_io", pid 1284, jiffies 4294777434 (age 20.789s)
    hex dump (first 32 bytes):
      80 5a d0 11 81 88 ff ff 78 8a aa 63 81 88 ff ff  .Z......x..c....
      00 71 99 76 81 88 ff ff 00 00 00 00 00 00 00 00  .q.v............
    backtrace:
      [<00000000ad04e6ea>] cifs_close+0x92/0x2c0
      [<0000000028b93c82>] __fput+0xff/0x3f0
      [<00000000d8116851>] task_work_run+0x85/0xc0
      [<0000000027e14f9e>] do_exit+0x5e5/0x1240
      [<00000000fb492b95>] do_group_exit+0x58/0xe0
      [<00000000129a32d9>] __x64_sys_exit_group+0x28/0x30
      [<00000000e3f7d8e9>] do_syscall_64+0x35/0x80
      [<00000000102e8a0b>] entry_SYSCALL_64_after_hwframe+0x46/0xb0

When cancel the deferred close work, we should also cleanup the struct
cifs_deferred_close.

Fixes: 9e992755be8f2 ("cifs: Call close synchronously during unlink/rename/lease break.")
Fixes: e3fc065682ebb ("cifs: Deferred close performance improvements")
Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
---
 fs/cifs/misc.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Steve French Aug. 18, 2022, 4:28 p.m. UTC | #1
looks promising - am reviewing this now.  Which xfstest did you see
this when runnign?

On Thu, Aug 18, 2022 at 8:01 AM Zhang Xiaoxu <zhangxiaoxu5@huawei.com> wrote:
>
> xfstests on smb21 report kmemleak as below:
>
>   unreferenced object 0xffff8881767d6200 (size 64):
>     comm "xfs_io", pid 1284, jiffies 4294777434 (age 20.789s)
>     hex dump (first 32 bytes):
>       80 5a d0 11 81 88 ff ff 78 8a aa 63 81 88 ff ff  .Z......x..c....
>       00 71 99 76 81 88 ff ff 00 00 00 00 00 00 00 00  .q.v............
>     backtrace:
>       [<00000000ad04e6ea>] cifs_close+0x92/0x2c0
>       [<0000000028b93c82>] __fput+0xff/0x3f0
>       [<00000000d8116851>] task_work_run+0x85/0xc0
>       [<0000000027e14f9e>] do_exit+0x5e5/0x1240
>       [<00000000fb492b95>] do_group_exit+0x58/0xe0
>       [<00000000129a32d9>] __x64_sys_exit_group+0x28/0x30
>       [<00000000e3f7d8e9>] do_syscall_64+0x35/0x80
>       [<00000000102e8a0b>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
>
> When cancel the deferred close work, we should also cleanup the struct
> cifs_deferred_close.
>
> Fixes: 9e992755be8f2 ("cifs: Call close synchronously during unlink/rename/lease break.")
> Fixes: e3fc065682ebb ("cifs: Deferred close performance improvements")
> Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
> ---
>  fs/cifs/misc.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
> index 1f2628ffe9d7..87f60f736731 100644
> --- a/fs/cifs/misc.c
> +++ b/fs/cifs/misc.c
> @@ -737,6 +737,8 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
>         list_for_each_entry(cfile, &cifs_inode->openFileList, flist) {
>                 if (delayed_work_pending(&cfile->deferred)) {
>                         if (cancel_delayed_work(&cfile->deferred)) {
> +                               cifs_del_deferred_close(cfile);
> +
>                                 tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>                                 if (tmp_list == NULL)
>                                         break;
> @@ -766,6 +768,8 @@ cifs_close_all_deferred_files(struct cifs_tcon *tcon)
>         list_for_each_entry(cfile, &tcon->openFileList, tlist) {
>                 if (delayed_work_pending(&cfile->deferred)) {
>                         if (cancel_delayed_work(&cfile->deferred)) {
> +                               cifs_del_deferred_close(cfile);
> +
>                                 tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>                                 if (tmp_list == NULL)
>                                         break;
> @@ -799,6 +803,8 @@ cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)
>                 if (strstr(full_path, path)) {
>                         if (delayed_work_pending(&cfile->deferred)) {
>                                 if (cancel_delayed_work(&cfile->deferred)) {
> +                                       cifs_del_deferred_close(cfile);
> +
>                                         tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>                                         if (tmp_list == NULL)
>                                                 break;
> --
> 2.31.1
>
Zhang Xiaoxu Aug. 19, 2022, 1:24 a.m. UTC | #2
running generic/029 and scan kmemleak on backend report this issue.

在 2022/8/19 0:28, Steve French 写道:
> looks promising - am reviewing this now.  Which xfstest did you see
> this when runnign?
> 
> On Thu, Aug 18, 2022 at 8:01 AM Zhang Xiaoxu <zhangxiaoxu5@huawei.com> wrote:
>>
>> xfstests on smb21 report kmemleak as below:
>>
>>    unreferenced object 0xffff8881767d6200 (size 64):
>>      comm "xfs_io", pid 1284, jiffies 4294777434 (age 20.789s)
>>      hex dump (first 32 bytes):
>>        80 5a d0 11 81 88 ff ff 78 8a aa 63 81 88 ff ff  .Z......x..c....
>>        00 71 99 76 81 88 ff ff 00 00 00 00 00 00 00 00  .q.v............
>>      backtrace:
>>        [<00000000ad04e6ea>] cifs_close+0x92/0x2c0
>>        [<0000000028b93c82>] __fput+0xff/0x3f0
>>        [<00000000d8116851>] task_work_run+0x85/0xc0
>>        [<0000000027e14f9e>] do_exit+0x5e5/0x1240
>>        [<00000000fb492b95>] do_group_exit+0x58/0xe0
>>        [<00000000129a32d9>] __x64_sys_exit_group+0x28/0x30
>>        [<00000000e3f7d8e9>] do_syscall_64+0x35/0x80
>>        [<00000000102e8a0b>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
>>
>> When cancel the deferred close work, we should also cleanup the struct
>> cifs_deferred_close.
>>
>> Fixes: 9e992755be8f2 ("cifs: Call close synchronously during unlink/rename/lease break.")
>> Fixes: e3fc065682ebb ("cifs: Deferred close performance improvements")
>> Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
>> ---
>>   fs/cifs/misc.c | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
>> index 1f2628ffe9d7..87f60f736731 100644
>> --- a/fs/cifs/misc.c
>> +++ b/fs/cifs/misc.c
>> @@ -737,6 +737,8 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
>>          list_for_each_entry(cfile, &cifs_inode->openFileList, flist) {
>>                  if (delayed_work_pending(&cfile->deferred)) {
>>                          if (cancel_delayed_work(&cfile->deferred)) {
>> +                               cifs_del_deferred_close(cfile);
>> +
>>                                  tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>>                                  if (tmp_list == NULL)
>>                                          break;
>> @@ -766,6 +768,8 @@ cifs_close_all_deferred_files(struct cifs_tcon *tcon)
>>          list_for_each_entry(cfile, &tcon->openFileList, tlist) {
>>                  if (delayed_work_pending(&cfile->deferred)) {
>>                          if (cancel_delayed_work(&cfile->deferred)) {
>> +                               cifs_del_deferred_close(cfile);
>> +
>>                                  tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>>                                  if (tmp_list == NULL)
>>                                          break;
>> @@ -799,6 +803,8 @@ cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)
>>                  if (strstr(full_path, path)) {
>>                          if (delayed_work_pending(&cfile->deferred)) {
>>                                  if (cancel_delayed_work(&cfile->deferred)) {
>> +                                       cifs_del_deferred_close(cfile);
>> +
>>                                          tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>>                                          if (tmp_list == NULL)
>>                                                  break;
>> --
>> 2.31.1
>>
> 
>
Steve French Aug. 19, 2022, 2:53 a.m. UTC | #3
Don't see any problems with this - but would like to run some more tests on it

On Thu, Aug 18, 2022 at 8:24 PM zhangxiaoxu (A) <zhangxiaoxu5@huawei.com> wrote:
>
> running generic/029 and scan kmemleak on backend report this issue.
>
> 在 2022/8/19 0:28, Steve French 写道:
> > looks promising - am reviewing this now.  Which xfstest did you see
> > this when runnign?
> >
> > On Thu, Aug 18, 2022 at 8:01 AM Zhang Xiaoxu <zhangxiaoxu5@huawei.com> wrote:
> >>
> >> xfstests on smb21 report kmemleak as below:
> >>
> >>    unreferenced object 0xffff8881767d6200 (size 64):
> >>      comm "xfs_io", pid 1284, jiffies 4294777434 (age 20.789s)
> >>      hex dump (first 32 bytes):
> >>        80 5a d0 11 81 88 ff ff 78 8a aa 63 81 88 ff ff  .Z......x..c....
> >>        00 71 99 76 81 88 ff ff 00 00 00 00 00 00 00 00  .q.v............
> >>      backtrace:
> >>        [<00000000ad04e6ea>] cifs_close+0x92/0x2c0
> >>        [<0000000028b93c82>] __fput+0xff/0x3f0
> >>        [<00000000d8116851>] task_work_run+0x85/0xc0
> >>        [<0000000027e14f9e>] do_exit+0x5e5/0x1240
> >>        [<00000000fb492b95>] do_group_exit+0x58/0xe0
> >>        [<00000000129a32d9>] __x64_sys_exit_group+0x28/0x30
> >>        [<00000000e3f7d8e9>] do_syscall_64+0x35/0x80
> >>        [<00000000102e8a0b>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
> >>
> >> When cancel the deferred close work, we should also cleanup the struct
> >> cifs_deferred_close.
> >>
> >> Fixes: 9e992755be8f2 ("cifs: Call close synchronously during unlink/rename/lease break.")
> >> Fixes: e3fc065682ebb ("cifs: Deferred close performance improvements")
> >> Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
> >> ---
> >>   fs/cifs/misc.c | 6 ++++++
> >>   1 file changed, 6 insertions(+)
> >>
> >> diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
> >> index 1f2628ffe9d7..87f60f736731 100644
> >> --- a/fs/cifs/misc.c
> >> +++ b/fs/cifs/misc.c
> >> @@ -737,6 +737,8 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
> >>          list_for_each_entry(cfile, &cifs_inode->openFileList, flist) {
> >>                  if (delayed_work_pending(&cfile->deferred)) {
> >>                          if (cancel_delayed_work(&cfile->deferred)) {
> >> +                               cifs_del_deferred_close(cfile);
> >> +
> >>                                  tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
> >>                                  if (tmp_list == NULL)
> >>                                          break;
> >> @@ -766,6 +768,8 @@ cifs_close_all_deferred_files(struct cifs_tcon *tcon)
> >>          list_for_each_entry(cfile, &tcon->openFileList, tlist) {
> >>                  if (delayed_work_pending(&cfile->deferred)) {
> >>                          if (cancel_delayed_work(&cfile->deferred)) {
> >> +                               cifs_del_deferred_close(cfile);
> >> +
> >>                                  tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
> >>                                  if (tmp_list == NULL)
> >>                                          break;
> >> @@ -799,6 +803,8 @@ cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)
> >>                  if (strstr(full_path, path)) {
> >>                          if (delayed_work_pending(&cfile->deferred)) {
> >>                                  if (cancel_delayed_work(&cfile->deferred)) {
> >> +                                       cifs_del_deferred_close(cfile);
> >> +
> >>                                          tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
> >>                                          if (tmp_list == NULL)
> >>                                                  break;
> >> --
> >> 2.31.1
> >>
> >
> >
Zhang Xiaoxu Aug. 19, 2022, 8:22 a.m. UTC | #4
Before send this patch, I had run the xfstets. No new kmemleak/KASAN report.

Test on linux-next commit: 5b6a4bf680d61b1dd26629840f848d0df8983c62

Add some debug info in cifs_free_inode:
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -412,6 +412,11 @@ cifs_alloc_inode(struct super_block *sb)
  static void
  cifs_free_inode(struct inode *inode)
  {
+       struct cifs_deferred_close *dclose;
+       list_for_each_entry(dclose, &CIFS_I(inode)->deferred_closes, dlist) {
+               printk("maybe leak %px\n", dclose);
+       }
+
         kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
  }

Step:
1. while true; do echo scan > /sys/kernel/debug/kmemleak; cat /sys/kernel/debug/kmemleak; sleep 10; done
2. run xfstest generic/029

dmesg:
[  158.744333] maybe leak ffff88810f8b4380
[  158.751709] maybe leak ffff8881774f7100

kmemleak report:
unreferenced object 0xffff88810f8b4380 (size 64):
   comm "xfs_io", pid 1205, jiffies 4294824392 (age 54.681s)
   hex dump (first 32 bytes):
     00 71 4f 77 81 88 ff ff 58 af 64 7e 81 88 ff ff  .qOw....X.d~....
     00 4d 8b 0f 81 88 ff ff 00 00 28 77 81 88 ff ff  .M........(w....
   backtrace:
     [<00000000f205d29f>] cifs_close+0x87/0x2d0
     [<00000000bb6a0f7d>] __fput+0x111/0x440
     [<0000000052732f3c>] task_work_run+0x85/0xc0
     [<0000000050df65ac>] do_exit+0x5e5/0x1240
     [<00000000579f0599>] do_group_exit+0x58/0xe0
     [<00000000150b6679>] __x64_sys_exit_group+0x28/0x30
     [<0000000040aba183>] do_syscall_64+0x35/0x80
     [<000000007427e315>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
unreferenced object 0xffff8881774f7100 (size 64):
   comm "hexdump", pid 1227, jiffies 4294824547 (age 54.527s)
   hex dump (first 32 bytes):
     58 af 64 7e 81 88 ff ff 80 43 8b 0f 81 88 ff ff  X.d~.....C......
     00 4d 8b 0f 81 88 ff ff 00 00 4f 77 81 88 ff ff  .M........Ow....
   backtrace:
     [<00000000f205d29f>] cifs_close+0x87/0x2d0
     [<00000000bb6a0f7d>] __fput+0x111/0x440
     [<0000000052732f3c>] task_work_run+0x85/0xc0
     [<0000000050df65ac>] do_exit+0x5e5/0x1240
     [<00000000579f0599>] do_group_exit+0x58/0xe0
     [<00000000150b6679>] __x64_sys_exit_group+0x28/0x30
     [<0000000040aba183>] do_syscall_64+0x35/0x80
     [<000000007427e315>] entry_SYSCALL_64_after_hwframe+0x46/0xb0

Some more debug info point to when cancel the defered close, no free the cifs_deferred_close.


在 2022/8/19 10:53, Steve French 写道:
> Don't see any problems with this - but would like to run some more tests on it
> 
> On Thu, Aug 18, 2022 at 8:24 PM zhangxiaoxu (A) <zhangxiaoxu5@huawei.com> wrote:
>>
>> running generic/029 and scan kmemleak on backend report this issue.
>>
>> 在 2022/8/19 0:28, Steve French 写道:
>>> looks promising - am reviewing this now.  Which xfstest did you see
>>> this when runnign?
>>>
>>> On Thu, Aug 18, 2022 at 8:01 AM Zhang Xiaoxu <zhangxiaoxu5@huawei.com> wrote:
>>>>
>>>> xfstests on smb21 report kmemleak as below:
>>>>
>>>>     unreferenced object 0xffff8881767d6200 (size 64):
>>>>       comm "xfs_io", pid 1284, jiffies 4294777434 (age 20.789s)
>>>>       hex dump (first 32 bytes):
>>>>         80 5a d0 11 81 88 ff ff 78 8a aa 63 81 88 ff ff  .Z......x..c....
>>>>         00 71 99 76 81 88 ff ff 00 00 00 00 00 00 00 00  .q.v............
>>>>       backtrace:
>>>>         [<00000000ad04e6ea>] cifs_close+0x92/0x2c0
>>>>         [<0000000028b93c82>] __fput+0xff/0x3f0
>>>>         [<00000000d8116851>] task_work_run+0x85/0xc0
>>>>         [<0000000027e14f9e>] do_exit+0x5e5/0x1240
>>>>         [<00000000fb492b95>] do_group_exit+0x58/0xe0
>>>>         [<00000000129a32d9>] __x64_sys_exit_group+0x28/0x30
>>>>         [<00000000e3f7d8e9>] do_syscall_64+0x35/0x80
>>>>         [<00000000102e8a0b>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
>>>>
>>>> When cancel the deferred close work, we should also cleanup the struct
>>>> cifs_deferred_close.
>>>>
>>>> Fixes: 9e992755be8f2 ("cifs: Call close synchronously during unlink/rename/lease break.")
>>>> Fixes: e3fc065682ebb ("cifs: Deferred close performance improvements")
>>>> Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
>>>> ---
>>>>    fs/cifs/misc.c | 6 ++++++
>>>>    1 file changed, 6 insertions(+)
>>>>
>>>> diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
>>>> index 1f2628ffe9d7..87f60f736731 100644
>>>> --- a/fs/cifs/misc.c
>>>> +++ b/fs/cifs/misc.c
>>>> @@ -737,6 +737,8 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
>>>>           list_for_each_entry(cfile, &cifs_inode->openFileList, flist) {
>>>>                   if (delayed_work_pending(&cfile->deferred)) {
>>>>                           if (cancel_delayed_work(&cfile->deferred)) {
>>>> +                               cifs_del_deferred_close(cfile);
>>>> +
>>>>                                   tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>>>>                                   if (tmp_list == NULL)
>>>>                                           break;
>>>> @@ -766,6 +768,8 @@ cifs_close_all_deferred_files(struct cifs_tcon *tcon)
>>>>           list_for_each_entry(cfile, &tcon->openFileList, tlist) {
>>>>                   if (delayed_work_pending(&cfile->deferred)) {
>>>>                           if (cancel_delayed_work(&cfile->deferred)) {
>>>> +                               cifs_del_deferred_close(cfile);
>>>> +
>>>>                                   tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>>>>                                   if (tmp_list == NULL)
>>>>                                           break;
>>>> @@ -799,6 +803,8 @@ cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)
>>>>                   if (strstr(full_path, path)) {
>>>>                           if (delayed_work_pending(&cfile->deferred)) {
>>>>                                   if (cancel_delayed_work(&cfile->deferred)) {
>>>> +                                       cifs_del_deferred_close(cfile);
>>>> +
>>>>                                           tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
>>>>                                           if (tmp_list == NULL)
>>>>                                                   break;
>>>> --
>>>> 2.31.1
>>>>
>>>
>>>
> 
> 
>
Shyam Prasad N Aug. 19, 2022, 10:05 a.m. UTC | #5
On Fri, Aug 19, 2022 at 8:29 AM Steve French <smfrench@gmail.com> wrote:
>
> Don't see any problems with this - but would like to run some more tests on it
>
> On Thu, Aug 18, 2022 at 8:24 PM zhangxiaoxu (A) <zhangxiaoxu5@huawei.com> wrote:
> >
> > running generic/029 and scan kmemleak on backend report this issue.
> >
> > 在 2022/8/19 0:28, Steve French 写道:
> > > looks promising - am reviewing this now.  Which xfstest did you see
> > > this when runnign?
> > >
> > > On Thu, Aug 18, 2022 at 8:01 AM Zhang Xiaoxu <zhangxiaoxu5@huawei.com> wrote:
> > >>
> > >> xfstests on smb21 report kmemleak as below:
> > >>
> > >>    unreferenced object 0xffff8881767d6200 (size 64):
> > >>      comm "xfs_io", pid 1284, jiffies 4294777434 (age 20.789s)
> > >>      hex dump (first 32 bytes):
> > >>        80 5a d0 11 81 88 ff ff 78 8a aa 63 81 88 ff ff  .Z......x..c....
> > >>        00 71 99 76 81 88 ff ff 00 00 00 00 00 00 00 00  .q.v............
> > >>      backtrace:
> > >>        [<00000000ad04e6ea>] cifs_close+0x92/0x2c0
> > >>        [<0000000028b93c82>] __fput+0xff/0x3f0
> > >>        [<00000000d8116851>] task_work_run+0x85/0xc0
> > >>        [<0000000027e14f9e>] do_exit+0x5e5/0x1240
> > >>        [<00000000fb492b95>] do_group_exit+0x58/0xe0
> > >>        [<00000000129a32d9>] __x64_sys_exit_group+0x28/0x30
> > >>        [<00000000e3f7d8e9>] do_syscall_64+0x35/0x80
> > >>        [<00000000102e8a0b>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
> > >>
> > >> When cancel the deferred close work, we should also cleanup the struct
> > >> cifs_deferred_close.
> > >>
> > >> Fixes: 9e992755be8f2 ("cifs: Call close synchronously during unlink/rename/lease break.")
> > >> Fixes: e3fc065682ebb ("cifs: Deferred close performance improvements")
> > >> Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
> > >> ---
> > >>   fs/cifs/misc.c | 6 ++++++
> > >>   1 file changed, 6 insertions(+)
> > >>
> > >> diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
> > >> index 1f2628ffe9d7..87f60f736731 100644
> > >> --- a/fs/cifs/misc.c
> > >> +++ b/fs/cifs/misc.c
> > >> @@ -737,6 +737,8 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
> > >>          list_for_each_entry(cfile, &cifs_inode->openFileList, flist) {
> > >>                  if (delayed_work_pending(&cfile->deferred)) {
> > >>                          if (cancel_delayed_work(&cfile->deferred)) {
> > >> +                               cifs_del_deferred_close(cfile);
> > >> +
> > >>                                  tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
> > >>                                  if (tmp_list == NULL)
> > >>                                          break;
> > >> @@ -766,6 +768,8 @@ cifs_close_all_deferred_files(struct cifs_tcon *tcon)
> > >>          list_for_each_entry(cfile, &tcon->openFileList, tlist) {
> > >>                  if (delayed_work_pending(&cfile->deferred)) {
> > >>                          if (cancel_delayed_work(&cfile->deferred)) {
> > >> +                               cifs_del_deferred_close(cfile);
> > >> +
> > >>                                  tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
> > >>                                  if (tmp_list == NULL)
> > >>                                          break;
> > >> @@ -799,6 +803,8 @@ cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)
> > >>                  if (strstr(full_path, path)) {
> > >>                          if (delayed_work_pending(&cfile->deferred)) {
> > >>                                  if (cancel_delayed_work(&cfile->deferred)) {
> > >> +                                       cifs_del_deferred_close(cfile);
> > >> +
> > >>                                          tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
> > >>                                          if (tmp_list == NULL)
> > >>                                                  break;
> > >> --
> > >> 2.31.1
> > >>
> > >
> > >
>
>
>
> --
> Thanks,
>
> Steve

Thanks Zhang for the fix.
Looks good to me.
diff mbox series

Patch

diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index 1f2628ffe9d7..87f60f736731 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -737,6 +737,8 @@  cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
 	list_for_each_entry(cfile, &cifs_inode->openFileList, flist) {
 		if (delayed_work_pending(&cfile->deferred)) {
 			if (cancel_delayed_work(&cfile->deferred)) {
+				cifs_del_deferred_close(cfile);
+
 				tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
 				if (tmp_list == NULL)
 					break;
@@ -766,6 +768,8 @@  cifs_close_all_deferred_files(struct cifs_tcon *tcon)
 	list_for_each_entry(cfile, &tcon->openFileList, tlist) {
 		if (delayed_work_pending(&cfile->deferred)) {
 			if (cancel_delayed_work(&cfile->deferred)) {
+				cifs_del_deferred_close(cfile);
+
 				tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
 				if (tmp_list == NULL)
 					break;
@@ -799,6 +803,8 @@  cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)
 		if (strstr(full_path, path)) {
 			if (delayed_work_pending(&cfile->deferred)) {
 				if (cancel_delayed_work(&cfile->deferred)) {
+					cifs_del_deferred_close(cfile);
+
 					tmp_list = kmalloc(sizeof(struct file_list), GFP_ATOMIC);
 					if (tmp_list == NULL)
 						break;