]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
gfs2: slow the deluge of io error messages
authorBob Peterson <rpeterso@redhat.com>
Thu, 4 Oct 2018 15:21:07 +0000 (10:21 -0500)
committerBob Peterson <rpeterso@redhat.com>
Fri, 5 Oct 2018 15:51:11 +0000 (10:51 -0500)
When an io error is hit, it calls gfs2_io_error_bh_i for every
journal buffer it can't write. Since we changed gfs2_io_error_bh_i
recently to withdraw later in the cycle, it sends a flood of
errors to the console. This patch checks for the file system already
being withdrawn, and if so, doesn't send more messages. It doesn't
stop the flood of messages, but it slows it down and keeps it more
reasonable.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/incore.h
fs/gfs2/log.c
fs/gfs2/util.c

index b96d39c28e17c75bfe38f42155b97b8c8441fb2c..5d72e8b66a269ec89b0fe491d6704623a3c46eae 100644 (file)
@@ -623,6 +623,7 @@ enum {
        SDF_RORECOVERY          = 7, /* read only recovery */
        SDF_SKIP_DLM_UNLOCK     = 8,
        SDF_FORCE_AIL_FLUSH     = 9,
+       SDF_AIL1_IO_ERROR       = 10,
 };
 
 enum gfs2_freeze_state {
index ee20ea42e7b598c296e3e2b2c4de8ea2db840f9a..96706a2bd2b6b0f370c6a44cd3f4b4d7385f2872 100644 (file)
@@ -108,7 +108,9 @@ __acquires(&sdp->sd_ail_lock)
                gfs2_assert(sdp, bd->bd_tr == tr);
 
                if (!buffer_busy(bh)) {
-                       if (!buffer_uptodate(bh)) {
+                       if (!buffer_uptodate(bh) &&
+                           !test_and_set_bit(SDF_AIL1_IO_ERROR,
+                                             &sdp->sd_flags)) {
                                gfs2_io_error_bh(sdp, bh);
                                *withdraw = true;
                        }
@@ -206,7 +208,8 @@ static void gfs2_ail1_empty_one(struct gfs2_sbd *sdp, struct gfs2_trans *tr,
                gfs2_assert(sdp, bd->bd_tr == tr);
                if (buffer_busy(bh))
                        continue;
-               if (!buffer_uptodate(bh)) {
+               if (!buffer_uptodate(bh) &&
+                   !test_and_set_bit(SDF_AIL1_IO_ERROR, &sdp->sd_flags)) {
                        gfs2_io_error_bh(sdp, bh);
                        *withdraw = true;
                }
index b072b10fb6357c3919d299345f7a38790efe4be2..0a814ccac41d2a8106f717ae0d200dbe865c38f4 100644 (file)
@@ -259,12 +259,13 @@ void gfs2_io_error_bh_i(struct gfs2_sbd *sdp, struct buffer_head *bh,
                        const char *function, char *file, unsigned int line,
                        bool withdraw)
 {
-       fs_err(sdp,
-              "fatal: I/O error\n"
-              "  block = %llu\n"
-              "  function = %s, file = %s, line = %u\n",
-              (unsigned long long)bh->b_blocknr,
-              function, file, line);
+       if (!test_bit(SDF_SHUTDOWN, &sdp->sd_flags))
+               fs_err(sdp,
+                      "fatal: I/O error\n"
+                      "  block = %llu\n"
+                      "  function = %s, file = %s, line = %u\n",
+                      (unsigned long long)bh->b_blocknr,
+                      function, file, line);
        if (withdraw)
                gfs2_lm_withdraw(sdp, NULL);
 }