RHEL Engineering is moving the tracking of its product development work on RHEL 6 through RHEL 9 to Red Hat Jira (issues.redhat.com). If you're a Red Hat customer, please continue to file support cases via the Red Hat customer portal. If you're not, please head to the "RHEL project" in Red Hat Jira and file new tickets here. Individual Bugzilla bugs in the statuses "NEW", "ASSIGNED", and "POST" are being migrated throughout September 2023. Bugs of Red Hat partners with an assigned Engineering Partner Manager (EPM) are migrated in late September as per pre-agreed dates. Bugs against components "kernel", "kernel-rt", and "kpatch" are only migrated if still in "NEW" or "ASSIGNED". If you cannot log in to RH Jira, please consult article #7032570. That failing, please send an e-mail to the RH Jira admins at rh-issues@redhat.com to troubleshoot your issue as a user management inquiry. The email creates a ServiceNow ticket with Red Hat. Individual Bugzilla bugs that are migrated will be moved to status "CLOSED", resolution "MIGRATED", and set with "MigratedToJIRA" in "Keywords". The link to the successor Jira issue will be found under "Links", have a little "two-footprint" icon next to it, and direct you to the "RHEL project" in Red Hat Jira (issue links are of type "https://issues.redhat.com/browse/RHEL-XXXX", where "X" is a digit). This same link will be available in a blue banner at the top of the page informing you that that bug has been migrated.
Bug 2207969 - [regression] kernel BUG at fs/attr.c:377! RIP: 0010:notify_change+0xbd8/0xd40
Summary: [regression] kernel BUG at fs/attr.c:377! RIP: 0010:notify_change+0xbd8/0xd40
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Red Hat Enterprise Linux 9
Classification: Red Hat
Component: kernel
Version: 9.3
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: rc
: ---
Assignee: Jeff Layton
QA Contact: Zhi Li
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2023-05-17 13:15 UTC by Zhi Li
Modified: 2023-11-07 10:49 UTC (History)
8 users (show)

Fixed In Version: kernel-5.14.0-325.el9
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed: 2023-11-07 08:45:33 UTC
Type: Bug
Target Upstream Version:
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Gitlab redhat/centos-stream/src/kernel centos-stream-9 merge_requests 2632 0 None opened nfsd: make a copy of struct iattr before calling notify_change 2023-06-05 10:26:13 UTC
Red Hat Issue Tracker RHELPLAN-157510 0 None None None 2023-05-17 13:26:18 UTC
Red Hat Product Errata RHSA-2023:6583 0 None None None 2023-11-07 08:45:54 UTC

Description Zhi Li 2023-05-17 13:15:45 UTC
Description of problem:

The following panic was triggered when running NFS luster-racer test on rhel9.3 debug kernel.

[  524.315212] ------------[ cut here ]------------ 
[  524.315220] kernel BUG at fs/attr.c:377! 
[  524.315234] invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI 
[  524.331018] CPU: 19 PID: 8733 Comm: nfsd Kdump: loaded Not tainted 5.14.0-313.el9.x86_64+debug #1 
[  524.340942] Hardware name: IBM System x3650 M4 -[7915ON3]-/00J6520, BIOS -[VVE172BUS-3.30]- 06/23/2020 
[  524.351349] RIP: 0010:notify_change+0xbd8/0xd40 
[  524.356428] Code: f5 ff ff 48 89 df e8 c7 a0 eb ff e9 6b f6 ff ff 89 45 a0 e8 1a a1 eb ff 8b 45 a0 e9 91 f6 ff ff e8 6d a1 eb ff e9 47 f8 ff ff <0f> 0b e8 b1 a0 eb ff e9 9f f7 ff ff 48 89 4d c0 e8 b3 a0 eb ff 48 
[  524.377402] RSP: 0018:ffffc90008ecfad0 EFLAGS: 00010202 
[  524.383254] RAX: dffffc0000000000 RBX: ffff88810ac14e28 RCX: 0000000000000000 
[  524.391232] RDX: 1ffff11122ae7835 RSI: 0000000000000001 RDI: ffff88891573c1a8 
[  524.399213] RBP: ffffc90008ecfb40 R08: 000000006464b630 R09: 000000001e46aa78 
[  524.407195] R10: fffffbfff2db322c R11: 0000000000000001 R12: 0000000000001847 
[  524.415178] R13: ffff8888a37f56f8 R14: ffff88891573c180 R15: 0000000000000000 
[  524.423161] FS:  0000000000000000(0000) GS:ffff888fddc00000(0000) knlGS:0000000000000000 
[  524.432211] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
[  524.438640] CR2: 00007f4defbe4028 CR3: 00000002044f0005 CR4: 00000000000606e0 
[  524.446621] Call Trace: 
[  524.449360]  <TASK> 
[  524.451710]  ? cpuusage_write+0x380/0x380 
[  524.456215]  ? nfsd_setattr+0x4c4/0xbc0 [nfsd] 
[  524.461300]  nfsd_setattr+0x4c4/0xbc0 [nfsd] 
[  524.466186]  ? nfsd_access+0x340/0x340 [nfsd] 
[  524.471155]  ? find_held_lock+0x33/0x120 
[  524.475550]  ? __lock_release+0x4c1/0xa00 
[  524.480042]  ? lock_downgrade+0x130/0x130 
[  524.484525]  ? mark_held_locks+0xa5/0xf0 
[  524.488927]  nfsd3_proc_setattr+0x272/0x390 [nfsd] 
[  524.494391]  ? nfsd3_proc_access+0x2f0/0x2f0 [nfsd] 
[  524.499951]  ? do_raw_spin_unlock+0x55/0x1f0 
[  524.504738]  ? nfsd_cache_lookup+0xc1b/0x15f0 [nfsd] 
[  524.510401]  ? svcxdr_decode_sattr3+0x50d/0xab0 [nfsd] 
[  524.516250]  ? svcxdr_decode_nfs_fh3+0xfa/0x140 [nfsd] 
[  524.522111]  nfsd_dispatch+0x149/0x7f0 [nfsd] 
[  524.527092]  svc_process_common+0xbec/0x1c80 [sunrpc] 
[  524.532889]  ? svc_generic_rpcbind_set+0x510/0x510 [sunrpc] 
[  524.539253]  ? ktime_get+0x14e/0x180 
[  524.543260]  ? nfsd_svc+0x4c0/0x4c0 [nfsd] 
[  524.547950]  ? lockdep_hardirqs_on+0x79/0x100 
[  524.552830]  ? recalibrate_cpu_khz+0x10/0x10 
[  524.557617]  svc_process+0x57e/0x870 [sunrpc] 
[  524.562627]  ? __validate_process_creds+0xf5/0x310 
[  524.567993]  nfsd+0x2fe/0x5b0 [nfsd] 
[  524.572105]  ? nfsd_shutdown_threads+0x2a0/0x2a0 [nfsd] 
[  524.578050]  kthread+0x2a7/0x350 
[  524.581667]  ? kthread_complete_and_exit+0x20/0x20 
[  524.587020]  ret_from_fork+0x22/0x30 
[  524.591040]  </TASK> 
[  524.593485] Modules linked in: nfsv3 ext4 mbcache jbd2 loop rpcrdma rdma_cm iw_cm ib_cm ib_core nfsd nfs_acl rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache netfs rfkill sunrpc intel_rapl_msr intel_rapl_common sb_edac x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass rapl iTCO_wdt iTCO_vendor_support intel_cstate mgag200 ipmi_ssif drm_shmem_helper cdc_ether drm_kms_helper usbnet syscopyarea sysfillrect intel_uncore mii sysimgblt fb_sys_fops ipmi_si pcspkr ipmi_devintf lpc_ich ipmi_msghandler ioatdma drm fuse xfs libcrc32c sd_mod t10_pi sg wmi crct10dif_pclmul crc32_pclmul crc32c_intel ghash_clmulni_intel igb megaraid_sas i2c_algo_bit dca dm_mirror dm_region_hash dm_log dm_mod 
[  524.665311] ---[ end trace 6662ebcbed98b4e5 ]--- 


Version-Release number of selected component (if applicable):
kernel-5.14.0-313.el9+debug

How reproducible:
reliable

Steps to Reproduce:
1.clone https://beaker.engineering.redhat.com/jobs/7857408
2.
3.

Actual results:
kernel BUG at fs/attr.c:377!

Expected results:
No panic


Additional info:
I could have already hit this on -312.el9 and not trigger this on -311.el9. So it's likely a regression introduced in kernel-5.14.0-312.el9. Please help to confirm.

Beaker jobs:
test on kernel-5.14.0-312.el9:  panic
https://beaker.engineering.redhat.com/jobs/7857257
https://beaker.engineering.redhat.com/jobs/7857259

test on kernel-5.14.0-311.el9:
https://beaker.engineering.redhat.com/jobs/7857265
https://beaker.engineering.redhat.com/jobs/7857264

Comment 1 Jeff Layton 2023-05-17 13:44:42 UTC
This is the BUG that tripped:

        /*                                                                                          
         * We now pass ATTR_KILL_S*ID to the lower level setattr function so                        
         * that the function has the ability to reinterpret a mode change                           
         * that's due to these bits. This adds an implicit restriction that                         
         * no function will ever call notify_change with both ATTR_MODE and                         
         * ATTR_KILL_S*ID set.                                                                      
         */                                                                                         
        if ((ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) &&                                         
            (ia_valid & ATTR_MODE))                                                                 
                BUG();    

I suspect this means that nfsd_sanitize_attrs is being called too early. I think we need to do that closer to the end, after everything else has had a change to set up the ia_valid. Why this started happening with the latest MR though, I'm not sure. I'll have to do so me before and after comparison.

Stay tuned...

Comment 2 Jeff Layton 2023-05-17 14:48:37 UTC
Have you seen this happen more than once? Did you happen to collect a vmcore?

I'm asking because I don't see a way that we could legitimately get into this situation given the current NFSv3 setattr code in nfsd.
Also, when I look at the test log, there is a KASAN warning just after this BUG() was called. It may be fallout from the BUG() call itself, but it makes me wonder if we got into a situation where this was affected by some sort of memory corruption.

Comment 3 Jeff Layton 2023-05-17 14:56:15 UTC
Nevermind! I think I see what probably happened.

It turns out that notify_change can alter the ia_valid field. Now that we can end up retrying that call due to a delegation, we need to account for that. I'll need to run this by the maintainer upstream to see what he wants to do. Stay tuned!

Comment 4 Chuck Lever 2023-05-17 15:25:43 UTC
notify_change() has modified the passed-in attributes since before the git era. That seems like a brittle API. It would be nicer if that parameter was const. Maybe we can propose that to the VFS maintainers.

Barring acceptance of that idea, I guess __nfsd_setattr has to save a copy of size_attr, and restore that copy if it has to retry.

Comment 5 Chuck Lever 2023-05-17 15:27:07 UTC
Err. OK, it is not __nfsd_setattr() that would save it, it would be nfsd_setattr().

Comment 6 Jeff Layton 2023-05-17 15:44:55 UTC
(In reply to Chuck Lever from comment #5)
> Err. OK, it is not __nfsd_setattr() that would save it, it would be
> nfsd_setattr().

I took a quick look at the other callers and I don't see any others that use the structure for anything after the call. We probably could make it const, but we'd likely just need to clone the iattr in notify_change itself. Several of the functions it calls rely on the alterations it makes.

For now, I think we ought to just make a copy in nfsd_setattr. It's not a super high performance codepath anyway, and it's only 80 bytes on my machine. I'm testing that now and will send it out soon (assuming it works).

Comment 23 errata-xmlrpc 2023-11-07 08:45:33 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory (Important: kernel security, bug fix, and enhancement update), and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHSA-2023:6583


Note You need to log in before you can comment on or make changes to this bug.