about summary refs log tree commit diff
path: root/nscd
diff options
context:
space:
mode:
Diffstat (limited to 'nscd')
-rw-r--r--nscd/grpcache.c9
-rw-r--r--nscd/hstcache.c9
-rw-r--r--nscd/nscd.c5
-rw-r--r--nscd/nscd.h3
-rw-r--r--nscd/pwdcache.c9
5 files changed, 29 insertions, 6 deletions
diff --git a/nscd/grpcache.c b/nscd/grpcache.c
index 7315eece61..d07693f1a4 100644
--- a/nscd/grpcache.c
+++ b/nscd/grpcache.c
@@ -291,8 +291,13 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
 	{
 	  /* If necessary, we also propagate the data to disk.  */
 	  if (db->persistent)
-	    // XXX async OK?
-	    msync (dataset, total + n, MS_ASYNC);
+	    {
+	      // XXX async OK?
+	      uintptr_t pval = (uintptr_t) dataset & ~pagesize_m1;
+	      msync ((void *) pval,
+		     ((uintptr_t) dataset & pagesize_m1) + total + n,
+		     MS_ASYNC);
+	    }
 
 	  /* Now get the lock to safely insert the records.  */
 	  pthread_rwlock_rdlock (&db->lock);
diff --git a/nscd/hstcache.c b/nscd/hstcache.c
index 94568d0d2b..78e29fb3d1 100644
--- a/nscd/hstcache.c
+++ b/nscd/hstcache.c
@@ -332,8 +332,13 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
 	{
 	  /* If necessary, we also propagate the data to disk.  */
 	  if (db->persistent)
-	    // XXX async OK?
-	    msync (dataset, total + req->key_len, MS_ASYNC);
+	    {
+	      // XXX async OK?
+	      uintptr_t pval = (uintptr_t) dataset & ~pagesize_m1;
+	      msync ((void *) pval,
+		     ((uintptr_t) dataset & pagesize_m1)
+		     + total + req->key_len, MS_ASYNC);
+	    }
 
 	  addr_list_type = (hst->h_length == NS_INADDRSZ
 			    ? GETHOSTBYADDR : GETHOSTBYADDRv6);
diff --git a/nscd/nscd.c b/nscd/nscd.c
index f6b22d4179..5c5c15598b 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -76,6 +76,8 @@ static const char *conffile = _PATH_NSCDCONF;
 
 time_t start_time;
 
+uintptr_t pagesize_m1;
+
 static int check_pid (const char *file);
 static int write_pid (const char *file);
 
@@ -155,6 +157,9 @@ main (int argc, char **argv)
   /* Remember when we started.  */
   start_time = time (NULL);
 
+  /* Determine page size.  */
+  pagesize_m1 = getpagesize () - 1;
+
   /* Behave like a daemon.  */
   if (go_background)
     {
diff --git a/nscd/nscd.h b/nscd/nscd.h
index 910fba33be..d32f5fed47 100644
--- a/nscd/nscd.h
+++ b/nscd/nscd.h
@@ -124,6 +124,9 @@ extern const size_t block_align;
    means unlimited.  */
 extern unsigned int reload_count;
 
+/* Pagesize minus one.  */
+extern uintptr_t pagesize_m1;
+
 /* Prototypes for global functions.  */
 
 /* nscd.c */
diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c
index b3227785ae..2354b6d78a 100644
--- a/nscd/pwdcache.c
+++ b/nscd/pwdcache.c
@@ -287,8 +287,13 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
 	{
 	  /* If necessary, we also propagate the data to disk.  */
 	  if (db->persistent)
-	    // XXX async OK?
-	    msync (dataset, total + n, MS_ASYNC);
+	    {
+	      // XXX async OK?
+	      uintptr_t pval = (uintptr_t) dataset & ~pagesize_m1;
+	      msync ((void *) pval,
+		     ((uintptr_t) dataset & pagesize_m1) + total + n,
+		     MS_ASYNC);
+	    }
 
 	  /* Now get the lock to safely insert the records.  */
 	  pthread_rwlock_rdlock (&db->lock);