do_mmap() checks in with the FS
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Jul 2010 19:41:56 +0000 (12:41 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:48 +0000 (17:35 -0700)
kern/src/kfs.c
kern/src/mm.c

index 63da657..21ecdb3 100644 (file)
@@ -593,14 +593,11 @@ int kfs_readdir(struct file *dir, struct dirent *dirent)
  * whatever it needs so that faults can be handled by read_page(), and handle all
  * of the cases of MAP_SHARED, MAP_PRIVATE, whatever.  It also needs to ensure
  * the file is not being mmaped in a way that conflicts with the manner in which
- * the file was opened. */
+ * the file was opened or the file type. */
 int kfs_mmap(struct file *file, struct vm_region *vmr)
 {
-       /* the file is not page-aligned yet, so we need to copy it to fresh pages.
-        * this should only be done once per SHARED file (inode), so only make fresh
-        * copies if people want new ones.  Also note that MAP_PRIVATE does not get
-        * carried through to the underlying file. */
-
+       if (file->f_inode->i_flags & FS_I_FILE)
+               return 0;
        return -1;
 }
 
index a49cc99..c0dac97 100644 (file)
@@ -339,6 +339,13 @@ void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
        vmr->vm_flags = flags;
        vmr->vm_file = file;
        vmr->vm_foff = offset;
+       /* Prep the FS to make sure it can mmap the file.  Slightly weird semantics:
+        * they will have a hole in their VM now. */
+       if (file && file->f_op->mmap(file, vmr)) {
+               destroy_vmr(vmr);
+               set_errno(current_tf, EACCES);  /* not quite */
+               return MAP_FAILED;
+       }
        addr = vmr->vm_base;            /* so we know which pages to populate later */
        vmr = merge_me(vmr);            /* attempts to merge with neighbors */
        /* Fault in pages now if MAP_POPULATE - die on failure.  We want to populate