Guoqing Jiang
735f82e9f0
md/bitmap: avoid race window between md_bitmap_resize and bitmap_file_clear_bit
[ Upstream commit fadcbd2901a0f7c8721f3bdb69eac95c272dc8ed ]
We need to move "spin_lock_irq(&bitmap->counts.lock)" before unmap previous
storage, otherwise panic like belows could happen as follows.
[ 902.353802] sdl: detected capacity change from 1077936128 to 3221225472
[ 902.616948] general protection fault: 0000 [#1] SMP
[snip]
[ 902.618588] CPU: 12 PID: 33698 Comm: md0_raid1 Tainted: G O 4.14.144-1-pserver #4.14.144-1.1~deb10
[ 902.618870] Hardware name: Supermicro SBA-7142G-T4/BHQGE, BIOS 3.00 10/24/2012
[ 902.619120] task: ffff9ae1860fc600 task.stack: ffffb52e4c704000
[ 902.619301] RIP: 0010:bitmap_file_clear_bit+0x90/0xd0 [md_mod]
[ 902.619464] RSP: 0018:ffffb52e4c707d28 EFLAGS: 00010087
[ 902.619626] RAX: ffe8008b0d061000 RBX: ffff9ad078c87300 RCX: 0000000000000000
[ 902.619792] RDX: ffff9ad986341868 RSI: 0000000000000803 RDI: ffff9ad078c87300
[ 902.619986] RBP: ffff9ad0ed7a8000 R08: 0000000000000000 R09: 0000000000000000
[ 902.620154] R10: ffffb52e4c707ec0 R11: ffff9ad987d1ed44 R12: ffff9ad0ed7a8360
[ 902.620320] R13: 0000000000000003 R14: 0000000000060000 R15: 0000000000000800
[ 902.620487] FS: 0000000000000000(0000) GS:ffff9ad987d00000(0000) knlGS:0000000000000000
[ 902.620738] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 902.620901] CR2: 000055ff12aecec0 CR3: 0000001005207000 CR4: 00000000000406e0
[ 902.621068] Call Trace:
[ 902.621256] bitmap_daemon_work+0x2dd/0x360 [md_mod]
[ 902.621429] ? find_pers+0x70/0x70 [md_mod]
[ 902.621597] md_check_recovery+0x51/0x540 [md_mod]
[ 902.621762] raid1d+0x5c/0xeb0 [raid1]
[ 902.621939] ? try_to_del_timer_sync+0x4d/0x80
[ 902.622102] ? del_timer_sync+0x35/0x40
[ 902.622265] ? schedule_timeout+0x177/0x360
[ 902.622453] ? call_timer_fn+0x130/0x130
[ 902.622623] ? find_pers+0x70/0x70 [md_mod]
[ 902.622794] ? md_thread+0x94/0x150 [md_mod]
[ 902.622959] md_thread+0x94/0x150 [md_mod]
[ 902.623121] ? wait_woken+0x80/0x80
[ 902.623280] kthread+0x119/0x130
[ 902.623437] ? kthread_create_on_node+0x60/0x60
[ 902.623600] ret_from_fork+0x22/0x40
[ 902.624225] RIP: bitmap_file_clear_bit+0x90/0xd0 [md_mod] RSP: ffffb52e4c707d28
Because mdadm was running on another cpu to do resize, so bitmap_resize was
called to replace bitmap as below shows.
PID: 38801 TASK: ffff9ad074a90e00 CPU: 0 COMMAND: "mdadm"
[exception RIP: queued_spin_lock_slowpath+56]
[snip]
-- <NMI exception stack> --
#5 [ffffb52e60f17c58] queued_spin_lock_slowpath at ffffffff9c0b27b8
#6 [ffffb52e60f17c58] bitmap_resize at ffffffffc0399877 [md_mod]
#7 [ffffb52e60f17d30] raid1_resize at ffffffffc0285bf9 [raid1]
#8 [ffffb52e60f17d50] update_size at ffffffffc038a31a [md_mod]
#9 [ffffb52e60f17d70] md_ioctl at ffffffffc0395ca4 [md_mod]
And the procedure to keep resize bitmap safe is allocate new storage
space, then quiesce, copy bits, replace bitmap, and re-start.
However the daemon (bitmap_daemon_work) could happen even the array is
quiesced, which means when bitmap_file_clear_bit is triggered by raid1d,
then it thinks it should be fine to access store->filemap since
counts->lock is held, but resize could change the storage without the
protection of the lock.
Cc: Jack Wang <jinpu.wang@cloud.ionos.com>
Cc: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
2019-12-31 16:44:20 +01:00 |
| .. |
|
bcache
|
for-5.4/block-2019-09-16
|
2019-09-17 16:57:47 -07:00 |
|
persistent-data
|
dm btree: increase rebalance threshold in __rebalance2()
|
2019-12-21 11:04:57 +01:00 |
|
dm-bio-prison-v1.c
|
|
|
|
dm-bio-prison-v1.h
|
|
|
|
dm-bio-prison-v2.c
|
|
|
|
dm-bio-prison-v2.h
|
|
|
|
dm-bio-record.h
|
|
|
|
dm-bufio.c
|
dm bufio: introduce a global cache replacement
|
2019-09-13 17:00:21 -04:00 |
|
dm-builtin.c
|
|
|
|
dm-cache-background-tracker.c
|
|
|
|
dm-cache-background-tracker.h
|
|
|
|
dm-cache-block-types.h
|
|
|
|
dm-cache-metadata.c
|
dm cache metadata: Fix loading discard bitset
|
2019-04-18 16:18:25 -04:00 |
|
dm-cache-metadata.h
|
|
|
|
dm-cache-policy-internal.h
|
|
|
|
dm-cache-policy-smq.c
|
|
|
|
dm-cache-policy.c
|
|
|
|
dm-cache-policy.h
|
|
|
|
dm-cache-target.c
|
dm cache: fix bugs when a GFP_NOWAIT allocation fails
|
2019-10-17 11:13:50 -04:00 |
|
dm-clone-metadata.c
|
dm clone metadata: Use a two phase commit
|
2019-12-21 11:05:00 +01:00 |
|
dm-clone-metadata.h
|
dm clone metadata: Use a two phase commit
|
2019-12-21 11:05:00 +01:00 |
|
dm-clone-target.c
|
dm clone: Flush destination device before committing metadata
|
2019-12-21 11:05:01 +01:00 |
|
dm-core.h
|
dm: disable DISCARD if the underlying storage no longer supports it
|
2019-04-04 15:33:59 -04:00 |
|
dm-crypt.c
|
Revert "dm crypt: use WQ_HIGHPRI for the IO and crypt workqueues"
|
2019-11-29 10:09:44 +01:00 |
|
dm-delay.c
|
dm delay: fix a crash when invalid device is specified
|
2019-04-26 11:29:32 -04:00 |
|
dm-dust.c
|
dm dust: use dust block size for badblocklist index
|
2019-08-21 11:27:17 -04:00 |
|
dm-era-target.c
|
treewide: Add SPDX license identifier for more missed files
|
2019-05-21 10:50:45 +02:00 |
|
dm-exception-store.c
|
|
|
|
dm-exception-store.h
|
- Improve DM snapshot target's scalability by using finer grained
|
2019-05-16 15:55:48 -07:00 |
|
dm-flakey.c
|
block: Kill gfp_t argument of blkdev_report_zones()
|
2019-07-11 20:04:37 -06:00 |
|
dm-init.c
|
docs: device-mapper: move it to the admin-guide
|
2019-07-15 11:03:01 -03:00 |
|
dm-integrity.c
|
block: centralize PI remapping logic to the block layer
|
2019-09-17 20:03:49 -06:00 |
|
dm-io.c
|
|
|
|
dm-ioctl.c
|
dm: introduce DM_GET_TARGET_VERSION
|
2019-09-16 10:18:01 -04:00 |
|
dm-kcopyd.c
|
dm kcopyd: always complete failed jobs
|
2019-08-15 15:57:39 -04:00 |
|
dm-linear.c
|
block: Kill gfp_t argument of blkdev_report_zones()
|
2019-07-11 20:04:37 -06:00 |
|
dm-log-userspace-base.c
|
|
|
|
dm-log-userspace-transfer.c
|
|
|
|
dm-log-userspace-transfer.h
|
|
|
|
dm-log-writes.c
|
dm log writes: fix incorrect comment about the logged sequence example
|
2019-07-09 14:13:33 -04:00 |
|
dm-log.c
|
|
|
|
dm-mpath.c
|
dm mpath: remove harmful bio-based optimization
|
2019-12-21 11:04:56 +01:00 |
|
dm-mpath.h
|
|
|
|
dm-path-selector.c
|
|
|
|
dm-path-selector.h
|
|
|
|
dm-queue-length.c
|
|
|
|
dm-raid.c
|
dm raid: fix updating of max_discard_sectors limit
|
2019-09-11 16:18:23 -04:00 |
|
dm-raid1.c
|
dm raid1: use struct_size() with kzalloc()
|
2019-08-26 11:05:32 -04:00 |
|
dm-region-hash.c
|
|
|
|
dm-round-robin.c
|
|
|
|
dm-rq.c
|
block: Delay default elevator initialization
|
2019-09-05 19:52:34 -06:00 |
|
dm-rq.h
|
dm: remove unused _rq_tio_cache and _rq_cache
|
2019-03-05 14:48:50 -05:00 |
|
dm-service-time.c
|
|
|
|
dm-snap-persistent.c
|
|
|
|
dm-snap-transient.c
|
|
|
|
dm-snap.c
|
dm snapshot: rework COW throttling to fix deadlock
|
2019-10-10 09:46:05 -04:00 |
|
dm-stats.c
|
dm stats: use struct_size() helper
|
2019-09-04 09:39:22 -04:00 |
|
dm-stats.h
|
|
|
|
dm-stripe.c
|
|
|
|
dm-switch.c
|
dm switch: use struct_size() in kzalloc()
|
2019-03-05 14:48:51 -05:00 |
|
dm-sysfs.c
|
|
|
|
dm-table.c
|
dm: make dm_table_find_target return NULL
|
2019-08-23 10:13:12 -04:00 |
|
dm-target.c
|
dm mpath: fix missing call of path selector type->end_io
|
2019-04-25 15:38:52 -04:00 |
|
dm-thin-metadata.c
|
dm thin metadata: Add support for a pre-commit callback
|
2019-12-21 11:05:01 +01:00 |
|
dm-thin-metadata.h
|
dm thin metadata: Add support for a pre-commit callback
|
2019-12-21 11:05:01 +01:00 |
|
dm-thin.c
|
dm thin: Flush data device before committing metadata
|
2019-12-21 11:05:03 +01:00 |
|
dm-uevent.c
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156
|
2019-05-30 11:26:35 -07:00 |
|
dm-uevent.h
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156
|
2019-05-30 11:26:35 -07:00 |
|
dm-unstripe.c
|
dm: Check for device sector overflow if CONFIG_LBDAF is not set
|
2018-12-18 09:02:26 -05:00 |
|
dm-verity-fec.c
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152
|
2019-05-30 11:26:32 -07:00 |
|
dm-verity-fec.h
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152
|
2019-05-30 11:26:32 -07:00 |
|
dm-verity-target.c
|
dm verity: add root hash pkcs#7 signature verification
|
2019-08-23 10:13:14 -04:00 |
|
dm-verity-verify-sig.c
|
dm verity: add root hash pkcs#7 signature verification
|
2019-08-23 10:13:14 -04:00 |
|
dm-verity-verify-sig.h
|
dm verity: add root hash pkcs#7 signature verification
|
2019-08-23 10:13:14 -04:00 |
|
dm-verity.h
|
dm verity: add root hash pkcs#7 signature verification
|
2019-08-23 10:13:14 -04:00 |
|
dm-writecache.c
|
dm writecache: handle REQ_FUA
|
2019-12-17 19:56:11 +01:00 |
|
dm-zero.c
|
|
|
|
dm-zoned-metadata.c
|
dm zoned: reduce overhead of backing device checks
|
2019-12-17 19:56:12 +01:00 |
|
dm-zoned-reclaim.c
|
dm zoned: reduce overhead of backing device checks
|
2019-12-17 19:56:12 +01:00 |
|
dm-zoned-target.c
|
dm zoned: reduce overhead of backing device checks
|
2019-12-17 19:56:12 +01:00 |
|
dm-zoned.h
|
dm zoned: reduce overhead of backing device checks
|
2019-12-17 19:56:12 +01:00 |
|
dm.c
|
dm: make dm_table_find_target return NULL
|
2019-08-23 10:13:12 -04:00 |
|
dm.h
|
dm: make dm_table_find_target return NULL
|
2019-08-23 10:13:12 -04:00 |
|
Kconfig
|
dm: add clone target
|
2019-09-12 09:32:31 -04:00 |
|
Makefile
|
dm: add clone target
|
2019-09-12 09:32:31 -04:00 |
|
md-bitmap.c
|
md/bitmap: avoid race window between md_bitmap_resize and bitmap_file_clear_bit
|
2019-12-31 16:44:20 +01:00 |
|
md-bitmap.h
|
|
|
|
md-cluster.c
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 45
|
2019-05-24 17:27:12 +02:00 |
|
md-cluster.h
|
|
|
|
md-faulty.c
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 47
|
2019-05-24 17:27:13 +02:00 |
|
md-linear.c
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
md-linear.h
|
|
|
|
md-multipath.c
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
md-multipath.h
|
|
|
|
md.c
|
md: no longer compare spare disk superblock events in super_load
|
2019-12-31 16:44:19 +01:00 |
|
md.h
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
raid0.c
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
raid0.h
|
md/raid0: avoid RAID0 data corruption due to layout confusion.
|
2019-09-13 13:10:05 -07:00 |
|
raid1-10.c
|
md: raid1-10: Unify r{1,10}bio_pool_free
|
2019-06-15 01:37:35 -06:00 |
|
raid1.c
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
raid1.h
|
|
|
|
raid5-cache.c
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 288
|
2019-06-05 17:36:37 +02:00 |
|
raid5-log.h
|
raid5: set write hint for PPL
|
2019-03-12 10:15:18 -07:00 |
|
raid5-ppl.c
|
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 288
|
2019-06-05 17:36:37 +02:00 |
|
raid5.c
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
raid5.h
|
raid5: use bio_end_sector in r5_next_bio
|
2019-09-13 13:14:43 -07:00 |
|
raid10.c
|
md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
|
2019-12-17 19:56:14 +01:00 |
|
raid10.h
|
|
|