X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/4320cf278a525c544cc99cc898c1da5badf7e433..8a9c17f60a0e7f32fa5b6a8e64ec861e61a5246e:/usr/src/sys/miscfs/union/union_subr.c diff --git a/usr/src/sys/miscfs/union/union_subr.c b/usr/src/sys/miscfs/union/union_subr.c index 1149caa319..f71072cb01 100644 --- a/usr/src/sys/miscfs/union/union_subr.c +++ b/usr/src/sys/miscfs/union/union_subr.c @@ -8,7 +8,7 @@ * * %sccs.include.redist.c% * - * @(#)union_subr.c 8.6 (Berkeley) %G% + * @(#)union_subr.c 8.7 (Berkeley) %G% */ #include @@ -22,6 +22,7 @@ #include #include #include +#include /* for vnode_pager_setsize */ #include #ifdef DIAGNOSTIC @@ -127,6 +128,7 @@ union_updatevp(un, uppervp, lowervp) } } un->un_lowervp = lowervp; + un->un_lowersz = VNOVAL; } if (un->un_uppervp != uppervp) { @@ -134,6 +136,7 @@ union_updatevp(un, uppervp, lowervp) vrele(un->un_uppervp); un->un_uppervp = uppervp; + un->un_uppersz = VNOVAL; } if (docache && (ohash != nhash)) { @@ -162,6 +165,47 @@ union_newupper(un, uppervp) union_updatevp(un, uppervp, un->un_lowervp); } +/* + * Keep track of size changes in the underlying vnodes. + * If the size changes, then callback to the vm layer + * giving priority to the upper layer size. + */ +void +union_newsize(vp, uppersz, lowersz) + struct vnode *vp; + off_t uppersz, lowersz; +{ + struct union_node *un; + off_t sz; + + /* only interested in regular files */ + if (vp->v_type != VREG) + return; + + un = VTOUNION(vp); + sz = VNOVAL; + + if ((uppersz != VNOVAL) && (un->un_uppersz != uppersz)) { + un->un_uppersz = uppersz; + if (sz == VNOVAL) + sz = un->un_uppersz; + } + + if ((lowersz != VNOVAL) && (un->un_lowersz != lowersz)) { + un->un_lowersz = lowersz; + if (sz == VNOVAL) + sz = un->un_lowersz; + } + + if (sz != VNOVAL) { +#ifdef UNION_DIAGNOSTIC + printf("union: %s size now %ld\n", + uppersz != VNOVAL ? "upper" : "lower", (long) sz); +#endif + vnode_pager_setsize(vp, sz); + } +} + /* * allocate a union_node/vnode pair. the vnode is * referenced and locked. the new vnode is returned @@ -398,7 +442,9 @@ loop: un = VTOUNION(*vpp); un->un_vnode = *vpp; un->un_uppervp = uppervp; + un->un_uppersz = VNOVAL; un->un_lowervp = lowervp; + un->un_lowersz = VNOVAL; un->un_openl = 0; un->un_flags = UN_LOCKED; if (un->un_uppervp)