summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Sandeen <sandeen@redhat.com>2010-03-10 16:32:45 -0600
committerEric Sandeen <sandeen@redhat.com>2010-03-10 16:32:45 -0600
commit09d4131c9cb29558bcf148bfa517bb3d888671e2 (patch)
treec14238d043d94440a6a07e598a7f4adccbeaf1db
downloadxfsdocs-xml-dev-09d4131c9cb29558bcf148bfa517bb3d888671e2.tar.gz
Initial commit of xmlified xfs docs
Originally from http://oss.sgi.com/projects/xfs/training/index.html Licensed under CC: © Copyright 2006 Silicon Graphics Inc. All rights reserved. Permission is granted to copy, distribute, and/or modify this document under the terms of the Creative Commons Attribution-Share Alike, Version 3.0 or any later version published by the Creative Commons Corp. A copy of the license is available at http://creativecommons.org/licenses/by-sa/3.0/us/ . Signed-off-by: Eric Sandeen <sandeen@redhat.com> ---
-rw-r--r--XFS_Filesystem_Structure/en-US/Allocation_Groups.xml933
-rw-r--r--XFS_Filesystem_Structure/en-US/Author_Group.xml16
-rw-r--r--XFS_Filesystem_Structure/en-US/Book_Info.xml31
-rw-r--r--XFS_Filesystem_Structure/en-US/Chapter.xml9
-rw-r--r--XFS_Filesystem_Structure/en-US/Common_XFS_Types.xml68
-rw-r--r--XFS_Filesystem_Structure/en-US/Data_Extents.xml265
-rw-r--r--XFS_Filesystem_Structure/en-US/Directories.xml1132
-rw-r--r--XFS_Filesystem_Structure/en-US/Extended_Attributes.xml542
-rw-r--r--XFS_Filesystem_Structure/en-US/Internal_Inodes.xml180
-rw-r--r--XFS_Filesystem_Structure/en-US/Introduction.xml10
-rw-r--r--XFS_Filesystem_Structure/en-US/Journaling_Log.xml9
-rw-r--r--XFS_Filesystem_Structure/en-US/On-disk_Inode.xml438
-rw-r--r--XFS_Filesystem_Structure/en-US/Preface.xml13
-rw-r--r--XFS_Filesystem_Structure/en-US/Revision_History.xml26
-rw-r--r--XFS_Filesystem_Structure/en-US/Symbolic_Links.xml78
-rw-r--r--XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.ent3
-rw-r--r--XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.xml24
-rw-r--r--XFS_Filesystem_Structure/en-US/images/15a.pngbin0 -> 50788 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/15b.pngbin0 -> 95395 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/16.pngbin0 -> 36702 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/18.pngbin0 -> 23260 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/20a.pngbin0 -> 72052 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/20b.pngbin0 -> 91930 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/23.pngbin0 -> 19185 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/28.pngbin0 -> 48498 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/30.pngbin0 -> 27246 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/31.pngbin0 -> 10652 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/32.pngbin0 -> 60716 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/35.pngbin0 -> 167184 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/36.pngbin0 -> 188957 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/39.pngbin0 -> 48607 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/43.pngbin0 -> 103425 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/48.pngbin0 -> 145519 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/54.pngbin0 -> 217092 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/6.pngbin0 -> 87067 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/61.pngbin0 -> 33415 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/62.pngbin0 -> 53958 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/64.pngbin0 -> 49003 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/69.pngbin0 -> 128382 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/72.pngbin0 -> 138179 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/76.pngbin0 -> 31266 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/33a.pngbin0 -> 106484 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/33b.pngbin0 -> 40229 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/40.pngbin0 -> 94094 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/46.pngbin0 -> 78484 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/57.pngbin0 -> 17987 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/60.pngbin0 -> 32907 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/61.pngbin0 -> 54687 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/65.pngbin0 -> 107515 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/66.pngbin0 -> 69316 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/67.pngbin0 -> 109738 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/71.pngbin0 -> 62675 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/73-74.pngbin0 -> 153732 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/74.pngbin0 -> 62210 bytes
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/33a.svg185
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/33b.svg158
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/40.svg177
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/46.svg197
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/57.svg129
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/60.svg182
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/61.svg157
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/65.svg233
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/66.svg260
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/67.svg232
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/71.svg150
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/73-74.svg364
-rw-r--r--XFS_Filesystem_Structure/en-US/images/code/SVG/74.svg201
-rw-r--r--XFS_Filesystem_Structure/en-US/images/icon.svg3936
-rw-r--r--XFS_Filesystem_Structure/publican.cfg7
-rw-r--r--XFS_Labs/en-US/Author_Group.xml15
-rw-r--r--XFS_Labs/en-US/Book_Info.xml26
-rw-r--r--XFS_Labs/en-US/Chapter.xml31
-rw-r--r--XFS_Labs/en-US/Preface.xml11
-rw-r--r--XFS_Labs/en-US/Revision_History.xml25
-rw-r--r--XFS_Labs/en-US/XFS-QA-lab.xml10
-rw-r--r--XFS_Labs/en-US/XFS-allocators-lab.xml230
-rw-r--r--XFS_Labs/en-US/XFS-build-lab.xml22
-rw-r--r--XFS_Labs/en-US/XFS-mkfs-mount-lab.xml381
-rw-r--r--XFS_Labs/en-US/XFS-quotas-lab.xml279
-rw-r--r--XFS_Labs/en-US/XFS-repair-lab.xml10
-rw-r--r--XFS_Labs/en-US/XFS-xattr-lab.xml494
-rw-r--r--XFS_Labs/en-US/XFS_Labs.ent4
-rw-r--r--XFS_Labs/en-US/XFS_Labs.xml17
-rw-r--r--XFS_Labs/publican.cfg7
-rw-r--r--XFS_User_Guide/en-US/Article_Info.xml26
-rw-r--r--XFS_User_Guide/en-US/Author_Group.xml15
-rw-r--r--XFS_User_Guide/en-US/Book_Info.xml26
-rw-r--r--XFS_User_Guide/en-US/Preface.xml11
-rw-r--r--XFS_User_Guide/en-US/Revision_History.xml25
-rw-r--r--XFS_User_Guide/en-US/XFS-Background.xml514
-rw-r--r--XFS_User_Guide/en-US/XFS-DMAPI.xml10
-rw-r--r--XFS_User_Guide/en-US/XFS-Overview.xml137
-rw-r--r--XFS_User_Guide/en-US/XFS-QA.xml10
-rw-r--r--XFS_User_Guide/en-US/XFS-allocators.xml302
-rw-r--r--XFS_User_Guide/en-US/XFS-build.xml186
-rw-r--r--XFS_User_Guide/en-US/XFS-dumprestore.xml75
-rw-r--r--XFS_User_Guide/en-US/XFS-internals.xml709
-rw-r--r--XFS_User_Guide/en-US/XFS-mkfs.xml160
-rw-r--r--XFS_User_Guide/en-US/XFS-monitoring.xml142
-rw-r--r--XFS_User_Guide/en-US/XFS-mount.xml199
-rw-r--r--XFS_User_Guide/en-US/XFS-quotas.xml238
-rw-r--r--XFS_User_Guide/en-US/XFS-repair.xml211
-rw-r--r--XFS_User_Guide/en-US/XFS-triage.xml10
-rw-r--r--XFS_User_Guide/en-US/XFS-volumemgrs.xml10
-rw-r--r--XFS_User_Guide/en-US/XFS-xattr.xml115
-rw-r--r--XFS_User_Guide/en-US/XFS.xml43
-rw-r--r--XFS_User_Guide/en-US/XFS_User_Guide.ent4
-rw-r--r--XFS_User_Guide/en-US/XFS_User_Guide.xml26
-rw-r--r--XFS_User_Guide/publican.cfg7
109 files changed, 15118 insertions, 0 deletions
diff --git a/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml b/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml
new file mode 100644
index 0000000..fb1d9b3
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml
@@ -0,0 +1,933 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter id="Allocation_Groups">
+ <title>Allocation Groups</title>
+ <para>
+ XFS filesystems are divided into a number of equally sized chunks called Allocation Groups. Each AG can almost be thought of as an individual filesystem that maintains it's own space usage. Each AG can be up to one terabyte in size (512 bytes * 2<superscript>31</superscript>), regardless of the underlying device's sector size.
+ </para>
+ <para>
+ Each AG has the following characteristics:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>A super block describing overall filesystem info</para>
+ </listitem>
+ <listitem>
+ <para>Free space management</para>
+ </listitem>
+ <listitem>
+ <para>Inode allocation and tracking</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Having multiple AGs allows XFS to handle most operations in parallel without degrading performance as the number of concurrent accessing increases.
+ </para>
+ <para>
+ The only global information maintained by the first AG (primary) is free space across the filesystem and total inode counts. If the <command>XFS_SB_VERSION2_LAZYSBCOUNTBIT</command> flag is set in the superblock, these are only updated on-disk when the filesystem is cleanly unmounted (umount or shutdown).
+ </para>
+ <para>
+ Immediately after a mkfs.xfs, the primary AG has the following disk layout the subsequent AGs do not have any inodes allocated:
+ </para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/6.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>6</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ <para>
+ Each of these structures are expanded upon in the following sections.
+ </para>
+ <section id="Superblocks">
+ <title>Superblocks</title>
+ <para>
+ Each AG starts with a superblock. The first one is the primary superblock that stores aggregate AG information. Secondary superblocks are only used by xfs_repair when the primary superblock has been corrupted.
+ </para>
+ <para>
+ The superblock is defined by the following structure. The description of each field follows.
+ </para>
+ <programlisting>
+typedef struct xfs_sb
+{
+ __uint32_t        sb_magicnum;
+ __uint32_t        sb_blocksize;
+ xfs_drfsbno_t     sb_dblocks;
+ xfs_drfsbno_t     sb_rblocks;
+ xfs_drtbno_t      sb_rextents;
+ uuid_t        sb_uuid;
+ xfs_dfsbno_t      sb_logstart;
+ xfs_ino_t        sb_rootino;
+ xfs_ino_t        sb_rbmino;
+ xfs_ino_t        sb_rsumino;
+ xfs_agblock_t    sb_rextsize;
+ xfs_agblock_t    sb_agblocks;
+ xfs_agnumber_t    sb_agcount;
+ xfs_extlen_t      sb_rbmblocks;
+ xfs_extlen_t      sb_logblocks;
+ __uint16_t        sb_versionnum;
+ __uint16_t        sb_sectsize;
+ __uint16_t        sb_inodesize;
+ __uint16_t        sb_inopblock;
+ char        sb_fname[12];
+ __uint8_t        sb_blocklog;
+ __uint8_t        sb_sectlog;
+ __uint8_t        sb_inodelog;
+ __uint8_t        sb_inopblog;
+ __uint8_t        sb_agblklog;
+ __uint8_t        sb_rextslog;
+ __uint8_t        sb_inprogress;
+ __uint8_t        sb_imax_pct;
+ __uint64_t        sb_icount;
+ __uint64_t        sb_ifree;
+ __uint64_t        sb_fdblocks;
+ __uint64_t        sb_frextents;
+ xfs_ino_t        sb_uquotino;
+ xfs_ino_t        sb_gquotino;
+ __uint16_t        sb_qflags;
+ __uint8_t        sb_flags;
+ __uint8_t        sb_shared_vn;
+ xfs_extlen_t      sb_inoalignmt;
+ __uint32_t        sb_unit;
+ __uint32_t        sb_width;
+ __uint8_t        sb_dirblklog;
+ __uint8_t        sb_logsectlog;
+ __uint16_t        sb_logsectsize;
+ __uint32_t        sb_logsunit;
+ __uint32_t        sb_features2;
+} xfs_sb_t;
+ </programlisting>
+ <variablelist>
+ <varlistentry>
+ <term>sb_magicnum</term>
+ <listitem><para>Identifies the filesystem. It's value is <command>XFS_SB_MAGIC = 0x58465342 "XFSB"</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_blocksize</term>
+ <listitem><para>The size of a basic unit of space allocation in bytes. Typically, this is 4096 (4KB) but can range from 512 to 65536 bytes.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_dblocks</term>
+ <listitem><para>Total number of blocks available for data and metadata on the filesystem.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rblocks</term>
+ <listitem><para>Number blocks in the real-time disk device. Refer to <xref linkend="Real-time_Devices"/> for more information.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rextents</term>
+ <listitem><para>Number of extents on the real-time device.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_uuid</term>
+ <listitem><para>UUID (Universally Unique ID) for the filesystem. Filesystems can be mounted by the UUID instead of device name.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_logstart</term>
+ <listitem><para>First block number for the journaling log if the log is internal (ie. not on a separate disk device). For an external log device, this will be zero (the log will also start on the first block on the log device).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rootino</term>
+ <listitem><para>Root inode number for the filesystem. Typically, this is 128 when using a 4KB block size.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rbmino</term>
+ <listitem><para>Bitmap inode for real-time extents.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rsumino</term>
+ <listitem><para>Summary inode for real-time bitmap.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rextsize</term>
+ <listitem><para>Realtime extent size in blocks.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_agblocks</term>
+ <listitem><para>Size of each AG in blocks. For the actual size of the last AG, refer to the <xref linkend="AG_Free_Space_Management"/> <command>agf_length</command> value.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_agcount</term>
+ <listitem><para>Number of AGs in the filesystem.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rbmblocks</term>
+ <listitem><para>Number of real-time bitmap blocks.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_logblocks</term>
+ <listitem><para>Number of blocks for the journaling log.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_versionnum</term>
+ <listitem>
+ <para>Filesystem version number. This is a bitmask specifying the features enabled when creating the filesystem. Any disk checking tools or drivers that do not recognize any set bits must not operate upon the filesystem. Most of the flags indicate features introduced over time. The value must be 4 including the following flags:
+ <informaltable frame="all">
+ <tgroup cols="2"><thead><row>
+ <entry>
+ <para>Flag</para>
+ </entry>
+ <entry>
+ <para>Description</para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_ATTRBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if any inode have extended attributes.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_NLINKBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if any inodes use 32-bit di_nlink values.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_QUOTABIT</command></para>
+ </entry>
+ <entry>
+ <para>Quotas are enabled on the filesystem. This also brings in the various quota fields in the superblock.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_ALIGNBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if sb_inoalignmt is used.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_DALIGNBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if sb_unit and sb_width are used.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_SHAREDBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if sb_shared_vn is used.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_LOGV2BIT</command></para>
+ </entry>
+ <entry>
+ <para>Version 2 journaling logs are used.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_SECTORBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if sb_sectsize is not 512.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_EXTFLGBIT</command></para>
+ </entry>
+ <entry>
+ <para>Unwritten extents are used. This is always set.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_DIRV2BIT</command></para>
+ </entry>
+ <entry>
+ <para>Version 2 directories are used. This is always set.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_SB_VERSION_MOREBITSBIT</command></para>
+ </entry>
+ <entry>
+ <para>Set if the sb_features2 field in the superblock contains more flags.</para>
+ </entry>
+ </row></tbody></tgroup>
+ </informaltable>
+ </para>
+ </listitem>
+</varlistentry>
+
+ <varlistentry>
+ <term>sb_sectsize</term>
+ <listitem><para>Specifies the underlying disk sector size in bytes. Majority of the time, this is 512 bytes. This determines the minimum I/O alignment including Direct I/O.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_inodesize</term>
+ <listitem><para>Size of the inode in bytes. The default is 256 (2 inodes per standard sector) but can be made as large as 2048 bytes when creating the filesystem.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_inopblock</term>
+ <listitem><para>Number of inodes per block. This is equivalent to <command>sb_blocksize / sb_inodesize</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_fname[12]</term>
+ <listitem><para>Name for the filesystem. This value can be used in the mount command.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_blocklog</term>
+ <listitem><para>log<superscript>2</superscript> value of <command>sb_blocksize</command>. In other terms, <command>sb_blocksize = 2sb_blocklog</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_sectlog</term>
+ <listitem><para>log<superscript>2</superscript> value of <command>sb_sectsize</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_inodelog</term>
+ <listitem><para>log<superscript>2</superscript> value of <command>sb_inodesize</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_inopblog</term>
+ <listitem><para>log<superscript>2</superscript> value of <command>sb_inopblock</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_agblklog</term>
+ <listitem><para>log<superscript>2</superscript> value of <command>sb_agblocks</command> (rounded up). This value is used to generate inode numbers and absolute block numbers defined in extent maps.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_rextslog</term>
+ <listitem><para>log<superscript>2</superscript> value of <command>sb_rextents</command>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_inprogress</term>
+ <listitem><para>Flag specifying that the filesystem is being created.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_imax_pct</term>
+ <listitem><para>Maximum percentage of filesystem space that can be used for inodes. The default value is 25%.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_icount</term>
+ <listitem><para>Global count for number inodes allocated on the filesystem. This is only maintained in the first superblock.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_ifree</term>
+ <listitem><para>Global count of free inodes on the filesystem. This is only maintained in the first superblock.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_fdblocks</term>
+ <listitem><para>Global count of free data blocks on the filesystem. This is only maintained in the first superblock.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_frextents</term>
+ <listitem><para>Global count of free real-time extents on the filesystem. This is only maintained in the first superblock.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_uquotino</term>
+ <listitem><para>Inode for user quotas. This and the following two quota fields only apply if <command>XFS_SB_VERSION_QUOTABIT</command> flag is set in <command>sb_versionnum</command>. Refer to <xref linkend="Quota_Inodes"/> for more information.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_gquotino</term>
+ <listitem><para>Inode for group or project quotas. Group and Project quotas cannot be used at the same time.</para></listitem>
+ </varlistentry>
+<varlistentry>
+ <term>sb_qflags</term>
+ <listitem><para>
+ Quota flags. It can be a combination of the following flags:
+ <informaltable frame="all">
+ <tgroup cols="2"><thead><row>
+ <entry>
+ <para>Flag</para>
+ </entry>
+ <entry>
+ <para>Description</para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <para><command>XFS_UQUOTA_ACCT</command></para>
+ </entry>
+ <entry>
+ <para>User quota accounting is enabled.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_UQUOTA_ENFD</command></para>
+ </entry>
+ <entry>
+ <para>User quotas are enforced.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_UQUOTA_CHKD</command></para>
+ </entry>
+ <entry>
+ <para>User quotas have been checked and updated on disk.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_PQUOTA_ACCT</command></para>
+ </entry>
+ <entry>
+ <para>Project quota accounting is enabled.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_OQUOTA_ENFD</command></para>
+ </entry>
+ <entry>
+ <para>Other (group/project) quotas are enforced.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_OQUOTA_CHKD</command></para>
+ </entry>
+ <entry>
+ <para>Other (group/project) quotas have been checked.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_GQUOTA_ACCT</command></para>
+ </entry>
+ <entry>
+ <para>Group quota accounting is enabled.</para>
+ </entry>
+ </row></tbody></tgroup>
+ </informaltable>
+ </para></listitem>
+</varlistentry>
+
+ <varlistentry>
+ <term>sb_flags</term>
+ <listitem><para>Miscellaneous flags.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_shared_vn</term>
+ <listitem><para>Reserved and must be zero ("vn" stands for version number).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_inoalignmt</term>
+ <listitem><para>Inode chunk alignment in fsblocks. </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_unit</term>
+ <listitem><para>Underlying stripe or raid unit in blocks.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_width</term>
+ <listitem><para>Underlying stripe or raid width in blocks.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_dirblklog</term>
+ <listitem><para>log2 value multiplier that determines the granularity of directory block allocations in fsblocks.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_logsectlog</term>
+ <listitem><para>log2 value of the log subvolume's sector size. This is only used if the journaling log is on a separate disk device (i.e. not internal).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_logsectsize</term>
+ <listitem><para>The log's sector size in bytes if the filesystem uses an external log device.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_logsunit</term>
+ <listitem><para>The log device's stripe or raid unit size. This only applies to version 2 logs (<command>XFS_SB_VERSION_LOGV2BIT</command> is set in <command>sb_versionnum</command>).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>sb_features2</term>
+ <listitem><para>
+ Additional version flags if <command>XFS_SB_VERSION_MOREBITSBIT</command> is set in <command>sb_versionnum</command>. The currently defined additional features include:
+ <orderedlist>
+ <listitem>
+ <para><command>XFS_SB_VERSION2_LAZYSBCOUNTBIT</command>  (0x02): Lazy global counters. Making a filesystem with this bit set can improve performance. The global free space and inode counts are only updated in the primary superblock when the filesystem is cleanly unmounted.</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_SB_VERSION2_ATTR2BIT</command>  (0x08): Extended attributes version 2. Making a filesystem with this optimises the inode layout of extended attributes. </para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_SB_VERSION2_PARENTBIT</command>  (0x10): Parent pointers. All inodes must have an extended attribute that points back to its parent inode. The primary purpose for this information is in backup systems.</para>
+ </listitem>
+ </orderedlist>
+ </para></listitem>
+ </varlistentry>
+
+ </variablelist>
+
+
+
+
+
+
+
+
+
+
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A filesystem is made on a single SATA disk with the following command:</para>
+ <programlisting>
+# mkfs.xfs -i attr=2 -n size=16384 -f /dev/sda7
+meta-data=/dev/sda7 isize=256 agcount=16, agsize=3923122 blks
+ = sectsz=512 attr=2
+data = bsize=4096 blocks=62769952, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=16384
+log =internal log bsize=4096 blocks=30649, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+
+</programlisting>
+
+ <para>And in xfs_db, inspecting the superblock:</para>
+<programlisting>
+xfs_db> sb
+xfs_db> p
+magicnum = 0x58465342
+blocksize = 4096
+dblocks = 62769952
+rblocks = 0
+rextents = 0
+uuid = 32b24036-6931-45b4-b68c-cd5e7d9a1ca5
+logstart = 33554436
+rootino = 128
+rbmino = 129
+rsumino = 130
+rextsize = 16
+agblocks = 3923122
+agcount = 16
+rbmblocks = 0
+logblocks = 30649
+versionnum = 0xb084
+sectsize = 512
+inodesize = 256
+inopblock = 16
+fname = "\000\000\000\000\000\000\000\000\000\000\000\000"
+blocklog = 12
+sectlog = 9
+inodelog = 8
+inopblog = 4
+agblklog = 22
+rextslog = 0
+inprogress = 0
+imax_pct = 25
+icount = 64
+ifree = 61
+fdblocks = 62739235
+frextents = 0
+uquotino = 0
+gquotino = 0
+qflags = 0
+flags = 0
+shared_vn = 0
+inoalignmt = 2
+unit = 0
+width = 0
+dirblklog = 2
+logsectlog = 0
+logsectsize = 0
+logsunit = 0
+features2 = 8
+</programlisting>
+
+
+</section>
+
+
+
+
+<section id="AG_Free_Space_Management">
+ <title>AG Free Space Management</title>
+ <para>The XFS filesystem tracks free space in an allocation group using two B+trees. One B+tree tracks space by block number, the second by the size of the free space block. This scheme allows XFS to quickly find free space near a given block or of a given size.</para>
+ <para>All block numbers, indexes and counts are AG relative.</para>
+ <section id="AG_Free_Space_Block">
+ <title>AG Free Space Block</title>
+ <para>The second sector in an AG contains the information about the two free space B+trees and associated free space information for the AG. The "AG Free Space Block", also knows as the AGF, uses the following structure:</para>
+ <programlisting>
+typedef struct xfs_agf {
+ __be32 agf_magicnum;
+ __be32 agf_versionnum;
+ __be32 agf_seqno;
+ __be32 agf_length;
+ __be32 agf_roots[XFS_BTNUM_AGF];
+ __be32 agf_spare0;
+ __be32 agf_levels[XFS_BTNUM_AGF];
+ __be32 agf_spare1;
+ __be32 agf_flfirst;
+ __be32 agf_fllast;
+ __be32 agf_flcount;
+ __be32 agf_freeblks;
+ __be32 agf_longest;
+ __be32 agf_btreeblks;
+} xfs_agf_t;
+ </programlisting>
+
+
+
+
+<para>
+ The rest of the bytes in the sector are zeroed. <command>XFS_BTNUM_AGF</command> is set to 2, index 0 for the count B+tree and index 1 for the size B+tree.
+</para>
+<variablelist>
+ <varlistentry>
+ <term>agf_magicnum</term>
+ <listitem><para>Specifies the magic number for the AGF sector: "XAGF" (0x58414746).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_versionnum</term>
+ <listitem><para>Set to <command>XFS_AGF_VERSION</command> which is currently 1.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_seqno</term>
+ <listitem><para>Specifies the AG number for the sector.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_length</term>
+ <listitem><para>Specifies the size of the AG in filesystem blocks. For all AGs except the last, this must be equal to the superblock's <command>sb_agblocks</command> value. For the last AG, this could be less than the <command>sb_agblocks</command> value. It is this value that should be used to determine the size of the AG.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_roots</term>
+ <listitem><para>Specifies the block number for the root of the two free space B+trees. </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_levels</term>
+ <listitem><para>Specifies the level or depth of the two free space B+trees. For a fresh AG, this will be one, and the "roots" will point to a single leaf of level 0.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_flfirst</term>
+ <listitem><para>Specifies the index of the first "free list" block. Free lists are covered in more detail later on.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_fllast</term>
+ <listitem><para>Specifies the index of the last "free list" block.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_flcount</term>
+ <listitem><para>Specifies the number of blocks in the "free list".</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_freeblks</term>
+ <listitem><para>Specifies the current number of free blocks in the AG.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_longest</term>
+ <listitem><para>Specifies the number of blocks of longest contiguous free space in the AG.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agf_btreeblks</term>
+ <listitem><para>Specifies the number of blocks used for the free space B+trees. This is only used if the <command>XFS_SB_VERSION2_LAZYSBCOUNTBIT</command> bit is set in <command>sb_features2</command>.</para></listitem>
+ </varlistentry>
+</variablelist>
+</section>
+
+<section id="AG_Free_Space_Btrees">
+ <title>AG Free Space B+trees</title>
+ <para>The two Free Space B+trees store a sorted array of block offset and block counts in the leaves of the B+tree. The first B+tree is sorted by the offset, the second by the count or size.</para>
+ <para>The trees use the following header:</para>
+ <programlisting>
+typedef struct xfs_btree_sblock {
+ __be32 bb_magic;
+ __be16 bb_level;
+ __be16 bb_numrecs;
+ __be32 bb_leftsib;
+ __be32 bb_rightsib;
+} xfs_btree_sblock_t;
+ </programlisting>
+ <para>Leaves contain a sorted array of offset/count pairs which are also used for node keys:</para>
+ <programlisting>
+typedef struct xfs_alloc_rec {
+ __be32 ar_startblock;
+ __be32 ar_blockcount;
+} xfs_alloc_rec_t, xfs_alloc_key_t;
+ </programlisting>
+
+ <para>Node pointers are an AG relative block pointer:</para>
+ <programlisting>typedef __be32 xfs_alloc_ptr_t;</programlisting>
+
+ <itemizedlist>
+ <listitem>
+ <para>As the free space tracking is AG relative, all the block numbers are only 32-bits.</para>
+ </listitem>
+ <listitem>
+ <para>The <command>bb_magic</command> value depends on the B+tree: "ABTB" (0x41425442) for the block offset B+tree, "ABTC" (0x41425443) for the block count B+tree.</para>
+ </listitem>
+ <listitem>
+ <para>The <command>xfs_btree_sblock_t</command> header is used for intermediate B+tree node as well as the leaves.</para>
+ </listitem>
+ <listitem>
+ <para>For a typical 4KB filesystem block size, the offset for the <command>xfs_alloc_ptr_t</command> array would be <command>0xab0</command> (2736 decimal).</para>
+ </listitem>
+ <listitem>
+ <para>There are a series of macros in <command>xfs_btree.h</command> for deriving the offsets, counts, maximums, etc for the B+trees used in XFS.</para>
+ </listitem>
+ </itemizedlist>
+ <para>The following diagram shows a single level B+tree which consists of one leaf:</para>
+ <para>
+ <inlinemediaobject>
+ <imageobject><imagedata fileref="images/15a.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>15a</phrase></textobject>
+ </inlinemediaobject>
+
+ </para>
+
+ <para>With the intermediate nodes, the associated leaf pointers are stored in a separate array about two thirds into the block. The following diagram illustrates a 2-level B+tree for a free space B+tree:</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/15b.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>15b</phrase></textobject>
+ </mediaobject>
+
+ </para>
+</section>
+
+
+
+
+
+
+<section id="AG_Free_List"><title>AG Free List</title>
+ <para>The AG Free List is located in the 4<superscript>th</superscript> sector of each AG and is known as the AGFL. It is an array of AG relative block pointers for reserved space for growing the free space B+trees. This space cannot be used for general user data including inodes, data, directories and extended attributes.</para>
+ <para>With a freshly made filesystem, 4 blocks are reserved immediately after the free space B+tree root blocks (blocks 4 to 7). As they are used up as the free space fragments, additional blocks will be reserved from the AG and added to the free list array.</para>
+ <para>As the free list array is located within a single sector, a typical device will have space for 128 elements in the array (512 bytes per sector, 4 bytes per AG relative block pointer). The actual size can be determined by using the <command>XFS_AGFL_SIZE</command> macro.</para>
+ <para>Active elements in the array are specified by the AGF's (<xref linkend="AG_Free_Space_Block"/>) <command>agf_flfirst</command>, <command>agf_fllast</command> and <command>agf_flcount</command> values. The array is managed as a circular list.</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/16.png" format="PNG" /></imageobject>
+ <textobject><phrase>16</phrase></textobject>
+ </mediaobject>
+
+ </para>
+
+ <para>The presence of these reserved block guarantees that the free space B+trees can be updated if any blocks are freed by extent changes in a full AG.</para>
+
+ <bridgehead>xfs_db Examples:</bridgehead>
+ <para>These examples are derived from an AG that has been deliberately fragmented.</para>
+ <para>The AGF:</para>
+ <programlisting>
+xfs_db&gt; agf &lt;ag#&gt;
+xfs_db> p
+magicnum = 0x58414746
+versionnum = 1
+seqno = 0
+length = 3923122
+bnoroot = 7
+cntroot = 83343
+bnolevel = 2
+cntlevel = 2
+flfirst = 22
+fllast = 27
+flcount = 6
+freeblks = 3654234
+longest = 3384327
+btreeblks = 0
+ </programlisting>
+ <para>In the AGFL, the active elements are from 22 to 27 inclusive which are obtained from the <command>flfirst</command> and <command>fllast</command> values from the <command>agf</command> in the previous example:</para>
+ <programlisting>
+xfs_db> agfl 0
+xfs_db> p
+bno[0-127] = 0:4 1:5 2:6 3:7 4:83342 5:83343 6:83344 7:83345 8:83346 9:83347
+ 10:4 11:5 12:80205 13:80780 14:81496 15:81766 16:83346 17:4 18:5
+ 19:80205 20:82449 21:81496 22:81766 23:82455 24:80780 25:5
+ 26:80205 27:83344
+ </programlisting>
+
+ <para>The free space B+tree sorted by block offset, the root block is from the AGF's <command>bnoroot</command> value:</para>
+ <programlisting>
+xfs_db> fsblock 7
+xfs_db> type bnobt
+xfs_db> p
+magic = 0x41425442
+level = 1
+numrecs = 4
+leftsib = null
+rightsib = null
+keys[1-4] = [startblock,blockcount]
+ 1:[12,16] 2:[184586,3] 3:[225579,1] 4:[511629,1]
+ptrs[1-4] = 1:2 2:83347 3:6 4:4
+ </programlisting>
+
+ <para>Blocks 2, 83347, 6 and 4 contain the leaves for the free space B+tree by starting block. Block 2 would contain offsets 16 up to but not including 184586 while block 4 would have all offsets from 511629 to the end of the AG.</para>
+ <para>The free space B+tree sorted by block count, the root block is from the AGF's <command>cntroot</command> value:</para>
+ <programlisting>
+xfs_db> fsblock 83343
+xfs_db> type cntbt
+xfs_db> p
+magic = 0x41425443
+level = 1
+numrecs = 4
+leftsib = null
+rightsib = null
+keys[1-4] = [blockcount,startblock]
+ 1:[1,81496] 2:[1,511729] 3:[3,191875] 4:[6,184595]
+ptrs[1-4] = 1:3 2:83345 3:83342 4:83346
+ </programlisting>
+
+ <para>The leaf in block 3, in this example, would only contain single block counts. The offsets are sorted in ascending order if the block count is the same.</para>
+ <para>Inspecting the leaf in block 83346, we can see the largest block at the end:</para>
+ <programlisting>
+xfs_db> fsblock 83346
+xfs_db> type cntbt
+xfs_db> p
+magic = 0x41425443
+level = 0
+numrecs = 344
+leftsib = 83342
+rightsib = null
+recs[1-344] = [startblock,blockcount]
+ 1:[184595,6] 2:[187573,6] 3:[187776,6]
+ ...
+ 342:[513712,755] 343:[230317,258229] 344:[538795,3384327]
+
+ </programlisting>
+ <para>The longest block count must be the same as the AGF's <command>longest</command> value.</para>
+
+</section>
+</section>
+
+
+<section id="AG_Inode_Management">
+ <title>AG Inode Management</title>
+ <section id="Inode_Numbers">
+ <title>Inode Numbers</title>
+ <para>Inode numbers in XFS come in two forms: AG relative and absolute.</para>
+ <para>AG relative inode numbers always fit within 32 bits. The number of bits actually used is determined by the sum of the superblock's (<xref linkend="Superblocks"/>) <command>sb_inoplog</command> and <command>sb_agblklog</command> values. Relative inode numbers are found within the AG's inode structures.</para>
+ <para>Absolute inode numbers include the AG number in the high bits, above the bits used for the AG relative inode number. Absolute inode numbers are found in directory (<xref linkend="Directories"/>) entries.</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/18.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>18</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ </section>
+ <section id="Inode_Information">
+ <title>Inode Information</title>
+ <para>Each AG manages its own inodes. The third sector in the AG contains information about the AG's inodes and is known as the AGI.</para>
+ <para>The AGI uses the following structure:</para>
+ <programlisting>
+typedef struct xfs_agi {
+ __be32 agi_magicnum;
+ __be32 agi_versionnum;
+ __be32 agi_seqno
+ __be32 agi_length;
+ __be32 agi_count;
+ __be32 agi_root;
+ __be32 agi_level;
+ __be32 agi_freecount;
+ __be32 agi_newino;
+ __be32 agi_dirino;
+ __be32 agi_unlinked[64];
+} xfs_agi_t;
+ </programlisting>
+ <variablelist>
+ <varlistentry>
+ <term>agi_magicnum</term>
+ <listitem><para>Specifies the magic number for the AGI sector: "XAGI" (0x58414749).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_versionnum</term>
+ <listitem><para>Set to <command>XFS_AGI_VERSION</command> which is currently 1.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_seqno</term>
+ <listitem><para>Specifies the AG number for the sector.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_length</term>
+ <listitem><para>Specifies the size of the AG in filesystem blocks. </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_count</term>
+ <listitem><para>Specifies the number of inodes allocated for the AG.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_root</term>
+ <listitem><para>Specifies the block number in the AG containing the root of the inode B+tree.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_level</term>
+ <listitem><para>Specifies the number of levels in the inode B+tree.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_freecount</term>
+ <listitem><para>Specifies the number of free inodes in the AG.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_newino</term>
+ <listitem><para>Specifies AG relative inode number most recently allocated.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_dirino</term>
+ <listitem><para>Deprecated and not used, it's always set to NULL (-1).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>agi_unlinked[64]</term>
+ <listitem><para>Hash table of unlinked (deleted) inodes that are still being referenced. Refer to <xref linkend="Unlinked_Pointer"/> for more information.</para></listitem>
+ </varlistentry>
+ </variablelist>
+</section>
+
+
+<section id="Inode_Btrees"><title>Inode B+trees</title>
+ <para>Inodes are allocated in chunks of 64, and a B+tree is used to track these chunks of inodes as they are allocated and freed. The block containing root of the B+tree is defined by the AGI's <command>agi_root</command> value.</para>
+ <para>The B+tree header for the nodes and leaves use the <command>xfs_btree_sblock</command> structure which is the same as the header used in the AGF B+trees (<xref linkend="AG_Free_Space_Btrees"/>):</para>
+ <programlisting>typedef struct xfs_btree_sblock xfs_inobt_block_t;</programlisting>
+
+ <para>Leaves contain an array of the following structure:</para>
+<programlisting>
+typedef struct xfs_inobt_rec {
+ __be32 ir_startino;
+ __be32 ir_freecount;
+ __be64 ir_free;
+} xfs_inobt_rec_t;
+
+</programlisting>
+
+ <para>Nodes contain key/pointer pairs using the following types:</para>
+<programlisting>
+typedef struct xfs_inobt_key {
+ __be32 ir_startino;
+} xfs_inobt_key_t;
+typedef __be32 xfs_inobt_ptr_t;
+
+</programlisting>
+
+ <para>For the leaf entries, <command>ir_startino</command> specifies the starting inode number for the chunk, <command>ir_freecount</command> specifies the number of free entries in the chuck, and the <command>ir_free</command> is a 64 element bit array specifying which entries are free in the chunk.</para>
+ <para>The following diagram illustrates a single level inode B+tree:</para>
+ <para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/20a.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>20a</phrase></textobject>
+</mediaobject>
+
+ </para>
+ <para>And a 2-level inode B+tree:</para>
+ <para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/20b.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>20b</phrase></textobject>
+</mediaobject>
+
+ </para>
+
+<bridgehead>xfs_db Examples:</bridgehead>
+ <para>TODO:</para></section></section><section id="Real-time_Devices"><title>
+ Real-time Devices</title>
+ <para>TODO:</para></section></chapter>
diff --git a/XFS_Filesystem_Structure/en-US/Author_Group.xml b/XFS_Filesystem_Structure/en-US/Author_Group.xml
new file mode 100644
index 0000000..474378e
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Author_Group.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0'?>
+<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<authorgroup>
+
+ <author>
+ <firstname>Dude</firstname>
+ <surname>McDude</surname>
+ <affiliation>
+ <orgname>My Org</orgname>
+ <orgdiv>Best Div in the place</orgdiv>
+ </affiliation>
+ <email>dude.mcdude@myorg.org</email>
+ </author>
+</authorgroup>
diff --git a/XFS_Filesystem_Structure/en-US/Book_Info.xml b/XFS_Filesystem_Structure/en-US/Book_Info.xml
new file mode 100644
index 0000000..1483d8a
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Book_Info.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" ?>
+<!DOCTYPE bookinfo
+ PUBLIC '-//OASIS//DTD DocBook XML V4.5//EN'
+ 'http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd' [
+]>
+<bookinfo id="XFS_Filesystem_Structure-Red_Hat_Enterprise_Linux">
+ <title>XFS Filesystem Structure</title>
+ <subtitle>short descriptor</subtitle>
+ <productname>Red Hat Enterprise Linux</productname>
+ <productnumber>5.4</productnumber>
+ <edition>2</edition>
+ <pubsnumber>5</pubsnumber>
+ <abstract>
+ <para>This book documents the XFS Filesystem Structure</para>
+ </abstract>
+
+ <corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG"/>
+ </imageobject>
+ <textobject><phrase>Logo</phrase></textobject>
+ </inlinemediaobject>
+ </corpauthor>
+<!-- <copyright>
+ <year>&YEAR;</year>
+ <holder>&HOLDER;</holder>
+ </copyright>
+ <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />-->
+</bookinfo> \ No newline at end of file
diff --git a/XFS_Filesystem_Structure/en-US/Chapter.xml b/XFS_Filesystem_Structure/en-US/Chapter.xml
new file mode 100644
index 0000000..bb3a509
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Chapter.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter>
+<title>Journaling Log</title>
+ <para>TODO:</para>
+</chapter>
+
diff --git a/XFS_Filesystem_Structure/en-US/Common_XFS_Types.xml b/XFS_Filesystem_Structure/en-US/Common_XFS_Types.xml
new file mode 100644
index 0000000..13d2d15
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Common_XFS_Types.xml
@@ -0,0 +1,68 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter id="Common_XFS_Types">
+ <title>Common XFS Types</title>
+ <para>
+ All the following XFS types can be found in xfs_types.h. NULL values are always -1 on disk (ie. all bits for the value set to one).
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>xfs_ino_t</term>
+ <listitem><para>Unsigned 64 bit absolute inode number (<xref linkend="Inode_Numbers"/>).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_off_t</term>
+ <listitem><para>Signed 64 bit file offset.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_daddr_t</term>
+ <listitem><para>Signed 64 bit disk address.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_agnumber_t</term>
+ <listitem><para>Unsigned 32 bit AG (<xref linkend="Allocation_Groups"/>) number.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_agblock_t</term>
+ <listitem><para>Unsigned 32 bit AG relative block number.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_extlen_t</term>
+ <listitem><para>Unsigned 32 bit extent (<xref linkend="Data_Extents"/>) length in blocks.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_extnum_t</term>
+ <listitem><para>Signed 32 bit number of extents in a file.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_dablk_t</term>
+ <listitem><para>Unsigned 32 bit block number for directories (<xref linkend="Directories"/>) and extended attributes (<xref linkend="Extended_Attributes"/>).</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_dahash_t</term>
+ <listitem><para>Unsigned 32 bit hash of a directory file name or extended attribute name.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_dfsbno_t</term>
+ <listitem><para>Unsigned 64 bit filesystem block number combining AG (<xref linkend="Allocation_Groups"/>) number and block offset into the AG.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_drfsbno_t</term>
+ <listitem><para>Unsigned 64 bit raw filesystem block number.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_drtbno_t</term>
+ <listitem><para>Unsigned 64 bit extent number in the real-time (<xref linkend="Real-time_Devices"/>) sub-volume.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_dfiloff_t</term>
+ <listitem><para>Unsigned 64 bit block offset into a file.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>xfs_dfilblks_t</term>
+ <listitem><para>Unsigned 64 bit block count for a file.</para></listitem>
+ </varlistentry>
+ </variablelist>
+</chapter>
diff --git a/XFS_Filesystem_Structure/en-US/Data_Extents.xml b/XFS_Filesystem_Structure/en-US/Data_Extents.xml
new file mode 100644
index 0000000..0d0f888
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Data_Extents.xml
@@ -0,0 +1,265 @@
+<?xml version='1.0'?>
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter id="Data_Extents">
+<title>Data Extents</title>
+ <para>XFS allocates space for a file using extents: starting location and length. XFS extents also specify the file's logical starting offset for a file. This allows a files extent map to automatically support sparse files (i.e. "holes" in the file). A flag is also used to specify if the extent has been preallocated and not yet been written to (unwritten extent).</para>
+ <para>A file can have more than one extent if one chunk of contiguous disk space is not available for the file. As a file grows, the XFS space allocator will attempt to keep space contiguous and merge extents. If more than one file is being allocated space in the same AG at the same time, multiple extents for the files will occur as the extents get interleaved. The effect of this can vary depending on the extent allocator used in the XFS driver.</para>
+ <para>An extent is 128 bits in size and uses the following packed layout:</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/31.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>30</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ <para>The extent is represented by the <command>xfs_bmbt_rec_t</command> structure which uses a big endian format on-disk. In-core management of extents use the <command>xfs_bmbt_irec_t</command> structure which is the unpacked version of <command>xfs_bmbt_rec_t</command>:</para>
+
+<programlisting>
+typedef struct xfs_bmbt_irec {
+ xfs_fileoff_t br_startoff;
+ xfs_fsblock_t br_startblock;
+ xfs_filblks_t br_blockcount;
+ xfs_exntst_t br_state;
+} xfs_bmbt_irec_t;
+</programlisting>
+
+
+
+ <para>The extent <command>br_state</command> field uses the following enum declaration:</para>
+
+<programlisting>
+typedef enum {
+ XFS_EXT_NORM,
+ XFS_EXT_UNWRITTEN,
+ XFS_EXT_INVALID
+} xfs_exntst_t;
+</programlisting>
+
+
+ <para>Some other points about extents:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The <command>xfs_bmbt_rec_32_t</command> and <command>xfs_bmbt_rec_64_t</command> structures are effectively the same as <command>xfs_bmbt_rec_t</command>, just different representations of the same 128 bits in on-disk big endian format.</para>
+ </listitem>
+ <listitem>
+ <para>When a file is created and written to, XFS will endeavour to keep the extents within the same AG as the inode. It may use a different AG if the AG is busy or there is no space left in it.</para>
+ </listitem>
+ <listitem>
+ <para>If a file is zero bytes long, it will have no extents, <command>di_nblocks</command> and <command>di_nexents</command> will be zero. Any file with data will have at least one extent, and each extent can use from 1 to over 2 million blocks (2<superscript>21</superscript>) on the filesystem. For a default 4KB block size filesystem, a single extent can be up to 8GB in length. </para>
+ </listitem>
+ </itemizedlist>
+ <para>The following two subsections cover the two methods of storing extent information for a file. The first is the fastest and simplest where the inode completely contains an extent array to the file's data. The second is slower and more complex B+tree which can handle thousands to millions of extents efficiently.</para>
+
+
+
+<section id="Extent_List"><title>
+ Extent List</title>
+ <para>Local extents are where the entire extent array is stored within the inode's data fork itself. This is the most optimal in terms of speed and resource consumption. The trade-off is the file can only have a few extents before the inode runs out of space.</para>
+ <para>The "data fork" of the inode contains an array of extents, the size of the array determined by the inode's <command>di_nextents</command> value.</para>
+ <para>
+
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/32.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>32</phrase></textobject>
+ </mediaobject>
+
+
+
+ </para>
+ <para>The number of extents that can fit in the inode depends on the inode size and <command>di_forkoff</command>. For a default 256 byte inode with no extended attributes, a file can up to 19 extents with this format. Beyond this, extents have to use the B+tree format.</para>
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>An 8MB file with one extent:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 0100644
+core.version = 1
+core.format = 2 (extents)
+...
+core.size = 8294400
+core.nblocks = 2025
+core.extsize = 0
+core.nextents = 1
+core.naextents = 0
+core.forkoff = 0
+...
+u.bmx[0] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,25356,2025,0]
+
+</programlisting>
+ <para>A 24MB file with three extents:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.format = 2 (extents)
+...
+core.size = 24883200
+core.nblocks = 6075
+core.nextents = 3
+...
+u.bmx[0-2] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,27381,2025,0]
+ 1:[2025,31431,2025,0]
+ 2:[4050,35481,2025,0]
+
+</programlisting>
+ <para>Raw disk version of the inode with the third extent highlighted (<command>di_u</command> always starts at offset 0x64):</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/33a.png" format="PNG" /></imageobject>
+ <textobject><phrase>code33a</phrase></textobject>
+</mediaobject>
+ <para>We can expand the highlighted section into the following bit array from MSB to LSB with the file offset and the block count highlighted:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/33b.png" format="PNG" /></imageobject>
+ <textobject><phrase>code33b</phrase></textobject>
+</mediaobject>
+
+
+ <para>A 4MB file with two extents and a hole in the middle, the first extent containing 64KB of data, the second about 4MB in containing 32KB (<command>write</command> 64KB, <command>lseek</command> ~4MB, <command>write</command> 32KB operations):</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.format = 2 (extents)
+...
+core.size = 4063232
+core.nblocks = 24
+core.nextents = 2
+...
+u.bmx[0-1] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,37506,16,0]
+ 1:[984,37522,8,0]
+
+</programlisting>
+
+</section>
+
+
+
+<section id="Btree_Extent_List"><title>B+tree Extent List</title>
+ <para>Beyond the simple extent array, to efficiently manage large extent maps, XFS uses B+trees. The root node of the B+tree is stored in the inode's data fork. All block pointers for extent B+trees are 64-bit absolute block numbers.</para>
+ <para>For a single level B+tree, the root node points to the B+tree's leaves. Each leaf occupies one filesystem block and contains a header and an array of extents sorted by the file's offset. Each leaf has left and right (or backward and forward) block pointers to adjacent leaves. For a standard 4KB filesystem block, a leaf can contain up to 254 extents before a B+tree rebalance is triggered. </para>
+ <para>For a multi-level B+tree, the root node points to other B+tree nodes which eventually point to the extent leaves. B+tree keys are based on the file's offset. The nodes at each level in the B+tree point to the adjacent nodes.</para>
+ <para>The base B+tree node is used for extents, directories and extended attributes. The structures used for inode's B+tree root are:</para>
+
+<programlisting>
+typedef struct xfs_bmdr_block {
+ __be16 bb_level;
+ __be16 bb_numrecs;
+} xfs_bmdr_block_t;
+typedef struct xfs_bmbt_key {
+ xfs_dfiloff_t br_startoff;
+} xfs_bmbt_key_t, xfs_bmdr_key_t;
+typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
+</programlisting>
+
+
+
+ <itemizedlist>
+ <listitem>
+ <para>On disk, the B+tree node starts with the <command>xfs_bmbr_block_t</command> header followed by an array of <command>xfs_bmbt_key_t</command> values and then an array of <command>xfs_bmbt_ptr_t</command> values. The size of both arrays is specified by the header's <command>bb_numrecs</command> value.</para>
+ </listitem>
+ <listitem>
+ <para>The root node in the inode can only contain up to 19 key/pointer pairs for a standard 256 byte inode before a new level of nodes is added between the root and the leaves. This will be less if <command>di_forkoff</command> is not zero (i.e. attributes are in use on the inode).</para>
+ </listitem>
+ </itemizedlist>
+ <para>The subsequent nodes and leaves of the B+tree use the <command>xfs_bmbt_block_t</command> declaration:</para>
+
+<programlisting>
+typedef struct xfs_btree_lblock xfs_bmbt_block_t;
+typedef struct xfs_btree_lblock {
+ __be32 bb_magic;
+ __be16 bb_level;
+ __be16 bb_numrecs;
+ __be64 bb_leftsib;
+ __be64 bb_rightsib;
+} xfs_btree_lblock_t;
+</programlisting>
+
+ <itemizedlist>
+ <listitem>
+ <para>For intermediate nodes, the data following <command>xfs_bmbt_block_t</command> is the same as the root node: array of <command>xfs_bmbt_key_t</command> value followed by an array of <command>xfs_bmbt_ptr_t</command> values that starts halfway through the block (offset 0x808 for a 4096 byte filesystem block).</para>
+ </listitem>
+ <listitem>
+ <para>For leaves, an array of <command>xfs_bmbt_rec_t</command> extents follow the <command>xfs_bmbt_block_t</command> header.</para>
+ </listitem>
+ <listitem>
+ <para>Nodes and leaves use the same value for <command>bb_magic</command>: </para>
+ </listitem>
+ </itemizedlist>
+ <programlisting>
+#define XFS_BMAP_MAGIC        0x424d4150        /* 'BMAP' */
+ </programlisting>
+ <itemizedlist>
+ <listitem>
+ <para>The <command>bb_level</command> value determines if the node is an intermediate node or a leaf. Leaves have a <command>bb_level</command> of zero, nodes are one or greater.</para>
+ </listitem>
+ <listitem>
+ <para>Intermediate nodes, like leaves, can contain up to 254 pointers to leaf blocks for a standard 4KB filesystem block size as both the keys and pointers are 64 bits in size.</para>
+ </listitem>
+ </itemizedlist>
+ <para>The following diagram illustrates a single level extent B+tree:</para>
+ <para>
+
+
+
+
+
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/35.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>35</phrase></textobject>
+ </mediaobject>
+
+
+
+
+
+
+
+
+ </para>
+ <para>The following diagram illustrates a two level extent B+tree:</para>
+ <para>
+
+
+
+
+
+
+
+
+
+
+
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/36.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase></phrase></textobject>
+ </mediaobject>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </para><bridgehead>xfs_db Example:</bridgehead>
+ <para>TODO:</para></section></chapter>
diff --git a/XFS_Filesystem_Structure/en-US/Directories.xml b/XFS_Filesystem_Structure/en-US/Directories.xml
new file mode 100644
index 0000000..a97e51e
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Directories.xml
@@ -0,0 +1,1132 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter id="Directories"><title>
+ Directories</title>
+ <itemizedlist>
+ <listitem>
+ <para>Only v2 directories covered here. v1 directories are obsolete.</para>
+ </listitem>
+ <listitem>
+ <para>The size of a "directory block" is defined by the superblock's (<xref linkend="Superblocks"/>) <command>sb_dirblklog</command> value. The size in bytes = <command>sb_blocksize</command> * <command>2<superscript>sb_dirblklog</superscript></command>. For example, if <command>sb_blocksize</command> = 4096, <command>sb_dirblklog</command> = 2, the directory block size is 16384 bytes. Directory blocks are always allocated in multiples based on <command>sb_dirblklog</command>.  Directory blocks cannot be more that 65536 bytes in size.</para>
+<note>
+ <para>
+ Note: the term "block" in this section will refer to directory blocks, not filesystem blocks unless otherwise specified.
+ </para>
+</note>
+
+ </listitem>
+ <listitem>
+ <para>All directory entries contain the following "data":</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Entry's name (counted string consisting of a single byte <command>namelen</command> followed by <command>name</command> consisting of an array of 8-bit chars without a NULL terminator).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Entry's absolute inode number (<xref linkend="Inode_Numbers"/>), which are always 64 bits (8 bytes) in size except a special case for shortform directories.
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An <command>offset</command> or <command>tag</command> used for iterative readdir calls.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+<listitem>
+ <para>All non-shortform directories also contain two additional structures: "leaves" and "freespace indexes".</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Leaves contain the sorted hashed name value (<command>xfs_da_hashname()</command> in xfs_da_btree.c) and associated "address" which points to the effective offset into the directory's data structures. Leaves are used to optimise lookup operations.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Freespace indexes contain free space/empty entry tracking for quickly finding an appropriately sized location for new entries. They maintain the largest free space for each "data" block.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>A few common types are used for the directory structures:</para>
+ <programlisting language="C">
+typedef __uint16_t xfs_dir2_data_off_t;
+typedef __uint32_t xfs_dir2_dataptr_t;
+ </programlisting>
+ </listitem>
+ </itemizedlist>
+
+
+
+ <section id="Shortform_Directories"><title>
+ Shortform Directories</title>
+ <itemizedlist>
+ <listitem>
+ <para>Directory entries are stored within the inode.</para>
+ </listitem>
+ <listitem>
+ <para>Only data stored is the name, inode # and offset, no "leaf" or "freespace index" information is required as an inode can only store a few entries.</para>
+ </listitem>
+ <listitem>
+ <para>"." is not stored (as it's in the inode itself), and ".." is a dedicated <command>parent</command> field in the header.</para>
+ </listitem>
+ <listitem>
+ <para>The number of directories that can be stored in an inode depends on the inode size (<xref linkend="On-disk_Inode"/>), the number of entries, the length of the entry names and extended attribute data.</para>
+ </listitem>
+ <listitem>
+ <para>Once the number of entries exceed the space available in the inode, the format is converted to a "Block Directory".</para>
+ </listitem>
+ <listitem>
+ <para>Shortform directory data is packed as tightly as possible on the disk with the remaining space zeroed:</para>
+ <programlisting>
+typedef struct xfs_dir2_sf {
+ xfs_dir2_sf_hdr_t hdr;
+ xfs_dir2_sf_entry_t list[1];
+} xfs_dir2_sf_t;
+typedef struct xfs_dir2_sf_hdr {
+ __uint8_t count;
+ __uint8_t i8count;
+ xfs_dir2_inou_t parent;
+} xfs_dir2_sf_hdr_t;
+typedef struct xfs_dir2_sf_entry {
+ __uint8_t namelen;
+ xfs_dir2_sf_off_t offset;
+ __uint8_t name[1];
+ xfs_dir2_inou_t inumber;
+} xfs_dir2_sf_entry_t;
+ </programlisting>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/39.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>39</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ </listitem>
+
+
+ <listitem>
+ <para>
+ Inode numbers are stored using 4 or 8 bytes depending on whether all the inode numbers for the directory fit in 4 bytes (32 bits) or not. If all inode numbers fit in 4 bytes, the header's <command>count</command> value specifies the number of entries in the directory and <command>i8count</command> will be zero. If any inode number exceeds 4 bytes, all inode numbers will be 8 bytes in size and the header's <command>i8count</command> value specifies the number of entries and count will be zero. The following union covers the shortform inode number structure:</para>
+<programlisting>
+ typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t;
+typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t;
+typedef union {
+ xfs_dir2_ino8_t i8;
+ xfs_dir2_ino4_t i4;
+} xfs_dir2_inou_t;
+
+</programlisting>
+ </listitem>
+ </itemizedlist>
+
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+<para>A directory is created with 4 files, all inode numbers fitting within 4 bytes:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 1 (local)
+core.nlinkv1 = 2
+...
+core.size = 94
+core.nblocks = 0
+core.extsize = 0
+core.nextents = 0
+...
+u.sfdir2.hdr.count = 4
+u.sfdir2.hdr.i8count = 0
+u.sfdir2.hdr.parent.i4 = 128 /* parent = root inode */
+u.sfdir2.list[0].namelen = 15
+u.sfdir2.list[0].offset = 0x30
+u.sfdir2.list[0].name = "frame000000.tst"
+u.sfdir2.list[0].inumber.i4 = 25165953
+u.sfdir2.list[1].namelen = 15
+u.sfdir2.list[1].offset = 0x50
+u.sfdir2.list[1].name = "frame000001.tst"
+u.sfdir2.list[1].inumber.i4 = 25165954
+u.sfdir2.list[2].namelen = 15
+u.sfdir2.list[2].offset = 0x70
+u.sfdir2.list[2].name = "frame000002.tst"
+u.sfdir2.list[2].inumber.i4 = 25165955
+u.sfdir2.list[3].namelen = 15
+u.sfdir2.list[3].offset = 0x90
+u.sfdir2.list[3].name = "frame000003.tst"
+u.sfdir2.list[3].inumber.i4 = 25165956
+
+</programlisting>
+ <para>The raw data on disk with the first entry highlighted. The six byte header precedes the first entry:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/40.png" format="PNG" /></imageobject>
+ <textobject><phrase>code40</phrase></textobject>
+</mediaobject>
+ <para>Next, an entry is deleted (frame000001.tst), and any entries after the deleted entry are moved or compacted to "cover" the hole:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 1 (local)
+core.nlinkv1 = 2
+...
+core.size = 72
+core.nblocks = 0
+core.extsize = 0
+core.nextents = 0
+...
+u.sfdir2.hdr.count = 3
+u.sfdir2.hdr.i8count = 0
+u.sfdir2.hdr.parent.i4 = 128
+u.sfdir2.list[0].namelen = 15
+u.sfdir2.list[0].offset = 0x30
+u.sfdir2.list[0].name = "frame000000.tst"
+u.sfdir2.list[0].inumber.i4 = 25165953
+u.sfdir2.list[1].namelen = 15
+u.sfdir2.list[1].offset = 0x70
+u.sfdir2.list[1].name = "frame000002.tst"
+u.sfdir2.list[1].inumber.i4 = 25165955
+u.sfdir2.list[2].namelen = 15
+u.sfdir2.list[2].offset = 0x90
+u.sfdir2.list[2].name = "frame000003.tst"
+u.sfdir2.list[2].inumber.i4 = 25165956
+
+</programlisting>
+ <para>Raw disk data, the space beyond the shortform entries is invalid and could be non-zero:</para>
+<programlisting>
+xfs_db&gt; type text
+xfs_db&gt; p
+00: 49 4e 41 ed 01 01 00 02 00 00 00 00 00 00 00 00 INA.............
+10: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 03 ................
+20: 44 b2 45 a2 09 fd e4 50 44 b2 45 a3 12 ee b5 d0 D.E....PD.E.....
+30: 44 b2 45 a3 12 ee b5 d0 00 00 00 00 00 00 00 48 D.E............H
+40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+50: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................
+60: ff ff ff ff 03 00 00 00 00 80 0f 00 30 66 72 61 ............0fra
+70: 6d 65 30 30 30 30 30 30 2e 74 73 74 01 80 00 81 me000000.tst....
+80: 0f 00 70 66 72 61 6d 65 30 30 30 30 30 32 2e 74 ..pframe000002.t
+90: 73 74 01 80 00 83 0f 00 90 66 72 61 6d 65 30 30 st.......frame00
+a0: 30 30 30 33 2e 74 73 74 01 80 00 84 0f 00 90 66 0003.tst.......f
+b0: 72 61 6d 65 30 30 30 30 30 33 2e 74 73 74 01 80 rame000003.tst..
+c0: 00 84 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+</programlisting>
+ <para>TODO: 8-byte inode number example</para></section>
+
+
+
+<section id="Block_Directories"><title>
+ Block Directories</title>
+ <para>When the shortform directory space exceeds the space in an inode, the directory data is moved into a new single directory block outside the inode. The inode's format is changed from "local" to "extent". Following is a list of points about block directories.</para>
+ <itemizedlist>
+ <listitem>
+ <para>All directory data is stored within the one directory block, including "." and ".." entries which are mandatory. </para>
+ </listitem>
+ <listitem>
+ <para>The block also contains "leaf" and "freespace index " information.</para>
+ </listitem>
+ <listitem>
+ <para>The location of the block is defined by the inode's in-core extent list (<xref linkend="Extent_List"/>): the <command>di_u.u_bmx[0]</command> value. The file offset in the extent must always be zero and the <command>length</command> = (directory block size / filesystem block size). The block number points to the filesystem block containing the directory data.</para>
+ </listitem>
+ <listitem>
+ <para>Block directory data is stored in the following structures:</para>
+ <programlisting>
+#define XFS_DIR2_DATA_FD_COUNT 3
+typedef struct xfs_dir2_block {
+ xfs_dir2_data_hdr_t hdr;
+ xfs_dir2_data_union_t u[1];
+ xfs_dir2_leaf_entry_t leaf[1];
+ xfs_dir2_block_tail_t tail;
+} xfs_dir2_block_t;
+typedef struct xfs_dir2_data_hdr {
+ __uint32_t magic;
+ xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT];
+} xfs_dir2_data_hdr_t;
+typedef struct xfs_dir2_data_free {
+ xfs_dir2_data_off_t offset;
+ xfs_dir2_data_off_t length;
+} xfs_dir2_data_free_t;
+typedef union {
+ xfs_dir2_data_entry_t entry;
+ xfs_dir2_data_unused_t unused;
+} xfs_dir2_data_union_t;
+typedef struct xfs_dir2_data_entry {
+ xfs_ino_t inumber;
+ __uint8_t namelen;
+ __uint8_t name[1];
+ xfs_dir2_data_off_t tag;
+} xfs_dir2_data_entry_t;
+typedef struct xfs_dir2_data_unused {
+ __uint16_t freetag; /* 0xffff */
+ xfs_dir2_data_off_t length;
+ xfs_dir2_data_off_t tag;
+} xfs_dir2_data_unused_t;
+typedef struct xfs_dir2_leaf_entry {
+ xfs_dahash_t hashval;
+ xfs_dir2_dataptr_t address;
+} xfs_dir2_leaf_entry_t;
+typedef struct xfs_dir2_block_tail {
+ __uint32_t count;
+ __uint32_t stale;
+} xfs_dir2_block_tail_t;
+
+
+ </programlisting>
+ <para>
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/43.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>43</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>The <command>tag</command> in the <command>xfs_dir2_data_entry_t</command> structure stores its offset from the start of the block.</para>
+ </listitem>
+ <listitem>
+ <para>Start of a free space region is marked with the <command>xfs_dir2_data_unused_t</command> structure where the <command>freetag</command> is <command>0xffff</command>. The <command>freetag</command> and <command>length</command> overwrites the <command>inumber</command> for an entry. The <command>tag</command> is located at <command>length - sizeof(tag)</command> from the start of the <command>unused</command> entry on-disk. </para>
+ </listitem>
+ <listitem>
+ <para>The <command>bestfree</command> array in the header points to as many as three of the largest spaces of free space within the block for storing new entries sorted by largest to third largest. If there are less than 3 empty regions, the remaining <command>bestfree</command> elements are zeroed. The <command>offset</command> specifies the offset from the start of the block in bytes, and the <command>length</command> specifies the size of the free space in bytes. The location each points to must contain the above <command>xfs_dir2_data_unused_t</command> structure. As a block cannot exceed 64KB in size, each is a 16-bit value. <command>bestfree</command> is used to optimise the time required to locate space to create an entry. It saves scanning through the block to find a location suitable for every entry created.</para>
+ </listitem>
+ <listitem>
+ <para>The <command>tail</command> structure specifies the number of elements in the <command>leaf</command> array and the number of <command>stale</command> entries in the array. The <command>tail</command> is always located at the end of the block. The <command>leaf</command> data immediately precedes the <command>tail</command> structure.</para>
+ </listitem>
+ <listitem>
+ <para>The <command>leaf</command> array, which grows from the end of the block just before the <command>tail</command> structure, contains an array of hash/address pairs for quickly looking up a name by a hash value. Hash values are covered by the introduction to directories. The <command>address</command> on-disk is the offset into the block divided by 8 (<command>XFS_DIR2_DATA_ALIGN</command>). Hash/address pairs are stored on disk to optimise lookup speed for large directories. If they were not stored, the hashes have to be calculated for all entries each time a lookup occurs in a directory.</para>
+ </listitem>
+ </itemizedlist>
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A directory is created with 8 entries, directory block size = filesystem block size:</para>
+<programlisting>
+xfs_db> sb 0
+xfs_db> p
+magicnum = 0x58465342
+blocksize = 4096
+...
+dirblklog = 0
+...
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 2 (extents)
+core.nlinkv1 = 2
+...
+core.size = 4096
+core.nblocks = 1
+core.extsize = 0
+core.nextents = 1
+...
+u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,2097164,1,0]
+
+</programlisting>
+ <para>Go to the "startblock" and show the raw disk data:</para>
+<programlisting>
+xfs_db&gt; dblock 0
+xfs_db&gt; type text
+xfs_db&gt; p
+000: 58 44 32 42 01 30 0e 78 00 00 00 00 00 00 00 00 XD2B.0.x........
+010: 00 00 00 00 02 00 00 80 01 2e 00 00 00 00 00 10 ................
+020: 00 00 00 00 00 00 00 80 02 2e 2e 00 00 00 00 20 ................
+030: 00 00 00 00 02 00 00 81 0f 66 72 61 6d 65 30 30 .........frame00
+040: 30 30 30 30 2e 74 73 74 80 8e 59 00 00 00 00 30 0000.tst..Y....0
+050: 00 00 00 00 02 00 00 82 0f 66 72 61 6d 65 30 30 .........frame00
+060: 30 30 30 31 2e 74 73 74 d0 ca 5c 00 00 00 00 50 0001.tst.......P
+070: 00 00 00 00 02 00 00 83 0f 66 72 61 6d 65 30 30 .........frame00
+080: 30 30 30 32 2e 74 73 74 00 00 00 00 00 00 00 70 0002.tst.......p
+090: 00 00 00 00 02 00 00 84 0f 66 72 61 6d 65 30 30 .........frame00
+0a0: 30 30 30 33 2e 74 73 74 00 00 00 00 00 00 00 90 0003.tst........
+0b0: 00 00 00 00 02 00 00 85 0f 66 72 61 6d 65 30 30 .........frame00
+0c0: 30 30 30 34 2e 74 73 74 00 00 00 00 00 00 00 b0 0004.tst........
+0d0: 00 00 00 00 02 00 00 86 0f 66 72 61 6d 65 30 30 .........frame00
+0e0: 30 30 30 35 2e 74 73 74 00 00 00 00 00 00 00 d0 0005.tst........
+0f0: 00 00 00 00 02 00 00 87 0f 66 72 61 6d 65 30 30 .........frame00
+100: 30 30 30 36 2e 74 73 74 00 00 00 00 00 00 00 f0 0006.tst........
+110: 00 00 00 00 02 00 00 88 0f 66 72 61 6d 65 30 30 .........frame00
+120: 30 30 30 37 2e 74 73 74 00 00 00 00 00 00 01 10 0007.tst........
+130: ff ff 0e 78 00 00 00 00 00 00 00 00 00 00 00 00 ...x............
+</programlisting>
+ <para>The "leaf" and "tail" structures are stored at the end of the block, so as the directory grows, the middle is filled in:</para>
+<programlisting>
+fa0: 00 00 00 00 00 00 01 30 00 00 00 2e 00 00 00 02 .......0........
+fb0: 00 00 17 2e 00 00 00 04 83 a0 40 b4 00 00 00 0e ................
+fc0: 93 a0 40 b4 00 00 00 12 a3 a0 40 b4 00 00 00 06 ................
+fd0: b3 a0 40 b4 00 00 00 0a c3 a0 40 b4 00 00 00 1e ................
+fe0: d3 a0 40 b4 00 00 00 22 e3 a0 40 b4 00 00 00 16 ................
+ff0: f3 a0 40 b4 00 00 00 1a 00 00 00 0a 00 00 00 00 ................
+
+</programlisting>
+ <para>In a readable format:</para>
+<programlisting>
+xfs_db&gt; type dir2
+xfs_db&gt; p
+bhdr.magic = 0x58443242
+bhdr.bestfree[0].offset = 0x130
+bhdr.bestfree[0].length = 0xe78
+bhdr.bestfree[1].offset = 0
+bhdr.bestfree[1].length = 0
+bhdr.bestfree[2].offset = 0
+bhdr.bestfree[2].length = 0
+bu[0].inumber = 33554560
+bu[0].namelen = 1
+bu[0].name = "."
+bu[0].tag = 0x10
+bu[1].inumber = 128
+bu[1].namelen = 2
+bu[1].name = ".."
+bu[1].tag = 0x20
+bu[2].inumber = 33554561
+bu[2].namelen = 15
+bu[2].name = "frame000000.tst"
+bu[2].tag = 0x30
+bu[3].inumber = 33554562
+bu[3].namelen = 15
+bu[3].name = "frame000001.tst"
+bu[3].tag = 0x50
+...
+bu[8].inumber = 33554567
+bu[8].namelen = 15
+bu[8].name = "frame000006.tst"
+bu[8].tag = 0xf0
+bu[9].inumber = 33554568
+bu[9].namelen = 15
+bu[9].name = "frame000007.tst"
+bu[9].tag = 0x110
+bu[10].freetag = 0xffff
+bu[10].length = 0xe78
+bu[10].tag = 0x130
+bleaf[0].hashval = 0x2e
+bleaf[0].address = 0x2
+bleaf[1].hashval = 0x172e
+bleaf[1].address = 0x4
+bleaf[2].hashval = 0x83a040b4
+bleaf[2].address = 0xe
+...
+bleaf[8].hashval = 0xe3a040b4
+bleaf[8].address = 0x16
+bleaf[9].hashval = 0xf3a040b4
+bleaf[9].address = 0x1a
+btail.count = 10
+btail.stale = 0
+
+</programlisting>
+ <note>
+ <para>Note that with block directories, all xfs_db fields are preceded with "b". </para>
+ </note>
+
+ <para>For a simple lookup example, the hash of frame000000.tst is 0xb3a040b4. Looking up that value, we get an address of 0x6. Multiply that by 8, it becomes offset 0x30 and the inode at that point is 33554561. </para>
+ <para>When we remove an entry from the middle (frame000004.tst), we can see how the freespace details are adjusted:</para>
+<programlisting>
+bhdr.magic = 0x58443242
+bhdr.bestfree[0].offset = 0x130
+bhdr.bestfree[0].length = 0xe78
+bhdr.bestfree[1].offset = 0xb0
+bhdr.bestfree[1].length = 0x20
+bhdr.bestfree[2].offset = 0
+bhdr.bestfree[2].length = 0
+...
+bu[5].inumber = 33554564
+bu[5].namelen = 15
+bu[5].name = "frame000003.tst"
+bu[5].tag = 0x90
+bu[6].freetag = 0xffff
+bu[6].length = 0x20
+bu[6].tag = 0xb0
+bu[7].inumber = 33554566
+bu[7].namelen = 15
+bu[7].name = "frame000005.tst"
+bu[7].tag = 0xd0
+...
+bleaf[7].hashval = 0xd3a040b4
+bleaf[7].address = 0x22
+bleaf[8].hashval = 0xe3a040b4
+bleaf[8].address = 0
+bleaf[9].hashval = 0xf3a040b4
+bleaf[9].address = 0x1a
+btail.count = 10
+btail.stale = 1
+</programlisting>
+ <para>A new "bestfree" value is added for the entry, the start of the entry is marked as unused with 0xffff (which overwrites the inode number for an actual entry), and the length of the space. The tag remains intact at the <command>offset+length - sizeof(tag)</command>. The address for the hash is also cleared. The affected areas are highlighted below:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/46.png" format="PNG" /></imageobject>
+ <textobject><phrase>code46</phrase></textobject>
+</mediaobject>
+
+</section>
+
+
+
+
+
+<section id="Leaf_Directories"><title>
+
+ Leaf Directories</title>
+ <para>Once a Block Directory (<xref linkend="Block_Directories"/>) has filled the block, the directory data is changed into a new format. It still uses extents (<xref linkend="Data_Extents"/>) and the same basic structures, but the "data" and "leaf" are split up into their own extents. The "leaf" information only occupies one extent. As "leaf" information is more compact than "data" information, more than one "data" extent is common.</para>
+ <itemizedlist>
+ <listitem>
+ <para>Block to Leaf conversions retain the existing block for the data entries and allocate a new block for the leaf and freespace index information.</para>
+ </listitem>
+ <listitem>
+ <para>As with all directories, data blocks must start at logical offset zero. </para>
+ </listitem>
+ <listitem>
+ <para>The "leaf" block has a special offset defined by <command>XFS_DIR2_LEAF_OFFSET</command>. Currently, this is 32GB and in the extent view, a block offset of 32GB/sb_blocksize. On a 4KB block filesystem, this is 0x800000 (8388608 decimal).</para>
+ </listitem>
+ <listitem>
+ <para>The "data" extents have a new header (no "leaf" data):</para>
+ <programlisting>
+typedef struct xfs_dir2_data {
+ xfs_dir2_data_hdr_t hdr;
+ xfs_dir2_data_union_t u[1];
+} xfs_dir2_data_t;
+
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>The "leaf" extent uses the following structures:</para>
+ <programlisting>
+typedef struct xfs_dir2_leaf {
+ xfs_dir2_leaf_hdr_t hdr;
+ xfs_dir2_leaf_entry_t ents[1];
+ xfs_dir2_data_off_t bests[1];
+ xfs_dir2_leaf_tail_t tail;
+} xfs_dir2_leaf_t;
+typedef struct xfs_dir2_leaf_hdr {
+ xfs_da_blkinfo_t info;
+ __uint16_t count;
+ __uint16_t stale;
+} xfs_dir2_leaf_hdr_t;
+typedef struct xfs_dir2_leaf_tail {
+ __uint32_t bestcount;
+} xfs_dir2_leaf_tail_t;
+
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>The leaves use the <command>xfs_da_blkinfo_t</command> filesystem block header. This header is used for directory and extended attribute (<xref linkend="Extended_Attributes"/>) leaves and B+tree nodes:</para>
+ <programlisting>
+typedef struct xfs_da_blkinfo {
+ __be32 forw;
+ __be32 back;
+ __be16 magic;
+ __be16 pad;
+} xfs_da_blkinfo_t;
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>The size of the <command>ents</command> array is specified by <command>hdr.count</command>.</para>
+ </listitem>
+ <listitem>
+ <para>The size of the bests array is specified by the tail.bestcount which is also the number of "data" blocks for  the directory. The bests array maintains each data block's <command>bestfree[0].length</command> value.</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/48.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>48</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+
+ <para>For this example, a directory was created with 256 entries (frame000000.tst to frame000255.tst) and then deleted some files (frame00005*, frame00018* and frame000240.tst) to show free list characteristics.</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 2 (extents)
+core.nlinkv1 = 2
+...
+core.size = 12288
+core.nblocks = 4
+core.extsize = 0
+core.nextents = 3
+...
+u.bmx[0-2] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,4718604,1,0]
+ 1:[1,4718610,2,0]
+ 2:[8388608,4718605,1,0]
+
+</programlisting>
+
+ <para>As can be seen in this example, three blocks are used for "data" in two extents, and the "leaf" extent has a logical offset of 8388608 blocks (32GB).</para>
+ <para>Examining the first block:</para>
+<programlisting>
+xfs_db&gt; dblock 0
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0x670
+dhdr.bestfree[0].length = 0x140
+dhdr.bestfree[1].offset = 0xff0
+dhdr.bestfree[1].length = 0x10
+dhdr.bestfree[2].offset = 0
+dhdr.bestfree[2].length = 0
+du[0].inumber = 75497600
+du[0].namelen = 1
+du[0].name = "."
+du[0].tag = 0x10
+du[1].inumber = 128
+du[1].namelen = 2
+du[1].name = ".."
+du[1].tag = 0x20
+du[2].inumber = 75497601
+du[2].namelen = 15
+du[2].name = "frame000000.tst"
+du[2].tag = 0x30
+du[3].inumber = 75497602
+du[3].namelen = 15
+du[3].name = "frame000001.tst"
+du[3].tag = 0x50
+...
+du[51].inumber = 75497650
+du[51].namelen = 15
+du[51].name = "frame000049.tst"
+du[51].tag = 0x650
+du[52].freetag = 0xffff
+du[52].length = 0x140
+du[52].tag = 0x670
+du[53].inumber = 75497661
+du[53].namelen = 15
+du[53].name = "frame000060.tst"
+du[53].tag = 0x7b0
+...
+du[118].inumber = 75497758
+du[118].namelen = 15
+du[118].name = "frame000125.tst"
+du[118].tag = 0xfd0
+du[119].freetag = 0xffff
+du[119].length = 0x10
+du[119].tag = 0xff0
+
+</programlisting>
+ <para>Note that the xfs_db field output is preceded by a "d" for "data".</para>
+ <para>The next "data" block:</para>
+<programlisting>
+xfs_db&gt; dblock 1
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0x6d0
+dhdr.bestfree[0].length = 0x140
+dhdr.bestfree[1].offset = 0xe50
+dhdr.bestfree[1].length = 0x20
+dhdr.bestfree[2].offset = 0xff0
+dhdr.bestfree[2].length = 0x10
+du[0].inumber = 75497759
+du[0].namelen = 15
+du[0].name = "frame000126.tst"
+du[0].tag = 0x10
+...
+du[53].inumber = 75497844
+du[53].namelen = 15
+du[53].name = "frame000179.tst"
+du[53].tag = 0x6b0
+du[54].freetag = 0xffff
+du[54].length = 0x140
+du[54].tag = 0x6d0
+du[55].inumber = 75497855
+du[55].namelen = 15
+du[55].name = "frame000190.tst"
+du[55].tag = 0x810
+...
+du[104].inumber = 75497904
+du[104].namelen = 15
+du[104].name = "frame000239.tst"
+du[104].tag = 0xe30
+du[105].freetag = 0xffff
+du[105].length = 0x20
+du[105].tag = 0xe50
+du[106].inumber = 75497906
+du[106].namelen = 15
+du[106].name = "frame000241.tst"
+du[106].tag = 0xe70
+...
+du[117].inumber = 75497917
+du[117].namelen = 15
+du[117].name = "frame000252.tst"
+du[117].tag = 0xfd0
+du[118].freetag = 0xffff
+du[118].length = 0x10
+du[118].tag = 0xff0
+
+</programlisting>
+ <para>And the last data block:</para>
+<programlisting>
+xfs_db&gt; dblock 2
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0x70
+dhdr.bestfree[0].length = 0xf90
+dhdr.bestfree[1].offset = 0
+dhdr.bestfree[1].length = 0
+dhdr.bestfree[2].offset = 0
+dhdr.bestfree[2].length = 0
+du[0].inumber = 75497918
+du[0].namelen = 15
+du[0].name = "frame000253.tst"
+du[0].tag = 0x10
+du[1].inumber = 75497919
+du[1].namelen = 15
+du[1].name = "frame000254.tst"
+du[1].tag = 0x30
+du[2].inumber = 75497920
+du[2].namelen = 15
+du[2].name = "frame000255.tst"
+du[2].tag = 0x50
+du[3].freetag = 0xffff
+du[3].length = 0xf90
+du[3].tag = 0x70
+
+</programlisting>
+ <para>Examining the "leaf" block (with the fields preceded by an "l" for "leaf"):</para>
+ <para>The directory before deleting some entries:</para>
+<programlisting>
+xfs_db&gt; dblock 8388608
+xfs_db&gt; type dir2
+xfs_db&gt; p
+lhdr.info.forw = 0
+lhdr.info.back = 0
+lhdr.info.magic = 0xd2f1
+lhdr.count = 258
+lhdr.stale = 0
+lbests[0-2] = 0:0x10 1:0x10 2:0xf90
+lents[0].hashval = 0x2e
+lents[0].address = 0x2
+lents[1].hashval = 0x172e
+lents[1].address = 0x4
+lents[2].hashval = 0x23a04084
+lents[2].address = 0x116
+...
+lents[257].hashval = 0xf3a048bc
+lents[257].address = 0x366
+ltail.bestcount = 3
+
+</programlisting>
+ <para>Note how the <command>lbests</command> array correspond with the <command>bestfree[0].length</command> values in the "data" blocks:</para>
+<programlisting>
+xfs_db&gt; dblock 0
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0xff0
+dhdr.bestfree[0].length = 0x10
+...
+xfs_db&gt; dblock 1
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0xff0
+dhdr.bestfree[0].length = 0x10
+...
+xfs_db&gt; dblock 2
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0x70
+dhdr.bestfree[0].length = 0xf90
+
+</programlisting>
+ <para>Now after the entries have been deleted:</para>
+<programlisting>
+xfs_db&gt; dblock 8388608
+xfs_db&gt; type dir2
+xfs_db&gt; p
+lhdr.info.forw = 0
+lhdr.info.back = 0
+lhdr.info.magic = 0xd2f1
+lhdr.count = 258
+lhdr.stale = 21
+lbests[0-2] = 0:0x140 1:0x140 2:0xf90
+lents[0].hashval = 0x2e
+lents[0].address = 0x2
+lents[1].hashval = 0x172e
+lents[1].address = 0x4
+lents[2].hashval = 0x23a04084
+lents[2].address = 0x116
+...
+</programlisting>
+ <para>As can be seen, the <command>lbests</command> values have been update to contain each <command>hdr.bestfree[0].length</command> values. The leaf's <command>hdr.stale</command> value has also been updated to specify the number of stale entries in the array. The stale entries have an address of zero.</para>
+
+ <para>TODO: Need an example for where new entries get inserted with several large free spaces.</para></section>
+
+
+
+
+
+
+
+<section id="Node_Directories"><title>
+
+ Node Directories</title>
+ <para>When the "leaf" information fills a block, the extents undergo another separation. All "freeindex" information moves into its own extent. Like Leaf Directories (<xref linkend="Leaf_Directories"/>), the "leaf" block maintained the best free space information for each "data" block. This is not possible with more than one leaf.</para>
+ <itemizedlist>
+ <listitem>
+ <para>The "data" blocks stay the same as leaf directories.</para>
+ </listitem>
+ <listitem>
+ <para>The "leaf" blocks eventually change into a B+tree with the generic B+tree header pointing to directory "leaves" as described in Leaf Directories. The top-level blocks are called "nodes". It can exist in a state where there is still a single leaf block before it's split. Interpretation of the node vs. leaf blocks has to be performed by inspecting the magic value in the header. The combined leaf/freeindex blocks has a magic value of <command>XFS_DIR2_LEAF1_MAGIC (0xd2f1)</command>, a node directory's leaf/leaves have a magic value of <command>XFS_DIR2_LEAFN_MAGIC  (0xd2ff)</command> and intermediate nodes have a magic value of <command>XFS_DA_NODE_MAGIC (0xfebe)</command>.</para>
+ </listitem>
+ <listitem>
+ <para>The new "freeindex" block(s) only contains the bests for each data block.</para>
+ </listitem>
+ <listitem>
+ <para>The freeindex block uses the following structures:</para>
+ <programlisting>
+typedef struct xfs_dir2_free_hdr {
+ __uint32_t magic;
+ __int32_t firstdb;
+ __int32_t nvalid;
+ __int32_t nused;
+} xfs_dir2_free_hdr_t;
+typedef struct xfs_dir2_free {
+ xfs_dir2_free_hdr_t hdr;
+ xfs_dir2_data_off_t bests[1];
+} xfs_dir2_free_t;
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>The location of the leaf blocks can be in any order, the only way to determine the appropriate is by the node block hash/before values. Given a hash to lookup, you read the node's <command>btree</command> array and first <command>hashval</command> in the array that exceeds the given hash and it can then be found in the block pointed to by the <command>before</command> value. </para>
+ <programlisting>
+typedef struct xfs_da_intnode {
+ struct xfs_da_node_hdr {
+ xfs_da_blkinfo_t info;
+ __uint16_t count;
+ __uint16_t level;
+ } hdr;
+ struct xfs_da_node_entry {
+ xfs_dahash_t hashval;
+ xfs_dablk_t before;
+ } btree[1];
+} xfs_da_intnode_t;
+
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>The freeindex's <command>bests</command> array starts from the end of the block and grows to the start of the block.</para>
+ </listitem>
+ <listitem>
+ <para>When an data block becomes unused (ie. all entries in it have been deleted), the block is freed, the data extents contain a hole, and the freeindex's <command>hdr.nused</command> value is decremented and the associated <command>bests[]</command> entry is set to 0xffff. </para>
+ </listitem>
+ <listitem>
+ <para>As the first data block always contains "." and "..", it's invalid for the directory to have a hole at the start.</para>
+ </listitem>
+ <listitem>
+ <para>The freeindex's <command>hdr.nvalid</command> should always be the same as the number of allocated data directory blocks containing name/inode data and will always be less than or equal to <command>hdr.nused. hdr.nused</command> should be the same as the index of the last data directory block plus one (i.e. when the last data block is freed, <command>nused</command> and <command>nvalid</command> are decremented).</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/54.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>54</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>With the node directory examples, we are using a filesystems with 4KB block size, and a 16KB directory size. The directory has over 2000 entries:</para>
+<programlisting>
+xfs_db> sb 0
+xfs_db> p
+magicnum = 0x58465342
+blocksize = 4096
+...
+dirblklog = 2
+...
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 2 (extents)
+...
+core.size = 81920
+core.nblocks = 36
+core.extsize = 0
+core.nextents = 8
+...
+u.bmx[0-7] = [startoff,startblock,blockcount,extentflag] 0:[0,7368,4,0]
+1:[4,7408,4,0] 2:[8,7444,4,0] 3:[12,7480,4,0] 4:[16,7520,4,0]
+5:[8388608,7396,4,0] 6:[8388612,7524,8,0] 7:[16777216,7516,4,0]
+
+</programlisting>
+
+
+ <para>As can already be observed, all extents are allocated is multiples of 4 blocks.</para>
+ <para>Blocks 0 to 19 (16+4-1) are used for the data. Looking at blocks 16-19, it can seen that it's the same as the single-leaf format, except the <command>length</command> values are  a lot larger to accommodate the increased directory block size:</para>
+<programlisting>
+xfs_db&gt; dblock 16
+xfs_db&gt; type dir2
+xfs_db&gt; p
+dhdr.magic = 0x58443244
+dhdr.bestfree[0].offset = 0xb0
+dhdr.bestfree[0].length = 0x3f50
+dhdr.bestfree[1].offset = 0
+dhdr.bestfree[1].length = 0
+dhdr.bestfree[2].offset = 0
+dhdr.bestfree[2].length = 0
+du[0].inumber = 120224
+du[0].namelen = 15
+du[0].name = "frame002043.tst"
+du[0].tag = 0x10
+du[1].inumber = 120225
+du[1].namelen = 15
+du[1].name = "frame002044.tst"
+du[1].tag = 0x30
+du[2].inumber = 120226
+du[2].namelen = 15
+du[2].name = "frame002045.tst"
+du[2].tag = 0x50
+du[3].inumber = 120227
+du[3].namelen = 15
+du[3].name = "frame002046.tst"
+du[3].tag = 0x70
+du[4].inumber = 120228
+du[4].namelen = 15
+du[4].name = "frame002047.tst"
+du[4].tag = 0x90
+du[5].freetag = 0xffff
+du[5].length = 0x3f50
+du[5].tag = 0
+</programlisting>
+
+
+ <para>Next, the "node" block, the fields are preceded with 'n' for node blocks:</para>
+<programlisting>
+xfs_db&gt; dblock 8388608
+xfs_db&gt; type dir2
+xfs_db&gt; p
+nhdr.info.forw = 0
+nhdr.info.back = 0
+nhdr.info.magic = 0xfebe
+nhdr.count = 2
+nhdr.level = 1
+nbtree[0-1] = [hashval,before] 0:[0xa3a440ac,8388616] 1:[0xf3a440bc,8388612]
+</programlisting>
+
+
+
+ <para>The following leaf blocks have been allocated once as XFS knows it needs at two blocks when allocating a B+tree, so the length is 8 fsblocks. For all hashes &lt; 0xa3a440ac, they are located in the directory offset 8388616 and hashes below 0xf3a440bc are in offset 8388612. Hashes above f3a440bc don't exist in this directory.</para>
+<programlisting>
+xfs_db&gt; dblock 8388616
+xfs_db&gt; type dir2
+xfs_db&gt; p
+lhdr.info.forw = 8388612
+lhdr.info.back = 0
+lhdr.info.magic = 0xd2ff
+lhdr.count = 1023
+lhdr.stale = 0
+lents[0].hashval = 0x2e
+lents[0].address = 0x2
+lents[1].hashval = 0x172e
+lents[1].address = 0x4
+lents[2].hashval = 0x23a04084
+lents[2].address = 0x116
+...
+lents[1021].hashval = 0xa3a440a4
+lents[1021].address = 0x1fa2
+lents[1022].hashval = 0xa3a440ac
+lents[1022].address = 0x1fca
+xfs_db&gt; dblock 8388612
+xfs_db&gt; type dir2
+xfs_db&gt; p
+lhdr.info.forw = 0
+lhdr.info.back = 8388616
+lhdr.info.magic = 0xd2ff
+lhdr.count = 1027
+lhdr.stale = 0
+lents[0].hashval = 0xa3a440b4
+lents[0].address = 0x1f52
+lents[1].hashval = 0xa3a440bc
+lents[1].address = 0x1f7a
+...
+lents[1025].hashval = 0xf3a440b4
+lents[1025].address = 0x1f66
+lents[1026].hashval = 0xf3a440bc
+lents[1026].address = 0x1f8e
+</programlisting>
+
+
+ <para>An example lookup using xfs_db:</para>
+<programlisting>
+xfs_db&gt; hash frame001845.tst
+0xf3a26094
+Doing a binary search through the array, we get address 0x1ce6, which is
+offset 0xe730. Each fsblock is 4KB in size (0x1000), so it will be offset
+0x730 into directory offset 14. From the extent map, this will be fsblock
+7482:
+xfs_db&gt; fsblock 7482
+xfs_db&gt; type text
+xfs_db&gt; p
+...
+730: 00 00 00 00 00 01 d4 da 0f 66 72 61 6d 65 30 30 .........frame00
+740: 31 38 34 35 2e 74 73 74 00 00 00 00 00 00 27 30 1845.tst.......0
+</programlisting>
+
+
+ <para>Looking at the freeindex information (fields with an 'f' tag):</para>
+<programlisting>
+xfs_db&gt; fsblock 7516
+xfs_db&gt; type dir2
+xfs_db&gt; p
+fhdr.magic = 0x58443246
+fhdr.firstdb = 0
+fhdr.nvalid = 5
+fhdr.nused = 5
+fbests[0-4] = 0:0x10 1:0x10 2:0x10 3:0x10 4:0x3f50
+</programlisting>
+ <para>Like the Leaf Directory (<xref linkend="Leaf_Directories"/>), each of the <command>fbests</command> values correspond to each data block's <command>bestfree[0].length</command> value. </para>
+ <para>The raw disk layout, old data is not cleared after the array. The fbests array is highlighted:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/57.png" format="PNG" /></imageobject>
+ <textobject><phrase>code57</phrase></textobject>
+</mediaobject>
+ <para>TODO: Example with a hole in the middle</para></section>
+
+
+
+<section id="Btree_Directories">
+ <title>B+tree Directories</title>
+ <para>When the extent map in an inode grows beyond the inode's space, the inode format is changed to a "btree". The inode contains a filesystem block point to the B+tree extent map for the directory's blocks. The B+tree extents contain the extent map for the "data", "node", "leaf" and "freeindex" information as described in Node Directories (<xref linkend="Node_Directories"/>).</para>
+ <para>Refer to the previous section on B+tree Data Extents (<xref linkend="Btree_Extent_List"/>) for more information on XFS B+tree extents.</para>
+ <para>The following situations and changes can apply over Node Directories, and apply here as inode extents generally cannot contain the number of directory blocks that B+trees can handle:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The node/leaf trees can be more than one level deep. </para>
+ </listitem>
+ <listitem>
+ <para>More than one freeindex block may exist, but this will be quite rare. It would required hundreds of thousand files with quite long file names (or millions with shorter names) to get a second freeindex block.</para>
+ </listitem>
+ </itemizedlist>
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A directory has been created with 200,000 entries with each entry being 100 characters long. The filesystem block size and directory block size are 4KB:</para>
+<programlisting>
+xfs_db&gt; inode 772
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 3 (btree)
+...
+core.size = 22757376
+core.nblocks = 6145
+core.extsize = 0
+core.nextents = 234
+core.naextents = 0
+core.forkoff = 0
+...
+u.bmbt.level = 1
+u.bmbt.numrecs = 1
+u.bmbt.keys[1] = [startoff] 1:[0]
+u.bmbt.ptrs[1] = 1:89
+xfs_db&gt; fsblock 89
+xfs_db&gt; type bmapbtd
+xfs_db&gt; p
+magic = 0x424d4150
+level = 0
+numrecs = 234
+leftsib = null
+rightsib = null
+recs[1-234] = [startoff,startblock,blockcount,extentflag]
+ 1:[0,53,1,0] 2:[1,55,13,0] 3:[14,69,1,0] 4:[15,72,13,0]
+ 5:[28,86,2,0] 6:[30,90,21,0] 7:[51,112,1,0] 8:[52,114,11,0]
+ ...
+ 125:[5177,902,15,0] 126:[5192,918,6,0] 127:[5198,524786,358,0]
+ 128:[8388608,54,1,0] 129:[8388609,70,2,0] 130:[8388611,85,1,0]
+ ...
+ 229:[8389164,917,1,0] 230:[8389165,924,19,0] 231:[8389184,944,9,0]
+ 232:[16777216,68,1,0] 233:[16777217,7340114,1,0] 234:[16777218,5767362,1,0]
+</programlisting>
+
+
+<para>We have 128 extents and a total of 5555 blocks being used to store name/inode pairs. With only about 2000 values that can be stored in the freeindex block, 3 blocks have been allocated for this information. The <command>firstdb</command> field specifies the starting directory block number for each array:</para>
+<programlisting>
+xfs_db&gt; dblock 16777216
+xfs_db&gt; type dir2
+xfs_db&gt; p
+fhdr.magic = 0x58443246
+fhdr.firstdb = 0
+fhdr.nvalid = 2040
+fhdr.nused = 2040
+fbests[0-2039] = ...
+xfs_db&gt; dblock 16777217
+xfs_db&gt; type dir2
+xfs_db&gt; p
+fhdr.magic = 0x58443246
+fhdr.firstdb = 2040
+fhdr.nvalid = 2040
+fhdr.nused = 2040
+fbests[0-2039] = ...
+xfs_db&gt; dblock 16777218
+xfs_db&gt; type dir2
+xfs_db&gt; p
+fhdr.magic = 0x58443246
+fhdr.firstdb = 4080
+fhdr.nvalid = 1476
+fhdr.nused = 1476
+fbests[0-1475] = ...
+</programlisting>
+ <para>Looking at the root node in the node block, it's a pretty deep tree:</para>
+<programlisting>
+xfs_db&gt; dblock 8388608
+xfs_db&gt; type dir2
+xfs_db&gt; p
+nhdr.info.forw = 0
+nhdr.info.back = 0
+nhdr.info.magic = 0xfebe
+nhdr.count = 2
+nhdr.level = 2
+nbtree[0-1] = [hashval,before] 0:[0x6bbf6f39,8389121] 1:[0xfbbf7f79,8389120]
+xfs_db&gt; dblock 8389121
+xfs_db&gt; type dir2
+xfs_db&gt; p
+nhdr.info.forw = 8389120
+nhdr.info.back = 0
+nhdr.info.magic = 0xfebe
+nhdr.count = 263
+nhdr.level = 1
+nbtree[0-262] = ... 262:[0x6bbf6f39,8388928]
+xfs_db> dblock 8389120
+xfs_db> type dir2
+xfs_db> p
+nhdr.info.forw = 0
+nhdr.info.back = 8389121
+nhdr.info.magic = 0xfebe
+nhdr.count = 319
+nhdr.level = 1
+nbtree[0-318] = [hashval,before] 0:[0x70b14711,8388919] ...
+</programlisting>
+ <para>The leaves at each the end of a node always point to the end leaves in adjacent nodes. Directory block 8388928 forward pointer is to block 8388919, and vice versa as highlighted in the following example:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/60.png" format="PNG" /></imageobject>
+ <textobject><phrase>code60</phrase></textobject>
+</mediaobject></section>
+
+</chapter>
+
diff --git a/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml b/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml
new file mode 100644
index 0000000..0c6edaf
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml
@@ -0,0 +1,542 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<chapter id="Extended_Attributes"><title>
+ Extended Attributes</title>
+ <para>Extended attributes implement the ability for a user to attach name:value pairs to inodes within the XFS filesystem. They could be used to store meta-information about the file.</para>
+ <para>The attribute names can be up to 256 bytes in length, terminated by the first 0 byte. The intent is that they be printable ASCII (or other character set) names for the attribute. The values can be up to 64KB of arbitrary binary data. Some XFS internal attributes (eg. parent pointers) use non-printable names for the attribute.</para>
+ <para>Access Control Lists (ACLs) and Data Migration Facility (DMF) use extended attributes to store their associated metadata with an inode.</para>
+ <para>XFS uses two disjoint attribute name spaces associated with every inode. They are the root and user address spaces. The root address space is accessible only to the superuser, and then only by specifying a flag argument to the function call. Other users will not see or be able to modify attributes in the root address space. The user address space is protected by the normal file permissions mechanism, so the owner of the file can decide who is able to see and/or modify the value of attributes on any particular file.</para>
+ <para>To view extended attributes from the command line, use the <command>getfattr</command> command. To set or delete extended attributes, use the <command>setfattr</command> command. ACLs control should use the <command>getfacl</command> and <command>setfacl</command> commands.</para>
+ <para>XFS attributes supports three namespaces: "user", "trusted" (or "root" using IRIX terminology) and "secure".</para>
+ <para>The location of the attribute fork in the inode's literal area is specified by the <command>di_forkoff</command> value in the inode's core. If this value is zero, the inode does not contain any extended attributes. Non-zero, the byte offset into the literal area = <command>di_forkoff * 8</command>, which also determines the 2048 byte maximum size for an inode. Attributes must be allocated on a 64-bit boundary on the disk except shortform attributes (they are tightly packed). To determine the offset into the inode itself, add 100 (0x64) to <command>di_forkoff * 8</command>.</para>
+ <para>The following four sections describe each of the on-disk formats.</para>
+
+
+<section id="Shortform_Attributes"><title>
+ Shortform Attributes</title>
+ <para>When the all extended attributes can fit within the inode's attribute fork, the inode's <command>di_aformat</command> is set to "local" and the attributes are stored in the inode's literal area starting at offset <command>di_forkoff * 8</command>.</para>
+ <para>Shortform attributes use the following structures:</para>
+<programlisting>
+typedef struct xfs_attr_shortform {
+ struct xfs_attr_sf_hdr {
+ __be16 totsize;
+ __u8 count;
+ } hdr;
+ struct xfs_attr_sf_entry {
+ __uint8_t namelen;
+ __uint8_t valuelen;
+ __uint8_t flags;
+ __uint8_t nameval[1];
+ } list[1];
+} xfs_attr_shortform_t;
+typedef struct xfs_attr_sf_hdr xfs_attr_sf_hdr_t;
+typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t;
+</programlisting>
+ <para>
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/64.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>64</phrase></textobject>
+ </mediaobject>
+
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para><command>namelen</command> and <command>valuelen</command> specify the size of the two byte arrays containing the name and value pairs. <command>valuelen</command> is zero for extended attributes with no value.</para>
+ </listitem>
+ <listitem>
+ <para><command>nameval[]</command> is a single array where it's size is the sum of <command>namelen</command> and <command>valuelen</command>. The names and values are not null terminated on-disk. The value immediately follows the name in the array.</para>
+ </listitem>
+ <listitem>
+ <para><command>flags</command> specifies the namespace for the attribute (0 = "user"):</para>
+
+
+ <informaltable frame="all">
+ <tgroup cols="2"><thead><row>
+ <entry>
+ <para>Flag</para>
+ </entry>
+ <entry>
+ <para>Description</para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <para><command>XFS_ATTR_ROOT</command></para>
+ </entry>
+ <entry>
+ <para>The attribute's namespace is "trusted".</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_ATTR_SECURE</command></para>
+ </entry>
+ <entry>
+ <para>The attribute's namespace is "secure".</para>
+ </entry>
+ </row></tbody></tgroup>
+ </informaltable>
+
+ </listitem>
+</itemizedlist>
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A file is created and two attributes are set:</para>
+<programlisting>
+# setfattr -n user.empty few_attr
+# setfattr -n trusted.trust -v val1 few_attr
+</programlisting>
+ <para>Using xfs_db, we dump the inode:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 0100644
+...
+core.naextents = 0
+core.forkoff = 15
+core.aformat = 1 (local)
+...
+a.sfattr.hdr.totsize = 24
+a.sfattr.hdr.count = 2
+a.sfattr.list[0].namelen = 5
+a.sfattr.list[0].valuelen = 0
+a.sfattr.list[0].root = 0
+a.sfattr.list[0].secure = 0
+a.sfattr.list[0].name = "empty"
+a.sfattr.list[1].namelen = 5
+a.sfattr.list[1].valuelen = 4
+a.sfattr.list[1].root = 1
+a.sfattr.list[1].secure = 0
+a.sfattr.list[1].name = "trust"
+a.sfattr.list[1].value = "val1"
+</programlisting>
+ <para>We can determine the actual inode offset to be 220 (15 x 8 + 100) or <command>0xdc</command>.</para>
+ <para>Examining the raw dump, the second attribute is highlighted:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/65.png" format="PNG" /></imageobject>
+ <textobject><phrase>code65</phrase></textobject>
+</mediaobject>
+ <para>Adding another attribute with attr1, the format is converted to extents and <command>di_forkoff</command> remains unchanged (and all those zeros in the dump above remain unused):</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.naextents = 1
+core.forkoff = 15
+core.aformat = 2 (extents)
+...
+a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,37534,1,0]
+</programlisting>
+ <para>Performing the same steps with attr2, adding one attribute at a time, you can see <command>di_forkoff</command> change as attributes are added:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.naextents = 0
+core.forkoff = 15
+core.aformat = 1 (local)
+...
+a.sfattr.hdr.totsize = 17
+a.sfattr.hdr.count = 1
+a.sfattr.list[0].namelen = 10
+a.sfattr.list[0].valuelen = 0
+a.sfattr.list[0].root = 0
+a.sfattr.list[0].secure = 0
+a.sfattr.list[0].name = "empty_attr"
+</programlisting>
+ <para>Attribute added:</para>
+<programlisting>
+xfs_db&gt; p
+...
+core.naextents = 0
+core.forkoff = 15
+core.aformat = 1 (local)
+...
+a.sfattr.hdr.totsize = 31
+a.sfattr.hdr.count = 2
+a.sfattr.list[0].namelen = 10
+a.sfattr.list[0].valuelen = 0
+a.sfattr.list[0].root = 0
+a.sfattr.list[0].secure = 0
+a.sfattr.list[0].name = "empty_attr"
+a.sfattr.list[1].namelen = 7
+a.sfattr.list[1].valuelen = 4
+a.sfattr.list[1].root = 1
+a.sfattr.list[1].secure = 0
+a.sfattr.list[1].name = "trust_a"
+a.sfattr.list[1].value = "val1"
+</programlisting>
+ <para>Another attribute is added:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/66.png" format="PNG" /></imageobject>
+ <textobject><phrase>code66</phrase></textobject>
+</mediaobject>
+ <para>One more is added:</para>
+<programlisting>
+xfs_db&gt; p
+core.naextents = 0
+core.forkoff = 10
+core.aformat = 1 (local)
+...
+a.sfattr.hdr.totsize = 69
+a.sfattr.hdr.count = 4
+a.sfattr.list[0].namelen = 10
+a.sfattr.list[0].valuelen = 0
+a.sfattr.list[0].root = 0
+a.sfattr.list[0].secure = 0
+a.sfattr.list[0].name = "empty_attr"
+a.sfattr.list[1].namelen = 7
+a.sfattr.list[1].valuelen = 4
+a.sfattr.list[1].root = 1
+a.sfattr.list[1].secure = 0
+a.sfattr.list[1].name = "trust_a"
+a.sfattr.list[1].value = "val1"
+a.sfattr.list[2].namelen = 6
+a.sfattr.list[2].valuelen = 12
+a.sfattr.list[2].root = 0
+a.sfattr.list[2].secure = 0
+a.sfattr.list[2].name = "second"
+a.sfattr.list[2].value = "second_value"
+a.sfattr.list[3].namelen = 6
+a.sfattr.list[3].valuelen = 8
+a.sfattr.list[3].root = 0
+a.sfattr.list[3].secure = 1
+a.sfattr.list[3].name = "policy"
+a.sfattr.list[3].value = "contents"
+</programlisting>
+ <para>A raw dump is shown to compare with the attr1 dump on a prior page, the header is highlighted:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/67.png" format="PNG" /></imageobject>
+ <textobject><phrase>code67</phrase></textobject>
+</mediaobject>
+ <para>It can be clearly seen that attr2 allows many more attributes to be stored in an inode before they are moved to another filesystem block.</para></section>
+
+
+
+
+<section id="Leaf_Attributes"><title>Leaf Attributes</title>
+ <para>When an inode's attribute fork space is used up with shortform attributes and more are added, the attribute format is migrated to "extents".</para>
+ <para>Extent based attributes use hash/index pairs to speed up an attribute lookup. The first part of the "leaf" contains an array of fixed size hash/index pairs with the flags stored as well. The remaining part of the leaf block contains the array name/value pairs, where each element varies in length.</para>
+ <para>Each leaf is based on the <command>xfs_da_blkinfo_t</command> block header declared in Leaf Directories. The structure encapsulating all other structures in the <command>xfs_attr_leafblock_t</command>.</para>
+ <para>The structures involved are:</para>
+<programlisting>
+typedef struct xfs_attr_leaf_map {
+ __be16 base;
+ __be16 size;
+} xfs_attr_leaf_map_t;
+
+typedef struct xfs_attr_leaf_hdr {
+ xfs_da_blkinfo_t info;
+ __be16 count;
+ __be16 usedbytes;
+ __be16 firstused;
+ __u8 holes;
+ __u8 pad1;
+ xfs_attr_leaf_map_t freemap[3];
+} xfs_attr_leaf_hdr_t;
+
+typedef struct xfs_attr_leaf_entry {
+ __be32 hashval;
+ __be16 nameidx;
+ __u8 flags;
+ __u8 pad2;
+} xfs_attr_leaf_entry_t;
+
+typedef struct xfs_attr_leaf_name_local {
+ __be16 valuelen;
+ __u8 namelen;
+ __u8 nameval[1];
+} xfs_attr_leaf_name_local_t;
+
+typedef struct xfs_attr_leaf_name_remote {
+ __be32 valueblk;
+ __be32 valuelen;
+ __u8 namelen;
+ __u8 name[1];
+} xfs_attr_leaf_name_remote_t;
+
+typedef struct xfs_attr_leafblock {
+ xfs_attr_leaf_hdr_t hdr;
+ xfs_attr_leaf_entry_t entries[1];
+ xfs_attr_leaf_name_local_t namelist;
+ xfs_attr_leaf_name_remote_t valuelist;
+} xfs_attr_leafblock_t;
+</programlisting>
+
+ <para>Each leaf header uses the following magic number:</para>
+<programlisting>
+#define XFS_ATTR_LEAF_MAGIC        0xfbee
+</programlisting>
+
+ <para>The hash/index elements in the <command>entries[]</command> array are packed from the top of the block.  Name/values grow from the bottom but are not packed. The freemap contains run-length-encoded entries for the free bytes after the <command>entries[]</command> array, but only the three largest runs are stored (smaller runs are dropped).  When the <command>freemap</command> doesn’t show enough space for an allocation, name/value area is compacted and allocation is tried again.  If there still isn't enough space, then the block is split. The name/value structures (both local and remote versions) must be 32-bit aligned.</para>
+ <para>For attributes with small values (ie. the value can be stored within the leaf), the <command>XFS_ATTR_LOCAL</command> flag is set for the attribute. The entry details are stored using the <command>xfs_attr_leaf_name_local_t</command> structure. For large attribute values that cannot be stored within the leaf, separate filesystem blocks are allocated to store the value. They use the <command>xfs_attr_leaf_name_remote_t</command> structure.</para>
+ <para>
+
+
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/69.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>69</phrase></textobject>
+ </mediaobject>
+
+
+
+
+ </para>
+ <para>Both local and remote entries can be interleaved as they are only addressed by the hash/index entries. The flag is stored with the hash/index pairs so the appropriate structure can be used.</para>
+ <para>Since duplicate hash keys are possible, for each hash that matches during a lookup, the actual name string must be compared.</para>
+ <para>An “incomplete” bit is also used for attribute flags.  It shows that an attribute is in the middle of being created and should not be shown to the user if we crash during the time that the bit is set.  The bit is cleared when attribute has finished being setup.  This is done because some large attributes cannot be created inside a single transaction.</para>
+
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A single 30KB extended attribute is added to an inode:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.nblocks = 9
+core.nextents = 0
+core.naextents = 1
+core.forkoff = 15
+core.aformat = 2 (extents)
+...
+a.bmx[0] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,37535,9,0]
+xfs_db&gt; ablock 0
+xfs_db&gt; p
+hdr.info.forw = 0
+hdr.info.back = 0
+hdr.info.magic = 0xfbee
+hdr.count = 1
+hdr.usedbytes = 20
+hdr.firstused = 4076
+hdr.holes = 0
+hdr.freemap[0-2] = [base,size] 0:[40,4036] 1:[0,0] 2:[0,0]
+entries[0] = [hashval,nameidx,incomplete,root,secure,local]
+ 0:[0xfcf89d4f,4076,0,0,0,0]
+nvlist[0].valueblk = 0x1
+nvlist[0].valuelen = 30692
+nvlist[0].namelen = 8
+nvlist[0].name = "big_attr"
+</programlisting>
+ <para>Attribute blocks 1 to 8 (filesystem blocks 37536 to 37543) contain the raw binary value data for the attribute.</para>
+ <para>Index 4076 (0xfec) is the offset into the block where the name/value information is. As can be seen by the value, it's at the end of the block:</para>
+<programlisting>
+xfs_db&gt; type text
+xfs_db&gt; p
+000: 00 00 00 00 00 00 00 00 fb ee 00 00 00 01 00 14 ................
+010: 0f ec 00 00 00 28 0f c4 00 00 00 00 00 00 00 00 ................
+020: fc f8 9d 4f 0f ec 00 00 00 00 00 00 00 00 00 00 ...O............
+030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+...
+fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................
+ff0: 00 00 77 e4 08 62 69 67 5f 61 74 74 72 00 00 00 ..w..big.attr...
+</programlisting>
+ <para>A 30KB attribute and a couple of small attributes are added to a file:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.nblocks = 10
+core.extsize = 0
+core.nextents = 1
+core.naextents = 2
+core.forkoff = 15
+core.aformat = 2 (extents)
+...
+u.bmx[0] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,81857,1,0]
+a.bmx[0-1] = [startoff,startblock,blockcount,extentflag]
+ 0:[0,81858,1,0]
+ 1:[1,182398,8,0]
+xfs_db> ablock 0
+xfs_db> p
+hdr.info.forw = 0
+hdr.info.back = 0
+hdr.info.magic = 0xfbee
+hdr.count = 3
+hdr.usedbytes = 52
+hdr.firstused = 4044
+hdr.holes = 0
+hdr.freemap[0-2] = [base,size] 0:[56,3988] 1:[0,0] 2:[0,0]
+entries[0-2] = [hashval,nameidx,incomplete,root,secure,local]
+ 0:[0x1e9d3934,4044,0,0,0,1]
+ 1:[0x1e9d3937,4060,0,0,0,1]
+ 2:[0xfcf89d4f,4076,0,0,0,0]
+nvlist[0].valuelen = 6
+nvlist[0].namelen = 5
+nvlist[0].name = "attr2"
+nvlist[0].value = "value2"
+nvlist[1].valuelen = 6
+nvlist[1].namelen = 5
+nvlist[1].name = "attr1"
+nvlist[1].value = "value1"
+nvlist[2].valueblk = 0x1
+nvlist[2].valuelen = 30692
+nvlist[2].namelen = 8
+nvlist[2].name = "big_attr"
+
+</programlisting>
+ <para>As can be seen in the entries array, the two small attributes have the local flag set and the values are printed.</para>
+ <para>A raw disk dump shows the attributes. The last attribute added is highlighted (offset 4044 or 0xfcc):</para>
+ <para>
+<inlinemediaobject>
+ <imageobject><imagedata fileref="images/code/71.png" format="PNG" /></imageobject>
+ <textobject><phrase>c</phrase></textobject>
+</inlinemediaobject>
+</para>
+
+
+</section>
+
+
+
+
+
+<section id="Node_Attributes"><title>
+ Node Attributes</title>
+ <para>When the number of attributes exceeds the space that can fit in one filesystem block (ie. hash, flag, name and local values), the first attribute block becomes the root of a B+tree where the leaves contain the hash/name/value information that was stored in a single leaf block. The inode's attribute format itself remains extent based. The nodes use the <command>xfs_da_intnode_t structure</command> introduced in Node Directories.</para>
+ <para>The location of the attribute leaf blocks can be in any order, the only way to determine the appropriate is by the node block hash/before values. Given a hash to lookup, you read the node's btree array and first <command>hashval</command> in the array that exceeds the given hash and it can then be found in the block pointed to by the <command>before</command> value. </para>
+ <para>
+
+
+
+
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/72.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>72</phrase></textobject>
+ </mediaobject>
+
+
+
+
+
+
+ </para>
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>An inode with 1000 small attributes with the naming "attribute_n" where 'n' is a number:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.nblocks = 15
+core.nextents = 0
+core.naextents = 1
+core.forkoff = 15
+core.aformat = 2 (extents)
+...
+a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,525144,15,0]
+xfs_db> ablock 0
+xfs_db> p
+hdr.info.forw = 0
+hdr.info.back = 0
+hdr.info.magic = 0xfebe
+hdr.count = 14
+hdr.level = 1
+btree[0-13] = [hashval,before]
+ 0:[0x3435122d,1]
+ 1:[0x343550a9,14]
+ 2:[0x343553a6,13]
+ 3:[0x3436122d,12]
+ 4:[0x343650a9,8]
+ 5:[0x343653a6,7]
+ 6:[0x343691af,6]
+ 7:[0x3436d0ab,11]
+ 8:[0x3436d3a7,10]
+ 9:[0x3437122d,9]
+ 10:[0x3437922e,3]
+ 11:[0x3437d22a,5]
+ 12:[0x3e686c25,4]
+ 13:[0x3e686fad,2]
+
+</programlisting>
+ <para>The hashes are in ascending order in the btree array, and if the hash for the attribute we are looking up is before the entry, we go to the addressed attribute block.</para>
+ <para>For example, to lookup attribute "attribute_267":</para>
+ <programlisting>
+xfs_db&gt; hash attribute_267
+0x3437d1a8
+</programlisting>
+
+ <para>In the root btree node, this falls between <command>0x3437922e</command> and <command>0x3437d22a</command>, therefore leaf 11 or attribute block 5 will contain the entry.</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/73-74.png" format="PNG" /></imageobject>
+ <textobject><phrase>code73-74</phrase></textobject>
+</mediaobject>
+ <para>Each of the hash entries has <command>XFS_ATTR_LOCAL</command> flag set (1), which means the attribute's value follows immediately after the name. Raw disk of the name/value pair at offset 2864 (0xb30), highlighted with "value_267\d" following immediately after the name:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/74.png" format="PNG" /></imageobject>
+ <textobject><phrase>code74</phrase></textobject>
+</mediaobject>
+ <para>Each entry starts on a 32-bit (4 byte) boundary, therefore the highlighted entry has 2 unused bytes after it.</para>
+ </section>
+
+
+
+
+<section id="Btree_Attributes"><title>B+tree Attributes</title>
+ <para>When the attribute's extent map in an inode grows beyond the available space, the inode's attribute format is changed to a "btree". The inode contains root node of the extent B+tree which then address the leaves that contains the extent arrays for the attribute data. The attribute data itself in the allocated filesystem blocks use the same layout and structures as described in Node Attributes.</para>
+ <para>Refer to the previous section on B+tree Data Extents for more information on XFS B+tree extents.</para>
+
+
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>Added 2000 attributes with 729 byte values to a file:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+...
+core.nblocks = 640
+core.extsize = 0
+core.nextents = 1
+core.naextents = 274
+core.forkoff = 15
+core.aformat = 3 (btree)
+...
+a.bmbt.level = 1
+a.bmbt.numrecs = 2
+a.bmbt.keys[1-2] = [startoff] 1:[0] 2:[219]
+a.bmbt.ptrs[1-2] = 1:83162 2:109968
+xfs_db> fsblock 83162
+xfs_db> type bmapbtd
+xfs_db> p
+magic = 0x424d4150
+level = 0
+numrecs = 127
+leftsib = null
+rightsib = 109968
+recs[1-127] = [startoff,startblock,blockcount,extentflag]
+ 1:[0,81870,1,0]
+ ...
+xfs_db&gt; fsblock 109968
+xfs_db&gt; type bmapbtd
+xfs_db&gt; p
+magic = 0x424d4150
+level = 0
+numrecs = 147
+leftsib = 83162
+rightsib = null
+recs[1-147] = [startoff,startblock,blockcount,extentflag]
+ ...
+ (which is fsblock 81870)
+xfs_db&gt; ablock 0
+xfs_db&gt; p
+hdr.info.forw = 0
+hdr.info.back = 0
+hdr.info.magic = 0xfebe
+hdr.count = 2
+hdr.level = 2
+btree[0-1] = [hashval,before] 0:[0x343612a6,513] 1:[0x3e686fad,512]
+
+</programlisting>
+ <para>The extent B+tree has two leaves that specify the 274 extents used for the attributes. Looking at the first block, it can be seen that the attribute B+tree is two levels deep. The two blocks at offset 513 and 512 (ie. access using the <command>ablock</command> command) are intermediate <command>xfs_da_intnode_t</command> nodes that index all the attribute leaves.</para></section></chapter>
+
+
+
diff --git a/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml b/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml
new file mode 100644
index 0000000..c27d3f8
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml
@@ -0,0 +1,180 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<chapter id="Internal_Inodes"><title>Internal Inodes</title>
+ <para>XFS allocates several inodes when a filesystem is created. These are internal and not accessible from the standard directory structure. These inodes are only accessible from the superblock.</para>
+
+<section id="Quota_Inodes"><title>
+ Quota Inodes</title>
+ <para>If quotas are used, two inodes are allocated for user and group quota management. If project quotas are used, these replace the group quota management and therefore uses the group quota inode.</para>
+ <itemizedlist>
+ <listitem>
+ <para>Project quota's primary purpose is to track and monitor disk usage for directories. For this to occur, the directory inode must have the <command>XFS_DIFLAG_PROJINHERIT</command> flag set so all inodes created underneath the directory inherit the project ID.</para>
+ </listitem>
+ <listitem>
+ <para>Inodes and blocks owned by ID zero do not have enforced quotas, but only quota accounting.</para>
+ </listitem>
+ <listitem>
+ <para>­Extended attributes do not contribute towards the ID's quota .</para>
+ </listitem>
+ <listitem>
+ <para>To access each ID's quota information in the file, seek to the ID offset multiplied by the size of <command>xfs_dqblk_t</command> (136 bytes). </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/76.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>76</phrase></textobject>
+ </mediaobject>
+
+ </para>
+
+ <para>
+ Quota information stored in the two inodes (in data extents) are an array of the <command>xfs_dqblk_t</command> structure where there is one instance for each ID in the system:</para>
+<programlisting>
+typedef struct xfs_disk_dquot {
+ __be16 d_magic;
+ __u8 d_version;
+ __u8 d_flags;
+ __be32 d_id;
+ __be64 d_blk_hardlimit;
+ __be64 d_blk_softlimit;
+ __be64 d_ino_hardlimit;
+ __be64 d_ino_softlimit;
+ __be64 d_bcount;
+ __be64 d_icount;
+ __be32 d_itimer;
+ __be32 d_btimer;
+ __be16 d_iwarns;
+ __be16 d_bwarns;
+ __be32 d_pad0;
+ __be64 d_rtb_hardlimit;
+ __be64 d_rtb_softlimit;
+ __be64 d_rtbcount;
+ __be32 d_rtbtimer;
+ __be16 d_rtbwarns;
+ __be16 d_pad;
+} xfs_disk_dquot_t;
+typedef struct xfs_dqblk {
+ xfs_disk_dquot_t dd_diskdq;
+ char dd_fill[32];
+} xfs_dqblk_t;
+</programlisting>
+
+
+
+
+<variablelist>
+<varlistentry>
+ <term>d_magic</term>
+ <listitem><para>Specifies the signature where these two bytes are 0x4451 (<command>XFS_DQUOT_MAGIC</command>), or "DQ" in ASCII.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_version</term>
+ <listitem><para>Specifies the structure version, currently this is one (<command>XFS_DQUOT_VERSION</command>).</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_flags</term>
+ <listitem><para>Specifies which type of ID the structure applies to:
+ <programlisting>
+#define XFS_DQ_USER 0x0001
+#define XFS_DQ_PROJ 0x0002
+#define XFS_DQ_GROUP 0x0004
+ </programlisting></para></listitem>
+</varlistentry>
+
+
+<varlistentry>
+ <term>d_id</term>
+ <listitem><para>The ID for the quota structure. This will be a uid, gid or projid based on the value of <command>d_flags</command>.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_blk_hardlimit</term>
+ <listitem><para>Specifies the hard limit for the number of filesystem blocks the ID can own. The ID will not be able to use more space than this limit. If it is attempted, <command>ENOSPC</command> will be returned.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_blk_softlimit</term>
+ <listitem><para>Specifies the soft limit for the number of filesystem blocks the ID can own.  The ID can temporarily use more space than by <command>d_blk_softlimit</command> up to <command>d_blk_hardlimit</command>. If the space is not freed by the time limit specified by ID zero's <command>d_btimer</command> value, the ID will be denied more space until the total blocks owned goes below <command>d_blk_softlimit</command>.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_ino_hardlimit</term>
+ <listitem><para>Specifies the hard limit for the number of inodes the ID can own. The ID will not be able to create or own any more inodes if <command>d_icount</command> reaches this value.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_ino_softlimit</term>
+ <listitem><para>Specifies the soft limit for the number of inodes the ID can own. The ID can temporarily create or own more inodes than specified by d_ino_softlimit up to d_ino_hardlimit. If the inode count is not reduced by the time limit specified by ID zero's d_itimer value, the ID will be denied from creating or owning more inodes until the count goes below d_ino_softlimit.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_bcount</term>
+ <listitem><para>Specifies how many filesystem blocks are actually owned by the ID.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_icount</term>
+ <listitem><para>Specifies how many inodes are actually owned by the ID.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_itimer</term>
+ <listitem><para>Specifies the time when the ID's <command>d_icount</command> exceeded <command>d_ino_softlimit</command>. The soft limit will turn into a hard limit after the elapsed time exceeds ID zero's <command>d_itimer</command> value. When d_icount goes back below <command>d_ino_softlimit</command>, <command>d_itimer</command> is reset back to zero. </para></listitem>
+
+</varlistentry>
+<varlistentry>
+ <term>d_btimer</term>
+ <listitem><para>Specifies the time when the ID's <command>d_bcount</command> exceeded <command>d_blk_softlimit</command>. The soft limit will turn into a hard limit after the elapsed time exceeds ID zero's <command>d_btimer</command> value. When d_bcount goes back below <command>d_blk_softlimit</command>, <command>d_btimer</command> is reset back to zero.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_iwarns
+ d_bwarns
+ d_rtbwarns</term>
+ <listitem><para>Specifies how many times a warning has been issued. Currently not used.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_rtb_hardlimit</term>
+ <listitem><para>Specifies the hard limit for the number of real-time blocks the ID can own. The ID cannot own more space on the real-time subvolume beyond this limit.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_rtb_softlimit</term>
+ <listitem><para>Specifies the soft limit for the number of real-time blocks the ID can own. The ID can temporarily own more space than specified by <command>d_rtb_softlimit</command> up to <command>d_rtb_hardlimit</command>. If <command>d_rtbcount</command> is not reduced by the time limit specified by ID zero's <command>d_rtbtimer value</command>, the ID will be denied from owning more space until the count goes below <command>d_rtb_softlimit</command></para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>d_rtbcount</term>
+ <listitem><para>Specifies how many real-time blocks are currently owned by the ID.</para></listitem>
+
+</varlistentry>
+<varlistentry>
+ <term>d_rtbtimer</term>
+ <listitem><para>Specifies the time when the ID's <command>d_rtbcount</command> exceeded <command>d_rtb_softlimit</command>. The soft limit will turn into a hard limit after the elapsed time exceeds ID zero's <command>d_rtbtimer</command> value. When <command>d_rtbcount</command> goes back below <command>d_rtb_softlimit</command>, <command>d_rtbtimer</command> is reset back to zero.</para></listitem>
+</varlistentry>
+</variablelist>
+</section>
+
+
+
+
+
+<section id="Real-time_Inodes"><title>Real-time Inodes</title>
+ <para>There are two inodes allocated to managing the real-time device's space, the Bitmap Inode and the Summary Inode.</para>
+
+<section id="Real-Time_Bitmap_Inode"><title>Real-Time Bitmap Inode</title>
+ <para>The Bitmap Inode tracks the used/free space in the real-time device using an old-style bitmap. One bit is allocated per real-time extent. The size of an extent is specified by the superblock's <command>sb_rextsize</command> value.</para>
+ <para>The number of blocks used by the bitmap inode is equal to the number of real-time extents (<command>sb_rextents</command>) divided by the block size (<command>sb_blocksize</command>) and bits per byte. This value is stored in <command>sb_rbmblocks</command>. The nblocks and extent array for the inode should match this.</para>
+
+ <programlisting>
+xfs_ino_t        sb_rbmino;        </programlisting>
+ </section><section><title>Real-Time Summary Inode</title>
+<programlisting>
+xfs_ino_t        sb_rsumino;        </programlisting>
+ </section></section></chapter>
+
diff --git a/XFS_Filesystem_Structure/en-US/Introduction.xml b/XFS_Filesystem_Structure/en-US/Introduction.xml
new file mode 100644
index 0000000..4ddfb9f
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Introduction.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter>
+ <title>Introduction</title>
+<para>This document describes the layout of an XFS filesystem. </para>
+ <para>It shows how to manually inspect it by showing examples using the xfs_db user-space tool supplied with the XFS filesystem driver.</para>
+ <para>TODO:</para>
+</chapter>
diff --git a/XFS_Filesystem_Structure/en-US/Journaling_Log.xml b/XFS_Filesystem_Structure/en-US/Journaling_Log.xml
new file mode 100644
index 0000000..bb3a509
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Journaling_Log.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter>
+<title>Journaling Log</title>
+ <para>TODO:</para>
+</chapter>
+
diff --git a/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml b/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml
new file mode 100644
index 0000000..0848eb9
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml
@@ -0,0 +1,438 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<chapter id="On-disk_Inode">
+ <title>On-disk Inode</title>
+ <para>All files, directories and links are stored on disk with inodes and descend from the root inode with it's number defined in the superblock (<xref linkend="Superblocks"/>). The previous section on AG Inode Management (<xref linkend="AG_Inode_Management"/>) describes the allocation and management of inodes on disk. This section describes the contents of inodes themselves.</para>
+ <para>An inode is divided into 3 parts:</para>
+ <para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/23.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>23</phrase></textobject>
+</mediaobject>
+
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The core contains what the inode represents, stat data and information describing the data and attribute forks. </para>
+ </listitem>
+ <listitem>
+ <para>The <command>di_u</command> "data fork" contains normal data related to the inode. It's contents depends on the file type specified by <command>di_core.di_mode</command> (eg. regular file, directory, link, etc) and how much information is contained in the file which determined by <command>di_core.di_format</command>. The following union to represent this data is declared as follows:</para>
+ <programlisting>
+union {
+ xfs_bmdr_block_t di_bmbt;
+ xfs_bmbt_rec_t di_bmx[1];
+ xfs_dir2_sf_t di_dir2sf;
+ char di_c[1];
+ xfs_dev_t di_dev;
+ uuid_t di_muuid;
+ char di_symlink[1];
+} di_u;
+
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>The di_a "attribute fork" contains extended attributes. Its layout is determined by the <command>di_core.di_aformat</command> value. Its representation is declared as follows:</para>
+ <programlisting>
+union {
+ xfs_bmdr_block_t di_abmbt;
+ xfs_bmbt_rec_t di_abmx[1];
+ xfs_attr_shortform_t di_attrsf;
+} di_a;
+ </programlisting>
+ </listitem>
+ </itemizedlist>
+ <note><para>Note: The above two unions are rarely used in the XFS code, but the structures within the union are directly cast depending on the <command>di_mode/di_format</command> and <command>di_aformat</command> values. They are referenced in this document to make it easier to explain the various structures in use within the inode.</para></note>
+ <para>The remaining space in the inode after <command>di_next_unlinked</command> where the two forks are located is called the inode's "literal area". This starts at offset 100 (0x64) in the inode.</para>
+ <para>The space for each of the two forks in the literal area is determined by the inode size, and <command>di_core.di_forkoff</command>. The data fork is located between the start of the literal area and <command>di_forkoff</command>. The attribute fork is located between <command>di_forkoff</command> and the end of the inode.</para>
+
+
+
+
+<section id="Inode_Core"><title>Inode Core</title>
+ <para>The inode's core is 96 bytes in size and contains information about the file itself including most stat data information about data and attribute forks after the core within the inode. It uses the following structure:</para>
+<programlisting>
+typedef struct xfs_dinode_core {
+ __uint16_t di_magic;
+ __uint16_t di_mode;
+ __int8_t di_version;
+ __int8_t di_format;
+ __uint16_t di_onlink;
+ __uint32_t di_uid;
+ __uint32_t di_gid;
+ __uint32_t di_nlink;
+ __uint16_t di_projid;
+ __uint8_t di_pad[8];
+ __uint16_t di_flushiter;
+ xfs_timestamp_t di_atime;
+ xfs_timestamp_t di_mtime;
+ xfs_timestamp_t di_ctime;
+ xfs_fsize_t di_size;
+ xfs_drfsbno_t di_nblocks;
+ xfs_extlen_t di_extsize;
+ xfs_extnum_t di_nextents;
+ xfs_aextnum_t di_anextents;
+ __uint8_t di_forkoff;
+ __int8_t di_aformat;
+ __uint32_t di_dmevmask;
+ __uint16_t di_dmstate;
+ __uint16_t di_flags;
+ __uint32_t di_gen;
+} xfs_dinode_core_t;
+</programlisting>
+
+
+<variablelist>
+<varlistentry>
+ <term>di_magic</term>
+ <listitem><para>The inode signature where these two bytes are 0x494e, or "IN" in ASCII.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_mode</term>
+ <listitem><para>Specifies the mode access bits and type of file using the standard S_Ixxx values defined in stat.h.</para></listitem>
+
+</varlistentry>
+<varlistentry>
+ <term>di_version</term>
+ <listitem><para>Specifies the inode version which currently can only be 1 or 2. The inode version specifies the usage of the <command>di_onlink</command>, <command>di_nlink</command> and <command>di_projid</command> values in the inode core. Initially, inodes are created as v1 but can be converted on the fly to v2 when required.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term>di_format</term>
+ <listitem><para>Specifies the format of the data fork in conjunction with the <command>di_mode</command> type. This can be one of several values. For directories and links, it can be "local" where all metadata associated with the file is within the inode, "extents" where the inode contains an array of extents to other filesystem blocks which contain the associated metadata or data or "btree" where the inode contains a B+tree root node which points to filesystem blocks containing the metadata or data. Migration between the formats depends on the amount of metadata associated with the inode. "dev" is used for character and block devices while "uuid" is currently not used.
+ <programlisting>
+typedef enum xfs_dinode_fmt {
+ XFS_DINODE_FMT_DEV,
+ XFS_DINODE_FMT_LOCAL,
+ XFS_DINODE_FMT_EXTENTS,
+ XFS_DINODE_FMT_BTREE,
+ XFS_DINODE_FMT_UUID
+} xfs_dinode_fmt_t;
+ </programlisting></para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_onlink</term>
+ <listitem><para>In v1 inodes, this specifies the number of links to the inode from directories. When the number exceeds 65535, the inode is converted to v2 and the link count is stored in <command>di_nlink</command>.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_uid</term>
+ <listitem><para>Specifies the owner's UID of the inode. </para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_gid</term>
+ <listitem><para>Specifies the owner's GID of the inode.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_nlink</term>
+ <listitem><para>Specifies the number of links to the inode from directories. This is maintained for both inode versions for current versions of XFS. Old versions of XFS did not support v2 inodes, and therefore this value was never updated and was classed as reserved space (part of <command>di_pad</command>).</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_projid</term>
+ <listitem><para>Specifies the owner's project ID in v2 inodes. An inode is converted to v2 if the project ID is set.  This value must be zero for v1 inodes.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_pad[8]</term>
+ <listitem><para>Reserved, must be zero.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_flushiter</term>
+ <listitem><para>Incremented on flush.</para></listitem>
+</varlistentry>
+
+
+
+<varlistentry>
+ <term>di_atime</term>
+ <listitem><para>Specifies the last access time of the files using UNIX time conventions the following structure. This value maybe undefined if the filesystem is mounted with the "noatime" option.
+ <programlisting>
+typedef struct xfs_timestamp {
+ __int32_t t_sec;
+ __int32_t t_nsec;
+} xfs_timestamp_t;
+ </programlisting></para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_mtime</term>
+ <listitem><para>Specifies the last time the file was modified.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_ctime</term>
+ <listitem><para>Specifies when the inode's status was last changed.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_size</term>
+ <listitem><para>Specifies the EOF of the inode in bytes. This can be larger or smaller than the extent space (therefore actual disk space) used for the inode. For regular files, this is the filesize in bytes, directories, the space taken by directory entries and for links, the length of the symlink.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_nblocks</term>
+ <listitem><para>Specifies the number of filesystem blocks used to store the inode's data including relevant metadata like B+trees. This does not include blocks used for extended attributes.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_extsize</term>
+ <listitem><para>Specifies the extent size for filesystems with real-time devices and an extent size hint for standard filesystems. For normal filesystems, and with directories, the <command>XFS_DIFLAG_EXTSZINHERIT</command> flag must be set in <command>di_flags</command> if this field is used. Inodes created in these directories will inherit the di_extsize value and have <command>XFS_DIFLAG_EXTSIZE</command> set in their <command>di_flags</command>. When a file is written to beyond allocated space, XFS will attempt to allocate additional disk space based on this value.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_nextents</term>
+ <listitem><para>Specifies the number of data extents associated with this inode.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_anextents</term>
+ <listitem><para>Specifies the number of extended attribute extents associated with this inode.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_forkoff</term>
+ <listitem><para>Specifies the offset into the inode's literal area where the extended attribute fork starts. This is an 8-bit value that is multiplied by 8 to determine the actual offset in bytes (ie. attribute data is 64-bit aligned). This also limits the maximum size of the inode to 2048 bytes. This value is initially zero until an extended attribute is created. When in attribute is added, the nature of <command>di_forkoff</command> depends on the <command>XFS_SB_VERSION2_ATTR2BIT</command>  flag in the superblock. Refer to the Extended Attribute Versions section (<xref linkend="Extended_Attribute_Versions"/>) for more details.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_aformat</term>
+ <listitem><para>Specifies the format of the attribute fork. This uses the same values as <command>di_format</command>, but restricted to "local", "extents" and "btree" formats for extended attribute data.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_dmevmask</term>
+ <listitem><para>DMAPI event mask.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_dmstate</term>
+ <listitem><para>DMAPI state.</para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_flags</term>
+ <listitem><para> Specifies flags associated with the inode. This can be a combination of the following values:
+ <informaltable frame="all">
+ <tgroup cols="2"><thead><row>
+ <entry>
+ <para>Flag</para>
+ </entry>
+ <entry>
+ <para>Description</para>
+ </entry>
+ </row>
+ </thead><tbody>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_REALTIME</command></para>
+ </entry>
+ <entry>
+ <para>The inode's data is located on the real-time device.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_PREALLOC</command></para>
+ </entry>
+ <entry>
+ <para>The inode's extents have been preallocated.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_NEWRTBM</command></para>
+ </entry>
+ <entry>
+ <para>Specifies the <command>sb_rbmino</command> uses the new real-time bitmap format</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_IMMUTABLE</command></para>
+ </entry>
+ <entry>
+ <para>Specifies the inode cannot be modified.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_APPEND</command></para>
+ </entry>
+ <entry>
+ <para>The inode is in append only mode.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_SYNC</command></para>
+ </entry>
+ <entry>
+ <para>The inode is written synchronously.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_NOATIME</command></para>
+ </entry>
+ <entry>
+ <para>The inode's <command>di_atime</command> is not updated.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_NODUMP</command></para>
+ </entry>
+ <entry>
+ <para>Specifies the inode is to be ignored by xfsdump.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_RTINHERIT</command></para>
+ </entry>
+ <entry>
+ <para>For directory inodes, new inodes inherit the <command>XFS_DIFLAG_REALTIME</command> bit.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_PROJINHERIT</command></para>
+ </entry>
+ <entry>
+ <para>For directory inodes, new inodes inherit the <command>di_projid</command> value.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_NOSYMLINKS</command></para>
+ </entry>
+ <entry>
+ <para>For directory inodes, symlinks cannot be created.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_EXTSIZE</command></para>
+ </entry>
+ <entry>
+ <para>Specifies the extent size for real-time files or a and extent size hint for regular files.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_EXTSZINHERIT</command></para>
+ </entry>
+ <entry>
+ <para>For directory inodes, new inodes inherit the <command>di_extsize</command> value.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><command>XFS_DIFLAG_NODEFRAG</command></para>
+ </entry>
+ <entry>
+ <para>Specifies the inode is to be ignored when defragmenting the filesystem.</para>
+ </entry>
+ </row></tbody></tgroup>
+ </informaltable></para></listitem>
+</varlistentry>
+<varlistentry>
+ <term>di_gen</term>
+ <listitem>
+ <para>A generation number used for inode identification. This is used by tools that do inode scanning such as backup tools and xfsdump. An inode's generation number can change by unlinking and creating a new file that reuses the inode.
+ </para>
+ </listitem>
+</varlistentry>
+
+</variablelist>
+
+
+ </section>
+
+<section id="Unlinked_Pointer"><title>Unlinked Pointer</title>
+ <para>The <command>di_next_unlinked</command> value in the inode is used to track inodes that have been unlinked (deleted) but which are still referenced. When an inode is unlinked and there is still an outstanding reference, the inode is added to one of the AGI's (<xref linkend="AG_Inode_Management"/>) <command>agi_unlinked</command> hash buckets. The AGI unlinked bucket points to an inode and the <command>di_next_unlinked</command> value points to the next inode in the chain. The last inode in the chain has <command>di_next_unlinked</command> set to NULL (-1).</para>
+ <para>Once the last reference is released, the inode is removed from the unlinked hash chain, and <command>di_next_unlinked</command> is set to NULL. In the case of a system crash, XFS recovery will complete the unlink process for any inodes found in these lists.</para>
+ <para>The only time the unlinked fields can be seen to be used on disk is either on an active filesystem or a crashed system. A cleanly unmounted or recovered filesystem will not have any inodes in these unlink hash chains.</para>
+ <para>
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/28.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>28</phrase></textobject>
+ </mediaobject>
+
+
+ </para></section>
+
+<section id="Data_Fork"><title>Data Fork</title>
+ <para>The structure of the inode's data fork based is on the inode's type and <command>di_format</command>. It always starts at offset 100 (0x64) in the inode's space which is the start of the inode's "literal area". The size of the data fork is determined by the type and format. The maximum size is determined by the inode size and <command>di_forkoff</command>. In code, use the <command>XFS_DFORK_PTR</command> macro specifying <command>XFS_DATA_FORK</command> for the "which" parameter. Alternatively, the <command>XFS_DFORK_DPTR</command> macro can be used.</para>
+ <para>Each of the following sub-sections summarises the contents of the data fork based on the inode type.</para>
+
+
+<section id="Regular_Files_S_IFREG">
+ <title>Regular Files (S_IFREG)</title>
+ <para>The data fork specifies the file's data extents. The extents specify where the file's actual data is located within the filesystem. Extents can have 2 formats which is defined by the di_format value: </para>
+ <itemizedlist>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_EXTENTS</command>: The extent data is fully contained within the inode which contains an array of extents to the filesystem blocks for the file's data. To access the extents, cast the return value from <command>XFS_DFORK_DPTR</command> to <command>xfs_bmbt_rec_t*</command>.</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_BTREE</command>: The extent data is contained in the leaves of a B+tree. The inode contains the root node of the tree and is accessed by casting the return value from <command>XFS_DFORK_DPTR</command> to <command>xfs_bmdr_block_t*</command>.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Details for each of these data extent formats are covered in the Data Extents section (<xref linkend="Data_Extents"/>) later on.</para></section>
+
+
+
+<section id="Directories_S_IFDIR"><title>Directories (S_IFDIR)</title>
+ <para>The data fork contains the directory's entries and associated data. The format of the entries is also determined by the <command>di_format</command> value and can be one of 3 formats:</para>
+ <itemizedlist>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_LOCAL</command>: The directory entries are fully contained within the inode. This is accessed by casting the value from <command>XFS_DFORK_DPTR</command> to <command>xfs_dir2_sf_t*</command>.</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_EXTENTS</command>: The actual directory entries are located in another filesystem block, the inode contains an array of extents to these filesystem blocks (<command>xfs_bmbt_rec_t*</command>).</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_BTREE</command>: The directory entries are contained in the leaves of a B+tree. The inode contains the root node (<command>xfs_bmdr_block_t*</command>).</para>
+ </listitem>
+ </itemizedlist>
+ <para>Details for each of these directory formats are covered in the Directories section (<xref linkend="Directories"/>) later on.</para></section>
+
+
+<section id="Symbolic_Links_S_IFLNK"><title>Symbolic Links (S_IFLNK)</title>
+ <para>The data fork contains the contents of the symbolic link. The format of the link is determined by the <command>di_format</command> value and can be one of 2 formats:</para>
+ <itemizedlist>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_LOCAL</command>: The symbolic link is fully contained within the inode. This is accessed by casting the return value from <command>XFS_DFORK_DPTR</command> to <command>char*</command>.</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_EXTENTS</command>: The actual symlink is located in another filesystem block, the inode contains the extents to these filesystem blocks (<command>xfs_bmbt_rec_t*</command>).</para>
+ </listitem>
+ </itemizedlist>
+ <para>Details for symbolic links is covered in the Symbolic Links section (<xref linkend="Symbolic_Links"/>) later on.</para></section>
+
+<section id="Other_File_Types"><title>Other File Types</title>
+ <para>For character and block devices (<command>S_IFCHR</command> and <command>S_IFBLK</command>), cast the value from <command>XFS_DFORK_DPTR</command> to <command>xfs_dev_t*</command>.</para></section></section>
+
+
+
+
+<section id="Attribute_Fork"><title>Attribute Fork</title>
+ <para>The attribute fork in the inode always contains the location of the extended attributes associated with the inode. </para>
+ <para>The location of the attribute fork in the inode's literal area (offset 100 to the end of the inode) is specified by the <command>di_forkoff</command> value in the inode's core. If this value is zero, the inode does not contain any extended attributes. Non-zero, the byte offset into the literal area = <command>di_forkoff</command> * 8, which also determines the 2048 byte maximum size for an inode. Attributes must be allocated on a 64-bit boundary on the disk. To access the extended attributes in code, use the <command>XFS_DFORK_PTR</command> macro specifying <command>XFS_ATTR_FORK</command> for the "which" parameter. Alternatively, the <command>XFS_DFORK_APTR</command> macro can be used.</para>
+ <para>Which structure in the attribute fork is used depends on the <command>di_aformat</command> value in the inode. It can be one of the following values:</para>
+ <itemizedlist>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_LOCAL</command>: The extended attributes are contained entirely within the inode. This is accessed by casting the value from <command>XFS_DFORK_APTR</command> to <command>xfs_attr_shortform_t*</command>.</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_EXTENTS</command>: The attributes are located in another filesystem block, the inode contains an array of pointers to these filesystem blocks. They are accessed by casting the value from <command>XFS_DFORK_APTR</command> to <command>xfs_bmbt_rec_t*</command>.</para>
+ </listitem>
+ <listitem>
+ <para><command>XFS_DINODE_FMT_BTREE</command>: The extents for the attributes are contained in the leaves of a B+tree. The inode contains the root node of the tree and is accessed by casting the value from <command>XFS_DFORK_APTR</command> to <command>xfs_bmdr_block_t*</command>.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Detailed information on the layouts of extended attributes are covered in the Extended Attributes section (<xref linkend="Extended_Attributes"/>) later on in this document.</para>
+
+
+
+<section id="Extended_Attribute_Versions"><title>Extended Attribute Versions</title>
+ <para>Extended attributes come in two versions: "attr1" or "attr2". The attribute version is specified by the <command>XFS_SB_VERSION2_ATTR2BIT</command>  flag in the <command>sb_features2</command> field in the superblock. It determines how the inode's extra space is split between <command>di_u</command> and <command>di_a</command> forks which also determines how the <command>di_forkoff</command> value is maintained in the inode's core.</para>
+ <para>With "attr1" attributes, the <command>di_forkoff</command> is set to somewhere in the middle of the space between the core and end of the inode and never changes (which has the effect of artificially limiting the space for data information). As the data fork grows, when it gets to <command>di_forkoff</command>, it will move the data to the level format level (ie. local &gt; extent &gt; btree). If very little space is used for either attributes or data, then a good portion of the available inode space is wasted with this version.</para>
+ <para>"Attr2" was introduced to maximum the utilisation of the inode's literal area. The <command>di_forkoff</command> starts at the end of the inode and works its way to the data fork as attributes are added. Attr2 is highly recommended if extended attributes are used.</para>
+ <para>The following diagram compares the two versions:</para>
+ <para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/30.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>30</phrase></textobject>
+</mediaobject>
+
+ </para></section></section></chapter>
diff --git a/XFS_Filesystem_Structure/en-US/Preface.xml b/XFS_Filesystem_Structure/en-US/Preface.xml
new file mode 100644
index 0000000..405e716
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Preface.xml
@@ -0,0 +1,13 @@
+<?xml version='1.0'?>
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<preface id="XFS_Filesystem_Structure-Preface">
+ <title>Preface</title>
+ <xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
+ <xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ </xi:fallback>
+ </xi:include>
+</preface>
diff --git a/XFS_Filesystem_Structure/en-US/Revision_History.xml b/XFS_Filesystem_Structure/en-US/Revision_History.xml
new file mode 100644
index 0000000..1294492
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Revision_History.xml
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<appendix id="appe-Publican-Revision_History">
+ <title>Revision History</title>
+ <simpara>
+ <revhistory>
+ <revision>
+ <revnumber>1.0</revnumber>
+ <date>Fri Jul 03 2009</date>
+ <author>
+ <firstname>Ryan</firstname>
+ <surname>Lerch</surname>
+ <email></email>
+ </author>
+ <revdescription>
+ <simplelist>
+ <member>Inital</member>
+ </simplelist>
+ </revdescription>
+ </revision>
+ </revhistory>
+ </simpara>
+</appendix>
+
diff --git a/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml b/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml
new file mode 100644
index 0000000..d4d2eb8
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml
@@ -0,0 +1,78 @@
+<?xml version='1.0'?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<chapter id="Symbolic_Links">
+ <title>Symbolic Links</title>
+ <para>Symbolic links to a file can be stored in one of two formats: "local" and "extents". The length of the symlink contents is always specified by the inode's <command>di_size</command> value.</para>
+
+
+<section id="Shortform_Symbolic_Links"><title>Shortform Symbolic Links</title>
+ <para>Symbolic links are stored with the "local" <command>di_format</command> if the symbolic link can fit within the inode's data fork. The link data is an array of characters (<command>di_symlink</command> array in the data fork union).</para>
+ <para>
+ <mediaobject>
+ <imageobject><imagedata fileref="images/61.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>61</phrase></textobject>
+ </mediaobject>
+
+ </para>
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A short symbolic link to a file is created:</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 0120777
+core.version = 1
+core.format = 1 (local)
+...
+core.size = 12
+core.nblocks = 0
+core.extsize = 0
+core.nextents = 0
+...
+u.symlink = "small_target"
+
+</programlisting>
+ <para>Raw on-disk data with the link contents highlighted:</para>
+<mediaobject>
+ <imageobject><imagedata fileref="images/code/61.png" format="PNG" /></imageobject>
+ <textobject><phrase>code61</phrase></textobject>
+</mediaobject>
+</section>
+
+
+
+<section id="Extent_Symbolic_Links"><title>Extent Symbolic Links</title>
+ <para>If the length of the symbolic link exceeds the space available in the inode's data fork, the link is moved to a new filesystem block and the inode's <command>di_format</command> is changed to "extents". The location of the block(s) is specified by the data fork's <command>di_bmx[]</command> array. In the significant majority of cases, this will be in one filesystem block as a symlink cannot be longer than 1024 characters.</para>
+ <para>
+
+ <mediaobject>
+ <imageobject><imagedata fileref="images/62.png" format="PNG" width="100%" scalefit="0"/></imageobject>
+ <textobject><phrase>62</phrase></textobject>
+ </mediaobject>
+
+ </para>
+
+<bridgehead>xfs_db Example:</bridgehead>
+ <para>A longer link is created (greater than 156 bytes):</para>
+<programlisting>
+xfs_db&gt; inode &lt;inode#&gt;
+xfs_db&gt; p
+core.magic = 0x494e
+core.mode = 0120777
+core.version = 1
+core.format = 2 (extents)
+...
+core.size = 182
+core.nblocks = 1
+core.extsize = 0
+core.nextents = 1
+...
+u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,37530,1,0]
+xfs_db&gt; dblock 0
+xfs_db&gt; type symlink
+xfs_db&gt; p
+"symlink contents..."
+</programlisting>
+</section></chapter>
diff --git a/XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.ent b/XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.ent
new file mode 100644
index 0000000..451f334
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.ent
@@ -0,0 +1,3 @@
+<!ENTITY PRODUCT "Red_Hat_Enterprise_Linux">
+<!ENTITY BOOKID "XFS_Filesystem_Structure">
+<!ENTITY YEAR "2008">
diff --git a/XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.xml b/XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.xml
new file mode 100644
index 0000000..b896b77
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/XFS_Filesystem_Structure.xml
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+
+<book status="draft">
+ <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <!--<xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />-->
+
+
+
+ <xi:include href="Introduction.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Common_XFS_Types.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Allocation_Groups.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="On-disk_Inode.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Data_Extents.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Directories.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Symbolic_Links.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Extended_Attributes.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Internal_Inodes.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Journaling_Log.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <!--<index />-->
+</book>
+
diff --git a/XFS_Filesystem_Structure/en-US/images/15a.png b/XFS_Filesystem_Structure/en-US/images/15a.png
new file mode 100644
index 0000000..bf25616
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/15a.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/15b.png b/XFS_Filesystem_Structure/en-US/images/15b.png
new file mode 100644
index 0000000..21de61a
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/15b.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/16.png b/XFS_Filesystem_Structure/en-US/images/16.png
new file mode 100644
index 0000000..5f46c52
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/16.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/18.png b/XFS_Filesystem_Structure/en-US/images/18.png
new file mode 100644
index 0000000..4097348
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/18.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/20a.png b/XFS_Filesystem_Structure/en-US/images/20a.png
new file mode 100644
index 0000000..52d0c26
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/20a.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/20b.png b/XFS_Filesystem_Structure/en-US/images/20b.png
new file mode 100644
index 0000000..977d57d
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/20b.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/23.png b/XFS_Filesystem_Structure/en-US/images/23.png
new file mode 100644
index 0000000..a74cd55
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/23.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/28.png b/XFS_Filesystem_Structure/en-US/images/28.png
new file mode 100644
index 0000000..e85b2c1
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/28.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/30.png b/XFS_Filesystem_Structure/en-US/images/30.png
new file mode 100644
index 0000000..f623fe5
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/30.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/31.png b/XFS_Filesystem_Structure/en-US/images/31.png
new file mode 100644
index 0000000..48b0172
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/31.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/32.png b/XFS_Filesystem_Structure/en-US/images/32.png
new file mode 100644
index 0000000..05da0b1
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/32.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/35.png b/XFS_Filesystem_Structure/en-US/images/35.png
new file mode 100644
index 0000000..25c3160
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/35.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/36.png b/XFS_Filesystem_Structure/en-US/images/36.png
new file mode 100644
index 0000000..c1d8b65
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/36.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/39.png b/XFS_Filesystem_Structure/en-US/images/39.png
new file mode 100644
index 0000000..0f264f4
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/39.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/43.png b/XFS_Filesystem_Structure/en-US/images/43.png
new file mode 100644
index 0000000..c9ef36b
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/43.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/48.png b/XFS_Filesystem_Structure/en-US/images/48.png
new file mode 100644
index 0000000..e906f18
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/48.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/54.png b/XFS_Filesystem_Structure/en-US/images/54.png
new file mode 100644
index 0000000..9e2ee03
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/54.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/6.png b/XFS_Filesystem_Structure/en-US/images/6.png
new file mode 100644
index 0000000..36c22fa
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/6.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/61.png b/XFS_Filesystem_Structure/en-US/images/61.png
new file mode 100644
index 0000000..7b18e61
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/61.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/62.png b/XFS_Filesystem_Structure/en-US/images/62.png
new file mode 100644
index 0000000..e240fa3
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/62.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/64.png b/XFS_Filesystem_Structure/en-US/images/64.png
new file mode 100644
index 0000000..ced8ffc
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/64.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/69.png b/XFS_Filesystem_Structure/en-US/images/69.png
new file mode 100644
index 0000000..3efa679
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/69.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/72.png b/XFS_Filesystem_Structure/en-US/images/72.png
new file mode 100644
index 0000000..fd7a99f
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/72.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/76.png b/XFS_Filesystem_Structure/en-US/images/76.png
new file mode 100644
index 0000000..346aa7d
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/76.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/33a.png b/XFS_Filesystem_Structure/en-US/images/code/33a.png
new file mode 100644
index 0000000..9ffb4f4
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/33a.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/33b.png b/XFS_Filesystem_Structure/en-US/images/code/33b.png
new file mode 100644
index 0000000..b45323c
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/33b.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/40.png b/XFS_Filesystem_Structure/en-US/images/code/40.png
new file mode 100644
index 0000000..38441ea
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/40.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/46.png b/XFS_Filesystem_Structure/en-US/images/code/46.png
new file mode 100644
index 0000000..df7abd5
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/46.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/57.png b/XFS_Filesystem_Structure/en-US/images/code/57.png
new file mode 100644
index 0000000..6f3b679
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/57.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/60.png b/XFS_Filesystem_Structure/en-US/images/code/60.png
new file mode 100644
index 0000000..5795be9
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/60.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/61.png b/XFS_Filesystem_Structure/en-US/images/code/61.png
new file mode 100644
index 0000000..ecff05e
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/61.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/65.png b/XFS_Filesystem_Structure/en-US/images/code/65.png
new file mode 100644
index 0000000..dd74d54
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/65.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/66.png b/XFS_Filesystem_Structure/en-US/images/code/66.png
new file mode 100644
index 0000000..3479ac4
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/66.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/67.png b/XFS_Filesystem_Structure/en-US/images/code/67.png
new file mode 100644
index 0000000..efec42a
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/67.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/71.png b/XFS_Filesystem_Structure/en-US/images/code/71.png
new file mode 100644
index 0000000..e66b710
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/71.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/73-74.png b/XFS_Filesystem_Structure/en-US/images/code/73-74.png
new file mode 100644
index 0000000..e44878c
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/73-74.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/74.png b/XFS_Filesystem_Structure/en-US/images/code/74.png
new file mode 100644
index 0000000..e50f0a4
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/74.png
Binary files differ
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/33a.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/33a.svg
new file mode 100644
index 0000000..1c2d8e5
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/33a.svg
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="297"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="71.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="181"
+ inkscape:cy="129.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="297"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="675.36218"
+ x="163"
+ height="12"
+ width="268"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect80"
+ width="93"
+ height="12"
+ x="70"
+ y="690.36218"
+ rx="0"
+ ry="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan78">xfs_db&gt; type text</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan90">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan92">00: 49 4e 81 a4 01 02 00 01 00 00 00 00 00 00 00 00 IN..............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan94">10: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan96">20: 44 b6 88 dd 2f 8a ed d0 44 b6 88 f7 10 8c 5b d0 D.......D.......</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan98">30: 44 b6 88 f7 10 8c 5b d0 00 00 00 00 01 7b b0 00 D...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan100">40: 00 00 00 00 00 00 17 bb 00 00 00 00 00 00 00 03 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan102">50: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan104">60: ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 0d ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan106">70: 5e a0 07 e9 00 00 00 00 00 0f d2 00 00 00 00 0f ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan108">80: 58 e0 07 e9 00 00 00 00 00 1f a4 00 00 00 00 11 X...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan110">90: 53 20 07 e9 00 00 00 00 00 00 00 00 00 00 00 00 S...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan112">a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan114">b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan116">c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan118">d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="779.07422"
+ id="tspan120">e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="794.69318"
+ id="tspan122">f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="810.31219"
+ id="tspan124" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/33b.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/33b.svg
new file mode 100644
index 0000000..cb6dc2b
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/33b.svg
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="155"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="33a.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="14"
+ inkscape:cy="107.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="155"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="520.36218"
+ x="115"
+ height="12"
+ width="307"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect80"
+ width="235"
+ height="12"
+ x="106"
+ y="534.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="567.36218"
+ x="215"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan124">127-96: 0000 0000 0000 0000 0000 0000 0000 0000</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan336"> 95-64: 0000 0000 0001 1111 1010 0100 0000 0000</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan338"> 63-32: 0000 0000 0000 0000 0000 0000 0000 1111</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan340"> 31-0 : 0101 1000 1110 0000 0000 0111 1110 1001</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan342"></tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan352">Grouping by highlights we get:</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan344"> file offset = 0x0fd2 (4050)</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan346"> start block = 0x7ac7 (31431)</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan348"> block count = 0x07e9 (2025)</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan350" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/40.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/40.svg
new file mode 100644
index 0000000..593d8aa
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/40.svg
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="266"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="33b.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="178.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="266"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="660.36218"
+ x="67"
+ height="12"
+ width="362"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect80"
+ width="128"
+ height="12"
+ x="303"
+ y="643.36218"
+ rx="0"
+ ry="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan350">xfs_db&gt; type text</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan1203">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan1205">00: 49 4e 41 ed 01 01 00 02 00 00 00 00 00 00 00 00 INA.............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan1207">10: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 02 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan1209">20: 44 ad 3a 83 1d a9 4a d0 44 ad 3a ab 0b c7 a7 d0 D.....J.D.......</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan1211">30: 44 ad 3a ab 0b c7 a7 d0 00 00 00 00 00 00 00 5e D...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan1213">40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan1215">50: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan1217">60: ff ff ff ff 04 00 00 00 00 80 0f 00 30 66 72 61 ............0fra</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan1219">70: 6d 65 30 30 30 30 30 30 2e 74 73 74 01 80 00 81 me000000.tst....</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan1221">80: 0f 00 50 66 72 61 6d 65 30 30 30 30 30 31 2e 74 ..Pframe000001.t</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan1223">90: 73 74 01 80 00 82 0f 00 70 66 72 61 6d 65 30 30 st......pframe00</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan1225">a0: 30 30 30 32 2e 74 73 74 01 80 00 83 0f 00 90 66 0002.tst.......f</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan1227">b0: 72 61 6d 65 30 30 30 30 30 33 2e 74 73 74 01 80 rame000003.tst..</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan1229">c0: 00 84 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan1231">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="779.07422"
+ id="tspan1233" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/46.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/46.svg
new file mode 100644
index 0000000..baffb3f
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/46.svg
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="202"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="40.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="194.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="202"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="360.36218"
+ x="132"
+ height="12"
+ width="307"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ ry="0"
+ rx="0"
+ y="550.36218"
+ x="77"
+ height="12"
+ width="86"
+ id="rect1432"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ ry="0"
+ rx="0"
+ y="567.36218"
+ x="350"
+ height="12"
+ width="81"
+ id="rect1434"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ ry="0"
+ rx="0"
+ y="675.36218"
+ x="345"
+ height="12"
+ width="83"
+ id="rect1436"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect80"
+ width="83"
+ height="12"
+ x="347"
+ y="690.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan1233">090: 00 00 00 00 02 00 00 84 0f 66 72 61 6d 65 30 30 .........frame00</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan1408">0a0: 30 30 30 33 2e 74 73 74 00 00 00 00 00 00 00 90 0003.tst........</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan1410">0b0: ff ff 00 20 02 00 00 85 0f 66 72 61 6d 65 30 30 .........frame00</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan1412">0c0: 30 30 30 34 2e 74 73 74 00 00 00 00 00 00 00 b0 0004.tst........</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan1414">0d0: 00 00 00 00 02 00 00 86 0f 66 72 61 6d 65 30 30 .........frame00</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan1416">0e0: 30 30 30 35 2e 74 73 74 00 00 00 00 00 00 00 d0 0005.tst........</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan1418">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan1420">fb0: 00 00 17 2e 00 00 00 04 83 a0 40 b4 00 00 00 0e ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan1422">fc0: 93 a0 40 b4 00 00 00 12 a3 a0 40 b4 00 00 00 06 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan1424">fd0: b3 a0 40 b4 00 00 00 0a c3 a0 40 b4 00 00 00 1e ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan1426">fe0: d3 a0 40 b4 00 00 00 22 e3 a0 40 b4 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan1428">ff0: f3 a0 40 b4 00 00 00 1a 00 00 00 0a 00 00 00 01 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan1430" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/57.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/57.svg
new file mode 100644
index 0000000..bb50460
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/57.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="78"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="46.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="110.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="78"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="565.36218"
+ x="77"
+ height="12"
+ width="219"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan1430">xfs_db&gt; type text</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan1549">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan1551">000: 58 44 32 46 00 00 00 00 00 00 00 05 00 00 00 05 XD2F............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan1553">010: 00 10 00 10 00 10 00 10 3f 50 00 00 1f 01 ff ff .........P......</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan1555" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/60.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/60.svg
new file mode 100644
index 0000000..b720921
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/60.svg
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="251"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="57.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="283.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="251"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="565.36218"
+ x="165"
+ height="12"
+ width="60"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="60"
+ height="12"
+ x="165"
+ y="705.36218"
+ rx="0"
+ ry="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan1555">xfs_db&gt; dblock 8388928</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan1592">xfs_db&gt; type dir2</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan1594">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan1596">lhdr.info.forw = 8388919</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan1598">lhdr.info.back = 8388937</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan1600">lhdr.info.magic = 0xd2ff</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan1602">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan1620" /><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan1604">xfs_db&gt; dblock 8388919</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan1606">xfs_db&gt; type dir2</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan1608">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan1610">lhdr.info.forw = 8388706</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan1612">lhdr.info.back = 8388928</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan1614">lhdr.info.magic = 0xd2ff</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan1616">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan1618" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/61.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/61.svg
new file mode 100644
index 0000000..2ffd254
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/61.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="185"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="60.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="57.066409"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="185"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.828429" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="263"
+ height="12"
+ x="167"
+ y="644.36218"
+ rx="0"
+ ry="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan1618">xfs_db&gt; type text</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan1780">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan1782">00: 49 4e a1 ff 01 01 00 01 00 00 00 00 00 00 00 00 IN..............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan1784">10: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan1786">20: 44 bc e1 c7 03 c4 d4 18 44 bc e1 c7 03 c4 d4 18 D.......D.......</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan1788">30: 44 bc e1 c7 03 c4 d4 18 00 00 00 00 00 00 00 0c D...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan1790">40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan1792">50: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan1794">60: ff ff ff ff 73 6d 61 6c 6c 5f 74 61 72 67 65 74 ....small.target</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan1796">70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan1798">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan1800" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/65.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/65.svg
new file mode 100644
index 0000000..8cb2452
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/65.svg
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="295"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="61.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="167.06641"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="295"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.828429" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="174"
+ height="12"
+ x="256"
+ y="769.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="785.36218"
+ x="70"
+ height="12"
+ width="91"
+ id="rect1940"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan1800">xfs_db&gt; type text</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan1900">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan1902">00: 49 4e 81 a4 01 02 00 01 00 00 00 00 00 00 00 00 IN..............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan1904">10: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 02 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan1906">20: 44 be 1a be 38 d1 26 98 44 be 1a be 38 d1 26 98 D...8...D...8...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan1908">30: 44 be 1a e1 3a 9a ea 18 00 00 00 00 00 00 00 04 D...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan1910">40: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan1912">50: 00 00 0f 01 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan1914">60: ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 12 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan1916">70: 53 a0 00 01 00 00 00 00 00 00 00 00 00 00 00 00 S...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan1918">80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan1920">90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan1922">a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan1926">b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan1928">c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan1930">d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 18 02 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="779.07422"
+ id="tspan1932">e0: 05 00 00 65 6d 70 74 79 05 04 02 74 72 75 73 74 ...empty...trust</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="794.69318"
+ id="tspan1934">f0: 76 61 6c 31 00 00 00 00 00 00 00 00 00 00 00 00 val1............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="810.31219"
+ id="tspan1936" /></text>
+ <g
+ id="g2140"
+ transform="translate(58,7)">
+ <rect
+ y="708.36218"
+ x="193"
+ height="26"
+ width="86"
+ id="rect1942"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="206.84892"
+ y="726.17023"
+ id="text1944"
+ sodipodi:linespacing="100%"><tspan
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+ sodipodi:role="line"
+ x="206.84892"
+ y="726.17023"
+ id="tspan1980">hdr.totsize</tspan><tspan
+ sodipodi:role="line"
+ x="206.84892"
+ y="738.66541"
+ id="tspan1982" /></text>
+ </g>
+ <rect
+ y="750.36218"
+ x="346"
+ height="16"
+ width="43"
+ id="rect2138"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="stroke-width:2;fill:none;stroke:#000000;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 309,220 20,0 11.22724,19.44615"
+ id="path2146"
+ transform="translate(27,511.36218)" />
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/66.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/66.svg
new file mode 100644
index 0000000..1ef8303
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/66.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="405"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="65.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="215.15587"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="405"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.828429" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="174"
+ height="12"
+ x="262"
+ y="364.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="566.36218"
+ x="39"
+ height="12"
+ width="128"
+ id="rect1940"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan1936">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan2358">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan2360">core.naextents = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan2362">core.forkoff = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan2364">core.aformat = 1 (local)</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan2366">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan2368">a.sfattr.hdr.totsize = 52</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan2370">a.sfattr.hdr.count = 3</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan2372">a.sfattr.list[0].namelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan2374">a.sfattr.list[0].valuelen = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan2376">a.sfattr.list[0].root = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan2378">a.sfattr.list[0].secure = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan2380">a.sfattr.list[0].name = &quot;empty_attr&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan2382">a.sfattr.list[1].namelen = 7</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan2384">a.sfattr.list[1].valuelen = 4</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan2386">a.sfattr.list[1].root = 1</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="779.07422"
+ id="tspan2388">a.sfattr.list[1].secure = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="794.69318"
+ id="tspan2390">a.sfattr.list[1].name = &quot;trust_a&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="810.31219"
+ id="tspan2392">a.sfattr.list[1].value = &quot;val1&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="825.93121"
+ id="tspan2394">a.sfattr.list[2].namelen = 6</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="841.55017"
+ id="tspan2396">a.sfattr.list[2].valuelen = 12</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="857.16919"
+ id="tspan2398">a.sfattr.list[2].root = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="872.78821"
+ id="tspan2400">a.sfattr.list[2].secure = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="888.40717"
+ id="tspan2402">a.sfattr.list[2].name = &quot;second&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="904.02618"
+ id="tspan2404">a.sfattr.list[2].value = &quot;second_value&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="919.6452"
+ id="tspan2406" /></text>
+ <g
+ id="g2140"
+ transform="translate(64,-398)">
+ <rect
+ y="708.36218"
+ x="193"
+ height="26"
+ width="86"
+ id="rect1942"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="206.84892"
+ y="726.17023"
+ id="text1944"
+ sodipodi:linespacing="100%"><tspan
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+ sodipodi:role="line"
+ x="206.84892"
+ y="726.17023"
+ id="tspan1980">hdr.totsize</tspan><tspan
+ sodipodi:role="line"
+ x="206.84892"
+ y="738.66541"
+ id="tspan1982" /></text>
+ </g>
+ <rect
+ y="345.36218"
+ x="352"
+ height="16"
+ width="43"
+ id="rect2138"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 342,326.36218 20,0 11.22724,19.44615"
+ id="path2146" />
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/67.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/67.svg
new file mode 100644
index 0000000..b8a9abc
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/67.svg
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="296"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="66.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="106.15587"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="296"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.828429" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="174"
+ height="12"
+ x="262"
+ y="364.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="722.36218"
+ x="165"
+ height="12"
+ width="87"
+ id="rect1940"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan2406">xfs_db&gt; type text</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan2779">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan2781">00: 49 4e 81 a4 01 02 00 01 00 00 00 00 00 00 00 00 IN..............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan2783">10: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 05 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan2785">20: 44 be 24 cd 0f b0 96 18 44 be 24 cd 0f b0 96 18 D.......D.......</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan2787">30: 44 be 2d f5 01 62 7a 18 00 00 00 00 00 00 00 04 D....bz.........</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan2789">40: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan2791">50: 00 00 0a 01 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan2793">60: ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 01 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan2795">70: 41 c0 00 01 00 00 00 00 00 00 00 00 00 00 00 00 A...............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan2797">80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan2799">90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan2801">a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan2803">b0: 00 00 00 00 00 45 04 00 0a 00 00 65 6d 70 74 79 .....E.....empty</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan2805">c0: 5f 61 74 74 72 07 04 02 74 72 75 73 74 5f 61 76 .attr...trust.av</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan2807">d0: 61 6c 31 06 0c 00 73 65 63 6f 6e 64 73 65 63 6f al1...secondseco</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="779.07422"
+ id="tspan2809">e0: 6e 64 5f 76 61 6c 75 65 06 08 04 70 6f 6c 69 63 nd.value...polic</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="794.69318"
+ id="tspan2811">f0: 79 63 6f 6e 74 65 6e 74 73 64 5f 76 61 6c 75 65 ycontentsd.value</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="810.31219"
+ id="tspan2813" /></text>
+ <g
+ id="g2140"
+ transform="translate(64,-398)">
+ <rect
+ y="708.36218"
+ x="193"
+ height="26"
+ width="86"
+ id="rect1942"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="206.84892"
+ y="726.17023"
+ id="text1944"
+ sodipodi:linespacing="100%"><tspan
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+ sodipodi:role="line"
+ x="206.84892"
+ y="726.17023"
+ id="tspan1980">hdr.totsize</tspan><tspan
+ sodipodi:role="line"
+ x="206.84892"
+ y="738.66541"
+ id="tspan1982" /></text>
+ </g>
+ <rect
+ y="345.36218"
+ x="352"
+ height="16"
+ width="43"
+ id="rect2138"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 342,326.36218 20,0 11.22724,19.44615"
+ id="path2146" />
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/71.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/71.svg
new file mode 100644
index 0000000..1bc5cfa
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/71.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="167"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="New document 1"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="181"
+ inkscape:cy="-0.93359375"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="167"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.82843" />
+ <rect
+ ry="0"
+ rx="0"
+ y="628.36218"
+ x="79"
+ height="12"
+ width="217"
+ id="rect854"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect80"
+ width="88"
+ height="12"
+ x="347"
+ y="613.36218"
+ rx="0"
+ ry="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan58"
+ x="40.848923"
+ y="529.17023">000: 00 00 00 00 00 00 00 00 fb ee 00 00 00 03 00 34 ...............4</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan60">010: 0f cc 00 00 00 38 0f 94 00 00 00 00 00 00 00 00 .....8..........</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan62">020: 1e 9d 39 34 0f cc 01 00 1e 9d 39 37 0f dc 01 00 ..94......97....</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan64">030: fc f8 9d 4f 0f ec 00 00 00 00 00 00 00 00 00 00 ...O............</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan66">040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan68">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan70">fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 06 05 61 ...............a</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan72">fd0: 74 74 72 32 76 61 6c 75 65 32 00 00 00 06 05 61 ttr2value2.....a</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan74">fe0: 74 74 72 31 76 61 6c 75 65 31 00 00 00 00 00 01 ttr1value1......</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan76">ff0: 00 00 77 e4 08 62 69 67 5f 61 74 74 72 00 00 00 ..w..big.attr...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan78" /></text>
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/73-74.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/73-74.svg
new file mode 100644
index 0000000..d200d49
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/73-74.svg
@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="814"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="67.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="331.44726"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="814"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.828429" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="174"
+ height="12"
+ x="262"
+ y="364.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="785.36218"
+ x="113"
+ height="12"
+ width="212"
+ id="rect1940"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan2813">xfs_db&gt; ablock 5</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan3025">xfs_db&gt; p</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan3027">hdr.info.forw = 4</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan3029">hdr.info.back = 3</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan3031">hdr.info.magic = 0xfbee</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan3033">hdr.count = 96</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan3035">hdr.usedbytes = 2688</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan3037">hdr.firstused = 1408</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan3039">hdr.holes = 0</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="669.74121"
+ id="tspan3041">hdr.freemap[0-2] = [base,size] 0:[800,608] 1:[0,0] 2:[0,0]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="685.36023"
+ id="tspan3043">entries[0-95] = [hashval,nameidx,incomplete,root,secure,local]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="700.97919"
+ id="tspan3045"> 0:[0x3437922f,4068,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="716.59821"
+ id="tspan3047"> 1:[0x343792a6,4040,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="732.21722"
+ id="tspan3049"> 2:[0x343792a7,4012,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="747.83618"
+ id="tspan3051"> 3:[0x343792a8,3984,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="763.4552"
+ id="tspan3053"> ...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="779.07422"
+ id="tspan3055"> 82:[0x3437d1a7,2892,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="794.69318"
+ id="tspan3057"> 83:[0x3437d1a8,2864,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="810.31219"
+ id="tspan3059"> 84:[0x3437d1a9,2836,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="825.93121"
+ id="tspan3061"> ...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="841.55017"
+ id="tspan3063"> 95:[0x3437d22a,2528,0,0,0,1]</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="857.16919"
+ id="tspan3065">nvlist[0].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="872.78821"
+ id="tspan3067">nvlist[0].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="888.40717"
+ id="tspan3069">nvlist[0].name = &quot;attribute_310&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="904.02618"
+ id="tspan3071">nvlist[0].value = &quot;value_310\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="919.6452"
+ id="tspan3073">nvlist[1].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="935.26416"
+ id="tspan3075">nvlist[1].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="950.88318"
+ id="tspan3077">nvlist[1].name = &quot;attribute_309&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="966.50214"
+ id="tspan3079">nvlist[1].value = &quot;value_309\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="982.12115"
+ id="tspan3081">nvlist[2].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="997.74017"
+ id="tspan3083">nvlist[2].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1013.3591"
+ id="tspan3085">nvlist[2].name = &quot;attribute_308&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1028.9781"
+ id="tspan3087">nvlist[2].value = &quot;value_308\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1044.5972"
+ id="tspan3089">nvlist[3].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1060.2162"
+ id="tspan3091">nvlist[3].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1075.8352"
+ id="tspan3093">nvlist[3].name = &quot;attribute_307&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1091.4541"
+ id="tspan3095">nvlist[3].value = &quot;value_307\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1107.0731"
+ id="tspan3097">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1122.6921"
+ id="tspan3099">nvlist[82].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1138.3112"
+ id="tspan3101">nvlist[82].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1153.9302"
+ id="tspan3103">nvlist[82].name = &quot;attribute_268&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1169.5492"
+ id="tspan3105">nvlist[82].value = &quot;value_268\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1185.1681"
+ id="tspan3107">nvlist[83].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1200.7871"
+ id="tspan3109">nvlist[83].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1216.4061"
+ id="tspan3111">nvlist[83].name = &quot;attribute_267&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1232.0251"
+ id="tspan3113">nvlist[83].value = &quot;value_267\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1247.6442"
+ id="tspan3115">nvlist[84].valuelen = 10</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1263.2632"
+ id="tspan3117">nvlist[84].namelen = 13</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1278.8821"
+ id="tspan3119">nvlist[84].name = &quot;attribute_266&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1294.5011"
+ id="tspan3121">nvlist[84].value = &quot;value_266\d&quot;</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1310.1201"
+ id="tspan3123">...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="1325.7391"
+ id="tspan3125" /></text>
+ <g
+ id="g2140"
+ transform="translate(64,-398)">
+ <rect
+ y="708.36218"
+ x="193"
+ height="26"
+ width="86"
+ id="rect1942"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="206.84892"
+ y="726.17023"
+ id="text1944"
+ sodipodi:linespacing="100%"><tspan
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+ sodipodi:role="line"
+ x="206.84892"
+ y="726.17023"
+ id="tspan1980">hdr.totsize</tspan><tspan
+ sodipodi:role="line"
+ x="206.84892"
+ y="738.66541"
+ id="tspan1982" /></text>
+ </g>
+ <rect
+ y="345.36218"
+ x="352"
+ height="16"
+ width="43"
+ id="rect2138"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 342,326.36218 20,0 11.22724,19.44615"
+ id="path2146" />
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/code/SVG/74.svg b/XFS_Filesystem_Structure/en-US/images/code/SVG/74.svg
new file mode 100644
index 0000000..b78e618
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/code/SVG/74.svg
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="656"
+ height="138"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="73-74.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/rlerch/source/SVN/Red_Hat_Enterprise_Linux/5.4/XFS_Filesystem_Structure/en-US/images/code/71.png"
+ inkscape:export-xdpi="90.550003"
+ inkscape:export-ydpi="90.550003">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="284.19822"
+ inkscape:cy="-64.552743"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1566"
+ inkscape:window-height="1007"
+ inkscape:window-x="163"
+ inkscape:window-y="41" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-27,-511.36218)">
+ <rect
+ style="color:#000000;fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect26"
+ width="656"
+ height="138"
+ x="27"
+ y="511.36218"
+ rx="11.82843"
+ ry="11.828429" />
+ <rect
+ ry="0"
+ rx="0"
+ y="407.36218"
+ x="232"
+ height="12"
+ width="208"
+ id="rect354"
+ style="color:#000000;fill:#acc7e3;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect1622"
+ width="174"
+ height="12"
+ x="262"
+ y="364.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4541"
+ width="352"
+ height="12"
+ x="76"
+ y="565.36218"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="581.36218"
+ x="77"
+ height="12"
+ width="217"
+ id="rect1940"
+ style="color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="40.848923"
+ y="529.17023"
+ id="text56"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="529.17023"
+ id="tspan3125">b00: 62 75 74 65 5f 32 36 35 76 61 6c 75 65 5f 32 36 bute.265value.26</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="544.78925"
+ id="tspan4525">b10: 35 0a 00 00 00 0a 0d 61 74 74 72 69 62 75 74 65 5......attribute</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="560.4082"
+ id="tspan4527">b20: 5f 32 36 36 76 61 6c 75 65 5f 32 36 36 0a 00 00 .266value.266...</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="576.02722"
+ id="tspan4529">b30: 00 0a 0d 61 74 74 72 69 62 75 74 65 5f 32 36 37 ...attribute.267</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="591.64624"
+ id="tspan4531">b40: 76 61 6c 75 65 5f 32 36 37 0a 00 00 00 0a 0d 61 value.267......a</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="607.2652"
+ id="tspan4533">b50: 74 74 72 69 62 75 74 65 5f 32 36 38 76 61 6c 75 ttribute.268valu</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="622.88422"
+ id="tspan4535">b60: 65 5f 32 36 38 0a 00 00 00 0a 0d 61 74 74 72 69 e.268......attri</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="638.50323"
+ id="tspan4537">b70: 62 75 74 65 5f 32 36 39 76 61 6c 75 65 5f 32 36 bute.269value.26</tspan><tspan
+ sodipodi:role="line"
+ x="40.848923"
+ y="654.12219"
+ id="tspan4539" /></text>
+ <g
+ id="g2140"
+ transform="translate(64,-398)">
+ <rect
+ y="708.36218"
+ x="193"
+ height="26"
+ width="86"
+ id="rect1942"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ x="206.84892"
+ y="726.17023"
+ id="text1944"
+ sodipodi:linespacing="100%"><tspan
+ style="font-size:12.49519825px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+ sodipodi:role="line"
+ x="206.84892"
+ y="726.17023"
+ id="tspan1980">hdr.totsize</tspan><tspan
+ sodipodi:role="line"
+ x="206.84892"
+ y="738.66541"
+ id="tspan1982" /></text>
+ </g>
+ <rect
+ y="345.36218"
+ x="352"
+ height="16"
+ width="43"
+ id="rect2138"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 342,326.36218 20,0 11.22724,19.44615"
+ id="path2146" />
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/en-US/images/icon.svg b/XFS_Filesystem_Structure/en-US/images/icon.svg
new file mode 100644
index 0000000..c471a60
--- /dev/null
+++ b/XFS_Filesystem_Structure/en-US/images/icon.svg
@@ -0,0 +1,3936 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:ns="http://ns.adobe.com/AdobeSVGViewerExtensions/3/"
+ xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="32"
+ height="32"
+ id="svg3017"
+ sodipodi:version="0.32"
+ inkscape:version="0.44+devel"
+ sodipodi:docname="book.svg"
+ sodipodi:docbase="/home/andy/Desktop">
+ <metadata
+ id="metadata489">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:window-height="480"
+ inkscape:window-width="858"
+ inkscape:pageshadow="0"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:zoom="1"
+ inkscape:cx="16"
+ inkscape:cy="15.944056"
+ inkscape:window-x="0"
+ inkscape:window-y="33"
+ inkscape:current-layer="svg3017" />
+ <defs
+ id="defs3019">
+ <linearGradient
+ id="linearGradient2381">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop2383" />
+ <stop
+ style="stop-color:white;stop-opacity:0"
+ offset="1"
+ id="stop2385" />
+ </linearGradient>
+ <linearGradient
+ x1="415.73831"
+ y1="11.854"
+ x2="418.13361"
+ y2="18.8104"
+ id="XMLID_1758_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8362,0.5206,-1.1904,0.992,147.62,-30.9374)">
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="0"
+ id="stop3903" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="1"
+ id="stop3905" />
+ <a:midPointStop
+ style="stop-color:#CCCCCC"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#CCCCCC"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#F2F2F2"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="500.70749"
+ y1="-13.2441"
+ x2="513.46442"
+ y2="-2.1547"
+ id="XMLID_1757_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0"
+ id="stop3890" />
+ <stop
+ style="stop-color:#96bad6;stop-opacity:1"
+ offset="1"
+ id="stop3892" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#96BAD6"
+ offset="1" />
+ </linearGradient>
+ <clipPath
+ id="XMLID_1755_">
+ <use
+ id="use3874"
+ x="0"
+ y="0"
+ width="744.09448"
+ height="600"
+ xlink:href="#XMLID_343_" />
+ </clipPath>
+ <linearGradient
+ x1="505.62939"
+ y1="-14.9526"
+ x2="527.49402"
+ y2="-0.7536"
+ id="XMLID_1756_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0"
+ id="stop3877" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0.51120001"
+ id="stop3879" />
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0.64609998"
+ id="stop3881" />
+ <stop
+ style="stop-color:#16336e;stop-opacity:1"
+ offset="1"
+ id="stop3883" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5112" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.6461" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#16336E"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="471.0806"
+ y1="201.07761"
+ x2="481.91711"
+ y2="210.4977"
+ id="XMLID_1754_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#6498c1;stop-opacity:1"
+ offset="0.005618"
+ id="stop3863" />
+ <stop
+ style="stop-color:#79a9cc;stop-opacity:1"
+ offset="0.2332"
+ id="stop3865" />
+ <stop
+ style="stop-color:#a4cde2;stop-opacity:1"
+ offset="0.74049997"
+ id="stop3867" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="1"
+ id="stop3869" />
+ <a:midPointStop
+ style="stop-color:#6498C1"
+ offset="5.618000e-003" />
+ <a:midPointStop
+ style="stop-color:#6498C1"
+ offset="0.4438" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="516.57672"
+ y1="-15.769"
+ x2="516.57672"
+ y2="0.84280002"
+ id="XMLID_1753_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0"
+ id="stop3851" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="1"
+ id="stop3853" />
+ <a:midPointStop
+ style="stop-color:#B2B2B2"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#B2B2B2"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#F2F2F2"
+ offset="1" />
+ </linearGradient>
+ <clipPath
+ id="XMLID_1751_">
+ <use
+ id="use3837"
+ x="0"
+ y="0"
+ width="744.09448"
+ height="600"
+ xlink:href="#XMLID_338_" />
+ </clipPath>
+ <linearGradient
+ x1="506.09909"
+ y1="-11.5137"
+ x2="527.99609"
+ y2="2.7063999"
+ id="XMLID_1752_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0"
+ id="stop3840" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0.51120001"
+ id="stop3842" />
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0.64609998"
+ id="stop3844" />
+ <stop
+ style="stop-color:#16336e;stop-opacity:1"
+ offset="1"
+ id="stop3846" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5112" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.6461" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#16336E"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="468.2915"
+ y1="204.7612"
+ x2="479.39871"
+ y2="214.4166"
+ id="XMLID_1750_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0"
+ id="stop3830" />
+ <stop
+ style="stop-color:#96bad6;stop-opacity:1"
+ offset="1"
+ id="stop3832" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#96BAD6"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="502.70749"
+ y1="115.3013"
+ x2="516.39001"
+ y2="127.1953"
+ id="XMLID_1749_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)">
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0"
+ id="stop3818" />
+ <stop
+ style="stop-color:#96bad6;stop-opacity:1"
+ offset="1"
+ id="stop3820" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#96BAD6"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="501.0903"
+ y1="-19.2544"
+ x2="531.85413"
+ y2="0.72390002"
+ id="XMLID_1748_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0"
+ id="stop3803" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0.51120001"
+ id="stop3805" />
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0.64609998"
+ id="stop3807" />
+ <stop
+ style="stop-color:#16336e;stop-opacity:1"
+ offset="1"
+ id="stop3809" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5112" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.6461" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#16336E"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="481.23969"
+ y1="212.5742"
+ x2="472.92981"
+ y2="207.4967"
+ id="XMLID_2275_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#f3403f;stop-opacity:1"
+ offset="0"
+ id="stop9947" />
+ <stop
+ style="stop-color:#d02a28;stop-opacity:1"
+ offset="0.37889999"
+ id="stop9949" />
+ <stop
+ style="stop-color:#b21714;stop-opacity:1"
+ offset="0.77649999"
+ id="stop9951" />
+ <stop
+ style="stop-color:#a6100c;stop-opacity:1"
+ offset="1"
+ id="stop9953" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0.4213" />
+ <a:midPointStop
+ style="stop-color:#A6100C"
+ offset="1" />
+ </linearGradient>
+ <clipPath
+ id="XMLID_2273_">
+ <use
+ id="use9933"
+ x="0"
+ y="0"
+ width="744.09448"
+ height="600"
+ xlink:href="#XMLID_960_" />
+ </clipPath>
+ <linearGradient
+ x1="473.7681"
+ y1="209.17529"
+ x2="486.98099"
+ y2="213.2001"
+ id="XMLID_2274_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#f3403f;stop-opacity:1"
+ offset="0"
+ id="stop9936" />
+ <stop
+ style="stop-color:#d02a28;stop-opacity:1"
+ offset="0.37889999"
+ id="stop9938" />
+ <stop
+ style="stop-color:#b21714;stop-opacity:1"
+ offset="0.77649999"
+ id="stop9940" />
+ <stop
+ style="stop-color:#a6100c;stop-opacity:1"
+ offset="1"
+ id="stop9942" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0.4213" />
+ <a:midPointStop
+ style="stop-color:#A6100C"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="478.21341"
+ y1="-131.9297"
+ x2="469.85818"
+ y2="-140.28481"
+ id="XMLID_2272_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5592,0.829,-0.829,0.5592,101.3357,-104.791)">
+ <stop
+ style="stop-color:#f3403f;stop-opacity:1"
+ offset="0"
+ id="stop9917" />
+ <stop
+ style="stop-color:#d02a28;stop-opacity:1"
+ offset="0.37889999"
+ id="stop9919" />
+ <stop
+ style="stop-color:#b21714;stop-opacity:1"
+ offset="0.77649999"
+ id="stop9921" />
+ <stop
+ style="stop-color:#a6100c;stop-opacity:1"
+ offset="1"
+ id="stop9923" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0.4213" />
+ <a:midPointStop
+ style="stop-color:#A6100C"
+ offset="1" />
+ </linearGradient>
+ <marker
+ refX="0"
+ refY="0"
+ orient="auto"
+ style="overflow:visible"
+ id="TriangleInM">
+ <path
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z "
+ transform="scale(-0.4,-0.4)"
+ style="fill:#5c5c4f"
+ id="path3197" />
+ </marker>
+ <linearGradient
+ x1="200.7363"
+ y1="100.4028"
+ x2="211.99519"
+ y2="89.143997"
+ id="XMLID_3298_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#bfbfbf;stop-opacity:1"
+ offset="0"
+ id="stop20103" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="1"
+ id="stop20105" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#BFBFBF" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#BFBFBF" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#F2F2F2" />
+ </linearGradient>
+ <linearGradient
+ x1="200.7363"
+ y1="100.4028"
+ x2="211.99519"
+ y2="89.143997"
+ id="linearGradient36592"
+ xlink:href="#XMLID_3298_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <linearGradient
+ x1="181.2925"
+ y1="110.8481"
+ x2="192.6369"
+ y2="99.5037"
+ id="XMLID_3297_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0"
+ id="stop20096" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="stop20098" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#CCCCCC" />
+ </linearGradient>
+ <linearGradient
+ x1="181.2925"
+ y1="110.8481"
+ x2="192.6369"
+ y2="99.5037"
+ id="linearGradient36595"
+ xlink:href="#XMLID_3297_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <linearGradient
+ x1="211.77589"
+ y1="105.7749"
+ x2="212.6619"
+ y2="108.2092"
+ id="XMLID_3296_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#0f6124;stop-opacity:1"
+ offset="0"
+ id="stop20087" />
+ <stop
+ style="stop-color:#219630;stop-opacity:1"
+ offset="1"
+ id="stop20089" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#0F6124" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0F6124" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#219630" />
+ </linearGradient>
+ <linearGradient
+ x1="211.77589"
+ y1="105.7749"
+ x2="212.6619"
+ y2="108.2092"
+ id="linearGradient36677"
+ xlink:href="#XMLID_3296_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <linearGradient
+ x1="208.9834"
+ y1="116.8296"
+ x2="200.0811"
+ y2="96.834602"
+ id="XMLID_3295_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0"
+ id="stop20076" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0.5"
+ id="stop20078" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="stop20080" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#FFFFFF" />
+ </linearGradient>
+ <linearGradient
+ x1="208.9834"
+ y1="116.8296"
+ x2="200.0811"
+ y2="96.834602"
+ id="linearGradient36604"
+ xlink:href="#XMLID_3295_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <linearGradient
+ x1="195.5264"
+ y1="97.911102"
+ x2="213.5213"
+ y2="115.9061"
+ id="XMLID_3294_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="0"
+ id="stop20069" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="stop20071" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#CCCCCC" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#CCCCCC" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#FFFFFF" />
+ </linearGradient>
+ <linearGradient
+ x1="195.5264"
+ y1="97.911102"
+ x2="213.5213"
+ y2="115.9061"
+ id="linearGradient36607"
+ xlink:href="#XMLID_3294_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <linearGradient
+ x1="186.1938"
+ y1="109.1343"
+ x2="206.6881"
+ y2="88.639999"
+ id="XMLID_3293_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0"
+ id="stop20056" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0.16850001"
+ id="stop20058" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0.23029999"
+ id="stop20060" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0.2809"
+ id="stop20062" />
+ <stop
+ style="stop-color:#c2c2c2;stop-opacity:1"
+ offset="0.5"
+ id="stop20064" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.1685"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.2303"
+ style="stop-color:#FFFFFF" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#FFFFFF" />
+ <a:midPointStop
+ offset="0.2809"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#C2C2C2" />
+ </linearGradient>
+ <linearGradient
+ x1="186.1938"
+ y1="109.1343"
+ x2="206.6881"
+ y2="88.639999"
+ id="linearGradient36610"
+ xlink:href="#XMLID_3293_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <linearGradient
+ x1="184.8569"
+ y1="112.2676"
+ x2="211.94099"
+ y2="89.541397"
+ id="XMLID_3292_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0"
+ id="stop20043" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0.16850001"
+ id="stop20045" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0.23029999"
+ id="stop20047" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0.2809"
+ id="stop20049" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="stop20051" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.1685"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.2303"
+ style="stop-color:#FFFFFF" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#FFFFFF" />
+ <a:midPointStop
+ offset="0.2809"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#CCCCCC" />
+ </linearGradient>
+ <linearGradient
+ x1="184.8569"
+ y1="112.2676"
+ x2="211.94099"
+ y2="89.541397"
+ id="linearGradient36613"
+ xlink:href="#XMLID_3292_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
+ <marker
+ refX="0"
+ refY="0"
+ orient="auto"
+ style="overflow:visible"
+ id="TriangleOutM">
+ <path
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z "
+ transform="scale(0.4,0.4)"
+ style="fill:#5c5c4f;fill-rule:evenodd;stroke-width:1pt;marker-start:none"
+ id="path3238" />
+ </marker>
+ <linearGradient
+ x1="165.3"
+ y1="99.5"
+ x2="165.3"
+ y2="115.9"
+ id="XMLID_3457_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#999;stop-opacity:1"
+ offset="0"
+ id="stop8309" />
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0.30000001"
+ id="stop8311" />
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="1"
+ id="stop8313" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#999999" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#999999" />
+ <a:midPointstop
+ offset="0.3"
+ style="stop-color:#B2B2B2" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#B2B2B2" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#B2B2B2" />
+ </linearGradient>
+ <linearGradient
+ x1="165.3"
+ y1="99.5"
+ x2="165.3"
+ y2="115.9"
+ id="lg1997"
+ xlink:href="#XMLID_3457_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <linearGradient
+ x1="175"
+ y1="99.800003"
+ x2="175"
+ y2="112.5"
+ id="XMLID_3456_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#737373;stop-opacity:1"
+ offset="0"
+ id="stop8300" />
+ <stop
+ style="stop-color:#191919;stop-opacity:1"
+ offset="0.60000002"
+ id="stop8302" />
+ <stop
+ style="stop-color:#191919;stop-opacity:1"
+ offset="1"
+ id="stop8304" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#737373" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#737373" />
+ <a:midPointstop
+ offset="0.6"
+ style="stop-color:#191919" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#191919" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#191919" />
+ </linearGradient>
+ <linearGradient
+ x1="175"
+ y1="99.800003"
+ x2="175"
+ y2="112.5"
+ id="lg2000"
+ xlink:href="#XMLID_3456_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <linearGradient
+ x1="168.8"
+ y1="107.1"
+ x2="164.5"
+ y2="110"
+ id="XMLID_3455_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#666;stop-opacity:1"
+ offset="0"
+ id="stop8291" />
+ <stop
+ style="stop-color:#191919;stop-opacity:1"
+ offset="0.69999999"
+ id="stop8293" />
+ <stop
+ style="stop-color:#191919;stop-opacity:1"
+ offset="1"
+ id="stop8295" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#666666" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#666666" />
+ <a:midPointstop
+ offset="0.7"
+ style="stop-color:#191919" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#191919" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#191919" />
+ </linearGradient>
+ <linearGradient
+ x1="168.8"
+ y1="107.1"
+ x2="164.5"
+ y2="110"
+ id="lg2003"
+ xlink:href="#XMLID_3455_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <linearGradient
+ id="lg63694">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop63696" />
+ <stop
+ style="stop-color:white;stop-opacity:0"
+ offset="1"
+ id="stop63698" />
+ </linearGradient>
+ <linearGradient
+ x1="458"
+ y1="483"
+ x2="465.20001"
+ y2="271.39999"
+ id="lg2006"
+ xlink:href="#lg63694"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(6.3e-2,0,0,6.3e-2,-1.3,-9.8)" />
+ <linearGradient
+ x1="176.3"
+ y1="110.1"
+ x2="158.7"
+ y2="105"
+ id="XMLID_3453_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#666;stop-opacity:1"
+ offset="0"
+ id="stop8271" />
+ <stop
+ style="stop-color:#737373;stop-opacity:1"
+ offset="0.2"
+ id="stop8273" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="stop8275" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#666666" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#666666" />
+ <a:midPointstop
+ offset="0.2"
+ style="stop-color:#737373" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#737373" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#FFFFFF" />
+ </linearGradient>
+ <linearGradient
+ x1="176.3"
+ y1="110.1"
+ x2="158.7"
+ y2="105"
+ id="lg2009"
+ xlink:href="#XMLID_3453_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <linearGradient
+ x1="173.60001"
+ y1="118.9"
+ x2="172.8"
+ y2="128.2"
+ id="XMLID_3449_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ecb300;stop-opacity:1"
+ offset="0"
+ id="stop8232" />
+ <stop
+ style="stop-color:#fff95e;stop-opacity:1"
+ offset="0.60000002"
+ id="stop8234" />
+ <stop
+ style="stop-color:#ecd600;stop-opacity:1"
+ offset="1"
+ id="stop8236" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.6"
+ style="stop-color:#FFF95E" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFF95E" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#ECD600" />
+ </linearGradient>
+ <linearGradient
+ x1="173.60001"
+ y1="118.9"
+ x2="172.8"
+ y2="128.2"
+ id="lg2016"
+ xlink:href="#XMLID_3449_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <radialGradient
+ cx="284.60001"
+ cy="172.60001"
+ r="6.5"
+ fx="284.60001"
+ fy="172.60001"
+ id="XMLID_3448_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4,0,0,1.4,-237.3,-126.8)">
+ <stop
+ style="stop-color:#ecb300;stop-opacity:1"
+ offset="0"
+ id="stop8219" />
+ <stop
+ style="stop-color:#ecb300;stop-opacity:1"
+ offset="0.30000001"
+ id="stop8221" />
+ <stop
+ style="stop-color:#c96b00;stop-opacity:1"
+ offset="0.89999998"
+ id="stop8223" />
+ <stop
+ style="stop-color:#9a5500;stop-opacity:1"
+ offset="1"
+ id="stop8225" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.3"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.9"
+ style="stop-color:#C96B00" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#C96B00" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#9A5500" />
+ </radialGradient>
+ <radialGradient
+ cx="284.60001"
+ cy="172.60001"
+ r="6.5"
+ fx="284.60001"
+ fy="172.60001"
+ id="rg2020"
+ xlink:href="#XMLID_3448_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.513992,0,0,2.347576,-689.1621,-378.5717)" />
+ <linearGradient
+ x1="158.10001"
+ y1="123"
+ x2="164.2"
+ y2="126.6"
+ id="XMLID_3447_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ecd600;stop-opacity:1"
+ offset="0"
+ id="stop8204" />
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0.30000001"
+ id="stop8206" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="stop8208" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#ECD600" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#ECD600" />
+ <a:midPointstop
+ offset="0.3"
+ style="stop-color:#FFFFB3" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFFFB3" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#FFFFFF" />
+ </linearGradient>
+ <linearGradient
+ x1="158.10001"
+ y1="123"
+ x2="164.2"
+ y2="126.6"
+ id="lg2026"
+ xlink:href="#XMLID_3447_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <radialGradient
+ cx="280.89999"
+ cy="163.7"
+ r="10.1"
+ fx="280.89999"
+ fy="163.7"
+ id="XMLID_3446_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4,0,0,1.4,-237.3,-126.8)">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop8197" />
+ <stop
+ style="stop-color:#fff95e;stop-opacity:1"
+ offset="1"
+ id="stop8199" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#FFFFFF" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFFFFF" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#FFF95E" />
+ </radialGradient>
+ <radialGradient
+ cx="280.89999"
+ cy="163.7"
+ r="10.1"
+ fx="280.89999"
+ fy="163.7"
+ id="rg2029"
+ xlink:href="#XMLID_3446_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.7,0,0,1.7,-457.5,-266.8)" />
+ <linearGradient
+ x1="156.5"
+ y1="122.7"
+ x2="180.10001"
+ y2="122.7"
+ id="XMLID_3445_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ecb300;stop-opacity:1"
+ offset="0"
+ id="stop8184" />
+ <stop
+ style="stop-color:#ffe900;stop-opacity:1"
+ offset="0.2"
+ id="stop8186" />
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0.30000001"
+ id="stop8188" />
+ <stop
+ style="stop-color:#ffe900;stop-opacity:1"
+ offset="0.40000001"
+ id="stop8190" />
+ <stop
+ style="stop-color:#d68100;stop-opacity:1"
+ offset="1"
+ id="stop8192" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.2"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="0.3"
+ style="stop-color:#FFFFB3" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFFFB3" />
+ <a:midPointstop
+ offset="0.4"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#D68100" />
+ </linearGradient>
+ <linearGradient
+ x1="156.5"
+ y1="122.7"
+ x2="180.10001"
+ y2="122.7"
+ id="lg2032"
+ xlink:href="#XMLID_3445_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <linearGradient
+ x1="156.39999"
+ y1="115.4"
+ x2="180.10001"
+ y2="115.4"
+ id="XMLID_3444_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ecb300;stop-opacity:1"
+ offset="0"
+ id="stop8171" />
+ <stop
+ style="stop-color:#ffe900;stop-opacity:1"
+ offset="0.2"
+ id="stop8173" />
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0.30000001"
+ id="stop8175" />
+ <stop
+ style="stop-color:#ffe900;stop-opacity:1"
+ offset="0.40000001"
+ id="stop8177" />
+ <stop
+ style="stop-color:#d68100;stop-opacity:1"
+ offset="1"
+ id="stop8179" />
+ <a:midPointstop
+ offset="0"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#ECB300" />
+ <a:midPointstop
+ offset="0.2"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="0.3"
+ style="stop-color:#FFFFB3" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFFFB3" />
+ <a:midPointstop
+ offset="0.4"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="0.5"
+ style="stop-color:#FFE900" />
+ <a:midPointstop
+ offset="1"
+ style="stop-color:#D68100" />
+ </linearGradient>
+ <linearGradient
+ x1="156.39999"
+ y1="115.4"
+ x2="180.10001"
+ y2="115.4"
+ id="lg2035"
+ xlink:href="#XMLID_3444_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
+ <linearGradient
+ x1="379.70001"
+ y1="167.89999"
+ x2="383.89999"
+ y2="172.89999"
+ id="lg4286_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0.2,-0.2,0.8,78.8,38.1)">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s16159" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0.1"
+ id="s16161" />
+ <stop
+ style="stop-color:#737373;stop-opacity:1"
+ offset="1"
+ id="s16163" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.1" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#737373"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="379.60001"
+ y1="167.8"
+ x2="383.79999"
+ y2="172"
+ id="lg6416"
+ xlink:href="#lg4286_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.622156,0.623859,-0.623859,2.62182,-882.9706,-673.7921)" />
+ <linearGradient
+ x1="384.20001"
+ y1="169.8"
+ x2="384.79999"
+ y2="170.39999"
+ id="lg4285_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0.2,-0.2,0.8,78.8,38.1)">
+ <stop
+ style="stop-color:#737373;stop-opacity:1"
+ offset="0"
+ id="s16152" />
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="1"
+ id="s16154" />
+ <ns:midPointStop
+ style="stop-color:#737373"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#737373"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#D9D9D9"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="384.20001"
+ y1="169.8"
+ x2="384.79999"
+ y2="170.39999"
+ id="lg6453"
+ xlink:href="#lg4285_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.6,0.6,-0.6,2.6,-883,-673.8)" />
+ <linearGradient
+ x1="380.5"
+ y1="172.60001"
+ x2="382.79999"
+ y2="173.7"
+ id="lg4284_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8,0.2,-0.2,0.8,78.8,38.1)">
+ <stop
+ style="stop-color:gray;stop-opacity:1"
+ offset="0"
+ id="s16145" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="1"
+ id="s16147" />
+ <ns:midPointStop
+ style="stop-color:#808080"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#808080"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#E5E5E5"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="380.5"
+ y1="172.60001"
+ x2="382.79999"
+ y2="173.7"
+ id="lg6456"
+ xlink:href="#lg4284_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.6,0.6,-0.6,2.6,-883,-673.8)" />
+ <radialGradient
+ cx="347.29999"
+ cy="244.5"
+ r="5.1999998"
+ fx="347.29999"
+ fy="244.5"
+ id="lg4282_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)">
+ <stop
+ style="stop-color:#333;stop-opacity:1"
+ offset="0"
+ id="s16135" />
+ <stop
+ style="stop-color:#999;stop-opacity:1"
+ offset="1"
+ id="s16137" />
+ <ns:midPointStop
+ style="stop-color:#333333"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#333333"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#999999"
+ offset="1" />
+ </radialGradient>
+ <linearGradient
+ x1="310.39999"
+ y1="397.70001"
+ x2="310.89999"
+ y2="399.5"
+ id="lg4280_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7,-0.7,0.7,0.7,-153.4,180.6)">
+ <stop
+ style="stop-color:#ffcd00;stop-opacity:1"
+ offset="0"
+ id="s16111" />
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0.60000002"
+ id="s16113" />
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="1"
+ id="s16115" />
+ <ns:midPointStop
+ style="stop-color:#FFCD00"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFCD00"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0.6" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="310.39999"
+ y1="397.70001"
+ x2="310.89999"
+ y2="399.5"
+ id="lg6467"
+ xlink:href="#lg4280_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.4,-2.4,2.4,2.4,-1663.6,-195)" />
+ <linearGradient
+ x1="310.89999"
+ y1="395.79999"
+ x2="313.29999"
+ y2="403.10001"
+ id="lg4279_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7,-0.7,0.7,0.7,-153.4,180.6)">
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0"
+ id="s16100" />
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0.40000001"
+ id="s16102" />
+ <stop
+ style="stop-color:#ffcd00;stop-opacity:1"
+ offset="0.89999998"
+ id="s16104" />
+ <stop
+ style="stop-color:#ffcd00;stop-opacity:1"
+ offset="1"
+ id="s16106" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0.4" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFCD00"
+ offset="0.9" />
+ <ns:midPointStop
+ style="stop-color:#FFCD00"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFCD00"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="310.89999"
+ y1="395.79999"
+ x2="313.29999"
+ y2="403.10001"
+ id="lg6465"
+ xlink:href="#lg4279_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.4,-2.4,2.4,2.4,-1663.6,-195)" />
+ <linearGradient
+ x1="307.79999"
+ y1="395.20001"
+ x2="313.79999"
+ y2="413.60001"
+ id="lg4278_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7,-0.7,0.7,0.7,-153.4,180.6)">
+ <stop
+ style="stop-color:#ffffb3;stop-opacity:1"
+ offset="0"
+ id="s16091" />
+ <stop
+ style="stop-color:#fcd72f;stop-opacity:1"
+ offset="0.40000001"
+ id="s16093" />
+ <stop
+ style="stop-color:#ffcd00;stop-opacity:1"
+ offset="1"
+ id="s16095" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFFFB3"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FCD72F"
+ offset="0.4" />
+ <ns:midPointStop
+ style="stop-color:#FCD72F"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFCD00"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="306.5"
+ y1="393"
+ x2="309"
+ y2="404"
+ id="lg6400"
+ xlink:href="#lg4278_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.4,-2.4,2.4,2.4,-1663.6,-195)" />
+ <linearGradient
+ x1="352.10001"
+ y1="253.60001"
+ x2="348.5"
+ y2="237.8"
+ id="lg4276_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)">
+ <stop
+ style="stop-color:#ffff87;stop-opacity:1"
+ offset="0"
+ id="s16077" />
+ <stop
+ style="stop-color:#ffad00;stop-opacity:1"
+ offset="1"
+ id="s16079" />
+ <ns:midPointStop
+ style="stop-color:#FFFF87"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFFF87"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFAD00"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="335.60001"
+ y1="354.79999"
+ x2="337.89999"
+ y2="354.79999"
+ id="lg4275_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9,-0.5,0.5,0.9,-121.7,105.1)">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="s16057" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0.80000001"
+ id="s16059" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="s16061" />
+ <ns:midPointStop
+ style="stop-color:#D9D9D9"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#D9D9D9"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.8" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="335.60001"
+ y1="354.79999"
+ x2="337.89999"
+ y2="354.79999"
+ id="lg6463"
+ xlink:href="#lg4275_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9,-1.7,1.7,2.9,-1557,-448.7)" />
+ <linearGradient
+ x1="337.39999"
+ y1="353.10001"
+ x2="339.39999"
+ y2="357.10001"
+ id="lg4274_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9,-0.5,0.5,0.9,-121.7,105.1)">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s16048" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0.1"
+ id="s16050" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="s16052" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.1" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#CCCCCC"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="337.39999"
+ y1="353.10001"
+ x2="339.39999"
+ y2="357.10001"
+ id="lg6461"
+ xlink:href="#lg4274_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9,-1.7,1.7,2.9,-1557,-448.7)" />
+ <linearGradient
+ x1="334.39999"
+ y1="355.5"
+ x2="335.5"
+ y2="356.79999"
+ id="lg4273_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9,-0.5,0.5,0.9,-121.7,105.1)">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s16041" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="s16043" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="5.6e-003" />
+ <ns:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#CCCCCC"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="334.39999"
+ y1="355.5"
+ x2="335.5"
+ y2="356.79999"
+ id="lg6381"
+ xlink:href="#lg4273_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9,-1.7,1.7,2.9,-1557,-448.7)" />
+ <linearGradient
+ x1="348.39999"
+ y1="247.39999"
+ x2="354.10001"
+ y2="242"
+ id="lg4271_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)">
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0"
+ id="s16025" />
+ <stop
+ style="stop-color:#9e9e9e;stop-opacity:1"
+ offset="0.40000001"
+ id="s16027" />
+ <stop
+ style="stop-color:black;stop-opacity:1"
+ offset="1"
+ id="s16029" />
+ <ns:midPointStop
+ style="stop-color:#F2F2F2"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#F2F2F2"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#000000"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="351.29999"
+ y1="257.29999"
+ x2="346.29999"
+ y2="235.5"
+ id="lg4270_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ffff87;stop-opacity:1"
+ offset="0"
+ id="s16007" />
+ <stop
+ style="stop-color:#ffad00;stop-opacity:1"
+ offset="1"
+ id="s16009" />
+ <ns:midPointStop
+ style="stop-color:#FFFF87"
+ offset="0" />
+ <ns:midPointStop
+ style="stop-color:#FFFF87"
+ offset="0.5" />
+ <ns:midPointStop
+ style="stop-color:#FFAD00"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="351.29999"
+ y1="257.29999"
+ x2="346.29999"
+ y2="235.5"
+ id="lg6459"
+ xlink:href="#lg4270_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)" />
+ <linearGradient
+ x1="43.799999"
+ y1="32.5"
+ x2="63.299999"
+ y2="66.400002"
+ id="XMLID_2708_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop75318" />
+ <stop
+ style="stop-color:#fffcea;stop-opacity:1"
+ offset="1"
+ id="stop75320" />
+ <a:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#FFFCEA"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="43.799999"
+ y1="32.5"
+ x2="63.299999"
+ y2="66.400002"
+ id="lg1907"
+ xlink:href="#XMLID_2708_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-29,-22.6)" />
+ <linearGradient
+ x1="52.5"
+ y1="40.400002"
+ x2="58.200001"
+ y2="64"
+ id="XMLID_2707_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#ffdea0;stop-opacity:1"
+ offset="0"
+ id="stop75305" />
+ <stop
+ style="stop-color:#ffd89e;stop-opacity:1"
+ offset="0.30000001"
+ id="stop75307" />
+ <stop
+ style="stop-color:#ffd79e;stop-opacity:1"
+ offset="0.30000001"
+ id="stop75309" />
+ <stop
+ style="stop-color:#dbaf6d;stop-opacity:1"
+ offset="0.69999999"
+ id="stop75311" />
+ <stop
+ style="stop-color:#6f4c24;stop-opacity:1"
+ offset="1"
+ id="stop75313" />
+ <a:midPointStop
+ style="stop-color:#FFDEA0"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#FFDEA0"
+ offset="0.6" />
+ <a:midPointStop
+ style="stop-color:#FFD79E"
+ offset="0.3" />
+ <a:midPointStop
+ style="stop-color:#FFD79E"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#DBAF6D"
+ offset="0.7" />
+ <a:midPointStop
+ style="stop-color:#DBAF6D"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#6F4C24"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="52.5"
+ y1="40.400002"
+ x2="58.200001"
+ y2="64"
+ id="lg1910"
+ xlink:href="#XMLID_2707_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-29,-22.6)" />
+ <linearGradient
+ x1="58"
+ y1="73.199997"
+ x2="44.5"
+ y2="19"
+ id="XMLID_2704_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-29,-22.6)">
+ <stop
+ style="stop-color:#d4a96c;stop-opacity:1"
+ offset="0.5"
+ id="stop75284" />
+ <stop
+ style="stop-color:#dcb273;stop-opacity:1"
+ offset="0.60000002"
+ id="stop75286" />
+ <stop
+ style="stop-color:#f0ca87;stop-opacity:1"
+ offset="0.80000001"
+ id="stop75288" />
+ <stop
+ style="stop-color:#ffdc96;stop-opacity:1"
+ offset="0.69999999"
+ id="stop75290" />
+ <stop
+ style="stop-color:#c18a42;stop-opacity:1"
+ offset="1"
+ id="stop75292" />
+ <a:midPointStop
+ style="stop-color:#D4A96C"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#D4A96C"
+ offset="0.6" />
+ <a:midPointStop
+ style="stop-color:#FFDC96"
+ offset="0.7" />
+ <a:midPointStop
+ style="stop-color:#FFDC96"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#C18A42"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="53.700001"
+ y1="32"
+ x2="53.700001"
+ y2="64.599998"
+ id="XMLID_2703_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#e5c9b0;stop-opacity:1"
+ offset="0"
+ id="stop75268" />
+ <stop
+ style="stop-color:#e5c9b0;stop-opacity:1"
+ offset="0.40000001"
+ id="stop75270" />
+ <stop
+ style="stop-color:#c0aa94;stop-opacity:1"
+ offset="1"
+ id="stop75272" />
+ <a:midPointStop
+ style="stop-color:#E5C9B0"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#E5C9B0"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#E5C9B0"
+ offset="0.4" />
+ <a:midPointStop
+ style="stop-color:#E5C9B0"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#C0AA94"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="53.700001"
+ y1="32"
+ x2="53.700001"
+ y2="64.599998"
+ id="lg1916"
+ xlink:href="#XMLID_2703_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-29,-22.6)" />
+ <linearGradient
+ x1="224.31"
+ y1="19.450001"
+ x2="214.33"
+ y2="11.46"
+ id="XMLID_419_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#404040;stop-opacity:1"
+ offset="0"
+ id="s1903" />
+ <stop
+ style="stop-color:#6d6d6d;stop-opacity:1"
+ offset="0.33000001"
+ id="s1905" />
+ <stop
+ style="stop-color:#e9e9e9;stop-opacity:1"
+ offset="1"
+ id="s1907" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#404040" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#404040" />
+ <a:midPointStop
+ offset="0.33"
+ style="stop-color:#6D6D6D" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#6D6D6D" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#E9E9E9" />
+ </linearGradient>
+ <linearGradient
+ x1="221.84"
+ y1="32.779999"
+ x2="212.2"
+ y2="20.27"
+ id="lg1988"
+ xlink:href="#XMLID_419_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.33,0,0,1.31,-274.2,-5.2)" />
+ <linearGradient
+ x1="228.35001"
+ y1="33.279999"
+ x2="215.42999"
+ y2="33.279999"
+ id="lg1900"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s1902" />
+ <stop
+ style="stop-color:white;stop-opacity:0"
+ offset="1"
+ id="s1906" />
+ <a:midPointStop
+ style="stop-color:#575757"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#575757"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#6D6D6D"
+ offset="0.33" />
+ <a:midPointStop
+ style="stop-color:#6D6D6D"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#D3D3D3"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="234.81"
+ y1="33.279999"
+ x2="228.27"
+ y2="33.279999"
+ id="lg1908"
+ xlink:href="#lg1900"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.33,0,0,1.31,-274.2,-5.2)" />
+ <linearGradient
+ x1="228.35001"
+ y1="33.279999"
+ x2="215.42999"
+ y2="33.279999"
+ id="XMLID_416_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#575757;stop-opacity:1"
+ offset="0"
+ id="s1874" />
+ <stop
+ style="stop-color:#6d6d6d;stop-opacity:1"
+ offset="0.33000001"
+ id="s1876" />
+ <stop
+ style="stop-color:#d3d3d3;stop-opacity:1"
+ offset="1"
+ id="s1878" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#575757" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#575757" />
+ <a:midPointStop
+ offset="0.33"
+ style="stop-color:#6D6D6D" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#6D6D6D" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#D3D3D3" />
+ </linearGradient>
+ <linearGradient
+ x1="228.35001"
+ y1="33.279999"
+ x2="215.42999"
+ y2="33.279999"
+ id="lg1991"
+ xlink:href="#XMLID_416_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.33,0,0,1.31,-274.2,-5.2)" />
+ <radialGradient
+ cx="603.19"
+ cy="230.77"
+ r="1.67"
+ fx="603.19"
+ fy="230.77"
+ id="x5010_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1,0,0,1.1,-54.33,-75.4)">
+ <stop
+ style="stop-color:#c9ffc9;stop-opacity:1"
+ offset="0"
+ id="stop29201" />
+ <stop
+ style="stop-color:#23a11f;stop-opacity:1"
+ offset="1"
+ id="stop29203" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#C9FFC9" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#C9FFC9" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#23A11F" />
+ </radialGradient>
+ <radialGradient
+ cx="603.19"
+ cy="230.77"
+ r="1.67"
+ fx="603.19"
+ fy="230.77"
+ id="radialGradient5711"
+ xlink:href="#x5010_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.23,0,0,1.23,-709.93,-245.02)" />
+ <linearGradient
+ x1="592.31"
+ y1="162.60001"
+ x2="609.32001"
+ y2="145.59"
+ id="lg5722"
+ xlink:href="#x5003_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
+ <linearGradient
+ x1="601.48999"
+ y1="170.16"
+ x2="613.84003"
+ y2="170.16"
+ id="x5002_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="stop29134" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0.2"
+ id="stop29136" />
+ <stop
+ style="stop-color:#999;stop-opacity:1"
+ offset="1"
+ id="stop29138" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.20"
+ style="stop-color:#FFFFFF" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#FFFFFF" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#999999" />
+ </linearGradient>
+ <linearGradient
+ x1="601.48999"
+ y1="170.16"
+ x2="613.84003"
+ y2="170.16"
+ id="lg5725"
+ xlink:href="#x5002_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
+ <linearGradient
+ x1="592.20001"
+ y1="156.45"
+ x2="609.98999"
+ y2="174.23"
+ id="x5004_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="stop29157" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="stop29159" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#FFFFFF" />
+ </linearGradient>
+ <linearGradient
+ x1="592.20001"
+ y1="156.45"
+ x2="609.98999"
+ y2="174.23"
+ id="lg5728"
+ xlink:href="#x5004_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
+ <linearGradient
+ x1="592.31"
+ y1="162.60001"
+ x2="609.32001"
+ y2="145.59"
+ id="x5003_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0"
+ id="stop29143" />
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="1"
+ id="stop29145" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#F2F2F2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#F2F2F2" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#E5E5E5" />
+ </linearGradient>
+ <linearGradient
+ x1="592.31"
+ y1="162.60001"
+ x2="609.32001"
+ y2="145.59"
+ id="lg5732"
+ xlink:href="#x5003_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
+ <linearGradient
+ x1="592.20001"
+ y1="156.45"
+ x2="609.98999"
+ y2="174.24001"
+ id="x5000_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="stop29124" />
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="1"
+ id="stop29126" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#FFFFFF" />
+ </linearGradient>
+ <linearGradient
+ x1="592.20001"
+ y1="156.45"
+ x2="609.98999"
+ y2="174.24001"
+ id="lg5735"
+ xlink:href="#x5000_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
+ <linearGradient
+ x1="308.54999"
+ y1="149.89999"
+ x2="299.72"
+ y2="148.83"
+ id="XMLID_2433_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#d6d6d6;stop-opacity:1"
+ offset="0"
+ id="71615" />
+ <stop
+ style="stop-color:#a5a5a5;stop-opacity:1"
+ offset="1"
+ id="71617" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#D6D6D6" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#D6D6D6" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#A5A5A5" />
+ </linearGradient>
+ <linearGradient
+ x1="308.54999"
+ y1="149.89999"
+ x2="299.72"
+ y2="148.83"
+ id="lg1952"
+ xlink:href="#XMLID_2433_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.03,0,0,1.03,-279.57,-124.36)" />
+ <radialGradient
+ cx="307.39999"
+ cy="121"
+ r="23.35"
+ fx="307.39999"
+ fy="121"
+ id="XMLID_2432_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98,0,0,0.98,2.88,2.75)">
+ <stop
+ style="stop-color:#d2d2d2;stop-opacity:1"
+ offset="0.19"
+ id="71592" />
+ <stop
+ style="stop-color:#cfcfcf;stop-opacity:1"
+ offset="0.44999999"
+ id="71594" />
+ <stop
+ style="stop-color:#c7c7c7;stop-opacity:1"
+ offset="0.60000002"
+ id="71596" />
+ <stop
+ style="stop-color:#b9b9b9;stop-opacity:1"
+ offset="0.74000001"
+ id="71598" />
+ <stop
+ style="stop-color:#a4a4a4;stop-opacity:1"
+ offset="0.86000001"
+ id="71600" />
+ <stop
+ style="stop-color:#8a8a8a;stop-opacity:1"
+ offset="0.95999998"
+ id="71602" />
+ <stop
+ style="stop-color:gray;stop-opacity:1"
+ offset="1"
+ id="71604" />
+ <a:midPointStop
+ offset="0.19"
+ style="stop-color:#D2D2D2" />
+ <a:midPointStop
+ offset="0.8"
+ style="stop-color:#D2D2D2" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#808080" />
+ </radialGradient>
+ <radialGradient
+ cx="307.39999"
+ cy="121"
+ r="23.35"
+ fx="307.39999"
+ fy="121"
+ id="radialGradient2331"
+ xlink:href="#XMLID_2432_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-276.62,-121.54)" />
+ <linearGradient
+ x1="294.13"
+ y1="127.07"
+ x2="294.13"
+ y2="142.2"
+ id="XMLID_2430_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#b5d8ff;stop-opacity:1"
+ offset="0"
+ id="71582" />
+ <stop
+ style="stop-color:black;stop-opacity:1"
+ offset="1"
+ id="71584" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#B5D8FF" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B5D8FF" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#000000" />
+ </linearGradient>
+ <linearGradient
+ x1="294.13"
+ y1="127.07"
+ x2="294.13"
+ y2="142.2"
+ id="lg2820"
+ xlink:href="#XMLID_2430_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.03,0,0,1.03,-279.57,-124.36)" />
+ <linearGradient
+ x1="279.10999"
+ y1="148.03"
+ x2="309.16"
+ y2="148.03"
+ id="XMLID_2429_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#e1e1e1;stop-opacity:1"
+ offset="0"
+ id="71564" />
+ <stop
+ style="stop-color:#e1e1e1;stop-opacity:1"
+ offset="0.25"
+ id="71566" />
+ <stop
+ style="stop-color:#a5a5a5;stop-opacity:1"
+ offset="0.44"
+ id="71568" />
+ <stop
+ style="stop-color:#a5a5a5;stop-opacity:1"
+ offset="1"
+ id="71570" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#E1E1E1" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E1E1E1" />
+ <a:midPointStop
+ offset="0.25"
+ style="stop-color:#E1E1E1" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E1E1E1" />
+ <a:midPointStop
+ offset="0.44"
+ style="stop-color:#A5A5A5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#A5A5A5" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#A5A5A5" />
+ </linearGradient>
+ <linearGradient
+ x1="279.10999"
+ y1="148.03"
+ x2="309.16"
+ y2="148.03"
+ id="lg2818"
+ xlink:href="#XMLID_2429_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.03,0,0,1.03,-279.57,-124.36)" />
+ <radialGradient
+ cx="622.34302"
+ cy="14.449"
+ r="26.496"
+ fx="622.34302"
+ fy="14.449"
+ id="lg3499_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.851,0,0,0.849,69.297,51.658)">
+ <stop
+ style="stop-color:#23468e;stop-opacity:1"
+ offset="0"
+ id="stop10972" />
+ <stop
+ style="stop-color:#012859;stop-opacity:1"
+ offset="1"
+ id="stop10974" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#23468E" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#23468E" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#012859" />
+ </radialGradient>
+ <radialGradient
+ cx="622.34302"
+ cy="14.449"
+ r="26.496"
+ fx="622.34302"
+ fy="14.449"
+ id="rg5791"
+ xlink:href="#lg3499_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.858,0,0,0.857,-511.7,9.02)" />
+ <linearGradient
+ x1="616.112"
+ y1="76.247002"
+ x2="588.14099"
+ y2="60.742001"
+ id="lg3497_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#01326e;stop-opacity:1"
+ offset="0"
+ id="stop10962" />
+ <stop
+ style="stop-color:#012859;stop-opacity:1"
+ offset="1"
+ id="stop10964" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#01326E" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#01326E" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#012859" />
+ </linearGradient>
+ <linearGradient
+ x1="617.698"
+ y1="82.445999"
+ x2="585.95203"
+ y2="54.848999"
+ id="lg3496_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0"
+ id="stop10950" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="stop10952" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#E5E5E5" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#CCCCCC" />
+ </linearGradient>
+ <linearGradient
+ x1="617.698"
+ y1="82.445999"
+ x2="585.95203"
+ y2="54.848999"
+ id="lg5794"
+ xlink:href="#lg3496_"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="601.39001"
+ y1="55.341"
+ x2="588.29199"
+ y2="71.515999"
+ id="lg3495_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="stop10941" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0.52200001"
+ id="stop10943" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="stop10945" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.522"
+ style="stop-color:#F2F2F2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#F2F2F2" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#CCCCCC" />
+ </linearGradient>
+ <linearGradient
+ x1="601.39001"
+ y1="55.341"
+ x2="588.29199"
+ y2="71.515999"
+ id="lg5771"
+ xlink:href="#lg3495_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.009,0,0,1.009,-581.615,-43.098)" />
+ <linearGradient
+ x1="611.34601"
+ y1="55.279999"
+ x2="590.39001"
+ y2="81.157997"
+ id="lg3494_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="stop10932" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0.52200001"
+ id="stop10934" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="stop10936" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#D9D9D9" />
+ <a:midPointStop
+ offset="0.522"
+ style="stop-color:#F2F2F2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#F2F2F2" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#CCCCCC" />
+ </linearGradient>
+ <linearGradient
+ x1="611.34601"
+ y1="55.279999"
+ x2="590.39001"
+ y2="81.157997"
+ id="lg5774"
+ xlink:href="#lg3494_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.009,0,0,1.009,-581.616,-43.098)" />
+ <linearGradient
+ x1="798.72998"
+ y1="69.839996"
+ x2="799.04999"
+ y2="70.709999"
+ id="g3302_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#005e00;stop-opacity:1"
+ offset="0"
+ id="s6504" />
+ <stop
+ style="stop-color:#23a11f;stop-opacity:1"
+ offset="1"
+ id="s6506" />
+ <a:midPointstop
+ style="stop-color:#005E00"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#005E00"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#23A11F"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="798.72998"
+ y1="69.839996"
+ x2="799.04999"
+ y2="70.709999"
+ id="lg5851"
+ xlink:href="#g3302_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.204,0,0,1.263,-926.036,-60.001)" />
+ <linearGradient
+ x1="779.19"
+ y1="122.73"
+ x2="811.69"
+ y2="149.74001"
+ id="g3301_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,-0.25,0,1,0,129.19)">
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0"
+ id="s6483" />
+ <stop
+ style="stop-color:#eee;stop-opacity:1"
+ offset="0.17"
+ id="s6485" />
+ <stop
+ style="stop-color:#e3e3e3;stop-opacity:1"
+ offset="0.34"
+ id="s6487" />
+ <stop
+ style="stop-color:#cfcfcf;stop-opacity:1"
+ offset="0.50999999"
+ id="s6489" />
+ <stop
+ style="stop-color:#b4b4b4;stop-opacity:1"
+ offset="0.67000002"
+ id="s6491" />
+ <stop
+ style="stop-color:#919191;stop-opacity:1"
+ offset="0.83999997"
+ id="s6493" />
+ <stop
+ style="stop-color:#666;stop-opacity:1"
+ offset="1"
+ id="s6495" />
+ <a:midPointstop
+ style="stop-color:#F2F2F2"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#F2F2F2"
+ offset="0.71" />
+ <a:midPointstop
+ style="stop-color:#666666"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="779.19"
+ y1="122.73"
+ x2="811.69"
+ y2="149.74001"
+ id="lg5855"
+ xlink:href="#g3301_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.204,-0.316,0,1.263,-926.036,103.123)" />
+ <clipPath
+ id="g3299_">
+ <use
+ id="use6469"
+ x="0"
+ y="0"
+ width="1005.92"
+ height="376.97"
+ xlink:href="#g101_" />
+ </clipPath>
+ <radialGradient
+ cx="1189.9301"
+ cy="100.05"
+ r="40.400002"
+ fx="1189.9301"
+ fy="100.05"
+ id="g3300_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.34,-8.46e-2,0,0.34,394.16,137.13)">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s6472" />
+ <stop
+ style="stop-color:white;stop-opacity:0"
+ offset="1"
+ id="s6474" />
+ <a:midPointstop
+ style="stop-color:#FFFFFF"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#000000"
+ offset="1" />
+ </radialGradient>
+ <radialGradient
+ cx="1199.74"
+ cy="97.150002"
+ r="40.400002"
+ fx="1199.74"
+ fy="97.150002"
+ id="rg5860"
+ xlink:href="#g3300_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.409,-0.107,0,0.429,-451.489,113.149)" />
+ <linearGradient
+ x1="796.38"
+ y1="67.580002"
+ x2="781.28003"
+ y2="58.549999"
+ id="g3298_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#4c8bca;stop-opacity:1"
+ offset="0"
+ id="s6462" />
+ <stop
+ style="stop-color:#b7e9ff;stop-opacity:1"
+ offset="1"
+ id="s6464" />
+ <a:midPointstop
+ style="stop-color:#4C8BCA"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#4C8BCA"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#B7E9FF"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="800.97998"
+ y1="140.72"
+ x2="777.71997"
+ y2="121.76"
+ id="g3297_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,-0.25,0,1,0,129.19)">
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0"
+ id="s6448" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="s6450" />
+ <a:midPointstop
+ style="stop-color:#E5E5E5"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#E5E5E5"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#CCCCCC"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="800.97998"
+ y1="140.72"
+ x2="777.71997"
+ y2="121.76"
+ id="lg5890"
+ xlink:href="#g3297_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,-0.25,0,1,0,129.19)" />
+ <linearGradient
+ x1="790.03998"
+ y1="-16.33"
+ x2="779.84003"
+ y2="-3.73"
+ id="g3296_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,70.17)">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="s6439" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0.51999998"
+ id="s6441" />
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="1"
+ id="s6443" />
+ <a:midPointstop
+ style="stop-color:#D9D9D9"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#D9D9D9"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#F2F2F2"
+ offset="0.52" />
+ <a:midPointstop
+ style="stop-color:#F2F2F2"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#CCCCCC"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="790.03998"
+ y1="-16.33"
+ x2="779.84003"
+ y2="-3.73"
+ id="lg5866"
+ xlink:href="#g3296_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.204,0,0,1.263,-926.036,28.6)" />
+ <linearGradient
+ x1="785.84003"
+ y1="72.989998"
+ x2="785.26001"
+ y2="76.279999"
+ id="g3293_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s6412" />
+ <stop
+ style="stop-color:#737373;stop-opacity:1"
+ offset="1"
+ id="s6414" />
+ <a:midPointstop
+ style="stop-color:#FFFFFF"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#737373"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="785.84003"
+ y1="72.989998"
+ x2="785.26001"
+ y2="76.279999"
+ id="lg5871"
+ xlink:href="#g3293_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.204,0,0,1.263,-926.036,-60.001)" />
+ <linearGradient
+ x1="789.37"
+ y1="69.879997"
+ x2="791.03998"
+ y2="77.120003"
+ id="g3292_"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#999;stop-opacity:1"
+ offset="0"
+ id="s6403" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="0.28"
+ id="s6405" />
+ <stop
+ style="stop-color:#666;stop-opacity:1"
+ offset="1"
+ id="s6407" />
+ <a:midPointstop
+ style="stop-color:#999999"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#999999"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#F2F2F2"
+ offset="0.28" />
+ <a:midPointstop
+ style="stop-color:#F2F2F2"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#666666"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="789.37"
+ y1="69.879997"
+ x2="791.03998"
+ y2="77.120003"
+ id="lg5874"
+ xlink:href="#g3292_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.204,0,0,1.263,-926.036,-60.001)" />
+ <linearGradient
+ x1="786.65997"
+ y1="136.12"
+ x2="786.71002"
+ y2="134.33"
+ id="g3290_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,-0.25,0,1,0,137.29)">
+ <stop
+ style="stop-color:#d9d9d9;stop-opacity:1"
+ offset="0"
+ id="s6380" />
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="1"
+ id="s6382" />
+ <a:midPointstop
+ style="stop-color:#D9D9D9"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#D9D9D9"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#B2B2B2"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="786.65997"
+ y1="136.12"
+ x2="786.71002"
+ y2="134.33"
+ id="lg5878"
+ xlink:href="#g3290_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.204,-0.316,0,1.263,-926.036,113.351)" />
+ <radialGradient
+ cx="1458.77"
+ cy="-5.0999999"
+ r="35.130001"
+ fx="1458.77"
+ fy="-5.0999999"
+ id="g3289_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.42,0,0,0.42,167.09,79.84)">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="s6371" />
+ <stop
+ style="stop-color:#999;stop-opacity:1"
+ offset="1"
+ id="s6373" />
+ <a:midPointstop
+ style="stop-color:#FFFFFF"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#FFFFFF"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#999999"
+ offset="1" />
+ </radialGradient>
+ <radialGradient
+ cx="1458.77"
+ cy="-5.0999999"
+ r="35.130001"
+ fx="1458.77"
+ fy="-5.0999999"
+ id="rg5881"
+ xlink:href="#g3289_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.505,0,0,0.53,-724.957,40.636)" />
+ <radialGradient
+ cx="1612.98"
+ cy="-4.4699998"
+ r="36.580002"
+ fx="1612.98"
+ fy="-4.4699998"
+ id="g3288_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.34,0,0,0.36,238.56,86.87)">
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0"
+ id="s6362" />
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0.63999999"
+ id="s6364" />
+ <stop
+ style="stop-color:#737373;stop-opacity:1"
+ offset="1"
+ id="s6366" />
+ <a:midPointstop
+ style="stop-color:#E5E5E5"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#E5E5E5"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#B2B2B2"
+ offset="0.64" />
+ <a:midPointstop
+ style="stop-color:#B2B2B2"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#737373"
+ offset="1" />
+ </radialGradient>
+ <radialGradient
+ cx="1612.98"
+ cy="-4.4699998"
+ r="36.580002"
+ fx="1612.98"
+ fy="-4.4699998"
+ id="rg5884"
+ xlink:href="#g3288_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.408,0,0,0.448,-638.943,49.495)" />
+ <radialGradient
+ cx="1470.5"
+ cy="-10.21"
+ r="33.290001"
+ fx="1470.5"
+ fy="-10.21"
+ id="g3287_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.42,0,0,0.42,167.09,79.84)">
+ <stop
+ style="stop-color:#e5e5e5;stop-opacity:1"
+ offset="0"
+ id="s6347" />
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0.38999999"
+ id="s6349" />
+ <stop
+ style="stop-color:#b1b1b1;stop-opacity:1"
+ offset="0.75"
+ id="s6351" />
+ <stop
+ style="stop-color:#aaa;stop-opacity:1"
+ offset="0.88"
+ id="s6353" />
+ <stop
+ style="stop-color:#9e9e9e;stop-opacity:1"
+ offset="0.97000003"
+ id="s6355" />
+ <stop
+ style="stop-color:#999;stop-opacity:1"
+ offset="1"
+ id="s6357" />
+ <a:midPointstop
+ style="stop-color:#E5E5E5"
+ offset="0" />
+ <a:midPointstop
+ style="stop-color:#E5E5E5"
+ offset="0.5" />
+ <a:midPointstop
+ style="stop-color:#B2B2B2"
+ offset="0.39" />
+ <a:midPointstop
+ style="stop-color:#B2B2B2"
+ offset="0.87" />
+ <a:midPointstop
+ style="stop-color:#999999"
+ offset="1" />
+ </radialGradient>
+ <radialGradient
+ cx="1470.5"
+ cy="-10.21"
+ r="33.290001"
+ fx="1470.5"
+ fy="-10.21"
+ id="rg5887"
+ xlink:href="#g3287_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.505,0,0,0.53,-724.957,40.636)" />
+ <pattern
+ patternTransform="matrix(0.592927,0,0,0.592927,78,462)"
+ id="cream-spots"
+ height="32"
+ width="32"
+ patternUnits="userSpaceOnUse">
+ <g
+ transform="translate(-365.3146,-513.505)"
+ id="g3047">
+ id=&quot;path2858&quot; /&gt;
+ <path
+ inkscape:label="#path2854"
+ sodipodi:nodetypes="czzzz"
+ style="fill:#e3dcc0"
+ id="path3060"
+ d="M 390.31462,529.50504 C 390.31462,534.47304 386.28262,538.50504 381.31462,538.50504 C 376.34662,538.50504 372.31462,534.47304 372.31462,529.50504 C 372.31462,524.53704 376.34662,520.50504 381.31462,520.50504 C 386.28262,520.50504 390.31462,524.53704 390.31462,529.50504 z " />
+</g>
+ </pattern>
+ <pattern
+ patternTransform="matrix(0.733751,0,0,0.733751,67,367)"
+ id="dark-cream-spots"
+ height="32"
+ width="32"
+ patternUnits="userSpaceOnUse">
+ <g
+ transform="translate(-408.0946,-513.505)"
+ id="dark-cream-spot"
+ inkscape:label="#g3043">
+ <path
+ sodipodi:nodetypes="czzzz"
+ style="fill:#c8c5ac"
+ d="M 433.09458,529.50504 C 433.09458,534.47304 429.06258,538.50504 424.09458,538.50504 C 419.12658,538.50504 415.09458,534.47304 415.09458,529.50504 C 415.09458,524.53704 419.12658,520.50504 424.09458,520.50504 C 429.06258,520.50504 433.09458,524.53704 433.09458,529.50504 z "
+ id="path2953" />
+ </g>
+ </pattern>
+ <pattern
+ patternTransform="matrix(0.375,0,0,0.375,379,400)"
+ id="white-spots"
+ height="32"
+ width="32"
+ patternUnits="userSpaceOnUse">
+ <g
+ transform="translate(-484.3997,-513.505)"
+ id="white-spot"
+ inkscape:label="#g3035">
+ <path
+ style="opacity:0.25;fill:white"
+ id="path3033"
+ d="M 509.39967,529.50504 C 509.39967,534.47304 505.36767,538.50504 500.39967,538.50504 C 495.43167,538.50504 491.39967,534.47304 491.39967,529.50504 C 491.39967,524.53704 495.43167,520.50504 500.39967,520.50504 C 505.36767,520.50504 509.39967,524.53704 509.39967,529.50504 z "
+ sodipodi:nodetypes="czzzz" />
+ </g>
+ </pattern>
+ <pattern
+ patternTransform="matrix(0.455007,0,0,0.455007,-5e-5,1.9e-5)"
+ id="black-spots"
+ height="32"
+ width="32"
+ patternUnits="userSpaceOnUse">
+ <g
+ transform="translate(-448.3997,-513.505)"
+ id="black-spot"
+ inkscape:label="#g3039">
+ <path
+ sodipodi:nodetypes="czzzz"
+ d="M 473.39967,529.50504 C 473.39967,534.47304 469.36767,538.50504 464.39967,538.50504 C 459.43167,538.50504 455.39967,534.47304 455.39967,529.50504 C 455.39967,524.53704 459.43167,520.50504 464.39967,520.50504 C 469.36767,520.50504 473.39967,524.53704 473.39967,529.50504 z "
+ id="path2961"
+ style="opacity:0.25;fill:black" />
+ </g>
+ </pattern>
+ <linearGradient
+ x1="501.0903"
+ y1="-19.2544"
+ x2="531.85413"
+ y2="0.72390002"
+ id="linearGradient17334"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0"
+ id="stop17336" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0.51120001"
+ id="stop17338" />
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0.64609998"
+ id="stop17340" />
+ <stop
+ style="stop-color:#16336e;stop-opacity:1"
+ offset="1"
+ id="stop17342" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#B4DAEA" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B4DAEA" />
+ <a:midPointStop
+ offset="0.5112"
+ style="stop-color:#B4DAEA" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B4DAEA" />
+ <a:midPointStop
+ offset="0.6461"
+ style="stop-color:#5387BA" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#5387BA" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#16336E" />
+ </linearGradient>
+ <linearGradient
+ x1="415.73831"
+ y1="11.854"
+ x2="418.13361"
+ y2="18.8104"
+ id="linearGradient17426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8362,0.5206,-1.1904,0.992,147.62,-30.9374)">
+ <stop
+ style="stop-color:#ccc;stop-opacity:1"
+ offset="0"
+ id="stop17428" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="1"
+ id="stop17430" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#CCCCCC" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#CCCCCC" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#F2F2F2" />
+ </linearGradient>
+ <linearGradient
+ x1="478.21341"
+ y1="-131.9297"
+ x2="469.85818"
+ y2="-140.28481"
+ id="linearGradient17434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5592,0.829,-0.829,0.5592,101.3357,-104.791)">
+ <stop
+ style="stop-color:#f3403f;stop-opacity:1"
+ offset="0"
+ id="stop17436" />
+ <stop
+ style="stop-color:#d02a28;stop-opacity:1"
+ offset="0.37889999"
+ id="stop17438" />
+ <stop
+ style="stop-color:#b21714;stop-opacity:1"
+ offset="0.77649999"
+ id="stop17440" />
+ <stop
+ style="stop-color:#a6100c;stop-opacity:1"
+ offset="1"
+ id="stop17442" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#F3403F" />
+ <a:midPointStop
+ offset="0.4213"
+ style="stop-color:#F3403F" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#A6100C" />
+ </linearGradient>
+ <linearGradient
+ x1="502.70749"
+ y1="115.3013"
+ x2="516.39001"
+ y2="127.1953"
+ id="linearGradient17709"
+ xlink:href="#XMLID_1749_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)" />
+ <linearGradient
+ x1="506.09909"
+ y1="-11.5137"
+ x2="527.99609"
+ y2="2.7063999"
+ id="linearGradient17711"
+ xlink:href="#XMLID_1752_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="516.57672"
+ y1="-15.769"
+ x2="516.57672"
+ y2="0.84280002"
+ id="linearGradient17713"
+ xlink:href="#XMLID_1753_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="505.62939"
+ y1="-14.9526"
+ x2="527.49402"
+ y2="-0.7536"
+ id="linearGradient17715"
+ xlink:href="#XMLID_1756_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="500.70749"
+ y1="-13.2441"
+ x2="513.46442"
+ y2="-2.1547"
+ id="linearGradient17717"
+ xlink:href="#XMLID_1757_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="473.7681"
+ y1="209.17529"
+ x2="486.98099"
+ y2="213.2001"
+ id="linearGradient17721"
+ xlink:href="#XMLID_2274_"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="481.23969"
+ y1="212.5742"
+ x2="472.92981"
+ y2="207.4967"
+ id="linearGradient17723"
+ xlink:href="#XMLID_2275_"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="500.70749"
+ y1="-13.2441"
+ x2="513.46442"
+ y2="-2.1547"
+ id="linearGradient17416"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0"
+ id="stop17418" />
+ <stop
+ style="stop-color:#96bad6;stop-opacity:1"
+ offset="1"
+ id="stop17420" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#96BAD6"
+ offset="1" />
+ </linearGradient>
+ <defs
+ id="defs9929">
+ <path
+ d="M 489.21,209.35 L 485.35,203.63 C 483.63,204.25 473.47,208.93 471.5,210.18 C 470.57,210.77 470.17,211.16 469.72,212.48 C 470.93,212.31 471.72,212.49 473.42,213.04 C 473.26,214.77 473.24,215.74 473.57,218.2 C 474.01,216.88 474.41,216.49 475.34,215.9 C 477.33,214.65 487.49,209.97 489.21,209.35 z "
+ id="XMLID_960_" />
+ </defs>
+ <clipPath
+ id="clipPath17448">
+ <use
+ id="use17450"
+ x="0"
+ y="0"
+ width="744.09448"
+ height="600"
+ xlink:href="#XMLID_960_" />
+ </clipPath>
+ <linearGradient
+ x1="473.7681"
+ y1="209.17529"
+ x2="486.98099"
+ y2="213.2001"
+ id="linearGradient17452"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#f3403f;stop-opacity:1"
+ offset="0"
+ id="stop17454" />
+ <stop
+ style="stop-color:#d02a28;stop-opacity:1"
+ offset="0.37889999"
+ id="stop17456" />
+ <stop
+ style="stop-color:#b21714;stop-opacity:1"
+ offset="0.77649999"
+ id="stop17458" />
+ <stop
+ style="stop-color:#a6100c;stop-opacity:1"
+ offset="1"
+ id="stop17460" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0.4213" />
+ <a:midPointStop
+ style="stop-color:#A6100C"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="481.23969"
+ y1="212.5742"
+ x2="472.92981"
+ y2="207.4967"
+ id="linearGradient17463"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#f3403f;stop-opacity:1"
+ offset="0"
+ id="stop17465" />
+ <stop
+ style="stop-color:#d02a28;stop-opacity:1"
+ offset="0.37889999"
+ id="stop17467" />
+ <stop
+ style="stop-color:#b21714;stop-opacity:1"
+ offset="0.77649999"
+ id="stop17469" />
+ <stop
+ style="stop-color:#a6100c;stop-opacity:1"
+ offset="1"
+ id="stop17471" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#F3403F"
+ offset="0.4213" />
+ <a:midPointStop
+ style="stop-color:#A6100C"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="481.23969"
+ y1="212.5742"
+ x2="472.92981"
+ y2="207.4967"
+ id="linearGradient17807"
+ xlink:href="#XMLID_2275_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-177.1654,35.43307)" />
+ <linearGradient
+ x1="473.7681"
+ y1="209.17529"
+ x2="486.98099"
+ y2="213.2001"
+ id="linearGradient17810"
+ xlink:href="#XMLID_2274_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-177.1654,35.43307)" />
+ <linearGradient
+ x1="502.70749"
+ y1="115.3013"
+ x2="516.39001"
+ y2="127.1953"
+ id="linearGradient17812"
+ xlink:href="#XMLID_1749_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)" />
+ <linearGradient
+ x1="506.09909"
+ y1="-11.5137"
+ x2="527.99609"
+ y2="2.7063999"
+ id="linearGradient17814"
+ xlink:href="#XMLID_1752_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="516.57672"
+ y1="-15.769"
+ x2="516.57672"
+ y2="0.84280002"
+ id="linearGradient17816"
+ xlink:href="#XMLID_1753_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="505.62939"
+ y1="-14.9526"
+ x2="527.49402"
+ y2="-0.7536"
+ id="linearGradient17818"
+ xlink:href="#XMLID_1756_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <linearGradient
+ x1="502.70749"
+ y1="115.3013"
+ x2="516.39001"
+ y2="127.1953"
+ id="linearGradient17347"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)">
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0"
+ id="stop17349" />
+ <stop
+ style="stop-color:#96bad6;stop-opacity:1"
+ offset="1"
+ id="stop17351" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#5387BA" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#5387BA" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#96BAD6" />
+ </linearGradient>
+ <linearGradient
+ x1="516.57672"
+ y1="-15.769"
+ x2="516.57672"
+ y2="0.84280002"
+ id="linearGradient17379"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b2b2b2;stop-opacity:1"
+ offset="0"
+ id="stop17381" />
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1"
+ offset="1"
+ id="stop17383" />
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#B2B2B2" />
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#F2F2F2" />
+ </linearGradient>
+ <linearGradient
+ x1="502.70749"
+ y1="115.3013"
+ x2="516.39001"
+ y2="127.1953"
+ id="linearGradient17862"
+ xlink:href="#XMLID_1749_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,-166.1427,-0.18283)" />
+ <linearGradient
+ x1="505.62939"
+ y1="-14.9526"
+ x2="527.49402"
+ y2="-0.7536"
+ id="linearGradient17864"
+ xlink:href="#XMLID_1756_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <defs
+ id="defs3859">
+ <polygon
+ points="465.54,213.52 481.94,217.46 482.74,216.71 487.46,198.05 471.08,194.07 470.26,194.83 465.54,213.52 "
+ id="XMLID_343_" />
+ </defs>
+ <linearGradient
+ x1="471.0806"
+ y1="201.07761"
+ x2="481.91711"
+ y2="210.4977"
+ id="linearGradient17389"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#6498c1;stop-opacity:1"
+ offset="0.005618"
+ id="stop17391" />
+ <stop
+ style="stop-color:#79a9cc;stop-opacity:1"
+ offset="0.2332"
+ id="stop17393" />
+ <stop
+ style="stop-color:#a4cde2;stop-opacity:1"
+ offset="0.74049997"
+ id="stop17395" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="1"
+ id="stop17397" />
+ <a:midPointStop
+ style="stop-color:#6498C1"
+ offset="5.618000e-003" />
+ <a:midPointStop
+ style="stop-color:#6498C1"
+ offset="0.4438" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="1" />
+ </linearGradient>
+ <clipPath
+ id="clipPath17400">
+ <use
+ id="use17402"
+ x="0"
+ y="0"
+ width="744.09448"
+ height="600"
+ xlink:href="#XMLID_343_" />
+ </clipPath>
+ <linearGradient
+ x1="505.62939"
+ y1="-14.9526"
+ x2="527.49402"
+ y2="-0.7536"
+ id="linearGradient17404"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0"
+ id="stop17406" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0.51120001"
+ id="stop17408" />
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0.64609998"
+ id="stop17410" />
+ <stop
+ style="stop-color:#16336e;stop-opacity:1"
+ offset="1"
+ id="stop17412" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5112" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.6461" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#16336E"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="506.09909"
+ y1="-11.5137"
+ x2="527.99609"
+ y2="2.7063999"
+ id="linearGradient17882"
+ xlink:href="#XMLID_1752_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
+ <defs
+ id="defs3826">
+ <polygon
+ points="463.52,216.14 480.56,220.24 481.36,219.5 483.03,202.04 469.05,196.69 468.24,197.45 463.52,216.14 "
+ id="XMLID_338_" />
+ </defs>
+ <linearGradient
+ x1="468.2915"
+ y1="204.7612"
+ x2="479.39871"
+ y2="214.4166"
+ id="linearGradient17357"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0"
+ id="stop17359" />
+ <stop
+ style="stop-color:#96bad6;stop-opacity:1"
+ offset="1"
+ id="stop17361" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#96BAD6"
+ offset="1" />
+ </linearGradient>
+ <clipPath
+ id="clipPath17364">
+ <use
+ id="use17366"
+ x="0"
+ y="0"
+ width="744.09448"
+ height="600"
+ xlink:href="#XMLID_338_" />
+ </clipPath>
+ <linearGradient
+ x1="506.09909"
+ y1="-11.5137"
+ x2="527.99609"
+ y2="2.7063999"
+ id="linearGradient17368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0"
+ id="stop17370" />
+ <stop
+ style="stop-color:#b4daea;stop-opacity:1"
+ offset="0.51120001"
+ id="stop17372" />
+ <stop
+ style="stop-color:#5387ba;stop-opacity:1"
+ offset="0.64609998"
+ id="stop17374" />
+ <stop
+ style="stop-color:#16336e;stop-opacity:1"
+ offset="1"
+ id="stop17376" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5112" />
+ <a:midPointStop
+ style="stop-color:#B4DAEA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.6461" />
+ <a:midPointStop
+ style="stop-color:#5387BA"
+ offset="0.5" />
+ <a:midPointStop
+ style="stop-color:#16336E"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="296.4996"
+ y1="188.81061"
+ x2="317.32471"
+ y2="209.69398"
+ id="linearGradient2387"
+ xlink:href="#linearGradient2381"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)" />
+ <linearGradient
+ x1="296.4996"
+ y1="188.81061"
+ x2="317.32471"
+ y2="209.69398"
+ id="linearGradient5105"
+ xlink:href="#linearGradient2381"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)" />
+ <linearGradient
+ x1="296.4996"
+ y1="188.81061"
+ x2="317.32471"
+ y2="209.69398"
+ id="linearGradient5145"
+ xlink:href="#linearGradient2381"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2381"
+ id="linearGradient2371"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)"
+ x1="296.4996"
+ y1="188.81061"
+ x2="317.32471"
+ y2="209.69398" />
+ </defs>
+ <g
+ transform="matrix(0.437808,-0.437808,0.437808,0.437808,-220.8237,43.55311)"
+ id="g5089">
+ <path
+ d="M 8.4382985,-6.28125 C 7.8309069,-6.28125 4.125,-0.33238729 4.125,1.96875 L 4.125,28.6875 C 4.125,29.533884 4.7068159,29.8125 5.28125,29.8125 L 30.84375,29.8125 C 31.476092,29.8125 31.968751,29.319842 31.96875,28.6875 L 31.96875,23.46875 L 32.25,23.46875 C 32.74684,23.46875 33.156249,23.059339 33.15625,22.5625 L 33.15625,-5.375 C 33.15625,-5.8718398 32.74684,-6.28125 32.25,-6.28125 L 8.4382985,-6.28125 z "
+ transform="translate(282.8327,227.1903)"
+ style="fill:#5c5c4f;stroke:black;stroke-width:3.23021388;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path5091" />
+ <rect
+ width="27.85074"
+ height="29.369793"
+ rx="1.1414107"
+ ry="1.1414107"
+ x="286.96509"
+ y="227.63805"
+ style="fill:#032c87"
+ id="rect5093" />
+ <path
+ d="M 288.43262,225.43675 L 313.67442,225.43675 L 313.67442,254.80655 L 287.29827,254.83069 L 288.43262,225.43675 z "
+ style="fill:white"
+ id="rect5095" />
+ <path
+ d="M 302.44536,251.73726 C 303.83227,259.59643 301.75225,263.02091 301.75225,263.02091 C 303.99609,261.41329 305.71651,259.54397 306.65747,257.28491 C 307.62455,259.47755 308.49041,261.71357 310.9319,263.27432 C 310.9319,263.27432 309.33686,256.07392 309.22047,251.73726 L 302.44536,251.73726 z "
+ style="fill:#a70000;fill-opacity:1;stroke-width:2"
+ id="path5097" />
+ <rect
+ width="25.241802"
+ height="29.736675"
+ rx="0.89682275"
+ ry="0.89682275"
+ x="290.73544"
+ y="220.92249"
+ style="fill:#809cc9"
+ id="rect5099" />
+ <path
+ d="M 576.47347,725.93939 L 582.84431,726.35441 L 583.25121,755.8725 C 581.35919,754.55465 576.39694,752.1117 574.98889,754.19149 L 574.98889,727.42397 C 574.98889,726.60151 575.65101,725.93939 576.47347,725.93939 z "
+ transform="matrix(0.499065,-0.866565,0,1,0,0)"
+ style="fill:#4573b3;fill-opacity:1"
+ id="rect5101" />
+ <path
+ d="M 293.2599,221.89363 L 313.99908,221.89363 C 314.45009,221.89363 314.81318,222.25673 314.81318,222.70774 C 315.02865,229.0361 295.44494,244.47124 292.44579,240.30491 L 292.44579,222.70774 C 292.44579,222.25673 292.80889,221.89363 293.2599,221.89363 z "
+ style="opacity:0.65536726;fill:url(#linearGradient2371);fill-opacity:1"
+ id="path5103" />
+ </g>
+</svg>
diff --git a/XFS_Filesystem_Structure/publican.cfg b/XFS_Filesystem_Structure/publican.cfg
new file mode 100644
index 0000000..4b1b102
--- /dev/null
+++ b/XFS_Filesystem_Structure/publican.cfg
@@ -0,0 +1,7 @@
+# Config::Simple 4.59
+# Wed Mar 10 15:40:11 2010
+
+xml_lang: en-US
+type: Book
+brand: common
+
diff --git a/XFS_Labs/en-US/Author_Group.xml b/XFS_Labs/en-US/Author_Group.xml
new file mode 100644
index 0000000..d2bd016
--- /dev/null
+++ b/XFS_Labs/en-US/Author_Group.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<authorgroup>
+ <author>
+ <firstname>Dude</firstname>
+ <surname>McPants</surname>
+ <affiliation>
+ <orgname>Somewhere</orgname>
+ <orgdiv>Someone</orgdiv>
+ </affiliation>
+ <email>Dude.McPants@example.com</email>
+ </author>
+</authorgroup>
+
diff --git a/XFS_Labs/en-US/Book_Info.xml b/XFS_Labs/en-US/Book_Info.xml
new file mode 100644
index 0000000..d4149a8
--- /dev/null
+++ b/XFS_Labs/en-US/Book_Info.xml
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<bookinfo id="book-XFS_Labs-XFS_Labs">
+ <title>XFS Labs</title>
+ <subtitle>short description</subtitle>
+ <productname>Documentation</productname>
+ <productnumber>0.1</productnumber>
+ <edition>0</edition>
+ <pubsnumber>0</pubsnumber>
+ <abstract>
+ <para>
+ A short overview and summary of the book's subject and purpose, traditionally no more than one paragraph long. Note: the abstract will appear in the front matter of your book and will also be placed in the description field of the book's RPM spec file.
+ </para>
+ </abstract>
+ <corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
+ </imageobject>
+ </inlinemediaobject>
+ </corpauthor>
+ <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+</bookinfo>
+
diff --git a/XFS_Labs/en-US/Chapter.xml b/XFS_Labs/en-US/Chapter.xml
new file mode 100644
index 0000000..ff8b123
--- /dev/null
+++ b/XFS_Labs/en-US/Chapter.xml
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<chapter id="chap-XFS_Labs-Test_Chapter">
+ <title>Test Chapter</title>
+ <para>
+ This is a test paragraph
+ </para>
+ <section id="sect-XFS_Labs-Test_Chapter-Test_Section_1">
+ <title>Test Section 1</title>
+ <para>
+ This is a test paragraph in a section
+ </para>
+ </section>
+
+ <section id="sect-XFS_Labs-Test_Chapter-Test_Section_2">
+ <title>Test Section 2</title>
+ <para>
+ This is a test paragraph in Section 2
+ <orderedlist>
+ <listitem>
+ <para>
+ listitem text
+ </para>
+ </listitem>
+ </orderedlist>
+ </para>
+ </section>
+
+</chapter>
+
diff --git a/XFS_Labs/en-US/Preface.xml b/XFS_Labs/en-US/Preface.xml
new file mode 100644
index 0000000..b29edf8
--- /dev/null
+++ b/XFS_Labs/en-US/Preface.xml
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<preface id="pref-XFS_Labs-Preface">
+ <title>Preface</title>
+ <xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"><xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ </xi:fallback>
+ </xi:include>
+</preface>
+
diff --git a/XFS_Labs/en-US/Revision_History.xml b/XFS_Labs/en-US/Revision_History.xml
new file mode 100644
index 0000000..ba84c81
--- /dev/null
+++ b/XFS_Labs/en-US/Revision_History.xml
@@ -0,0 +1,25 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<appendix id="appe-XFS_Labs-Revision_History">
+ <title>Revision History</title>
+ <simpara>
+ <revhistory>
+ <revision>
+ <revnumber>0</revnumber>
+ <date>Wed Mar 10 2010</date>
+ <author>
+ <firstname>Dude</firstname>
+ <surname>McPants</surname>
+ <email>Dude.McPants@example.com</email>
+ </author>
+ <revdescription>
+ <simplelist>
+ <member>Initial creation of book by publican</member>
+ </simplelist>
+ </revdescription>
+ </revision>
+ </revhistory>
+ </simpara>
+</appendix>
+
diff --git a/XFS_Labs/en-US/XFS-QA-lab.xml b/XFS_Labs/en-US/XFS-QA-lab.xml
new file mode 100644
index 0000000..e5f3522
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-QA-lab.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-QA-lab">
+ <title>XFS QA Lab</title>
+ <section>
+ <title>QA LAB</title>
+ <para>XXX Still to copy to docbook</para>
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS-allocators-lab.xml b/XFS_Labs/en-US/XFS-allocators-lab.xml
new file mode 100644
index 0000000..f774541
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-allocators-lab.xml
@@ -0,0 +1,230 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-allocator-lab">
+ <title>XFS Practical Exercises - 03 - Allocators</title>
+ <section>
+ <title>Overview</title>
+ <para></para>
+ <section>
+ <title>Goals</title>
+ <para>This lab demonstrates how inode numbers are sized, and how inodes and extents are
+ allocated based on different constraints and mount options.</para>
+ </section>
+ <section>
+ <title>Prerequisites</title>
+ <para></para>
+ </section>
+ <section>
+ <title>Setup</title>
+ <para>Define what software (and versions) are required and how it needs to be configured.</para>
+ </section>
+ </section>
+ <section>
+ <title>Exercises</title>
+ <para></para>
+ <section>
+ <title>Exercise 1</title>
+ <para>This exercise demonstrates how many bits an inode requires to be located anywhere
+ in a filesystem.</para>
+ <orderedlist>
+ <listitem>
+ <para>Use dd(1) to write a single (count=1) 4kB block of data (bs=4K) to an
+ offset that's 256 * 1024 blocks (seek=256K) from the start of the file
+ named loop. An offset of 256 * 1024 * 4kB = 1GB, so the resulting file
+ is 1GB plus 4kB in length.</para>
+ <para><programlisting>
+# dd if=/dev/zero of=loop bs=4K seek=256K count=1 &gt; /dev/null 2&gt;&amp;1
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>The ls command confirms this, rounded up to the nearest 0.1 of a GB.</para>
+ <para><programlisting>
+# ls -lh loop
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>mkfs.xfs is used to write a file system to the loop file and shows that the
+ geometry is using
+ <itemizedlist>
+ <listitem><para>inodes that are 256 bytes in size</para></listitem>
+ <listitem><para>there are 8 allocation groups</para></listitem>
+ <listitem><para>block size is 4kB</para></listitem>
+ </itemizedlist>
+ </para>
+ <para><programlisting>
+# mkfs.xfs -d file=loop loop
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Running xfs_db(8) to examine the superblock gives three relevant values
+ for the formatting of inode numbers on this file system.
+ <itemizedlist>
+ <listitem><para>agcount' value of 8 or 23 means that three bits will be needed
+ to specify the AG number.</para></listitem>
+ <listitem><para>inopblog' value of 4 means that there are 24 or 16 inodes
+ per filesystem block. This makes sense since 16 256 byte inodes can
+ fit in a 4kB filesystem block. </para></listitem>
+ <listitem><para>agblklog' value of 15 indicates that each AG has 215 filesystem
+ blocks in it. This is expected since the mkfs.xfs output reported
+ an agsize value of 32768 blocks.</para></listitem>
+ </itemizedlist>
+ </para>
+ <para><programlisting>
+# xfs_db -f -c "sb 0" -c "p" ./loop | egrep 'agcount|inopblog|agblklog'
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>1.3 + 4 + 15 = 22 bits of data are required to address an inode placed anywhere
+ in this filesystem
+ </para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 2</title>
+ <para>This exercise demonstrates the point at which 32 bits is no longer enough to locate
+ an inode anywhere in the filesystem.</para>
+ <orderedlist>
+ <listitem><para>Show that 32 bits are required for a 1kB inode located in a
+ 4TB filesystem.</para></listitem>
+ <listitem><para>Slightly increase the size of the file to increase the AG size by seeking
+ to 31 blocks beyond 4TB. The increased AG size has increased the inode size
+ to 33 bits, it is no longer possible to place a 32 bit inode anywhere in
+ the filesystem.</para></listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 3</title>
+ <para>This lab demonstrates the inode rotor in action.</para>
+ <orderedlist>
+ <listitem>
+ <para>Firstly, a filesystem large enough to trigger inode32 rotor behavior is needed.
+ This can be achieved on a small local disk by creating a large sparse file,
+ writing a new filesystem onto it and mounting it in loopback mode.</para>
+ <para><programlisting>
+> dd if=/dev/zero of=loop bs=4K seek=1G count=1 > /dev/null 2&gt;&amp;1
+> ls -sh loop
+4.1T loop
+> mkfs.xfs -d file=loop loop
+meta-data=loop isize=256 agcount=32, agsize=33554432 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=1073741824, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=32768, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=4096 blocks=0, rtextents=0
+> xfs_db -f -c "sb 0" -c "p" ./loop | egrep 'agcount|inopblog|agblklog'
+agcount = 32
+inopblog = 4
+agblklog = 25
+> sudo mkdir /mnt/loop
+> sudo mount -o loop loop /mnt/loop
+> df -h /mnt/loop
+Filesystem Size Used Avail Use% Mounted on
+/home/sjv/loop 4.0T 528K 4.0T 1% /mnt/loop
+> sudo chmod 777 /mnt/loop
+> cd /mnt/loop
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Next, ten files are created in a directory on the new filesystem and their
+ inode numbers and data extent allocations are examined:</para>
+ <para><programlisting>
+> dir=a
+> mkdir $dir
+> for file in `seq 0 9`; do xfs_mkfile 10m $dir/$file; done
+> ls -is $dir/*
+> for file in `seq 0 9`; do
+> ag=`xfs_bmap -v $dir/$file | tail -1 | awk '{print $4}'`
+> echo $dir/$file is in AG $ag
+> done
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Repeat step 2 with a different rotorstep value:</para>
+ <para><programlisting>
+> sudo sysctl -w fs.xfs.rotorstep=3
+> dir=b
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 4</title>
+ <para>This exercise demonstrates the need for the filestreams allocator for a particular workload.</para>
+ <orderedlist>
+ <listitem>
+ <para>Create a file system with a small AG size:</para>
+ <para><programlisting>
+# mkfs.xfs -d agsize=64m /dev/sdb7 > /dev/null
+# mount /dev/sdb7 /test
+# chmod 777 /test
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create ten 10MB files concurrently in two directories:</para>
+ <para><programlisting>
+# cd /test
+# mkdir a b
+# for dir in a b; do
+> for file in `seq 0 9`; do
+> xfs_mkfile 10m $dir/$file
+> done &amp;
+> done; wait 2>/dev/null
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Note that the all the inodes in the same directory are in the same AG:</para>
+ <para><programlisting>
+# ls -sid * */*
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>What about the file data? Use xfs_bmap -v to examine the extents of each of the files:</para>
+ <para><programlisting>
+# xfs_bmap –v a/*
+# xfs_bmap –v b/*
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Note that once the original AG was used, the files from both directories are
+ interleaved in the next allocation group. Any read-ahead for files in directory
+ a that assumes the files are contiguous on disk will start reading files
+ from directory b instead.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ </section>
+ <section>
+ <title>Questions</title>
+ <orderedlist>
+ <listitem><para>In exercise 3, why do the new files start in allocation group 8?</para></listitem>
+ <listitem><para>In exercise 3, what can be observed regarding the inode numbers of the files
+ in the two directories?</para></listitem>
+ <listitem><para>In exercise 4, the file inodes are created in the same allocation group as
+ the parent directory, but the file extents are not. Why is this?</para></listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Answers</title>
+ <orderedlist>
+ <listitem><para>The first 8 allocation groups make up the first TB and are reserved for
+ inodes.</para></listitem>
+ <listitem><para>The inodes for the second directory are put into a different allocation group than
+ the first directory, still within the first TB.</para></listitem>
+ <listitem><para>It's important to consider the order in which events are occurring. The two bash
+ processes writing files are calling xfs_mkfile, which starts by opening a file with the
+ O_CREAT flag. At this point, XFS has no idea how large the file's data is going to
+ be, so it dutifully creates a new inode for the file in the same AG as the parent
+ directory. The call returns successfully and the system continues with its tasks.
+ When XFS is asked write the file data a short time later, a new AG must be found for
+ it because the inode’s AG is full. The result is a violation of the original goal to
+ keep file data close to its inode on disk. In practice, because inodes are allocated
+ in clusters on disk, a process that's reading back a stream is likely to cache all
+ the inodes it needs with just one or two reads, so the disk seeking involved won't
+ be as bad as it first seems.</para></listitem>
+ </orderedlist>
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS-build-lab.xml b/XFS_Labs/en-US/XFS-build-lab.xml
new file mode 100644
index 0000000..921e6f0
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-build-lab.xml
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-build-lab">
+ <title>XFS Practical Exercises - 01 - Building XFS</title>
+ <section>
+ <title>Overview</title>
+ <para>TODO, do a kernel build and configuration, setup the tools for the other labs</para>
+ <section>
+ <title>Goals</title>
+ <para>Define the goals for this lab.</para>
+ </section>
+ <section>
+ <title>Prerequisites</title>
+ <para>Define what courses or knowledge is assumed.</para>
+ </section>
+ <section>
+ <title>Setup</title>
+ <para>Define what software (and versions) are required and how it needs to be configured.</para>
+ </section>
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS-mkfs-mount-lab.xml b/XFS_Labs/en-US/XFS-mkfs-mount-lab.xml
new file mode 100644
index 0000000..1b61875
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-mkfs-mount-lab.xml
@@ -0,0 +1,381 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-mkfs-mount-lab">
+ <title>XFS Practical Exercises - 02 - mkfs &amp; mount</title>
+ <section>
+ <title>Overview</title>
+ <para>In order to use XFS we must first create a filesystem. Filesystems can be used for various
+ different purposes and the tool used to create an XFS filesystem, mkfs.xfs, can be used
+ to customise the characteristics of the filesystem.</para>
+ <section>
+ <title>Goals</title>
+ <para>The goal of this lab is to understand the procedure for creating an XFS filesystem
+ including the options available for customising it for a particular purpose.</para>
+ <para>In this lab exercise we will explore the options to:</para>
+ <itemizedlist>
+ <listitem><para>adjust the filesystem block size</para></listitem>
+ <listitem><para>filesystem directory block size</para></listitem>
+ <listitem><para>set the stripe unit and width sizes</para></listitem>
+ <listitem><para>configure an external log</para></listitem>
+ <listitem><para>set the allocation group count and/or size</para></listitem>
+ <listitem><para>grow a filesystem</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Prerequisites</title>
+ <para>It is assumed that the reader is familiar with basic UNIX commands, in particular
+ mkfs and mount.</para>
+ </section>
+ <section>
+ <title>Setup</title>
+ <itemizedlist>
+ <listitem><para>Recent Linux kernel with XFS enabled (and loaded if installed as a module)</para></listitem>
+ <listitem><para>XFS user-space commands package, xfsprogs, installed.</para></listitem>
+ <listitem><para>One or more spare block device(s).</para></listitem>
+ </itemizedlist>
+
+ </section>
+ <section>
+ <title></title>
+ <para></para>
+ </section>
+ </section>
+ <section>
+ <title>Exercises</title>
+ <para></para>
+ <section>
+ <title>Exercise 1</title>
+ <orderedlist>
+ <listitem>
+ <para>Make an XFS filesystem using default options. Note: the -f option is
+ required to force mkfs to overwrite an existing filesystem.</para>
+ <para><programlisting>
+# mkfs -t xfs -f /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=461617 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385872, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=3606, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Mount the filesystem:</para>
+ <para><programlisting>
+# mkdir mnt
+# mount /dev/sda4 /mnt
+# mount
+/dev/sda2 on / type xfs (rw)
+proc on /proc type proc (rw)
+sysfs on /sys type sysfs (rw)
+tmpfs on /dev/shm type tmpfs (rw)
+devpts on /dev/pts type devpts (rw,mode=0620,gid=5)
+usbfs on /proc/bus/usb type usbfs (rw)
+/dev/sda4 on /mnt type xfs (rw)
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Query the filesystem's parameters:</para>
+ <para><programlisting>
+# xfs_info /mnt
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=461617 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385872, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal bsize=4096 blocks=3606, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Unmount the filesystem:</para>
+ <para><programlisting>
+# umount /mnt
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 2</title>
+ <para>Make an XFS filesystem to contain many small files per directory</para>
+ <itemizedlist>
+ <listitem><para>reduce filesystem block size to 512 bytes to save wasted space</para></listitem>
+ <listitem><para>use the maximum directory block size of 4KB (this is actually the default),
+ this allows for more entries per level in the directory b-trees resultling
+ in faster lookups.</para></listitem>
+ </itemizedlist>
+ <orderedlist>
+ <listitem>
+ <para>Create the filesystem.</para>
+ <para><programlisting>
+# mkfs -t xfs -f -b size=512 -n size=4096 /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=3692941 blks
+ = sectsz=512 attr=0
+data = bsize=512 blocks=59087056, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=512 blocks=28851, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+# mount /dev/sda4 /mnt
+# cd /mnt
+# for file in `seq 0 1000`; do echo $file > $file; done
+# du -k
+537 .
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Try the same test with a default block size of 4KB and verify the savings for yourself.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 3</title>
+ <para>Make an XFS filesystem that is aligned on stripe width/unit boundaries:</para>
+ <itemizedlist>
+ <listitem><para>use a stripe unit size of 128KB
+ (Note: when using the sunit option the value is in 512 byte blocks)</para></listitem>
+ <listitem><para>use a stripe width size of 2MB (Note: when using the swidth option
+ the value is in 512 byte blocks and is a multiple of the sunit value)</para></listitem>
+ </itemizedlist>
+ <orderedlist>
+ <listitem>
+ <para>Create the stripe aligned filesystem.</para>
+ <para><programlisting>
+# mkfs -t xfs -f -d sunit=256,swidth=2048 /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=461632 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385872, imaxpct=25
+ = sunit=32 swidth=256 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=3616, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ <para>The sunit and swidth values displayed by mkfs are in filesystem blocks
+ (ie 32 * 4KB = 128KB)</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 4</title>
+ <para>Make an XFS filesystem that uses an external log on a second device. Note: the
+ maximum size for a log is 128MB, if the log device is larger than this the size
+ option must be specified.</para>
+ <orderedlist>
+ <listitem>
+ <para>Create the filesystem with an external log.</para>
+ <para><programlisting>
+# mkfs -t xfs -f -l logdev=/dev/sda3,size=128m /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=461617 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385872, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =/dev/sda3 bsize=4096 blocks=32768, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>In order to mount a filesystem with an external log, the log device
+ must be specified on the mount command line.</para>
+ <para><programlisting>
+# mount -o logdev=/dev/sda3 /dev/sda4 /mnt
+# mount
+/dev/sda2 on / type xfs (rw)
+proc on /proc type proc (rw)
+sysfs on /sys type sysfs (rw)
+tmpfs on /dev/shm type tmpfs (rw)
+devpts on /dev/pts type devpts (rw,mode=0620,gid=5)
+usbfs on /proc/bus/usb type usbfs (rw)
+/dev/sda4 on /mnt type xfs (rw,logdev=/dev/sda3)
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>If the log device is not specified the filesystem will fail to mount:</para>
+ <para><programlisting>
+# mount /dev/sda4 /mnt
+mount: wrong fs type, bad option, bad superblock on /dev/sda4,
+ missing codepage or other error
+ In some cases useful info is found in syslog - try
+ dmesg | tail
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 5</title>
+ <para>Make an XFS filesystem with more allocation groups to allow more parallelism
+ when allocating blocks and inodes. Increasing the number of allocation groups
+ will decrease the space available in each group. For most workloads, filesystem
+ configurations with a very small or very large number of allocation groups should
+ be avoided. The capacity of your block device may cause mkfs.xfs to report
+ different values for agcount and agsize. For this exercise take the default
+ agcount value and double it.</para>
+ <orderedlist>
+ <listitem>
+ <para>Create a simple filesystem first.</para>
+ <para><programlisting>
+# mkfs -t xfs -f /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=461617 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385872, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=3606, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>In this example. the default agcount is 16 so let's try 32.</para>
+ <para><programlisting>
+# mkfs -t xfs -f -d agcount=32 /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=32, agsize=230809 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385883, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=3606, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Or alternatively, set the allocation group size. In this example set
+ each allocation group to 4GB. If the capacity of your block device is
+ less than 4GB mkfs will fail, in this case pick a value for agsize that
+ is one quarter of the device's capacity.</para>
+ <para><programlisting>
+# mkfs -t xfs -f -d agsize=4g /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=8, agsize=1048576 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=7385883, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=3606, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 6</title>
+ <para>Grow an XFS filesystem.</para>
+ <orderedlist>
+ <listitem>
+ <para>Start off by creating an XFS filesystem that uses only a portion of the
+ available space on the device. We can do this by specifying the size option.</para>
+ <para><programlisting>
+# mkfs -t xfs -f -d size=1g /dev/sda4
+meta-data=/dev/sda4 isize=256 agcount=8, agsize=32768 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=262144, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=4096 blocks=2560, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Mount the filesystem:</para>
+ <para><programlisting>
+# mount /dev/sda4 /mnt
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>The current capacity of the filesystem is 262144 blocks. To double the
+ capacity, grow the filesystem to a capacity of 524288 blocks with:</para>
+ <para><programlisting>
+ # xfs_growfs -D 524288 /mnt
+meta-data=/dev/sda4 isize=256 agcount=8, agsize=32768 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=262144, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal bsize=4096 blocks=2560, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+data blocks changed from 262144 to 524288
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Verify the new filesystem capacity:</para>
+ <para><programlisting>
+# xfs_info /mnt
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=32768 blks
+ = sectsz=512 attr=0
+data = bsize=4096 blocks=524288, imaxpct=25
+ = sunit=0 swidth=0 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal bsize=4096 blocks=2560, version=1
+ = sectsz=512 sunit=0 blks
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>The default behaviour of xfs_growfs is to grow the filesystem to the
+ maximum available capacity:</para>
+ <para><programlisting>
+# xfs_growfs /mnt
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Continually growing a filesystem can have it's drawbacks – a grown filesystem
+ keeps its allocation size fixed and increases the allocation group count in
+ order to accommodate the new capacity. As we can see from the following
+ filesystem geometry the allocation group count is very high.</para>
+ <para><programlisting>
+# xfs_info /mnt
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ </section>
+ <section>
+ <title>Questions</title>
+ <orderedlist>
+ <listitem>
+ <para>From the following information calculate the stripe unit and width:</para>
+ <para><programlisting>
+meta-data=/dev/sda4 isize=256 agcount=16, agsize=923264 blks
+ = sectsz=512 attr=0
+data = bsize=2048 blocks=14771760, imaxpct=25
+ = sunit=128 swidth=256 blks, unwritten=1
+naming =version 2 bsize=4096
+log =internal log bsize=2048 blocks=7296, version=1
+ = sectsz=512 sunit=0 blks
+realtime =none extsz=65536 blocks=0, rtextents=0
+ </programlisting></para>
+ </listitem>
+ <listitem><para>What would be the conseqence of not aligning a filesystem on a stripe unit correctly?</para></listitem>
+ <listitem><para>What are the advantages of an external log?</para></listitem>
+ <listitem><para>Why would having very few or very many allocation groups be a bad idea?</para></listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Answers</title>
+ <orderedlist>
+ <listitem><para>Stripe unit = 128 * 2048 = 256KB, stripe width = 256 * 2048 = 512KB</para></listitem>
+ <listitem><para>If a block write is not aligned on a RAID stripe unit boundary and is not a full stripe
+ unit, the RAID will be forced to do a read/modify/write cycle to write the data. This can
+ have a significant performance impact. By setting the stripe unit size properly, XFS will
+ avoid unaligned accesses.</para></listitem>
+ <listitem><para>With an internal log, excessive amounts of log activity can adversely affect
+ the performance of the rest of the filesystem. The external log could also be placed on
+ higher speed storage.</para></listitem>
+ <listitem><para>Too few allocation groups limits the ability to parallelise concurrent disk block
+ and/or inode allocations. Too many allocation groups (with little space in each one) will
+ increase the probability of exhausting an allocation group and having to search for another
+ group that has free space. This can cause an unreasonable amount of CPU time to be used
+ when the filesystem is close to full.</para></listitem>
+ </orderedlist>
+ <para></para>
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS-quotas-lab.xml b/XFS_Labs/en-US/XFS-quotas-lab.xml
new file mode 100644
index 0000000..85117f0
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-quotas-lab.xml
@@ -0,0 +1,279 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-quotas-lab">
+ <title>XFS Practical Exercises - 05- Quotas</title>
+ <section id="Overview">
+ <title>Overview</title>
+ <para></para>
+ <section id="Goals">
+ <title>Goals</title>
+ <para>The goal of this lab to learn how to use and interpret the XFS quota commands.</para>
+ </section>
+ <section id="Prerequisites">
+ <title>Prerequisites</title>
+ <para>The user needs to understand filesystems administration including mkfs and mount.</para>
+ </section>
+ <section id="Setup">
+ <title>Setup</title>
+ <para>An empty filesystem is needed for the lab.</para>
+ </section>
+ </section>
+ <section id="Exercises">
+ <title>Exercises</title>
+ <para></para>
+ <section id="Exercise1">
+ <title>Exercise 1 - Configuring Quotas and Quota Reporting</title>
+ <orderedlist>
+ <listitem>
+ <para>Create an entry for this filesystem in fstab, enable user quotas by adding quota
+ to the list of mount options and mount the filesystem.</para>
+ <para><programlisting>
+# sudo mkdir /mnt/xfstest
+# sudo vi /etc/fstab
+/dev/hdb1 /mnt/xfstest xfs defaults,quota 0 0
+# sudo mount /mnt/xfstest
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Investigate the following xfs_quota administrative commands</para>
+ <para><programlisting>
+# sudo /usr/sbin/xfs_quota -x
+xfs_quota> help
+xfs_quota> report
+xfs_quota> state
+xfs_quota> path
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create some files on the filesystem and rerun the report command.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section id="Exercise2">
+ <title>Exercise 2 - Quota Controls (user/group)</title>
+ <orderedlist>
+ <listitem>
+ <para>un “xfs_quota -x” as root and set quota controls on an ordinary user. </para>
+ <para><programlisting>
+# sudo /usr/sbin/xfs_quota -x /mnt/xfstest
+xfs_quota> limit bsoft=10m bhard=20m youruser
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Investigate how the limit command has affected your user.</para>
+ <para><programlisting>
+# /usr/sbin/xfs_quota -c 'quota -v'
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Exceed the soft quota. Note that while your (soft) quota has been exceeded you
+ can still write files.</para>
+ <para><programlisting>
+# cd /mnt/xfstest
+# dd if=/dev/urandom of=./testfile1 bs=1k count=15000
+# /usr/sbin/xfs_quota -c 'quota' /mnt/xfstest
+# ls > testfile2
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Exceeding hard Quota</para>
+ <para><programlisting>
+# rm testfile1 testfile2
+# dd if=/dev/urandom of=./testfile1 bs=1k count=30000
+dd: writing `./testfile': Disk quota exceeded
+20417+0 records in
+20416+0 records out
+20905984 bytes (21 MB) copied, 4.20713 seconds, 5.0 MB/s
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Run the quota command and examine the output.</para>
+ <para><programlisting>
+# /usr/sbin/xfs_quota -c quota
+Disk quotas for User youruser (500)
+Filesystem Blocks Quota Limit Warn/Time Mounted on
+/dev/hdb1 20416 10240 20480 00 [6 days] /mnt/xfstest
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Run the generic repquota command to compare the behavior.</para>
+ <para><programlisting>
+# /usr/sbin/repquota /mnt/xfstest
+*** Report for user quotas on device /dev/hdb1
+Block grace time: 7days; Inode grace time: 7days
+ Block limits File limits
+User used soft hard grace used soft hard grace
+----------------------------------------------------------------------
+youruser +- 20416 10240 20480 6days 1 0 0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Remove the test files created above and investigate the affects of quotas on
+ holey files. Holey files can be created with dd </para>
+ <para><programlisting>
+# dd if=/dev/urandom of=./testfile bs=1k count=1 seek=2000000
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Compare the outputs of</para>
+ <para><programlisting>
+# ls -hl
+# du -h *
+# /usr/sbin/xfs_quota -c quota
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Experiment with inode quotas.</para>
+ <para><programlisting>
+xfs_quota> limit isoft=5 ihard=10 youruser
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create files to exceed your soft and hard limits. Note that the xfs_quota quota
+ command takes a -i option to report on inodes.</para>
+ </listitem>
+ <listitem>
+ <para>Experiment with group quotas. You will need to remount the filesystem after
+ adding the gquota option to the fstab. xfs_quota commands use -g to
+ indicate they are working with groups.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section id="Exercise3">
+ <title>Exercise 3 - Quota Controls (project)</title>
+ <para></para>
+ <orderedlist>
+ <listitem>
+ <para>Add pquota to the mount options for your test file system. You will have to
+ remove group quotas if set as they are not compatible with group project quotas.</para>
+ </listitem>
+ <listitem>
+ <para>Create target directories</para>
+ <para><programlisting>
+# mkdir /mnt/xfstest/a /mnt/xfstest/b
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create /etc/projects</para>
+ <para><programlisting>
+33:/mnt/xfstest/a
+33:/mnt/xfstest/b
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create etc/projid</para>
+ <para><programlisting>
+testproject:33
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Update the projects state and set project limits.</para>
+ <para><programlisting>
+# sudo /usr/sbin/xfs_quota -x /mnt/xfstest
+xfs_quota> project -s testproject
+xfs_quota> print
+Filesystem Pathname
+/mnt/xfstest /dev/hdb1 (pquota)
+/mnt/xfstest/a /dev/hdb1 (project 33, testproject)
+/mnt/xfstest/b /dev/hdb1 (project 33, testproject)
+xfs_quota> limit -p bsoft=10m bhard=20m testproject
+xfs_quota> quota -vp testproject
+Disk quotas for Project #33 (testproject)
+Filesystem Blocks Quota Limit Warn/Time Mounted on
+/dev/hdb1 0 10240 20480 00 [--------] /mnt/xfstest
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section id="Exercise4">
+ <title>Exercise 4 - Examining Quota Internals</title>
+ <para>Examine quota inodes and quota entries.</para>
+ <orderedlist>
+ <listitem>
+ <para>Examine the quota inodes.</para>
+ <para><programlisting>
+# xfs_db -xr /dev/hdb1
+xfs_db: sb 0
+xfs_db: p
+...
+uquotino = null
+pquotino = 132
+
+xfs_db: inode 132
+xfs_db: p
+...
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Examine the quota entries.</para>
+ <para><programlisting>
+xfs_db: dquot -p testproject
+xfs_db: p
+diskdq.magic = 0x4451
+diskdq.version = 0x1
+diskdq.flags = 0x2
+diskdq.id = 33
+diskdq.blk_hardlimit = 2560
+diskdq.blk_softlimit = 1280
+diskdq.ino_hardlimit = 0
+diskdq.ino_softlimit = 0
+diskdq.bcount = 1
+diskdq.icount = 2
+diskdq.itimer = 0
+diskdq.btimer = 0
+diskdq.iwarns = 0
+diskdq.bwarns = 0
+diskdq.rtb_hardlimit = 0
+diskdq.rtb_softlimit = 0
+diskdq.rtbcount = 0
+diskdq.rtbtimer = 0
+diskdq.rtbwarns = 0
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Examine inodes of quota controlled files/directories</para>
+ <para><programlisting>
+# cd /mnt/xfstest/a
+# ls > testfile
+# ls -ia
+ 133 . 128 .. 135 testfile
+
+# sudo xfs_db -xr /dev/hdb1
+xfs_db: inode 133
+xfs_db: p
+...
+core.projid = 33
+core.uid = 0
+core.gid = 0
+...
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ </section>
+ <section id="Questions">
+ <title>Questions</title>
+ <orderedlist>
+ <listitem>
+ <para>How would you inform users of their quota violations?</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section id="Answers">
+ <title>Answers</title>
+ <orderedlist>
+ <listitem>
+ <para>How would you inform users of their quota violations?
+ <itemizedlist>
+ <listitem><para>Email users who are over quota. The generic quota package provides warnquota which is
+ usually executed daily using cron.</para></listitem>
+ <listitem><para>For interactive users quota commands may be added to shell startup scripts
+ (ie /etc/bash.bashrc.local).</para></listitem>
+ <listitem><para>Generate a quota report on the user or departments homepage.</para></listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ </orderedlist>
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS-repair-lab.xml b/XFS_Labs/en-US/XFS-repair-lab.xml
new file mode 100644
index 0000000..18c808d
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-repair-lab.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-repair-lab">
+ <title>XFS repair lab</title>
+ <section>
+ <title>xfs_repair lab</title>
+ <para>XXX Still to copy to docbook</para>
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS-xattr-lab.xml b/XFS_Labs/en-US/XFS-xattr-lab.xml
new file mode 100644
index 0000000..c3c4d8a
--- /dev/null
+++ b/XFS_Labs/en-US/XFS-xattr-lab.xml
@@ -0,0 +1,494 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-xattr-lab">
+ <title>XFS Practical Exercises - 04 - Extended Attributes</title>
+ <section>
+ <title>Overview</title>
+ <para>Extended Attributes (EA's) are used for attaching structured meta information to a file or inode and below we will give an example using an ACL. In the lab we will look at how we store an ACL in an EA and how this EA can be stored in various forms on the disk in XFS. Finally, we will look at how the EA's compete for inode space with the data extents and how variable this can be when attr2 is turned on for an XFS filesystem.</para>
+ <section>
+ <title>Goals</title>
+ <itemizedlist>
+ <listitem><para>To understand what EA's are in XFS</para></listitem>
+ <listitem><para>The interfaces to manipulate EA's</para></listitem>
+ <listitem><para>Summary of the ondisk formats</para></listitem>
+ <listitem><para>The competition for inode space between data extents and EA extents</para></listitem>
+ <listitem><para>Becoming more familiar with xfs_db(8) for looking at inodes</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Prerequisites</title>
+ <para>Some knowledge of what Extended Attributes (EA's) and Access Control Lists (ACL's) are would be beneficial.</para>
+ </section>
+ <section>
+ <title>Setup</title>
+ <itemizedlist>
+ <listitem><para>Need a scratch filesystem to play with as root</para></listitem>
+ <listitem>
+ <para>In the examples we will refer to this device and mount point through these
+ environment variables, for example:</para>
+ <para><programlisting>
+export SCRATCH_MNT=/mnt/scratch
+export SCRATCH_DEV=/dev/sda8
+ </programlisting></para>
+ </listitem>
+ <listitem><para>acl and attr packages installed</para></listitem>
+ <listitem><para>xfsprogs package installed</para></listitem>
+ <listitem>
+ <para>xfstests/src/makeextents binary; the directory path for this is called $BINDIR</para>
+ <para><programlisting>
+export BINDIR=/home/fred/src/xfs-cmds/xfstests/src
+ </programlisting></para>
+ </listitem>
+ <listitem><para>For the attr2 exercises:
+ <itemizedlist>
+ <listitem><para>a kernel which supports XFS attr2 format</para></listitem>
+ <listitem><para>a mkfs.xfs which supports XFS attr2 format</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+ </section>
+ <section>
+ <title>Exercises</title>
+ <section>
+ <title>Exercise 1 – ACLs and EA Interface</title>
+ <para>We create an access ACL on a file, and look at how its value is stored in an EA and
+ what the EA for it looks like on the disk. A posix access ACL on a file is a set
+ of access permissions on a file, like the standard unix permissions, but gives a
+ finer grain of control on who gets these permissions. As the point of this lab is
+ about XFS EAs and not about ACLs, we will just create a simple ACL with user, group,
+ other permissions and the mask entry.</para>
+ <para>The setfacl(1) and getfacl(1) commands are standard commands which were implemented by
+ Andreas Gruenbacher and the chacl(1) command came originally from IRIX.</para>
+ <orderedlist>
+ <listitem>
+ <para>create filesystem and ACL's</para>
+ <para><programlisting>
+# cd /
+# mkdir $SCRATCH_MNT
+# mkfs.xfs -f $SCRATCH_DEV
+# mount $SCRATCH_DEV $SCRATCH_MNT
+
+# cd $SCRATCH_MNT
+# echo data1 > file1
+# echo data2 > file2
+# setfacl -m u::rw,g::rw-,o::r--,m::rwx file1
+# chacl u::r--,g::---,o::---,m::rwx file2
+
+# getfacl file2
+# chacl -l file1
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>List the extended attributes on the file:</para>
+ <para><programlisting>
+# getfattr -d file1
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>This won't show much as we didn't specify the “user” namespace. This will show two extended attributes:</para>
+ <para><programlisting>
+# getfattr -e hex -dm '.*' file1
+ </programlisting></para>
+ <para>One for the "system" namespace and one for the "trusted" namespace.</para>
+ </listitem>
+ <listitem>
+ <para>However, when we run the "attr" command, it only shows 1 EA which is what we'd
+ expect since we only created one ACL on the file. </para>
+ <para><programlisting>
+# attr -Rl file1
+# attr -Rqg SGI_ACL_FILE file1 >ea_value
+# od -x ea_value
+ </programlisting></para>
+ <para>The reason why getfattr shows 2 EAs is because the system.posix_acl_access is an
+ EA XFS provides as an interface into the system and ACL routines, however, the
+ trusted.SGI_ACL_FILE EA is the only one actually stored on the disk and is the
+ same as would be stored on an IRIX XFS filesystem. The internal namespace for
+ this XFS EA is actually "root" which is stored as a bit in the flags field (it
+ doesn't actually store the namespace as a string in XFS).</para>
+ <para>In our case, we have 4 entries: <command>u::rwx g::rw- o::r-- m::rwx</command></para>
+ </listitem>
+ <listitem>
+ <para>An XFS ACL is of the form:</para>
+ <para><programlisting>
+&lt;acl_count: int32&gt; &lt;entry&gt; &lt;entry&gt; &lt;entry&gt; ...
+ </programlisting></para>
+ <para>where:</para>
+ <para><programlisting>
+&lt;entry&gt; = &lt;tag: int32&gt; &lt;id: int32&gt; &lt;perm: uint16&gt;
+ </programlisting></para>
+ <para>and</para>
+ <para><programlisting>
+&lt;tag&gt; = USER_OBJ, GROUP_OBJ, OTHER
+&lt;id&gt; = user id or group id if given one
+&lt;perm&gt; = normal unix permissions like rwx
+ </programlisting></para>
+ <para>You can now try to match up a few of the fields of the SGI_ACL_FILE EA contents
+ with the format of an ACL given above; you can see, for example, that there are
+ 4 entries for the acl_count which are at the start of the EA value.</para>
+ </listitem>
+ <listitem>
+ <para>Identify the permissions from the od (octal) dump</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 2 - ondisk form of the EA (ACL)</title>
+ <para>We will now see how this ACL and other EAs look in terms of the on disk structure using xfs_db.</para>
+ <orderedlist>
+ <listitem>
+ <para>Obtain the inode number for the file</para>
+ <para><programlisting>
+# ls -i file1
+# umount $SCRATCH_MNT
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Use xfs_db to look at what is on the disk to see:
+ <itemizedlist>
+ <listitem><para>Data format is extents (core.format = 2)</para></listitem>
+ <listitem><para>Offset between data and EA fork = 15 * 8 = 120 bytes</para></listitem>
+ <listitem><para>EA format is extents (core.aformat = 2)</para></listitem>
+ </itemizedlist>
+ </para>
+ <para><programlisting>
+# xfs_db -r $SCRATCH_DEV
+xfs_db> inode inode_number
+xfs_db> print
+...
+core.format = 2 (extents)
+core.forkoff = 15
+core.aformat = 2 (extents)
+u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,13,1,0]
+a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,12,1,0]
+xfs_db> ablock 0
+xfs_db> p
+....stuff omitted...
+nvlist[0].valuelen = 52
+nvlist[0].namelen = 12
+nvlist[0].name = "SGI_ACL_FILE"
+nvlist[0].value = "\000\000\000\004\000\000\000\001\377\377\377\377\000\006\000\000\000\000\000\004\377\377\377\377\000\006\000\000\000\000\000\020\377\377\377\377\000\a\000\000\000\000\000 \377\377\377\377\000\004\000\000"
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Alternatively specifying the filesystem block directly using the FSB listed in the a.bmx list::</para>
+ <para><programlisting>
+xfs_db> fsb 12
+xfs_db> type attr
+xfs_db> p
+ </programlisting></para>
+ <para>Look at the file data while we are here:</para>
+ <para><programlisting>
+xfs_db> dblock 0
+xfs_db> p
+000: 64617461 310a0000 00000000 00000000 00000000 00000000 00000000 00000000
+...etc...
+xfs_db> type text
+xfs_db> p
+000: 64 61 74 61 31 0a 00 00 00 00 00 00 00 00 00 00 data1...........
+010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ </programlisting></para>
+ <para>i.e. the file1 data is "data1" just like we echo'ed in at the beginning.</para>
+ <para>So in this example with 1 data extent for its contents, the ACL EA was also in
+ extent format. However, EAs can often fit inside the inode in what is called
+ "shortform" format. However, in this case, the EA space starts from the fork
+ offset in the inode:</para>
+ <para><programlisting>
+core.forkoff = 15
+ </programlisting></para>
+ <para>which is 15 * 8 = 120 bytes into the llteral space of the inode (which is the area
+ after the core part of the inode). With the 51 bytes value and 12 byte name and
+ the rest of the EA header, there was not enough room for the EA to be inside
+ the inode.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 3 – attr2 filesystem</title>
+ <para>With the attr2 format used in the mkfs.xfs parameters, the forkoff is not set at a fixed
+ place anymore, as was in traditional XFS. Instead, the fork offset is moved according to
+ the requirements of the EAs and until it bumps into the data extents, always leaving
+ enough room for a btree root data extent block.</para>
+ <para>Another alternative to increasing the chance of fitting the EA within the inode, is to
+ increase the size of the inode at mkfs time (using "-i size=xxx").</para>
+ <para>Please refer to the attr2 diagram in the XFS Filesystem Structure document on
+ Extended Attributes.</para>
+ <orderedlist>
+ <listitem>
+ <para>Recreate the filesystem with attr2 enabled</para>
+ <para><programlisting>
+# cd /
+# unmount $SCRATCH_MNT
+# mkfs.xfs -fi attr=2 $SCRATCH_DEV
+# mount $SCRATCH_DEV $SCRATCH_MNT
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create a file and give it an ACL</para>
+ <para><programlisting>
+# cd $SCRATCH_MNT
+# echo data1 > file1
+# setfacl -m u::rw,g::rw-,o::r--,m::rwx file1
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Re-examine the inode and observe how the fork offset and aformat have changed
+ compared to the earlier exercises.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 4 – ondisk EA’s in different formats</title>
+ <para></para>
+ <orderedlist>
+ <listitem>
+ <para>Recreate the filesystem</para>
+ <para><programlisting>
+# cd /
+# umount $SCRATCH_MNT
+# mkfs.xfs -f $SCRATCH_DEV
+# mount $SCRATCH_DEV $SCRATCH_MNT
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Add an attribute to a file</para>
+ <para><programlisting>
+# cd $SCRATCH_MNT
+# echo data1>file1
+# setfattr -n user.name1 -v value1 file1
+# getfattr -d file1
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Examine the inode’s format to see it is in short-form with a fork offset of
+ 120 bytes:</para>
+ <para><programlisting>
+# ls –i file1
+# cd /
+# umount $SCRATCH_MNT
+# xfs_db -r -c "inode inode_number" -c "p a" -c "p core.forkoff" -c "p core.aformat" $SCRATCH_DEV
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>A another EA, name2, but this time with a big value of 60K.</para>
+ <para><programlisting>
+# cd $SCRATCH_MNT
+# man bash | strings | dd bs=1024 count=60 of=file2
+# ls -s file2
+61440 file2
+# attr -s name2 file1 &lt; file2 >/ dev/null
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Dump the inode and explore its structure</para>
+ <para><programlisting>
+# ls –i file1
+# cd /
+# umount $SCRATCH_MNT
+# xfs_ncheck $SCRATCH_DEV
+# xfs_db -r $SCRATCH_DEV
+xfs_db> inode inode_number
+xfs_db> p
+ </programlisting></para>
+ <para>The EA is quite large and will not fit within the inode, instead it is in its
+ own set of blocks</para>
+ <para><programlisting>
+a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,28,16,0]
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>The first block at 28 contains the main EA information and the remaining 15 blocks
+ (15 * 4K = 60K) starting from block 29 contain the value for name2, in this
+ case the bash(1) man page.</para>
+ <para><programlisting>
+ xfs_db> fsb 28
+xfs_db> type attr
+xfs_db> p
+xfs_db> fsb 29
+xfs_db> type text
+xfs_db> p
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Now add 1000 attributes to the file:</para>
+ <para><programlisting>
+# for i in {1..1000}
+> do
+> attr -s name.$i -V value.$i file1
+> done
+# cd /
+# umount /mnt/scratch
+# xfs_db -r $SCRATCH_DEV
+ </programlisting></para>
+ <para>This time we now have the EA in btree form with the root within the inode and the
+ actual EA data in the leaf blocks of the btree, similar to:</para>
+ <para><programlisting>
+btree[0-11] = [hashval,before] 0:[0x55101e5a,16] 1:[0x55105dd8,24] 2:[0x55109c5b,25] 3:[0x55109fde,23] 4:[0x5510dfde,21] 5:[0x55111ed7,22] 6:[0x55115ed7,19] 7:[0x5511dd5a,20] 8:[0x55139d5a,18] 9:[0x5513dd5a,26] 10:[0xdcaa20bd,27] 11:[0xec3b72b4,17]
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Examine one of the leafblocks (in this example block16):</para>
+ <para><programlisting>
+xfs_db> ablock 16
+xfs_db> p
+ </programlisting></para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Exercise 5 - attr2 and inode literal space competition</title>
+ <para>With attr2, there is more competition allowed for the literal space of the inode. To show
+ this we will create a file with 1 EA and see how many data extents we can fit within an inode.
+ Then we will try this all again with 24 Eas and now see how many data extents we can
+ fit inline. At each stage, you can look at what the new forkoffset is set to.</para>
+ <orderedlist>
+ <listitem>
+ <para>Create a filesystem with 512 byte inodes and attr2</para>
+ <para><programlisting>
+# mkfs.xfs -f -i “attr=2,size=512” $SCRATCH_DEV
+# mount $SCRATCH_DEV $SCRATCH_MNT
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Create and examine a file with a single attribute</para>
+ <para><programlisting>
+# cd $SCRATCH_MNT
+# touch file
+# setfattr -n user.name.1 -v value file
+# xfs_bmap file
+# ls –i file
+# cd /
+# umount $SCRATCH_MNT
+# xfs_ncheck $SCRATCH_DEV
+# xfs_db -r $SCRATCH_DEV -c 'inode inode_number' -c 'p'
+ </programlisting></para>
+ <para>We can see from this output that we have 1 EA and a fork offset of 47 which is
+ equivalent to 376 bytes worth of space left over for data extents.</para>
+ </listitem>
+ <listitem>
+ <para>Let's now see how many extents we can fill up before they go out of line.</para>
+ <para><programlisting>
+# mount $SCRATCH_DEV $SCRATCH_MNT
+# cd $SCRATCH_MNT
+# $BINDIR/makeextents -p -n 23 file
+ </programlisting></para>
+ <para>The “-p” option is to preserve the file and its extents – it won't create 23 more
+ extents, rather it should create enough extents to have 23 extents in total.</para>
+ <para><programlisting>
+# xfs_bmap file
+# cd /
+# umount $SCRATCH_MNT
+# xfs_db -r $SCRATCH_DEV -c 'inode inode_number' -c 'p'
+ </programlisting></para>
+ <para>From this we can see that we can fit 23 extents inline.</para>
+ </listitem>
+ <listitem>
+ <para>Now you should try it with 24 extents.</para>
+ </listitem>
+ <listitem>
+ <para>Clear all the data extents in the file by truncating it to zero.</para>
+ <para><programlisting>
+# mount $SCRATCH_DEV $SCRATCH_MNT
+# cd $SCRATCH_MNT
+# >file
+# xfs_bmap file
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>1.Now add 23 more EA's so that we have 24 EA's in total.</para>
+ <para><programlisting>
+# for i in {2..24}
+> do
+> setfattr -n user.name.$i -v value file
+> done
+# getfattr -d file
+ </programlisting></para>
+ </listitem>
+ <listitem>
+ <para>Now unmount and look at the fork offset in xfs_db. It should be at about 7 which is
+ equivalent to 56 bytes into the literal space. So in adding 23 EA's we have gone
+ from 376 bytes down to 56 bytes.</para>
+ </listitem>
+ <listitem>
+ <para>How many extents we can fit in there before going out of line for the data extents?
+ Try first creating 3 extents and then 4.</para>
+ <para><programlisting>
+# mount $SCRATCH_DEV $SCRATCH_MNT
+# cd $SCRATCH_MNT
+# $BINDIR/makeextents -p -n 3 file
+# xfs_bmap file
+# cd /
+# umount $SCRATCH_MNT
+# xfs_db -r $SCRATCH_DEV -c 'inode inode_number' -c 'p'
+ </programlisting></para>
+ <para>In the answers section below is a table which lists the various fork offsets for EA's
+ created in the same way we did above. It also shows how many data extents we can
+ fit inline with that fork offset – although only 2 rows for this column have been
+ filled in.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ </section>
+ <section>
+ <title>Questions</title>
+ <orderedlist>
+ <listitem>
+ <para>If I have a file with EA's in it which they are all in shortform format (i.e. they are all
+ inside the inode), and I decide to replace one of those EA's by specifying the same name
+ in a setfattr command but this time using a large value (e.g. 60K), what will happen
+ to the format of the EA?</para>
+ <para>Will it just mark the value for this EA as remote and put a pointer to a set of blocks for
+ this value and leave all rest of the EA's in shortform? Or as well as marking it remote
+ and storing the value remotely, will it change the EA format to the extent form?</para>
+ </listitem>
+ <listitem>
+ <para>Construct a table showing how many inline extents are possible as the number of
+ extended attributes grow.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Answers</title>
+ <orderedlist>
+ <listitem><para>It will change to the extent form with 1 filesystem block for the EA names and values,
+ and will mark the large value EA (60K) as remote and store its value in remote blocks.
+ We did this in the lab :)</para></listitem>
+ <listitem><para>This table shows for various number of EA's named “name.xx” and value “value” on a 512
+ byte inode,what the fork offset will be and the maximum number of inline extents one
+ can have (only a couple of these entries have been filled in).</para>
+ </listitem>
+ </orderedlist>
+
+ <table frame="all"><title></title>
+ <tgroup cols="4" align="center" colsep="1" rowsep="1">
+ <colspec colname="Number of EA's"/>
+ <colspec colname="Fork Offset"/>
+ <colspec colname="Fork Offset bytes"/>
+ <colspec colname="Max # of inline extents"/>
+ <thead>
+ <row>
+ <entry>Number of EA's</entry>
+ <entry>Fork Offset</entry>
+ <entry>Fork Offset bytes</entry>
+ <entry>Max # of inline extents</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>1</entry> <entry>47</entry> <entry>376</entry> <entry>23</entry></row>
+ <row><entry>2</entry> <entry>47</entry> <entry>376</entry> <entry></entry></row>
+ <row><entry>4</entry> <entry>44</entry> <entry>352</entry> <entry></entry></row>
+ <row><entry>8</entry> <entry>37</entry> <entry>296</entry> <entry></entry></row>
+ <row><entry>16</entry> <entry>22</entry> <entry>176</entry> <entry></entry></row>
+ <row><entry>20</entry> <entry>14</entry> <entry>112</entry> <entry></entry></row>
+ <row><entry>21</entry> <entry>12</entry> <entry>96</entry> <entry></entry></row>
+ <row><entry>22</entry> <entry>10</entry> <entry>80</entry> <entry></entry></row>
+ <row><entry>23</entry> <entry>9</entry> <entry>72</entry> <entry></entry></row>
+ <row><entry>24</entry> <entry>7</entry> <entry>56</entry> <entry>3</entry></row>
+ <row><entry>25</entry> <entry>24 (extent format)</entry><entry>192</entry> <entry></entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+</chapter>
diff --git a/XFS_Labs/en-US/XFS_Labs.ent b/XFS_Labs/en-US/XFS_Labs.ent
new file mode 100644
index 0000000..dcd74cb
--- /dev/null
+++ b/XFS_Labs/en-US/XFS_Labs.ent
@@ -0,0 +1,4 @@
+<!ENTITY PRODUCT "Documentation">
+<!ENTITY BOOKID "XFS_Labs">
+<!ENTITY YEAR "2010">
+<!ENTITY HOLDER "| You need to change the HOLDER entity in the en-US/XFS_Labs.ent file |">
diff --git a/XFS_Labs/en-US/XFS_Labs.xml b/XFS_Labs/en-US/XFS_Labs.xml
new file mode 100644
index 0000000..e4164c3
--- /dev/null
+++ b/XFS_Labs/en-US/XFS_Labs.xml
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<book>
+ <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-build-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-mkfs-mount-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-allocators-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-xattr-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-quotas-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-QA-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-repair-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <index />
+</book>
+
diff --git a/XFS_Labs/publican.cfg b/XFS_Labs/publican.cfg
new file mode 100644
index 0000000..4590878
--- /dev/null
+++ b/XFS_Labs/publican.cfg
@@ -0,0 +1,7 @@
+# Config::Simple 4.59
+# Wed Mar 10 15:34:36 2010
+
+xml_lang: en-US
+type: Book
+brand: common
+
diff --git a/XFS_User_Guide/en-US/Article_Info.xml b/XFS_User_Guide/en-US/Article_Info.xml
new file mode 100644
index 0000000..d1adeb2
--- /dev/null
+++ b/XFS_User_Guide/en-US/Article_Info.xml
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE articleinfo PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<articleinfo id="arti-XFS-XFS">
+ <title>XFS</title>
+ <subtitle>short description</subtitle>
+ <productname>Documentation</productname>
+ <productnumber>0.1</productnumber>
+ <edition>0</edition>
+ <pubsnumber>0</pubsnumber>
+ <abstract>
+ <para>
+ A short overview and summary of the book's subject and purpose, traditionally no more than one paragraph long. Note: the abstract will appear in the front matter of your book and will also be placed in the description field of the book's RPM spec file.
+ </para>
+ </abstract>
+ <corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
+ </imageobject>
+ </inlinemediaobject>
+ </corpauthor>
+ <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+</articleinfo>
+
diff --git a/XFS_User_Guide/en-US/Author_Group.xml b/XFS_User_Guide/en-US/Author_Group.xml
new file mode 100644
index 0000000..d2bd016
--- /dev/null
+++ b/XFS_User_Guide/en-US/Author_Group.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<authorgroup>
+ <author>
+ <firstname>Dude</firstname>
+ <surname>McPants</surname>
+ <affiliation>
+ <orgname>Somewhere</orgname>
+ <orgdiv>Someone</orgdiv>
+ </affiliation>
+ <email>Dude.McPants@example.com</email>
+ </author>
+</authorgroup>
+
diff --git a/XFS_User_Guide/en-US/Book_Info.xml b/XFS_User_Guide/en-US/Book_Info.xml
new file mode 100644
index 0000000..1b3e72a
--- /dev/null
+++ b/XFS_User_Guide/en-US/Book_Info.xml
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<bookinfo id="book-XFS_User_Guide-XFS_User_Guide">
+ <title>XFS User Guide</title>
+ <subtitle>short description</subtitle>
+ <productname>Documentation</productname>
+ <productnumber>0.1</productnumber>
+ <edition>0</edition>
+ <pubsnumber>0</pubsnumber>
+ <abstract>
+ <para>
+ A short overview and summary of the book's subject and purpose, traditionally no more than one paragraph long. Note: the abstract will appear in the front matter of your book and will also be placed in the description field of the book's RPM spec file.
+ </para>
+ </abstract>
+ <corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
+ </imageobject>
+ </inlinemediaobject>
+ </corpauthor>
+ <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+</bookinfo>
+
diff --git a/XFS_User_Guide/en-US/Preface.xml b/XFS_User_Guide/en-US/Preface.xml
new file mode 100644
index 0000000..a697dda
--- /dev/null
+++ b/XFS_User_Guide/en-US/Preface.xml
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<preface id="pref-XFS_User_Guide-Preface">
+ <title>Preface</title>
+ <xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"><xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ </xi:fallback>
+ </xi:include>
+</preface>
+
diff --git a/XFS_User_Guide/en-US/Revision_History.xml b/XFS_User_Guide/en-US/Revision_History.xml
new file mode 100644
index 0000000..d38639c
--- /dev/null
+++ b/XFS_User_Guide/en-US/Revision_History.xml
@@ -0,0 +1,25 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<appendix id="appe-XFS_User_Guide-Revision_History">
+ <title>Revision History</title>
+ <simpara>
+ <revhistory>
+ <revision>
+ <revnumber>0</revnumber>
+ <date>Wed Mar 10 2010</date>
+ <author>
+ <firstname>Dude</firstname>
+ <surname>McPants</surname>
+ <email>Dude.McPants@example.com</email>
+ </author>
+ <revdescription>
+ <simplelist>
+ <member>Initial creation of book by publican</member>
+ </simplelist>
+ </revdescription>
+ </revision>
+ </revhistory>
+ </simpara>
+</appendix>
+
diff --git a/XFS_User_Guide/en-US/XFS-Background.xml b/XFS_User_Guide/en-US/XFS-Background.xml
new file mode 100644
index 0000000..fdae546
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-Background.xml
@@ -0,0 +1,514 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-background">
+ <title>XFS Background</title>
+ <section>
+ <title>Course Objectives</title>
+ <para>By the end of this course you will be able to:
+ <itemizedlist>
+ <listitem><para>Create and mount XFS filesystems</para></listitem>
+ <listitem><para>Understand how XFS
+ <itemizedlist>
+ <listitem><para>Creates and manages metadata</para></listitem>
+ <listitem><para>Allocates extents to files and manages free space</para></listitem>
+ <listitem><para>Provides extended attributes</para></listitem>
+ <listitem><para>Tracks filesystem quotas</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Backup and restore an XFS filesystem</para></listitem>
+ <listitem><para>Recover and repair XFS filesystems</para></listitem>
+ <listitem><para>Interpret on-disk and in-core XFS structures</para></listitem>
+ </itemizedlist>
+ </para>
+ <section>
+ <title>Day 1</title>
+ <formalpara>
+ <title>Theory</title>
+ <para>
+ <itemizedlist>
+ <listitem><para>Background and History</para></listitem>
+ <listitem><para>XFS Build</para></listitem>
+ <listitem><para>XFS Overview</para></listitem>
+ <listitem><para>Creating Filesystems</para></listitem>
+ <listitem><para>Mounting Filesystems</para></listitem>
+ <listitem>
+ <para>
+ Allocators
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Quotas
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Extended Attributes
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>Practise</title>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ XFS Build
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Creating and Mounting XFS
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Allocators
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Quotas
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Extended Attributes
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+ </section>
+ <section>
+ <title>Day 2</title>
+ <formalpara>
+ <title>Theory</title>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ XFS Architecture and Internals
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ QA
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>Practise</title>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ XFS On Disk Format
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ QA
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+ </section>
+ <section>
+ <title>Day 3</title>
+ <formalpara>
+ <title>Theory &amp; Practise</title>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Repairing XFS Filesystems
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ XFS Triage
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Monitoring
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+ </section>
+ <section>
+ <title>Day 4</title>
+ <formalpara>
+ <title>Theory</title>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Dump and Restore
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ DMAPI
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ XFS and Volume Managers
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>Practise</title>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Dump and Restore
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ DMAPI
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+ </section>
+ </section>
+ <section>
+ <title>A Brief History of XFS</title>
+ <para>
+ Original design was circulated within SGI in October 1993:
+ </para>
+ <para>
+ xFS: the extension of EFS
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ "x" for to-be-determined (but the name stuck)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Large filesystems: one terabyte, 2<superscript>40</superscript>, on 32 bit systems; unlimited on 64 bit systems
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Large files: one terabyte, 2<superscript>40</superscript>, on 32 bit systems; 2<superscript>63</superscript> on 64 bit systems
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Large number of inodes
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Large directories
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Large I/O
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Parallel access to inodes
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Balanced tree (btree) algorithms for searching large lists
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Asynchronous metadata transaction logging for quick recover
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Delayed allocation to improve data contiguity
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ACL's --Access Control Lists (see <command>chacl(1)</command>, <command>acl(4)</command>, <command>acl_get_file(3c)</command>, <command>acl_set_file(3c)</command>
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ First released in IRIX 5.3
+ </para>
+ </section>
+ <section>
+ <title>XFS on Linux</title>
+ <para>
+ Port to Linux began in 1999 against 2.3.40
+ </para>
+ <para>
+ Accepted into mainline
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ 2.5 kernel (2002)
+ </para>
+ <para>
+ 2.4 kernel (2004)
+ </para>
+ <para>
+ SLES9 and beyond
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ All XFS engineering is now based in SGI’s Melbourne, Australia office
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Coordinate changes to Novell via John Hesterberg’s group in Eagan
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ A number of contributors in the community
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Many (but not all) are ex-SGI employees
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Who is using XFS</title>
+ <para>
+ http://oss.sgi.com/projects/xfs/users.html
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ List is out of date but it gives an indication of the spread of users
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ XFS is included in a number of distributions
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Support agreement with Novell for SLES distributions
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS Distributions – linux/fs/xfs</title>
+ <para>
+ Top of tree (tot) XFS on oss.sgi.com
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Changes appear here shortly after they are checked in internally
+ </para>
+ <para>
+ CVS tree on oss.sgi.com
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.6-xfs/
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ hhttp://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.4-xfs/
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ftp://oss.sgi.com/projects/xfs/download
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Changes routinely pushed to 2.6 mainline kernel updates
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ git://oss.sgi.com:8090/xfs/xfs-2.6
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Maintenance only for 2.4 kernels
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ SuSE major releases and service packs
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ As close to top of tree as possible at the time of the code drop
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Differences between tot, SuSE and mainline kernels highlighted in course notes
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS Distributions – xfs-cmds</title>
+ <para>
+ A large amount of common code between kernel and user-space
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ This is how xfs_repair understands the on-disk format
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ User-space commands in a different code base
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-cmds/
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ This includes test framework under xfstests
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Packaged as
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ xfsprogs
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ xfsprogs-devel
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ xfsdump
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS Distributions - dmapi</title>
+ <para>
+ DMAPI has not been accepted into mainline
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Unlikely to be accepted without a complete rewrite
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ XFS tot distribution on oss.sgi.com includes DMAPI
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Changes we make to DMAPI will immediately appear in the CVS tree
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>IRIX vs Linux</title>
+ <para>Linux:</para>
+ <itemizedlist>
+ <listitem><para>Does not support V1 directories</para></listitem>
+ <listitem><para>Filesystem block size &lt;= PAGE_SIZE only</para></listitem>
+ <listitem><para>Does not support case insensitive directories</para></listitem>
+ <listitem><para>Does not support 64 bit inode numbers on 32 bit platforms
+ <itemizedlist>
+ <listitem><para>Will need XFS changes once generic changes in</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Does not support filestreams allocator
+ <itemizedlist>
+ <listitem><para>Development in progress (Oct 06)</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>IRIX:</para>
+ <itemizedlist>
+ <listitem><para>Does not support >512 byte sector sizes
+ <itemizedlist>
+ <listitem><para>MD RAID5</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Does not support write barriers</para></listitem>
+ <listitem><para>Does not support “noikeep” functionality</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Ongoing Development</title>
+ <para>XFS Architecture Team</para>
+ <itemizedlist>
+ <listitem><para>Submits and reviews designs for adding new features, or enhancing existing features, targeting one or more of
+ <itemizedlist>
+ <listitem><para>Interoperability</para></listitem>
+ <listitem><para>Performance</para></listitem>
+ <listitem><para>Scalability</para></listitem>
+ <listitem><para>Reliability</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>XFS Triage Roster</para>
+ <itemizedlist>
+ <listitem><para>Engineer rostered for one week to triage incoming bug reports from
+ <itemizedlist>
+ <listitem><para>SGI</para></listitem>
+ <listitem><para>Novell</para></listitem>
+ <listitem><para>Community</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>Remaining time devoted to developing features and fixing bugs</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-DMAPI.xml b/XFS_User_Guide/en-US/XFS-DMAPI.xml
new file mode 100644
index 0000000..1c97661
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-DMAPI.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-DMAPI">
+ <title>XFS DMAPI</title>
+ <section>
+ <title>DMAPI</title>
+ <para>XXX Still to copy to docbook</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-Overview.xml b/XFS_User_Guide/en-US/XFS-Overview.xml
new file mode 100644
index 0000000..8ae690c
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-Overview.xml
@@ -0,0 +1,137 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-overview">
+ <title>XFS Overview</title>
+ <section>
+ <title>XFS Filesystem Structure</title>
+ <para>This section gives an overview of the structure of an XFS filesystem</para>
+ <para>More detailed examination of the filesystem structure is covered later in the course</para>
+ <para>An XFS filesystem is divided evenly into allocation groups</para>
+ <para>An allocation group can be from 16MB to 1TB in size</para>
+ <para>See <command>xfs(5)</command></para>
+ </section>
+ <section>
+ <title>Allocation Groups</title>
+ <mediaobject><imageobject>
+ <imagedata fileref="images/XFS-allocation-groups.png" />
+ </imageobject></mediaobject>
+ </section>
+ <section>
+ <title>Allocation Group Structure</title>
+ <para>Each allocation group includes</para>
+ <itemizedlist>
+ <listitem><para>Super block information about the entire filesystem</para></listitem>
+ <listitem><para>Free space management (within the allocation group)</para></listitem>
+ <listitem><para>Inode allocation and tracking (with the allocation group)</para></listitem>
+ </itemizedlist>
+ <para>Inode clusters within an allocation group are created when needed</para>
+ <itemizedlist>
+ <listitem><para>mkfs.xfs does not pre-create inodes throughout the filesystem</para></listitem>
+ </itemizedlist>
+ <mediaobject><imageobject>
+ <imagedata fileref="images/XFS-allocation-group-structure.png" />
+ </imageobject></mediaobject>
+ </section>
+ <section>
+ <title>XFS Limits</title>
+ <para>32 bit Linux</para>
+ <itemizedlist>
+ <listitem><para>Maximum File Size = 16TB (O_LARGEFILE)</para></listitem>
+ <listitem><para>Maximum Filesystem Size = 16TB</para></listitem>
+ </itemizedlist>
+ <para>64 bit Linux</para>
+ <itemizedlist>
+ <listitem><para>Maximum File Size = 9 Million TB = 9 ExaB</para></listitem>
+ <listitem><para>Maximum Filesystem Size = 18 Million TB = 18 ExaB</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Filesystem Block Size (FSB)</title>
+ <para>Filesystem blocks (FSBs) are the unit of space for a filesystem</para>
+ <itemizedlist>
+ <listitem><para>Filesystem blocks are comprised of one or more device-level sectors.</para></listitem>
+ </itemizedlist>
+ <para>The page management implementation in Linux limits the FSB size to the page size</para>
+ <itemizedlist>
+ <listitem><para>4KB on ia32 and x86_64 architectures</para></listitem>
+ <listitem><para>16KB on ia64</para></listitem>
+ </itemizedlist>
+ <para> Performance can improve with different block sizes depending on the size of I/O requests and the size of files</para>
+ <itemizedlist>
+ <listitem><para>Larger blocks will also use more disk space for small (&lt;1FSB) files</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Extents</title>
+ <para>An extent is a set of one or more contiguous FSBs that define a region in the filesystem for file data or metadata</para>
+ <itemizedlist>
+ <listitem><para>A single extent can be up to 8GB in length</para></listitem>
+ </itemizedlist>
+ <para>A file’s inode lists the extents associated with that file</para>
+ <itemizedlist>
+ <listitem><para>For very large files, the file’s inode may have thousands of extents, or one very large extent. Usually something in between.</para></listitem>
+ </itemizedlist>
+ <para>Extents are also used for file and directory metadata when the information exceeds the space reserved for an inode</para>
+ </section>
+ <section>
+ <title>Unwritten Extents</title>
+ <para>An unwritten extent is an extent which has been marked as "not yet written" ondisk.</para>
+ <para>Unwritten extents can be created by</para>
+ <itemizedlist>
+ <listitem><para>Preallocating file space using (currently) XFS specific interfaces
+ <itemizedlist>
+ <listitem><para>Someday there may be a real kernel fallocate(2) syscall</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Through direct IOs of specific (un)alignment.</para></listitem>
+ </itemizedlist>
+ <para>They are a security measure, to ensure allocated but not yet initialised space
+ ondisk is not visible to arbitrary users</para>
+ <para>mkfs.xfs option to enable or disable, on by default.</para>
+ <para>Unwritten extents apply only to regular files.</para>
+ <para>Once such an extent is written to, or partially written to, a transaction is
+ issued to convert the written part into a regular written extent, and mark the
+ remaining (up to 2) extents as unwritten.</para>
+ <para>Use the -p option to xfs_bmap to view unwritten extents.</para>
+ <para><command># xfs_io -f -c 'resvsp 0 10m' -c 'bmap -vp' /tmp/foo</command></para>
+ </section>
+ <section>
+ <title>Inodes</title>
+ <para>XFS has three inode structures</para>
+ <para>Ondisk inode</para>
+ <itemizedlist>
+ <listitem><para>Used for storing the metadata for all files, directories and other file types</para></listitem>
+ <listitem><para>By default 256 bytes but can be up to 2KiB</para></listitem>
+ </itemizedlist>
+ <para> Linux inode</para>
+ <itemizedlist>
+ <listitem><para>bhv_vnode_t has the Linux inode embedded in it</para></listitem>
+ </itemizedlist>
+ <para>XFS inode</para>
+ <itemizedlist>
+ <listitem><para>xfs_inode contains the ondisk inode structure in memory</para></listitem>
+ </itemizedlist>
+ <para>The Linux and XFS inodes have different lifecycles, which can cause problems</para>
+ </section>
+ <section>
+ <title>Directory and File Inodes</title>
+ <mediaobject><imageobject>
+ <imagedata fileref="images/XFS-directory-file-inodes.png" />
+ </imageobject></mediaobject>
+ </section>
+ <section>
+ <title>Journal Log</title>
+ <para>XFS Journal logs all metadata transactions</para>
+ <itemizedlist>
+ <listitem><para>No record of data, only that the file size had changed</para></listitem>
+ </itemizedlist>
+ <para>Allows the filesystem to replay and recover the filesystem in seconds</para>
+ <itemizedlist>
+ <listitem><para>No requirement to run fsck</para></listitem>
+ </itemizedlist>
+ <para>Log replay will apply filesystem and metadata changes that had been
+ logged but may not have been applied to the filesystem when it went down</para>
+ <para>The log may be located on a separate device</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-QA.xml b/XFS_User_Guide/en-US/XFS-QA.xml
new file mode 100644
index 0000000..b629f69
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-QA.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-QA">
+ <title>XFS QA</title>
+ <section>
+ <title>QA</title>
+ <para>XXX Still to copy to docbook</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-allocators.xml b/XFS_User_Guide/en-US/XFS-allocators.xml
new file mode 100644
index 0000000..31b80e8
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-allocators.xml
@@ -0,0 +1,302 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-allocators">
+ <title>Allocators</title>
+ <section>
+ <title>Allocation Policy</title>
+ <para>The default allocation behaviour of XFS for new files is to place them in the same allocation group as their parent directory.</para>
+ <para>Since files and their parent directories are often accessed in close succession, this minimises costly disk seeks.</para>
+ <para>The allocator will also attempt to place newly created directories in different allocation groups.</para>
+ <para>Combined, these policies help group directories of files together on disk, even if they're being written to concurrently.</para>
+ <para>Allocation policies in XFS can change due to</para>
+ <itemizedlist>
+ <listitem><para>32 bit inode numbers are used on large file systems</para></listitem>
+ <listitem><para>Some mount options</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Allocation Policy - Directories</title>
+ <para>New directories are placed in different AGs where possible</para>
+ <para>Watch the inode numbers as directory inodes are created:</para>
+ <para><programlisting>
+&gt; mkdir a b
+> mkdir a b
+> ls -li total 0
+ 131 drwxr-xr-x 2 sjv users 6 2006-10-20 12:12 a
+33554624 drwxr-xr-x 2 sjv users 6 2006-10-20 12:12 b</programlisting></para>
+ </section>
+ <section>
+ <title>Allocation Policy - Files</title>
+ <para>Files are created in the same AG as their parent directory where possible, which is also evident in their inode numbers:</para>
+ <para><programlisting>
+> touch a/1 b/1 a/2 b/2
+> ls -1id * */*
+ 131 a
+ 132 a/1
+ 133 a/2
+33554624 b
+33554625 b/1
+33554626 b/2</programlisting></para>
+ </section>
+ <section>
+ <title>Inode Numbers</title>
+ <para>Every inode on disk has a unique inode number associated with it.</para>
+ <para>It is a requirement that inode numbers be persistent across unmounts and reboots,
+ so once an inode is written to disk its inode number is fixed.</para>
+ <para>For performance reasons it must be possible to quickly find an inode on disk using its inode number.</para>
+ <para>XFS uses the physical location of the inode on disk to encode the inode number, which makes
+ finding the inode on disk using the inode number a trivial task.</para>
+ </section>
+ <section>
+ <title>Inode Number Format</title>
+ <para>An inode's location consists of three distinct parts</para>
+ <itemizedlist>
+ <listitem><para>an allocation group number</para></listitem>
+ <listitem><para>a file system block number within its AG</para></listitem>
+ <listitem><para>an inode number inside that file system block</para></listitem>
+ </itemizedlist>
+ <para>The number of bits required to store each of these values varies with the filesystem geometry</para>
+ <para>Larger filesystems can easily require more than 32 bits, which can limit inode
+ allocation to a region at the start of the volume</para>
+ </section>
+ <section>
+ <title>Inode Number Size</title>
+ <para>File systems aren't free to use inode numbers of arbitrary size.</para>
+ <para>Operating system interfaces and legacy software products often mandate the use of 32
+ bit inode numbers even on systems that support 64 bit inode numbers.</para>
+ <para>This can be a problem on large file systems, since 32 bit inode numbers only provide
+ enough bits to encode inode locations in the first 1TB of a volume when 256 byte inodes
+ are used, up to 8TB in the case of 2kB inodes.</para>
+ <para>For best performance, a file system needs to keep a file's data blocks close to its
+ inode to minimise seeks when performing I/O. XFS's ability to do this suffers on large
+ volumes when 32 bit inode numbers are used.</para>
+ </section>
+ <section>
+ <title>32bit and 64bit Inodes</title>
+ <para>By default, XFS will use 32 bit inode numbers.</para>
+ <para>If the system supports it, the -o inode64 option to mount to allow 64 bit inode numbers.</para>
+ <para>Once an inode has been written somewhere on the disk that requires a 64 bit inode number, the
+ file system can no longer be used with 32 bit inode numbers</para>
+ <itemizedlist>
+ <listitem><para>The inode64 mount option should not be removed once used</para></listitem>
+ </itemizedlist>
+ <para>(IRIX can move inodes to 32 bit numbers with <command>xfs_reno</command>, this tool has not
+ been ported to Linux, yet)</para>
+ </section>
+ <section>
+ <title>32bit and 64bit Inodes</title>
+ <para>Inode numbers are stored in big endian format on disk, and host endian format in-core.</para>
+ <para>Applications that pass 64 bit inode numbers using 32 bit variables will truncate the
+ 32 most-significant bits.</para>
+ <para>Since XFS stores the AG number an inode belongs to in the most significant bits, a result
+ of this truncation can be an inode number that points to an inode in a lower AG by mistake.</para>
+ <para>Using that inode number will result in either a lookup on the incorrect inode, or the
+ referencing of an area on disk that doesn't contain inodes at all.</para>
+ </section>
+ <section>
+ <title>32 bit Inodes on &gt;1TB Filesystems</title>
+ <para>When 32 bit inode numbers are used on a volume larger than 1TB in size, several changes occur.</para>
+ <para>A 100TB volume using 256 byte inodes mounted in the default inode32 mode has just
+ one percent of its space available for allocating inodes.</para>
+ <para>XFS will reserve the first 1TB of disk space exclusively for inodes to ensure that the
+ imbalance is no worse than this due to file data allocations.</para>
+ <para>It is no longer possible for file data to reside in the same AG as the parent directory's inode.</para>
+ <para>XFS will instead "rotor" through the upper AGs as it allocates space for files, putting
+ each file in a new AG to evenly spread the I/O load.</para>
+ </section>
+ <section>
+ <title>Rotor Step</title>
+ <para>The performance of some workloads will suffer from the distribution each file in a different
+ AG, so the "rotor step" sysctl was added adjust this behavior</para>
+ <para>For example, to keep at least a second of ingested 24fps video files in the same
+ AG before moving to the next AG:</para>
+ <para><programlisting>
+# sysctl fs.xfs.rotorstep
+fs.xfs.rotorstep = 1
+# sudo sysctl –w fs.xfs.rotorstep=24
+fs.xfs.rotorstep = 24</programlisting></para>
+ <para>Note that the rotorstep value is a global one, so setting it will affect the behaviour of
+ all mounted file systems over 1TB in size that use 32 bit inode numbers.</para>
+ </section>
+ <section>
+ <title>Realtime Allocator</title>
+ <para>Certain classes of applications require deterministic latencies on file allocation operations</para>
+ <itemizedlist>
+ <listitem><para>The performance of the standard XFS allocator varies depending on the
+ internal data structures used to manage the filesystem content</para></listitem>
+ </itemizedlist>
+ <para>The realtime allocator uses a bitmap algorithm that gives consistent allocation
+ latencies regardless of the filesystem's contents.</para>
+ <para>By using the realtime allocator in conjunction with an external log volume, it's possible
+ to remove most of the unpredictability in disk response times that's caused by metadata overheads.</para>
+ </section>
+ <section>
+ <title>Realtime Allocator Limitations</title>
+ <para>In practice, the realtime allocator is not widely used.</para>
+ <para>It effectively uses a single large allocation group with a single set of data structures
+ losing the parallelism of XFS’s allocation groups</para>
+ <itemizedlist>
+ <listitem><para>The locks associated with this central data structure result in the serialisation of
+ concurrent operations to a realtime device</para></listitem>
+ </itemizedlist>
+ <para>The realtime allocator is incapable of maintaining a spatial separation on disk for concurrent operations</para>
+ <itemizedlist>
+ <listitem><para>It tries to start new files at random points in the bitmap to reduce this
+ problem but this has a negative impact on some workloads</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Traditional allocator impact on some workloads</title>
+ <para>A certain class of applications will write many large files to a directory in sequence.</para>
+ <para>A film scanner ingesting video may write each video frame to a separate file. To playback
+ the video frames in realtime its important that these files are contiguous on disk for optimal
+ read-ahead performance by the hardware RAID.</para>
+ <para>At 24 frames per second, each frame is needed every 40ms, so it is important to keep the disks
+ busy and reading into cache the next frame to be displayed</para>
+ </section>
+ <section>
+ <title>Traditional Stream Allocation</title>
+ <para>Initially each directory is allocated to a separate AG</para>
+ <para>Each stream writes to that AG until it is full</para>
+ <para>Additional allocations now go in the next consecutive AG that has enough free space</para>
+ <para>Multiple streams will start writing to the same AG, interleaving their files and negating any read-ahead</para>
+ <mediaobject><imageobject>
+ <imagedata fileref="images/XFS-traditional-stream-allocation.png" />
+ </imageobject></mediaobject>
+
+ </section>
+ <section>
+ <title>RAID performance with interleaved streams</title>
+ <para>With only 1.3% read cache hits, RAID is reading 545MB/s to return 184MB/s to the client (200% backend overhead)</para>
+ <para><programlisting>
+ System Performance Statistics
+ All Ports Port 1 Port 2 Port 3 Port 4
+ Read MB/s: 183.9 45.8 46.8 46.3 45.0
+ Write MB/s: 0.0 0.0 0.0 0.0 0.0
+ Total MB/s: 183.9 45.8 46.8 46.3 45.0
+
+ Read IO/s: 520 133 129 129 129
+ Write IO/s: 0 0 0 0 0
+ Total IO/s: 522 134 131 128 129
+
+ Read Hits: 1.3% 1.6% 2.2% 0.6% 0.6%
+ Prefetch Hits: 0.8% 1.1% 1.1% 0.6% 0.6%
+ Prefetches: 46.3% 46.3% 46.0% 46.1% 46.8%
+ Writebacks: 0.0% 0.0% 0.0% 0.0% 0.0%
+ Rebuild MB/s: 0.0 0.0 0.0 0.0 0.0
+ Verify MB/s: 0.0 0.0 0.0 0.0 0.0
+
+ Total Reads Writes Pieces Reads Writes
+ Disk IO/s: 518 518 0 1: 4910 0
+ Disk MB/s: 544.6 544.6 0.0 2: 29890 0
+ Disk Pieces: 65710 65710 0 3: 340 0
+ BDB Pieces: 0 4: 0 0
+ 5: 0 0
+ Cache Writeback Data: 0.0% 6: 0 0
+ Rebuild/Verify Data: 0.0% 0.0% 7: 0 0
+ Cache Data locked: 0.0% 8: 0 0</programlisting></para>
+ </section>
+ <section>
+ <title>Filestreams Allocator</title>
+ <para>A new allocation algorithm was added to XFS that associates a parent directory with an AG
+ until a preset inactivity timeout elapses.</para>
+ <itemizedlist>
+ <listitem><para>Not in SLES10, planned for SLES10SP1</para></listitem>
+ </itemizedlist>
+ <para>A stream that moves to a new AG will cause that AG to be locked, so other streams looking
+ for a new AG will not use the same AG</para>
+ <para>The new algorithm is called the Filestreams allocator and it is enabled in one of two ways:</para>
+ <itemizedlist>
+ <listitem><para>the filesystem is mounted with the -o filestreams option, or</para></listitem>
+ <listitem><para>the filestreams chattr flag is applied to a directory to indicate that all allocations
+ beneath that point in the directory hierarchy should use the filestreams allocator</para></listitem>
+ </itemizedlist>
+ <para>Filestreams will have a negative impact on workloads that continue to grow files
+ in the same directory, causing more fragmentation than the default allocator</para>
+ </section>
+ <section>
+ <title>RAID performance with filestreams</title>
+ <para>Almost all data now found in RAID cache, only 15% backend disk I/O overhead</para>
+ <para><programlisting>
+System Performance Statistics
+ All Ports Port 1 Port 2 Port 3 Port 4
+ Read MB/s: 299.1 74.0 74.7 75.1 75.2
+ Write MB/s: 0.0 0.0 0.0 0.0 0.0
+ Total MB/s: 299.1 74.0 74.7 75.1 75.2
+
+ Read IO/s: 840 209 210 211 210
+ Write IO/s: 0 0 0 0 0
+ Total IO/s: 836 209 210 208 209
+
+ Read Hits: 99.5% 98.3% 99.6% 100.0% 100.0%
+ Prefetch Hits: 98.8% 97.6% 98.9% 99.6% 99.0%
+ Prefetches: 42.0% 41.5% 42.0% 42.9% 41.7%
+ Writebacks: 0.0% 0.0% 0.0% 0.0% 0.0%
+ Rebuild MB/s: 0.0 0.0 0.0 0.0 0.0
+ Verify MB/s: 0.0 0.0 0.0 0.0 0.0
+
+ Total Reads Writes Pieces Reads Writes
+ Disk IO/s: 614 614 0 1: 39068 0
+ Disk MB/s: 345.5 345.5 0.0 2: 111 0
+ Disk Pieces: 39290 39290 0 3: 0 0
+ BDB Pieces: 0 4: 0 0
+ 5: 0 0
+ Cache Writeback Data: 0.0% 6: 0 0
+ Rebuild/Verify Data: 0.0% 0.0% 7: 0 0
+ Cache Data locked: 0.0% 8: 0 0</programlisting></para>
+ </section>
+ <section>
+ <title>Fragmentation</title>
+ <para>Despite the use of extents and the various allocation schemes, XFS files and filesystems
+ may still become fragmented over time</para>
+ <para>xfs_db can display the level of fragmentation in the filesystem</para>
+ <itemizedlist>
+ <listitem><para>xfs_db -r /dev/sda3
+ <itemizedlist>
+ <listitem><para>frag -f file fragmentation percentage</para></listitem>
+ <listitem><para>frag -d directory fragmentation percentage</para></listitem>
+ <listitem><para>freesp freespace</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Fragmentation Example</title>
+ <para><programlisting>
+> xfs_db –r device
+xfs_db: freesp
+ from to extents blocks pct
+ 1 1 94807 94807 1.36
+ 2 3 63041 145012 2.08
+ 4 7 30374 152890 2.19
+ 8 15 19437 207742 2.98
+ 16 31 15173 331559 4.76
+ 32 63 14099 636086 9.13
+ 64 127 16804 1497220 21.48
+ 128 255 8390 1470464 21.10
+ 256 511 3003 1033383 14.83
+ 512 1023 810 551813 7.92
+ 1024 2047 258 370811 5.32
+ 2048 4095 101 282202 4.05
+ 4096 8191 27 145550 2.09
+xfs_db: frag -d
+actual 45966, ideal 12398, fragmentation factor 73.03%
+xfs_db: frag -f
+actual 2104856, ideal 2100484, fragmentation factor 0.21%</programlisting></para>
+ </section>
+ <section>
+ <title>xfs_fsr</title>
+ <para>Simple defragmentation tool that</para>
+ <itemizedlist>
+ <listitem><para>Searched for files that are fragmented</para></listitem>
+ <listitem><para>Creates a tempory inode</para></listitem>
+ <listitem><para>Asks the filesystem to create new extents for the temporary inode</para></listitem>
+ <listitem><para>If the new extents are less fragmented it copies the data in original file to the new extents</para></listitem>
+ <listitem><para>The temporary inode is then renamed to replace the original file</para></listitem>
+ </itemizedlist>
+ <para>Fsr makes no consideration for the used and free space within its allocation group
+ and does not rearrange files to create larger contiguous free space</para>
+ <para>So fsr may fragment freespace over a period of time</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-build.xml b/XFS_User_Guide/en-US/XFS-build.xml
new file mode 100644
index 0000000..43c473c
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-build.xml
@@ -0,0 +1,186 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-build">
+ <title>XFS Build</title>
+ <section>
+ <title>Building XFS</title>
+ <para>This tutorial describes how to</para>
+ <itemizedlist>
+ <listitem><para>obtain the latest XFS source code</para></listitem>
+ <listitem><para>how to build and install the commands and kernel components</para></listitem>
+ </itemizedlist>
+ <para>The following prerequisite RPMs should be installed</para>
+ <itemizedlist>
+ <listitem><para>xfsprogs-devel</para></listitem>
+ <listitem><para>dmapi-devel</para></listitem>
+ </itemizedlist>
+ <para>These headers and installed can be built from source, but these RPMs will normally suffice
+</para>
+ </section>
+ <section>
+ <title>XFS Source Code</title>
+ <para>Latest XFS is available via CVS from oss.sgi.com:</para>
+ <para><programlisting>
+> export CVSROOT=':pserver:cvs@oss.sgi.com:/cvs'
+> cvs login
+Logging in to :pserver:cvs@oss.sgi.com:2401/cvs
+CVS password: <emphasis>&lt;password is “cvs”&gt;</emphasis>
+> cvs checkout linux-2.6-xfs
+cvs checkout: Updating linux-2.6-xfs
+U linux-2.6-xfs/.gitignore
+U linux-2.6-xfs/COPYING
+U linux-2.6-xfs/CREDITS
+...
+> cvs checkout xfs-cmds</programlisting></para>
+ </section>
+ <section>
+ <title>Building xfs-cmds</title>
+ <para>Building the XFS commands</para>
+ <para><programlisting>
+> cd xfs-cmds
+> make
+...
+</programlisting></para>
+ <para>RPM packages will be placed in RPMS/&lt;arch&gt;</para>
+ <para><programlisting>
+> cd RPMS/x86_64
+> sudo rpm -i xfsprogs-2.8.15-1.x86_64.rpm
+> sudo rpm -i xfsdump-2.2.43-1.x86_64.rpm
+</programlisting></para>
+ <para>Source RPM packages will be placed in SRPMS/</para>
+ </section>
+ <section>
+ <title>Packaging</title>
+ <para>XFS uses autoconf/configure</para>
+ <para>Includes internationalization support</para>
+ <para>User space packages</para>
+ <itemizedlist>
+ <listitem><para>acl
+ <itemizedlist>
+ <listitem><para>libacl</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>attr
+ <itemizedlist>
+ <listitem><para>libattr (incl. IRIX compatibility API for xfsdump/restore/...)</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>xfsprogs
+ <itemizedlist>
+ <listitem><para>libhandle, libxfs, libxlog, libdisk</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>dmapi
+ <itemizedlist>
+ <listitem><para>libdm</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>xfsdump
+ <itemizedlist>
+ <listitem><para>dependency on attr packages</para></listitem>
+ <listitem><para>librmt</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Kernel Configuration Options</title>
+ <para>CONFIG_XFS_FS</para>
+ <itemizedlist>
+ <listitem><para>XFS can be built as a module or statically linked into the kernel</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_QUOTA</para>
+ <itemizedlist>
+ <listitem><para>support for quota disk limits.</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_DMAPI</para>
+ <itemizedlist>
+ <listitem><para>support for the data management API (requires generic kernel DMAPI support)</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_SECURITY</para>
+ <itemizedlist>
+ <listitem><para>support for alternate access control models (ie SELinux).</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_POSIX_ACL</para>
+ <itemizedlist>
+ <listitem><para>support for Access Control Lists.</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_REALTIME</para>
+ <itemizedlist>
+ <listitem><para>support for the realtime allocator that provides deterministic data rates.</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_DEBUG</para>
+ <itemizedlist>
+ <listitem><para>include debugging features in the build (ie ASSERTs, sanity checking code, etc).</para></listitem>
+ </itemizedlist>
+ <para>CONFIG_XFS_TRACING</para>
+ <itemizedlist>
+ <listitem><para>include support for activity tracing of inodes, buffers, locks, the log, I/O path, etc.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Build Kernel Components</title>
+ <para>Configure and build kernel and modules</para>
+ <para><programlisting>
+> cd linux-2.6-xfs
+> make xconfig
+> make bzImage
+> make modules
+> sudo make modules_install</programlisting></para>
+ <para>If XFS wasn't built as a module</para>
+ <para><programlisting>
+# cp arch/&lt;arch&gt;/boot/bzImage /boot/vmlinuz
+# cp System.map /boot/System.map
+# lilo
+# reboot</programlisting></para>
+ </section>
+ <section>
+ <title>Load XFS Modules</title>
+ <para>Load the XFS modules</para>
+ <para><programlisting>
+# modprobe xfs
+# modprobe xfs_dmapi
+# modprobe xfs_quota
+# lsmod
+Module Size Used by
+xfs_dmapi 32852 0
+xfs_quota 85120 0
+xfs 848864 2 xfs_dmapi,xfs_quota</programlisting></para>
+ <para>Can now mount XFS filesystems...</para>
+ </section>
+ <section>
+ <title>Other products that know XFS</title>
+ <para>Quota (sourceforge.net)</para>
+ <itemizedlist>
+ <listitem><para>generic quota commands know about XFS</para></listitem>
+ <listitem><para>do not understand project quotas
+ <itemizedlist>
+ <listitem><para>seen as too intrusive, XFS only</para></listitem>
+ </itemizedlist>
+ <itemizedlist>
+ <listitem><para></para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>mount (kernel.org)</para>
+ <itemizedlist>
+ <listitem><para>from <emphasis>util-linux</emphasis> package</para></listitem>
+ <listitem><para>knows where the primary XFS SB is</para></listitem>
+ <listitem><para>knows how to extract the label and UUID
+ <itemizedlist>
+ <listitem><para>for UUID= and LABEL= mounts</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>Samba (samba.org)</para>
+ <itemizedlist>
+ <listitem><para>has some XFS specific code in its handling of quotas
+ <itemizedlist>
+ <listitem><para>uses XFS quotactl(2) calls</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+</chapter>
+
diff --git a/XFS_User_Guide/en-US/XFS-dumprestore.xml b/XFS_User_Guide/en-US/XFS-dumprestore.xml
new file mode 100644
index 0000000..53d3b4d
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-dumprestore.xml
@@ -0,0 +1,75 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-dump-and-restore">
+ <title>XFS Dump and Restore</title>
+ <section>
+ <title>Dump and Restore</title>
+ <para>This section describes</para>
+ <itemizedlist>
+ <listitem><para>The differences between xfsdump, xfs_copy and other backup applications</para></listitem>
+ <listitem><para>How to use xfsdump and xfsrestore to backup and restore an XFS filesystem</para></listitem>
+ <listitem><para>How to use xfs_copy to copy an XFS filesystem</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Dump vs Copy vs Backup</title>
+ <para>xfsdump understands all the extensions in an XFS filesystem, so all attributes will be backed up and restored</para>
+ <para>xfs_copy TODO</para>
+ <para>Traditional backup applications may not backup all attributes, but they provide other management features</para>
+ <itemizedlist>
+ <listitem><para>Some are still limited to 32bit inodes</para></listitem>
+ <listitem><para>Some are BAPI aware which means they work with DMAPI and will not back up
+ files that are already achieved by a HSM. Otherwise they would pull files off
+ tape to backup onto other tape.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfsdump - Features</title>
+ <para>xfsdump and xfsrestore support the following:</para>
+ <itemizedlist>
+ <listitem><para>XFS features including 64-bit inode numbers, file lengths, and holes</para></listitem>
+ <listitem><para>regular, directory, symbolic link, block and character special, FIFO,
+ and socket file types</para></listitem>
+ <listitem><para>retain hard links.</para></listitem>
+ <listitem><para>multiple media types (tape, files)</para></listitem>
+ <listitem><para>do not affect the state of the filesystem being dumped (for example,
+ access times are retained).</para></listitem>
+ <listitem><para>xfsrestore detects and bypasses media errors and recovers rapidly after
+ encountering them.</para></listitem>
+ <listitem><para>xfsdump does not crossmount points, local or remote</para></listitem>
+ <listitem><para>support for automated and incremental backups</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>TODO</title>
+ <para><programlisting>
+xfsdump – Media Layout
+xfsdump – Local Tape
+xfsdump – Remote Tape
+xfsdump – Backup to a File
+xfsdump – Incremental Dumps
+xfsdump – Resuming Dumps
+xfsdump – Querying Dumps
+xfsrestore – Local Tape
+xfsrestore – Remote Tape
+xfsrestore – Restore from File
+xfsrestore - Interactive
+xfsrestore – Cumulative
+
+Do these still apply?
+
+Linux xfsdump/xfsrestore does not support:
+– multiple tape devices using multiple -f options
+– IRIXdumpoption-z (prune large files)
+– DMAPIrelatedoptionsof-a and -D
+Linux xfsdump/xfsrestore does, however, have the added capabilities of
+unrestricted use of the -b option for blocksize specification and remote
+dumping/restoring between Linux and IRIX host
+
+xfs_copy
+TODO
+</programlisting></para>
+ </section>
+</chapter>
+
diff --git a/XFS_User_Guide/en-US/XFS-internals.xml b/XFS_User_Guide/en-US/XFS-internals.xml
new file mode 100644
index 0000000..f418a29
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-internals.xml
@@ -0,0 +1,709 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-internals">
+ <title>XFS Internals</title>
+ <section>
+ <title>XFS Internals</title>
+ <para>Understand some of the unique features in XFS</para>
+ <para>Why XFS differs from other Linux filesystems</para>
+ <para>How these differences are implemented</para>
+ </section>
+ <section>
+ <title>xfs_vnodeops</title>
+ <para>VFS interfaces are mapped to an IRIX-like vnode operations table</para>
+ <itemizedlist>
+ <listitem><para>fs/xfs/xfs_vnodeops.c</para></listitem>
+ </itemizedlist>
+ <para>xfs_vnodeops {</para>
+ <itemizedlist>
+ <listitem><para>open, close, fid, read, write, sendfile, splice, fsync
+ <itemizedlist>
+ <listitem><para>file descriptors</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>getattr, setattr
+ <itemizedlist>
+ <listitem><para>inode attributes - stat(2)</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>attr_get, attr_set, attr_list, attr_remove
+ <itemizedlist>
+ <listitem><para>extended attributes</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>access, lookup
+ <itemizedlist>
+ <listitem><para>inode permissions/existence</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>create, remove, symlink, readlink
+ <itemizedlist>
+ <listitem><para>regular files, special files</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>readdir, mkdir, rmdir, link, rename
+ <itemizedlist>
+ <listitem><para>directories</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>reclaim, release, inactive, iflush, bmap, flush_pages, flush_inval_pages, toss_pages
+ <itemizedlist>
+ <listitem><para>inode / page cache state and/or lifecycle</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>}</para>
+ </section>
+ <section>
+ <title>xfs_ioctl</title>
+ <para>XFS specific system calls (xfsctl()) are dispatched by xfs_ioctl()</para>
+ <itemizedlist>
+ <listitem><para>fs/xfs/xfs_fs.h</para></listitem>
+ <listitem><para>fs/xfs/linux-2.6/xfs_ioctl.c</para></listitem>
+ </itemizedlist>
+ <para>Can be exercised with xfs_io</para>
+ <para>geometry, fscounts, [get|set]resblks, shutdown, freeze/thaw</para>
+ <itemizedlist>
+ <listitem><para>filesystem level manipulation</para></listitem>
+ </itemizedlist>
+ <para>grow[fs|fslog|fsrt]</para>
+ <itemizedlist>
+ <listitem><para>filesystem size (and maximum inode count) expansion</para></listitem>
+ </itemizedlist>
+ <para>[get|set]xflags, fs[get|set]xattr, fs[get|set]xattra, dioinfo</para>
+ <itemizedlist>
+ <listitem><para>inode attribute information</para></listitem>
+ <listitem><para>direct I/O parameters (min/max/align)</para></listitem>
+ </itemizedlist>
+ <para>allocsp, freesp, resvsp, unresvsp</para>
+ <itemizedlist>
+ <listitem><para>space allocation and/or preallocation</para></listitem>
+ </itemizedlist>
+ <para>bulkstat</para>
+ <itemizedlist>
+ <listitem><para>many (sequential) inode's attributes – stat(2)</para></listitem>
+ </itemizedlist>
+ <para>xfsdump, quotacheck, dmapi</para>
+ <itemizedlist>
+ <listitem><para>by-handle (open, fd-to-, path-to-, readlink, attrlist, attrmulti, ...)</para></listitem>
+ <listitem><para>manipulating inodes by “handles” (inum/igen/fsid)</para></listitem>
+ </itemizedlist>
+ <para>getbmap, getbmapa, swapext</para>
+ <itemizedlist>
+ <listitem><para>inode data/attr fork extent information</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_ioctl – Miscellaneous</title>
+ <para>geometry</para>
+ <itemizedlist>
+ <listitem><para>Data displayed by xfs_info</para></listitem>
+ </itemizedlist>
+ <para>fscounts</para>
+ <itemizedlist>
+ <listitem><para>XFS specific stat information</para></listitem>
+ </itemizedlist>
+ <para>resblks</para>
+ <itemizedlist>
+ <listitem><para>allows dmapi to set aside some disk space</para></listitem>
+ <listitem><para>threads can be marked to say they can use it if about to run out of space</para></listitem>
+ </itemizedlist>
+ <para>grow</para>
+ <itemizedlist>
+ <listitem><para>upward only</para></listitem>
+ <listitem><para>can't grow the log, not implemented in the kernel</para></listitem>
+ <listitem><para>also can be used to change the maximum space for inodes</para></listitem>
+ </itemizedlist>
+ <para>dioinfo changes direct I/O paramenters</para>
+ <itemizedlist>
+ <listitem><para>max direct I/O size is huge, no real limit</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_ioctl - Attribute Flags</title>
+ <para>xflags</para>
+ <itemizedlist>
+ <listitem><para>inode flags, see definition of struct fsxattr</para></listitem>
+ </itemizedlist>
+ <para>xattr</para>
+ <itemizedlist>
+ <listitem><para>original IRIX version for inode flags</para></listitem>
+ <listitem><para>project id</para></listitem>
+ <listitem><para>extent size hint</para></listitem>
+ <listitem><para>how many extents are allocated on the data fork</para></listitem>
+ </itemizedlist>
+ <para>xattra passes out the same structure as xattr, but applies to the attribute rather than data fork.</para>
+ </section>
+ <section>
+ <title>xfs_ioctl - Space Allocation</title>
+ <para>allocsp/freesp</para>
+ <itemizedlist>
+ <listitem><para>allocate space</para></listitem>
+ <listitem><para>zeros</para></listitem>
+ <listitem><para>updates the inode size</para></listitem>
+ </itemizedlist>
+ <para>resvsp/unresvsp is for allocating but not zeroing</para>
+ <itemizedlist>
+ <listitem><para>efficient way for applications to take advantage of unwritten extents</para></listitem>
+ <listitem><para></para></listitem>
+ <listitem><para></para></listitem>
+ </itemizedlist>
+ <para>posix fallocate has no generic interface to call into the kernel</para>
+ <itemizedlist>
+ <listitem><para>current implementation just writes zeros from user space</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_ioctl - Bulkstat</title>
+ <para>bulkstat returns multiple inodes</para>
+ <itemizedlist>
+ <listitem><para>scans entire filesystem, no way to start at a particular directory
+ <itemizedlist>
+ <listitem><para>hence xfsdump cannot dump a directory</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>flags to pass in to use incore or ondisk inode clusters</para></listitem>
+ </itemizedlist>
+ <para>byhandle interfaces</para>
+ <itemizedlist>
+ <listitem><para>handles usually obtained from bulkstat</para></listitem>
+ <listitem><para>a handle is the combination of inum, igen and fsid</para></listitem>
+ <listitem><para>see DMAPI for more information on byhandle interfaces</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS sysctls - Daemons</title>
+ <para>fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000)</para>
+ <itemizedlist>
+ <listitem><para>The interval at which the xfssyncd thread flushes metadata out to disk. This thread will flush log activity out, and do some processing on unlinked inodes.</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.xfsbufd_centisecs (Min: 50 Default: 100 Max: 3000)</para>
+ <itemizedlist>
+ <listitem><para>The interval at which xfsbufd scans the dirty metadata buffers list.</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000)</para>
+ <itemizedlist>
+ <listitem><para>The age at which xfsbufd flushes dirty metadata buffers to disk.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS sysctls - Debug</title>
+ <para>fs.xfs.error_level (Min: 0 Default: 3 Max: 11)</para>
+ <itemizedlist>
+ <listitem><para>A volume knob for error reporting when internal errors occur.</para></listitem>
+ <listitem><para>This will generate detailed messages &amp; backtraces for filesystem shutdowns, for example.</para></listitem>
+ <listitem><para>Current threshold values are:</para>
+ <para><programlisting>
+XFS_ERRLEVEL_OFF: 0
+XFS_ERRLEVEL_LOW: 1
+XFS_ERRLEVEL_HIGH: 5</programlisting></para>
+ </listitem>
+ </itemizedlist>
+ <para>fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127)</para>
+ <itemizedlist>
+ <listitem><para>Causes certain error conditions to call BUG(). Value is a bitmask;</para></listitem>
+ <listitem><para>AND together the tags which represent errors which should cause panics:</para>
+ <para><programlisting>
+XFS_NO_PTAG 0
+XFS_PTAG_IFLUSH 0x00000001
+XFS_PTAG_LOGRES 0x00000002
+XFS_PTAG_AILDELETE 0x00000004
+XFS_PTAG_ERROR_REPORT 0x00000008
+XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010
+XFS_PTAG_SHUTDOWN_IOERROR 0x00000020
+XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040</programlisting></para>
+ </listitem>
+ </itemizedlist>
+ <para>This option is intended for debugging only.</para>
+ </section>
+ <section>
+ <title>XFS sysctls - Compatibility</title>
+ <para>fs.xfs.irix_symlink_mode (Min: 0 Default: 0 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Controls whether symlinks are created with mode 0777 (default) or whether their mode is affected by the umask (irix mode).</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.irix_sgid_inherit (Min: 0 Default: 0 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Controls files created in SGID directories</para></listitem>
+ <listitem><para>If the group ID of the new file does not match the effective group ID or one of the supplementary group IDs of the parent dir, the ISGID bit is cleared if the irix_sgid_inherit compatibility sysctl is set. </para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS sysctls – Attribute Inheritence</title>
+ <para>fs.xfs.inherit_sync (Min: 0 Default: 1 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Setting this to "1" will cause the "sync" flag set by the xfs_io(8) chattr command on a directory to be inherited by files in that directory.</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.inherit_nodump (Min: 0 Default: 1 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Setting this to "1" will cause the "nodump" flag set by the xfs_io(8) chattr command on a directory to be inherited by files in that directory.</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.inherit_noatime (Min: 0 Default: 1 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Setting this to "1" will cause the "noatime" flag set by the xfs_io(8) chattr command on a directory to be inherited by files in that directory.</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.inherit_nosymlinks (Min: 0 Default: 1 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Setting this to "1" will cause the "nosymlinks" flag set by the xfs_io(8) chattr command on a directory to be inherited by files in that directory.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS sysctls - Misc</title>
+ <para>fs.xfs.stats_clear (Min: 0 Default: 0 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Setting this to "1" clears accumulated XFS statistics in /proc/fs/xfs/stat. It then immediately resets to "0".</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.restrict_chown (Min: 0 Default: 1 Max: 1)</para>
+ <itemizedlist>
+ <listitem><para>Controls whether unprivileged users can use chown to "give away“ a file to another user.</para></listitem>
+ </itemizedlist>
+ <para>fs.xfs.rotorstep (Min: 1 Default: 1 Max: 256)</para>
+ <itemizedlist>
+ <listitem><para>In "inode32" allocation mode, this option determines how many files the allocator attempts to allocate in the same allocation group before moving to the next allocation group. The intent is to control the rate at which the allocator moves between allocation groups when allocating extents for new files.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Generic sysctls</title>
+ <para>dentry-state</para>
+ <itemizedlist>
+ <listitem><para>Number of directory entries</para></listitem>
+ <listitem><para>Number of unused entries</para></listitem>
+ <listitem><para>Reclaim &gt;secs when short on memory</para></listitem>
+ </itemizedlist>
+ <para>file-max</para>
+ <itemizedlist>
+ <listitem><para>Maximum number of files system wide</para></listitem>
+ </itemizedlist>
+ <para>file-nr</para>
+ <itemizedlist>
+ <listitem><para># files allocated</para></listitem>
+ <listitem><para>Number of files in use</para></listitem>
+ <listitem><para>Max number of files system wide</para></listitem>
+ </itemizedlist>
+ <para>inode-state</para>
+ <itemizedlist>
+ <listitem><para>Number of active inodes</para></listitem>
+ <listitem><para>Number of free inode entries</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Behaviours</title>
+ <para>A behaviour chain is a way to chain different operations.</para>
+ <para>The filesystem call stack typically</para>
+ <itemizedlist>
+ <listitem><para>enter the linux vfs level</para></listitem>
+ <listitem><para>calls the xfs equivalents which do little work</para></listitem>
+ <listitem><para>they call the behaviour VOP</para></listitem>
+ </itemizedlist>
+ <para>Each operation can choose to call the next operation in the chain or return</para>
+ <itemizedlist>
+ <listitem><para>it is not strictly a stack</para></listitem>
+ </itemizedlist>
+ <para>Each behaviour has an index which is where it wants to sit in the chain.</para>
+ <para>CXFS, dmapi and quotas use this to "intercept" requests.</para>
+ <para>New XFS features may add additional behaviours</para>
+ </section>
+ <section>
+ <title>Behaviours</title>
+ <mediaobject><imageobject>
+ <imagedata fileref="images/XFS-behaviors.png" />
+ </imageobject></mediaobject>
+ </section>
+ <section>
+ <title>Mount Path</title>
+ <para>Mounting an XFS filesystem has several steps</para>
+ <itemizedlist>
+ <listitem><para>xfs_fs_fill_superinxfs_super.c</para></listitem>
+ </itemizedlist>
+ <orderedlist>
+ <listitem><para>Allocate a bhv_vfs struct (vfs_allocate)</para></listitem>
+ <listitem><para>Setup initial behaviour module chain (bhv_insert_all_vfsops)</para></listitem>
+ <listitem><para>Parse mount options (bhv_vfs_parseargs)</para></listitem>
+ <listitem><para>Perform mount(bhv_vfs_mount)</para></listitem>
+ </orderedlist>
+ </section>
+ <section>
+ <title>Mount – Setup Behaviour Chain</title>
+ <para>See bhv_insert_all_vfsops in xfs_vfs.c</para>
+ <para>CXFS, DMAPI and Quotas can register with XFS so that their vfsops are loaded into the behaviour chain</para>
+ <para>This does module loading and reference counting</para>
+ <para>Each behaviour can also have custom operations that need to be loaded</para>
+ <itemizedlist>
+ <listitem><para>Specialised callouts in XFS to specific behaviour modules, if loaded</para></listitem>
+ <listitem><para>These are loaded in xfs_mount once we know module will be used</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount – Parse Mount Options</title>
+ <para>Each behaviour can grab options that are used by that behaviour module</para>
+ <itemizedlist>
+ <listitem><para>XFS does not need to know or understand additional mount options</para></listitem>
+ </itemizedlist>
+ <para>Behaviours may then remove themselves from the chain if they are not</para>
+ <itemizedlist>
+ <listitem><para>no dmi option so no need for dmapi</para></listitem>
+ <listitem><para>no quota options so no need for quotas</para></listitem>
+ <listitem><para>see bhv_remove_vfsops</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount – Actual Filesystem Mount</title>
+ <para>Implemented in xfs_mount in xfs_vfsops.c</para>
+ <para>Loads specialised behaviour operations for those modules in use</para>
+ <para>Opens up the log and realtime device</para>
+ <para>xfs_alloc_buftarg starts a kernel thread for delayed write buffers for each device</para>
+ <para>XFS then call xfs_start_flags that starts setting up the xfs_mount_t structure, everything we can do before doing I/O from the mount options</para>
+ <para>Then call xfs_readsb to read the super block and then xfs_finish_flags to compare the second part of the mount options to what was in the super block</para>
+ </section>
+ <section>
+ <title>Mount – Actual Filesystem Mount</title>
+ <para>Tell the buffers what the sector size is going to be with
+xfs_setsize_buftarg</para>
+ <para>Check to see if this device supports write barriers</para>
+ <para>Finally we call xfs_ioinit, which is a behaviour custom operation</para>
+ <itemizedlist>
+ <listitem><para>this one will call into CXFS if loaded for this filesystem</para></listitem>
+ </itemizedlist>
+ <para>xfs_ioinit calls xfs_mountfs to complete the mount</para>
+ </section>
+ <section>
+ <title>Mount - xfs_mountfs</title>
+ <para>Calls xfs_mount_common sets up additional mount_t fields from superbock</para>
+ <para>Check the end of the filesystem really does exist for each device</para>
+ <para>Initialise various data structures</para>
+ <itemizedlist>
+ <listitem><para>Number of read ahead buffers based on physical memory</para></listitem>
+ <listitem><para>inode and stripe alignment</para></listitem>
+ <listitem><para>allocate and initialise inode hash for this filesystem</para></listitem>
+ </itemizedlist>
+ <para>Validate root inode and link into super block</para>
+ <para>Set up the transactions and log, and do log recovery</para>
+ <para>Call out to quota custom ops to do the quota check</para>
+ </section>
+ <section>
+ <title>Transactions</title>
+ <para>Transactions are used to record metadata changes to the filesystem</para>
+ <para>Each transaction is an atomic change to the filesystem</para>
+ <para>Only in the core of XFS, not in the higher layers of XFS</para>
+ <para>After reserving space for a transaction, it is very difficult to cancel the transaction</para>
+ <itemizedlist>
+ <listitem><para>Calling routines will try to pull inodes incore, setup xfs_inode_t and dquots to avoid problems from here on</para></listitem>
+ <listitem><para>They must have references on any objects to be attached to the transaction</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Creating Transactions</title>
+ <para>A transaction is typically coded as</para>
+ <para>Create the incore structure for the transaction</para>
+ <para><programlisting>tp = xfs_trans_alloc(type);</programlisting></para>
+ <para>Reserve space for the transaction, quick lookup in mount_t structure</para>
+ <itemizedlist>
+ <listitem><para>can return ENOSPACE</para></listitem>
+ <listitem><para>reserved space can be large to cater for large ondisk structure changes</para></listitem>
+ <listitem><para>exceeding the reservation will cause XFS to dump a lot of diagnotistics before shutting down</para></listitem>
+ </itemizedlist>
+ <para><programlisting>error = xfs_trans_reserve(tp, data, log, rt, ...);</programlisting></para>
+ <para>Now make changes, allocate space, free space, etc.</para>
+ <para>Attach superblock/inode(s)/buffers etc, log ranges within these objects, typically via</para>
+ <para><programlisting>xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);</programlisting></para>
+ <para>Commit the transaction, copying data from that attached objects</para>
+ <para><programlisting>error = xfs_trans_commit(tp);</programlisting></para>
+ </section>
+ <section>
+ <title>In Core Logs</title>
+ <para>There are normally 8 in-core log buffers (iclogs)</para>
+ <itemizedlist>
+ <listitem><para>depends on memory of system</para></listitem>
+ <listitem><para>can be set by a mount option.</para></listitem>
+ </itemizedlist>
+ <para>An in-core log is written where</para>
+ <itemizedlist>
+ <listitem><para>it fills up</para></listitem>
+ <listitem><para>you get a synchronous op, more transactions are asynchronous</para></listitem>
+ <listitem><para>a sync the incore buffer is written</para></listitem>
+ </itemizedlist>
+ <para>When XFS receives an I/O completion XFS can unpin the first metadata buffers</para>
+ <itemizedlist>
+ <listitem><para>Once unpined they can be written to disk</para></listitem>
+ </itemizedlist>
+ <para>The active item list (AIL) is used to prevent the metadata buffers from being written multiple times if it is in multiple transactions.</para>
+ <para>Therefore, transactions and metadata buffers have a lifecycle.</para>
+ </section>
+ <section>
+ <title>Log Sequence Numbers</title>
+ <para>An LSN is the log sequence number</para>
+ <itemizedlist>
+ <listitem><para>64bit with two 32bit values</para></listitem>
+ <listitem><para>the first is the cycle number</para></listitem>
+ <listitem><para>the second is the block number</para></listitem>
+ </itemizedlist>
+ <para>The block number is assigned when it is committed</para>
+ <para>The cycle number is incremented each time we have cycled through the log</para>
+ <para>The metadata in the log is only the metadata that has changed, in theory, but the whole inode tends to be logged.</para>
+ <para>One of the flaws of the xfs logging, is that everything that changed is logged even if sometime later we changed that field again, we still log the original change.</para>
+ <para></para>
+ <itemizedlist>
+ <listitem><para>XFS holy grail is to avoid duplicates in the log</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>XFS Log Diagram</title>
+ <para>XXX insert pretty picture here</para>
+ </section>
+ <section>
+ <title>xfs_bmapi</title>
+ <para>Many routines within XFS have to allocate ondisk space</para>
+ <itemizedlist>
+ <listitem><para>metadata</para></listitem>
+ <listitem><para>inodes</para></listitem>
+ <listitem><para>extents</para></listitem>
+ </itemizedlist>
+ <para>This is all done through xfs_bmapi</para>
+ <itemizedlist>
+ <listitem><para>access extent map for reading</para></listitem>
+ <listitem><para>setup delayed allocation</para></listitem>
+ <listitem><para>perform actual allocation</para></listitem>
+ <listitem><para>convert unwritten extents to written extents</para></listitem>
+ </itemizedlist>
+ <para>If you trace calls through XFS xfs_bmapi is the centre of XFS</para>
+ <para>In write mode you are usually in a transaction</para>
+ <itemizedlist>
+ <listitem><para>except when doing delayed allocation, transaction pointer will be null</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_bmap_alloc</title>
+ <para>xfs_bmap_alloc is the switch between the different allocators</para>
+ <itemizedlist>
+ <listitem><para>normal (xfs_bmap_btalloc)</para></listitem>
+ <listitem><para>realtime (xfs_bmap_rtalloc)</para></listitem>
+ <listitem><para>filestreams</para></listitem>
+ </itemizedlist>
+ <para>Realtime uses two bitmaps</para>
+ <itemizedlist>
+ <listitem><para>one for free space</para></listitem>
+ <listitem><para>one for larger clusters of freespace</para></listitem>
+ </itemizedlist>
+ <para>Quota accounting is also done in bmap routines</para>
+ <para>inodes have two pointers to dquot's</para>
+ <itemizedlist>
+ <listitem><para>one for the user</para></listitem>
+ <listitem><para>one for the group project</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Memory Allocation</title>
+ <para>IRIX was very good at ensuring memory allocations succeeded</para>
+ <itemizedlist>
+ <listitem><para>XFS was written on IRIX</para></listitem>
+ </itemizedlist>
+ <para>Linux is not as good with memory allocations, so this has been the source of many XFS problems</para>
+ <para><programlisting>
+# head -2 /proc/slabinfo; grep –i xfs /proc/slabinfo
+# slabtop</programlisting></para>
+ </section>
+ <section>
+ <title>Memory allocations for transactions</title>
+ <para>If it is in a transaction, the memory allocation code will behave differently to try to ensure this critical thread does not sleep</para>
+ <itemizedlist>
+ <listitem><para>This flag is a generic linux change</para></listitem>
+ </itemizedlist>
+ <para>In some cases you could ask for many MBs of contiguous space</para>
+ <itemizedlist>
+ <listitem><para>Linux does not like this.</para></listitem>
+ </itemizedlist>
+ <para>You could have a whole lot of dirty page cache pages but in order to flush those out you have to call back into XFS which can allocate memory.</para>
+ <para>Recent changes to XFS means we are much better at managing memory allocation and helps us to avoid these issues</para>
+ <itemizedlist>
+ <listitem><para>2.6.17 and should be included in SLES10SP1</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Metadata Buffering</title>
+ <para>xfs_buf.{h,c} implements xfs_buf_t the XFS metadata buffer cache</para>
+ <itemizedlist>
+ <listitem><para>Multi-page buffers</para></listitem>
+ <listitem><para>Buffer “pinning”
+ <itemizedlist>
+ <listitem><para>Prevent them from being written even if “dirty”</para></listitem>
+ <listitem><para>Transaction log must be written first</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Several “private” buffer pointers</para></listitem>
+ <listitem><para>Locking, iodone semaphore for I/O waiters</para></listitem>
+ <listitem><para>Callbacks for: iodone, relse, pre-write</para></listitem>
+ </itemizedlist>
+ <para>In-core log buffers also implemented via xfs_buf_t</para>
+ <para>This causes some oddities since they use</para>
+ <itemizedlist>
+ <listitem><para>sub-buffer-sized I/Os</para></listitem>
+ <listitem><para>non-page-cache buffers</para></listitem>
+ </itemizedlist>
+ <para>Separate address space from bdev</para>
+ <itemizedlist>
+ <listitem><para>Prevents user space buffering from impacting metadata buffering</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Metadata I/O Completion</title>
+ <para>xfslogd/N</para>
+ <itemizedlist>
+ <listitem><para>per-CPU daemon</para></listitem>
+ <listitem><para>Threads that handle I/O completion work for iclog buffers
+ <itemizedlist>
+ <listitem><para>xlog_state_do_callbacks</para></listitem>
+ <listitem><para>multiple completions to unpin metadata buffers waiting for this transaction</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>and also metadata
+ <itemizedlist>
+ <listitem><para>xfs_buf_do_callbacks</para></listitem>
+ <listitem><para>typically, removing from AIL and freeing up buffer_item memory</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>xfsdatad/N</para>
+ <itemizedlist>
+ <listitem><para>similar idea for data path</para></listitem>
+ <listitem><para>very different between 2.4 and 2.6</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Delayed write buffers</title>
+ <para>xfsbufd</para>
+ <itemizedlist>
+ <listitem><para>kernel thread, one per filesystem device</para></listitem>
+ <listitem><para>buffers are time stamped when queued</para></listitem>
+ <listitem><para>xfsbufd walks the xfs_buftarg_t (“buffer target”) hash table finding delayed write buffers
+ <itemizedlist>
+ <listitem><para>default is every 5 seconds look for buffers more than 30 seconds old</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>metadata and log data specific, file data is handled differently</para></listitem>
+ </itemizedlist>
+ <para>Tweak the age at which unpinned and dirty metadata buffers will be considered for flushing</para>
+ <itemizedlist>
+ <listitem><para>/proc/sys/fs/xfs/age_buffer_centisecs</para></listitem>
+ </itemizedlist>
+ <para>Tunable daemon wakeup interval</para>
+ <itemizedlist>
+ <listitem><para>/proc/sys/fs/xfs/xfsbufd_centisecs</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>I/O Path</title>
+ <para>Has two parts</para>
+ <itemizedlist>
+ <listitem><para>code that handles read and write calls
+ <itemizedlist>
+ <listitem><para>both buffered and direct I/O</para></listitem>
+ <listitem><para>xfs_lrw.c</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>code that actually writes something out</para></listitem>
+ </itemizedlist>
+ <para>Uses Linux get_block_t interfaces and struct buffer_head</para>
+ <para>XFS code is different to other filesystems because of</para>
+ <itemizedlist>
+ <listitem><para>different locking</para></listitem>
+ <listitem><para>delayed allocation</para></listitem>
+ <listitem><para>dmapi</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>I/O Path - Locking</title>
+ <para>There are two locks within the linux inode</para>
+ <itemizedlist>
+ <listitem><para>the most interesting is the i_mutex</para></listitem>
+ <listitem><para>the second and inner most lock XFS does not use</para></listitem>
+ </itemizedlist>
+ <para>XFS will hold it for the entire buffered write call</para>
+ <para>This is not the case for direct I/O</para>
+ <itemizedlist>
+ <listitem><para>ext3/reiserfs will hold the i_mutex for the whole direct I/O which will serialise their direct I/O path.</para></listitem>
+ </itemizedlist>
+ <para>i_mutex is often taken outside of xfs as well</para>
+ <para>XFS also has the iolock and ilock mrlocks on the xfs inode</para>
+ <para>Must be taken in this order</para>
+ <itemizedlist>
+ <listitem><para>i_mutex</para></listitem>
+ <listitem><para>iolock</para></listitem>
+ <listitem><para>ilock</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>I/O Path - DMAPI Integration</title>
+ <para>DMAPI requires extra hooks for DMAPI events on read and writes to a file</para>
+ <itemizedlist>
+ <listitem><para>This code includes lots of branches and is not coded for to be enabled at compile time</para></listitem>
+ </itemizedlist>
+ <para>DMAPI also needs to perform invisible I/O to remove and replace the file data without changing the inode access/change/modification times</para>
+ </section>
+ <section>
+ <title>I/O Path 0 Delayed Allocation</title>
+ <para>Initial write reserves space only</para>
+ <itemizedlist>
+ <listitem><para>Must ensure that when write to disk occurs there is space available</para></listitem>
+ </itemizedlist>
+ <para>Allocation of real extents occurs when data is actually being written</para>
+ <itemizedlist>
+ <listitem><para>Data can be coalesced into much larger I/Os to disk</para></listitem>
+ <listitem><para>Allows allocator to allocate much larger extents than just individual I/O request sizes from the application</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>sync(2)</title>
+ <para>XFS implements an optimization to sync(2) of metadata:</para>
+ <itemizedlist>
+ <listitem><para>XFS will only force the log out, such that any dirty metadata that is incore is written to the log <emphasis>only</emphasis>, the metadata itself is <emphasis>not</emphasis> necessarily written</para></listitem>
+ <listitem><para>This is safe, since all change is ondisk</para></listitem>
+ <listitem><para>File data is guaranteed too (even barriers)</para></listitem>
+ </itemizedlist>
+ <para>Log and metadata are written to disk for</para>
+ <itemizedlist>
+ <listitem><para>freeze/thaw</para></listitem>
+ <listitem><para>remount ro</para></listitem>
+ <listitem><para>unmount</para></listitem>
+ </itemizedlist>
+ <para>Applications like grub have been bitten in the past, but fixed nowadays</para>
+ </section>
+ <section>
+ <title>Data writeout</title>
+ <para>Triggered by the VM subsystem calling into XFS</para>
+ <itemizedlist>
+ <listitem><para>xfs_aops.c
+ <itemizedlist>
+ <listitem><para>xfs_vm_writepage(s)</para></listitem>
+ <listitem><para>xfs_page_state_convert</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>Page cache pages attached to inodes via a radix-tree (2.6)</para>
+ <itemizedlist>
+ <listitem><para>inode->i_mapping</para></listitem>
+ <listitem><para>page->mapping</para></listitem>
+ </itemizedlist>
+ <para>XFS does its own writeout, sort of</para>
+ <itemizedlist>
+ <listitem><para>due to delayed allocation and unwritten extents</para></listitem>
+ <listitem><para>extent conversion requires a transaction</para></listitem>
+ </itemizedlist>
+ <para>Unlike write page, read path is mostly generic linux implementation</para>
+ </section>
+ <section>
+ <title>XFS writepage</title>
+ <para>Rewritten in 2.6</para>
+ <para>XFS tries very hard to cluster pages</para>
+ <itemizedlist>
+ <listitem><para>xfs_add_to_ioend</para></listitem>
+ <listitem><para>xfs_cluster_write</para></listitem>
+ </itemizedlist>
+ <para>This allows XFS to do a much smaller number of extent conversions</para>
+ <itemizedlist>
+ <listitem><para>rather than converting for every buffer head</para></listitem>
+ </itemizedlist>
+ <para>Uses struct bio for writing more than 1 page at a time</para>
+ </section>
+</chapter>
+
diff --git a/XFS_User_Guide/en-US/XFS-mkfs.xml b/XFS_User_Guide/en-US/XFS-mkfs.xml
new file mode 100644
index 0000000..7ed9e7e
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-mkfs.xml
@@ -0,0 +1,160 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-mkfs">
+ <title>mkfs</title>
+ <section>
+ <title>Creating XFS Filesystems</title>
+ <para>mkfs.xfs supports a large number of options for configuration a large number of different XFS filesystems</para>
+ <itemizedlist>
+ <listitem><para>See <command>mkfs.xfs(8)</command></para></listitem>
+ </itemizedlist>
+ <para>Units</para>
+ <itemizedlist>
+ <listitem><para>100s = 100 sectors = 100 x 512 bytes*</para></listitem>
+ <listitem><para>100b = 100 blocks = 100 x 4 kilobytes*</para></listitem>
+ <listitem><para>100k = 100 * 1024 bytes</para></listitem>
+ <listitem><para>Assuming 512 bytes sectors and 4 KB filesyste</para></listitem>
+ </itemizedlist>
+ <para>-N option can be used to show filesystem parameters without creating a filesystem</para>
+ <para>Also provides the capability to pre-initialise the filesystem with directories and inodes, which is useful for testing</para>
+ </section>
+ <section>
+ <title>mkfs – Allocation Block Size</title>
+ <para>Specify the fundamental block size of the filesystem.</para>
+ <para>The default value is 4096 bytes (4 KB), the minimum is 512, and the maximum is 65536 (64 KB).</para>
+ <para>XFS on Linux currently only supports pagesize or smaller blocks.</para>
+ <para>To create a filesystem with a block size of 2048 bytes you would use:</para>
+ <para><command>mkfs –b size=2048 device</command></para>
+ <para><emphasis>Smaller block sizes reduce wasted space for lots of small files.</emphasis></para>
+ </section>
+ <section>
+ <title>mkfs – Allocation groups</title>
+ <para>The data section of an XFS filesystem is divided into allocation groups</para>
+ <para>More allocation groups imply more parallelism when allocation blocks and inodes.</para>
+ <para>To create filesystem with 16 allocation groups you would use:</para>
+ <para><command>mkfs –d acount=16 device</command></para>
+ <para>To create a filesystem with fixed size allocation groups</para>
+ <para><command>mkfs –d agsize=4g device</command></para>
+ <para><emphasis>Filesystems with too few or too many allocation groups should be avoided.</emphasis></para>
+ </section>
+ <section>
+ <title>mkfs – Stripe Alignment</title>
+ <para>Aligning file data on stripe width boundaries can significantly improve performance on large RAIDs</para>
+ <itemizedlist>
+ <listitem><para>A 2MB write to filesystem with a 2MB stripe width and 512KB stripe unit will result in four
+ I/Os, one to each lun. Without alignment this would often require two I/Os to one disk,
+ and one I/O to the other three, taking longer than it should.</para></listitem>
+ </itemizedlist>
+ <para>To create a filesystem with a stripe unit of 1MB for an 8+1 RAID you would use:</para>
+ <para><command>mkfs –d sunit=2048,swidth=16384 device</command></para>
+ <para>or</para>
+ <para><command>mkfs –d su=1m,sw=8m device</command></para>
+ </section>
+ <section>
+ <title>mkfs – Unwritten Extents</title>
+ <para>Unwritten extents are used to support pre-allocation.</para>
+ <para>Default is enabled.</para>
+ <para>To disable unwritten extents you would use:</para>
+ <para><command>mkfs –d unwritten=0 device</command></para>
+ <para><emphasis>Filesystem write performance may be negatively affected for unwritten file extents,
+ since extra filesystem transactions are required to convert extent flags for the range
+ of the file written.</emphasis></para>
+ </section>
+ <section>
+ <title>mkfs – Inode Options</title>
+ <para>The mkfs inode options allow the user to change</para>
+ <itemizedlist>
+ <listitem><para>The size of the inode from the default 256 bytes to up 2048 bytes</para></listitem>
+ <listitem><para>The maximum number of inodes in the filesystem, defaults to 25%</para></listitem>
+ <listitem><para>Extended attribute allocation policy</para></listitem>
+ </itemizedlist>
+ <para>These options may impact</para>
+ <itemizedlist>
+ <listitem><para>where the inode is allocated in filesystem</para></listitem>
+ <listitem><para>how much data needs to be read from disk to read the inode</para></listitem>
+ <listitem><para>how much data may be associated with the inode before data goes out of line</para></listitem>
+ </itemizedlist>
+ <para>To allocate 512 bytes to each inode:</para>
+ <para><command>mkfs –i size=512 device</command></para>
+ </section>
+ <section>
+ <title>mkfs – Extended Attributes</title>
+ <para>Specify the version of extended attribute inline allocation policy to be used.</para>
+ <para>Default is zero, when extended attributes are used for the first time the version
+ will be set to either one or two.</para>
+ <para>Version two uses a more efficient algorithm for managing the available inline inode space
+ than version one, however, for backward compatibility, version one is selected by default.</para>
+ <para>To force the use of version two extended attributes you would use:</para>
+ <para><command>mkfs –i attr=2 device</command></para>
+ </section>
+ <section>
+ <title>mkfs – Naming options</title>
+ <para>Specify the version and size parameters for the naming (directory) area of the filesystem.</para>
+ <para>The naming (directory) version is 1 or 2, defaulting to 2 if unspecified.</para>
+ <para>XFS on Linux does not support naming (directory) version 1.</para>
+ <para>To create a filesystem with a directory block size of 16KB you would use:</para>
+ <para><command>mkfs –n size=16384 device</command></para>
+ </section>
+ <section>
+ <title>mkfs – External Log</title>
+ <para>The journal log can be on a different device to the rest of the filesystem</para>
+ <itemizedlist>
+ <listitem><para>At least 512 blocks.</para></listitem>
+ <listitem><para>No more than 64K blocks or 128MB, whichever is smaller</para></listitem>
+ <listitem><para>Defaults to maximum size for >1TB filesystems</para></listitem>
+ </itemizedlist>
+ <para>Log device could be a device with better IOPS performance</para>
+ <itemizedlist>
+ <listitem><para>15K RPM disk or battery-backed memory</para></listitem>
+ </itemizedlist>
+ <para><command>mkfs.xfs –l logdev=log_device device</command></para>
+ <para><command>mount –o logdev=log_device device path</command></para>
+ <para>XXX Image goes here</para>
+ </section>
+ <section>
+ <title>mkfs - Realtime</title>
+ <para>Originally designed for media streaming requiring predictable latencies</para>
+ <itemizedlist>
+ <listitem><para>Realtime volume tuned for large files without small inode clusters</para></listitem>
+ </itemizedlist>
+ <para>Metadata and file data on separate volumes</para>
+ <itemizedlist>
+ <listitem><para>Bitmap allocator only has to manage file data allocations</para></listitem>
+ </itemizedlist>
+ <para><command>mkfs.xfs –l logdev=log_device –r rtdev=rt_device device</command></para>
+ <para><command>mount –o logdev=log_device,rtdev=rt_device device path</command></para>
+ <para><emphasis>rt_device</emphasis> is the device for the file data, device is for the metadata</para>
+ <para>Receives limited testing and support in Linux</para>
+ <para>XXX Image goes here</para>
+ </section>
+ <section>
+ <title>mkfs – Filesystem Image</title>
+ <para>mkfs allows you to create a filesystem as a regular file</para>
+ <para>This can be used to create a filesystem on a loop-back device</para>
+ <para><command>mkfs –d file=1,name=filename,size=2g filename</command></para>
+ </section>
+ <section>
+ <title>mkfs – Sector Size</title>
+ <para>Specifies the fundamental sector size of the filesystem.</para>
+ <para>Default value is 512 bytes.</para>
+ <para>The minimum value for sector size is 512; the maximum is 32768 (32 KB) or the filesystem block size (whichever is smaller).</para>
+ <para>To create a filesystem on a device that has a sector size of 1KB you would use:</para>
+ <para><command>mkfs –s size=1024 device</command></para>
+ </section>
+ <section>
+ <title>mkfs – Filesystem Label</title>
+ <para>Set the filesystem label.</para>
+ <para>XFS filesystem labels can be at most 12 characters long.</para>
+ <para>To create a filesystem and specify the label you would use:</para>
+ <para><command>mkfs –L label device</command></para>
+ </section>
+ <section>
+ <title>mkfs – Prototype Filesystem</title>
+ <para>The –p option to mkfs allows you to specify a prototype file</para>
+ <para>The prototype file lists inodes and their metadata that mkfs will add to the filesystem when it is created</para>
+ <para>Since the filesystem is not mounted at this time no logging is required, so mkfs can create millions
+ of inodes at a much faster rate than on a live filesystem</para>
+ <para>This is mainly used for testing XFS when lots of inodes are required</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-monitoring.xml b/XFS_User_Guide/en-US/XFS-monitoring.xml
new file mode 100644
index 0000000..a002e5e
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-monitoring.xml
@@ -0,0 +1,142 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-monitoring">
+ <title>XFS Monitoring</title>
+ <section>
+ <title>Monitoring</title>
+ <para>A lot of performance and utilisation data can be collected</para>
+ <itemizedlist>
+ <listitem><para>Generic filesystem and memory statistics</para></listitem>
+ <listitem><para>Specific XFS metrics</para></listitem>
+ </itemizedlist>
+ <para>There are a range of tools that can be used</para>
+ <itemizedlist>
+ <listitem><para>/proc/*</para></listitem>
+ <listitem><para>sar</para></listitem>
+ <listitem><para>vmstat</para></listitem>
+ <listitem><para>top, topsys</para></listitem>
+ <listitem><para>Performance Co-Pilot</para></listitem>
+ <listitem><para>etc.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Inodes</title>
+ <para><programlisting>watch grep inode /proc/slabinfo</programlisting></para>
+ <para><programlisting>slabtop -s c</programlisting></para>
+ <itemizedlist>
+ <listitem><para>Monitor the slab</para></listitem>
+ </itemizedlist>
+ <para><programlisting>sar -v</programlisting></para>
+ <itemizedlist>
+ <listitem><para>inode statistics collected by sadc</para></listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>PCP Inode Metrics</title>
+ <para><programlisting>
+ig_attempts # of looks for inode in memory
+ig_found # of times inode found in memory
+ig_frecycle # of fails because inode was busy
+ig_misses # of times had to go to disk for inode
+ig_dup # times missed but found from another
+ig_reclaims # of times recyled the inode’s memory
+ig_attrchngx # of times changed inode attributes
+iflush_count # of times inodes are being flushed
+icluster_flushcnt # of times inodes clustered
+icluster_flushinode # of times not able to inode cluster</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP Directory Metrics</title>
+ <para><programlisting>
+lookup # of file name directory lookups
+create # of directory entry creations
+remove # of directory entry removes
+getdents # of “getdent” operations</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP File Attribute Metrics</title>
+ <para><programlisting>
+attr.get # of “get” operations
+attr.set # of “set” operations
+attr.remove # of “remove” operations
+attr.list # of “list” operations</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP Allocation Metrics</title>
+ <para><programlisting>
+allocs.alloc_extent # of extents allocated
+allocs.alloc_block # of blocks allocated
+allocs.free_extent # of extents freed
+allocs.free_block # of blocks freed
+alloc_btree.lookup # of allocation btree lookups
+alloc_bteee.compare # of compares in alloc btree lookup
+alloc_btree.insrec # of extent record inserts in btree
+alloc_btree.delrec # of extent record deletes in btree</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP Block Map Metrics</title>
+ <para><programlisting>
+block_map.read_ops # of block map reads
+block_map.write_ops # of block map writes
+block_map.unmap # of block delete operations
+block_map.add_exlist # of extent list insertions for files
+block_map.del_exlist # of extent list deletions
+block_map.look_exlist # of extent list lookups
+block_map.cmp_exlist # of extent list compares
+bmap_btree.lookup # of block map btree lookups
+bmap_btree.compare # of block map compares
+bmap_btree.insrec # of block map insertions
+bmap_btree.delrec # of block map deletions</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP Journaling Metrics</title>
+ <para><programlisting>
+transaction.sync # of transactions waiting to be committed
+transaction.async # of async transactions waiting
+transaction.empty # of transactions that did not do anything
+log.writes # of log buffer writes
+log.blocks # of log blocks written
+log.noiclogs # of log entry attempts during memory flush
+log.force # of calls to xfs_log_force
+log.force_sleep # of calls to xs_log_force_sleep</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP AIL Metrics</title>
+ <para><programlisting>
+push_ail.pushes # of times the AIL is moved forward
+push_ail.success # of times sucessful
+push_ail.pushbuf # of times inode locked – pushbuf called
+push_ail.pinned # of times pinned
+push_ail.locked # of times locked
+push_ail.flushing # of times ail was flushing
+push_ail.restarts # of log write restarts
+push_ail.flush # of times a log was forced</programlisting></para>
+ </section>
+
+ <section>
+ <title>PCP Quota Metrics</title>
+ <para><programlisting>
+reclaims # of disk quota reclaims
+reclaims_misses # of disk quota reclaim misses
+dquot_dups # of duplicates
+cachemisses # of times disk quota misses cache
+cachehits # of times disk quota in cache
+wants # of times dqwants called
+shake_reclaims # of shaked reclaims
+inact_reclaims # of inactive data reclaims</programlisting></para>
+ </section>
+
+ <section>
+ <title>xfsstats</title>
+ <para>xfsmisc/xfsstats.pl -f</para>
+ </section>
+</chapter>
+
diff --git a/XFS_User_Guide/en-US/XFS-mount.xml b/XFS_User_Guide/en-US/XFS-mount.xml
new file mode 100644
index 0000000..57fec9c
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-mount.xml
@@ -0,0 +1,199 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-mount">
+ <title>mount</title>
+ <section>
+ <title>Mounting XFS Filesystems</title>
+ <para>This section describes some XFS-specific mount options and how they affect the behaviour of XFS</para>
+ </section>
+ <section>
+ <title>Mount Options</title>
+ <para>Described in</para>
+ <itemizedlist>
+ <listitem><para>In linux tree:
+ <itemizedlist>
+ <listitem><para>Documentation/filesystems/xfs.txt</para></listitem>
+ <listitem><para>xfs/fs/xfs_vfsops.c</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para><command>mount(8)</command></para></listitem>
+ </itemizedlist>
+ <para>What options are specific to XFS?</para>
+ <para>What common Linux mount options does XFS not support?</para>
+ </section>
+ <section>
+ <title>Mount Options – Log &amp; Realtime Devices</title>
+ <para>Use an external log (metadata journal) device:</para>
+ <para><command>mount -o logdev=log_device device mountpoint</command></para>
+ <para>Use an external log (metadata journal) and real-time device:</para>
+ <para><command>mount -o logdev=log_device,rtdev=rt_device device mountpoint</command></para>
+ </section>
+ <section>
+ <title>Mount Options – 64bit Inodes</title>
+ <para>By default XFS uses 32bit inodes</para>
+ <itemizedlist>
+ <listitem><para>The inode’s number roughly equates to its location on disk
+ <itemizedlist>
+ <listitem><para>Combination of allocation group, cluster and block</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Inode on Linux is 32bit on 32bit machines
+ <itemizedlist>
+ <listitem><para>May change in future kernels</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Allocator will place 32bit inodes in the first terabyte
+ <itemizedlist>
+ <listitem><para>Using a larger inode size means less inodes per cluster allowing 32bit
+ inodes to be located beyond the first terabyte</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ <para>inode64 option on 64bit machines allows inodes to span the entire filesystem</para>
+ <itemizedlist>
+ <listitem><para>Allocator will try to put file extents in same allocation group as inode</para></listitem>
+ <listitem><para>Not all backup tools support 64bit inodes
+ <itemizedlist>
+ <listitem><para>Inode number used to identify file between backups</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount Options - Stripes</title>
+ <para>Specify the stripe unit and width for a RAID device or a stripe volume.</para>
+ <para>Values must be specified in 512-byte block units.</para>
+ <para>For example, to use a stripe unit of 1MB and a stripe width of 8MB:</para>
+ <para><command>mount -o sunit=2048,swidth=16384 device mountpoint</command></para>
+ <para><command>swalloc</command> option</para>
+ <itemizedlist>
+ <listitem><para>data allocations will be rounded up to stripe width boundaries when the
+ current end of file is being extended and the file size is larger than the
+ stripe width size.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount Options – Large I/O</title>
+ <para><command>largeio</command></para>
+ <itemizedlist>
+ <listitem><para>A filesystem that has a <command>swidth</command> specified will return the
+ <command>swidth</command> value (in bytes) in st_blksize</para></listitem>
+ <listitem><para>If the filesystem does not have a <command>swidth</command> specified but does
+ specify an <command>allocsize</command> then <command>allocsize</command>
+ (in bytes) will be returned instead.</para></listitem>
+ <listitem><para>If neither of these two options are specified, then filesystem will behave as
+ if <command>nolargeio</command> was specified.</para></listitem>
+ </itemizedlist>
+ <para><command>largeio</command></para>
+ <itemizedlist>
+ <listitem><para>The optimal I/O reported in <command>st_blksize</command> by <command>stat(2)</command>
+ will be as small as possible to allow user applications to avoid inefficient
+ read/modify/write I/O.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount Options – Performance Tweaks</title>
+ <para><command>osyncisdsync</command></para>
+ <itemizedlist>
+ <listitem><para>Writes to files opened with the O_SYNC flag set will behave as if the O_DSYNC
+ flag had been used instead.</para></listitem>
+ <listitem><para>This can result in better performance without compromising data safety.</para></listitem>
+ <listitem><para>However timestamp updates from O_SYNC writes can be lost if the system crashes.
+ Use osyncisosync to disable this setting.</para></listitem>
+ </itemizedlist>
+ <para><command>ihashsize</command></para>
+ <itemizedlist>
+ <listitem><para>Sets the number of hash buckets available for hashing the in-memory inodes of the
+ specified mount point.</para></listitem>
+ </itemizedlist>
+ <para><command>ikeep</command></para>
+ <itemizedlist>
+ <listitem><para>When inode clusters are emptied of inodes, keep them around on the disk.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount Options – Extended Attributes</title>
+ <para><command>attr2</command></para>
+ <itemizedlist>
+ <listitem><para>Enable the use of version two of the extended attribute inline allocation policy.</para></listitem>
+ </itemizedlist>
+ <para><command>noattr2</command></para>
+ <itemizedlist>
+ <listitem><para>Force the use of version one of the extended attribute inline allocation policy.</para></listitem>
+ </itemizedlist>
+ <para>When the new form is used for the first time (by setting or removing extended attributes)
+ the on-disk superblock feature bit field will be updated to reflect this format being in use.</para>
+ <para><command>mount -o attr2 device mountpoint</command></para>
+ </section>
+ <section>
+ <title>Mount Options – Group Ids</title>
+ <para>These options define what group ID a newly created file gets.</para>
+ <para><command>grpid/bsdgroups</command></para>
+ <itemizedlist>
+ <listitem><para>Take the group ID of the directory in which it is created</para></listitem>
+ </itemizedlist>
+ <para><command>nogrpid/sysvgroups</command></para>
+ <itemizedlist>
+ <listitem><para>Take the fsgid of the current process, unless the directory has the setgid bit
+ set, in which case it takes the gid from the parent directory, and also gets the
+ setgid bit set if it is a directory itself.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount Options – Recovery</title>
+ <para>An XFS filesystem can be mounted without running log recovery.</para>
+ <para>If the filesystem was not cleanly unmounted, it is likely to be inconsistent when mounted
+ in <command>norecovery</command> mode. Some files or directories may not be accessible because of this.</para>
+ <para>Filesystems mounted <command>norecovery</command> must be mounted read-only or the mount will fail.</para>
+ <para><command>mount -o ro,norecovery device mountpoint</command></para>
+ </section>
+ <section>
+ <title>Mount Options - Barriers</title>
+ <para>Write cache on disk can result in filesystem corruption since XFS is told the
+ log transaction has reached the disk when in fact it is still in the disk cache.</para>
+ <itemizedlist>
+ <listitem><para>A journal log assumes that the log transaction is updated on disk before
+ the metadata is updated, but this may not be true with write caching</para></listitem>
+ </itemizedlist>
+ <para>XFS is able to issue write barriers if the device supports it</para>
+ <itemizedlist>
+ <listitem><para>Ensures that the log entry is written before any other data</para></listitem>
+ </itemizedlist>
+ <para>Write barriers are enabled by default in SLES10</para>
+ <itemizedlist>
+ <listitem><para>Filesystem will attempt to determine is barriers are supported and will
+ issue a warning if they are not</para></listitem>
+ <listitem><para>The <command>nobarrier</command> option disables write barriers</para></listitem>
+ <listitem><para></para></listitem>
+ </itemizedlist>
+ <para>See</para>
+ <itemizedlist>
+ <listitem><para>http://oss.sgi.com/projects/xfs/faq.html#wcache</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mount Options – User/Group/Project Quotas</title>
+ <para>User disk quota accounting enabled, and limits (optionally) enforced.</para>
+ <para><command>mount -o uquota device mountpoint</command></para>
+ <para>Group disk quota accounting enabled, and limits (optionally) enforced.</para>
+ <para><command>mount -o grpquota device mountpoint</command></para>
+ <para>Project quota accounting enabled, and limits (optionally) enforced.</para>
+ <para><command>mount -o prjquota device mountpoint</command></para>
+ <para>Can optionally specify <command>uqnoenforce, gqnoenforce</command> and
+ <command>pqnoenforce</command> to use soft limits.</para>
+ </section>
+ <section>
+ <title>Mount Options – DMAPI</title>
+ <para><command>dmapi</command></para>
+ <itemizedlist>
+ <listitem><para>Enable the DMAPI (Data Management API) event callouts.</para></listitem>
+ </itemizedlist>
+ <para><command>mtpt</command></para>
+ <itemizedlist>
+ <listitem><para>Specify a value to be included in the DMAPI mount event, and should be
+ the path of the actual mountpoint that is used.</para></listitem>
+ </itemizedlist>
+ <para><command>mount -o dmapi,mtpt=mountpoint device mountpoint</command></para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-quotas.xml b/XFS_User_Guide/en-US/XFS-quotas.xml
new file mode 100644
index 0000000..6995a55
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-quotas.xml
@@ -0,0 +1,238 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-quotas">
+ <title>XFS Quotas</title>
+ <section>
+ <title>Quotas</title>
+ <para>Quotas provide a method for managing disk resources.</para>
+ <itemizedlist>
+ <listitem><para>Quotas can be used to report on disk usage.</para></listitem>
+ <listitem><para>Quotas can be used to control disk usage.</para></listitem>
+ </itemizedlist>
+ <para>Quotas manage filesystem resources in two ways.</para>
+ <itemizedlist>
+ <listitem><para>by Managing Disk Space (blocks)</para></listitem>
+ <listitem><para>by Managing the Number of Files (inodes)</para></listitem>
+ </itemizedlist>
+ <para>These resources can be managed on a per user, group or directory (project) basis.</para>
+ </section>
+ <section>
+ <title>Quota Types</title>
+ <para>Quotas can be tracked or enforced for</para>
+ <para>Users</para>
+ <itemizedlist>
+ <listitem><para>Manage the disk usage of individuals or system users.</para></listitem>
+ </itemizedlist>
+ <para>Groups</para>
+ <itemizedlist>
+ <listitem><para>Manage the disk usage of groups.</para></listitem>
+ </itemizedlist>
+ <para>Projects</para>
+ <itemizedlist>
+ <listitem><para>Manage the disk usage of directories associated with a specific project.
+ Projects may cross organizational 'group' boundaries</para></listitem>
+ <listitem><para>Provide broader levels of control than available using user or group quotas.</para></listitem>
+ <listitem><para>Can be used to effectively shrink a file system allowing administrators to
+ reallocate disk space as needed.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Reporting Vs Enforcement</title>
+ <para>Quotas can be used to monitor disk usage and optionally enforce limits.</para>
+ <para>Quotas can be used to monitor disk usage across quota types.</para>
+ <itemizedlist>
+ <listitem><para>More efficient than using unix tools like du that must traverse the filesystem.</para></listitem>
+ <listitem><para>Quotas are maintained as the filesystem is used.</para></listitem>
+ </itemizedlist>
+ <para>Quotas can be used to enforce limits on users, groups or projects. Quota limits can prevent.</para>
+ <itemizedlist>
+ <listitem><para>Individual users consuming excessive resources.</para></listitem>
+ <listitem><para>Rogue processes bringing down a system or causing denial of services.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Enforcement (Limits)</title>
+ <para>There are two types of limits; Hard and Soft.</para>
+ <para>Soft limits are advisory.</para>
+ <itemizedlist>
+ <listitem><para>Allow additional disk resources to be consumed for a period of time.
+ this is known as the <emphasis>grace</emphasis> period.</para></listitem>
+ <listitem><para>Provide flexibility to users and processes that may occasionally
+ need to exceed there quota temporarily</para></listitem>
+ </itemizedlist>
+ <para>Hard Prevent further allocation of disk resources.</para>
+ <itemizedlist>
+ <listitem><para>Any I/O that attempt to allocate further disk resources is failed.</para></listitem>
+ <listitem><para>Existing data on the disk is preserved and existing disk allocations can
+ still be written.</para></listitem>
+ <listitem><para>Users must remove existing files to before new resources can be used.</para></listitem>
+ <listitem><para>Soft limits are be enforced as hard limits after the <emphasis>grace</emphasis> period.</para></listitem>
+ </itemizedlist>
+ <para>Limits are never applied to the <emphasis>root</emphasis> user.</para>
+ </section>
+ <section>
+ <title>Configuring Quotas</title>
+ <para>XFS quotas are enabled as filesystem mount options when the filesystem is mounted.</para>
+ <para>User, Group and Project quotas are enabled independently. Group and Project quotas are incompatible.</para>
+ <para>Each quota type can be specified as noenforce, in this case quota reporting will be maintained but not enforced.</para>
+ <para>Valid mount options are</para>
+ <itemizedlist>
+ <listitem><para>uquota, uqnoenforce - User quotas</para></listitem>
+ <listitem><para>gquota, gqnoenforce - Group quotas</para></listitem>
+ <listitem><para>pquota, pqnoenforce - Project quota</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_quota</title>
+ <para>Once quotas are configured the xfs_quota tool can be used to report on disk usage and set limits.</para>
+ <para>Quota operation is controlled by xfs_quota.</para>
+ <para><command>xfs_quota</command> has two modes of operation, basic and expert mode</para>
+ <itemizedlist>
+ <listitem><para>Basic mode includes commands for reporting disk usage to users</para></listitem>
+ <listitem><para>Expert mode (<command>xfs_quota -x</command>) contains advanced commands
+ that allow the modification of the quota system.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Quota Reporting</title>
+ <para><programlisting>
+> sudo xfs_quota -xc 'report -h' /home
+User quota on /home (/dev/hdb1)
+ Blocks
+User ID Used Soft Hard Warn/Grace
+---------- ---------------------------------
+root 4.6G 0 0 00 [------]
+testuser 103.4G 0 0 00 [------]
+...
+</programlisting></para>
+ <para>Running report as an ordinary user simply reports that users disk usage while running as
+ root allows the disk usage of all users to be reported.</para>
+ <para>Performance</para>
+ <itemizedlist>
+ <listitem><para>sudo xfs_quota -xc 'report -h' /home 0m0.287s</para></listitem>
+ <listitem><para>sudo du -hs /home 0m3.086s</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Quota Limits</title>
+ <para>User Limits</para>
+ <itemizedlist>
+ <listitem><para><command>limits xfs_quota -x -c 'limit bsoft=1000m bhard=1200m username'</command></para></listitem>
+ <listitem><para><command>limits xfs_quota -x -c 'limit isoft=500 ihard=700 username'</command></para></listitem>
+ </itemizedlist>
+ <para>Group Limits.</para>
+ <itemizedlist>
+ <listitem><para><command>xfs_quota -x -c 'limit -g bsoft=1000m bhard=1200m groupname'</command></para></listitem>
+ </itemizedlist>
+ <para>Project Limits</para>
+ <itemizedlist>
+ <listitem><para>Project controlled directories are first added to /etc/projects. Project names are
+ optionally added to /etc/projid to provide an id/name mapping.</para></listitem>
+ <listitem><para><command>xfs_quota -c 'project -s projectname'</command> is run to
+ initialize project directories.</para></listitem>
+ <listitem><para><command>xfs_quota -x -c 'limit -p bsoft=1000m bhard=1200m projectname'</command></para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Enabling/Disabling Quotas</title>
+ <para>xfs_quota can be used to temporarily or permanently disable quotas on a filesystem
+ using the following commands:</para>
+ <itemizedlist>
+ <listitem><para>disable – Temporarily disable quota enforcement.</para></listitem>
+ <listitem><para>enable – Enable quota enforcement. Used to enable quotas if they have
+ been disabled or the filesystem was mounted with qnoenforce.</para></listitem>
+ <listitem><para>off – Switch off quota management quotas can only be re-enabled by un-mounting
+ and remounting the filesystem
+ <itemizedlist>
+ <listitem><para>Limit information is preserved</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>remove – remove quota extents from a filesystem. All quota limits are destroyed.</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Expert xfs commands</title>
+ <para>xfs_quota also contains commands to</para>
+ <itemizedlist>
+ <listitem><para>Summarise the state of xfs quotas on a system using the
+ <emphasis>state</emphasis> command.</para></listitem>
+ <listitem><para>Manipulate the grace period using the <emphasis>timer</emphasis> command.</para></listitem>
+ <listitem><para>Backup and restore the quota information contained in a filesystem using
+ the <emphasis>dump</emphasis> and <emphasis>restore</emphasis> commands.
+ These commands are also used internally by xfsdump</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Generic Quota Tools</title>
+ <para>In addition to xfs_quota xfs also works with generic quota tools provided on Linux.</para>
+ <para>These tools include</para>
+ <itemizedlist>
+ <listitem><para>quota</para></listitem>
+ <listitem><para>repquota</para></listitem>
+ <listitem><para>quotactl</para></listitem>
+ <listitem><para>edquota</para></listitem>
+ <listitem><para>quotacheck</para></listitem>
+ <listitem><para>setquota</para></listitem>
+ <listitem><para>quotaon/quotaoff (enforcement only)</para></listitem>
+ <listitem><para>quotawarn</para></listitem>
+ </itemizedlist>
+ <para>The generic tools to not understand XFS project quotas.</para>
+ </section>
+ <section>
+ <title>Providing user feedback</title>
+ <para>Usually systems are configured to provide a level of feedback to users if they exceed their quota limits.</para>
+ <para>The most common method for informing users is to send email using the quotawarn command
+ from the generic quota package.</para>
+ <itemizedlist>
+ <listitem><para>Quotawarn is often run as a cron job daily.</para></listitem>
+ </itemizedlist>
+ <para>Feedback can be provided for interactive users by running “xfs_quota -c quota” in users
+ login scripts (/etc/bash.bashrc.local for example).</para>
+ </section>
+ <section>
+ <title>Implementation</title>
+ <para>Quota operations and data are treated as first-class operations in XFS</para>
+ <itemizedlist>
+ <listitem><para>xfs quotas are implemented as part of the filesystem metadata instead of
+ maintaining quota data in a file within filesystem</para></listitem>
+ <listitem><para>Quota changes are journaled</para></listitem>
+ </itemizedlist>
+ <para>Quotas are updated in realtime as the filesystem is changed. No “quota checks” need to be run.</para>
+ </section>
+ <section>
+ <title>Implementation – Project Quotas.</title>
+ <para>Project quotas are implemented using the group quota inode. This excludes project
+ and group quotas from being enabled at the same time.</para>
+ <para>Project configuration information is stored in /etc/projects and /etc/projid.</para>
+ <para>xfs_quota -s projectname initializes the project id in inodes contained under
+ directories specified in /etc/projects.</para>
+ </section>
+ <section>
+ <title>Quotas Ondisk</title>
+ <para>xfs_db can be used to understand the internals of the quota implementation.</para>
+ <para>Quota inodes can be seen in the filesystem superblock</para>
+ <para><programlisting>
+# xfs_db -xr -c sb -c p /dev/hdb1
+...
+uquotino = 131
+gquotino = 148
+# xfs_db -xr -c 'inode 131' -c p /dev/hdb1</programlisting></para>
+ <para></para>
+ </section>
+ <section>
+ <title>Quotas Ondisk</title>
+ <para>Individual quota entries can be viewed with xfs_db's dquot command.</para>
+ <para><programlisting># xfs_db -xr -c 'dquot username' -c p /dev/hdb1</programlisting></para>
+ <para><programlisting># xfs_db -xr -c 'dquot -p projectname' -c p /dev/hdb1</programlisting></para>
+ <para>inodes can be interrogated to determine which project they belong to.</para>
+ <para><programlisting>
+> ls -ia
+> sudo xfs_db -xr -c 'inode 675234191' -c p /dev/hdb1
+...
+core.projid = 33
+core.uid = 0
+core.gid = 0</programlisting></para>
+ </section>
+</chapter>
+
diff --git a/XFS_User_Guide/en-US/XFS-repair.xml b/XFS_User_Guide/en-US/XFS-repair.xml
new file mode 100644
index 0000000..e28fcd9
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-repair.xml
@@ -0,0 +1,211 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-repair">
+ <title>XFS Repair</title>
+ <section>
+ <title>Filesystems can be corrupted by</title>
+ <para>• Filesystems can be corrupted by</para>
+ <itemizedlist>
+ <listitem><para>Hardware Errors
+ <itemizedlist>
+ <listitem><para>Media errors are common</para></listitem>
+ <listitem><para>Disks are getting bigger and bigger</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>To a much lesser degree, bugs in the filesystem</para></listitem>
+ </itemizedlist>
+ <para>Filesystems are able to “repair” themselves since they consist of lists, links
+ and reference counts that can be validated</para>
+ <itemizedlist>
+ <listitem><para>But not all information is always recovered, inodes that do not have a
+ parent directory is common due to the directory structure being corrupted</para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_check</title>
+ <para>xfs_check is a script that runs xfs_db to do a filesystem check.</para>
+ <para>The "check" command in xfs_db scans all the metadata structures for inconsistency</para>
+ <para>xfs_check uses a different codebase to xfs_repair</para>
+ <itemizedlist>
+ <listitem><para>xfs_check and xfs_repair can be used to cross check each other
+ <itemizedlist>
+ <listitem><para>xfs_check vs xfs_repair -n)</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>xfs_repair</title>
+ <para>xfs_repair scans the filesystem and corrects any problems encountered.</para>
+ <para>xfs_repair performs a scan and repair in seven phases.</para>
+ <para>Each phase relies on the previous phase to fix a certain class of potential errors.</para>
+ <para>xfs_repair uses libxfs which is a partial port of the XFS kernel code to user-space.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 1</title>
+ <para>Find, verify and fix superblocks.</para>
+ <para>If a superblock is not found, xfs_repair will stop.</para>
+ <para>Sets up a virtual mount structure for the common XFS code base (libxfs) to work from.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 2</title>
+ <para>Checks the AG header structures (AGI, AGF and AGFL) and scans the AGF and AGI btrees.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 3</title>
+ <para>Using the AGI btree from phase2, scan the inode tree, processing the unlinked list for
+ deleted inodes and finding possible missing inode clusters.</para>
+ <para>Walk all the found inodes, recording used filesytem blocks (extents).</para>
+ <para>For directory inodes, scan the directory structure for more lost inodes.</para>
+ <para>Any bad inodes are trashed including unrecoverable corrupted directories.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 4</title>
+ <para>Scan inode extents again. Any inode with an extent covering used data is trashed.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 5</title>
+ <para>Rebuild AG headers and structures including the AGI btree, AGF btrees and AGFL
+ regardless whether any errors have been found or not.</para>
+ <para>Realtime inodes are also reconstructed.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 6</title>
+ <para>At this stage, the filesytem is in a mountable state.</para>
+ <para>Scan the directories analysing all data.</para>
+ <itemizedlist>
+ <listitem><para>Any directories with any corruption are rebuilt with whatever entries can be recovered.</para></listitem>
+ <listitem><para>A missing root directory is recreated.</para></listitem>
+ <listitem><para>All inodes that are in a directory are marked reached.</para></listitem>
+ </itemizedlist>
+ <para>At the end, any unreached inodes are put into lost+found.</para>
+ </section>
+ <section>
+ <title>xfs_repair – Phase 7</title>
+ <para>nlinks for inodes are corrected based on the data collected in phase 6.</para>
+ </section>
+ <section>
+ <title>Triaging xfs_check and xfs_repair problems</title>
+ <para>Mostofthetime,inodeinformationisrequired:</para>
+ <para><programlisting>
+> inode &lt;inode number&gt;
+> print
+</programlisting></para>
+ <para>The root inode number can be derived from the superblock:</para>
+ <para><programlisting>
+> sb 0
+> print rootino
+</programlisting></para>
+ <para>Fordirectories,wecanalsodumpthecontentsfromtheextentlistshownintheinode:</para>
+ <para><programlisting>
+> dblock &lt;file offset in blocks&gt;
+> print
+</programlisting></para>
+ <para>Directories have file offsets typically startingat 0, 8388608 and 16777216.
+ Each of these offsets stores different information for a directory.</para>
+ <para>The filename and inode numbers at 0, hash values at 8388608 and freespace information at 16777216.</para>
+ </section>
+ <section>
+ <title>xfs_repair and xfs_check should agree</title>
+ <para>If one of the tools reports a problem when the other passed the filesystem, there is
+ a problem with one of the tools</para>
+ <itemizedlist>
+ <listitem><para>most likely xfs_repair</para></listitem>
+ </itemizedlist>
+ <para>http://oss.sgi.com/bugzilla/show_bug.cgi?id=723</para>
+ <para>xfs_check finds some errors on the filesystem:</para>
+ <para><programlisting>
+link count mismatch for inode 387655 (name ?), nlink 0, counted 2
+link count mismatch for inode 13313696 (name ?), nlink 0, counted 2
+link count mismatch for inode 17197100 (name ?), nlink 0, counted 2
+</programlisting></para>
+ <para>xfs_repair reports no problems:</para>
+<para><programlisting>
+Phase 1 - find and verify superblock...
+Phase 2 - using internal log
+ - zero log...
+ - scan filesystem freespace and inode maps...
+ - found root inode chunk
+Phase 3 - for each AG...
+ - scan and clear agi unlinked lists...
+ - process known inodes and perform inode discovery...
+ - agno = 0
+ - agno=1
+ - agno = 2
+ - agno = 3
+ - agno = 4
+- process newly discovered inodes...
+Phase 4 - check for duplicate blocks...
+ - setting up duplicate extent list...
+ - clear lost+found (if it exists) ...
+ - clearing existing "lost+found" inode
+ - marking entry "lost+found" to be deleted
+ - check for inodes claiming duplicate blocks...
+ - agno=0
+ - agno=1
+ - agno=2
+ - agno=3
+ - agno=4
+Phase 5 - rebuild AG headers and trees...
+ - reset superblock...
+ - check inode connectivity...
+ - resetting contents of realtime bitmap and summary
+ - ensuring existence of lost+found directory
+ - traversing filesystem starting at / ...
+rebuilding directory inode 128
+ - traversal finished ...
+ - traversing all unattached subtrees ...
+ - traversals finished ...
+ - moving disconnected inodes to lost+found ...
+Phase 7 - verify and correct link counts...
+done</programlisting></para>
+ </section>
+ <section>
+ <title>Dump the offending inodes.</title>
+ <para><programlisting>
+# xfs_db -c "inode 387655" -c "print" /dev/sda6 core.magic = 0x494e
+core.mode = 040755
+core.version = 1
+core.format = 1 (local)
+core.nlinkv1 = 0
+...
+core.size = 6
+core.nblocks = 0
+core.extsize = 0
+core.nextents = 0
+...
+next_unlinked = null
+u.sfdir2.hdr.count = 0
+u.sfdir2.hdr.i8count = 0
+u.sfdir2.hdr.parent.i4 = 135</programlisting></para>
+ </section>
+ <section>
+ <title>Mount and Repair Fails – Corrupted Log</title>
+ <para>If the log is corrupted you will see an error like:</para>
+ <para><programlisting>
+# mount &lt;filesystem&gt;
+mount: Unknown error 990
+# dmesg | tail -20
+Filesystem “&lt;filesystem&gt;": xfs_inode_recover: Bad inode magic number . . .
+Filesystem "dm-0": XFS internal error xlog_recover_do_inode_trans(1) at line 2352 Caller 0xffffffff88307729
+XFS: log mount/recovery failed: error 990 XFS: log mount failed
+# xfs_repair &lt;device&gt;
+Phase 1 - find and verify superblock...
+Phase 2 - using internal log
+ - zero log...
+ERROR: The filesystem has valuable metadata changes in a log which needs to
+be replayed. Mount the filesystem to replay the log, and unmount it before
+re-running xfs_repair. If you are unable to mount the filesystem, then use
+the -L option to destroy the log and attempt a repair.
+Note that destroying the log may cause corruption -- please attempt a mount
+of the filesystem before doing this.</programlisting></para>
+ <para>Usefulinformationcanbecollectedfortriage:</para>
+ <para><programlisting>
+# /usr/sbin/xfs_logprint –C &lt;filename&gt; &lt;device&gt;
+# /usr/sbin/xfs_logprint -t &lt;device&gt;</programlisting></para>
+ <para>But in this case, the only option may be to throw the log away:</para>
+ <para><programlisting>
+# xfs_repair -L</programlisting></para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-triage.xml b/XFS_User_Guide/en-US/XFS-triage.xml
new file mode 100644
index 0000000..bbac922
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-triage.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-triage">
+ <title>XFS Triage</title>
+ <section>
+ <title>Triage</title>
+ <para>TODO</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-volumemgrs.xml b/XFS_User_Guide/en-US/XFS-volumemgrs.xml
new file mode 100644
index 0000000..e607174
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-volumemgrs.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-volume-managers">
+ <title>XFS and Volume Managers</title>
+ <section>
+ <title>XFS and Volume Managers</title>
+ <para>Using XFS with md, device mapper, software raid</para>
+ </section>
+</chapter>
diff --git a/XFS_User_Guide/en-US/XFS-xattr.xml b/XFS_User_Guide/en-US/XFS-xattr.xml
new file mode 100644
index 0000000..9d23d20
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS-xattr.xml
@@ -0,0 +1,115 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<chapter id="xfs-xattr">
+ <title>XFS Extended Attributes</title>
+ <section>
+ <title>Extended Attributes</title>
+ <para>Extended Attributes (EA) are a set of &lt;name,value&gt; pairs associated with an inode</para>
+ <para>Who uses them?</para>
+ <itemizedlist>
+ <listitem><para>Access Control Lists (ACL)</para></listitem>
+ <listitem><para>SELinux</para></listitem>
+ <listitem><para>Beagle indexer</para></listitem>
+ </itemizedlist>
+ <para>Name is a null terminated string &lt;= 255 chars</para>
+ <para>Value is binary data &lt;= 64K</para>
+ </section>
+ <section>
+ <title>EA Namespaces</title>
+ <para>The EA set is typically divided into namespaces</para>
+ <para>For Linux the namespace is the prefix of the EA name:</para>
+ <itemizedlist>
+ <listitem><para>user</para></listitem>
+ <listitem><para>trusted</para></listitem>
+ <listitem><para>security</para></listitem>
+ <listitem><para>System</para></listitem>
+ </itemizedlist>
+ <para>For XFS, the namespace is encoded in bits in a flags field with these values:</para>
+ <itemizedlist>
+ <listitem><para>“user” has value of 0x0000 – by default an attribute is in the user namespace</para></listitem>
+ </itemizedlist>
+ <para><programlisting>
+#define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */
+#define ATTR_SECURE 0x0008 /* use attrs in security namespace */
+#define ATTR_SYSTEM 0x0100 /* use attrs in system (pseudo) namespace */</programlisting></para>
+ <para>So for XFS, EAs are really a triple &lt;name, value, flags&gt;</para>
+ </section>
+ <section>
+ <title>EA Command Line Interface</title>
+ <para>attr package maintained by Andreas Gruenbacher and SGI</para>
+ <itemizedlist>
+ <listitem><para>getfattr(1) for getting/listing EAs</para></listitem>
+ <listitem><para>setfattr(1) for setting and removing EAs,</para></listitem>
+ <listitem><para>Names are prefixed with the namespace</para></listitem>
+ </itemizedlist>
+ <para>attr command sets/removes/gets/lists EAs</para>
+ <itemizedlist>
+ <listitem><para>Based on IRIX command, provides common interface for XFS EAs</para></listitem>
+ <listitem><para>Namespace specified with options</para></listitem>
+ <listitem><para>More closely models what XFS actually stores since names are the actual names</para></listitem>
+ </itemizedlist>
+ <para><programlisting>
+# getfattr -e hex -dm '.*' file1
+ system.posix_acl_access=0x0200000001000600ffffffff040006...
+ trusted.SGI_ACL_FILE=0x0000000400000001ffffffff0006...
+# attr -Rl file1
+ Attribute "SGI_ACL_FILE" has a 52 byte value for file1</programlisting></para>
+ </section>
+ <section>
+ <title>EA Ondisk Format</title>
+ <para>The name can actually be binary data since it has a length field on disk</para>
+ <itemizedlist>
+ <listitem><para>XFS kernel functions have been changed to handle binary names
+ (used for future parent pointer EA's)</para></listitem>
+ </itemizedlist>
+ <para>XFS EA's are stored in a variety of forms according to how big they are</para>
+ <itemizedlist>
+ <listitem><para>Local or short form
+ <itemizedlist>
+ <listitem><para>within the inode</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Attribute-fork extents in either
+ <itemizedlist>
+ <listitem><para>a filesystem leaf block</para></listitem>
+ <listitem><para>btree form with node blocks and leaf blocks</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>Extent form
+ <itemizedlist>
+ <listitem><para>the EA value can be in a remote filesystem block if it's large</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>EA Tuning</title>
+ <para>If using ACLs, every file access will require an EA lookup</para>
+ <para>For performance, it is important to keep the EA's within the inode in shortform</para>
+ <itemizedlist>
+ <listitem><para>Only a single filesystem block needs to be read in.</para></listitem>
+ <listitem><para>ACLs are a good example where the access checks occur frequently</para></listitem>
+ </itemizedlist>
+ <para>To increase the chance of being in shortform</para>
+ <itemizedlist>
+ <listitem><para>increase the inode size, and/or</para></listitem>
+ <listitem><para>enable attr2</para></listitem>
+ </itemizedlist>
+ <para><programlisting>mkfs.xfs –i size=512,attr=2 device</programlisting></para>
+ <para>The short-form EA resides at the end of the inode and competes for space with the data extents.</para>
+ </section>
+ <section>
+ <title>EA and Attr2</title>
+ <para>Attr2 overcomes a restriction in the initial EA implementation that divided up the
+ literal area at a fixed location (fork offset)</para>
+ <para>With attr2 the fork offset is variable</para>
+ <para>XXX Insert image</para>
+ </section>
+ <section>
+ <title>EA and Backup</title>
+ <para>Cpio and tar do not backup and restore extended attributes</para>
+ <para>If using extended attributes, an EA backup tool like xfsdump and xfsrestore must be used</para>
+ </section>
+</chapter>
+
diff --git a/XFS_User_Guide/en-US/XFS.xml b/XFS_User_Guide/en-US/XFS.xml
new file mode 100644
index 0000000..6a0b9bd
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS.xml
@@ -0,0 +1,43 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+]>
+<book>
+ <title>XFS Training</title>
+ <bookinfo>
+ <legalnotice>
+ <para>© Copyright 2006 Silicon Graphics Inc. All rights reserved.
+Permission is granted to copy, distribute, and/or modify this document
+under the terms of the Creative Commons Attribution-Share Alike, Version
+3.0 or any later version published by the Creative Commons Corp. A copy of
+the license is available at http://creativecommons.org/licenses/by-sa/3.0/us/ .</para>
+ </legalnotice>
+ </bookinfo>
+<part>
+ <title>XFS Training Docs</title>
+ <xi:include href="XFS-Background.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-Overview.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-build.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-build-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-mkfs.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-mount.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-mkfs-mount-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-allocators.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-allocators-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-xattr.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-xattr-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-quotas.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-quotas-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-internals.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-Filesystem-Structure.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-QA.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-QA-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-repair.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-repair-lab.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-triage.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-monitoring.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-dumprestore.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-DMAPI.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-volumemgrs.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+</part>
+
+</book>
diff --git a/XFS_User_Guide/en-US/XFS_User_Guide.ent b/XFS_User_Guide/en-US/XFS_User_Guide.ent
new file mode 100644
index 0000000..e7da0dd
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS_User_Guide.ent
@@ -0,0 +1,4 @@
+<!ENTITY PRODUCT "Documentation">
+<!ENTITY BOOKID "XFS_User_Guide">
+<!ENTITY YEAR "2010">
+<!ENTITY HOLDER "| You need to change the HOLDER entity in the en-US/XFS_User_Guide.ent file |">
diff --git a/XFS_User_Guide/en-US/XFS_User_Guide.xml b/XFS_User_Guide/en-US/XFS_User_Guide.xml
new file mode 100644
index 0000000..42d0636
--- /dev/null
+++ b/XFS_User_Guide/en-US/XFS_User_Guide.xml
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+]>
+<book>
+ <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-Background.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-Overview.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-build.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-mkfs.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-mount.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-allocators.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-xattr.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-quotas.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-internals.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-QA.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-repair.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-triage.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-monitoring.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-dumprestore.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-DMAPI.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="XFS-volumemgrs.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <index />
+</book>
+
diff --git a/XFS_User_Guide/publican.cfg b/XFS_User_Guide/publican.cfg
new file mode 100644
index 0000000..861b7f4
--- /dev/null
+++ b/XFS_User_Guide/publican.cfg
@@ -0,0 +1,7 @@
+# Config::Simple 4.59
+# Wed Mar 10 15:34:10 2010
+
+xml_lang: en-US
+type: Book
+brand: common
+