]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/ufs/ffs/fs.h
xnu-1228.15.4.tar.gz
[apple/xnu.git] / bsd / ufs / ffs / fs.h
index db4436dac7875760e774071469f4e41a627e3267..3b9afc7b9e67d342be02cc0c423118d21bcac4f0 100644 (file)
@@ -1,23 +1,29 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
 /*
@@ -57,6 +63,9 @@
 #ifndef _FFS_FS_H_
 #define _FFS_FS_H_
 
+#include <sys/appleapiopts.h>
+
+#ifdef __APPLE_API_UNSTABLE
 /*
  * Each disk drive contains some number of file systems.
  * A file system consists of a number of cylinder groups.
  * 32-bit pointers, and 1 million on 64-bit machines). One pointer
  * is taken away to point to an array of cluster sizes that is
  * computed as cylinder groups are inspected.
+ * There is a 128-byte region in the superblock reserved for in-core
+ * pointers to summary information. Originally this included an array
+ * of pointers to blocks of struct csum; now there are just three
+ * pointers and the remaining space is padded with fs_ocsp[].
+ *
+ * NOCSPTRS determines the size of this padding. One pointer (fs_csp)
+ * is taken away to point to a contiguous array of struct csum for
+ * all cylinder groups; a second (fs_maxcluster) points to an array
+ * of cluster sizes that is computed as cylinder groups are inspected,
+ * and the third points to an array that tracks the creation of new
+ * directories.
  */
-#define        MAXCSBUFS       ((128 / sizeof(void *)) - 1)
+#define NOCSPTRS ((128 / sizeof(void *)) - 3)
 
 /*
  * A summary of contiguous blocks of various sizes is maintained
 #define MINFREE                5
 #define DEFAULTOPT     FS_OPTTIME
 
+/* Grigoriy Orlov <gluk@ptci.ru> has done some extensive work to fine
+ * tune the layout preferences for directories within a filesystem.
+ * His algorithm can be tuned by adjusting the following parameters
+ * which tell the system the average file size and the average number
+ * of files per directory. These defaults are well selected for typical
+ * filesystems, but may need to be tuned for odd cases like filesystems
+ * being used for squid caches or news spools.
+ */
+#define AVFILESIZ      16384
+#define AFPDIR         64
+
 /*
  * Per cylinder group information; summarized in blocks allocated
  * from first cylinder group data blocks.  These blocks have to be
  * read in from fs_csaddr (size fs_cssize) in addition to the
  * super block.
- *
- * N.B. sizeof(struct csum) must be a power of two in order for
- * the ``fs_cs'' macro to work (see below).
  */
 struct csum {
        int32_t cs_ndir;                /* number of directories */
@@ -209,8 +237,8 @@ struct fs {
        int32_t  fs_fragshift;          /* block to frag shift */
        int32_t  fs_fsbtodb;            /* fsbtodb and dbtofsb shift constant */
        int32_t  fs_sbsize;             /* actual size of super block */
-       int32_t  fs_csmask;             /* csum block offset */
-       int32_t  fs_csshift;            /* csum block number */
+       int32_t  fs_csmask;             /* csum block offset (now unused) */
+       int32_t  fs_csshift;            /* csum block number (now unused) */
        int32_t  fs_nindir;             /* value of NINDIR */
        int32_t  fs_inopb;              /* value of INOPB */
        int32_t  fs_nspf;               /* value of NSPF */
@@ -246,11 +274,15 @@ struct fs {
        u_char   fs_fsmnt[MAXMNTLEN];   /* name mounted on */
 /* these fields retain the current block allocation info */
        int32_t  fs_cgrotor;            /* last cg searched */
-       struct  csum *fs_csp[MAXCSBUFS];/* list of fs_cs info buffers */
+       void    *fs_ocsp[NOCSPTRS];     /* list of fs_cs info buffers */
+       u_int8_t *fs_contigdirs;        /* # of contiguously allocated dirs */
+       struct  csum *fs_csp;           /* list of fs_cs info buffers */
        int32_t  *fs_maxcluster;        /* max cluster in each cyl group */
        int32_t  fs_cpc;                /* cyl per cycle in postbl */
        int16_t  fs_opostbl[16][8];     /* old rotation block list head */
-       int32_t  fs_sparecon[50];       /* reserved for future constants */
+       int32_t  fs_avgfilesize;        /* expected average file size */
+       int32_t  fs_avgfpdir;           /* expected # of files per directory */
+       int32_t  fs_sparecon[48];       /* reserved for future constants */
        int32_t  fs_contigsumsize;      /* size of cluster summary array */ 
        int32_t  fs_maxsymlinklen;      /* max length of an internal symlink */
        int32_t  fs_inodefmt;           /* format of on-disk inodes */
@@ -319,8 +351,7 @@ struct fs {
  *
  * N.B. This macro assumes that sizeof(struct csum) is a power of two.
  */
-#define fs_cs(fs, indx) \
-       fs_csp[(indx) >> (fs)->fs_csshift][(indx) & ~(fs)->fs_csmask]
+#define fs_cs(fs, indx) fs_csp[indx]
 
 /*
  * Cylinder group block for a file system.
@@ -527,8 +558,10 @@ struct ocg {
  */
 #define        BIG_ENDIAN_FS   (__LITTLE_ENDIAN__)
 
+#ifdef __APPLE_API_PRIVATE
 extern int inside[], around[];
 extern u_char *fragtbl[];
+#endif /* __APPLE_API_PRIVATE */
 
 
 /*
@@ -551,8 +584,10 @@ struct ufslabel {
     u_int32_t          ul_time;        /* creation time */
     u_int16_t          ul_namelen;     /* filesystem name length */
     u_char             ul_name[UFS_MAX_LABEL_NAME]; /* filesystem name */
-    u_char             ul_reserved[32];/* reserved for future use */
+    u_int64_t          ul_uuid;        /* filesystem uuid */
+    u_char             ul_reserved[24];/* reserved for future use */
     u_char             ul_unused[460]; /* pad out to 1K */
 };
 
+#endif /* __APPLE_API_UNSTABLE */
 #endif /* ! _FFS_FS_H_ */