]> www.infradead.org Git - users/hch/misc.git/commitdiff
exfat: limit log print for IO error
authorChi Zhiling <chizhiling@kylinos.cn>
Fri, 15 Aug 2025 09:32:45 +0000 (17:32 +0800)
committerNamjae Jeon <linkinjeon@kernel.org>
Tue, 30 Sep 2025 04:34:42 +0000 (13:34 +0900)
For exFAT filesystems with 4MB read_ahead_size, removing the storage device
when the read operation is in progress, which cause the last read syscall
spent 150s [1]. The main reason is that exFAT generates excessive log
messages [2].

After applying this patch, approximately 300,000 lines of log messages
were suppressed, and the delay of the last read() syscall was reduced
to about 4 seconds.

[1]:
write(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 <0.000120>
read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 <0.000032>
write(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 <0.000119>
read(4, 0x7fccf28ae000, 131072)         = -1 EIO (Input/output error) <150.186215>

[2]:
[  333.696603] exFAT-fs (vdb): error, failed to access to FAT (entry 0x0000d780, err:-5)
[  333.697378] exFAT-fs (vdb): error, failed to access to FAT (entry 0x0000d780, err:-5)
[  333.698156] exFAT-fs (vdb): error, failed to access to FAT (entry 0x0000d780, err:-5)

Signed-off-by: Chi Zhiling <chizhiling@kylinos.cn>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/exfat/fatent.c

index 232cc7f8ab92fcf2a13a9392f07c328864cdc6a1..825083634ba2da4a763aa9853601045363212797 100644 (file)
@@ -89,35 +89,36 @@ int exfat_ent_get(struct super_block *sb, unsigned int loc,
        int err;
 
        if (!is_valid_cluster(sbi, loc)) {
-               exfat_fs_error(sb, "invalid access to FAT (entry 0x%08x)",
+               exfat_fs_error_ratelimit(sb,
+                       "invalid access to FAT (entry 0x%08x)",
                        loc);
                return -EIO;
        }
 
        err = __exfat_ent_get(sb, loc, content);
        if (err) {
-               exfat_fs_error(sb,
+               exfat_fs_error_ratelimit(sb,
                        "failed to access to FAT (entry 0x%08x, err:%d)",
                        loc, err);
                return err;
        }
 
        if (*content == EXFAT_FREE_CLUSTER) {
-               exfat_fs_error(sb,
+               exfat_fs_error_ratelimit(sb,
                        "invalid access to FAT free cluster (entry 0x%08x)",
                        loc);
                return -EIO;
        }
 
        if (*content == EXFAT_BAD_CLUSTER) {
-               exfat_fs_error(sb,
+               exfat_fs_error_ratelimit(sb,
                        "invalid access to FAT bad cluster (entry 0x%08x)",
                        loc);
                return -EIO;
        }
 
        if (*content != EXFAT_EOF_CLUSTER && !is_valid_cluster(sbi, *content)) {
-               exfat_fs_error(sb,
+               exfat_fs_error_ratelimit(sb,
                        "invalid access to FAT (entry 0x%08x) bogus content (0x%08x)",
                        loc, *content);
                return -EIO;