From 3be0477f5a86bc54b8a1a7ad794c62a2f128c2de Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 25 Jun 2020 14:46:07 +0200 Subject: [PATCH] ANDROID: Incremental fs: fix up attempt to copy structures with READ/WRITE_ONCE READ/WRITE_ONCE are for atomic data types, not for structures. Fix this up by doing a memcpy to make it explicit just how messy this copy is... This fixes a build error on 5.8-rc1, as things are more strict, odds are it's also wrong in other kernel versions as well... Cc: Daniel Mentz Cc: Paul Lawrence Signed-off-by: Greg Kroah-Hartman Change-Id: I7ecd3d05bd94c936dd5e69c63028458786f37a78 --- fs/incfs/vfs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c index 410b7239c17b..ee581dea17a1 100644 --- a/fs/incfs/vfs.c +++ b/fs/incfs/vfs.c @@ -605,8 +605,11 @@ static ssize_t log_read(struct file *f, char __user *buf, size_t len, reads_to_collect = min_t(ssize_t, rl_size, reads_to_collect); while (reads_to_collect > 0) { - struct read_log_state next_state = READ_ONCE(log_state->state); - int reads_collected = incfs_collect_logged_reads( + struct read_log_state next_state; + int reads_collected; + + memcpy(&next_state, &log_state->state, sizeof(next_state)); + reads_collected = incfs_collect_logged_reads( mi, &next_state, reads_buf, min_t(ssize_t, reads_to_collect, reads_per_page)); if (reads_collected <= 0) { @@ -625,7 +628,7 @@ static ssize_t log_read(struct file *f, char __user *buf, size_t len, goto out; } - WRITE_ONCE(log_state->state, next_state); + memcpy(&log_state->state, &next_state, sizeof(next_state)); total_reads_collected += reads_collected; buf += reads_collected * sizeof(*reads_buf); reads_to_collect -= reads_collected;