summaryrefslogtreecommitdiff
path: root/fs/afs/file.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2020-10-21 13:22:19 +0100
committerDavid Howells <dhowells@redhat.com>2020-10-29 13:53:04 +0000
commitfa04a40b169fcee615afbae97f71a09332993f64 (patch)
tree3a6123e3b15b9881cd1227f5c129d5e3f8c36732 /fs/afs/file.c
parentd383e346f97d6bb0d654bb3d63c44ab106d92d29 (diff)
afs: Fix to take ref on page when PG_private is set
Fix afs to take a ref on a page when it sets PG_private on it and to drop the ref when removing the flag. Note that in afs_write_begin(), a lot of the time, PG_private is already set on a page to which we're going to add some data. In such a case, we leave the bit set and mustn't increment the page count. As suggested by Matthew Wilcox, use attach/detach_page_private() where possible. Fixes: 31143d5d515e ("AFS: implement basic file write support") Reported-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Diffstat (limited to 'fs/afs/file.c')
-rw-r--r--fs/afs/file.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/fs/afs/file.c b/fs/afs/file.c
index 91225421ad37..322973d12614 100644
--- a/fs/afs/file.c
+++ b/fs/afs/file.c
@@ -627,11 +627,9 @@ static void afs_invalidatepage(struct page *page, unsigned int offset,
#endif
if (PagePrivate(page)) {
- priv = page_private(page);
+ priv = (unsigned long)detach_page_private(page);
trace_afs_page_dirty(vnode, tracepoint_string("inval"),
page->index, priv);
- set_page_private(page, 0);
- ClearPagePrivate(page);
}
}
@@ -661,11 +659,9 @@ static int afs_releasepage(struct page *page, gfp_t gfp_flags)
#endif
if (PagePrivate(page)) {
- priv = page_private(page);
+ priv = (unsigned long)detach_page_private(page);
trace_afs_page_dirty(vnode, tracepoint_string("rel"),
page->index, priv);
- set_page_private(page, 0);
- ClearPagePrivate(page);
}
/* indicate that the page can be released */