summaryrefslogtreecommitdiff
path: root/fs/btrfs/ioctl.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2019-05-13 21:30:15 +0300
committerIngo Molnar <mingo@kernel.org>2019-05-13 21:30:15 +0300
commit82045dd85566d87128dcc66277cf1177d9930a4a (patch)
tree22fea6311a4866293005a1a44f34310e4007a3c9 /fs/btrfs/ioctl.c
parente0478542cfd4d993e38d5f92a3f3ecd238805e96 (diff)
parentffa6f55eb6188ee73339cab710fabf30d13110a7 (diff)
downloadlinux-82045dd85566d87128dcc66277cf1177d9930a4a.tar.xz
Merge branch 'linus' into core/urgent, to merge in dependent changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r--fs/btrfs/ioctl.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index ec2d8919e7fb..cd4e693406a0 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -501,6 +501,16 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg)
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
+ /*
+ * If the fs is mounted with nologreplay, which requires it to be
+ * mounted in RO mode as well, we can not allow discard on free space
+ * inside block groups, because log trees refer to extents that are not
+ * pinned in a block group's free space cache (pinning the extents is
+ * precisely the first phase of replaying a log tree).
+ */
+ if (btrfs_test_opt(fs_info, NOLOGREPLAY))
+ return -EROFS;
+
rcu_read_lock();
list_for_each_entry_rcu(device, &fs_info->fs_devices->devices,
dev_list) {