aboutsummaryrefslogtreecommitdiff
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);