[Cluster-devel] [PATCH 2/2] gfs2_jadd: Don't fsync after each block written

Andrew Price anprice at redhat.com
Fri Mar 19 09:11:16 UTC 2021


gfs2_jadd has always called fsync() after writing each block of the
journal. There doesn't seem to be any need for that so take the fsync()
call out of the loop.

Add an additional fsync() after preallocation to make sure we're in good
shape before writing the log headers.

In my tests this reduces the time to add one journal from 5 minutes to
9 seconds.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/mkfs/main_jadd.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/gfs2/mkfs/main_jadd.c b/gfs2/mkfs/main_jadd.c
index 0a18bfb2..2bd0f7b0 100644
--- a/gfs2/mkfs/main_jadd.c
+++ b/gfs2/mkfs/main_jadd.c
@@ -537,6 +537,11 @@ static int add_j(struct gfs2_sbd *sdp, struct jadd_opts *opts)
 	if (error != 0)
 		goto close_fd;
 
+	error = fsync(fd);
+	if (error != 0) {
+		perror("Failed to sync journal metadata");
+		goto close_fd;
+	}
 	if ((error = lseek(fd, 0, SEEK_SET)) < 0) {
 		perror("add_j lseek");
 		goto close_fd;
@@ -580,12 +585,12 @@ static int add_j(struct gfs2_sbd *sdp, struct jadd_opts *opts)
 			seq = 0;
 		off += sdp->bsize;
 
-		if ((error = fsync(fd))) {
-			perror("add_j fsync");
-			goto close_fd;
-		}
 	}
-
+	error = fsync(fd);
+	if (error != 0) {
+		perror("Failed to sync journal metadata");
+		goto close_fd;
+	}
 	sprintf(new_name, "journal%u", opts->journals);
 	error = rename2system(opts, opts->jindex, new_name);
 	if (error < 0 && errno != EEXIST){
-- 
2.30.2




More information about the Cluster-devel mailing list