RE: warning on flushing page cache on block device removal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,


> From: Jan Kara <jack@xxxxxxx>
> Sent: Monday, May 26, 2025 10:09 PM
> 
> Hello!
> 
> On Sat 24-05-25 05:56:55, Parav Pandit wrote:
> > I am running a basic test of block device driver unbind, bind while
> > the fio is running random write IOs with direct=0.  The test hits the
> > WARN_ON assert on:
> >
> > void pagecache_isize_extended(struct inode *inode, loff_t from, loff_t
> > to) {
> >         int bsize = i_blocksize(inode);
> >         loff_t rounded_from;
> >         struct folio *folio;
> >
> >         WARN_ON(to > inode->i_size);
> >
> > This is because when the block device is removed during driver unbind,
> > the driver flow is,
> >
> > del_gendisk()
> >     __blk_mark_disk_dead()
> >             set_capacity((disk, 0);
> >                 bdev_set_nr_sectors()
> >                     i_size_write() -> This will set the inode's isize to 0, while the
> page cache is yet to be flushed.
> >
> > Below is the kernel call trace.
> >
> > Can someone help to identify, where should be the fix?
> > Should block layer to not set the capacity to 0?
> > Or page catch to overcome this dynamic changing of the size?
> > Or?
> 
> After thinking about this the proper fix would be for i_size_write() to happen
> under i_rwsem because the change in the middle of the write is what's
> confusing the iomap code. I smell some deadlock potential here but it's
> perhaps worth trying :)
>
Without it, I gave a quick try with inode_lock() unlock() in i_size_write() and initramfs level it was stuck.
I am yet to try with LOCKDEP.

I was thinking, can the existing sequence lock be used for 64-bit case as well? 
 
> 								Honza
> 
> 
> > WARNING: CPU: 58 PID: 9712 at mm/truncate.c:819
> > pagecache_isize_extended+0x186/0x2b0
> > Modules linked in: virtio_blk xt_CHECKSUM xt_MASQUERADE xt_conntrack
> > ipt_REJECT nf_reject_ipv4 xt_set ip_set xt_tcpudp xt_addrtype
> > nft_compat xfrm_user xfrm_algo nft_chain_nat nf_nat nf_conntrack
> > nf_defrag_ipv6 nf_defrag_ipv4 nf_tables nfnetlink nfsv3
> > rpcsec_gss_krb5 nfsv4 nfs netfs nvme_fabrics nvme_core cuse overlay
> > bridge stp llc binfmt_misc intel_rapl_msr intel_rapl_common
> > intel_uncore_frequency intel_uncore_frequency_common skx_edac
> > skx_edac_common nfit x86_pkg_temp_thermal intel_powerclamp
> coretemp
> > kvm_intel ipmi_ssif kvm dell_pc dell_smbios platform_profile dcdbas
> > rapl intel_cstate dell_wmi_descriptor wmi_bmof mei_me mei
> > intel_pch_thermal ipmi_si acpi_power_meter acpi_ipmi nfsd sch_fq_codel
> > auth_rpcgss nfs_acl ipmi_devintf ipmi_msghandler lockd grace
> > dm_multipath msr scsi_dh_rdac scsi_dh_emc scsi_dh_alua parport_pc
> > sunrpc ppdev lp parport efi_pstore ip_tables x_tables autofs4 raid10
> > raid456 async_raid6_recov async_memcpy async_pq async_xor xor
> async_tx
> > raid6_pq raid1 raid0 linear mlx5_core mgag200  i2c_algo_bit
> > drm_client_lib drm_shmem_helper drm_kms_helper mlxfw
> > ghash_clmulni_intel psample sha512_ssse3 drm sha256_ssse3 i2c_i801 tls
> > sha1_ssse3 ahci i2c_mux megaraid_sas tg3 pci_hyperv_intf i2c_smbus
> > lpc_ich libahci wmi aesni_intel crypto_simd cryptd
> > CPU: 58 UID: 0 PID: 9712 Comm: fio Not tainted 6.15.0-rc7-vblk+ #21
> > PREEMPT(voluntary) Hardware name: Dell Inc. PowerEdge R740/0DY2X0,
> > BIOS 2.11.2 004/21/2021
> > RIP: 0010:pagecache_isize_extended+0x186/0x2b0
> > Code: 04 00 00 00 e8 2b bc 1f 00 f0 41 ff 4c 24 34 75 08 4c 89 e7 e8
> > ab bd ff ff 48 83 c4 08 5b 41 5c 41 5d 41 5e 5d c3 cc cc cc cc <0f> 0b
> > e9 04 ff ff ff 48 b8 00 00 00 00 00 fc ff df 49 8d 7c 24 20
> > RSP: 0018:ffff88819a16f428 EFLAGS: 00010287
> > RAX: dffffc0000000000 RBX: ffff88908380c738 RCX: 000000000000000c
> > RDX: 1ffff112107018f1 RSI: 000000002e47f000 RDI: ffff88908380c788
> > RBP: ffff88819a16f450 R08: 0000000000000001 R09: fffff94008933c86
> > R10: 000000002e47f000 R11: 0000000000000000 R12: 0000000000001000
> > R13: 0000000033956000 R14: 000000002e47f000 R15: ffff88819a16f690
> > FS:  00007f1be37fe640(0000) GS:ffff889069680000(0000)
> > knlGS:0000000000000000
> > CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > CR2: 00007f1c05205018 CR3: 000000115d00d001 CR4: 00000000007726f0
> > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> > PKRU: 55555554
> > Call Trace:
> >  <TASK>
> >  iomap_file_buffered_write+0x763/0xa90
> >  ? aa_file_perm+0x37e/0xd40
> >  ? __pfx_iomap_file_buffered_write+0x10/0x10
> >  ? __kasan_check_read+0x15/0x20
> >  ? __pfx_down_read+0x10/0x10
> >  ? __kasan_check_read+0x15/0x20
> >  ? inode_needs_update_time.part.0+0x15c/0x1e0
> >  blkdev_write_iter+0x628/0xc90
> >  aio_write+0x2f9/0x6e0
> >  ? io_submit_one+0xc98/0x1c20
> >  ? __pfx_aio_write+0x10/0x10
> >  ? kasan_save_stack+0x40/0x60
> >  ? kasan_save_stack+0x2c/0x60
> >  ? kasan_save_track+0x18/0x40
> >  ? kasan_save_free_info+0x3f/0x60
> >  ? kasan_save_track+0x18/0x40
> >  ? kasan_save_alloc_info+0x3c/0x50
> >  ? __kasan_slab_alloc+0x91/0xa0
> >  ? fget+0x17c/0x250
> >  io_submit_one+0xb9c/0x1c20
> >  ? io_submit_one+0xb9c/0x1c20
> >  ? __pfx_aio_write+0x10/0x10
> >  ? __pfx_io_submit_one+0x10/0x10
> >  ? __kasan_check_write+0x18/0x20
> >  ? _raw_spin_lock_irqsave+0x96/0xf0
> >  ? __kasan_check_write+0x18/0x20
> >  __x64_sys_io_submit+0x14e/0x390
> >  ? __pfx___x64_sys_io_submit+0x10/0x10
> >  ? aio_read_events+0x489/0x800
> >  ? read_events+0xc1/0x2f0
> >  x64_sys_call+0x20ad/0x2150
> >  do_syscall_64+0x6f/0x120
> >  ? __pfx_read_events+0x10/0x10
> >  ? __x64_sys_io_submit+0x1c6/0x390
> >  ? __x64_sys_io_submit+0x1c6/0x390
> >  ? __pfx___x64_sys_io_submit+0x10/0x10
> >  ? __x64_sys_io_getevents+0x14c/0x2a0
> >  ? __kasan_check_read+0x15/0x20
> >  ? do_io_getevents+0xfa/0x220
> >  ? __x64_sys_io_getevents+0x14c/0x2a0
> >  ? __pfx___x64_sys_io_getevents+0x10/0x10
> >  ? fpregs_assert_state_consistent+0x25/0xb0
> >  ? __kasan_check_read+0x15/0x20
> >  ? fpregs_assert_state_consistent+0x25/0xb0
> >  ? syscall_exit_to_user_mode+0x5e/0x1d0
> >  ? do_syscall_64+0x7b/0x120
> >  ? __x64_sys_io_getevents+0x14c/0x2a0
> >  ? __pfx___x64_sys_io_getevents+0x10/0x10
> >  ? __kasan_check_read+0x15/0x20
> >  ? fpregs_assert_state_consistent+0x25/0xb0
> >  ? syscall_exit_to_user_mode+0x5e/0x1d0
> >  ? do_syscall_64+0x7b/0x120
> >  ? syscall_exit_to_user_mode+0x5e/0x1d0
> >  ? do_syscall_64+0x7b/0x120
> >  ? syscall_exit_to_user_mode+0x5e/0x1d0
> >  ? clear_bhb_loop+0x40/0x90
> >  ? clear_bhb_loop+0x40/0x90
> >  ? clear_bhb_loop+0x40/0x90
> >  ? clear_bhb_loop+0x40/0x90
> >  ? clear_bhb_loop+0x40/0x90
> >  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> > RIP: 0033:0x7f1c0431e88d
> > Code: 5b 41 5c c3 66 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 48 89 f8 48
> > 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d
> > 01 f0 ff ff 73 01 c3 48 8b 0d 73 b5 0f 00 f7 d8 64 89 01 48
> > RSP: 002b:00007f1be37f9628 EFLAGS: 00000246 ORIG_RAX:
> 00000000000000d1
> > RAX: ffffffffffffffda RBX: 00007f1be37fc7a8 RCX: 00007f1c0431e88d
> > RDX: 00007f1bd40032e8 RSI: 0000000000000001 RDI: 00007f1bfa545000
> > RBP: 00007f1bfa545000 R08: 00007f1af0512010 R09: 0000000000000718
> > R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000001
> > R13: 0000000000000000 R14: 00007f1bd40032e8 R15: 00007f1bd4000b70
> > </TASK> ---[ end trace 0000000000000000 ]---
> >
> > fio: attempt to access beyond end of device
> > vda: rw=2049, sector=0, nr_sectors = 8 limit=0 Buffer I/O error on dev
> > vda, logical block 0, lost async page write
> >
> >
> --
> Jan Kara <jack@xxxxxxxx>
> SUSE Labs, CR





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux