From: Josef Bacik Date: Fri, 15 Nov 2024 15:30:31 +0000 (-0500) Subject: btrfs: disable defrag on pre-content watched files X-Git-Tag: v6.14-rc1~129^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b722e40be2bda7a688f74e1a794121e84f717fdc;p=thirdparty%2Fkernel%2Flinux.git btrfs: disable defrag on pre-content watched files We queue up inodes to be defrag'ed asynchronously, which means we do not have their original file for readahead. This means that the code to skip readahead on pre-content watched files will not run, and we could potentially read in empty pages. Handle this corner case by disabling defrag on files that are currently being watched for pre-content events. Signed-off-by: Josef Bacik Signed-off-by: Jan Kara Link: https://patch.msgid.link/4cc5bcea13db7904174353d08e85157356282a59.1731684329.git.josef@toxicpanda.com --- diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index c9302d1931870..51b439537049c 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -2635,6 +2635,15 @@ static int btrfs_ioctl_defrag(struct file *file, void __user *argp) goto out; } + /* + * Don't allow defrag on pre-content watched files, as it could + * populate the page cache with 0's via readahead. + */ + if (unlikely(FMODE_FSNOTIFY_HSM(file->f_mode))) { + ret = -EINVAL; + goto out; + } + if (argp) { if (copy_from_user(&range, argp, sizeof(range))) { ret = -EFAULT;