Blame SOURCES/0073-exfat-improve-write-performance-when-dirsync-enabled.patch

Kmods SIG 50e2b3
From 23befe490ba885bdf757d40b2489134315fef690 Mon Sep 17 00:00:00 2001
Kmods SIG 50e2b3
From: Hyeongseok Kim <hyeongseok@gmail.com>
Kmods SIG 50e2b3
Date: Mon, 15 Mar 2021 13:12:55 +0900
Kmods SIG 50e2b3
Subject: [Backport 23befe490ba8] exfat: improve write performance when dirsync
Kmods SIG 50e2b3
 enabled
Kmods SIG 50e2b3
Kmods SIG 50e2b3
Degradation of write speed caused by frequent disk access for cluster
Kmods SIG 50e2b3
bitmap update on every cluster allocation could be improved by
Kmods SIG 50e2b3
selective syncing bitmap buffer. Change to flush bitmap buffer only
Kmods SIG 50e2b3
for the directory related operations.
Kmods SIG 50e2b3
Kmods SIG 50e2b3
Signed-off-by: Hyeongseok Kim <hyeongseok@gmail.com>
Kmods SIG 50e2b3
Acked-by: Sungjong Seo <sj1557.seo@samsung.com>
Kmods SIG 50e2b3
Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Kmods SIG 50e2b3
---
Kmods SIG 50e2b3
 src/balloc.c   | 4 ++--
Kmods SIG 50e2b3
 src/dir.c      | 2 +-
Kmods SIG 50e2b3
 src/exfat_fs.h | 4 ++--
Kmods SIG 50e2b3
 src/fatent.c   | 4 ++--
Kmods SIG 50e2b3
 src/inode.c    | 3 ++-
Kmods SIG 50e2b3
 src/namei.c    | 2 +-
Kmods SIG 50e2b3
 6 files changed, 10 insertions(+), 9 deletions(-)
Kmods SIG 50e2b3
Kmods SIG 50e2b3
diff --git a/src/balloc.c b/src/balloc.c
Kmods SIG 50e2b3
index 78bc87d5a11bf9688dbef42ad9c3b4f0c232c0f1..cc5cffc4a76910cb2ed3c36f1fcadd4ccb9b1679 100644
Kmods SIG 50e2b3
--- a/src/balloc.c
Kmods SIG 50e2b3
+++ b/src/balloc.c
Kmods SIG 50e2b3
@@ -141,7 +141,7 @@ void exfat_free_bitmap(struct exfat_sb_info *sbi)
Kmods SIG 50e2b3
 	kfree(sbi->vol_amap);
Kmods SIG 50e2b3
 }
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
-int exfat_set_bitmap(struct inode *inode, unsigned int clu)
Kmods SIG 50e2b3
+int exfat_set_bitmap(struct inode *inode, unsigned int clu, bool sync)
Kmods SIG 50e2b3
 {
Kmods SIG 50e2b3
 	int i, b;
Kmods SIG 50e2b3
 	unsigned int ent_idx;
Kmods SIG 50e2b3
@@ -154,7 +154,7 @@ int exfat_set_bitmap(struct inode *inode, unsigned int clu)
Kmods SIG 50e2b3
 	b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx);
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
 	set_bit_le(b, sbi->vol_amap[i]->b_data);
Kmods SIG 50e2b3
-	exfat_update_bh(sbi->vol_amap[i], IS_DIRSYNC(inode));
Kmods SIG 50e2b3
+	exfat_update_bh(sbi->vol_amap[i], sync);
Kmods SIG 50e2b3
 	return 0;
Kmods SIG 50e2b3
 }
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
diff --git a/src/dir.c b/src/dir.c
Kmods SIG 50e2b3
index e1d5536de948b3dcd4667cf3074b51462ddb0697..7efb1c6d480846937da5436277b6220dd26f2f7c 100644
Kmods SIG 50e2b3
--- a/src/dir.c
Kmods SIG 50e2b3
+++ b/src/dir.c
Kmods SIG 50e2b3
@@ -320,7 +320,7 @@ int exfat_alloc_new_dir(struct inode *inode, struct exfat_chain *clu)
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
 	exfat_chain_set(clu, EXFAT_EOF_CLUSTER, 0, ALLOC_NO_FAT_CHAIN);
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
-	ret = exfat_alloc_cluster(inode, 1, clu);
Kmods SIG 50e2b3
+	ret = exfat_alloc_cluster(inode, 1, clu, IS_DIRSYNC(inode));
Kmods SIG 50e2b3
 	if (ret)
Kmods SIG 50e2b3
 		return ret;
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
diff --git a/src/exfat_fs.h b/src/exfat_fs.h
Kmods SIG 50e2b3
index 169d0b602f5e7c06c8889b38d83abcfad2e8382c..e77fe2f45cf28fe8533276426a73c657446863f6 100644
Kmods SIG 50e2b3
--- a/src/exfat_fs.h
Kmods SIG 50e2b3
+++ b/src/exfat_fs.h
Kmods SIG 50e2b3
@@ -389,7 +389,7 @@ int exfat_clear_volume_dirty(struct super_block *sb);
Kmods SIG 50e2b3
 #define exfat_get_next_cluster(sb, pclu) exfat_ent_get(sb, *(pclu), pclu)
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
 int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc,
Kmods SIG 50e2b3
-		struct exfat_chain *p_chain);
Kmods SIG 50e2b3
+		struct exfat_chain *p_chain, bool sync_bmap);
Kmods SIG 50e2b3
 int exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain);
Kmods SIG 50e2b3
 int exfat_ent_get(struct super_block *sb, unsigned int loc,
Kmods SIG 50e2b3
 		unsigned int *content);
Kmods SIG 50e2b3
@@ -408,7 +408,7 @@ int exfat_count_num_clusters(struct super_block *sb,
Kmods SIG 50e2b3
 /* balloc.c */
Kmods SIG 50e2b3
 int exfat_load_bitmap(struct super_block *sb);
Kmods SIG 50e2b3
 void exfat_free_bitmap(struct exfat_sb_info *sbi);
Kmods SIG 50e2b3
-int exfat_set_bitmap(struct inode *inode, unsigned int clu);
Kmods SIG 50e2b3
+int exfat_set_bitmap(struct inode *inode, unsigned int clu, bool sync);
Kmods SIG 50e2b3
 void exfat_clear_bitmap(struct inode *inode, unsigned int clu, bool sync);
Kmods SIG 50e2b3
 unsigned int exfat_find_free_bitmap(struct super_block *sb, unsigned int clu);
Kmods SIG 50e2b3
 int exfat_count_used_clusters(struct super_block *sb, unsigned int *ret_count);
Kmods SIG 50e2b3
diff --git a/src/fatent.c b/src/fatent.c
Kmods SIG 50e2b3
index fd6c7fd127620fc405cff2b5ae2d6fae5be25422..e949e563443c937bc80b13b6cd502a0e0a32c68d 100644
Kmods SIG 50e2b3
--- a/src/fatent.c
Kmods SIG 50e2b3
+++ b/src/fatent.c
Kmods SIG 50e2b3
@@ -320,7 +320,7 @@ int exfat_zeroed_cluster(struct inode *dir, unsigned int clu)
Kmods SIG 50e2b3
 }
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
 int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc,
Kmods SIG 50e2b3
-		struct exfat_chain *p_chain)
Kmods SIG 50e2b3
+		struct exfat_chain *p_chain, bool sync_bmap)
Kmods SIG 50e2b3
 {
Kmods SIG 50e2b3
 	int ret = -ENOSPC;
Kmods SIG 50e2b3
 	unsigned int num_clusters = 0, total_cnt;
Kmods SIG 50e2b3
@@ -388,7 +388,7 @@ int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc,
Kmods SIG 50e2b3
 		}
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
 		/* update allocation bitmap */
Kmods SIG 50e2b3
-		if (exfat_set_bitmap(inode, new_clu)) {
Kmods SIG 50e2b3
+		if (exfat_set_bitmap(inode, new_clu, sync_bmap)) {
Kmods SIG 50e2b3
 			ret = -EIO;
Kmods SIG 50e2b3
 			goto free_cluster;
Kmods SIG 50e2b3
 		}
Kmods SIG 50e2b3
diff --git a/src/inode.c b/src/inode.c
Kmods SIG 50e2b3
index 730373e0965aff2a8c366b34482c61afeec9cd56..1803ef3220fdbd6ca51470b736ca3ab596588fc3 100644
Kmods SIG 50e2b3
--- a/src/inode.c
Kmods SIG 50e2b3
+++ b/src/inode.c
Kmods SIG 50e2b3
@@ -179,7 +179,8 @@ static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset,
Kmods SIG 50e2b3
 			return -EIO;
Kmods SIG 50e2b3
 		}
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
-		ret = exfat_alloc_cluster(inode, num_to_be_allocated, &new_clu);
Kmods SIG 50e2b3
+		ret = exfat_alloc_cluster(inode, num_to_be_allocated, &new_clu,
Kmods SIG 50e2b3
+				inode_needs_sync(inode));
Kmods SIG 50e2b3
 		if (ret)
Kmods SIG 50e2b3
 			return ret;
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
diff --git a/src/namei.c b/src/namei.c
Kmods SIG 50e2b3
index d9e8ec689c55ca3e8511177de0c01dfe1d3c090a..1f7b3dc66fcd6fd5507f9d52d73d01cb69433afd 100644
Kmods SIG 50e2b3
--- a/src/namei.c
Kmods SIG 50e2b3
+++ b/src/namei.c
Kmods SIG 50e2b3
@@ -340,7 +340,7 @@ static int exfat_find_empty_entry(struct inode *inode,
Kmods SIG 50e2b3
 		exfat_chain_set(&clu, last_clu + 1, 0, p_dir->flags);
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
 		/* allocate a cluster */
Kmods SIG 50e2b3
-		ret = exfat_alloc_cluster(inode, 1, &clu);
Kmods SIG 50e2b3
+		ret = exfat_alloc_cluster(inode, 1, &clu, IS_DIRSYNC(inode));
Kmods SIG 50e2b3
 		if (ret)
Kmods SIG 50e2b3
 			return ret;
Kmods SIG 50e2b3
 
Kmods SIG 50e2b3
-- 
Kmods SIG 50e2b3
2.31.1
Kmods SIG 50e2b3