1 /* 2 * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of version 2 of the GNU General Public License as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it would be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11 * 12 * Further, this software is distributed without any warranty that it is 13 * free of the rightful claim of any third person regarding infringement 14 * or the like. Any license provided herein, whether implied or 15 * otherwise, applies only to this software file. Patent licenses, if 16 * any, provided herein do not apply to combinations of this program with 17 * other software, or any other product whatsoever. 18 * 19 * You should have received a copy of the GNU General Public License along 20 * with this program; if not, write the Free Software Foundation, Inc., 59 21 * Temple Place - Suite 330, Boston MA 02111-1307, USA. 22 * 23 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 24 * Mountain View, CA 94043, or: 25 * 26 * http://www.sgi.com 27 * 28 * For further information regarding this notice, see: 29 * 30 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ 31 */ 32 #ifndef __XFS_DIR_SF_H__ 33 #define __XFS_DIR_SF_H__ 34 35 /* 36 * Directory layout when stored internal to an inode. 37 * 38 * Small directories are packed as tightly as possible so as to 39 * fit into the literal area of the inode. 40 */ 41 42 typedef struct { __uint8_t i[sizeof(xfs_ino_t)]; } xfs_dir_ino_t; 43 44 /* 45 * The parent directory has a dedicated field, and the self-pointer must 46 * be calculated on the fly. 47 * 48 * Entries are packed toward the top as tight as possible. The header 49 * and the elements much be memcpy'd out into a work area to get correct 50 * alignment for the inode number fields. 51 */ 52 typedef struct xfs_dir_shortform { 53 struct xfs_dir_sf_hdr { /* constant-structure header block */ 54 xfs_dir_ino_t parent; /* parent dir inode number */ 55 __uint8_t count; /* count of active entries */ 56 } hdr; 57 struct xfs_dir_sf_entry { 58 xfs_dir_ino_t inumber; /* referenced inode number */ 59 __uint8_t namelen; /* actual length of name (no NULL) */ 60 __uint8_t name[1]; /* name */ 61 } list[1]; /* variable sized array */ 62 } xfs_dir_shortform_t; 63 typedef struct xfs_dir_sf_hdr xfs_dir_sf_hdr_t; 64 typedef struct xfs_dir_sf_entry xfs_dir_sf_entry_t; 65 66 /* 67 * We generate this then sort it, so that readdirs are returned in 68 * hash-order. Else seekdir won't work. 69 */ 70 typedef struct xfs_dir_sf_sort { 71 __uint8_t entno; /* .=0, ..=1, else entry# + 2 */ 72 __uint8_t seqno; /* sequence # with same hash value */ 73 __uint8_t namelen; /* length of name value (no null) */ 74 xfs_dahash_t hash; /* this entry's hash value */ 75 xfs_intino_t ino; /* this entry's inode number */ 76 char *name; /* name value, pointer into buffer */ 77 } xfs_dir_sf_sort_t; 78 79 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_GET_DIRINO) 80 void xfs_dir_sf_get_dirino_arch(xfs_dir_ino_t *from, xfs_ino_t *to, xfs_arch_t arch); 81 void xfs_dir_sf_get_dirino(xfs_dir_ino_t *from, xfs_ino_t *to); 82 #define XFS_DIR_SF_GET_DIRINO_ARCH(from,to,arch) xfs_dir_sf_get_dirino_arch(from, to, arch) 83 #define XFS_DIR_SF_GET_DIRINO(from,to) xfs_dir_sf_get_dirino(from, to) 84 #else 85 #define XFS_DIR_SF_GET_DIRINO_ARCH(from,to,arch) DIRINO_COPY_ARCH(from,to,arch) 86 #define XFS_DIR_SF_GET_DIRINO(from,to) DIRINO_COPY_ARCH(from,to,ARCH_NOCONVERT) 87 #endif 88 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_PUT_DIRINO) 89 void xfs_dir_sf_put_dirino_arch(xfs_ino_t *from, xfs_dir_ino_t *to, xfs_arch_t arch); 90 void xfs_dir_sf_put_dirino(xfs_ino_t *from, xfs_dir_ino_t *to); 91 #define XFS_DIR_SF_PUT_DIRINO_ARCH(from,to,arch) xfs_dir_sf_put_dirino_arch(from, to, arch) 92 #define XFS_DIR_SF_PUT_DIRINO(from,to) xfs_dir_sf_put_dirino(from, to) 93 #else 94 #define XFS_DIR_SF_PUT_DIRINO_ARCH(from,to,arch) DIRINO_COPY_ARCH(from,to,arch) 95 #define XFS_DIR_SF_PUT_DIRINO(from,to) DIRINO_COPY_ARCH(from,to,ARCH_NOCONVERT) 96 #endif 97 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_ENTSIZE_BYNAME) 98 int xfs_dir_sf_entsize_byname(int len); 99 #define XFS_DIR_SF_ENTSIZE_BYNAME(len) xfs_dir_sf_entsize_byname(len) 100 #else 101 #define XFS_DIR_SF_ENTSIZE_BYNAME(len) /* space a name uses */ \ 102 ((uint)sizeof(xfs_dir_sf_entry_t)-1 + (len)) 103 #endif 104 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_ENTSIZE_BYENTRY) 105 int xfs_dir_sf_entsize_byentry(xfs_dir_sf_entry_t *sfep); 106 #define XFS_DIR_SF_ENTSIZE_BYENTRY(sfep) xfs_dir_sf_entsize_byentry(sfep) 107 #else 108 #define XFS_DIR_SF_ENTSIZE_BYENTRY(sfep) /* space an entry uses */ \ 109 ((uint)sizeof(xfs_dir_sf_entry_t)-1 + (sfep)->namelen) 110 #endif 111 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_NEXTENTRY) 112 xfs_dir_sf_entry_t *xfs_dir_sf_nextentry(xfs_dir_sf_entry_t *sfep); 113 #define XFS_DIR_SF_NEXTENTRY(sfep) xfs_dir_sf_nextentry(sfep) 114 #else 115 #define XFS_DIR_SF_NEXTENTRY(sfep) /* next entry in struct */ \ 116 ((xfs_dir_sf_entry_t *) \ 117 ((char *)(sfep) + XFS_DIR_SF_ENTSIZE_BYENTRY(sfep))) 118 #endif 119 #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_ALLFIT) 120 int xfs_dir_sf_allfit(int count, int totallen); 121 #define XFS_DIR_SF_ALLFIT(count,totallen) \ 122 xfs_dir_sf_allfit(count,totallen) 123 #else 124 #define XFS_DIR_SF_ALLFIT(count,totallen) /* will all entries fit? */ \ 125 ((uint)sizeof(xfs_dir_sf_hdr_t) + \ 126 ((uint)sizeof(xfs_dir_sf_entry_t)-1)*(count) + (totallen)) 127 #endif 128 129 #if defined(XFS_DIR_TRACE) 130 131 /* 132 * Kernel tracing support for directories. 133 */ 134 struct uio; 135 struct xfs_inode; 136 struct xfs_da_intnode; 137 struct xfs_dinode; 138 struct xfs_dir_leafblock; 139 struct xfs_dir_leaf_entry; 140 141 #define XFS_DIR_TRACE_SIZE 4096 /* size of global trace buffer */ 142 extern ktrace_t *xfs_dir_trace_buf; 143 144 /* 145 * Trace record types. 146 */ 147 #define XFS_DIR_KTRACE_G_DU 1 /* dp, uio */ 148 #define XFS_DIR_KTRACE_G_DUB 2 /* dp, uio, bno */ 149 #define XFS_DIR_KTRACE_G_DUN 3 /* dp, uio, node */ 150 #define XFS_DIR_KTRACE_G_DUL 4 /* dp, uio, leaf */ 151 #define XFS_DIR_KTRACE_G_DUE 5 /* dp, uio, leaf entry */ 152 #define XFS_DIR_KTRACE_G_DUC 6 /* dp, uio, cookie */ 153 154 void xfs_dir_trace_g_du(char *where, struct xfs_inode *dp, struct uio *uio); 155 void xfs_dir_trace_g_dub(char *where, struct xfs_inode *dp, struct uio *uio, 156 xfs_dablk_t bno); 157 void xfs_dir_trace_g_dun(char *where, struct xfs_inode *dp, struct uio *uio, 158 struct xfs_da_intnode *node); 159 void xfs_dir_trace_g_dul(char *where, struct xfs_inode *dp, struct uio *uio, 160 struct xfs_dir_leafblock *leaf); 161 void xfs_dir_trace_g_due(char *where, struct xfs_inode *dp, struct uio *uio, 162 struct xfs_dir_leaf_entry *entry); 163 void xfs_dir_trace_g_duc(char *where, struct xfs_inode *dp, struct uio *uio, 164 xfs_off_t cookie); 165 void xfs_dir_trace_enter(int type, char *where, 166 void *a0, void *a1, void *a2, void *a3, 167 void *a4, void *a5, void *a6, void *a7, 168 void *a8, void *a9, void *a10, void *a11); 169 #else 170 #define xfs_dir_trace_g_du(w,d,u) 171 #define xfs_dir_trace_g_dub(w,d,u,b) 172 #define xfs_dir_trace_g_dun(w,d,u,n) 173 #define xfs_dir_trace_g_dul(w,d,u,l) 174 #define xfs_dir_trace_g_due(w,d,u,e) 175 #define xfs_dir_trace_g_duc(w,d,u,c) 176 #endif /* DEBUG */ 177 178 #endif /* __XFS_DIR_SF_H__ */ 179