Home | History | Annotate | Download | only in union
History log of /src/sys/fs/union/union_vnops.c
RevisionDateAuthorComments
 1.84  02-Sep-2025  dholland onionfs: Fix deadlock in link

Don't relookup the destination name with the source vnode locked.
This is both an ordering inversion and can lead to finding and locking
another reference to the same vnode if another process does the same
link operation.

See tech-kern posting of 20250902 for further analysis.
 1.83  19-Mar-2022  hannken As FSTRANS is part of VOP_*LOCK() since June 4, 2017 the vdead_check()
from union_lock() is no longer needed.

Adapt union_lock() to the recent addition of upgrade or downgrade.

VV_LOCKSWORK now.
 1.82  10-Dec-2021  andvar s/unaccessible/inaccessible/
 1.81  10-Dec-2021  hannken Fix previous, don't copy up if the underlying node is unreadable.
 1.80  05-Dec-2021  hannken In union_access() copy up regular files before checking permissions.

Unionfs is meant to provide a writable layer above a read-only layer
and should not fail here just because the lower layer is mounted
read-only.
 1.79  20-Oct-2021  thorpej Overhaul of the EVFILT_VNODE kevent(2) filter:

- Centralize vnode kevent handling in the VOP_*() wrappers, rather than
forcing each individual file system to deal with it (except VOP_RENAME(),
because VOP_RENAME() is a mess and we currently have 2 different ways
of handling it; at least it's reasonably well-centralized in the "new"
way).
- Add support for NOTE_OPEN, NOTE_CLOSE, NOTE_CLOSE_WRITE, and NOTE_READ,
compatible with the same events in FreeBSD.
- Track which kevent notifications clients are interested in receiving
to avoid doing work for events no one cares about (avoiding, e.g.
taking locks and traversing the klist to send a NOTE_WRITE when
someone is merely watching for a file to be deleted, for example).

In support of the above:

- Add support in vnode_if.sh for specifying PRE- and POST-op handlers,
to be invoked before and after vop_pre() and vop_post(), respectively.
Basic idea from FreeBSD, but implemented differently.
- Add support in vnode_if.sh for specifying CONTEXT fields in the
vop_*_args structures. These context fields are used to convey information
between the file system VOP function and the VOP wrapper, but do not
occupy an argument slot in the VOP_*() call itself. These context fields
are initialized and subsequently interpreted by PRE- and POST-op handlers.
- Version VOP_REMOVE(), uses the a context field for the file system to report
back the resulting link count of the target vnode. Return this in tmpfs,
udf, nfs, chfs, ext2fs, lfs, and ufs.

NetBSD 9.99.92.
 1.78  04-Jul-2021  hannken Fix union_parsepath(), either the upper or the lower dvp may be NULL.
 1.77  29-Jun-2021  dholland Now remove cn_consume from struct componentname.

This change requires a kernel bump.

Note though that I'm not going to version the VOP_LOOKUP args
structure (or any other args structure) as code that doesn't touch
cn_consume doesn't need attention and code that does will fail on it
without further intervention.
 1.76  29-Jun-2021  dholland Onionfs needs to know about parsepath too, in case it has one of the
other cases underneath it.

The solution here is not really very good (take the longer
path-to-consume if they're different) but it will serve for the cases
that exist.

(If we were to add a fs that really uses different naming semantics,
we'd have to take additional steps; probably it doesn't make sense to
allow unionfs to union such a thing with a normal fs and attempting it
should fail at mount time.)

Update fs/unionfs as well to avoid increasing the current set of
compile failures there. Though maybe it's time to just remove
fs/unionfs.
 1.75  29-Jun-2021  dholland - Add a new vnode op: VOP_PARSEPATH.
- Move namei_getcomponent to genfs_vnops.c and call it genfs_parsepath.
- Add a parsepath entry to every vnode ops table.

VOP_PARSEPATH takes a directory vnode to be searched and a complete
following path and chooses how much of that path to consume. To begin
with, all parsepath calls are genfs_parsepath, which locates the first
'/' as always.

Note that the call doesn't take the whole struct componentname, only
the string. The other bits of struct componentname should not be
needed and there's no reason to cause potential complications by
exposing them.
 1.74  18-Aug-2020  hannken branches: 1.74.6;
Operation union_readdirhook() stores the lower directory as un_uppervp.
This breaks the assumption that un_uppervp->v_mount is the upper mount.

Fix by storing the directory as un_lowervp and adapt union_readdir().

Should fix PR kern/55552: panic with union mount
 1.73  16-May-2020  christos Add ACL support for FFS. From FreeBSD.
 1.72  23-Feb-2020  ad UVM locking changes, proposed on tech-kern:

- Change the lock on uvm_object, vm_amap and vm_anon to be a RW lock.
- Break v_interlock and vmobjlock apart. v_interlock remains a mutex.
- Do partial PV list locking in the x86 pmap. Others to follow later.
 1.71  17-Jan-2020  ad VFS_VGET(), VFS_ROOT(), VFS_FHTOVP(): give them a "int lktype" argument, to
allow us to get shared locks (or no lock) on the returned vnode. Matches
FreeBSD.
 1.70  26-May-2017  riastradh branches: 1.70.10; 1.70.14; 1.70.16;
Make VOP_RECLAIM do the last unlock of the vnode.

VOP_RECLAIM naturally has exclusive access to the vnode, so having it
locked on entry is not strictly necessary -- but it means if there
are any final operations that must be done on the vnode, such as
ffs_update, requiring exclusive access to it, we can now kassert that
the vnode is locked in those operations.

We can't just have the caller release the last lock because some file
systems don't use genfs_lock, and require the vnode to remain valid
for VOP_UNLOCK to work, notably unionfs.
 1.69  24-May-2017  hannken Use VCALL() to lock or unlock the lower node.
 1.68  07-May-2017  hannken Move v_writecount adjustment from revoke to reclaim.
 1.67  26-Apr-2017  riastradh branches: 1.67.2;
Change VOP_REMOVE and VOP_RMDIR to preserve lock/ref on dvp.

No change to vp -- the plan is to replace the node by the
componentname in the vop parameters, and let all directory vops do
lookups internally.

Proposed on tech-kern with no objections:
https://mail-index.netbsd.org/tech-kern/2017/04/17/msg021825.html
 1.66  17-Apr-2017  hannken Remove unused argument "nextp" from vfs_busy() and vfs_unbusy().
Remove argument "keepref" from vfs_unbusy() and add vfs_ref() where needed.
 1.65  11-Apr-2017  riastradh Make VOP_INACTIVE preserve vnode lock on return.

Discussed on tech-kern:
https://mail-index.netbsd.org/tech-kern/2017/04/01/msg021751.html

Ride 7.99.68, a bumpy bus of incremental vfs improvements!
 1.64  06-Mar-2017  hannken Handle v_writecount from union_open(), union_close() and union_revoke()
so lower file system vnodes get marked as open for writing.
 1.63  20-Apr-2015  riastradh branches: 1.63.2; 1.63.4;
Make VOP_LINK return directory still locked and referenced.

Ride 7.99.10 bump.
 1.62  25-Jul-2014  dholland branches: 1.62.4;
Add VOP_FALLOCATE and VOP_FDISCARD to every vnode ops table I can
find.

The filesystem ones all call genfs_eopnotsupp - right now I am only
implementing the plumbing and we can implement fallocate and/or
fdiscard for files later.

The device ones call spec_fallocate (which is also genfs_eopnotsupp)
and spec_fdiscard, which dispatches to the device-level op.

The fifo ones all call vn_fifo_bypass, which also ends up being
EOPNOTSUPP.
 1.61  17-May-2014  dholland Also set or assert that *vpp is null before calling VOP_MKDIR.
 1.60  17-May-2014  dholland Set *vpp to NULL before calling VOP_CREATE. This always happens when
calling using nameidata, and if not something went wrong, so we'd like
to be able to assert about it.
 1.59  24-Mar-2014  hannken branches: 1.59.2;
- Make VI_XLOCK, VI_CLEAN and VI_LOCKSHARE private to kern/vfs_*.c.
- Make vwait() static.
- Add vdead_check() to check a vnode for being or becoming dead.

Discussed on tech-kern.

Welcome to 6.99.38
 1.58  12-Mar-2014  hannken Restructure union_lock() to always lock before testing for dead node.
Add two little helpers to lock or unlock a node. Use "vp" for the
union node and "lockvp" for the node to be locked. Use ISSET() to
test flags, add assertions.
 1.57  27-Feb-2014  hannken The current implementation of vn_lock() is racy. Modification of
the vnode operations vector for active vnodes is unsafe because it
is not known whether deadfs or the original file system will be
called.

- Pass down LK_RETRY to the lock operation (hint for deadfs only).

- Change deadfs lock operation to return ENOENT if LK_RETRY is unset.

- Change all other lock operations to check for dead vnode once
the vnode is locked and unlock and return ENOENT in this case.

With these changes in place vnode lock operations will never succeed
after vclean() has marked the vnode as VI_XLOCK and before vclean()
has changed the operations vector.

Adresses PR kern/37706 (Forced unmount of file systems is unsafe)

Discussed on tech-kern.

Welcome to 6.99.33
 1.56  16-Feb-2014  hannken Change union_allocvp() to take an unlocked uppervp and to return the
union node unlocked. Another VI_XLOCK hack is gone.
 1.55  13-Feb-2014  martin Remove an unused variable
 1.54  13-Feb-2014  hannken Get rid of UN_KLOCK to keep a lock on vput(). It is not really needed
and makes the source difficult to read. Always hold references to the
union nodes until the operation is done.
 1.53  13-Feb-2014  hannken Fix the DOT and DOTDOT case for union_lookup1().
 1.52  07-Feb-2014  hannken Change vnode operation lookup to return the resulting vnode *vpp unlocked.
Change cache_lookup() to return an unlocked vnode.

Discussed on tech-kern@

Welcome to 6.99.31
 1.51  23-Jan-2014  hannken Change vnode operations create, mknod, mkdir and symlink to return
the resulting vnode *vpp unlocked.

Discussed on tech-kern@

Welcome to 6.99.30
 1.50  17-Jan-2014  hannken Change vnode operations create, mknod, mkdir and symlink to keep the
directory node dvp locked on return.

Discussed on tech-kern@

Welcome to 6.99.29
 1.49  21-Nov-2011  hannken branches: 1.49.8; 1.49.12;
Replace flag based union node locking with generic vnode lock, support
shared and nowait locks and protect un_uppervp and un_*sz with mutex.

Mark file system MPSAFE.
 1.48  14-Nov-2011  hannken VOP_ABORTOP() has no specific lock requirements so there is no need
to force locked vnodes here. It should be impossible to come here
with a nil upper node.

Relock the directory vnode after copyup. A locked union node with an
unlocked upper vnode can no longer exist so make FIXUP() an assertion.
 1.47  18-Oct-2011  hannken branches: 1.47.2;
VOP_GETATTR() needs a shared lock at least.
 1.46  23-Aug-2011  hannken Stop abusing relookup() to prepare the creation of new nodes
in the upper layer.
Replace union_relookup() with union_do_lookup() that prepares
a component, calls VOP_LOOKUP() and does the EEXIST test.
 1.45  12-Aug-2011  hannken Change some `#ifdef DIAGNOSTIC' to `KASSERT'.
Instead of a `pid_t' use a `lwp_t *' for locking diagnostics.

No functional changes intended.
 1.44  12-Aug-2011  hannken Add missing parts to mount devices from a union file system:
- union_close() has to lock/unlock the lower vnode.
- union_fsync() has to call spec_fsync() for the union vnode.
- union_strategy() must allow writes to devices on the lower file system.
- union_bwrite() was completely missing.
 1.43  10-Aug-2011  hannken For devices, sockets and fifos ignore setting the file size to zero to make
open(..., O_TRUNC) happy and allow them to write through the lower layer.

Fixes PR #43560 (writing to null device in unionfs fails)
 1.42  07-Aug-2011  hannken Change union rmdir semantics to fail directory removal for
non-empty directories like all other file systems do.

Change test accordingly.
 1.41  05-Aug-2011  hannken When union_lookup() creates a shadow directory and nameiop is not LOOKUP
it has to restart the lookup to get the componentname right.

Fixes PR #44383 (an endless stream of whiteout and opaque dir problems ...)
 1.40  12-Jun-2011  rmind Welcome to 5.99.53! Merge rmind-uvmplock branch:

- Reorganize locking in UVM and provide extra serialisation for pmap(9).
New lock order: [vmpage-owner-lock] -> pmap-lock.

- Simplify locking in some pmap(9) modules by removing P->V locking.

- Use lock object on vmobjlock (and thus vnode_t::v_interlock) to share
the locks amongst UVM objects where necessary (tmpfs, layerfs, unionfs).

- Rewrite and optimise x86 TLB shootdown code, make it simpler and cleaner.
Add TLBSTATS option for x86 to collect statistics about TLB shootdowns.

- Unify /dev/mem et al in MI code and provide required locking (removes
kernel-lock on some ports). Also, avoid cache-aliasing issues.

Thanks to Andrew Doran and Joerg Sonnenberger, as their initial patches
formed the core changes of this branch.
 1.39  02-Jan-2011  dholland branches: 1.39.6;
Remove the special refcount behavior (adding an extra reference to the
parent dir) associated with SAVESTART in relookup().

Check all call sites to make sure that SAVESTART wasn't set while
calling relookup(); if it was, adjust the refcount behavior. Remove
related references to SAVESTART.

The only code that was reaching the extra ref was msdosfs_rename,
where the refcount behavior was already fairly broken and/or gross;
repair it.

Add a dummy 4th argument to relookup to make sure code that hasn't
been inspected won't compile. (This will go away next time the
relookup semantics change, which they will.)
 1.38  02-Jul-2010  hannken LK_INTERLOCK is no longer a valid flag for VOP_LOCK().
 1.37  01-Jul-2010  hannken Remove vlockmgr(). Generic vnode lock operations now use a rwlock located
in the vnode. All LK_* flags move from sys/lock.h to sys/vnode.h. Calls
to vlockmgr() in file systems get replaced with VOP_LOCK() or VOP_UNLOCK().

Welcome to 5.99.34.

Discussed on tech-kern.
 1.36  24-Jun-2010  hannken Clean up vnode lock operations pass 2:

VOP_UNLOCK(vp, flags) -> VOP_UNLOCK(vp): Remove the unneeded flags argument.

Welcome to 5.99.32.

Discussed on tech-kern.
 1.35  01-May-2010  pooka Return correct value from union_islocked.
(XXX: anything asserting LK_SHARED will fail because union doesn't
support shared locks)
 1.34  08-Jan-2010  pooka branches: 1.34.2; 1.34.4;
The VATTR_NULL/VREF/VHOLD/HOLDRELE() macros lost their will to live
years ago when the kernel was modified to not alter ABI based on
DIAGNOSTIC, and now just call the respective function interfaces
(in lowercase). Plenty of mix'n match upper/lowercase has creeped
into the tree since then. Nuke the macros and convert all callsites
to lowercase.

no functional change
 1.33  06-May-2008  ad PR kern/38141 lookup/vfs_busy acquire rwlock recursively

Simplify the mount locking. Remove all the crud to deal with recursion on
the mount lock, and crud to deal with unmount as another weirdo lock.

Hopefully this will once and for all fix the deadlocks with this. With this
commit there are two locks on each mount:

- krwlock_t mnt_unmounting. This is used to prevent unmount across critical
sections like getnewvnode(). It's only ever read locked with rw_tryenter(),
and is only ever write locked in dounmount(). A write hold can't be taken
on this lock if the current LWP could hold a vnode lock.

- kmutex_t mnt_updating. This is taken by threads updating the mount, for
example when going r/o -> r/w, and is only present to serialize updates.
In order to take this lock, a read hold must first be taken on
mnt_unmounting, and the two need to be held across the operation.

One effect of this change: previously if an unmount failed, we would make a
half hearted attempt to back out of it gracefully, but that was unlikely to
work in a lot of cases. Now while an unmount that will be aborted is in
progress, new file operations within the mount will fail instead of being
delayed. That is unlikely to be a problem though, because if the admin
requests unmount of a file system then s(he) has made a decision to deny
access to the resource.
 1.32  30-Apr-2008  ad PR kern/38135 vfs_busy/vfs_trybusy confusion

The previous fix worked, but it opened a window where mounts could have
disappeared from mountlist while the caller was traversing it using
vfs_trybusy(). Fix that.
 1.31  29-Apr-2008  ad kern/38135 vfs_busy/vfs_trybusy confusion

The symptom was that sometimes file systems would occasionally not appear
in output from 'df' or 'mount' if the system was busy. Resolution:

- Make mount locks work somewhat like vm_map locks.
- vfs_trybusy() now only fails if the mount is gone, or if someone is
unmounting the file system. Simple contention on mnt_lock doesn't
cause it to fail.
- vfs_busy() will wait even if the file system is being unmounted.
 1.30  27-Feb-2008  matt branches: 1.30.2; 1.30.4;
Convert to ansi definitions from old-style definitons.
 1.29  09-Feb-2008  dholland branches: 1.29.2; 1.29.6;
Restore a fragment of a comment that apparently got lost in a merge slipup
in 1998.
 1.28  30-Jan-2008  ad PR kern/37706 (forced unmount of file systems is unsafe):

- Do reference counting for 'struct mount'. Each vnode associated with a
mount takes a reference, and in turn the mount takes a reference to the
vfsops.
- Now that mounts are reference counted, replace the overcomplicated mount
locking inherited from 4.4BSD with a recursable rwlock.
 1.27  25-Jan-2008  ad Remove VOP_LEASE. Discussed on tech-kern.
 1.26  16-Jan-2008  ad union_putpages: fix a locking botch.
 1.25  02-Jan-2008  ad Merge vmlocking2 to head.
 1.24  08-Dec-2007  pooka branches: 1.24.4;
Remove cn_lwp from struct componentname. curlwp should be used
from on. The NDINIT() macro no longer takes the lwp parameter and
associates the credentials of the calling thread with the namei
structure.
 1.23  26-Nov-2007  pooka branches: 1.23.2;
Remove the "struct lwp *" argument from all VFS and VOP interfaces.
The general trend is to remove it from all kernel interfaces and
this is a start. In case the calling lwp is desired, curlwp should
be used.

quick consensus on tech-kern
 1.22  10-Oct-2007  ad branches: 1.22.4;
Merge from vmlocking:

- Split vnode::v_flag into three fields, depending on field locking.
- simple_lock -> kmutex in a few places.
- Fix some simple locking problems.
 1.21  29-Jul-2007  pooka branches: 1.21.4; 1.21.6; 1.21.8; 1.21.10;
apply ketchup to vop_mmap_args comment
 1.20  16-Apr-2007  chs branches: 1.20.2;
define a pager flag PGO_RECLAIM, similar to FSYNC_RECLAIM, and use it
to skip unnecessary flushing when layered file system vnodes are recycled.
this also prevents a deadlock with the dodgy LFS putpages routine.
fixes the non-LFS part of PR 36150.
 1.19  04-Feb-2007  chs branches: 1.19.2; 1.19.6; 1.19.8;
more fixes for the new vnode locking scheme:
- don't use SAVESTART in calls to relookup() from unionfs,
just vref() the desired vnode when we need to.
- fix locking and refcounting in the unionfs EEXIST error cases.
- release any vnode locks before calling VFS_ROOT(), vfs_busy() is enough.
this allows us to simplify union_root() and fix PR 3006.
- union_lock() doesn't handle shared lock requests correctly,
so convert them to exclusive instead. fixes PR 34775.
- in relookup(), avoid reusing "dp" for different purposes,
the error handling wasn't right. (actually just get rid of dp.)
also, change relookup() to ignore LOCKLEAF and always return the
vnode locked since the callers already expect this.
 1.18  09-Dec-2006  chs a smorgasbord of improvements to vnode locking and path lookup:
- LOCKPARENT is no longer relevant for lookup(), relookup() or VOP_LOOKUP().
these now always return the parent vnode locked. namei() works as before.
lookup() and various other paths no longer acquire vnode locks in the
wrong order via vrele(). fixes PR 32535.
as a nice side effect, path lookup is also up to 25% faster.
- the above allows us to get rid of PDIRUNLOCK.
- also get rid of WANTPARENT (just use LOCKPARENT and unlock it).
- remove an assumption in layer_node_find() that all file systems implement
a recursive VOP_LOCK() (unionfs doesn't).
- require that all file systems supply vfs_vptofh and vfs_fhtovp routines.
fill in eopnotsupp() for file systems that don't support being exported
and remove the checks for NULL. (layerfs calls these without checking.)
- in union_lookup1(), don't change refcounts in the ISDOTDOT case, just
adjust which vnode is locked. fixes PR 33374.
- apply fixes for ufs_rename() from ufs_vnops.c rev. 1.61 to ext2fs_rename().
 1.17  29-Sep-2006  christos branches: 1.17.2;
Coverity CID 2960: Don't print NULL vnode (from Arnaud Lacombe)
 1.16  14-May-2006  elad branches: 1.16.8; 1.16.10;
integrate kauth.
 1.15  15-Apr-2006  christos Coverity CID 1001: Avoid NULL deref.
 1.14  11-Dec-2005  christos branches: 1.14.4; 1.14.6; 1.14.8; 1.14.10; 1.14.12;
merge ktrace-lwp.
 1.13  02-Nov-2005  yamt branches: 1.13.2;
merge yamt-vop branch. remove following VOPs.

VOP_BLKATOFF
VOP_VALLOC
VOP_BALLOC
VOP_REALLOCBLKS
VOP_VFREE
VOP_TRUNCATE
VOP_UPDATE
 1.12  30-Aug-2005  xtraeme branches: 1.12.2;
Remove __P()
 1.11  26-Feb-2005  perry branches: 1.11.4;
nuke trailing whitespace
 1.10  27-Apr-2004  jrf branches: 1.10.4; 1.10.6;
First pass for some caddr_t removal and changes to get rid of it where we
no longer use and/or need it

- removed casts from unionfs, deadfs and fdesc
(there are more to hunt down still)
- changed vfs_quotactl args argumet from caddr_t to void *
- changed vfs_quotactl structures/callers to reflect the api change

Compiled fine and ran for about a day. Approved/reviewed by
christos@netbsd.org and gimpy@netbsd.org.
 1.9  21-Apr-2004  christos Replace the statfs() family of system calls with statvfs().
Retain binary compatibility.
 1.8  25-Jan-2004  hannken Make VOP_STRATEGY(bp) a real VOP as discussed on tech-kern.

VOP_STRATEGY(bp) is replaced by one of two new functions:

- VOP_STRATEGY(vp, bp) Call the strategy routine of vp for bp.
- DEV_STRATEGY(bp) Call the d_strategy routine of bp->b_dev for bp.

DEV_STRATEGY(bp) is used only for block-to-block device situations.
 1.7  07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22364, verified by myself.
 1.6  29-Jun-2003  fvdl branches: 1.6.2;
Back out the lwp/ktrace changes. They contained a lot of colateral damage,
and need to be examined and discussed more.
 1.5  29-Jun-2003  thorpej Undo part of the ktrace/lwp changes. In particular:
* Remove the "lwp *" argument that was added to vget(). Turns out
that nothing actually used it!
* Remove the "lwp *" arguments that were added to VFS_ROOT(), VFS_VGET(),
and VFS_FHTOVP(); all they did was pass it to vget() (which, as noted
above, didn't use it).
* Remove all of the "lwp *" arguments to internal functions that were added
just to appease the above.
 1.4  29-Jun-2003  thorpej Fix problems with Darren's ktrace/lwp changes.
 1.3  29-Jun-2003  darrenr More changes for providing lwpid for ktrace (sparc GENERIC built)
 1.2  17-Mar-2003  jdolecek add kqueue support
 1.1  16-Mar-2003  jdolecek move union filesystem code from sys/miscfs/union to sys/fs/union
 1.6.2.8  10-Nov-2005  skrll Sync with HEAD. Here we go again...
 1.6.2.7  04-Mar-2005  skrll Sync with HEAD.

Hi Perry!
 1.6.2.6  27-Oct-2004  skrll Fix various comments that describe the argument structures
 1.6.2.5  21-Sep-2004  skrll Fix the sync with head I botched.
 1.6.2.4  18-Sep-2004  skrll Sync with HEAD.
 1.6.2.3  24-Aug-2004  skrll Undo part of the ktrace/lwp changes. In particular:
* Remove the "lwp *" argument that was added to vget(). Turns out
that nothing actually used it!
* Remove the "lwp *" arguments that were added to VFS_ROOT(), VFS_VGET(),
and VFS_FHTOVP(); all they did was pass it to vget() (which, as noted
above, didn't use it).
* Remove all of the "lwp *" arguments to internal functions that were added
just to appease the above.
 1.6.2.2  03-Aug-2004  skrll Sync with HEAD
 1.6.2.1  03-Jul-2003  wrstuden LWP-ify union fs.

Note: These changes suffer from the same cnp->cn_lwp issue noted for
ufs. They will need to get fixed at the same time as ufs. The fix is to
add struct lwp * as a parameter to some VOPs.

Note also that most of the cn_lwp references used to be cn_proc references,
so if cnp->cn_lwp is bad to use, unionfs's been naughty for quite some
time.
 1.10.6.1  19-Mar-2005  yamt sync with head. xen and whitespace. xen part is not finished.
 1.10.4.1  29-Apr-2005  kent sync with -current
 1.11.4.10  17-Mar-2008  yamt sync with head.
 1.11.4.9  11-Feb-2008  yamt sync with head.
 1.11.4.8  04-Feb-2008  yamt sync with head.
 1.11.4.7  21-Jan-2008  yamt sync with head
 1.11.4.6  07-Dec-2007  yamt sync with head
 1.11.4.5  27-Oct-2007  yamt sync with head.
 1.11.4.4  03-Sep-2007  yamt sync with head.
 1.11.4.3  26-Feb-2007  yamt sync with head.
 1.11.4.2  30-Dec-2006  yamt sync with head.
 1.11.4.1  21-Jun-2006  yamt sync with head.
 1.12.2.1  20-Oct-2005  yamt adapt union.
 1.13.2.2  19-Nov-2005  yamt - finish reverting VOP_READ prototype changes.
- remove unused variables.
- fix typos.
some of them are pointed by Juan RP.
 1.13.2.1  15-Nov-2005  yamt - adapt to the new prototype of VOP_READ.
- adapt ext2fs and union.
 1.14.12.1  24-May-2006  tron Merge 2006-05-24 NetBSD-current into the "peter-altq" branch.
 1.14.10.3  06-May-2006  christos - Move kauth_cred_t declaration to <sys/types.h>
- Cleanup struct ucred; forward declarations that are unused.
- Don't include <sys/kauth.h> in any header, but include it in the c files
that need it.

Approved by core.
 1.14.10.2  19-Apr-2006  elad sync with head.
 1.14.10.1  08-Mar-2006  elad Adapt to kernel authorization KPI.
 1.14.8.1  24-May-2006  yamt sync with head.
 1.14.6.2  01-Jun-2006  kardel Sync with head.
 1.14.6.1  22-Apr-2006  simonb Sync with head.
 1.14.4.1  09-Sep-2006  rpaulo sync with head
 1.16.10.2  10-Dec-2006  yamt sync with head.
 1.16.10.1  22-Oct-2006  yamt sync with head
 1.16.8.3  09-Feb-2007  ad Sync with HEAD.
 1.16.8.2  12-Jan-2007  ad Sync with head.
 1.16.8.1  18-Nov-2006  ad Sync with head.
 1.17.2.2  16-Apr-2007  bouyer Pull up following revision(s) (requested by chs in ticket #577):
sys/kern/vfs_subr.c: revision 1.287
sys/fs/union/union_vnops.c: revision 1.20
sys/miscfs/genfs/layer_vnops.c: revision 1.30
sys/uvm/uvm_pager.h: revision 1.35
define a pager flag PGO_RECLAIM, similar to FSYNC_RECLAIM, and use it
to skip unnecessary flushing when layered file system vnodes are recycled.
this also prevents a deadlock with the dodgy LFS putpages routine.
fixes the non-LFS part of PR 36150.
 1.17.2.1  17-Feb-2007  tron Apply patch (requested by chs in ticket #422):
- Fix various deadlock problems with nullfs and unionfs.
- Speed up path lookups by upto 25%.
 1.19.8.1  11-Jul-2007  mjf Sync with head.
 1.19.6.5  16-Sep-2007  ad Checkpoint work in progress on the vnode lifecycle and reference counting
stuff. This makes it work properly without kernel_lock and fixes a few
quite old bugs. See vfs_subr.c 1.283.2.17 for details.
 1.19.6.4  20-Aug-2007  ad Sync with HEAD.
 1.19.6.3  17-Jun-2007  ad - Increase the number of thread priorities from 128 to 256. How the space
is set up is to be revisited.
- Implement soft interrupts as kernel threads. A generic implementation
is provided, with hooks for fast-path MD code that can run the interrupt
threads over the top of other threads executing in the kernel.
- Split vnode::v_flag into three fields, depending on how the flag is
locked (by the interlock, by the vnode lock, by the file system).
- Miscellaneous locking fixes and improvements.
 1.19.6.2  08-Jun-2007  ad Sync with head.
 1.19.6.1  05-Apr-2007  ad Compile fixes.
 1.19.2.1  07-May-2007  yamt sync with head.
 1.20.2.1  15-Aug-2007  skrll Sync with HEAD.
 1.21.10.2  29-Jul-2007  pooka apply ketchup to vop_mmap_args comment
 1.21.10.1  29-Jul-2007  pooka file union_vnops.c was added on branch matt-mips64 on 2007-07-29 13:12:43 +0000
 1.21.8.1  14-Oct-2007  yamt sync with head.
 1.21.6.3  23-Mar-2008  matt sync with HEAD
 1.21.6.2  09-Jan-2008  matt sync with HEAD
 1.21.6.1  06-Nov-2007  matt sync with HEAD
 1.21.4.3  09-Dec-2007  jmcneill Sync with HEAD.
 1.21.4.2  27-Nov-2007  joerg Sync with HEAD. amd64 Xen support needs testing.
 1.21.4.1  26-Oct-2007  joerg Sync with HEAD.

Follow the merge of pmap.c on i386 and amd64 and move
pmap_init_tmp_pgtbl into arch/x86/x86/pmap.c. Modify the ACPI wakeup
code to restore CR4 before jumping back into kernel space as the large
page option might cover that.
 1.22.4.3  18-Feb-2008  mjf Sync with HEAD.
 1.22.4.2  27-Dec-2007  mjf Sync with HEAD.
 1.22.4.1  08-Dec-2007  mjf Sync with HEAD.
 1.23.2.3  26-Dec-2007  ad Sync with head.
 1.23.2.2  10-Dec-2007  ad - Don't drain the vnode lock in vclean(); reference counting and XLOCK
should be enough.
- LK_SETRECURSE is gone.
 1.23.2.1  04-Dec-2007  ad Pull the vmlocking changes into a new branch.
 1.24.4.2  19-Jan-2008  bouyer Sync with HEAD
 1.24.4.1  02-Jan-2008  bouyer Sync with HEAD
 1.29.6.2  02-Jun-2008  mjf Sync with HEAD.
 1.29.6.1  03-Apr-2008  mjf Sync with HEAD.
 1.29.2.1  24-Mar-2008  keiichi sync with head.
 1.30.4.3  11-Aug-2010  yamt sync with head.
 1.30.4.2  11-Mar-2010  yamt sync with head
 1.30.4.1  16-May-2008  yamt sync with head.
 1.30.2.1  18-May-2008  yamt sync with head.
 1.34.4.5  19-May-2011  rmind Implement sharing of vnode_t::v_interlock amongst vnodes:
- Lock is shared amongst UVM objects using uvm_obj_setlock() or getnewvnode().
- Adjust vnode cache to handle unsharing, add VI_LOCKSHARE flag for that.
- Use sharing in tmpfs and layerfs for underlying object.
- Simplify locking in ubc_fault().
- Sprinkle some asserts.

Discussed with ad@.
 1.34.4.4  05-Mar-2011  rmind sync with head
 1.34.4.3  03-Jul-2010  rmind sync with head
 1.34.4.2  30-May-2010  rmind sync with head
 1.34.4.1  16-Mar-2010  rmind Change struct uvm_object::vmobjlock to be dynamically allocated with
mutex_obj_alloc(). It allows us to share the locks among UVM objects.
 1.34.2.1  17-Aug-2010  uebayasi Sync with HEAD.
 1.39.6.1  23-Jun-2011  cherry Catchup with rmind-uvmplock merge.
 1.47.2.2  22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.47.2.1  17-Apr-2012  yamt sync with head
 1.49.12.1  18-May-2014  rmind sync with head
 1.49.8.2  03-Dec-2017  jdolecek update from HEAD
 1.49.8.1  20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.59.2.1  10-Aug-2014  tls Rebase.
 1.62.4.2  28-Aug-2017  skrll Sync with HEAD
 1.62.4.1  06-Jun-2015  skrll Sync with HEAD
 1.63.4.1  21-Apr-2017  bouyer Sync with HEAD
 1.63.2.2  26-Apr-2017  pgoyette Sync with HEAD
 1.63.2.1  20-Mar-2017  pgoyette Sync with HEAD
 1.67.2.1  11-May-2017  pgoyette Sync with HEAD
 1.70.16.2  29-Feb-2020  ad Sync with head.
 1.70.16.1  17-Jan-2020  ad Sync with head.
 1.70.14.1  27-Aug-2020  martin Pull up following revision(s) (requested by hannken in ticket #1062):

sys/fs/union/union.h: revision 1.30
sys/fs/union/union_subr.c: revision 1.79
sys/fs/union/union_vnops.c: revision 1.74

Operation union_readdirhook() stores the lower directory as un_uppervp.
This breaks the assumption that un_uppervp->v_mount is the upper mount.

Fix by storing the directory as un_lowervp and adapt union_readdir().

Should fix PR kern/55552: panic with union mount
 1.70.10.1  08-Apr-2020  martin Merge changes from current as of 20200406
 1.74.6.1  01-Aug-2021  thorpej Sync with HEAD.

RSS XML Feed