Skip to content

Commit d32ff64

Browse files
LiBaokun96gregkh
authored andcommittedOct 17, 2024
cachefiles: fix dentry leak in cachefiles_open_file()
commit da6ef2d upstream. A dentry leak may be caused when a lookup cookie and a cull are concurrent: 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 torvalds#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 ================================================================== Whether cachefiles_open_file() returns true or false, the reference count obtained by lookup_positive_unlocked() in cachefiles_look_up_object() should be released. Therefore release that reference count in cachefiles_look_up_object() to fix the above issue and simplify the code. Fixes: 1f08c92 ("cachefiles: Implement backing file wrangling") Cc: stable@kernel.org Signed-off-by: Baokun Li <libaokun1@huawei.com> Link: https://lore.kernel.org/r/20240829083409.3788142-1-libaokun@huaweicloud.com Acked-by: David Howells <dhowells@redhat.com> Signed-off-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 01e7ba6 commit d32ff64

File tree

1 file changed

+3
-4
lines changed

1 file changed

+3
-4
lines changed
 

‎fs/cachefiles/namei.c

+3-4
Original file line numberDiff line numberDiff line change
@@ -593,14 +593,12 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
593593
* write and readdir but not lookup or open).
594594
*/
595595
touch_atime(&file->f_path);
596-
dput(dentry);
597596
return true;
598597

599598
check_failed:
600599
fscache_cookie_lookup_negative(object->cookie);
601600
cachefiles_unmark_inode_in_use(object, file);
602601
fput(file);
603-
dput(dentry);
604602
if (ret == -ESTALE)
605603
return cachefiles_create_file(object);
606604
return false;
@@ -609,7 +607,6 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
609607
fput(file);
610608
error:
611609
cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
612-
dput(dentry);
613610
return false;
614611
}
615612

@@ -652,7 +649,9 @@ bool cachefiles_look_up_object(struct cachefiles_object *object)
652649
goto new_file;
653650
}
654651

655-
if (!cachefiles_open_file(object, dentry))
652+
ret = cachefiles_open_file(object, dentry);
653+
dput(dentry);
654+
if (!ret)
656655
return false;
657656

658657
_leave(" = t [%lu]", file_inode(object->file)->i_ino);

0 commit comments

Comments
 (0)