[Cluster-devel] [RFC RHEL7 GFS2 PATCH 2/3] gfs2: try to free empty mapping inodes from ordered list

Abhi Das adas at redhat.com
Tue Dec 12 17:22:14 UTC 2017


Add a new function gfs2_ordered_shrink() that is called when
syncfs is run. This function runs through the ordered list of
inodes and removes the ones that don't have any pages in need
of writing.

Signed-off-by: Abhi Das <adas at redhat.com>
---
 fs/gfs2/log.c   | 16 ++++++++++++++++
 fs/gfs2/log.h   |  1 +
 fs/gfs2/super.c |  4 +++-
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 0257704..6d618a1 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -537,6 +537,22 @@ static void gfs2_ordered_wait(struct gfs2_sbd *sdp)
 	spin_unlock(&sdp->sd_ordered_lock);
 }
 
+void gfs2_ordered_shrink(struct gfs2_sbd *sdp, int whence)
+{
+	struct gfs2_inode *ip, *tmp;
+
+	spin_lock(&sdp->sd_ordered_lock);
+	list_for_each_entry_safe(ip, tmp, &sdp->sd_log_le_ordered, i_ordered) {
+		if (ip->i_inode.i_mapping->nrpages != 0)
+			continue;
+		if (test_and_clear_bit(GIF_ORDERED, &ip->i_flags)) {
+			list_del(&ip->i_ordered);
+			ord_stats_adjust(sdp, -1, whence);
+		}
+	}
+	spin_unlock(&sdp->sd_ordered_lock);
+}
+
 void gfs2_ordered_del_inode(struct gfs2_inode *ip, int whence)
 {
 	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
diff --git a/fs/gfs2/log.h b/fs/gfs2/log.h
index bf7729c..80c8861 100644
--- a/fs/gfs2/log.h
+++ b/fs/gfs2/log.h
@@ -90,6 +90,7 @@ static inline void gfs2_ordered_add_inode(struct gfs2_inode *ip)
 	}
 }
 
+extern void gfs2_ordered_shrink(struct gfs2_sbd *sdp, int whence);
 extern void gfs2_ordered_del_inode(struct gfs2_inode *ip, int whence);
 extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct,
 			    unsigned int ssize);
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index ee15a50..773e98d 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -948,8 +948,10 @@ static int gfs2_sync_fs(struct super_block *sb, int wait)
 	struct gfs2_sbd *sdp = sb->s_fs_info;
 
 	gfs2_quota_sync(sb, -1);
-	if (wait && sdp)
+	if (wait && sdp) {
 		gfs2_log_flush(sdp, NULL);
+		gfs2_ordered_shrink(sdp, ORD_WHENCE_SYNCFS);
+	}
 	return sdp->sd_log_error;
 }
 
-- 
2.4.11




More information about the Cluster-devel mailing list