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