]> Zhao Yanbai Git Server - minix.git/commitdiff
libfsdriver: clear VM cache only if used 07/3007/1
authorDavid van Moolenbroek <david@minix3.org>
Mon, 22 Jun 2015 11:50:04 +0000 (11:50 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Tue, 23 Jun 2015 14:38:54 +0000 (14:38 +0000)
As part of its built-in mmap emulation support for "none" file system
services, libfsdriver clears the VM cache upon exit.  However, for
trivial file systems which do not even support reading from files, the
the VM cache need to be cleared either.  With this patch, the VM cache
is cleared only when modified, so that such trivial file systems need
not be given CLEARCACHE permission.

Change-Id: I518c092443455302b9b9728f10a3f894d2c8036b

minix/lib/libfsdriver/call.c

index 6b0e78ddb297bf3be9e1b685af62d66acc78806b..f7bb9e50a90f70fca637fc1b61087915859d0d8a 100644 (file)
@@ -3,6 +3,8 @@
 #include <minix/ds.h>
 #include <sys/mman.h>
 
+static int fsdriver_vmcache;   /* have we used the VM cache? */
+
 /*
  * Process a READSUPER request from VFS.
  */
@@ -59,6 +61,7 @@ fsdriver_readsuper(const struct fsdriver * __restrict fdp,
                fsdriver_mounted = TRUE;
                fsdriver_device = dev;
                fsdriver_root = root_node.fn_ino_nr;
+               fsdriver_vmcache = FALSE;
        }
 
        return r;
@@ -77,7 +80,7 @@ fsdriver_unmount(const struct fsdriver * __restrict fdp,
                fdp->fdr_unmount();
 
        /* If we used mmap emulation, clear any cached blocks from VM. */
-       if (fdp->fdr_peek == NULL && major(fsdriver_device) == NONE_MAJOR)
+       if (fsdriver_vmcache)
                vm_clear_cache(fsdriver_device);
 
        /* Update library-local state. */
@@ -256,6 +259,8 @@ builtin_peek(const struct fsdriver * __restrict fdp, ino_t ino_nr,
                    pos, &flags, nbytes, VMSF_ONCE);
 
                if (r == OK) {
+                       fsdriver_vmcache = TRUE;
+
                        dev_off += nbytes;
 
                        r = nbytes;