An error occurred fetching the project authors.
  1. 22 Sep, 2023 2 commits
  2. 14 Sep, 2023 1 commit
  3. 08 Sep, 2023 2 commits
    • Yu Kuai's avatar
      md: fix warning for holder mismatch from export_rdev() · 99892147
      Yu Kuai authored
      Commit a1d76719 ("md: use mddev->external to select holder in
      export_rdev()") fix the problem that 'claim_rdev' is used for
      blkdev_get_by_dev() while 'rdev' is used for blkdev_put().
      
      However, if mddev->external is changed from 0 to 1, then 'rdev' is used
      for blkdev_get_by_dev() while 'claim_rdev' is used for blkdev_put(). And
      this problem can be reporduced reliably by following:
      
      New file: mdadm/tests/23rdev-lifetime
      
      devname=${dev0##*/}
      devt=`cat /sys/block/$devname/dev`
      pid=""
      runtime=2
      
      clean_up_test() {
              pill -9 $pid
              echo clear > /sys/block/md0/md/array_state
      }
      
      trap 'clean_up_test' EXIT
      
      add_by_sysfs() {
              while true; do
                      echo $devt > /sys/block/md0/md/new_dev
              done
      }
      
      remove_by_sysfs(){
              while true; do
                      echo remove > /sys/block/md0/md/dev-${devname}/state
              done
      }
      
      echo md0 > /sys/module/md_mod/parameters/new_array || die "create md0 failed"
      
      add_by_sysfs &
      pid="$pid $!"
      
      remove_by_sysfs &
      pid="$pid $!"
      
      sleep $runtime
      exit 0
      
      Test cmd:
      
      ./test --save-logs --logdir=/tmp/ --keep-going --dev=loop --tests=23rdev-lifetime
      
      Test result:
      
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 960 at block/bdev.c:618 blkdev_put+0x27c/0x330
      Modules linked in: multipath md_mod loop
      CPU: 0 PID: 960 Comm: test Not tainted 6.5.0-rc2-00121-g01e55c376936-dirty #50
      RIP: 0010:blkdev_put+0x27c/0x330
      Call Trace:
       <TASK>
       export_rdev.isra.23+0x50/0xa0 [md_mod]
       mddev_unlock+0x19d/0x300 [md_mod]
       rdev_attr_store+0xec/0x190 [md_mod]
       sysfs_kf_write+0x52/0x70
       kernfs_fop_write_iter+0x19a/0x2a0
       vfs_write+0x3b5/0x770
       ksys_write+0x74/0x150
       __x64_sys_write+0x22/0x30
       do_syscall_64+0x40/0x90
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Fix the problem by recording if 'rdev' is used as holder.
      
      Fixes: a1d76719 ("md: use mddev->external to select holder in export_rdev()")
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Signed-off-by: default avatarSong Liu <song@kernel.org>
      Link: https://lore.kernel.org/r/20230825025532.1523008-3-yukuai1@huaweicloud.com
      99892147
    • Yu Kuai's avatar
      md: don't dereference mddev after export_rdev() · 7deac114
      Yu Kuai authored
      Except for initial reference, mddev->kobject is referenced by
      rdev->kobject, and if the last rdev is freed, there is no guarantee that
      mddev is still valid. Hence mddev should not be used anymore after
      export_rdev().
      
      This problem can be triggered by following test for mdadm at very
      low rate:
      
      New file: mdadm/tests/23rdev-lifetime
      
      devname=${dev0##*/}
      devt=`cat /sys/block/$devname/dev`
      pid=""
      runtime=2
      
      clean_up_test() {
              pill -9 $pid
              echo clear > /sys/block/md0/md/array_state
      }
      
      trap 'clean_up_test' EXIT
      
      add_by_sysfs() {
              while true; do
                      echo $devt > /sys/block/md0/md/new_dev
              done
      }
      
      remove_by_sysfs(){
              while true; do
                      echo remove > /sys/block/md0/md/dev-${devname}/state
              done
      }
      
      echo md0 > /sys/module/md_mod/parameters/new_array || die "create md0 failed"
      
      add_by_sysfs &
      pid="$pid $!"
      
      remove_by_sysfs &
      pid="$pid $!"
      
      sleep $runtime
      exit 0
      
      Test cmd:
      
      ./test --save-logs --logdir=/tmp/ --keep-going --dev=loop --tests=23rdev-lifetime
      
      Test result:
      
      general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b6bcb: 0000 [#4] PREEMPT SMP
      CPU: 0 PID: 1292 Comm: test Tainted: G      D W          6.5.0-rc2-00121-g01e55c376936 #562
      RIP: 0010:md_wakeup_thread+0x9e/0x320 [md_mod]
      Call Trace:
       <TASK>
       mddev_unlock+0x1b6/0x310 [md_mod]
       rdev_attr_store+0xec/0x190 [md_mod]
       sysfs_kf_write+0x52/0x70
       kernfs_fop_write_iter+0x19a/0x2a0
       vfs_write+0x3b5/0x770
       ksys_write+0x74/0x150
       __x64_sys_write+0x22/0x30
       do_syscall_64+0x40/0x90
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Fix this problem by don't dereference mddev after export_rdev().
      
      Fixes: 3ce94ce5 ("md: fix duplicate filename for rdev")
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Signed-off-by: default avatarSong Liu <song@kernel.org>
      Link: https://lore.kernel.org/r/20230825025532.1523008-2-yukuai1@huaweicloud.com
      7deac114
  4. 15 Aug, 2023 1 commit
  5. 27 Jul, 2023 12 commits
  6. 25 Jul, 2023 1 commit
  7. 23 Jun, 2023 2 commits
    • Yu Kuai's avatar
      md: fix 'delete_mutex' deadlock · 4934b640
      Yu Kuai authored
      Commit 3ce94ce5 ("md: fix duplicate filename for rdev") introduce a
      new lock 'delete_mutex', and trigger a new deadlock:
      
      t1: remove rdev			t2: sysfs writer
      
      rdev_attr_store			rdev_attr_store
       mddev_lock
       state_store
       md_kick_rdev_from_array
        lock delete_mutex
        list_add mddev->deleting
        unlock delete_mutex
       mddev_unlock
      				 mddev_lock
      				 ...
        lock delete_mutex
        kobject_del
        // wait for sysfs writers to be done
      				 mddev_unlock
      				 lock delete_mutex
      				 // wait for delete_mutex, deadlock
      
      'delete_mutex' is used to protect the list 'mddev->deleting', turns out
      that this list can be protected by 'reconfig_mutex' directly, and this
      lock can be removed.
      
      Fix this problem by removing the lock, and use 'reconfig_mutex' to
      protect the list. mddev_unlock() will move this list to a local list to
      be handled after 'reconfig_mutex' is dropped.
      
      Fixes: 3ce94ce5 ("md: fix duplicate filename for rdev")
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Signed-off-by: default avatarSong Liu <song@kernel.org>
      Link: https://lore.kernel.org/r/20230621142933.1395629-1-yukuai1@huaweicloud.com
      4934b640
    • Song Liu's avatar
      md: use mddev->external to select holder in export_rdev() · a1d76719
      Song Liu authored
      mdadm test "10ddf-create-fail-rebuild" triggers warnings like the following
      
      [  215.526357] ------------[ cut here ]------------
      [  215.527243] WARNING: CPU: 18 PID: 1264 at block/bdev.c:617 blkdev_put+0x269/0x350
      [  215.528334] Modules linked in:
      [  215.528806] CPU: 18 PID: 1264 Comm: mdmon Not tainted 6.4.0-rc2+ #768
      [  215.529863] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
      [  215.531464] RIP: 0010:blkdev_put+0x269/0x350
      [  215.532167] Code: ff ff 49 8d 7d 10 e8 56 bf b8 ff 4d 8b 65 10 49 8d bc
      24 58 05 00 00 e8 05 be b8 ff 41 83 ac 24 58 05 00 00 01 e9 44 ff ff ff
      <0f> 0b e9 52 fe ff ff 0f 0b e9 6b fe ff ff1
      [  215.534780] RSP: 0018:ffffc900040bfbf0 EFLAGS: 00010283
      [  215.535635] RAX: ffff888174001000 RBX: ffff88810b1c3b00 RCX: ffffffff819a4061
      [  215.536645] RDX: dffffc0000000000 RSI: dffffc0000000000 RDI: ffff88810b1c3ba0
      [  215.537657] RBP: ffff88810dbde800 R08: fffffbfff0fca983 R09: fffffbfff0fca983
      [  215.538674] R10: ffffc900040bfbf0 R11: fffffbfff0fca982 R12: ffff88810b1c3b38
      [  215.539687] R13: ffff88810b1c3b10 R14: ffff88810dbdecb8 R15: ffff88810b1c3b00
      [  215.540833] FS:  00007f2aabdff700(0000) GS:ffff888dfb400000(0000) knlGS:0000000000000000
      [  215.541961] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  215.542775] CR2: 00007fa19a85d934 CR3: 000000010c076006 CR4: 0000000000370ee0
      [  215.543814] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  215.544840] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [  215.545885] Call Trace:
      [  215.546257]  <TASK>
      [  215.546608]  export_rdev.isra.63+0x71/0xe0
      [  215.547338]  mddev_unlock+0x1b1/0x2d0
      [  215.547898]  array_state_store+0x28d/0x450
      [  215.548519]  md_attr_store+0xd7/0x150
      [  215.549059]  ? __pfx_sysfs_kf_write+0x10/0x10
      [  215.549702]  kernfs_fop_write_iter+0x1b9/0x260
      [  215.550351]  vfs_write+0x491/0x760
      [  215.550863]  ? __pfx_vfs_write+0x10/0x10
      [  215.551445]  ? __fget_files+0x156/0x230
      [  215.552053]  ksys_write+0xc0/0x160
      [  215.552570]  ? __pfx_ksys_write+0x10/0x10
      [  215.553141]  ? ktime_get_coarse_real_ts64+0xec/0x100
      [  215.553878]  do_syscall_64+0x3a/0x90
      [  215.554403]  entry_SYSCALL_64_after_hwframe+0x72/0xdc
      [  215.555125] RIP: 0033:0x7f2aade11847
      [  215.555696] Code: c3 66 90 41 54 49 89 d4 55 48 89 f5 53 89 fb 48 83 ec
      10 e8 1b fd ff ff 4c 89 e2 48 89 ee 89 df 41 89 c0 b8 01 00 00 00 0f 05
      <48> 3d 00 f0 ff ff 77 35 44 89 c7 48 89 448
      [  215.558398] RSP: 002b:00007f2aabdfeba0 EFLAGS: 00000293 ORIG_RAX: 0000000000000001
      [  215.559516] RAX: ffffffffffffffda RBX: 0000000000000010 RCX: 00007f2aade11847
      [  215.560515] RDX: 0000000000000005 RSI: 0000000000438b8b RDI: 0000000000000010
      [  215.561512] RBP: 0000000000438b8b R08: 0000000000000000 R09: 00007f2aaecf0060
      [  215.562511] R10: 000000000e3ba40b R11: 0000000000000293 R12: 0000000000000005
      [  215.563647] R13: 0000000000000000 R14: 0000000000000001 R15: 0000000000c70750
      [  215.564693]  </TASK>
      [  215.565029] irq event stamp: 15979
      [  215.565584] hardirqs last  enabled at (15991): [<ffffffff811a7432>] __up_console_sem+0x52/0x60
      [  215.566806] hardirqs last disabled at (16000): [<ffffffff811a7417>] __up_console_sem+0x37/0x60
      [  215.568022] softirqs last  enabled at (15716): [<ffffffff8277a2db>] __do_softirq+0x3eb/0x531
      [  215.569239] softirqs last disabled at (15711): [<ffffffff810d8f45>] irq_exit_rcu+0x115/0x160
      [  215.570434] ---[ end trace 0000000000000000 ]---
      
      This means export_rdev() calls blkdev_put with a different holder than the
      one used by blkdev_get_by_dev(). This is because mddev->major_version == -2
      is not a good check for external metadata. Fix this by using
      mddev->external instead.
      
      Also, do not clear mddev->external in md_clean(), as the flag might be used
      later in export_rdev().
      
      Fixes: 2736e8ee ("block: use the holder as indication for exclusive opens")
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Jens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSong Liu <song@kernel.org>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Link: https://lore.kernel.org/r/20230617052405.305871-1-song@kernel.org
      a1d76719
  8. 13 Jun, 2023 11 commits
  9. 12 Jun, 2023 5 commits
  10. 05 Jun, 2023 1 commit
  11. 31 May, 2023 1 commit
  12. 14 Apr, 2023 1 commit
    • Yu Kuai's avatar
      md: fix soft lockup in status_resync · 6efddf1e
      Yu Kuai authored
      status_resync() will calculate 'curr_resync - recovery_active' to show
      user a progress bar like following:
      
      [============>........]  resync = 61.4%
      
      'curr_resync' and 'recovery_active' is updated in md_do_sync(), and
      status_resync() can read them concurrently, hence it's possible that
      'curr_resync - recovery_active' can overflow to a huge number. In this
      case status_resync() will be stuck in the loop to print a large amount
      of '=', which will end up soft lockup.
      
      Fix the problem by setting 'resync' to MD_RESYNC_ACTIVE in this case,
      this way resync in progress will be reported to user.
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Signed-off-by: default avatarSong Liu <song@kernel.org>
      Link: https://lore.kernel.org/r/20230310073855.1337560-3-yukuai1@huaweicloud.com
      6efddf1e