diff options
| -rw-r--r-- | fs/orangefs/file.c | 30 |
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 | ||
| 531 | static 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 | |||
| 547 | const 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) |
