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 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by the University of 20 * California, Berkeley and its contributors. 21 * 4. Neither the name of the University nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 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
| 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 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by the University of 20 * California, Berkeley and its contributors. 21 * 4. Neither the name of the University nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 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 $
| 38 * $FreeBSD: head/sys/fs/unionfs/union.h 51688 1999-09-26 20:52:41Z dillon $
|
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 {
| 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;
| 52 struct vnode *um_uppervp; /* UN_ULOCK holds locking state */ 53 struct vnode *um_lowervp; /* Left unlocked */
|
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
| 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#ifndef DIAGNOSTIC 62#define DIAGNOSTIC 63#endif 64
|
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/*
| 65/* 66 * DEFDIRMODE is the mode bits used to create a shadow directory. 67 */ 68#define VRWXMODE (VREAD|VWRITE|VEXEC) 69#define VRWMODE (VREAD|VWRITE) 70#define UN_DIRMODE ((VRWXMODE)|(VRWXMODE>>3)|(VRWXMODE>>6)) 71#define UN_FILEMODE ((VRWMODE)|(VRWMODE>>3)|(VRWMODE>>6)) 72 73/*
|
70 * A cache of vnode references
| 74 * A cache of vnode references (hangs off v_data) 75 * 76 * Placing un_lock as the first elements theoretically allows us to 77 * use the vop_stdlock functions. However, we need to make sure of 78 * certain side effects so we will still punch in our own code.
|
71 */ 72struct union_node {
| 79 */ 80struct union_node {
|
| 81 struct lock un_lock;
|
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 LIST_ENTRY(union_node) un_cache; /* Hash chain */ 83 struct vnode *un_vnode; /* Back pointer */ 84 struct vnode *un_uppervp; /* overlaying object */ 85 struct vnode *un_lowervp; /* underlying object */ 86 struct vnode *un_dirvp; /* Parent dir of uppervp */ 87 struct vnode *un_pvp; /* Parent vnode */ 88 char *un_path; /* saved component name */ 89 int un_hash; /* saved un_path hash value */ 90 int un_openl; /* # of opens on lowervp */
|
| 91 int un_exclcnt; /* exclusive count */
|
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
| 92 unsigned int un_flags; 93 struct vnode **un_dircache; /* cached union stack */ 94 off_t un_uppersz; /* size of upper object */ 95 off_t un_lowersz; /* size of lower object */ 96#ifdef DIAGNOSTIC 97 pid_t un_pid; 98#endif 99}; 100
|
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 */
| 101/* 102 * XXX UN_ULOCK - indicates that the uppervp is locked 103 * 104 * UN_CACHED - node is in the union cache 105 */
|
96
| 106
|
| 107/*#define UN_ULOCK 0x04*/ /* Upper node is locked */ 108#define UN_CACHED 0x10 /* In union cache */ 109 110/* 111 * Hash table locking flags 112 */ 113 114#define UNVP_WANT 0x01 115#define UNVP_LOCKED 0x02 116
|
97extern int union_allocvp __P((struct vnode **, struct mount *,
| 117extern int union_allocvp __P((struct vnode **, struct mount *,
|
98 struct vnode *, struct vnode *,
| 118 struct vnode *, 119 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));
| 120 struct componentname *, struct vnode *, 121 struct vnode *, int)); 122extern int union_freevp __P((struct vnode *)); 123extern struct vnode *union_dircache __P((struct vnode *, struct proc *)); 124extern int union_copyup __P((struct union_node *, int, struct ucred *, 125 struct proc *)); 126extern int union_dowhiteout __P((struct union_node *, struct ucred *, 127 struct proc *)); 128extern int union_mkshadow __P((struct union_mount *, struct vnode *, 129 struct componentname *, struct vnode **)); 130extern int union_mkwhiteout __P((struct union_mount *, struct vnode *, 131 struct componentname *, char *)); 132extern int union_cn_close __P((struct vnode *, int, struct ucred *, 133 struct proc *)); 134extern void union_removed_upper __P((struct union_node *un)); 135extern struct vnode *union_lowervp __P((struct vnode *)); 136extern void union_newsize __P((struct vnode *, off_t, off_t));
|
| 137extern void union_vm_coherency __P((struct vnode *, struct uio *, int));
|
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
| 138 139extern int (*union_dircheckp) __P((struct proc *, struct vnode **, 140 struct file *)); 141 142#define MOUNTTOUNIONMOUNT(mp) ((struct union_mount *)((mp)->mnt_data)) 143#define VTOUNION(vp) ((struct union_node *)(vp)->v_data) 144#define UNIONTOV(un) ((un)->un_vnode) 145#define LOWERVP(vp) (VTOUNION(vp)->un_lowervp) 146#define UPPERVP(vp) (VTOUNION(vp)->un_uppervp) 147#define OTHERVP(vp) (UPPERVP(vp) ? UPPERVP(vp) : LOWERVP(vp)) 148
|
| 149#define UDEBUG(x) if (uniondebug) printf x 150#define UDEBUG_ENABLED 1 151
|
127extern vop_t **union_vnodeop_p; 128extern struct vfsops union_vfsops;
| 152extern vop_t **union_vnodeop_p; 153extern struct vfsops union_vfsops;
|
| 154extern int uniondebug; 155
|
129#endif /* KERNEL */
| 156#endif /* KERNEL */
|