summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2020-10-28 13:42:18 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-11-18 19:18:44 +0100
commit210387f1af1af2db0f70d8e3af0caadb05be52c6 (patch)
tree7cbcbcba804cfe4d891cb3b14e895d78d9ca6281 /fs
parent7b0310b573d2d27846d077a6607088bd484e7ad2 (diff)
downloadlinux-stable-210387f1af1af2db0f70d8e3af0caadb05be52c6.tar.gz
linux-stable-210387f1af1af2db0f70d8e3af0caadb05be52c6.tar.bz2
linux-stable-210387f1af1af2db0f70d8e3af0caadb05be52c6.zip
gfs2: check for live vs. read-only file system in gfs2_fitrim
[ Upstream commit c5c68724696e7d2f8db58a5fce3673208d35c485 ] Before this patch, gfs2_fitrim was not properly checking for a "live" file system. If the file system had something to trim and the file system was read-only (or spectator) it would start the trim, but when it starts the transaction, gfs2_trans_begin returns -EROFS (read-only file system) and it errors out. However, if the file system was already trimmed so there's no work to do, it never called gfs2_trans_begin. That code is bypassed so it never returns the error. Instead, it returns a good return code with 0 work. All this makes for inconsistent behavior: The same fstrim command can return -EROFS in one case and 0 in another. This tripped up xfstests generic/537 which reports the error as: +fstrim with unrecovered metadata just ate your filesystem This patch adds a check for a "live" (iow, active journal, iow, RW) file system, and if not, returns the error properly. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/gfs2/rgrp.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 1686a40099f2..de9b561b1c38 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1387,6 +1387,9 @@ int gfs2_fitrim(struct file *filp, void __user *argp)
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
+ if (!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))
+ return -EROFS;
+
if (!blk_queue_discard(q))
return -EOPNOTSUPP;