1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or https://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23 * Copyright (c) 2012, 2015 by Delphix. All rights reserved. 24 * Copyright (c) 2014 Integros [integros.com] 25 * Copyright 2016 Nexenta Systems, Inc. All rights reserved. 26 */ 27 28 #ifndef _FREEBSD_ZFS_SYS_ZNODE_IMPL_H 29 #define _FREEBSD_ZFS_SYS_ZNODE_IMPL_H 30 31 #include <sys/list.h> 32 #include <sys/dmu.h> 33 #include <sys/sa.h> 34 #include <sys/zfs_vfsops.h> 35 #include <sys/rrwlock.h> 36 #include <sys/zfs_sa.h> 37 #include <sys/zfs_stat.h> 38 #include <sys/zfs_rlock.h> 39 #include <sys/zfs_acl.h> 40 #include <sys/zil.h> 41 #include <sys/zfs_project.h> 42 #include <vm/vm_object.h> 43 #include <sys/uio.h> 44 45 #ifdef __cplusplus 46 extern "C" { 47 #endif 48 49 /* 50 * Directory entry locks control access to directory entries. 51 * They are used to protect creates, deletes, and renames. 52 * Each directory znode has a mutex and a list of locked names. 53 */ 54 #define ZNODE_OS_FIELDS \ 55 struct zfsvfs *z_zfsvfs; \ 56 vnode_t *z_vnode; \ 57 char *z_cached_symlink; \ 58 uint64_t z_uid; \ 59 uint64_t z_gid; \ 60 uint64_t z_gen; \ 61 uint64_t z_atime[2]; \ 62 uint64_t z_links; 63 64 #define ZFS_LINK_MAX UINT64_MAX 65 66 /* 67 * ZFS minor numbers can refer to either a control device instance or 68 * a zvol. Depending on the value of zss_type, zss_data points to either 69 * a zvol_state_t or a zfs_onexit_t. 70 */ 71 enum zfs_soft_state_type { 72 ZSST_ZVOL, 73 ZSST_CTLDEV 74 }; 75 76 typedef struct zfs_soft_state { 77 enum zfs_soft_state_type zss_type; 78 void *zss_data; 79 } zfs_soft_state_t; 80 81 /* 82 * Range locking rules 83 * -------------------- 84 * 1. When truncating a file (zfs_create, zfs_setattr, zfs_space) the whole 85 * file range needs to be locked as RL_WRITER. Only then can the pages be 86 * freed etc and zp_size reset. zp_size must be set within range lock. 87 * 2. For writes and punching holes (zfs_write & zfs_space) just the range 88 * being written or freed needs to be locked as RL_WRITER. 89 * Multiple writes at the end of the file must coordinate zp_size updates 90 * to ensure data isn't lost. A compare and swap loop is currently used 91 * to ensure the file size is at least the offset last written. 92 * 3. For reads (zfs_read, zfs_get_data & zfs_putapage) just the range being 93 * read needs to be locked as RL_READER. A check against zp_size can then 94 * be made for reading beyond end of file. 95 */ 96 97 /* 98 * Convert between znode pointers and vnode pointers 99 */ 100 #define ZTOV(ZP) ((ZP)->z_vnode) 101 #define ZTOI(ZP) ((ZP)->z_vnode) 102 #define VTOZ(VP) ((struct znode *)(VP)->v_data) 103 #define VTOZ_SMR(VP) ((znode_t *)vn_load_v_data_smr(VP)) 104 #define ITOZ(VP) ((struct znode *)(VP)->v_data) 105 #define zhold(zp) vhold(ZTOV((zp))) 106 #define zrele(zp) vrele(ZTOV((zp))) 107 108 #define ZTOZSB(zp) ((zp)->z_zfsvfs) 109 #define ITOZSB(vp) (VTOZ(vp)->z_zfsvfs) 110 #define ZTOTYPE(zp) (ZTOV(zp)->v_type) 111 #define ZTOGID(zp) ((zp)->z_gid) 112 #define ZTOUID(zp) ((zp)->z_uid) 113 #define ZTONLNK(zp) ((zp)->z_links) 114 #define Z_ISBLK(type) ((type) == VBLK) 115 #define Z_ISCHR(type) ((type) == VCHR) 116 #define Z_ISLNK(type) ((type) == VLNK) 117 #define Z_ISDIR(type) ((type) == VDIR) 118 119 #define zn_has_cached_data(zp, start, end) \ 120 vn_has_cached_data(ZTOV(zp)) 121 #define zn_flush_cached_data(zp, sync) vn_flush_cached_data(ZTOV(zp), sync) 122 #define zn_rlimit_fsize(size) zfs_rlimit_fsize(size) 123 #define zn_rlimit_fsize_uio(zp, uio) \ 124 vn_rlimit_fsize(ZTOV(zp), GET_UIO_STRUCT(uio), zfs_uio_td(uio)) 125 126 /* Called on entry to each ZFS vnode and vfs operation */ 127 static inline int 128 zfs_enter(zfsvfs_t *zfsvfs, const char *tag) 129 { 130 ZFS_TEARDOWN_ENTER_READ(zfsvfs, tag); 131 if (__predict_false((zfsvfs)->z_unmounted)) { 132 ZFS_TEARDOWN_EXIT_READ(zfsvfs, tag); 133 return (SET_ERROR(EIO)); 134 } 135 return (0); 136 } 137 138 /* Must be called before exiting the vop */ 139 static inline void 140 zfs_exit(zfsvfs_t *zfsvfs, const char *tag) 141 { 142 ZFS_TEARDOWN_EXIT_READ(zfsvfs, tag); 143 } 144 145 /* 146 * Macros for dealing with dmu_buf_hold 147 */ 148 #define ZFS_OBJ_HASH(obj_num) ((obj_num) & (ZFS_OBJ_MTX_SZ - 1)) 149 #define ZFS_OBJ_MUTEX(zfsvfs, obj_num) \ 150 (&(zfsvfs)->z_hold_mtx[ZFS_OBJ_HASH(obj_num)]) 151 #define ZFS_OBJ_HOLD_ENTER(zfsvfs, obj_num) \ 152 mutex_enter(ZFS_OBJ_MUTEX((zfsvfs), (obj_num))) 153 #define ZFS_OBJ_HOLD_TRYENTER(zfsvfs, obj_num) \ 154 mutex_tryenter(ZFS_OBJ_MUTEX((zfsvfs), (obj_num))) 155 #define ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num) \ 156 mutex_exit(ZFS_OBJ_MUTEX((zfsvfs), (obj_num))) 157 158 /* Encode ZFS stored time values from a struct timespec */ 159 #define ZFS_TIME_ENCODE(tp, stmp) \ 160 { \ 161 (stmp)[0] = (uint64_t)(tp)->tv_sec; \ 162 (stmp)[1] = (uint64_t)(tp)->tv_nsec; \ 163 } 164 165 /* Decode ZFS stored time values to a struct timespec */ 166 #define ZFS_TIME_DECODE(tp, stmp) \ 167 { \ 168 (tp)->tv_sec = (time_t)(stmp)[0]; \ 169 (tp)->tv_nsec = (long)(stmp)[1]; \ 170 } 171 #define ZFS_ACCESSTIME_STAMP(zfsvfs, zp) \ 172 if ((zfsvfs)->z_atime && !((zfsvfs)->z_vfs->vfs_flag & VFS_RDONLY)) \ 173 zfs_tstamp_update_setup_ext(zp, ACCESSED, NULL, NULL, B_FALSE); 174 175 extern void zfs_tstamp_update_setup_ext(struct znode *, 176 uint_t, uint64_t [2], uint64_t [2], boolean_t have_tx); 177 extern void zfs_znode_free(struct znode *); 178 179 extern zil_replay_func_t *const zfs_replay_vector[TX_MAX_TYPE]; 180 181 extern int zfs_znode_parent_and_name(struct znode *zp, struct znode **dzpp, 182 char *buf); 183 184 extern int zfs_rlimit_fsize(off_t fsize); 185 #ifdef __cplusplus 186 } 187 #endif 188 189 #endif /* _FREEBSD_SYS_FS_ZFS_ZNODE_H */ 190