]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: add F_FLUSH_FS_CACHE fcntl
authorBen Gras <ben@minix3.org>
Fri, 28 Feb 2014 15:26:13 +0000 (16:26 +0100)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:14 +0000 (17:05 +0200)
This fcntl requests all cached blocks associated with the minor device
number associated with the regular file are invalidated. If the file
is a block special, invalidate the blocks associated with that minor
device instead.

This is to be used for a test that tests unmapped file-mapped memory
ranges whose blocks are not in the cache and therefore must be fetched
from a FS.

Change-Id: Ide914b2e88413aa90bd731ae587ca06fa5f13ebc

servers/mfs/misc.c
servers/vfs/misc.c
sys/sys/fcntl.h

index 6b0a79d6d2cdbf5fb5c242f7497bdd80535f34e6..b4af8d98ef8cf9ca05e3e16cd6b202ea99057a97 100644 (file)
@@ -39,7 +39,7 @@ int fs_flush()
  * to disk.
  */
   dev_t dev = fs_m_in.REQ_DEV;
-  if(dev == fs_dev) return(EBUSY);
+  if(dev == fs_dev && lmfs_bufs_in_use() > 0) return(EBUSY);
  
   lmfs_flushall();
   lmfs_invalidate(dev);
index d9548cbda17089c5e36844cde7a5ec068b1da70b..7ab76b0722b0d86f970f1045aec6af75847bae3e 100644 (file)
@@ -223,6 +223,24 @@ int do_fcntl(void)
        fl = (O_NOSIGPIPE);
        f->filp_flags = (f->filp_flags & ~fl) | (fcntl_argx & fl);
        break;
+    case F_FLUSH_FS_CACHE:
+    {
+       struct vnode *vn = f->filp_vno;
+       mode_t mode = f->filp_vno->v_mode;
+       if (!super_user) {
+               r = EPERM;
+       } else if (S_ISBLK(mode)) {
+               /* Block device; flush corresponding device blocks. */
+               r = req_flush(vn->v_bfs_e, vn->v_sdev);
+       } else if (S_ISREG(mode) || S_ISDIR(mode)) {
+               /* Directory or regular file; flush hosting FS blocks. */
+               r = req_flush(vn->v_fs_e, vn->v_dev);
+       } else {
+               /* Remaining cases.. Meaning unclear. */
+               r = ENODEV;
+       }
+       break;
+    }
     default:
        r = EINVAL;
   }
index 3c96ad22405448dfbfbae7c2d96ce95cd03a4dfa..6caaf290ec20f79eae843a1f6a5de78aa834c1cc 100644 (file)
@@ -326,6 +326,7 @@ __END_DECLS
 
 #if defined(__minix)
 #define F_FREESP       100
+#define F_FLUSH_FS_CACHE       101     /* invalidate cache on associated FS */
 #endif /* defined(__minix) */
 
 #endif /* !_SYS_FCNTL_H_ */