1/* 2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 29/* 30 * Copyright (c) 1994 The Regents of the University of California. 31 * Copyright (c) 1994 Jan-Simon Pendry. 32 * All rights reserved. 33 * 34 * This code is derived from software donated to Berkeley by 35 * Jan-Simon Pendry. 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 3. All advertising materials mentioning features or use of this software 46 * must display the following acknowledgement: 47 * This product includes software developed by the University of 48 * California, Berkeley and its contributors. 49 * 4. Neither the name of the University nor the names of its contributors 50 * may be used to endorse or promote products derived from this software 51 * without specific prior written permission. 52 * 53 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 54 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 56 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 57 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 59 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 60 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 61 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 62 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 63 * SUCH DAMAGE. 64 * 65 * @(#)union.h 8.9 (Berkeley) 12/10/94 66 */ 67#ifndef __UNION_UNION_H__ 68#define __UNION_UNION_H__ 69 70#include <sys/appleapiopts.h> 71#include <sys/cdefs.h> 72 73#ifdef __APPLE_API_PRIVATE 74struct union_args { 75 char *target; /* Target of loopback */ 76 int mntflags; /* Options on the mount */ 77}; 78 79#define UNMNT_ABOVE 0x0001 /* Target appears above mount point */ 80#define UNMNT_BELOW 0x0002 /* Target appears below mount point */ 81#define UNMNT_REPLACE 0x0003 /* Target replaces mount point */ 82#ifdef FAULTFS 83#define UNMNT_FAULTIN 0x0004 /* get the files to TOT on lookup */ 84#define UNMNT_OPMASK 0x0007 85#else 86#define UNMNT_OPMASK 0x0003 87#endif 88 89#ifdef BSD_KERNEL_PRIVATE 90 91struct union_mount { 92 struct vnode *um_uppervp; /* */ 93 int um_uppervid; /* vid of upper vnode */ 94 struct vnode *um_lowervp; /* Left unlocked */ 95 int um_lowervid; /* vid of lower vnode */ 96 kauth_cred_t um_cred; /* Credentials of user calling mount */ 97 int um_cmode; /* cmask from mount process */ 98 int um_op; /* Operation mode */ 99 dev_t um_upperdev; /* Upper root node fsid[0]*/ 100}; 101 102 103#define UNION_ABOVE(x) (x->um_op == UNMNT_ABOVE) 104#define UNION_LOWER(x) (x->um_op == UNMNT_BELOW) 105#define UNION_REPLACE(x) (x->um_op == UNMNT_REPLACE) 106#ifdef FAULTFS 107#define UNION_FAULTIN(x) (x->um_op == UNMNT_FAULTIN) 108#else 109#define UNION_FAULTIN(x) (0) 110 111#endif 112 113/* LP64 version of union_args. all pointers 114 * grow when we're dealing with a 64-bit process. 115 * WARNING - keep in sync with union_args 116 */ 117 118struct user_union_args { 119 user_addr_t target; /* Target of loopback */ 120 int mntflags; /* Options on the mount */ 121 char _pad[4]; 122}; 123 124/* 125 * DEFDIRMODE is the mode bits used to create a shadow directory. 126 */ 127#define VRWXMODE (VREAD|VWRITE|VEXEC) 128#define VRWMODE (VREAD|VWRITE) 129#define UN_DIRMODE ((VRWXMODE)|(VRWXMODE>>3)|(VRWXMODE>>6)) 130#define UN_FILEMODE ((VRWMODE)|(VRWMODE>>3)|(VRWMODE>>6)) 131 132/* 133 * A cache of vnode references 134 */ 135struct union_node { 136 LIST_ENTRY(union_node) un_cache; /* Hash chain */ 137 struct vnode *un_vnode; /* Back pointer */ 138 139 struct vnode *un_uppervp; /* overlaying object */ 140 int un_uppervid; /* vid of upper vnode */ 141 off_t un_uppersz; /* size of upper object */ 142 143 struct vnode *un_lowervp; /* underlying object */ 144 int un_lowervid; /* vid of upper vnode */ 145 off_t un_lowersz; /* size of lower object */ 146 147 struct vnode *un_dirvp; /* Parent dir of uppervp */ 148 struct vnode *un_pvp; /* Parent vnode */ 149 150 char *un_path; /* saved component name */ 151 int un_hash; /* saved un_path hash value */ 152 int un_openl; /* # of opens on lowervp */ 153 int un_exclcnt; /* exclusive count */ 154 unsigned int un_flags; 155 mount_t un_mount; 156 struct vnode **un_dircache; /* cached union stack */ 157}; 158 159#define UN_WANT 0x01 /* union node is needed */ 160#define UN_LOCKED 0x02 /* union node is locked */ 161#define UN_CACHED 0x04 /* In union cache */ 162#define UN_TRANSIT 0x08 /* The union node is in creation */ 163#define UN_DELETED 0x10 /* The union node is deleted */ 164#ifdef FAULTFS 165#define UN_FAULTFS 0x80 /* The union node is for faultfs */ 166#endif 167#define UN_DIRENVN 0x100 /* The union node is created for dir enumeration */ 168 169 170#ifdef FAULTFS 171#define UNNODE_FAULTIN(x) ((x->un_flags & UN_FAULTFS)== UN_FAULTFS) 172#else 173#define UNNODE_FAULTIN(x) (0) 174#endif 175/* 176 * Hash table locking flags 177 */ 178 179#define UNVP_WANT 0x01 180#define UNVP_LOCKED 0x02 181 182#define MOUNTTOUNIONMOUNT(mp) ((struct union_mount *)((mp)->mnt_data)) 183#define VTOUNION(vp) ((struct union_node *)(vp)->v_data) 184#define UNIONTOV(un) ((un)->un_vnode) 185#define LOWERVP(vp) (VTOUNION(vp)->un_lowervp) 186#define UPPERVP(vp) (VTOUNION(vp)->un_uppervp) 187#define OTHERVP(vp) (UPPERVP(vp) ? UPPERVP(vp) : LOWERVP(vp)) 188 189 190extern int union_allocvp(struct vnode **, struct mount *, 191 struct vnode *, struct vnode *, 192 struct componentname *, struct vnode *, 193 struct vnode *, int); 194extern int union_freevp(struct vnode *); 195extern struct vnode * union_dircache(struct vnode *, vfs_context_t); 196extern int union_copyfile(struct vnode *, struct vnode *,vfs_context_t ); 197extern int union_copyup(struct union_node *, int, vfs_context_t ); 198extern int union_dowhiteout(struct union_node *, vfs_context_t); 199extern int union_mkshadow(struct union_mount *, struct vnode *, 200 struct componentname *, struct vnode **); 201extern int union_mkwhiteout(struct union_mount *, struct vnode *, 202 struct componentname *, char *); 203extern int union_vn_create(struct vnode **, struct union_node *, mode_t mode, vfs_context_t context); 204extern int union_cn_close(struct vnode *, int, vfs_context_t context); 205extern void union_removed_upper(struct union_node *un); 206extern struct vnode *union_lowervp(struct vnode *); 207extern void union_newsize(struct vnode *, off_t, off_t); 208extern int union_init(struct vfsconf *); 209extern void union_updatevp(struct union_node *, struct vnode *, struct vnode *); 210extern void union_dircache_free(struct union_node *); 211extern int (*union_dircheckp)(struct vnode **, struct fileproc *, vfs_context_t); 212extern int union_faultin_copyup(struct vnode ** uvpp, vnode_t udvp, vnode_t lvp, struct componentname * cnp, vfs_context_t context); 213extern int (**union_vnodeop_p)(void *); 214extern struct vfsops union_vfsops; 215void union_lock(void); 216void union_unlock(void); 217 218#endif /* BSD_KERNEL_PRIVATE */ 219 220#endif /* __APPLE_API_PRIVATE */ 221 222#endif /* __UNION_UNION_H__ */ 223