1/* 2 * Copyright (c) 1999-2008 Apple 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/* 29 * File: ubc.h 30 * Author: Umesh Vaishampayan [umeshv@apple.com] 31 * 05-Aug-1999 umeshv Created. 32 * 33 * Header file for Unified Buffer Cache. 34 * 35 */ 36 37#ifndef _SYS_UBC_INTERNAL_H_ 38#define _SYS_UBC_INTERNAL_H_ 39 40#include <sys/appleapiopts.h> 41#include <sys/types.h> 42#include <sys/kernel_types.h> 43#include <sys/ucred.h> 44#include <sys/vnode.h> 45#include <sys/ubc.h> 46#include <sys/mman.h> 47 48#include <sys/cdefs.h> 49 50#include <kern/locks.h> 51#include <mach/memory_object_types.h> 52 53#include <libkern/crypto/sha1.h> 54 55 56#define UBC_INFO_NULL ((struct ubc_info *) 0) 57 58 59extern struct zone *ubc_info_zone; 60 61/* 62 * Maximum number of vfs clusters per vnode 63 */ 64#define MAX_CLUSTERS CONFIG_MAX_CLUSTERS 65 66#define SPARSE_PUSH_LIMIT 4 /* limit on number of concurrent sparse pushes outside of the cl_lockw */ 67 /* once we reach this limit, we'll hold the lock */ 68 69struct cl_extent { 70 daddr64_t b_addr; 71 daddr64_t e_addr; 72}; 73 74struct cl_wextent { 75 daddr64_t b_addr; 76 daddr64_t e_addr; 77 int io_flags; 78}; 79 80struct cl_readahead { 81 lck_mtx_t cl_lockr; 82 daddr64_t cl_lastr; /* last block read by client */ 83 daddr64_t cl_maxra; /* last block prefetched by the read ahead */ 84 int cl_ralen; /* length of last prefetch */ 85}; 86 87struct cl_writebehind { 88 lck_mtx_t cl_lockw; 89 void * cl_scmap; /* pointer to sparse cluster map */ 90 off_t cl_last_write; /* offset of the end of the last write */ 91 off_t cl_seq_written; /* sequentially written bytes */ 92 int cl_sparse_pushes; /* number of pushes outside of the cl_lockw in progress */ 93 int cl_sparse_wait; /* synchronous push is in progress */ 94 int cl_number; /* number of packed write behind clusters currently valid */ 95 struct cl_wextent cl_clusters[MAX_CLUSTERS]; /* packed write behind clusters */ 96}; 97 98 99struct cs_blob { 100 struct cs_blob *csb_next; 101 cpu_type_t csb_cpu_type; 102 unsigned int csb_flags; 103 off_t csb_base_offset; /* Offset of Mach-O binary in fat binary */ 104 off_t csb_start_offset; /* Blob coverage area start, from csb_base_offset */ 105 off_t csb_end_offset; /* Blob coverage area end, from csb_base_offset */ 106 ipc_port_t csb_mem_handle; 107 vm_size_t csb_mem_size; 108 vm_offset_t csb_mem_offset; 109 vm_address_t csb_mem_kaddr; 110 unsigned char csb_sha1[SHA1_RESULTLEN]; 111 unsigned int csb_sigpup; 112 const char *csb_teamid; 113 unsigned int csb_platform_binary; 114}; 115 116/* 117 * The following data structure keeps the information to associate 118 * a vnode to the correspondig VM objects. 119 */ 120struct ubc_info { 121 memory_object_t ui_pager; /* pager */ 122 memory_object_control_t ui_control; /* VM control for the pager */ 123 vnode_t ui_vnode; /* vnode for this ubc_info */ 124 kauth_cred_t ui_ucred; /* holds credentials for NFS paging */ 125 off_t ui_size; /* file size for the vnode */ 126 uint32_t ui_flags; /* flags */ 127 uint32_t cs_add_gen; /* generation count when csblob was validated */ 128 129 struct cl_readahead *cl_rahead; /* cluster read ahead context */ 130 struct cl_writebehind *cl_wbehind; /* cluster write behind context */ 131 132 struct timespec cs_mtime; /* modify time of file when 133 first cs_blob was loaded */ 134 struct cs_blob *cs_blobs; /* for CODE SIGNING */ 135#if CHECK_CS_VALIDATION_BITMAP 136 void *cs_valid_bitmap; /* right now: used only for signed files on the read-only root volume */ 137 uint64_t cs_valid_bitmap_size; /* Save original bitmap size in case the file size changes. 138 * In the future, we may want to reconsider changing the 139 * underlying bitmap to reflect the new file size changes. 140 */ 141#endif /* CHECK_CS_VALIDATION_BITMAP */ 142}; 143 144/* Defines for ui_flags */ 145#define UI_NONE 0x00000000 /* none */ 146#define UI_HASPAGER 0x00000001 /* has a pager associated */ 147#define UI_INITED 0x00000002 /* newly initialized vnode */ 148#define UI_HASOBJREF 0x00000004 /* hold a reference on object */ 149#define UI_WASMAPPED 0x00000008 /* vnode was mapped */ 150#define UI_ISMAPPED 0x00000010 /* vnode is currently mapped */ 151#define UI_MAPBUSY 0x00000020 /* vnode is being mapped or unmapped */ 152#define UI_MAPWAITING 0x00000040 /* someone waiting for UI_MAPBUSY */ 153#define UI_MAPPEDWRITE 0x00000080 /* it's mapped with PROT_WRITE */ 154 155/* 156 * exported primitives for loadable file systems. 157 */ 158 159__BEGIN_DECLS 160__private_extern__ void ubc_init(void); 161__private_extern__ int ubc_umount(mount_t mp); 162__private_extern__ void ubc_unmountall(void); 163__private_extern__ memory_object_t ubc_getpager(vnode_t); 164__private_extern__ void ubc_destroy_named(vnode_t); 165 166/* internal only */ 167__private_extern__ void cluster_release(struct ubc_info *); 168__private_extern__ uint32_t cluster_max_io_size(mount_t, int); 169__private_extern__ uint32_t cluster_throttle_io_limit(vnode_t, uint32_t *); 170 171 172/* Flags for ubc_getobject() */ 173#define UBC_FLAGS_NONE 0x0000 174#define UBC_HOLDOBJECT 0x0001 175#define UBC_FOR_PAGEOUT 0x0002 176 177memory_object_control_t ubc_getobject(vnode_t, int); 178boolean_t ubc_strict_uncached_IO(vnode_t); 179 180int ubc_info_init(vnode_t); 181int ubc_info_init_withsize(vnode_t, off_t); 182void ubc_info_deallocate(struct ubc_info *); 183 184int ubc_isinuse(vnode_t, int); 185int ubc_isinuse_locked(vnode_t, int, int); 186 187int ubc_getcdhash(vnode_t, off_t, unsigned char *); 188 189__attribute__((pure)) boolean_t ubc_is_mapped(const struct vnode *, boolean_t *writable); 190__attribute__((pure)) boolean_t ubc_is_mapped_writable(const struct vnode *); 191 192#ifdef XNU_KERNEL_PRIVATE 193int UBCINFOEXISTS(const struct vnode *); 194#endif /* XNU_KERNEL_PRIVATE */ 195 196/* code signing */ 197struct cs_blob; 198int ubc_cs_blob_add(vnode_t, cpu_type_t, off_t, vm_address_t, vm_size_t); 199int ubc_cs_sigpup_add(vnode_t, vm_address_t, vm_size_t); 200struct cs_blob *ubc_get_cs_blobs(vnode_t); 201void ubc_get_cs_mtime(vnode_t, struct timespec *); 202int ubc_cs_getcdhash(vnode_t, off_t, unsigned char *); 203kern_return_t ubc_cs_blob_allocate(vm_offset_t *, vm_size_t *); 204void ubc_cs_blob_deallocate(vm_offset_t, vm_size_t); 205 206kern_return_t ubc_cs_validation_bitmap_allocate( vnode_t ); 207void ubc_cs_validation_bitmap_deallocate( vnode_t ); 208__END_DECLS 209 210 211#endif /* _SYS_UBC_INTERNAL_H_ */ 212 213