From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Anand Jain <anand.jain@oracle.com>,
Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>, Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.10 47/63] btrfs: update the bdev time directly when closing
Date: Fri, 24 Sep 2021 14:44:47 +0200 [thread overview]
Message-ID: <20210924124335.891265479@linuxfoundation.org> (raw)
In-Reply-To: <20210924124334.228235870@linuxfoundation.org>
From: Josef Bacik <josef@toxicpanda.com>
[ Upstream commit 8f96a5bfa1503e0a5f3c78d51e993a1794d4aff1 ]
We update the ctime/mtime of a block device when we remove it so that
blkid knows the device changed. However we do this by re-opening the
block device and calling filp_update_time. This is more correct because
it'll call the inode->i_op->update_time if it exists, but the block dev
inodes do not do this. Instead call generic_update_time() on the
bd_inode in order to avoid the blkdev_open path and get rid of the
following lockdep splat:
======================================================
WARNING: possible circular locking dependency detected
5.14.0-rc2+ #406 Not tainted
------------------------------------------------------
losetup/11596 is trying to acquire lock:
ffff939640d2f538 ((wq_completion)loop0){+.+.}-{0:0}, at: flush_workqueue+0x67/0x5e0
but task is already holding lock:
ffff939655510c68 (&lo->lo_mutex){+.+.}-{3:3}, at: __loop_clr_fd+0x41/0x660 [loop]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #4 (&lo->lo_mutex){+.+.}-{3:3}:
__mutex_lock+0x7d/0x750
lo_open+0x28/0x60 [loop]
blkdev_get_whole+0x25/0xf0
blkdev_get_by_dev.part.0+0x168/0x3c0
blkdev_open+0xd2/0xe0
do_dentry_open+0x161/0x390
path_openat+0x3cc/0xa20
do_filp_open+0x96/0x120
do_sys_openat2+0x7b/0x130
__x64_sys_openat+0x46/0x70
do_syscall_64+0x38/0x90
entry_SYSCALL_64_after_hwframe+0x44/0xae
-> #3 (&disk->open_mutex){+.+.}-{3:3}:
__mutex_lock+0x7d/0x750
blkdev_get_by_dev.part.0+0x56/0x3c0
blkdev_open+0xd2/0xe0
do_dentry_open+0x161/0x390
path_openat+0x3cc/0xa20
do_filp_open+0x96/0x120
file_open_name+0xc7/0x170
filp_open+0x2c/0x50
btrfs_scratch_superblocks.part.0+0x10f/0x170
btrfs_rm_device.cold+0xe8/0xed
btrfs_ioctl+0x2a31/0x2e70
__x64_sys_ioctl+0x80/0xb0
do_syscall_64+0x38/0x90
entry_SYSCALL_64_after_hwframe+0x44/0xae
-> #2 (sb_writers#12){.+.+}-{0:0}:
lo_write_bvec+0xc2/0x240 [loop]
loop_process_work+0x238/0xd00 [loop]
process_one_work+0x26b/0x560
worker_thread+0x55/0x3c0
kthread+0x140/0x160
ret_from_fork+0x1f/0x30
-> #1 ((work_completion)(&lo->rootcg_work)){+.+.}-{0:0}:
process_one_work+0x245/0x560
worker_thread+0x55/0x3c0
kthread+0x140/0x160
ret_from_fork+0x1f/0x30
-> #0 ((wq_completion)loop0){+.+.}-{0:0}:
__lock_acquire+0x10ea/0x1d90
lock_acquire+0xb5/0x2b0
flush_workqueue+0x91/0x5e0
drain_workqueue+0xa0/0x110
destroy_workqueue+0x36/0x250
__loop_clr_fd+0x9a/0x660 [loop]
block_ioctl+0x3f/0x50
__x64_sys_ioctl+0x80/0xb0
do_syscall_64+0x38/0x90
entry_SYSCALL_64_after_hwframe+0x44/0xae
other info that might help us debug this:
Chain exists of:
(wq_completion)loop0 --> &disk->open_mutex --> &lo->lo_mutex
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&lo->lo_mutex);
lock(&disk->open_mutex);
lock(&lo->lo_mutex);
lock((wq_completion)loop0);
*** DEADLOCK ***
1 lock held by losetup/11596:
#0: ffff939655510c68 (&lo->lo_mutex){+.+.}-{3:3}, at: __loop_clr_fd+0x41/0x660 [loop]
stack backtrace:
CPU: 1 PID: 11596 Comm: losetup Not tainted 5.14.0-rc2+ #406
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
Call Trace:
dump_stack_lvl+0x57/0x72
check_noncircular+0xcf/0xf0
? stack_trace_save+0x3b/0x50
__lock_acquire+0x10ea/0x1d90
lock_acquire+0xb5/0x2b0
? flush_workqueue+0x67/0x5e0
? lockdep_init_map_type+0x47/0x220
flush_workqueue+0x91/0x5e0
? flush_workqueue+0x67/0x5e0
? verify_cpu+0xf0/0x100
drain_workqueue+0xa0/0x110
destroy_workqueue+0x36/0x250
__loop_clr_fd+0x9a/0x660 [loop]
? blkdev_ioctl+0x8d/0x2a0
block_ioctl+0x3f/0x50
__x64_sys_ioctl+0x80/0xb0
do_syscall_64+0x38/0x90
entry_SYSCALL_64_after_hwframe+0x44/0xae
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/btrfs/volumes.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index b4fcc48f255b..994ec44fc597 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1855,15 +1855,17 @@ out:
* Function to update ctime/mtime for a given device path.
* Mainly used for ctime/mtime based probe like libblkid.
*/
-static void update_dev_time(const char *path_name)
+static void update_dev_time(struct block_device *bdev)
{
- struct file *filp;
+ struct inode *inode = bdev->bd_inode;
+ struct timespec64 now;
- filp = filp_open(path_name, O_RDWR, 0);
- if (IS_ERR(filp))
+ /* Shouldn't happen but just in case. */
+ if (!inode)
return;
- file_update_time(filp);
- filp_close(filp, NULL);
+
+ now = current_time(inode);
+ generic_update_time(inode, &now, S_MTIME | S_CTIME);
}
static int btrfs_rm_dev_item(struct btrfs_device *device)
@@ -2038,7 +2040,7 @@ void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info,
btrfs_kobject_uevent(bdev, KOBJ_CHANGE);
/* Update ctime/mtime for device path for libblkid */
- update_dev_time(device_path);
+ update_dev_time(bdev);
}
int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
@@ -2681,7 +2683,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
btrfs_forget_devices(device_path);
/* Update ctime/mtime for blkid or udev */
- update_dev_time(device_path);
+ update_dev_time(bdev);
return ret;
--
2.33.0
next prev parent reply other threads:[~2021-09-24 13:10 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-24 12:44 [PATCH 5.10 00/63] 5.10.69-rc1 review Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 01/63] PCI: pci-bridge-emul: Add PCIe Root Capabilities Register Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 02/63] PCI: aardvark: Fix reporting CRS value Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 03/63] console: consume APC, DM, DCS Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 04/63] s390/pci_mmio: fully validate the VMA before calling follow_pte() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 05/63] ARM: Qualify enabling of swiotlb_init() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 06/63] ARM: 9077/1: PLT: Move struct plt_entries definition to header Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 07/63] ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 08/63] ARM: 9079/1: ftrace: Add MODULE_PLTS support Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 09/63] ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 10/63] [PATCH] Revert "net/mlx5: Register to devlink ingress VLAN filter trap" Greg Kroah-Hartman
2021-09-27 8:39 ` Tariq Toukan
2021-09-24 12:44 ` [PATCH 5.10 11/63] sctp: validate chunk size in __rcv_asconf_lookup Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 12/63] sctp: add param size validation for SCTP_PARAM_SET_PRIMARY Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 13/63] staging: rtl8192u: Fix bitwise vs logical operator in TranslateRxSignalStuff819xUsb() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 14/63] coredump: fix memleak in dump_vma_snapshot() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 15/63] um: virtio_uml: fix memory leak on init failures Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 16/63] dmaengine: acpi: Avoid comparison GSI with Linux vIRQ Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 17/63] perf test: Fix bpf test sample mismatch reporting Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 18/63] perf tools: Allow build-id with trailing zeros Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 19/63] thermal/drivers/exynos: Fix an error code in exynos_tmu_probe() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 20/63] 9p/trans_virtio: Remove sysfs file on probe failure Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 21/63] prctl: allow to setup brk for et_dyn executables Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 22/63] nilfs2: use refcount_dec_and_lock() to fix potential UAF Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 23/63] profiling: fix shift-out-of-bounds bugs Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 24/63] PM: sleep: core: Avoid setting power.must_resume to false Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 25/63] pwm: lpc32xx: Dont modify HW state in .probe() after the PWM chip was registered Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 26/63] pwm: mxs: " Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 27/63] dmaengine: idxd: fix wq slot allocation index check Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 28/63] platform/chrome: sensorhub: Add trace events for sample Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 29/63] platform/chrome: cros_ec_trace: Fix format warnings Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 30/63] ceph: allow ceph_put_mds_session to take NULL or ERR_PTR Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 31/63] ceph: cancel delayed work instead of flushing on mdsc teardown Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 32/63] Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 33/63] tools/bootconfig: Fix tracing_on option checking in ftrace2bconf.sh Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 34/63] thermal/core: Fix thermal_cooling_device_register() prototype Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 35/63] drm/amdgpu: Disable PCIE_DPM on Intel RKL Platform Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 36/63] drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 37/63] dma-buf: DMABUF_MOVE_NOTIFY should depend on DMA_SHARED_BUFFER Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 38/63] parisc: Move pci_dev_is_behind_card_dino to where it is used Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 39/63] iommu/amd: Relocate GAMSup check to early_enable_iommus Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 40/63] dmaengine: idxd: depends on !UML Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 41/63] dmaengine: sprd: Add missing MODULE_DEVICE_TABLE Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 42/63] dmaengine: ioat: depends on !UML Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 43/63] dmaengine: xilinx_dma: Set DMA mask for coherent APIs Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 44/63] ceph: request Fw caps before updating the mtime in ceph_write_iter Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 45/63] ceph: remove the capsnaps when removing caps Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 46/63] ceph: lockdep annotations for try_nonblocking_invalidate Greg Kroah-Hartman
2021-09-24 12:44 ` Greg Kroah-Hartman [this message]
2021-09-24 12:44 ` [PATCH 5.10 48/63] btrfs: fix lockdep warning while mounting sprout fs Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 49/63] nilfs2: fix memory leak in nilfs_sysfs_create_device_group Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 50/63] nilfs2: fix NULL pointer in nilfs_##name##_attr_release Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 51/63] nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 52/63] nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 53/63] nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 54/63] nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 55/63] habanalabs: add validity check for event ID received from F/W Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 56/63] pwm: img: Dont modify HW state in .remove() callback Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 57/63] pwm: rockchip: " Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 58/63] pwm: stm32-lp: " Greg Kroah-Hartman
2021-09-24 12:44 ` [PATCH 5.10 59/63] blk-throttle: fix UAF by deleteing timer in blk_throtl_exit() Greg Kroah-Hartman
2021-09-24 12:45 ` [PATCH 5.10 60/63] blk-mq: allow 4x BLK_MAX_REQUEST_COUNT at blk_plug for multiple_queues Greg Kroah-Hartman
2021-09-24 12:45 ` [PATCH 5.10 61/63] rtc: rx8010: select REGMAP_I2C Greg Kroah-Hartman
2021-09-24 12:45 ` [PATCH 5.10 62/63] sched/idle: Make the idle timer expire in hard interrupt context Greg Kroah-Hartman
2021-09-24 12:45 ` [PATCH 5.10 63/63] drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV Greg Kroah-Hartman
2021-09-24 14:12 ` [PATCH 5.10 00/63] 5.10.69-rc1 review Daniel Díaz
2021-09-24 22:11 ` Florian Fainelli
2021-09-25 11:48 ` Greg Kroah-Hartman
2021-09-24 17:57 ` Jon Hunter
2021-09-24 18:05 ` Fox Chen
2021-09-24 21:49 ` Pavel Machek
2021-09-24 21:52 ` Shuah Khan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210924124335.891265479@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=anand.jain@oracle.com \
--cc=dsterba@suse.com \
--cc=josef@toxicpanda.com \
--cc=linux-kernel@vger.kernel.org \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).