** Description changed:

  SRU Justification:
  
  [ Impact ]
  
  Noble 6.8.0-136 backported 340cea84f691 ("cifs: open files should not hold
  ref on superblock", v7.0) via LP: #2154496. Since then an open cifs file
  pins only its dentry, so umount(2) can complete while a read-ahead
  (cifs_readdata on cifsiod_wq), an uncached read/write (cifs_aio_ctx) or a
  writeback (cifs_writedata) still owns a cifsFileInfo.
  generic_shutdown_super() finds the inode busy, poisons i_sb with
  VFS_PTR_POISON, and the later _cifsFileInfo_put() from
  cifs_readahead_complete() faults on 0xdead0000000000f5 + 0x390. With
  panic_on_oops=1 the host panics; with panic_on_oops=0 every later umount of
  a cifs filesystem hangs forever in cifs_kill_sb(). Workloads that mount and
  unmount SMB shares while a reader is killed (containers, per-job mounts)
  can hit it.
  
  6.8.0-139 (LP: #2160250) added c68337442f03 ("cifs: Fix busy dentry used
  after unmounting"), which flushes deferredclose_wq only and covers the
  deferred-close variant (1 of our 9 production panics). The read-ahead
  variant (8 of 9) is fixed upstream by 75f5c412fa86 ("smb: client: fix busy
  dentry warning on unmount after DIO", v7.2, CVE-2026-72315), which is in no
  Noble 6.8 kernel up to 6.8.0-146 and does not apply as-is because the 6.8
  cifs read/write path predates the netfs conversion.
  
  Observed: 6.8.0-137 (9 panics / 8 hosts / 30 h on ~850 hosts; lab
  reproducer panics in 5-90 s) and 6.8.0-146 (lab, ~10 s). Not affected:
  6.8.0-111 (same workload, ~3,800 hosts, 0 in 17 days).
  
  [ Fix ]
  
  Backport of 75f5c412fa86 to the pre-netfs 6.8 code: a per-superblock
  counter (cifs_sb->outstanding_rreq, as upstream) is taken where a
  cifs_readdata / cifs_writedata / cifs_aio_ctx acquires its cifsFileInfo
  reference (including the two writeback sites that transfer an already-held
  reference) and released after the put in the three release functions.
  cifs_kill_sb() waits for the counter to reach zero, then flushes
  serverclose_wq and fileinfo_put_wq before kill_anon_super(), exactly as
  upstream. A flush-only alternative (flush cifsiod_wq, serverclose_wq,
  fileinfo_put_wq) was built and tested and still panics: the read request is
  still on the socket when umount runs, so there is nothing queued to flush.
  
  [ Test Plan ]
  
  Mount an SMB3 share, start a sequential read of a 2-3 MB file (read-ahead
  queued), SIGKILL the reader after 1-90 ms, open/close another file, umount
  immediately; repeat in 4-8 parallel workers on separate mount points
  (script attached). Stock 6.8.0-137 panics within ~90 s at 8 workers; stock
  6.8.0-146 within ~10 s. With the patch on 6.8.0-146.146: ~76,000 cycles
  against a Dell PowerScale (Isilon) share (krb5, ro) and a Samba share (ro
  and rw, buffered and O_DIRECT writers, 40-150 ms added server delay) with 0
  "Dentry still in use" warnings, 0 faults, 0 hung umounts. We can test a
  -proposed kernel within minutes.
  
  [ Where problems could occur ]
  
  The change is confined to fs/smb/client. The counter must balance at every
  cifsFileInfo acquisition and release of cifs_readdata, cifs_writedata and
  cifs_aio_ctx; an unbalanced path would make umount(2) wait forever in
  cifs_kill_sb() (an earlier revision of this port missed the two writeback
  transfer sites; code review caught it before any write test, which is why
  they are counted explicitly and the write path was tested separately). The
  wait runs only at unmount, after the VFS has detached the superblock, so no
  new I/O can start on it; steady-state I/O paths gain one atomic increment
  and decrement per request.
  
  [ Other Info ]
  
  Related but separate: 5520e89a5a4f ("smb: client: fix cifsFileInfo
  reference leak in deferred close") fixes a refcount leak with a different
  Fixes: tag; it is not part of this bug.
  
  == Evidence (details) ==
  
  Release: Ubuntu 24.04 LTS (Noble)
  
  Package: linux, tested at 6.8.0-137.137 and 6.8.0-146.146
  
  Expected: umount(2) returns and the host continues running.
  
  Actual: _cifsFileInfo_put() dereferences an inode after superblock teardown
  and faults. The host panics with panic_on_oops=1, or later CIFS unmounts hang
  with panic_on_oops=0.
  
  Affected kernels:
  
  * Tested: 6.8.0-137.137. We saw 9 production panics on 8 hosts in about
-   30 hours across about 850 nodes. The lab reproducer panics in 5–90 seconds.
+   30 hours across about 850 nodes. The lab reproducer panics in 5–90 seconds.
  * Tested: 6.8.0-146.146 (noble-proposed). The lab reproducer panics in about
-   10 seconds.
+   10 seconds.
  * Code-inferred: 6.8.0-136.136, which introduced 340cea84f691c, and
-   6.8.0-138.138, which predates c68337442f03.
+   6.8.0-138.138, which predates c68337442f03.
  * Partial fix from 6.8.0-139.139: c68337442f03 flushes deferredclose_wq only.
  * Not affected: 6.8.0-111.111. The same workload ran on about 3,800 nodes
-   for 17 days without an occurrence. This kernel predates 340cea84f691c.
+   for 17 days without an occurrence. This kernel predates 340cea84f691c.
  
  == Summary ==
  
  Noble 6.8.0-136 introduced upstream 340cea84f691c ("cifs: open files should
  not hold ref on superblock", mainline v7.0) via the upstream-stable patchset
  tracked by LP: #2154496. After this change, a cifs open file holds only a
  dentry reference. umount(2) can complete while asynchronous work still owns
  a cifsFileInfo. When that work later calls _cifsFileInfo_put(), the
  superblock is gone and the kernel faults on the VFS_PTR_POISON value written
  into the surviving inode.
  
  We observed these paths:
  
  * (a) deferredclose: smb2_deferred_work_close -> _cifsFileInfo_put.
-   Fixed by c68337442f03 in 6.8.0-139 and later.
+   Fixed by c68337442f03 in 6.8.0-139 and later.
  * (b) cifsiod: cifs_readahead_complete -> _cifsFileInfo_put.
-   Not fixed in any Noble 6.8 kernel through 6.8.0-146.
+   Not fixed in any Noble 6.8 kernel through 6.8.0-146.
  * (c) cifsoplockd: cifs_oplock_break -> _cifsFileInfo_put.
-   This secondary path appeared only after path (b) had already oopsed with
-   panic_on_oops=0. We have not demonstrated it as an independent race.
+   This secondary path appeared only after path (b) had already oopsed with
+   panic_on_oops=0. We have not demonstrated it as an independent race.
  
  In production on 6.8.0-137, path (b) caused 8 panics and path (a) caused 1.
  On 6.8.0-146 the reproducer triggers path (b), followed by path (c) when
  panic_on_oops=0. The proposed fix eliminated this complete reproduced
  sequence. We do not claim that it fixes a separate oplock race.
  
  == Impact ==
  
  With panic_on_oops=1, the whole host panics. With panic_on_oops=0, the oopsed
  kworkers do not complete and later CIFS unmounts hang in D state at:
  
-   __flush_workqueue <- cifs_kill_sb
+   __flush_workqueue <- cifs_kill_sb
  
  Workloads that mount and unmount SMB shares for each job, such as container
  workloads, exercise this path continuously.
  
  == Kernel log, variant (b) — 6.8.0-137-generic #137-Ubuntu, production
  ==
  
  [24042.343670] BUG: Dentry 000000002c909471{i=c34b9,n=<file>}  still in use 
(1) [unmount of cifs cifs]
  [24042.343678] WARNING: CPU: 28 PID: 1352709 at fs/dcache.c:1528 
umount_check+0x64/0x90
  [24042.343780] CPU: 28 PID: 1352709 Comm: umount Kdump: loaded Tainted: P     
      OE      6.8.0-137-generic #137-Ubuntu
  [24042.343783] RIP: 0010:umount_check+0x64/0x90
  [24042.343802]  d_walk+0xc0/0x2a0
  [24042.343810]  generic_shutdown_super+0x21/0x180
  [24042.343815]  cifs_kill_sb+0x5b/0x70 [cifs]
  [24042.343853]  cleanup_mnt+0xc3/0x170
  [24042.343938] WARNING: CPU: 28 PID: 1352709 at fs/super.c:649 
generic_shutdown_super+0x120/0x180
-                VFS: Busy inodes after unmount of cifs (cifs)
+                VFS: Busy inodes after unmount of cifs (cifs)
  [24043.843507] general protection fault, probably for non-canonical address 
0xdead000000000485: 0000 [#1] PREEMPT SMP NOPTI
  [24043.854484] CPU: 4 PID: 1352168 Comm: kworker/4:1 Kdump: loaded Tainted: P 
       W  OE      6.8.0-137-generic #137-Ubuntu
  [24043.875232] Workqueue: cifsiod cifs_readahead_complete [cifs]
  [24043.881106] RIP: 0010:_cifsFileInfo_put+0x77/0x4a0 [cifs]
  [24043.910734] RAX: dead0000000000f5 RBX: ffff8e6ee73a1ea8 RCX: 
000000000000000a
  [24043.983676]  cifs_readahead_complete+0x23e/0x2f0 [cifs]
  [24043.988976]  process_one_work+0x181/0x3a0
  [24043.993014]  worker_thread+0x18b/0x330
  [24044.001087]  kthread+0xef/0x120
  [24044.245052] Kernel panic - not syncing: Fatal exception
  
  == Kernel log, variant (a) — 6.8.0-137, production ==
  
  [17180.976882] BUG: Dentry 00000000e23b32d6{i=34fc,n=<file>}  still in use 
(1) [unmount of cifs cifs]
  [17180.977008] RIP: 0010:umount_check+0x64/0x90
  [17180.977052]  cifs_kill_sb+0x5b/0x70 [cifs]
  [17180.977268] VFS: Busy inodes after unmount of cifs (cifs)
  [17181.900781] Workqueue: deferredclose smb2_deferred_work_close [cifs]
  [17181.907243] RIP: 0010:_raw_spin_lock+0x13/0x60
  [17182.014078]  cifsFileInfo_put_final+0xed/0x120 [cifs]
  [17182.019221]  _cifsFileInfo_put+0x350/0x4a0 [cifs]
  [17182.028127]  smb2_deferred_work_close+0x5f/0x70 [cifs]
-                Kernel panic - not syncing: Fatal exception
+                Kernel panic - not syncing: Fatal exception
  
  == Kernel log, variants (b) and (c) ==
  
  Kernel: 6.8.0-146-generic #146-Ubuntu, lab, panic_on_oops=0
  
  [  142.574284] general protection fault, probably for non-canonical address 
0xdead000000000485: 0000 [#1] PREEMPT SMP NOPTI
  [  142.605742] Workqueue: cifsiod cifs_readahead_complete [cifs]
  [  142.611633] RIP: 0010:_cifsFileInfo_put+0x77/0x4a0 [cifs]
  [  142.857981] general protection fault, probably for non-canonical address 
0xdead000000000485: 0000 [#2] PREEMPT SMP NOPTI
  [  142.868925] Workqueue: cifsoplockd cifs_oplock_break [cifs]
  [  142.868997] RIP: 0010:cifs_oplock_break+0x43/0x620 [cifs]
  [  142.888932] RIP: 0010:_cifsFileInfo_put+0x77/0x4a0 [cifs]
  (preceded by "BUG: Dentry ... still in use (1) [unmount of cifs cifs]"
  from umount_check)
  
  Afterwards on 6.8.0-146: 8 umount processes in D state, all at
  
-   __flush_workqueue+0x14a/0x3e0
-   <- cifs_kill_sb+0x3c/0x70 [cifs]
-   <- deactivate_locked_super
-   <- cleanup_mnt
+   __flush_workqueue+0x14a/0x3e0
+   <- cifs_kill_sb+0x3c/0x70 [cifs]
+   <- deactivate_locked_super
+   <- cleanup_mnt
  
  == vmcore analysis (6.8.0-146.146, variant b) ==
  
  Analysis used crash with
  linux-image-unsigned-6.8.0-146-generic-dbgsym. The faulting instruction at
  _cifsFileInfo_put+0x77 is the inlined CIFS_SB(inode->i_sb), which reads
  sb->s_fs_info at offset 0x390. The inode is d_inode(cifs_file->dentry).
  
  Objects in the dump:
  
  * inode ffff8bb592233680:
-   i_ino=0xec6, matching the "i=ec6" umount_check line; i_nlink=1;
-   i_count=1; i_state=0; still on sb->s_inodes; and
-   i_op = i_sb = i_mapping = 0xdead0000000000f5 (VFS_PTR_POISON).
+   i_ino=0xec6, matching the "i=ec6" umount_check line; i_nlink=1;
+   i_count=1; i_state=0; still on sb->s_inodes; and
+   i_op = i_sb = i_mapping = 0xdead0000000000f5 (VFS_PTR_POISON).
  * dentry ffff8bb5861c7380:
-   "<file>"; d_lockref.count=1, held by the cifsFileInfo.
+   "<file>"; d_lockref.count=1, held by the cifsFileInfo.
  * superblock ffff8ab5ae3e9800:
-   type "cifs"; s_count=0; s_active=0; s_root=NULL.
+   type "cifs"; s_count=0; s_active=0; s_root=NULL.
  * cifsFileInfo ffff8bb551338a00:
-   allocated from kmalloc-512.
+   allocated from kmalloc-512.
  * cifs_tcon ffff8ab51c791800:
-   allocated.
+   allocated.
  
  generic_shutdown_super() writes this VFS_PTR_POISON value when
  CHECK_DATA_CORRUPTION(!list_empty(&sb->s_inodes), "VFS: Busy inodes after
  unmount") fires at fs/super.c:649-663. The read-ahead cifsFileInfo kept the
  dentry and inode alive across unmount. The superblock was torn down, and the
  completion work then dereferenced inode->i_sb.
  
  This matches the mechanism addressed by 75f5c412fa86: wait for in-flight
  requests and drain final-put work before kill_anon_super(). The
  deferredclose_wq flush from c68337442f03 does not cover cifsiod or
  cifsoplockd work. The vmcore and vmlinux are available on request.
  
  == Reproducer (lab, both 6.8.0-137 and 6.8.0-146) ==
  
  Server: Dell PowerScale (Isilon) SMB3 share, mounted read-only with
  
-   -o vers=3.0,sec=krb5,dir_mode=0755,file_mode=0755,noperm,
-      noserverino,nosharesock,cruid=0,nobrl,ro
+   -o vers=3.0,sec=krb5,dir_mode=0755,file_mode=0755,noperm,
+      noserverino,nosharesock,cruid=0,nobrl,ro
  
  mount.cifs reports:
  
-   cache=strict,soft,nounix,mapposix,rsize=1048576,wsize=1048576
+   cache=strict,soft,nounix,mapposix,rsize=1048576,wsize=1048576
  
  Loop, N parallel workers, each on its own mount point:
  
  1. Mount the share.
  2. Start a sequential read, which queues read-ahead:
  
-      dd if=<2–3 MB file on the share> of=/dev/null bs=1M &
+      dd if=<2–3 MB file on the share> of=/dev/null bs=1M &
  
  3. Sleep for 0.01–0.09 seconds, then kill the dd process while I/O is in
-    flight.
+    flight.
  4. Open and close another file to leave a deferred close pending:
  
-      head -c 65536 <another file> >/dev/null
+      head -c 65536 <another file> >/dev/null
  
  5. Immediately unmount the mount point.
  6. Repeat.
  
  Results:
  
  * 6.8.0-137, 8 workers: panic within about 90 seconds (variant b), with a
-   kdump fingerprint on the BMC.
+   kdump fingerprint on the BMC.
  * 6.8.0-137, 4 workers, panic_on_oops=0: oops (b), then (c), within about
-   5 seconds.
+   5 seconds.
  * 6.8.0-146, 4 workers for 45 seconds: 5 "Dentry ... still in use"
-   warnings and no fault.
+   warnings and no fault.
  * 6.8.0-146, 8 workers: oops (b), then (c), within about 10 seconds.
  
  The "still in use" warning occurs several times per minute with 4 workers
  on 6.8.0-146. The fault requires the deferred work to run after the
  superblock is freed, so it becomes more likely with parallel workers.
  
  == Regression boundary (from the Noble changelog) ==
  
  * linux 6.8.0-136.136, "Noble update: upstream stable patchset 2026-05-28"
-   (LP: #2154496), added:
- 
-     340cea84f691c (v7.0)
-     cifs: open files should not hold ref on superblock
+   (LP: #2154496), added:
+ 
+     340cea84f691c (v7.0)
+     cifs: open files should not hold ref on superblock
  
  * linux 6.8.0-139.139, "Noble update: upstream stable patchset 2026-07-09"
-   (LP: #2160250), added:
- 
-     c68337442f03 (v7.1, Cc: stable, Fixes: 340cea84f691c)
-     cifs: Fix busy dentry used after unmounting
- 
-   This commit adds flush_workqueue(deferredclose_wq) in cifs_kill_sb(). It
-   covers variant (a) only.
+   (LP: #2160250), added:
+ 
+     c68337442f03 (v7.1, Cc: stable, Fixes: 340cea84f691c)
+     cifs: Fix busy dentry used after unmounting
+ 
+   This commit adds flush_workqueue(deferredclose_wq) in cifs_kill_sb(). It
+   covers variant (a) only.
  
  * No Noble 6.8 kernel through 6.8.0-146.146 contains:
  
-     75f5c412fa86 (v7.2, Fixes: 340cea84f691c)
-     smb: client: fix busy dentry warning on unmount after DIO
- 
-   This commit adds cifs_sb->outstanding_rreq, waits for in-flight requests,
-   and flushes serverclose_wq and fileinfo_put_wq before kill_anon_super().
-   This is the mechanism that covers variants (b) and (c).
+     75f5c412fa86 (v7.2, Fixes: 340cea84f691c)
+     smb: client: fix busy dentry warning on unmount after DIO
+ 
+   This commit adds cifs_sb->outstanding_rreq, waits for in-flight requests,
+   and flushes serverclose_wq and fileinfo_put_wq before kill_anon_super().
+   This is the mechanism that covers variants (b) and (c).
  
  == Request ==
  
  Track this under CVE-2026-72315, the outstanding-I/O defect fixed by
  75f5c412fa86.
  
  1. Apply the attached Noble 6.8 backport of 75f5c412fa86. Noble predates
-    the cifs netfs conversion, so the backport accounts for the cifsFileInfo
-    references held by cifs_readdata, cifs_writedata and cifs_aio_ctx instead
-    of netfs requests. cifs_kill_sb() waits for that per-superblock count to
-    reach zero, then flushes serverclose_wq and fileinfo_put_wq before
-    kill_anon_super(). The patch survived about 76,000 tested cycles. The
-    flush-only alternative still panicked within about 30 seconds with the
-    same cifsiod/cifs_readahead_complete trace.
+    the cifs netfs conversion, so the backport accounts for the cifsFileInfo
+    references held by cifs_readdata, cifs_writedata and cifs_aio_ctx instead
+    of netfs requests. cifs_kill_sb() waits for that per-superblock count to
+    reach zero, then flushes serverclose_wq and fileinfo_put_wq before
+    kill_anon_super(). The patch survived about 76,000 tested cycles. The
+    flush-only alternative still panicked within about 30 seconds with the
+    same cifsiod/cifs_readahead_complete trace.
  2. We can validate a candidate kernel within minutes with the attached
-    reproducer.
+    reproducer.
  3. Consider noting in the 6.8.0-136, 6.8.0-137 and 6.8.0-138 release notes
-    that 340cea84f691c shipped without its stable follow-up c68337442f03.
+    that 340cea84f691c shipped without its stable follow-up c68337442f03.
  
  Related but separate: 5520e89a5a4f ("smb: client: fix cifsFileInfo
  reference leak in deferred close", Fixes: c3f207ab29f7) fixes a refcount
  leak when queue_delayed_work() finds work already pending. It has a
  different Fixes commit and is not asserted to cause this panic. Please track
  it separately.
  
  == Environment / attachments ==
  
  Ubuntu 24.04 (Noble), x86_64, HPE ProLiant XL225n Gen10 Plus, in-tree
  cifs.ko 2.47, and SMB3 to Dell PowerScale. Production mounts and unmounts
  the share for each cri-o container lifecycle. The lab uses a hand-driven
  loop.
  
- Attached evidence:
- 
- * Production panic context and kworker trace.
- * Firmware pstore record from a lab 6.8.0-137 panic.
- * Live and vmcore dmesg from stock 6.8.0-146.
- * Vmcore analysis.
- * Reproducer.
- * Version, PCI, release and package metadata.
- * Tested SRU patch.
  
  /proc/version_signature reported:
  
-   Ubuntu 6.8.0-137.137-generic 6.8.12
-   Ubuntu 6.8.0-146.146-generic 6.8.12
+   Ubuntu 6.8.0-137.137-generic 6.8.12
+   Ubuntu 6.8.0-146.146-generic 6.8.12
  
  A 3.4 GB kdump vmcore of the 6.8.0-146.146 variant-(b) panic was captured
  on 2026-09-27 with makedumpfile -c -d 31. It is available on request with
- the matching vmlinux. Its dmesg and object analysis are attached.
+ the matching vmlinux. Its dmesg is attached.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2168697

Title:
  linux (Noble): CIFS unmount use-after-free and panic introduced in
  6.8.0-136 (CVE-2026-72315)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2168697/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to