[PATCH 00/10] AFS fixes

David Howells
2020-10-27T13:50:14Z

Here's a set of fixes for AFS:

(1) Fix copy_file_range() to an afs file now returning EINVAL if the
splice_write file op isn't supplied.

(2) Fix a deref-before-check in afs_unuse_cell().

(3) Fix a use-after-free in afs_xattr_get_acl().

(4) Fix afs to not try to clear PG_writeback when laundering a page.

(5) Fix afs to take a ref on a page that it sets PG_private on and to drop
that ref when clearing PG_private.

(6) Fix a page leak if write_begin() fails.

(7) Fix afs_write_begin() to not alter the dirty region info stored in
page->private, but rather do this in afs_write_end() instead when we
know what we actually changed.

(8) Fix afs_invalidatepage() to alter the dirty region info on a page when
partial page invalidation occurs so that we don't inadvertantly
include a span of zeros that will get written back if a page gets
laundered due to a remote 3rd-party induced invalidation.

We mustn't, however, reduce the dirty region if the page has been seen
to be mapped (ie. we got called through the page_mkwrite vector) as
the page might still be mapped and we might lose data if the file is
extended again.

To aid (8), two additional patches are included:

(*) Wrap the manipulations of the dirty region info stored in
page->private into helper functions.

(*) Alter the encoding of the dirty region so that the region bounds can
be stored with one fewer bit, making a bit available for the
indication of mappedness.

The patches can be found here:

https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/log/?h=afs-fixes

David
---
Dan Carpenter (1):
afs: Fix a use after free in afs_xattr_get_acl()

David Howells (9):
afs: Fix copy_file_range()
afs: Fix tracing deref-before-check
afs: Fix afs_launder_page to not clear PG_writeback
afs: Fix to take ref on page when PG_private is set
afs: Fix page leak on afs_write_begin() failure
afs: Fix where page->private is set during write
afs: Wrap page->private manipulations in inline functions
afs: Alter dirty range encoding in page->private
afs: Fix afs_invalidatepage to adjust the dirty region

fs/afs/cell.c | 3 +-
fs/afs/dir.c | 3 ++
fs/afs/dir_edit.c | 1 +
fs/afs/file.c | 74 ++++++++++++++++++++++++-----
fs/afs/internal.h | 41 ++++++++++++++++
fs/afs/write.c | 95 ++++++++++++++++++++++----------------
fs/afs/xattr.c | 2 +-
include/linux/page-flags.h | 1 +
include/trace/events/afs.h | 20 ++------
9 files changed, 171 insertions(+), 69 deletions(-)