ceph: Fix race between hole punch and page fault
authorJan Kara <jack@suse.cz>
Thu, 22 Apr 2021 14:38:26 +0000 (16:38 +0200)
committerJan Kara <jack@suse.cz>
Tue, 13 Jul 2021 12:29:01 +0000 (14:29 +0200)
commit057ba5b24532aca202cb1ae8c246bde27de12763
tree3abff803cddcd5ef21b135f6c31cb1d05f908e6a
parent8bcbbe9c7c8e49281fc2e0a6c5455b87c85a9c2a
ceph: Fix race between hole punch and page fault

Ceph has a following race between hole punching and page fault:

CPU1                                  CPU2
ceph_fallocate()
  ...
  ceph_zero_pagecache_range()
                                      ceph_filemap_fault()
                                        faults in page in the range being
                                        punched
  ceph_zero_objects()

And now we have a page in punched range with invalid data. Fix the
problem by using mapping->invalidate_lock similarly to other
filesystems. Note that using invalidate_lock also fixes a similar race
wrt ->readpage().

CC: Jeff Layton <jlayton@kernel.org>
CC: ceph-devel@vger.kernel.org
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/ceph/addr.c
fs/ceph/file.c