afs: Implement shared-writeable mmap
Implement shared-writeable mmap for AFS. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include <linux/task_io_accounting_ops.h>
|
||||
#include "internal.h"
|
||||
|
||||
static int afs_file_mmap(struct file *file, struct vm_area_struct *vma);
|
||||
static int afs_readpage(struct file *file, struct page *page);
|
||||
static void afs_invalidatepage(struct page *page, unsigned int offset,
|
||||
unsigned int length);
|
||||
@@ -34,7 +35,7 @@ const struct file_operations afs_file_operations = {
|
||||
.llseek = generic_file_llseek,
|
||||
.read_iter = generic_file_read_iter,
|
||||
.write_iter = afs_file_write,
|
||||
.mmap = generic_file_readonly_mmap,
|
||||
.mmap = afs_file_mmap,
|
||||
.splice_read = generic_file_splice_read,
|
||||
.fsync = afs_fsync,
|
||||
.lock = afs_lock,
|
||||
@@ -61,6 +62,12 @@ const struct address_space_operations afs_fs_aops = {
|
||||
.writepages = afs_writepages,
|
||||
};
|
||||
|
||||
static const struct vm_operations_struct afs_vm_ops = {
|
||||
.fault = filemap_fault,
|
||||
.map_pages = filemap_map_pages,
|
||||
.page_mkwrite = afs_page_mkwrite,
|
||||
};
|
||||
|
||||
/*
|
||||
* Discard a pin on a writeback key.
|
||||
*/
|
||||
@@ -629,3 +636,16 @@ static int afs_releasepage(struct page *page, gfp_t gfp_flags)
|
||||
_leave(" = T");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle setting up a memory mapping on an AFS file.
|
||||
*/
|
||||
static int afs_file_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = generic_file_mmap(file, vma);
|
||||
if (ret == 0)
|
||||
vma->vm_ops = &afs_vm_ops;
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user