Subject: Re: store a pointer to the block_device in struct bio (again)

From: Qian Cai <[email-masked]>
Date: Mon, 07 Dec 2020 13:56:26 -0500

On Tue, 2020-12-01 at 17:54 +0100, Christoph Hellwig wrote:
> Hi Jens,
> 
> this series switches back from storing the gendisk + partno to storing
> a block_device pointer in struct bio.  The reason is two fold:  for one
> the new struct block_device actually is always available, removing the
> need to avoid originally.  Second the merge struct block_device is much
> more useful than the old one, as storing it avoids the need for looking
> up what used to be hd_struct during partition remapping and I/O
> accounting.
> 
> Note that this series depends on the posted but not merged
> "block tracepoint cleanups" series.

Reverting this patchset on the top of today's linux-next fixed data corruptions
everywhere, i.e.,

$ git revert --no-edit a54895fa057c..4498a8536c81
(with a trivial conflict resolution with the commit "block: move
blk_rq_bio_prep() to linux/blk-mq.h")

.config (if ever matters and also happened on POWER9 NV):
https://cailca.coding.net/public/linux/mm/git/files/master/x86.config

== XFS failed to mount ==
[   55.116279][ T1507] XFS (dm-0): Mounting V5 Filesystem
[   55.144671][ T1507] XFS (dm-0): Corruption warning: Metadata has LSN (3:70242) ahead of current LSN (3:66504). Please unmount and run xfs_repair (>= v4.3) to resolve.
[   55.159965][ T1507] XFS (dm-0): log mount/recovery failed: error -22
[   55.288632][ T1507] XFS (dm-0): log mount failed

In this case, it is not possible to mount the XFS rootfs anymore, and it can be
repaired with "-L". However, we could lost vital files. Then, I have to re-
install the system.

systemd[1]: System cannot boot: Missing /etc/machine-id and /etc is mounted read-only.
systemd[1]: Booting up is supported only when:
systemd[1]: 1) /etc/machine-id exists and is populated.
systemd[1]: 2) /etc/machine-id exists and is empty.
systemd[1]: 3) /etc/machine-id is missing and /etc is writable.
lvm2-activation-generator: lvmconfig failed
systemd[1]: Failed to populate /etc with preset unit settings, ignoring: No such file or directory

== systemd core dump ==
[   46.124485][ T1028] Process 1028(systemd-coredum) has RLIMIT_CORE set to 1
[   46.131434][ T1028] Aborting core
[   46.143366][ T1027] systemd-cgroups (1027) used greatest stack depth: 23512 bytes left
[   46.384430][    T1] printk: systemd: 20 output lines suppressed due to ratelimiting
[   46.447620][    T1] traps: systemd[1] trap invalid opcode ip:7f44c485fee6 sp:7ffee96e6960 error:0 in libm-2.28.so[7f44c481a000+181000]
[   46.492643][ T1029] traps: systemd-coredum[1029] trap invalid opcode ip:7f2f60471ee6 sp:7ffd58f76e00 error:0 in libm-2.28.so[7f2f6042c000+181000]
[   46.505968][ T1029] Process 1029(systemd-coredum) has RLIMIT_CORE set to 1
[   46.512900][ T1029] Aborting core
[   46.520024][    T1] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000084
[   46.528437][    T1] CPU: 32 PID: 1 Comm: systemd Not tainted 5.10.0-rc6-next-20201207 #1
[   46.536581][    T1] Hardware name: HPE ProLiant DL385 Gen10/ProLiant DL385 Gen10, BIOS A40 07/10/2019
[   46.545860][    T1] Call Trace:
[   46.549038][    T1]  dump_stack+0x99/0xcb
[   46.553082][    T1]  panic+0x20c/0x48b
[   46.556860][    T1]  ? print_oops_end_marker.cold.10+0x10/0x10
[   46.562739][    T1]  ? do_signal_stop+0x690/0x690
[   46.567478][    T1]  ? do_exit+0x226/0x2410
[   46.571690][    T1]  do_exit.cold.38+0x1de/0x1e5
[   46.576346][    T1]  ? rcu_read_lock_sched_held+0xa1/0xd0
[   46.581782][    T1]  ? rcu_read_lock_bh_held+0xb0/0xb0
[   46.586955][    T1]  ? mm_update_next_owner+0x750/0x750
[   46.592215][    T1]  ? get_signal+0x80f/0x1f90
[   46.596688][    T1]  do_group_exit+0xf0/0x2e0
[   46.601076][    T1]  get_signal+0x35a/0x1f90
[   46.605380][    T1]  ? finish_task_switch+0x1bb/0xa80
[   46.610468][    T1]  arch_do_signal_or_restart+0x1d8/0x690
[   46.615993][    T1]  ? __setup_rt_frame.isra.15+0x1830/0x1830
[   46.621781][    T1]  ? __sched_text_start+0x8/0x8
[   46.626521][    T1]  ? asm_exc_invalid_op+0xa/0x20
[   46.631347][    T1]  exit_to_user_mode_prepare+0xde/0x170
[   46.636782][    T1]  irqentry_exit_to_user_mode+0x5/0x30
[   46.642129][    T1]  asm_exc_invalid_op+0x12/0x20
[   46.646868][    T1] RIP: 0033:0x7f44c485fee6
[   46.651171][    T1] Code: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 0a 00 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a <61> 62 63 64 65 66 67 68 6a 69 6b 6c 6d 6e 6f 70 71 72 73 74 75 76
[   46.670757][    T1] RSP: 002b:00007ffee96e6960 EFLAGS: 00010202
[   46.676719][    T1] RAX: 00007f44c481c780 RBX: 00007f44c4825e78 RCX: 0000000000000000
[   46.684600][    T1] RDX: 00007ffee96e6a90 RSI: 0000000000000000 RDI: 00007f44c481c780
[   46.692480][    T1] RBP: 00007ffee96e6a90 R08: 00007f44c85d88a8 R09: 00007f44c85d88a8
[   46.700360][    T1] R10: 00007f44ca38e4f0 R11: 00007f44c481a000 R12: 00007f44c481c780
[   46.708241][    T1] R13: 00007f44c4826088 R14: 00007f44c4b9b128 R15: 00007f44ca38e4f0
[   46.716523][    T1] Kernel Offset: 0x11000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[   46.728244][    T1] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000084 ]---

== git coredump == 
# coredumpctl dump
           PID: 1906 (git)
           UID: 0 (root)
           GID: 0 (root)
        Signal: 11 (SEGV)
     Timestamp: Mon 2020-12-07 10:10:36 EST (34s ago)
       Boot ID: 5dd9e21b02e4487f96d2ffeed3140f22
    Machine ID: 00f60cae470d4f54a377e935638619c5
       Storage: /var/lib/systemd/coredump/core.git.0.5dd9e21b02e4487f96d2ffeed3140f22.1906.1607353836000000.lz4
       Message: Process 1906 (git) of user 0 dumped core.
                
                Stack trace of thread 1906:
                #0  0x00007fff845af9dc _dl_relocate_object (/usr/lib64/ld-2.28.so)
                #1  0x00007fff845a6664 dl_main (/usr/lib64/ld-2.28.so)
                #2  0x00007fff845c0448 _dl_sysdep_start (/usr/lib64/ld-2.28.so)
                #3  0x00007fff845a1cbc _dl_start_final (/usr/lib64/ld-2.28.so)
                #4  0x00007fff845a2dbc _dl_start (/usr/lib64/ld-2.28.so)
                #5  0x00007fff845a1458 _start (/usr/lib64/ld-2.28.so)

> 
> A git tree is also available:
> 
>     git://git.infradead.org/users/hch/block.git bi_bdev
> 
> Gitweb:
> 
>     http://git.infradead.org/users/hch/block.git/shortlog/refs/heads/bi_bdev
> 
> Diffstat:
>  arch/m68k/emu/nfblock.c             |    2 
>  arch/xtensa/platforms/iss/simdisk.c |    2 
>  block/bio-integrity.c               |   18 +-
>  block/bio.c                         |   31 +---
>  block/blk-cgroup.c                  |    7 
>  block/blk-core.c                    |   99 ++++++-------
>  block/blk-crypto-fallback.c         |    2 
>  block/blk-crypto.c                  |    2 
>  block/blk-merge.c                   |   17 +-
>  block/blk-mq.c                      |    2 
>  block/blk-settings.c                |    2 
>  block/blk-throttle.c                |    2 
>  block/blk.h                         |    9 -
>  block/bounce.c                      |    2 
>  block/genhd.c                       |  261 +++-------------------------------
> --
>  block/partitions/core.c             |   31 ----
>  drivers/block/brd.c                 |    8 -
>  drivers/block/drbd/drbd_int.h       |    4 
>  drivers/block/drbd/drbd_req.c       |    2 
>  drivers/block/null_blk_main.c       |    2 
>  drivers/block/pktcdvd.c             |    4 
>  drivers/block/ps3vram.c             |    2 
>  drivers/block/rsxx/dev.c            |    2 
>  drivers/block/umem.c                |    2 
>  drivers/block/zram/zram_drv.c       |    2 
>  drivers/lightnvm/pblk-init.c        |    2 
>  drivers/md/bcache/debug.c           |    2 
>  drivers/md/bcache/request.c         |   39 +++--
>  drivers/md/dm-bio-record.h          |    9 -
>  drivers/md/dm-raid1.c               |   10 -
>  drivers/md/dm.c                     |   14 -
>  drivers/md/md-linear.c              |    2 
>  drivers/md/md.c                     |   10 -
>  drivers/md/md.h                     |    6 
>  drivers/md/raid1.c                  |    6 
>  drivers/md/raid10.c                 |   12 -
>  drivers/md/raid5.c                  |    2 
>  drivers/nvdimm/blk.c                |    4 
>  drivers/nvdimm/btt.c                |    4 
>  drivers/nvdimm/pmem.c               |    4 
>  drivers/nvme/host/core.c            |    6 
>  drivers/nvme/host/lightnvm.c        |    3 
>  drivers/nvme/host/multipath.c       |    6 
>  drivers/nvme/host/rdma.c            |    2 
>  drivers/s390/block/dasd.c           |   26 ---
>  drivers/s390/block/dcssblk.c        |    6 
>  drivers/s390/block/xpram.c          |    2 
>  fs/btrfs/check-integrity.c          |   10 -
>  fs/btrfs/raid56.c                   |    7 
>  fs/btrfs/scrub.c                    |    2 
>  fs/direct-io.c                      |    2 
>  fs/f2fs/data.c                      |   12 -
>  include/linux/bio.h                 |   18 +-
>  include/linux/blk_types.h           |    3 
>  include/linux/blkdev.h              |   20 --
>  include/linux/genhd.h               |   21 --
>  kernel/trace/blktrace.c             |   16 +-
>  mm/page_io.c                        |    2 
>  58 files changed, 251 insertions(+), 556 deletions(-)