linux/fs/ocfs2
Linus Torvalds 292a2bcd17 Fixing livelocks in shrink_dcache_tree()
If shrink_dcache_tree() finds a dentry in the middle of being killed
 by another thread, it has to wait until the victim finishes dying,
 gets detached from the tree and ceases to pin its parent.
 
 The way we used to deal with that amounted to busy-wait; unfortunately,
 it's not just inefficient but can lead to reliably reproducible hard
 livelocks.
 
 Solved by having shrink_dentry_tree() attach a completion to such dentry,
 with dentry_unlist() calling complete() on all objects attached to it.
 With a bit of care it can be done without growing struct dentry or adding
 overhead in normal case.
 
 Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQQqUNBr3gm4hGXdBJlZ7Krx/gZQ6wUCaec/ugAKCRBZ7Krx/gZQ
 6y77AP9l/IL36Ic45p45FCTirA6LFyIvZ5Gixm3Xk64Pi1Y3nAEAqQ5UOVnJc907
 RyrCpcI6vnO8a67MptchOxK9d1bIxQw=
 =A8JL
 -----END PGP SIGNATURE-----

Merge tag 'pull-dcache-busy-wait' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull dcache busy loop updates from Al Viro:
 "Fix livelocks in shrink_dcache_tree()

  If shrink_dcache_tree() finds a dentry in the middle of being killed
  by another thread, it has to wait until the victim finishes dying,
  gets detached from the tree and ceases to pin its parent.

  The way we used to deal with that amounted to busy-wait;
  unfortunately, it's not just inefficient but can lead to reliably
  reproducible hard livelocks.

  Solved by having shrink_dentry_tree() attach a completion to such
  dentry, with dentry_unlist() calling complete() on all objects
  attached to it. With a bit of care it can be done without growing
  struct dentry or adding overhead in normal case"

* tag 'pull-dcache-busy-wait' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  get rid of busy-waiting in shrink_dcache_tree()
  dcache.c: more idiomatic "positives are not allowed" sanity checks
  struct dentry: make ->d_u anonymous
  for_each_alias(): helper macro for iterating through dentries of given inode
2026-04-21 07:30:44 -07:00
..
cluster ocfs2/heartbeat: fix slot mapping rollback leaks on error paths 2026-04-15 02:15:01 -07:00
dlm ocfs2/dlm: fix off-by-one in dlm_match_regions() region comparison 2026-03-27 21:19:49 -07:00
dlmfs treewide: change inode->i_ino from unsigned long to u64 2026-03-06 14:31:28 +01:00
acl.c fs: inline current_umask() and move it to fs_struct.h 2025-11-05 22:51:23 +01:00
acl.h
alloc.c mm.git review status for linus..mm-nonmm-stable 2026-04-16 20:11:56 -07:00
alloc.h ocfs2: convert ocfs2_map_and_dirty_page() to ocfs2_map_and_dirty_folio() 2025-01-12 20:21:13 -08:00
aops.c mm.git review status for linus..mm-nonmm-stable 2026-04-16 20:11:56 -07:00
aops.h ocfs2: remove ocfs2_start_walk_page_trans() prototype 2025-01-12 20:21:13 -08:00
blockcheck.c
blockcheck.h
buffer_head_io.c ocfs2: convert remaining read-only checks to ocfs2_emergency_state 2025-12-10 16:07:43 -08:00
buffer_head_io.h
dcache.c for_each_alias(): helper macro for iterating through dentries of given inode 2026-04-02 03:45:02 -04:00
dcache.h
dir.c mm.git review status for linus..mm-nonmm-stable 2026-04-16 20:11:56 -07:00
dir.h
dlmglue.c ocfs2: Drop pointless sync_mapping_buffers() calls 2026-03-26 15:03:27 +01:00
dlmglue.h ocfs2: convert ocfs2_inode_lock_with_page() to ocfs2_inode_lock_with_folio() 2025-01-12 20:21:10 -08:00
export.c ocfs2: detect released suballocator BG for fh_to_[dentry|parent] 2026-01-20 19:44:16 -08:00
export.h
extent_map.c treewide: change inode->i_ino from unsigned long to u64 2026-03-06 14:31:28 +01:00
extent_map.h
file.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
file.h ocfs2: store cookie in private data 2024-09-12 11:58:44 +02:00
filecheck.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
filecheck.h
heartbeat.c
heartbeat.h
inode.c vfs-7.1-rc1.kino 2026-04-13 12:19:01 -07:00
inode.h ocfs2: retire ocfs2_drop_inode() and I_WILL_FREE usage 2025-10-20 20:22:25 +02:00
ioctl.c ocfs2: validate bg_bits during freefrag scan 2026-04-15 02:15:03 -07:00
ioctl.h tree-wide: s/struct fileattr/struct file_kattr/g 2025-07-04 16:14:39 +02:00
journal.c ocfs2: use jbd2 jinode dirty range accessor 2026-04-09 10:51:05 -04:00
journal.h ocfs2: stop quota recovery before disabling quotas 2025-05-07 23:39:40 -07:00
Kconfig fs: add CONFIG_BUFFER_HEAD 2023-08-02 09:13:09 -06:00
localalloc.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
localalloc.h
locks.c ocfs2: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
locks.h
Makefile
mmap.c ocfs2: fix use-after-free in ocfs2_fault() when VM_FAULT_RETRY 2026-04-15 02:15:02 -07:00
mmap.h fs: replace mmap hook with .mmap_prepare for simple mappings 2025-06-19 13:56:59 +02:00
move_extents.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
move_extents.h
namei.c ocfs2: Drop pointless sync_mapping_buffers() calls 2026-03-26 15:03:27 +01:00
namei.h
ocfs1_fs_compat.h
ocfs2_fs.h ocfs2: annotate more flexible array members with __counted_by_le() 2026-01-20 19:44:18 -08:00
ocfs2_ioctl.h ocfs2: miscellaneous spelling fixes 2025-01-12 20:21:07 -08:00
ocfs2_lockid.h ocfs2: miscellaneous spelling fixes 2025-01-12 20:21:07 -08:00
ocfs2_lockingver.h
ocfs2_trace.h ocfs2: fix use-after-free in ocfs2_fault() when VM_FAULT_RETRY 2026-04-15 02:15:02 -07:00
ocfs2.h ocfs2: add ocfs2_emergency_state helper and apply to setattr 2025-12-10 16:07:43 -08:00
quota_global.c ocfs2: fix deadlock when creating quota file 2026-03-27 21:19:38 -07:00
quota_local.c mm.git review status for linus..mm-nonmm-stable 2026-04-16 20:11:56 -07:00
quota.h ocfs2: remove unused declaration in header file 2024-11-05 17:12:26 -08:00
refcounttree.c mm.git review status for linus..mm-stable 2026-04-15 12:59:16 -07:00
refcounttree.h
reservations.c ocfs2: correctly use ocfs2_find_next_zero_bit() 2024-04-25 21:07:01 -07:00
reservations.h ocfs2: miscellaneous spelling fixes 2025-01-12 20:21:07 -08:00
resize.c ocfs2: validate group add input before caching 2026-04-15 02:15:03 -07:00
resize.h
slot_map.c Convert more 'alloc_obj' cases to default GFP_KERNEL arguments 2026-02-21 20:03:00 -08:00
slot_map.h
stack_o2cb.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
stack_user.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
stackglue.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
stackglue.h ocfs2: miscellaneous spelling fixes 2025-01-12 20:21:07 -08:00
suballoc.c ocfs2: validate bg_list extent bounds in discontig groups 2026-04-15 02:15:02 -07:00
suballoc.h ocfs2: fix the issue with discontiguous allocation in the global_bitmap 2025-05-07 23:39:37 -07:00
super.c ocfs2: use get_random_u32() where appropriate 2026-04-15 02:15:03 -07:00
super.h
symlink.c ocfs2: use a folio in ocfs2_fast_symlink_read_folio() 2025-01-12 20:21:13 -08:00
symlink.h
sysfile.c ocfs2: avoid extra calls to strlen() after ocfs2_sprintf_system_inode_name() 2025-09-22 20:11:00 -07:00
sysfile.h
uptodate.c
uptodate.h
xattr.c mm.git review status for linus..mm-nonmm-stable 2026-04-16 20:11:56 -07:00
xattr.h ocfs2: move ocfs2_xattr_handlers and ocfs2_xattr_handler_map to .rodata 2023-10-09 16:24:20 +02:00