Right now we check for errors on super block in syncfs(). ret2 = errseq_check_and_advance(&sb->s_wb_err, &f.file->f_sb_err); overlayfs does not update sb->s_wb_err and it is tracked on upper filesystem. So provide a superblock operation to check errors so that filesystem can provide override generic method and provide its own method to check for writeback errors. Signed-off-by: Vivek Goyal <vgoyal@xxxxxxxxxx> --- fs/sync.c | 5 ++++- include/linux/fs.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/sync.c b/fs/sync.c index b5fb83a734cd..57e43a16dfca 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -176,7 +176,10 @@ SYSCALL_DEFINE1(syncfs, int, fd) ret = sync_filesystem(sb); up_read(&sb->s_umount); - ret2 = errseq_check_and_advance(&sb->s_wb_err, &f.file->f_sb_err); + if (sb->s_op->errseq_check_advance) + ret2 = sb->s_op->errseq_check_advance(sb, f.file); + else + ret2 = errseq_check_and_advance(&sb->s_wb_err, &f.file->f_sb_err); fdput(f); return ret ? ret : ret2; diff --git a/include/linux/fs.h b/include/linux/fs.h index 8667d0cdc71e..4297b6127adf 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1965,6 +1965,7 @@ struct super_operations { struct shrink_control *); long (*free_cached_objects)(struct super_block *, struct shrink_control *); + int (*errseq_check_advance)(struct super_block *, struct file *); }; /* -- 2.25.4