Skip to contentSkip to conversation

GFS2: Write out dirty inode metadata in delayed deletes

PATCH New Benjamin Marzinski 2 participants 2 messages Sep 20, 2012 – Sep 21, 2012 GFS2 file system

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 GFS2: Write out dirty inode metadata in delayed deletes

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()

---
 fs/gfs2/super.c |    5 +++++
 1 file changed, 5 insertions(+)
fs/gfs2/super.c +5 -0
Index: gfs2-3.0-nmw/fs/gfs2/super.c
===================================================================
@@ -1545,6 +1545,11 @@ static void gfs2_evict_inode(struct inod
 
 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);
 
#1 lore raw

PATCH 1/1 GFS2: Write out dirty inode metadata in delayed deletes

Hi,

Thanks for the patch, I'll push it into the -nmw tree shortly,

Steve.

Quoted 29 lines · Benjamin Marzinski

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()

---
 fs/gfs2/super.c |    5 +++++
 1 file changed, 5 insertions(+)

Index: gfs2-3.0-nmw/fs/gfs2/super.c
===================================================================

fs/gfs2/super.c +5 -0
@@ -1545,6 +1545,11 @@ static void gfs2_evict_inode(struct inod
 
 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);