tmpfs_subr.c (d241a0e67ff3a44947931bf8c841d9786c59efd7) | tmpfs_subr.c (89f6b8632cc94bca2738b4fcc26e1189ef4f5dde) |
---|---|
1/* $NetBSD: tmpfs_subr.c,v 1.35 2007/07/09 21:10:50 ad Exp $ */ 2 3/*- 4 * Copyright (c) 2005 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Julio M. Merino Vidal, developed as part of Google's Summer of Code --- 24 unchanged lines hidden (view full) --- 33/* 34 * Efficient memory file system supporting functions. 35 */ 36#include <sys/cdefs.h> 37__FBSDID("$FreeBSD$"); 38 39#include <sys/param.h> 40#include <sys/fnv_hash.h> | 1/* $NetBSD: tmpfs_subr.c,v 1.35 2007/07/09 21:10:50 ad Exp $ */ 2 3/*- 4 * Copyright (c) 2005 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Julio M. Merino Vidal, developed as part of Google's Summer of Code --- 24 unchanged lines hidden (view full) --- 33/* 34 * Efficient memory file system supporting functions. 35 */ 36#include <sys/cdefs.h> 37__FBSDID("$FreeBSD$"); 38 39#include <sys/param.h> 40#include <sys/fnv_hash.h> |
41#include <sys/lock.h> |
|
41#include <sys/namei.h> 42#include <sys/priv.h> 43#include <sys/proc.h> | 42#include <sys/namei.h> 43#include <sys/priv.h> 44#include <sys/proc.h> |
45#include <sys/rwlock.h> |
|
44#include <sys/stat.h> 45#include <sys/systm.h> 46#include <sys/sysctl.h> 47#include <sys/vnode.h> 48#include <sys/vmmeter.h> 49 50#include <vm/vm.h> 51#include <vm/vm_param.h> --- 1213 unchanged lines hidden (view full) --- 1265 oldsize = node->tn_size; 1266 oldpages = OFF_TO_IDX(oldsize + PAGE_MASK); 1267 MPASS(oldpages == uobj->size); 1268 newpages = OFF_TO_IDX(newsize + PAGE_MASK); 1269 if (newpages > oldpages && 1270 tmpfs_pages_check_avail(tmp, newpages - oldpages) == 0) 1271 return (ENOSPC); 1272 | 46#include <sys/stat.h> 47#include <sys/systm.h> 48#include <sys/sysctl.h> 49#include <sys/vnode.h> 50#include <sys/vmmeter.h> 51 52#include <vm/vm.h> 53#include <vm/vm_param.h> --- 1213 unchanged lines hidden (view full) --- 1267 oldsize = node->tn_size; 1268 oldpages = OFF_TO_IDX(oldsize + PAGE_MASK); 1269 MPASS(oldpages == uobj->size); 1270 newpages = OFF_TO_IDX(newsize + PAGE_MASK); 1271 if (newpages > oldpages && 1272 tmpfs_pages_check_avail(tmp, newpages - oldpages) == 0) 1273 return (ENOSPC); 1274 |
1273 VM_OBJECT_LOCK(uobj); | 1275 VM_OBJECT_WLOCK(uobj); |
1274 if (newsize < oldsize) { 1275 /* 1276 * Zero the truncated part of the last page. 1277 */ 1278 base = newsize & PAGE_MASK; 1279 if (base != 0) { 1280 idx = OFF_TO_IDX(newsize); 1281retry: 1282 m = vm_page_lookup(uobj, idx); 1283 if (m != NULL) { 1284 if ((m->oflags & VPO_BUSY) != 0 || 1285 m->busy != 0) { 1286 vm_page_sleep(m, "tmfssz"); 1287 goto retry; 1288 } 1289 MPASS(m->valid == VM_PAGE_BITS_ALL); 1290 } else if (vm_pager_has_page(uobj, idx, NULL, NULL)) { 1291 m = vm_page_alloc(uobj, idx, VM_ALLOC_NORMAL); 1292 if (m == NULL) { | 1276 if (newsize < oldsize) { 1277 /* 1278 * Zero the truncated part of the last page. 1279 */ 1280 base = newsize & PAGE_MASK; 1281 if (base != 0) { 1282 idx = OFF_TO_IDX(newsize); 1283retry: 1284 m = vm_page_lookup(uobj, idx); 1285 if (m != NULL) { 1286 if ((m->oflags & VPO_BUSY) != 0 || 1287 m->busy != 0) { 1288 vm_page_sleep(m, "tmfssz"); 1289 goto retry; 1290 } 1291 MPASS(m->valid == VM_PAGE_BITS_ALL); 1292 } else if (vm_pager_has_page(uobj, idx, NULL, NULL)) { 1293 m = vm_page_alloc(uobj, idx, VM_ALLOC_NORMAL); 1294 if (m == NULL) { |
1293 VM_OBJECT_UNLOCK(uobj); | 1295 VM_OBJECT_WUNLOCK(uobj); |
1294 VM_WAIT; | 1296 VM_WAIT; |
1295 VM_OBJECT_LOCK(uobj); | 1297 VM_OBJECT_WLOCK(uobj); |
1296 goto retry; 1297 } else if (m->valid != VM_PAGE_BITS_ALL) { 1298 ma[0] = m; 1299 rv = vm_pager_get_pages(uobj, ma, 1, 0); 1300 m = vm_page_lookup(uobj, idx); 1301 } else 1302 /* A cached page was reactivated. */ 1303 rv = VM_PAGER_OK; 1304 vm_page_lock(m); 1305 if (rv == VM_PAGER_OK) { 1306 vm_page_deactivate(m); 1307 vm_page_unlock(m); 1308 vm_page_wakeup(m); 1309 } else { 1310 vm_page_free(m); 1311 vm_page_unlock(m); 1312 if (ignerr) 1313 m = NULL; 1314 else { | 1298 goto retry; 1299 } else if (m->valid != VM_PAGE_BITS_ALL) { 1300 ma[0] = m; 1301 rv = vm_pager_get_pages(uobj, ma, 1, 0); 1302 m = vm_page_lookup(uobj, idx); 1303 } else 1304 /* A cached page was reactivated. */ 1305 rv = VM_PAGER_OK; 1306 vm_page_lock(m); 1307 if (rv == VM_PAGER_OK) { 1308 vm_page_deactivate(m); 1309 vm_page_unlock(m); 1310 vm_page_wakeup(m); 1311 } else { 1312 vm_page_free(m); 1313 vm_page_unlock(m); 1314 if (ignerr) 1315 m = NULL; 1316 else { |
1315 VM_OBJECT_UNLOCK(uobj); | 1317 VM_OBJECT_WUNLOCK(uobj); |
1316 return (EIO); 1317 } 1318 } 1319 } 1320 if (m != NULL) { 1321 pmap_zero_page_area(m, base, PAGE_SIZE - base); 1322 vm_page_dirty(m); 1323 vm_pager_page_unswapped(m); --- 5 unchanged lines hidden (view full) --- 1329 */ 1330 if (newpages < oldpages) { 1331 swap_pager_freespace(uobj, newpages, oldpages - 1332 newpages); 1333 vm_object_page_remove(uobj, newpages, 0, 0); 1334 } 1335 } 1336 uobj->size = newpages; | 1318 return (EIO); 1319 } 1320 } 1321 } 1322 if (m != NULL) { 1323 pmap_zero_page_area(m, base, PAGE_SIZE - base); 1324 vm_page_dirty(m); 1325 vm_pager_page_unswapped(m); --- 5 unchanged lines hidden (view full) --- 1331 */ 1332 if (newpages < oldpages) { 1333 swap_pager_freespace(uobj, newpages, oldpages - 1334 newpages); 1335 vm_object_page_remove(uobj, newpages, 0, 0); 1336 } 1337 } 1338 uobj->size = newpages; |
1337 VM_OBJECT_UNLOCK(uobj); | 1339 VM_OBJECT_WUNLOCK(uobj); |
1338 1339 TMPFS_LOCK(tmp); 1340 tmp->tm_pages_used += (newpages - oldpages); 1341 TMPFS_UNLOCK(tmp); 1342 1343 node->tn_size = newsize; 1344 vnode_pager_setsize(vp, newsize); 1345 return (0); --- 388 unchanged lines hidden --- | 1340 1341 TMPFS_LOCK(tmp); 1342 tmp->tm_pages_used += (newpages - oldpages); 1343 TMPFS_UNLOCK(tmp); 1344 1345 node->tn_size = newsize; 1346 vnode_pager_setsize(vp, newsize); 1347 return (0); --- 388 unchanged lines hidden --- |