aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/orangefs/file.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/fs/orangefs/file.c b/fs/orangefs/file.c
index 3a7319a1bfdb..26358efbf794 100644
--- a/fs/orangefs/file.c
+++ b/fs/orangefs/file.c
@@ -528,6 +528,28 @@ static long orangefs_ioctl(struct file *file, unsigned int cmd, unsigned long ar
528 return ret; 528 return ret;
529} 529}
530 530
531static int orangefs_fault(struct vm_fault *vmf)
532{
533 struct file *file = vmf->vma->vm_file;
534 int rc;
535 rc = orangefs_inode_getattr(file->f_mapping->host, 0, 1,
536 STATX_SIZE);
537 if (rc == -ESTALE)
538 rc = -EIO;
539 if (rc) {
540 gossip_err("%s: orangefs_inode_getattr failed, "
541 "rc:%d:.\n", __func__, rc);
542 return rc;
543 }
544 return filemap_fault(vmf);
545}
546
547const struct vm_operations_struct orangefs_file_vm_ops = {
548 .fault = orangefs_fault,
549 .map_pages = filemap_map_pages,
550 .page_mkwrite = filemap_page_mkwrite,
551};
552
531/* 553/*
532 * Memory map a region of a file. 554 * Memory map a region of a file.
533 */ 555 */
@@ -539,12 +561,16 @@ static int orangefs_file_mmap(struct file *file, struct vm_area_struct *vma)
539 (char *)file->f_path.dentry->d_name.name : 561 (char *)file->f_path.dentry->d_name.name :
540 (char *)"Unknown")); 562 (char *)"Unknown"));
541 563
564 if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE))
565 return -EINVAL;
566
542 /* set the sequential readahead hint */ 567 /* set the sequential readahead hint */
543 vma->vm_flags |= VM_SEQ_READ; 568 vma->vm_flags |= VM_SEQ_READ;
544 vma->vm_flags &= ~VM_RAND_READ; 569 vma->vm_flags &= ~VM_RAND_READ;
545 570
546 /* Use readonly mmap since we cannot support writable maps. */ 571 file_accessed(file);
547 return generic_file_readonly_mmap(file, vma); 572 vma->vm_ops = &orangefs_file_vm_ops;
573 return 0;
548} 574}
549 575
550#define mapping_nrpages(idata) ((idata)->nrpages) 576#define mapping_nrpages(idata) ((idata)->nrpages)