Re: [PATCH 2/3] sysctl: add support for drop_caches for individual filesystem

From: yebin (H)
Date: Thu Oct 10 2024 - 08:45:13 EST




On 2024/10/10 20:16, Jan Kara wrote:
On Thu 10-10-24 19:25:42, Ye Bin wrote:
From: Ye Bin <yebin10@xxxxxxxxxx>

In order to better analyze the issue of file system uninstallation caused
by kernel module opening files, it is necessary to perform dentry recycling
I don't quite understand the use case you mention here. Can you explain it
a bit more (that being said I've needed dropping caches for a particular sb
myself a few times for debugging purposes so I generally agree it is a
useful feature).
Well, I'm analyzing what files are still open and the file system can't be unmounted.
The process occupied by the opened file cannot be found through the fuser. That is,
the file may be occupied by the kernel mode. You can insert a module or use kprobe
to obtain all cached files of the corresponding file system. But there can be a lot of
files, so I want to clean up irrelevant files first.
on a single file system. But now, apart from global dentry recycling, it is
not supported to do dentry recycling on a single file system separately.
This feature has usage scenarios in problem localization scenarios.At the
same time, it also provides users with a slightly fine-grained
pagecache/entry recycling mechanism.
This patch supports the recycling of pagecache/entry for individual file
systems.

Signed-off-by: Ye Bin <yebin10@xxxxxxxxxx>
---
fs/drop_caches.c | 43 +++++++++++++++++++++++++++++++++++++++++++
include/linux/mm.h | 2 ++
kernel/sysctl.c | 9 +++++++++
3 files changed, 54 insertions(+)

diff --git a/fs/drop_caches.c b/fs/drop_caches.c
index d45ef541d848..99d412cf3e52 100644
--- a/fs/drop_caches.c
+++ b/fs/drop_caches.c
@@ -77,3 +77,46 @@ int drop_caches_sysctl_handler(const struct ctl_table *table, int write,
}
return 0;
}
+
+int drop_fs_caches_sysctl_handler(const struct ctl_table *table, int write,
+ void *buffer, size_t *length, loff_t *ppos)
+{
+ unsigned int major, minor;
+ unsigned int ctl;
+ struct super_block *sb;
+ static int stfu;
+
+ if (!write)
+ return 0;
+
+ if (sscanf(buffer, "%u:%u:%u", &major, &minor, &ctl) != 3)
+ return -EINVAL;
I think specifying bdev major & minor number is not a great interface these
days. In particular for filesystems which are not bdev based such as NFS. I
think specifying path to some file/dir in the filesystem is nicer and you
can easily resolve that to sb here as well.

Honza
That's a really good idea. I think by specifying bdev "major & minor", you can reclaim
the file system pagecache that is not unmounted due to "umount -l" mode. In this
case, the sb of the corresponding file system cannot be found in the specified path.
So I think we can support both ways. I look forward to your opinion.