Before this patch, all io errors received by the quota daemon or the
logd daemon would cause a complaint message to be issued, such as:

   gfs2: fsid=dm-13.0: Error 10 writing to journal, jid=0

This patch changes it so that the error message is only issued the
first time the error is encountered.

Also, before this patch function gfs2_end_log_write did not set the
sd_log_error value, so log errors would not cause the file system to
be withdrawn. This patch sets the error code so the file system is
properly withdrawn if an io error is encountered writing to the journal.

WARNING: This change in function breaks check xfstests generic/441
and causes it to fail: io errors writing to the log should cause a
file system to be withdrawn, and no further operations are tolerated.

Signed-off-by: Bob Peterson <rpete...@redhat.com>
---
 fs/gfs2/lops.c  | 5 +++--
 fs/gfs2/quota.c | 4 ++--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index fd2e452ad327..edff7538d7f2 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -211,8 +211,9 @@ static void gfs2_end_log_write(struct bio *bio)
        struct bvec_iter_all iter_all;
 
        if (bio->bi_status) {
-               fs_err(sdp, "Error %d writing to journal, jid=%u\n",
-                      bio->bi_status, sdp->sd_jdesc->jd_jid);
+               if (!cmpxchg(&sdp->sd_log_error, 0, (int)bio->bi_status))
+                       fs_err(sdp, "Error %d writing to journal, jid=%u\n",
+                              bio->bi_status, sdp->sd_jdesc->jd_jid);
                wake_up(&sdp->sd_logd_waitq);
        }
 
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 8871fca9102f..acb6cbdd1431 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -1479,8 +1479,8 @@ static void quotad_error(struct gfs2_sbd *sdp, const char 
*msg, int error)
        if (error == 0 || error == -EROFS)
                return;
        if (!gfs2_withdrawn(sdp)) {
-               fs_err(sdp, "gfs2_quotad: %s error %d\n", msg, error);
-               cmpxchg(&sdp->sd_log_error, 0, error);
+               if (!cmpxchg(&sdp->sd_log_error, 0, error))
+                       fs_err(sdp, "gfs2_quotad: %s error %d\n", msg, error);
                wake_up(&sdp->sd_logd_waitq);
        }
 }
-- 
2.21.0

Reply via email to