| From cf58151164a280a301744c4e82ecf3220fefde88 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 28 Oct 2020 13:42:18 -0500 |
| Subject: gfs2: check for live vs. read-only file system in gfs2_fitrim |
| |
| From: Bob Peterson <rpeterso@redhat.com> |
| |
| [ 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> |
| --- |
| fs/gfs2/rgrp.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c |
| index 0958f76ada6a3..9621badb95995 100644 |
| --- a/fs/gfs2/rgrp.c |
| +++ b/fs/gfs2/rgrp.c |
| @@ -1371,6 +1371,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; |
| |
| -- |
| 2.27.0 |
| |