]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gfs2: Don't ignore inode write errors during inode_go_sync
authorBob Peterson <rpeterso@redhat.com>
Fri, 8 May 2020 14:18:03 +0000 (09:18 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 2 Jun 2020 17:45:05 +0000 (19:45 +0200)
Before for this patch, function inode_go_sync ignored io errors
during inode_go_sync, overwriting them with metadata write errors:

error = filemap_fdatawait(mapping);
mapping_set_error(mapping, error);
}
error = filemap_fdatawait(metamapping);
...
return error;

So any errors returned by the inode write would be forgotten if the
metadata write succeeded. This patch still does both writes, but
only sets error if it's still zero. That way, any errors will be
reported by to the caller, do_xmote, which will take appropriate
action and report the error.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/glops.c

index 9e9c7a4b8c6632d8aac3886d4bd96682dcec918c..4862dae868a2ca55405c79417544ce6395935ed6 100644 (file)
@@ -268,7 +268,7 @@ static int inode_go_sync(struct gfs2_glock *gl)
        struct gfs2_inode *ip = gfs2_glock2inode(gl);
        int isreg = ip && S_ISREG(ip->i_inode.i_mode);
        struct address_space *metamapping = gfs2_glock2aspace(gl);
-       int error = 0;
+       int error = 0, ret;
 
        if (isreg) {
                if (test_and_clear_bit(GIF_SW_PAGED, &ip->i_flags))
@@ -289,8 +289,10 @@ static int inode_go_sync(struct gfs2_glock *gl)
                error = filemap_fdatawait(mapping);
                mapping_set_error(mapping, error);
        }
-       error = filemap_fdatawait(metamapping);
-       mapping_set_error(metamapping, error);
+       ret = filemap_fdatawait(metamapping);
+       mapping_set_error(metamapping, ret);
+       if (!error)
+               error = ret;
        gfs2_ail_empty_gl(gl);
        /*
         * Writeback of the data mapping may cause the dirty flag to be set