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 ---