tmpfs_vfsops.c (3544b0f68f9a5871da78178d65416aee28b30a01) | tmpfs_vfsops.c (f40cb1c6456a66669f6c75d92435b1c1b951387f) |
---|---|
1/* $NetBSD: tmpfs_vfsops.c,v 1.10 2005/12/11 12:24:29 christos 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 --- 36 unchanged lines hidden (view full) --- 45 46#include <sys/param.h> 47#include <sys/limits.h> 48#include <sys/lock.h> 49#include <sys/mutex.h> 50#include <sys/proc.h> 51#include <sys/jail.h> 52#include <sys/kernel.h> | 1/* $NetBSD: tmpfs_vfsops.c,v 1.10 2005/12/11 12:24:29 christos 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 --- 36 unchanged lines hidden (view full) --- 45 46#include <sys/param.h> 47#include <sys/limits.h> 48#include <sys/lock.h> 49#include <sys/mutex.h> 50#include <sys/proc.h> 51#include <sys/jail.h> 52#include <sys/kernel.h> |
53#include <sys/rwlock.h> |
|
53#include <sys/stat.h> 54#include <sys/systm.h> 55#include <sys/sysctl.h> 56 57#include <vm/vm.h> 58#include <vm/vm_object.h> 59#include <vm/vm_param.h> 60 --- 352 unchanged lines hidden (view full) --- 413 /* sbp->f_owner = tmp->tn_uid; */ 414 415 return 0; 416} 417 418static int 419tmpfs_sync(struct mount *mp, int waitfor) 420{ | 54#include <sys/stat.h> 55#include <sys/systm.h> 56#include <sys/sysctl.h> 57 58#include <vm/vm.h> 59#include <vm/vm_object.h> 60#include <vm/vm_param.h> 61 --- 352 unchanged lines hidden (view full) --- 414 /* sbp->f_owner = tmp->tn_uid; */ 415 416 return 0; 417} 418 419static int 420tmpfs_sync(struct mount *mp, int waitfor) 421{ |
422 struct vnode *vp, *mvp; 423 struct vm_object *obj; |
|
421 422 if (waitfor == MNT_SUSPEND) { 423 MNT_ILOCK(mp); 424 mp->mnt_kern_flag |= MNTK_SUSPEND2 | MNTK_SUSPENDED; 425 MNT_IUNLOCK(mp); | 424 425 if (waitfor == MNT_SUSPEND) { 426 MNT_ILOCK(mp); 427 mp->mnt_kern_flag |= MNTK_SUSPEND2 | MNTK_SUSPENDED; 428 MNT_IUNLOCK(mp); |
429 } else if (waitfor == MNT_LAZY) { 430 /* 431 * Handle lazy updates of mtime from writes to mmaped 432 * regions. Use MNT_VNODE_FOREACH_ALL instead of 433 * MNT_VNODE_FOREACH_ACTIVE, since unmap of the 434 * tmpfs-backed vnode does not call vinactive(), due 435 * to vm object type is OBJT_SWAP. 436 */ 437 MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { 438 if (vp->v_type != VREG) { 439 VI_UNLOCK(vp); 440 continue; 441 } 442 obj = vp->v_object; 443 KASSERT((obj->flags & (OBJ_TMPFS_NODE | OBJ_TMPFS)) == 444 (OBJ_TMPFS_NODE | OBJ_TMPFS), ("non-tmpfs obj")); 445 446 /* 447 * Unlocked read, avoid taking vnode lock if 448 * not needed. Lost update will be handled on 449 * the next call. 450 */ 451 if ((obj->flags & OBJ_TMPFS_DIRTY) == 0) { 452 VI_UNLOCK(vp); 453 continue; 454 } 455 if (vget(vp, LK_EXCLUSIVE | LK_RETRY | LK_INTERLOCK, 456 curthread) != 0) 457 continue; 458 tmpfs_check_mtime(vp); 459 vput(vp); 460 } |
|
426 } 427 return (0); 428} 429 430/* 431 * tmpfs vfs operations. 432 */ 433 434struct vfsops tmpfs_vfsops = { 435 .vfs_mount = tmpfs_mount, 436 .vfs_unmount = tmpfs_unmount, 437 .vfs_root = tmpfs_root, 438 .vfs_statfs = tmpfs_statfs, 439 .vfs_fhtovp = tmpfs_fhtovp, 440 .vfs_sync = tmpfs_sync, 441}; 442VFS_SET(tmpfs_vfsops, tmpfs, VFCF_JAIL); | 461 } 462 return (0); 463} 464 465/* 466 * tmpfs vfs operations. 467 */ 468 469struct vfsops tmpfs_vfsops = { 470 .vfs_mount = tmpfs_mount, 471 .vfs_unmount = tmpfs_unmount, 472 .vfs_root = tmpfs_root, 473 .vfs_statfs = tmpfs_statfs, 474 .vfs_fhtovp = tmpfs_fhtovp, 475 .vfs_sync = tmpfs_sync, 476}; 477VFS_SET(tmpfs_vfsops, tmpfs, VFCF_JAIL); |