summaryrefslogtreecommitdiff
path: root/debian/patches/pager-alloc0002-more.patch
blob: 2427acf5166774834bfb3800799a8e3a96be3afd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
From 51782897a736fbbc271b1c924e653ec508310971 Mon Sep 17 00:00:00 2001
From: Justus Winter <justus@gnupg.org>
Date: Sun, 24 Jul 2016 16:35:29 +0200
Subject: [PATCH hurd 2/2] more

---
 console/pager.c | 22 ++++++++--------------
 ext2fs/pager.c  |  2 +-
 fatfs/pager.c   | 21 +++++++++------------
 isofs/pager.c   | 18 +++++++++---------
 4 files changed, 27 insertions(+), 36 deletions(-)

diff --git a/console/pager.c b/console/pager.c
index 05074a7..d60935a 100644
--- a/console/pager.c
+++ b/console/pager.c
@@ -49,12 +49,11 @@ static struct pager_requests *pager_requests;
 void
 pager_clear_user_data (struct user_pager_info *upi)
 {
-  int idx;
+  size_t idx;
 
   for (idx = 0; idx < upi->memobj_npages; idx++)
     if (upi->memobj_pages[idx])
       vm_deallocate (mach_task_self (), upi->memobj_pages[idx], vm_page_size);
-  free (upi);
 }
 
 
@@ -148,21 +147,17 @@ user_pager_create (struct user_pager *user_pager, unsigned int npages,
   error_t err;
   struct user_pager_info *upi;
 
-  upi = calloc (1, sizeof (struct user_pager_info)
-		+ sizeof (vm_address_t) * npages);
-  if (!upi)
+  /* XXX Are the values 1 and MEMORY_OBJECT_COPY_DELAY correct? */
+  user_pager->pager = \
+    pager_create_alloc (sizeof *upi + sizeof (vm_address_t) * npages,
+                        pager_bucket, 1, MEMORY_OBJECT_COPY_DELAY, 0);
+  if (!user_pager->pager)
     return errno;
 
+  upi = pager_get_upi (user_pager->pager);
   upi->memobj_npages = npages;
+  memset (upi->memobj_pages, 0, sizeof (vm_address_t) * npages);
 
-  /* XXX Are the values 1 and MEMORY_OBJECT_COPY_DELAY correct? */
-  user_pager->pager = pager_create (upi, pager_bucket,
-				    1, MEMORY_OBJECT_COPY_DELAY, 0);
-  if (!user_pager->pager)
-    {
-      free (upi);
-      return errno;
-    }
   user_pager->memobj = pager_get_port (user_pager->pager);
   ports_port_deref (user_pager->pager);
 
@@ -182,7 +177,6 @@ user_pager_create (struct user_pager *user_pager, unsigned int npages,
                 VM_INHERIT_NONE);
   if (err)
     {
-      /* UPI will be cleaned up by libpager.  */
       mach_port_deallocate (mach_task_self (), user_pager->memobj);
       return err;
     }
diff --git a/ext2fs/pager.c b/ext2fs/pager.c
index 2ddce68..456b582 100644
--- a/ext2fs/pager.c
+++ b/ext2fs/pager.c
@@ -1323,7 +1323,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot)
 	      return MACH_PORT_NULL;
 	    }
 
-	  upi = pager->upi;
+	  upi = pager_get_upi (pager);
 	  upi->type = FILE_DATA;
 	  upi->node = node;
 	  upi->max_prot = prot;
diff --git a/fatfs/pager.c b/fatfs/pager.c
index 84376bd..bef8dbe 100644
--- a/fatfs/pager.c
+++ b/fatfs/pager.c
@@ -747,8 +747,6 @@ pager_clear_user_data (struct user_pager_info *upi)
       
       diskfs_nrele_light (upi->node);
     }
-  
-  free (upi);
 }
 
 /* This will be called when the ports library wants to drop weak
@@ -839,22 +837,21 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot)
         }
       else
         {
-          struct user_pager_info *upi =
-            malloc (sizeof (struct user_pager_info));
-          upi->type = FILE_DATA;
-          upi->node = node;
-          upi->max_prot = prot;
-          diskfs_nref_light (node);
+          struct user_pager_info *upi;
           node->dn->pager =
-            pager_create (upi, file_pager_bucket, MAY_CACHE,
-                          MEMORY_OBJECT_COPY_DELAY, 0);
-          if (node->dn->pager == 0)
+            pager_create_alloc (sizeof *upi, file_pager_bucket, MAY_CACHE,
+                                MEMORY_OBJECT_COPY_DELAY, 0);
+          if (node->dn->pager == NULL)
             {
               diskfs_nrele_light (node);
-              free (upi);
               pthread_spin_unlock (&node_to_page_lock);
               return MACH_PORT_NULL;
             }
+          upi = pager_get_upi (node->dn->pager);
+          upi->type = FILE_DATA;
+          upi->node = node;
+          upi->max_prot = prot;
+          diskfs_nref_light (node);
 
           right = pager_get_port (node->dn->pager);
           ports_port_deref (node->dn->pager);
diff --git a/isofs/pager.c b/isofs/pager.c
index b4be4e2..42cad8d 100644
--- a/isofs/pager.c
+++ b/isofs/pager.c
@@ -128,7 +128,6 @@ pager_clear_user_data (struct user_pager_info *upi)
       pthread_spin_unlock (&node2pagelock);
       diskfs_nrele_light (upi->np);
     }
-  free (upi);
 }
 
 void
@@ -176,19 +175,20 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot)
   do
     if (!np->dn->fileinfo)
       {
-	upi = malloc (sizeof (struct user_pager_info));
-	upi->type = FILE_DATA;
-	upi->np = np;
-	diskfs_nref_light (np);
-	upi->p = pager_create (upi, pager_bucket, 1,
-			       MEMORY_OBJECT_COPY_DELAY, 0);
-	if (upi->p == 0)
+        struct pager *p;
+        p = pager_create_alloc (sizeof *upi, pager_bucket, 1,
+                                MEMORY_OBJECT_COPY_DELAY, 0);
+	if (p == NULL)
 	  {
 	    diskfs_nrele_light (np);
-	    free (upi);
 	    pthread_spin_unlock (&node2pagelock);
 	    return MACH_PORT_NULL;
 	  }
+	upi = pager_get_upi (p);
+	upi->type = FILE_DATA;
+	upi->np = np;
+	diskfs_nref_light (np);
+	upi->p = p;
 	np->dn->fileinfo = upi;
 	right = pager_get_port (np->dn->fileinfo->p);
 	ports_port_deref (np->dn->fileinfo->p);
-- 
2.8.1