On 02/12/2022 05:10, Eric Biggers wrote:
On Thu, Dec 01, 2022 at 11:18:33AM -0800, Eric Biggers wrote:
On Thu, Dec 01, 2022 at 02:58:00PM +0800, xiubli@xxxxxxxxxx wrote:
From: Xiubo Li <xiubli@xxxxxxxxxx>
When close a file it will be deferred to call the fput(), which
will hold the inode's i_count. And when unmounting the mountpoint
the evict_inodes() may skip evicting some inodes.
If encrypt is enabled the kernel generate a warning when removing
the encrypt keys when the skipped inodes still hold the keyring:
This does not make sense. Unmounting is only possible once all the files on the
filesystem have been closed.
Specifically, __fput() puts the reference to the dentry (and thus the inode)
*before* it puts the reference to the mount. And an unmount cannot be done
while the mount still has references. So there should not be any issue here.
Eric,
When I unmounting I can see the following logs, which I added a debug
log in the evcit_inodes():
diff --git a/fs/inode.c b/fs/inode.c
index b608528efd3a..f6e69b778d9c 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -716,8 +716,11 @@ void evict_inodes(struct super_block *sb)
again:
spin_lock(&sb->s_inode_list_lock);
list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
- if (atomic_read(&inode->i_count))
+ if (atomic_read(&inode->i_count)) {
+ printk("evict_inodes inode %p, i_count = %d, was
skipped!\n",
+ inode, atomic_read(&inode->i_count));
continue;
+ }
spin_lock(&inode->i_lock);
if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) {
The logs:
<4>[ 95.977395] evict_inodes inode 00000000f90aab7b, i_count = 1, was
skipped!
Any reason could cause this ? Since the inode couldn't be evicted in
time and then when removing the master keys it will print this warning.
Thanks
- Xiubo
- Eric