linux/fs
Sam Edwards cac190c767 ceph: fix write storm on fscrypted files
CephFS stores file data across multiple RADOS objects. An object is the
atomic unit of storage, so the writeback code must clean only folios
that belong to the same object with each OSD request.

CephFS also supports RAID0-style striping of file contents: if enabled,
each object stores multiple unbroken "stripe units" covering different
portions of the file; if disabled, a "stripe unit" is simply the whole
object. The stripe unit is (usually) reported as the inode's block size.

Though the writeback logic could, in principle, lock all dirty folios
belonging to the same object, its current design is to lock only a
single stripe unit at a time. Ever since this code was first written,
it has determined this size by checking the inode's block size.
However, the relatively-new fscrypt support needed to reduce the block
size for encrypted inodes to the crypto block size (see 'fixes' commit),
which causes an unnecessarily high number of write operations (~1024x as
many, with 4MiB objects) and correspondingly degraded performance.

Fix this (and clarify intent) by using i_layout.stripe_unit directly in
ceph_define_write_size() so that encrypted inodes are written back with
the same number of operations as if they were unencrypted.

This patch depends on the preceding commit ("ceph: do not propagate page
array emplacement errors as batch errors") for correctness. While it
applies cleanly on its own, applying it alone will introduce a
regression. This dependency is only relevant for kernels where
ce80b76dd3 ("ceph: introduce ceph_process_folio_batch() method") has
been applied; stable kernels without that commit are unaffected.

Cc: stable@vger.kernel.org
Fixes: 94af047092 ("ceph: add some fscrypt guardrails")
Signed-off-by: Sam Edwards <CFSworks@gmail.com>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
2026-02-11 17:52:50 +01:00
..
9p 9p: don't allow delegations to be set on directories 2026-01-12 10:54:47 +01:00
adfs
affs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
afs Networking changes for 6.19. 2025-12-03 17:24:33 -08:00
autofs vfs-6.19-rc1.fixes 2025-12-05 15:52:30 -08:00
befs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
bfs vfs-6.19-rc1.inode 2025-12-01 09:02:34 -08:00
btrfs for-6.19-rc8-tag 2026-02-03 10:19:58 -08:00
cachefiles vfs-6.19-rc1.directory.locking 2025-12-01 16:13:46 -08:00
ceph ceph: fix write storm on fscrypted files 2026-02-11 17:52:50 +01:00
coda Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
configfs Some filesystems use a kinda-sorta controlled dentry refcount leak to pin 2025-12-05 14:36:21 -08:00
cramfs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
crypto Significant patch series in this pull request: 2025-12-06 14:01:20 -08:00
debugfs debugfs: Fix memleak in debugfs_change_name(). 2025-12-19 16:43:40 +01:00
devpts convert devpts 2025-11-16 01:35:04 -05:00
dlm net: Convert proto callbacks from sockaddr to sockaddr_unsized 2025-11-04 19:10:33 -08:00
ecryptfs ecryptfs: Release lower parent dentry after creating dir 2025-12-24 13:58:04 +01:00
efivarfs efivarfs: fix error propagation in efivar_entry_get() 2026-01-19 08:40:36 +01:00
efs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
erofs erofs: fix file-backed mounts no longer working on EROFS partitions 2026-01-10 06:39:20 -10:00
exfat exfat: fix remount failure in different process environments 2025-12-03 10:00:17 +09:00
exportfs
ext2 Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
ext4 ext4: fix iloc.bh leak in ext4_xattr_inode_update_ref 2026-01-18 11:23:10 -05:00
f2fs f2fs-for-6.19-rc1 2025-12-09 12:06:20 +09:00
fat There are no significant series in this small merge. Please see the 2025-12-13 20:55:12 +12:00
freevxfs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
fuse vfs-6.19-rc8.fixes 2026-01-26 09:30:48 -08:00
gfs2 vfs-6.19-rc8.fixes 2026-01-26 09:30:48 -08:00
hfs hfs/hfsplus updates for v6.19 2025-12-03 20:08:32 -08:00
hfsplus hfs/hfsplus updates for v6.19 2025-12-03 20:08:32 -08:00
hostfs Apart from the usual small churn, we have 2025-12-05 16:30:56 -08:00
hpfs vfs-6.19-rc1.fs_header 2025-12-01 14:18:01 -08:00
hugetlbfs Some filesystems use a kinda-sorta controlled dentry refcount leak to pin 2025-12-05 14:36:21 -08:00
iomap iomap: wait for batched folios to be stable in __iomap_get_folio 2026-01-14 17:06:02 +01:00
isofs vfs-6.19-rc1.inode 2025-12-01 09:02:34 -08:00
jbd2 jbd2: fix the inconsistency between checksum and data in memory for journal sb 2025-11-26 17:05:47 -05:00
jffs2 treewide: Update email address 2026-01-11 06:09:11 -10:00
jfs vfs-6.19-rc1.inode 2025-12-01 09:02:34 -08:00
kernfs fs/kernfs: null-ptr deref in simple_xattrs_free() 2025-12-23 16:14:43 +01:00
lockd nfsd-6.19 fixes: 2025-12-30 17:56:26 -08:00
minix vfs-6.19-rc1.minix 2025-12-01 15:22:40 -08:00
netfs netfs: Fix early read unlock of page with EOF in middle 2025-12-24 13:30:24 +01:00
nfs vfs-6.19-rc8.fixes 2026-01-26 09:30:48 -08:00
nfs_common NFSD: Remove NFSERR_EAGAIN 2026-01-02 13:43:41 -05:00
nfsd vfs-6.19-rc5.fixes 2026-01-09 05:57:57 -10:00
nilfs2 Significant patch series in this pull request: 2025-12-06 14:01:20 -08:00
nls fs/nls: Fix inconsistency between utf8_to_utf32() and utf32_to_utf8() 2025-12-01 11:58:06 +02:00
notify \n 2025-12-19 07:41:17 +12:00
ntfs3 Significant patch series in this merge are as follows: 2025-12-05 13:52:43 -08:00
ocfs2 There are no significant series in this small merge. Please see the 2025-12-13 20:55:12 +12:00
omfs vfs-6.19-rc1.fs_header 2025-12-01 14:18:01 -08:00
openpromfs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
orangefs vfs-6.19-rc1.inode 2025-12-01 09:02:34 -08:00
overlayfs ovl: pass original credentials, not mounter credentials during create 2025-12-05 16:16:20 -08:00
proc procfs: avoid fetching build ID while holding VMA lock 2026-02-05 14:10:00 -08:00
pstore Some filesystems use a kinda-sorta controlled dentry refcount leak to pin 2025-12-05 14:36:21 -08:00
qnx4 Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
qnx6 Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
quota Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
ramfs Some filesystems use a kinda-sorta controlled dentry refcount leak to pin 2025-12-05 14:36:21 -08:00
resctrl Significant patch series in this merge are as follows: 2025-12-05 13:52:43 -08:00
romfs romfs: check sb_set_blocksize() return value 2026-01-13 09:56:58 +01:00
smb two client memory leak fixes 2026-02-03 16:20:59 -08:00
squashfs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
sysfs sysfs: attribute_group: enable const variants of is_visible() 2025-11-26 15:16:35 +01:00
tests
tracefs convert tracefs 2025-11-16 01:35:03 -05:00
ubifs This pull request contains the following changes for UBI and UBIFS: 2025-12-09 08:50:27 +09:00
udf Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
ufs Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
unicode
vboxsf vboxsf: don't allow delegations to be set on directories 2026-01-12 10:54:47 +01:00
verity Optimize fsverity with 2-way interleaved hashing 2025-09-29 15:55:20 -07:00
xfs xfs: fixes for v6.19-rc6 2026-01-16 09:09:41 -08:00
zonefs vfs-6.19-rc1.inode 2025-12-01 09:02:34 -08:00
aio.c aio: use credential guards 2025-11-04 12:36:33 +01:00
anon_inodes.c anon_inodes: convert to FD_ADD() 2025-11-28 12:42:31 +01:00
attr.c filelock: add struct delegated_inode 2025-11-12 09:38:34 +01:00
backing-file.c kernel-6.19-rc1.cred 2025-12-01 13:45:41 -08:00
bad_inode.c
binfmt_elf.c rseq: Provide and use rseq_set_ids() 2025-11-04 08:33:33 +01:00
binfmt_elf_fdpic.c
binfmt_flat.c
binfmt_misc.c Some filesystems use a kinda-sorta controlled dentry refcount leak to pin 2025-12-05 14:36:21 -08:00
binfmt_script.c
bpf_fs_kfuncs.c bpf...d_path(): constify path argument 2025-09-15 21:17:08 -04:00
buffer.c vfs-6.19-rc1.folio 2025-12-01 10:26:38 -08:00
char_dev.c
compat_binfmt_elf.c
coredump.c Networking changes for 6.19. 2025-12-03 17:24:33 -08:00
d_path.c
dax.c Significant patch series in this merge are as follows: 2025-12-05 13:52:43 -08:00
dcache.c vfs: document d_dispose_if_unused() 2026-01-16 19:15:14 +01:00
direct-io.c
drop_caches.c Coccinelle-based conversion to use ->i_state accessors 2025-10-20 20:22:26 +02:00
eventfd.c eventfd: convert do_eventfd() to FD_PREPARE() 2025-11-28 12:42:31 +01:00
eventpoll.c eventpoll: convert do_epoll_create() to FD_PREPARE() 2025-11-28 12:42:32 +01:00
exec.c A large overhaul of the restartable sequences and CID management: 2025-12-02 08:48:53 -08:00
fcntl.c vfs: expose delegation support to userland 2025-11-12 09:38:37 +01:00
fhandle.c fhandle: convert do_handle_open() to FD_ADD() 2025-11-28 12:42:31 +01:00
file.c vfs-6.19-rc1.fd_prepare.fs 2025-12-01 17:32:07 -08:00
file_attr.c \n 2025-12-19 07:41:17 +12:00
file_table.c fs: update comment in init_file() 2025-10-07 12:48:33 +02:00
filesystems.c
fs-writeback.c vfs-6.19-rc8.fixes 2026-01-26 09:30:48 -08:00
fs_context.c
fs_dirent.c fs: rename fs_types.h to fs_dirent.h 2025-11-05 09:51:30 +01:00
fs_parser.c
fs_pin.c
fs_struct.c fs: inline current_umask() and move it to fs_struct.h 2025-11-05 22:51:23 +01:00
fsopen.c
init.c vfs: make vfs_symlink break delegations on parent dir 2025-11-12 09:38:36 +01:00
inode.c fs: Describe @isnew parameter in ilookup5_nowait() 2025-12-24 13:33:24 +01:00
internal.h Some filesystems use a kinda-sorta controlled dentry refcount leak to pin 2025-12-05 14:36:21 -08:00
ioctl.c
Kconfig Summary of significant series in this pull request: 2025-10-02 18:18:33 -07:00
Kconfig.binfmt
kernel_read_file.c
libfs.c shmem: fix recovery on rename failures 2025-12-16 00:57:29 -05:00
locks.c vfs-6.19-rc5.fixes 2026-01-09 05:57:57 -10:00
Makefile fs: rename fs_types.h to fs_dirent.h 2025-11-05 09:51:30 +01:00
mbcache.c
mnt_idmapping.c
mount.h fs: use boolean to indicate anonymous mount namespace 2025-11-11 10:01:31 +01:00
mpage.c mpage: convert do_mpage_readpage() to return void type 2025-09-21 14:22:16 -07:00
namei.c VFS: fix __start_dirop() kernel-doc warnings 2025-12-24 13:33:24 +01:00
namespace.c vfs-6.19-rc1.fd_prepare.fs 2025-12-01 17:32:07 -08:00
nsfs.c vfs-6.19-rc1.fd_prepare.fs 2025-12-01 17:32:07 -08:00
open.c vfs-6.19-rc1.fd_prepare.fs 2025-12-01 17:32:07 -08:00
pidfs.c pidfs: protect PIDFD_GET_* ioctls() via ifdef 2026-01-06 23:08:12 +01:00
pipe.c Summary 2025-12-05 11:15:37 -08:00
pnode.c umount_tree(): take all victims out of propagation graph at once 2025-09-15 21:26:44 -04:00
pnode.h umount_tree(): take all victims out of propagation graph at once 2025-09-15 21:26:44 -04:00
posix_acl.c filelock: add struct delegated_inode 2025-11-12 09:38:34 +01:00
proc_namespace.c
read_write.c
readdir.c readdir: require opt-in for d_type flags 2026-01-12 10:57:34 +01:00
remap_range.c
select.c select: Convert to scoped user access 2025-11-04 08:28:34 +01:00
seq_file.c
signalfd.c signalfd: convert do_signalfd4() to FD_ADD() 2025-11-28 12:42:32 +01:00
splice.c fs/splice.c: trivial fix: pipes -> pipe's 2025-11-25 10:11:16 +01:00
stack.c
stat.c constify path argument of vfs_statx_path() 2025-09-15 21:17:07 -04:00
statfs.c
super.c vfs-6.19-rc1.fixes 2025-12-05 15:52:30 -08:00
sync.c vfs-6.19-rc1.writeback 2025-12-01 09:20:51 -08:00
sysctls.c
timerfd.c timerfd: convert timerfd_create() to FD_ADD() 2025-11-28 12:42:32 +01:00
userfaultfd.c Significant patch series in this merge are as follows: 2025-12-05 13:52:43 -08:00
utimes.c vfs-6.19-rc1.directory.delegations 2025-12-01 15:34:41 -08:00
xattr.c filelock: add struct delegated_inode 2025-11-12 09:38:34 +01:00