diff options
author | David Howells <dhowells@redhat.com> | 2017-11-02 15:27:52 +0000 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2017-11-13 15:38:21 +0000 |
commit | 1cf7a1518aefa69ac6ba0c3f9206073e4221e3c8 (patch) | |
tree | 17788e9c0e145c336761adedf27460daccc76887 /fs/afs/file.c | |
parent | 4343d00872e1de9a470d951bf09bdd18bc73f555 (diff) | |
download | blackbird-obmc-linux-1cf7a1518aefa69ac6ba0c3f9206073e4221e3c8.tar.gz blackbird-obmc-linux-1cf7a1518aefa69ac6ba0c3f9206073e4221e3c8.zip |
afs: Implement shared-writeable mmap
Implement shared-writeable mmap for AFS.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/file.c')
-rw-r--r-- | fs/afs/file.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/fs/afs/file.c b/fs/afs/file.c index c3a7bc1281f5..675c5c268a52 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -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; +} |