* [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
@ 2024-08-26 4:00 libaokun
2024-08-26 13:55 ` Markus Elfring
0 siblings, 1 reply; 8+ messages in thread
From: libaokun @ 2024-08-26 4:00 UTC (permalink / raw)
To: netfs, dhowells, jlayton
Cc: hsiangkao, jefflexu, linux-erofs, brauner, linux-fsdevel,
linux-kernel, libaokun, yangerkun, houtao1, yukuai3, wozizhi,
Baokun Li, stable
From: Baokun Li <libaokun1@huawei.com>
In ondemand mode, dentry leaks may be caused when the mount has the
following concurrency with cull:
P1 | P2
-----------------------------------------------------------
cachefiles_lookup_cookie
cachefiles_look_up_object
lookup_one_positive_unlocked
// get dentry
cachefiles_cull
inode->i_flags |= S_KERNEL_FILE;
cachefiles_open_file
cachefiles_mark_inode_in_use
__cachefiles_mark_inode_in_use
can_use = false
if (!(inode->i_flags & S_KERNEL_FILE))
can_use = true
return false
return false
// Returns an error but doesn't put dentry
After that the following WARNING will be triggered when the backend folder
is umounted:
==================================================================
BUG: Dentry 000000008ad87947{i=7a,n=Dx_1_1.img} still in use (1) [unmount of ext4 sda]
WARNING: CPU: 4 PID: 359261 at fs/dcache.c:1767 umount_check+0x5d/0x70
CPU: 4 PID: 359261 Comm: umount Not tainted 6.6.0-dirty #25
RIP: 0010:umount_check+0x5d/0x70
Call Trace:
<TASK>
d_walk+0xda/0x2b0
do_one_tree+0x20/0x40
shrink_dcache_for_umount+0x2c/0x90
generic_shutdown_super+0x20/0x160
kill_block_super+0x1a/0x40
ext4_kill_sb+0x22/0x40
deactivate_locked_super+0x35/0x80
cleanup_mnt+0x104/0x160
==================================================================
Add the missing dput() to cachefiles_open_file() for a quick fix.
Fixes: 1f08c925e7a3 ("cachefiles: Implement backing file wrangling")
Cc: stable@kernel.org
Signed-off-by: Baokun Li <libaokun1@huawei.com>
---
fs/cachefiles/namei.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index f53977169db4..0bd2f367c3ff 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c
@@ -554,6 +554,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
if (!cachefiles_mark_inode_in_use(object, d_inode(dentry))) {
pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
dentry, d_inode(dentry)->i_ino);
+ dput(dentry);
return false;
}
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-26 4:00 [PATCH] cachefiles: fix dentry leak in cachefiles_open_file() libaokun
@ 2024-08-26 13:55 ` Markus Elfring
2024-08-27 3:47 ` Baokun Li
2024-08-28 13:01 ` [PATCH] " David Howells
0 siblings, 2 replies; 8+ messages in thread
From: Markus Elfring @ 2024-08-26 13:55 UTC (permalink / raw)
To: Baokun Li, netfs, linux-fsdevel, linux-erofs, David Howells,
Jeff Layton
Cc: stable, LKML, Christian Brauner, Gao Xiang, Hou Tao, Jingbo Xu,
Yang Erkun, Yu Kuai, Zizhi Wo
…
> Add the missing dput() to cachefiles_open_file() for a quick fix.
I suggest to use a goto chain accordingly.
…
> +++ b/fs/cachefiles/namei.c
> @@ -554,6 +554,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
> if (!cachefiles_mark_inode_in_use(object, d_inode(dentry))) {
> pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
> dentry, d_inode(dentry)->i_ino);
> + dput(dentry);
> return false;
Please replace two statements by the statement “goto put_dentry;”.
…
> error:
> cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
+put_dentry:
> dput(dentry);
> return false;
> }
Regards,
Markus
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-26 13:55 ` Markus Elfring
@ 2024-08-27 3:47 ` Baokun Li
2024-08-27 8:34 ` Markus Elfring
2024-08-28 13:01 ` [PATCH] " David Howells
1 sibling, 1 reply; 8+ messages in thread
From: Baokun Li @ 2024-08-27 3:47 UTC (permalink / raw)
To: Markus Elfring
Cc: netfs, linux-fsdevel, linux-erofs, David Howells, Jeff Layton,
stable, LKML, Christian Brauner, Gao Xiang, Hou Tao, Jingbo Xu,
Yang Erkun, Yu Kuai, Zizhi Wo, Baokun Li
On 2024/8/26 21:55, Markus Elfring wrote:
> …
>> Add the missing dput() to cachefiles_open_file() for a quick fix.
> I suggest to use a goto chain accordingly.
>
>
> …
Hi Markus,
Thanks for the suggestion, but I think the current solution is simple
enough that we don't need to add a label to it.
Actually, at first I was going to release the reference count of the
dentry uniformly in cachefiles_look_up_object() and delete all dput()
in cachefiles_open_file(), but this may conflict when backporting
the code to stable. So just keep it simple to facilitate backporting
to stable.
Thanks,
Baokun
>> +++ b/fs/cachefiles/namei.c
>> @@ -554,6 +554,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
>> if (!cachefiles_mark_inode_in_use(object, d_inode(dentry))) {
>> pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
>> dentry, d_inode(dentry)->i_ino);
>> + dput(dentry);
>> return false;
> Please replace two statements by the statement “goto put_dentry;”.
>
>
> …
>> error:
>> cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
> +put_dentry:
>> dput(dentry);
>> return false;
>> }
> Regards,
> Markus
--
With Best Regards,
Baokun Li
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-27 3:47 ` Baokun Li
@ 2024-08-27 8:34 ` Markus Elfring
0 siblings, 0 replies; 8+ messages in thread
From: Markus Elfring @ 2024-08-27 8:34 UTC (permalink / raw)
To: Baokun Li, netfs, linux-fsdevel, linux-erofs, David Howells,
Jeff Layton
Cc: stable, LKML, Christian Brauner, Gao Xiang, Hou Tao, Jingbo Xu,
Yang Erkun, Yu Kuai, Zizhi Wo, Baokun Li
>> …
>>> Add the missing dput() to cachefiles_open_file() for a quick fix.
>> I suggest to use a goto chain accordingly.
…
> Thanks for the suggestion, but I think the current solution is simple enough
Yes, of course (in principle).
> that we don't need to add a label to it.
I came along other software design expectations.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst?h=v6.11-rc5#n526
Regards,
Markus
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-26 13:55 ` Markus Elfring
2024-08-27 3:47 ` Baokun Li
@ 2024-08-28 13:01 ` David Howells
2024-08-28 14:05 ` Baokun Li
2024-08-28 16:14 ` David Howells
1 sibling, 2 replies; 8+ messages in thread
From: David Howells @ 2024-08-28 13:01 UTC (permalink / raw)
To: Baokun Li
Cc: dhowells, Markus Elfring, netfs, linux-fsdevel, linux-erofs,
Jeff Layton, stable, LKML, Christian Brauner, Gao Xiang, Hou Tao,
Jingbo Xu, Yang Erkun, Yu Kuai, Zizhi Wo, Baokun Li
Baokun Li <libaokun@huaweicloud.com> wrote:
> Actually, at first I was going to release the reference count of the
> dentry uniformly in cachefiles_look_up_object() and delete all dput()
> in cachefiles_open_file(),
You couldn't do that anyway, since kernel_file_open() steals the caller's ref
if successful.
> but this may conflict when backporting the code to stable. So just keep it
> simple to facilitate backporting to stable.
Prioritise upstream, please.
I think Markus's suggestion of inserting a label and switching to a goto is
better.
Thanks,
David
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-28 13:01 ` [PATCH] " David Howells
@ 2024-08-28 14:05 ` Baokun Li
2024-08-28 16:14 ` David Howells
1 sibling, 0 replies; 8+ messages in thread
From: Baokun Li @ 2024-08-28 14:05 UTC (permalink / raw)
To: David Howells
Cc: Markus Elfring, netfs, linux-fsdevel, linux-erofs, Jeff Layton,
stable, LKML, Christian Brauner, Gao Xiang, Hou Tao, Jingbo Xu,
Yang Erkun, Yu Kuai, Zizhi Wo, Baokun Li, Baokun Li
Hello David,
Thanks for the review.
On 2024/8/28 21:01, David Howells wrote:
> Baokun Li <libaokun@huaweicloud.com> wrote:
>
>> Actually, at first I was going to release the reference count of the
>> dentry uniformly in cachefiles_look_up_object() and delete all dput()
>> in cachefiles_open_file(),
> You couldn't do that anyway, since kernel_file_open() steals the caller's ref
> if successful.
Ignoring kernel_file_open(), we now put a reference count of the dentry
whether cachefiles_open_file() returns true or false.
And cachefiles_open_file() doesn't modify the dentry, so I'm thinking it's
releasing the reference count of the dentry that was got by
lookup_positive_unlocked() in cachefiles_look_up_object().
I'm not sure how kernel_file_open() steals the reference count,
am I missing something?
The code is as follows:
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index f53977169db4..2b3f9935dbb4 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c
@@ -595,14 +595,12 @@ static bool cachefiles_open_file(struct
cachefiles_object *object,
* write and readdir but not lookup or open).
*/
touch_atime(&file->f_path);
- dput(dentry);
return true;
check_failed:
fscache_cookie_lookup_negative(object->cookie);
cachefiles_unmark_inode_in_use(object, file);
fput(file);
- dput(dentry);
if (ret == -ESTALE)
return cachefiles_create_file(object);
return false;
@@ -611,7 +609,6 @@ static bool cachefiles_open_file(struct
cachefiles_object *object,
fput(file);
error:
cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
- dput(dentry);
return false;
}
@@ -654,7 +651,9 @@ bool cachefiles_look_up_object(struct
cachefiles_object *object)
goto new_file;
}
- if (!cachefiles_open_file(object, dentry))
+ ret = cachefiles_open_file(object, dentry);
+ dput(dentry);
+ if (!ret)
return false;
_leave(" = t [%lu]", file_inode(object->file)->i_ino);
Regards,
Baokun
>> but this may conflict when backporting the code to stable. So just keep it
>> simple to facilitate backporting to stable.
> Prioritise upstream, please.
>
> I think Markus's suggestion of inserting a label and switching to a goto is
> better.
>
> Thanks,
> David
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-28 13:01 ` [PATCH] " David Howells
2024-08-28 14:05 ` Baokun Li
@ 2024-08-28 16:14 ` David Howells
2024-08-29 1:43 ` Baokun Li
1 sibling, 1 reply; 8+ messages in thread
From: David Howells @ 2024-08-28 16:14 UTC (permalink / raw)
To: Baokun Li
Cc: dhowells, Markus Elfring, netfs, linux-fsdevel, linux-erofs,
Jeff Layton, stable, LKML, Christian Brauner, Gao Xiang, Hou Tao,
Jingbo Xu, Yang Erkun, Yu Kuai, Zizhi Wo, Baokun Li
Baokun Li <libaokun@huaweicloud.com> wrote:
> > You couldn't do that anyway, since kernel_file_open() steals the caller's ref
> > if successful.
> Ignoring kernel_file_open(), we now put a reference count of the dentry
> whether cachefiles_open_file() returns true or false.
Actually, I'm wrong kernel_file_open() doesn't steal a ref.
David
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] cachefiles: fix dentry leak in cachefiles_open_file()
2024-08-28 16:14 ` David Howells
@ 2024-08-29 1:43 ` Baokun Li
0 siblings, 0 replies; 8+ messages in thread
From: Baokun Li @ 2024-08-29 1:43 UTC (permalink / raw)
To: David Howells
Cc: Markus Elfring, netfs, linux-fsdevel, linux-erofs, Jeff Layton,
stable, LKML, Christian Brauner, Gao Xiang, Hou Tao, Jingbo Xu,
Yang Erkun, Yu Kuai, Zizhi Wo, Baokun Li
Hi David,
On 2024/8/29 0:14, David Howells wrote:
> Baokun Li <libaokun@huaweicloud.com> wrote:
>
>>> You couldn't do that anyway, since kernel_file_open() steals the caller's ref
>>> if successful.
>> Ignoring kernel_file_open(), we now put a reference count of the dentry
>> whether cachefiles_open_file() returns true or false.
> Actually, I'm wrong kernel_file_open() doesn't steal a ref.
>
> David
>
>
Thanks for confirming this.
I will send a new version using the new solution.
Cheers,
Baokun
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-08-29 1:43 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-26 4:00 [PATCH] cachefiles: fix dentry leak in cachefiles_open_file() libaokun
2024-08-26 13:55 ` Markus Elfring
2024-08-27 3:47 ` Baokun Li
2024-08-27 8:34 ` Markus Elfring
2024-08-28 13:01 ` [PATCH] " David Howells
2024-08-28 14:05 ` Baokun Li
2024-08-28 16:14 ` David Howells
2024-08-29 1:43 ` Baokun Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).