GFS2: Write out dirty inode metadata in delayed deletes
authorBenjamin Marzinski <bmarzins@redhat.com>
Thu, 20 Sep 2012 14:52:58 +0000 (09:52 -0500)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 24 Sep 2012 09:47:30 +0000 (10:47 +0100)
If a dirty GFS2 inode was being deleted but was in use by another node, its
metadata was not getting written out before GFS2 checked for dirty buffers in
gfs2_ail_flush().  GFS2 was relying on inode_go_sync() to write out the
metadata when the other node tried to free the file, but it failed the error
check before it got that far. This patch writes out the metadata before calling
gfs2_ail_flush()

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/super.c

index 79cac70576919af572d5e6f79b5df3ff4af53fe4..a8d90f2f576cd01bcf627f6d0b6c69e42037e170 100644 (file)
@@ -1545,6 +1545,11 @@ static void gfs2_evict_inode(struct inode *inode)
 
 out_truncate:
        gfs2_log_flush(sdp, ip->i_gl);
+       if (test_bit(GLF_DIRTY, &ip->i_gl->gl_flags)) {
+               struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl);
+               filemap_fdatawrite(metamapping);
+               filemap_fdatawait(metamapping);
+       }
        write_inode_now(inode, 1);
        gfs2_ail_flush(ip->i_gl, 0);