tools, bsd: complete implementation of discard_file_cache
authorChristoph Egger <Christoph.Egger@amd.com>
Thu, 16 Dec 2010 18:21:56 +0000 (18:21 +0000)
committerChristoph Egger <Christoph.Egger@amd.com>
Thu, 16 Dec 2010 18:21:56 +0000 (18:21 +0000)
attached patch completes discard_file_cache() for NetBSD.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxc/xc_netbsd.c

index 47f84853edc61994218b2f69104d6ca5e85054d4..41cfa63e49efad71fa52473dba74fe8b4abca1be 100644 (file)
@@ -280,11 +280,36 @@ int xc_evtchn_unmask(int xce_handle, evtchn_port_t port)
 /* Optionally flush file to disk and discard page cache */
 void discard_file_cache(xc_interface *xch, int fd, int flush) 
 {
+    off_t cur = 0;
+    int saved_errno = errno;
 
     if ( flush && (fsync(fd) < 0) )
     {
         /*PERROR("Failed to flush file: %s", strerror(errno));*/
+        goto out;
     }
+
+    /*
+     * Calculate last page boundry of amount written so far
+     * unless we are flushing in which case entire cache
+     * is discarded.
+     */
+    if ( !flush )
+    {
+        if ( ( cur = lseek(fd, 0, SEEK_CUR)) == (off_t)-1 )
+            cur = 0;
+        cur &= ~(PAGE_SIZE - 1);
+    }
+
+    /* Discard from the buffer cache. */
+    if ( posix_fadvise(fd, 0, cur, POSIX_FADV_DONTNEED) < 0 )
+    {
+        /*PERROR("Failed to discard cache: %s", strerror(errno));*/
+        goto out;
+    }
+
+ out:
+    errno = saved_errno;
 }
 
 grant_entry_v1_t *xc_gnttab_map_table_v1(