提交 0c64368e 编写于 作者: Z zhangyi (F) 提交者: Zheng Zengkai

block_dump: remove block_dump feature in mark_inode_dirty()

mainline inclusion
from mainline-v5.14
commit 12e06137
category: bugfix
bugzilla: 172159 https://gitee.com/openeuler/kernel/issues/I4CZ4C
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=12e0613715e1cf305fffafaf0e89d810d9a85cc0

-----------------------------------------------

block_dump is an old debugging interface, one of it's functions is used
to print the information about who write which file on disk. If we
enable block_dump through /proc/sys/vm/block_dump and turn on debug log
level, we can gather information about write process name, target file
name and disk from kernel message. This feature is realized in
block_dump___mark_inode_dirty(), it print above information into kernel
message directly when marking inode dirty, so it is noisy and can easily
trigger log storm. At the same time, get the dentry refcount is also not
safe, we found it will lead to deadlock on ext4 file system with
data=journal mode.

After tracepoints has been introduced into the kernel, we got a
tracepoint in __mark_inode_dirty(), which is a better replacement of
block_dump___mark_inode_dirty(). The only downside is that it only trace
the inode number and not a file name, but it probably doesn't matter
because the original printed file name in block_dump is not accurate in
some cases, and we can still find it through the inode number and device
id. So this patch delete the dirting inode part of block_dump feature.
Signed-off-by: Nzhangyi (F) <yi.zhang@huawei.com>
Reviewed-by: NJan Kara <jack@suse.cz>
Reviewed-by: NChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210313030146.2882027-2-yi.zhang@huawei.comSigned-off-by: NJens Axboe <axboe@kernel.dk>

conflicts:
fs/fs-writeback.c
Signed-off-by: NYe Bin <yebin10@huawei.com>
Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 08c7b29d
...@@ -2196,28 +2196,6 @@ int dirtytime_interval_handler(struct ctl_table *table, int write, ...@@ -2196,28 +2196,6 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
return ret; return ret;
} }
static noinline void block_dump___mark_inode_dirty(struct inode *inode)
{
if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) {
struct dentry *dentry;
const char *name = "?";
dentry = d_find_alias(inode);
if (dentry) {
spin_lock(&dentry->d_lock);
name = (const char *) dentry->d_name.name;
}
printk(KERN_DEBUG
"%s(%d): dirtied inode %lu (%s) on %s\n",
current->comm, task_pid_nr(current), inode->i_ino,
name, inode->i_sb->s_id);
if (dentry) {
spin_unlock(&dentry->d_lock);
dput(dentry);
}
}
}
/** /**
* __mark_inode_dirty - internal function * __mark_inode_dirty - internal function
* *
...@@ -2277,9 +2255,6 @@ void __mark_inode_dirty(struct inode *inode, int flags) ...@@ -2277,9 +2255,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
(dirtytime && (inode->i_state & I_DIRTY_INODE))) (dirtytime && (inode->i_state & I_DIRTY_INODE)))
return; return;
if (unlikely(block_dump))
block_dump___mark_inode_dirty(inode);
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (dirtytime && (inode->i_state & I_DIRTY_INODE)) if (dirtytime && (inode->i_state & I_DIRTY_INODE))
goto out_unlock_inode; goto out_unlock_inode;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册