Deleted Added
sdiff udiff text old ( 50477 ) new ( 51688 )
full compact
1/*
2 * Copyright (c) 1994 The Regents of the University of California.
3 * Copyright (c) 1994 Jan-Simon Pendry.
4 * All rights reserved.
5 *
6 * This code is derived from software donated to Berkeley by
7 * Jan-Simon Pendry.
8 *

--- 21 unchanged lines hidden (view full) ---

30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 * @(#)union.h 8.9 (Berkeley) 12/10/94
38 * $FreeBSD: head/sys/fs/unionfs/union.h 50477 1999-08-28 01:08:13Z peter $
39 */
40
41struct union_args {
42 char *target; /* Target of loopback */
43 int mntflags; /* Options on the mount */
44};
45
46#define UNMNT_ABOVE 0x0001 /* Target appears below mount point */
47#define UNMNT_BELOW 0x0002 /* Target appears below mount point */
48#define UNMNT_REPLACE 0x0003 /* Target replaces mount point */
49#define UNMNT_OPMASK 0x0003
50
51struct union_mount {
52 struct vnode *um_uppervp;
53 struct vnode *um_lowervp;
54 struct ucred *um_cred; /* Credentials of user calling mount */
55 int um_cmode; /* cmask from mount process */
56 int um_op; /* Operation mode */
57};
58
59#ifdef KERNEL
60
61/*
62 * DEFDIRMODE is the mode bits used to create a shadow directory.
63 */
64#define VRWXMODE (VREAD|VWRITE|VEXEC)
65#define VRWMODE (VREAD|VWRITE)
66#define UN_DIRMODE ((VRWXMODE)|(VRWXMODE>>3)|(VRWXMODE>>6))
67#define UN_FILEMODE ((VRWMODE)|(VRWMODE>>3)|(VRWMODE>>6))
68
69/*
70 * A cache of vnode references
71 */
72struct union_node {
73 LIST_ENTRY(union_node) un_cache; /* Hash chain */
74 struct vnode *un_vnode; /* Back pointer */
75 struct vnode *un_uppervp; /* overlaying object */
76 struct vnode *un_lowervp; /* underlying object */
77 struct vnode *un_dirvp; /* Parent dir of uppervp */
78 struct vnode *un_pvp; /* Parent vnode */
79 char *un_path; /* saved component name */
80 int un_hash; /* saved un_path hash value */
81 int un_openl; /* # of opens on lowervp */
82 unsigned int un_flags;
83 struct vnode **un_dircache; /* cached union stack */
84 off_t un_uppersz; /* size of upper object */
85 off_t un_lowersz; /* size of lower object */
86#ifdef DIAGNOSTIC
87 pid_t un_pid;
88#endif
89};
90
91#define UN_WANT 0x01
92#define UN_LOCKED 0x02
93#define UN_ULOCK 0x04 /* Upper node is locked */
94#define UN_KLOCK 0x08 /* Keep upper node locked on vput */
95#define UN_CACHED 0x10 /* In union cache */
96
97extern int union_allocvp __P((struct vnode **, struct mount *,
98 struct vnode *, struct vnode *,
99 struct componentname *, struct vnode *,
100 struct vnode *, int));
101extern int union_freevp __P((struct vnode *));
102extern struct vnode *union_dircache __P((struct vnode *, struct proc *));
103extern int union_copyup __P((struct union_node *, int, struct ucred *,
104 struct proc *));
105extern int union_dowhiteout __P((struct union_node *, struct ucred *,
106 struct proc *));
107extern int union_mkshadow __P((struct union_mount *, struct vnode *,
108 struct componentname *, struct vnode **));
109extern int union_mkwhiteout __P((struct union_mount *, struct vnode *,
110 struct componentname *, char *));
111extern int union_cn_close __P((struct vnode *, int, struct ucred *,
112 struct proc *));
113extern void union_removed_upper __P((struct union_node *un));
114extern struct vnode *union_lowervp __P((struct vnode *));
115extern void union_newsize __P((struct vnode *, off_t, off_t));
116
117extern int (*union_dircheckp) __P((struct proc *, struct vnode **,
118 struct file *));
119
120#define MOUNTTOUNIONMOUNT(mp) ((struct union_mount *)((mp)->mnt_data))
121#define VTOUNION(vp) ((struct union_node *)(vp)->v_data)
122#define UNIONTOV(un) ((un)->un_vnode)
123#define LOWERVP(vp) (VTOUNION(vp)->un_lowervp)
124#define UPPERVP(vp) (VTOUNION(vp)->un_uppervp)
125#define OTHERVP(vp) (UPPERVP(vp) ? UPPERVP(vp) : LOWERVP(vp))
126
127extern vop_t **union_vnodeop_p;
128extern struct vfsops union_vfsops;
129#endif /* KERNEL */