| From 1e4e56e618c43c2bf188a9b4e2846f62cb246884 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 13 Mar 2021 11:01:44 +0800 |
| Subject: block_dump: remove block_dump feature in mark_inode_dirty() |
| |
| From: zhangyi (F) <yi.zhang@huawei.com> |
| |
| [ Upstream commit 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: zhangyi (F) <yi.zhang@huawei.com> |
| Reviewed-by: Jan Kara <jack@suse.cz> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Link: https://lore.kernel.org/r/20210313030146.2882027-2-yi.zhang@huawei.com |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/fs-writeback.c | 25 ------------------------- |
| 1 file changed, 25 deletions(-) |
| |
| diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c |
| index 90dddb507e4a..0d0f014b09ec 100644 |
| --- a/fs/fs-writeback.c |
| +++ b/fs/fs-writeback.c |
| @@ -2196,28 +2196,6 @@ int dirtytime_interval_handler(struct ctl_table *table, int write, |
| 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 |
| * |
| @@ -2277,9 +2255,6 @@ void __mark_inode_dirty(struct inode *inode, int flags) |
| (dirtytime && (inode->i_state & I_DIRTY_INODE))) |
| return; |
| |
| - if (unlikely(block_dump)) |
| - block_dump___mark_inode_dirty(inode); |
| - |
| spin_lock(&inode->i_lock); |
| if (dirtytime && (inode->i_state & I_DIRTY_INODE)) |
| goto out_unlock_inode; |
| -- |
| 2.30.2 |
| |