diff options
author | Dave Chinner <dchinner@redhat.com> | 2014-02-11 16:09:16 +1100 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2014-02-11 16:09:16 +1100 |
commit | 8421062d4613f71f1c3fec2ee68b6a806cc40e3c (patch) | |
tree | 77cd8bab24dab654b3acd2b6aa52332620b8de5e | |
parent | 6274cfacddc4598c2bee871bab8c2d1b65038c0f (diff) | |
download | xfs-documentation-8421062d4613f71f1c3fec2ee68b6a806cc40e3c.tar.gz |
doc: import XFS Filesystem Structure documentation
This is pulled in from the xml format documents that are present in
git://git.kernel.org/pub/scm/fs/xfs/xfsdocs-xml-dev.git. They are
converted to asciidoc format and a makefile infrastructure is built
around the newly imported design documentation.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
64 files changed, 10337 insertions, 3 deletions
diff --git a/design/Makefile b/design/Makefile index eab25ba..29b9539 100644 --- a/design/Makefile +++ b/design/Makefile @@ -1,6 +1,12 @@ # # design documentation build rules # +SUBDIRS=XFS_Filesystem_Structure + +# Never blow away subdirs +.PRECIOUS: $(SUBDIRS) +.PHONY: $(SUBDIRS) + DOCFILES=$(wildcard *.asciidoc) HTML_TARGETS=$(addsuffix .html, $(basename $(DOCFILES))) @@ -14,11 +20,25 @@ PDF_TARGETS=$(addsuffix .pdf, $(basename $(DOCFILES))) @echo "[pdf] $*" $(Q)a2x -f pdf $< -all: html pdf +default: html pdf $(SUBDIRS) + +$(SUBDIRS): + @echo "Building $@" + $(Q)$(MAKE) $(MAKEOPTS) -q -C $@ || $(MAKE) $(MAKEOPTS) -C $@ html: $(HTML_TARGETS) pdf: $(PDF_TARGETS) -clean: - @rm -f *.html *.css +# manually construct build dependencies for target builds so that modification +# of individual files will trigger a rebuild of the document correctly. +$(PDF_TARGETS): $(DOCFILES) + +$(HTML_TARGETS): $(DOCFILES) + +clean: $(addsuffix -clean, $(SUBDIRS)) + $(Q)rm -f *.html *.pdf *.css + +%-clean: + @echo "Cleaning $*" + $(Q)$(MAKE) $(MAKEOPTS) -C $* clean diff --git a/design/XFS_Filesystem_Structure/Makefile b/design/XFS_Filesystem_Structure/Makefile new file mode 100644 index 0000000..359dd98 --- /dev/null +++ b/design/XFS_Filesystem_Structure/Makefile @@ -0,0 +1,34 @@ +# +# design documentation build rules +# +TARGET=xfs_filesystem_structure + +DOCFILES=$(wildcard *.asciidoc) \ + docinfo.xml + +HTML_TARGET=$(addsuffix .html, $(TARGET)) +PDF_TARGET=$(addsuffix .pdf, $(TARGET)) + +default: html pdf + +%.html: %.asciidoc + @echo "[html] $*" + $(Q)a2x -f xhtml -d book $< + +%.pdf: %.asciidoc + @echo "[pdf] $*" + $(Q)a2x -f pdf -d book $< + +html: $(HTML_TARGET) + +pdf: $(PDF_TARGET) + +# manually construct build dependencies for target builds so that modification +# of individual files will trigger a rebuild of the document correctly. +$(PDF_TARGET): $(DOCFILES) + +$(HTML_TARGET): $(DOCFILES) + +clean: + $(Q)rm -f *.html *.pdf *.css + diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc new file mode 100644 index 0000000..a3721c2 --- /dev/null +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -0,0 +1,782 @@ +[[Allocation_Groups]] += Allocation Groups + +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^31^), regardless of the underlying +device's sector size. + +Each AG has the following characteristics: + + * A super block describing overall filesystem info + * Free space management + * Inode allocation and tracking + +Having multiple AGs allows XFS to handle most operations in parallel without +degrading performance as the number of concurrent accessing increases. + +The only global information maintained by the first AG (primary) is free spac e +across the filesystem and total inode counts. If the ++XFS_SB_VERSION2_LAZYSBCOUNTBIT+ flag is set in the superblock, these are only +updated on-disk when the filesystem is cleanly unmounted (umount or shutdown). + +Immediately after a mkfs.xfs, the primary AG has the following disk layout the +subsequent AGs do not have any inodes allocated: + +.Allocation group layout +image::images/6.png[] + +Each of these structures are expanded upon in the following sections. + +[[Superblocks]] +== Superblocks + +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. + +The superblock is defined by the following structure. The description of each +field follows. + +TODO: update for v5 formats. + +[source, c] +---- +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; +}; +---- +.sb_magicnum +Identifies the filesystem. It's value is +XFS_SB_MAGIC = 0x58465342 "XFSB"+. + +.sb_blocksize +The size of a basic unit of space allocation in bytes. Typically, this is 4096 +(4KB) but can range from 512 to 65536 bytes. + +.sb_dblocks +Total number of blocks available for data and metadata on the filesystem. + +.sb_rblocks +Number blocks in the real-time disk device. Refer to +xref:Real-time_Devices[real-time sub-volumes] for more information. + +.sb_rextents +Number of extents on the real-time device. + +.sb_uuid +UUID (Universally Unique ID) for the filesystem. Filesystems can be mounted by +the UUID instead of device name. + +.sb_logstart +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). + +.sb_rootino +Root inode number for the filesystem. Typically, this is 128 when using a +4KB block size. + +.sb_rbmino +Bitmap inode for real-time extents. + +.sb_rsumino +Summary inode for real-time bitmap. + +.sb_rextsize +Realtime extent size in blocks. + +.sb_agblocks +Size of each AG in blocks. For the actual size of the last AG, refer to the +xref:AG_Free_Space_Management[free space] +agf_length+ value. + +.sb_agcount +Number of AGs in the filesystem. + +.sb_rbmblocks +Number of real-time bitmap blocks. + +.sb_logblocks +Number of blocks for the journaling log. + +.sb_versionnum +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 flagsi +indicate features introduced over time. The value must be 4 including the +following flags: + +.Version 4 Superblock version flags +[options="header"] +|===== +| Flag | Description +| +XFS_SB_VERSION_ATTRBIT+ | Set if any inode have extended attributes. +| +XFS_SB_VERSION_NLINKBIT+ | Set if any inodes use 32-bit di_nlink values. +| +XFS_SB_VERSION_QUOTABIT+ | +Quotas are enabled on the filesystem. This +also brings in the various quota fields in the superblock. + +| +XFS_SB_VERSION_ALIGNBIT+ | Set if sb_inoalignmt is used. +| +XFS_SB_VERSION_DALIGNBIT+ | Set if sb_unit and sb_width are used. +| +XFS_SB_VERSION_SHAREDBIT+ | Set if sb_shared_vn is used. +| +XFS_SB_VERSION_LOGV2BIT+ | Version 2 journaling logs are used. +| +XFS_SB_VERSION_SECTORBIT+ | Set if sb_sectsize is not 512. +| +XFS_SB_VERSION_EXTFLGBIT+ | Unwritten extents are used. This is always set. +| +XFS_SB_VERSION_DIRV2BIT+ | +Version 2 directories are used. This is always set. + +| +XFS_SB_VERSION_MOREBITSBIT+ | +Set if the sb_features2 field in the superblock contains more flags. +|===== + +.sb_sectsize +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. + +.sb_inodesize +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. + +.sb_inopblock +Number of inodes per block. This is equivalent to +sb_blocksize / sb_inodesize+. + +.sb_fname[12] +Name for the filesystem. This value can be used in the mount command. + +.sb_blocklog +log~2~ value of +sb_blocksize+. In other terms, +sb_blocksize = 2^sb_blocklog^+. + +.sb_sectlog +log~2~ value of +sb_sectsize+. + +.sb_inodelog +log~2~ value of +sb_inodesize+. + +.sb_inopblog +log~2~ value of +sb_inopblock+. + +.sb_agblklog +log~2~ value of +sb_agblocks+ (rounded up). This value is used to generate inode +numbers and absolute block numbers defined in extent maps. + +.sb_rextslog +log~2~ value of +sb_rextents+. + +.sb_inprogress +Flag specifying that the filesystem is being created. + +.sb_imax_pct +Maximum percentage of filesystem space that can be used for inodes. The default +value is 5%. + +.sb_icount +Global count for number inodes allocated on the filesystem. This is only +maintained in the first superblock. + +.sb_ifree +Global count of free inodes on the filesystem. This is only maintained in the +first superblock. + +.sb_fdblocks +Global count of free data blocks on the filesystem. This is only maintained in +the first superblock. + +.sb_frextents +Global count of free real-time extents on the filesystem. This is only +maintained in the first superblock. + +.sb_uquotino +Inode for user quotas. This and the following two quota fields only apply if ++XFS_SB_VERSION_QUOTABIT+ flag is set in +sb_versionnum+. Refer to +xref:Quota_Inodes[quota inodes] for more information + +.sb_gquotino +Inode for group or project quotas. Group and Project quotas cannot be used at +the same time. + +.sb_qflags +Quota flags. It can be a combination of the following flags: + +.Superblock quota flags +[options="header"] +|===== +| Flag | Description +| +XFS_UQUOTA_ACCT+ | User quota accounting is enabled. +| +XFS_UQUOTA_ENFD+ | User quotas are enforced. +| +XFS_UQUOTA_CHKD+ | User quotas have been checked. +| +XFS_PQUOTA_ACCT+ | Project quota accounting is enabled. +| +XFS_OQUOTA_ENFD+ | Other (group/project) quotas are enforced. +| +XFS_OQUOTA_CHKD+ | Other (group/project) quotas have been checked. +| +XFS_GQUOTA_ACCT+ | Group quota accounting is enabled. +|===== + +.sb_flags +Miscellaneous flags. + +.sb_shared_vn +Reserved and must be zero ("vn" stands for version number). + +.sb_inoalignmt +Inode chunk alignment in fsblocks. + +.sb_unit +Underlying stripe or raid unit in blocks. + +.sb_width +Underlying stripe or raid width in blocks. + +.sb_dirblklog +log~2~ multiplier that determines the granularity of directory block allocations +in fsblocks. + +.sb_logsectlog +log~2~ 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). + +.sb_logsectsize +The log's sector size in bytes if the filesystem uses an external log device. + +.sb_logsunit +The log device's stripe or raid unit size. This only applies to version 2 logs ++XFS_SB_VERSION_LOGV2BIT+ is set in +sb_versionnum+. + +.sb_features2 +Additional version flags if +XFS_SB_VERSION_MOREBITSBIT+ is set in ++sb_versionnum+. The currently defined additional features include: + +.Extended Version 4 Superblock flags +[options="header"] +|===== +| Flag | Description +| +XFS_SB_VERSION2_LAZYSBCOUNTBIT+ | +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. + +| +XFS_SB_VERSION2_ATTR2BIT+ | +Extended attributes version 2. Making a filesystem with this optimises the inode +layout of extended attributes. + +| +XFS_SB_VERSION2_PARENTBIT+ | +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. +|===== + + +=== xfs_db superblock example + +A filesystem is made on a single SATA disk with the following command: + +---- +# 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 +---- + +And in xfs_db, inspecting the superblock: + +---- +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 +---- + + +[[AG_Free_Space_Management]] +== AG Free Space Management + +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. + +All block numbers, indexes and counts are AG relative. + +[[AG_Free_Space_Block]] +=== AG Free Space Block + +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: + +[source, c] +---- +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; +}; +---- + +The rest of the bytes in the sector are zeroed. +XFS_BTNUM_AGF+ is set to 2, +index 0 for the count B+tree and index 1 for the size B+tree. + +.agf_magicnum +Specifies the magic number for the AGF sector: "XAGF" (0x58414746). + +.agf_versionnum +Set to +XFS_AGF_VERSION+ which is currently 1. + +.agf_seqno +Specifies the AG number for the sector. + +.agf_length +Specifies the size of the AG in filesystem blocks. For all AGs except the last, +This must be equal to the superblock's +sb_agblocks+ value. For the last AG, +this could be less than the +sb_agblocks+ value. It is this value that should +be used to determine the size of the AG. + +.agf_roots +Specifies the block number for the root of the two free space B+trees. + +.agf_levels +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. + +.agf_flfirst +Specifies the index of the first "free list" block. Free lists are covered in +more detail later on. + +.agf_fllast +Specifies the index of the last "free list" block. + +.agf_flcount +Specifies the number of blocks in the "free list". + +.agf_freeblks +Specifies the current number of free blocks in the AG. + +.agf_longest +Specifies the number of blocks of longest contiguous free space in the AG. + +.agf_btreeblks +Specifies the number of blocks used for the free space B+trees. This is only +used if the +XFS_SB_VERSION2_LAZYSBCOUNTBIT+ bit is set in +sb_features2+. + +[[AG_Free_Space_Btrees]] +=== AG Free Space B+trees + +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. + +The trees use the following header: + +[source, c] +---- +struct xfs_btree_sblock { + __be32 bb_magic; + __be16 bb_level; + __be16 bb_numrecs; + __be32 bb_leftsib; + __be32 bb_rightsib; +}; +---- + +Leaf nodes contain a sorted array of offset/count pairs which are also used for +node keys: + +[source, c] +---- +struct xfs_alloc_rec { + __be32 ar_startblock; + __be32 ar_blockcount; +}; +---- + +Node pointers are an AG relative block pointer: + +[source, c] +---- +typedef __be32 xfs_alloc_ptr_t; +---- + +* As the free space tracking is AG relative, all the block numbers are only +32-bits. +* The +bb_magic+ value depends on the B+tree: "ABTB" (0x41425442) for the block +offset B+tree, "ABTC" (0x41425443) for the block count B+tree. +* The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well +as the leaves. +* For a typical 4KB filesystem block size, the offset for the +xfs_alloc_ptr_t+ +array would be +0xab0+ (2736 decimal). +* There are a series of macros in +xfs_btree.h+ for deriving the offsets, +counts, maximums, etc for the B+trees used in XFS. + +The following diagram shows a single level B+tree which consists of one leaf: + +.Freespace B+tree with one leaf. +image::images/15a.png[] + +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: + +.Multi-level freespace B+tree. +image::images/15b.png[] + +[[AG_Free_List]] +=== AG Free List + +The AG Free List is located in the 4^th^ 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. + +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. + +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 ++XFS_AGFL_SIZE+ macro. + +Active elements in the array are specified by the +xref:AG_Free_Space_Block[AGF's] +agf_flfirst+, +agf_fllast+ and +agf_flcount+ +values. The array is managed as a circular list. + +.AG Free List layout +image::images/16.png[] + +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. + +==== xfs_db AGF Examples + +These examples are derived from an AG that has been deliberately fragmented. +The AGF: + +---- +xfs_db> agf 0 +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 +---- + +In the AGFL, the active elements are from 22 to 27 inclusive which are obtained +from the +flfirst+ and +fllast+ values from the +agf+ in the previous example: + +---- +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 +---- + +The free space B+tree sorted by block offset, the root block is from the AGF's ++bnoroot+ value: + +---- +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 +---- + +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. + +The free space B+tree sorted by block count, the root block is from the AGF's ++cntroot+ value: + +---- +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 +---- + +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. + +Inspecting the leaf in block 83346, we can see the largest block at the end: + +---- +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] +---- + +The longest block count must be the same as the AGF's +longest+ value. + +[[AG_Inode_Management]] +== AG Inode Management + +[[Inode_Numbers]] +=== Inode Numbers + +Inode numbers in XFS come in two forms: AG relative and absolute. + +AG relative inode numbers always fit within 32 bits. The number of bits actually +used is determined by the sum of the xref:Superblocks[superblock's] +sb_inoplog+ +and +sb_agblklog+ values. Relative inode numbers are found within the AG's inode +structures. + +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 +xref:Directories[directory] entries. + +.Inode number formats +image::images/18.png[] + +[[Inode_Information]] +=== Inode Information + +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. + +The AGI uses the following structure: + +[source, c] +---- +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]; +} +---- +.agi_magicnum +Specifies the magic number for the AGI sector: "XAGI" (0x58414749). + +.agi_versionnum +Set to +XFS_AGI_VERSION+ which is currently 1. + +.agi_seqno +Specifies the AG number for the sector. + +.agi_length +Specifies the size of the AG in filesystem blocks. + +.agi_count +Specifies the number of inodes allocated for the AG. + +.agi_root +Specifies the block number in the AG containing the root of the inode B+tree. + +.agi_level +Specifies the number of levels in the inode B+tree. + +.agi_freecount +Specifies the number of free inodes in the AG. + +.agi_newino +Specifies AG relative inode number most recently allocated. + +.agi_dirino +Deprecated and not used, it's always set to NULL (-1). + +.agi_unlinked[64] +Hash table of unlinked (deleted) inodes that are still being referenced. Refer +to xref:Unlinked_Pointer[unlinked list pointers] for more information. + + +[[Inode_Btrees]] +== Inode B+trees + +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 +agi_root+ value. + +The B+tree header for the nodes and leaves use the +xfs_btree_sblock+ structure +which is the same as the header used in the xref:AG_Free_Space_Btrees[AGF +B+trees]. + +Leaves contain an array of the following structure: + +[source,c] +---- +struct xfs_inobt_rec { + __be32 ir_startino; + __be32 ir_freecount; + __be64 ir_free; +}; +---- + +Nodes contain key/pointer pairs using the following types: + +[source,c] +---- +struct xfs_inobt_key { + __be32 ir_startino; +}; +typedef __be32 xfs_inobt_ptr_t; +---- + +For the leaf entries, +ir_startino+ specifies the starting inode number for the +chunk, +ir_freecount+ specifies the number of free entries in the chuck, and the ++ir_free+ is a 64 element bit array specifying which entries are free in the +chunk. + +The following diagram illustrates a single level inode B+tree: + +.Single Level inode b+tree +image::images/20a.png[] + + +And a 2-level inode B+tree: + +.Multi-Level inode b+tree +image::images/20b.png[] + + +==== xfs_db AGI examples +TODO + +[[Real-time_Devices]] +== Real-time Devices + +TODO + diff --git a/design/XFS_Filesystem_Structure/common_types.asciidoc b/design/XFS_Filesystem_Structure/common_types.asciidoc new file mode 100644 index 0000000..5b52271 --- /dev/null +++ b/design/XFS_Filesystem_Structure/common_types.asciidoc @@ -0,0 +1,49 @@ += Common XFS Types + +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). + +.xfs_ino_t +Unsigned 64 bit absolute xref:Inode_Numbers[inode number]. + +.xfs_off_t +Signed 64 bit file offset. + +.xfs_daddr_t +Signed 64 bit disk address. + +.xfs_agnumber_t +Unsigned 32 bit xref:Allocation_Groups[AG number]. + +.xfs_agblock_t +Unsigned 32 bit AG relative block number. + +.xfs_extlen_t +Unsigned 32 bit xref:Data_Extents[extent] length in blocks. + +.xfs_extnum_t +Signed 32 bit number of extents in a file. + +.xfs_dablk_t +Unsigned 32 bit block number for xref:Directories[directories] and +xref:Extended_Attributes[extended attributes]. + +.xfs_dahash_t +Unsigned 32 bit hash of a directory file name or extended attribute name. + +.xfs_dfsbno_t +Unsigned 64 bit filesystem block number combining +xref:Allocation_Groups[AG number] and block offset into the AG. + +.xfs_drfsbno_t +Unsigned 64 bit raw filesystem block number. + +.xfs_drtbno_t +Unsigned 64 bit extent number in the xref:Real-time_Devices[real-time] +sub-volume. + +.xfs_dfiloff_t +Unsigned 64 bit block offset into a file. + +.xfs_dfilblks_t +Unsigned 64 bit block count for a file. diff --git a/design/XFS_Filesystem_Structure/data_extents.asciidoc b/design/XFS_Filesystem_Structure/data_extents.asciidoc new file mode 100644 index 0000000..d7f51e4 --- /dev/null +++ b/design/XFS_Filesystem_Structure/data_extents.asciidoc @@ -0,0 +1,247 @@ +[[Data_Extents]] += Data Extents + +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). + +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. + +An extent is 128 bits in size and uses the following packed layout: + +.Extent record format +image::images/31.png[] + +The extent is represented by the +xfs_bmbt_rec+ structure which uses a big +endian format on-disk. In-core management of extents use the +xfs_bmbt_irec+ +structure which is the unpacked version of +xfs_bmbt_rec+: + +[source, c] +---- +struct xfs_bmbt_irec { + xfs_fileoff_t br_startoff; + xfs_fsblock_t br_startblock; + xfs_filblks_t br_blockcount; + xfs_exntst_t br_state; +}; +---- + + + +The extent +br_state+ field uses the following enum declaration: + +[source, c] +---- +typedef enum { + XFS_EXT_NORM, + XFS_EXT_UNWRITTEN, + XFS_EXT_INVALID +} xfs_exntst_t; +---- + +Some other points about extents: + +* The +xfs_bmbt_rec_32_t+ and +xfs_bmbt_rec_64_t+ structures are effectively +the same as +xfs_bmbt_rec_t+, just different representations of the same 128 +bits in on-disk big endian format. + +* 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. + +* If a file is zero bytes long, it will have no extents, +di_nblocks+ and ++di_nexents+ 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^21^) on the filesystem. +For a default 4KB block size filesystem, a single extent can be up to 8GB in +length. + +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. + + +[[Extent_List]] +== Extent List + +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. + +The "data fork" of the inode contains an array of extents, the size of the array +determined by the inode's +di_nextents+ value. + +.Inode data fork extent layout +image::images/32.png[] + +The number of extents that can fit in the inode depends on the inode size and ++di_forkoff+. 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. + +=== xfs_db: Inode data fork extents + +An 8MB file with one extent: + +---- +xfs_db> inode <inode#> +xfs_db> 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] +---- + +A 24MB file with three extents: + +---- +xfs_db> inode <inode#> +xfs_db> 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] +---- + +Raw disk version of the inode with the third extent highlighted (+di_u+ always +starts at offset 0x64): + +.Raw inode contents with extents +image::images/code/33a.png[] + +We can expand the highlighted section into the following bit array from MSB to +LSB with the file offset and the block count highlighted: + +.Encoded extent +image::images/code/33b.png[] + +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 (+write+ 64KB, ++lseek+ 4MB, +write+ 32KB operations): + +---- +xfs_db> inode <inode#> +xfs_db> 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] +---- + + +[[Btree_Extent_List]] +== B+tree Extent List + +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. + +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. + +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. + +The base B+tree node is used for extents, directories and extended attributes. +The structures used for inode's B+tree root are: + +[source, c] +---- +struct xfs_bmdr_block { + __be16 bb_level; + __be16 bb_numrecs; +}; +struct xfs_bmbt_key { + xfs_dfiloff_t br_startoff; +}; +typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; +---- + +* On disk, the B+tree node starts with the +xfs_bmbr_block_t+ header followed by +an array of +xfs_bmbt_key_t+ values and then an array of +xfs_bmbt_ptr_t+ +values. The size of both arrays is specified by the header's +bb_numrecs+ value. + +* 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 +di_forkoff+ is not zero (i.e. attributes +are in use on the inode). + +The subsequent nodes and leaves of the B+tree use the +xfs_btree_lblock+ +declaration: + +[source, c] +---- +struct xfs_btree_lblock { + __be32 bb_magic; + __be16 bb_level; + __be16 bb_numrecs; + __be64 bb_leftsib; + __be64 bb_rightsib; +}; +---- + +* For intermediate nodes, the data following +xfs_btree_lblock+ is the same as +the root node: array of +xfs_bmbt_key+ value followed by an array of ++xfs_bmbt_ptr_t+ values that starts halfway through the block (offset 0x808 for +a 4096 byte filesystem block). + +* For leaves, an array of +xfs_bmbt_rec+ extents follow the +xfs_btree_lblock+ +header. + +* Nodes and leaves use the same value for +bb_magic+: + +[source, c] +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ + +* The +bb_level+ value determines if the node is an intermediate node or a leaf. +Leaves have a +bb_level+ of zero, nodes are one or greater. + +* 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. + +.Single level extent B+tree +image::images/35.png[] + +.Multi-level extent B+tree +image::images/36.png[] + +=== BMBT xfs_db Example + +TODO diff --git a/design/XFS_Filesystem_Structure/directories.asciidoc b/design/XFS_Filesystem_Structure/directories.asciidoc new file mode 100644 index 0000000..98143f7 --- /dev/null +++ b/design/XFS_Filesystem_Structure/directories.asciidoc @@ -0,0 +1,1193 @@ +[[Directories]] += Directories + +[NOTE] +Only v2 directories covered here. v1 directories are obsolete. + +[NOTE] +The term "block" in this section will refer to directory blocks, not filesystem +blocks unless otherwise specified. + +The size of a "directory block" is defined by the xref:Superblocks[superblock's] ++sb_dirblklog+ value. The size in bytes = +sb_blocksize+ * 2^sb_dirblklog^. +For example, if +sb_blocksize+ = 4096 and +sb_dirblklog+ = 2, the directory block +size is 16384 bytes. Directory blocks are always allocated in multiples based on ++sb_dirblklog+. Directory blocks cannot be more that 65536 bytes in size. + +All directory entries contain the following "data": + +* Entry's name (counted string consisting of a single byte +namelen+ followed by ++name+ consisting of an array of 8-bit chars without a NULL terminator). + +* 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. + +* An +offset+ or +tag+ used for iterative readdir calls. + +All non-shortform directories also contain two additional structures: "leaves" +and "freespace indexes". + +* Leaves contain the sorted hashed name value (+xfs_da_hashname()+ 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. + +* 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. + +A few common types are used for the directory structures: + +[source, c] +---- +typedef __uint16_t xfs_dir2_data_off_t; +typedef __uint32_t xfs_dir2_dataptr_t; +---- + + +[[Shortform_Directories]] +== Shortform Directories + +* Directory entries are stored within the inode. + +* 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. + +* "." is not stored (as it's in the inode itself), and ".." is a dedicated ++parent+ field in the header. + +* 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. + +* Once the number of entries exceed the space available in the inode, the format +is converted to a "Block Directory". + +* Shortform directory data is packed as tightly as possible on the disk with the +remaining space zeroed: + +[source, c] +---- +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; +---- + +.Shortform Directory layout +image::images/39.png[] + +* 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 +count+ value specifies the number of entries in +the directory and +i8count+ will be zero. If any inode number exceeds 4 bytes, +all inode numbers will be 8 bytes in size and the header's +i8count+ value +specifies the number of entries and count will be zero. The following union +covers the shortform inode number structure: + +[source, c] +---- +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; +---- + +=== Shortform Directory xfs_db Example + +A directory is created with 4 files, all inode numbers fitting within 4 bytes: + +---- +xfs_db> inode <inode#> +xfs_db> 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 +---- + +The raw data on disk with the first entry highlighted. The six byte header +precedes the first entry: + +.Shortform Directory entry detail +image::images/code/40.png[] + +Next, an entry is deleted (frame000001.tst), and any entries after the deleted +entry are moved or compacted to "cover" the hole: + +---- +xfs_db> inode <inode#> +xfs_db> 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 +---- + +Raw disk data, the space beyond the shortform entries is invalid and could be non-zero: + +---- +xfs_db> type text +xfs_db> 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 ................ +---- + +TODO: 8-byte inode number example</section> + + +[[Block_Directories]] +== Block Directories + +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. + + <itemizedlist> + +* All directory data is stored within the one directory block, including "." and +".." entries which are mandatory. + +* The block also contains "leaf" and "freespace index " information. + +* The location of the block is defined by the inode's in-core +xref:Extent_List[extent list]: the +di_u.u_bmx[0]+ value. The file offset in +the extent must always be zero and the +length+ = (directory block size / +filesystem block size). The block number points to the filesystem block +containing the directory data. + +* Block directory data is stored in the following structures: + +[source, c] +---- +#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; +---- + +.Block directory layout +image::images/43.png[] + +* The +tag+ in the +xfs_dir2_data_entry_t+ structure stores its offset from the +start of the block. + +* Start of a free space region is marked with the +xfs_dir2_data_unused_t+ +structure where the +freetag+ is +0xffff+. The +freetag+ and +length+ overwrites +the +inumber+ for an entry. The +tag+ is located at +length - sizeof(tag)+ from +the start of the +unused+ entry on-disk. + +* The +bestfree+ 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 ++bestfree+ elements are zeroed. The +offset+ specifies the offset from the start +of the block in bytes, and the +length+ specifies the size of the free space in +bytes. The location each points to must contain the above ++xfs_dir2_data_unused_t+ structure. As a block cannot exceed 64KB in size, each +is a 16-bit value. +bestfree+ 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. + +* The +tail+ structure specifies the number of elements in the +leaf+ array and +the number of +stale+ entries in the array. The +tail+ is always located at the +end of the block. The +leaf+ data immediately precedes the +tail+ structure. + +* The +leaf+ array, which grows from the end of the block just before the +tail+ +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 ++address+ on-disk is the offset into the block divided by 8 +(+XFS_DIR2_DATA_ALIGN+). 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. + + +=== Block Directory xfs_db Example + +A directory is created with 8 entries, directory block size = filesystem block size: + +---- +xfs_db> sb 0 +xfs_db> p +magicnum = 0x58465342 +blocksize = 4096 +... +dirblklog = 0 +... +xfs_db> inode <inode#> +xfs_db> 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] +---- + +Go to the "startblock" and show the raw disk data: + +---- +xfs_db> dblock 0 +xfs_db> type text +xfs_db> 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............ +---- + +The "leaf" and "tail" structures are stored at the end of the block, so as the +directory grows, the middle is filled in: + +---- +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 ................ +---- + +In a readable format: + +---- +xfs_db> type dir2 +xfs_db> 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 +---- + +[NOTE] +For block directories, all xfs_db fields are preceded with "b". + +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. + +When we remove an entry from the middle (frame000004.tst), we can see how the +freespace details are adjusted: + +---- +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 +---- + +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 +offset+length - +sizeof(tag)+. The address for the hash is also cleared. The affected areas are +highlighted below: + +.Block directory free entry detail +image::images/code/46.png[] + + + +[[Leaf_Directories]] +== Leaf Directories + +Once a Block Directory has filled the block, the directory data is changed into +a new format. It still uses xref:Data_Extents[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. + +* Block to Leaf conversions retain the existing block for the data entries and +allocate a new block for the leaf and freespace index information. + +* As with all directories, data blocks must start at logical offset zero. + +* The "leaf" block has a special offset defined by +XFS_DIR2_LEAF_OFFSET+. +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). + +* The "data" extents have a new header (no "leaf" data): + +[source, c] +---- +typedef struct xfs_dir2_data { + xfs_dir2_data_hdr_t hdr; + xfs_dir2_data_union_t u[1]; +} xfs_dir2_data_t; +---- + +* The "leaf" extent uses the following structures: + +[source, c] +---- +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; +---- + +* The leaves use the +xfs_da_blkinfo_t+ filesystem block header. This header is +used for directory and xref:Extended_Attributes[extended attribute] leaves and +B+tree nodes: + +[source, c] +---- +typedef struct xfs_da_blkinfo { + __be32 forw; + __be32 back; + __be16 magic; + __be16 pad; +} xfs_da_blkinfo_t; +---- + +* The size of the +ents+ array is specified by +hdr.count+. + +* 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 +bestfree[0].length+ value. + +.Leaf directory free entry detail +image::images/48.png[] + +=== Leaf Directory xfs_db Example + +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. + +---- +xfs_db> inode <inode#> +xfs_db> 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] +---- + +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). + +Examining the first block: + +---- +xfs_db> dblock 0 +xfs_db> type dir2 +xfs_db> 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 +---- + +[NOTE] +The xfs_db field output is preceded by a "d" for "data". + +The next "data" block: + +---- +xfs_db> dblock 1 +xfs_db> type dir2 +xfs_db> 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 +---- + +And the last data block: + + +---- +xfs_db> dblock 2 +xfs_db> type dir2 +xfs_db> 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 +---- + +Examining the "leaf" block (with the fields preceded by an "l" for "leaf"): + +---- +xfs_db> dblock 8388608 +xfs_db> type dir2 +xfs_db> 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 +---- + +Note how the +lbests+ array correspond with the +bestfree[0].length+ values in +the "data" blocks: + +---- +xfs_db> dblock 0 +xfs_db> type dir2 +xfs_db> p +dhdr.magic = 0x58443244 +dhdr.bestfree[0].offset = 0xff0 +dhdr.bestfree[0].length = 0x10 +... +xfs_db> dblock 1 +xfs_db> type dir2 +xfs_db> p +dhdr.magic = 0x58443244 +dhdr.bestfree[0].offset = 0xff0 +dhdr.bestfree[0].length = 0x10 +... +xfs_db> dblock 2 +xfs_db> type dir2 +xfs_db> p +dhdr.magic = 0x58443244 +dhdr.bestfree[0].offset = 0x70 +dhdr.bestfree[0].length = 0xf90 +---- + +Now after the entries have been deleted: + +---- +xfs_db> dblock 8388608 +xfs_db> type dir2 +xfs_db> 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 +... +---- + +As can be seen, the +lbests+ values have been update to contain each ++hdr.bestfree[0].length+ values. The leaf's +hdr.stale+ value has also been +updated to specify the number of stale entries in the array. The stale entries +have an address of zero. + +TODO: Need an example for where new entries get inserted with several large free +spaces. + + +[[Node_Directories]] +== Node Directories + +When the "leaf" information fills a block, the extents undergo another +separation. All "freeindex" information moves into its own extent. Like Leaf +Directories, the "leaf" block maintained the best free space information for +each "data" block. This is not possible with more than one leaf. + +* The "data" blocks stay the same as leaf directories. + +* 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 +XFS_DIR2_LEAF1_MAGIC (0xd2f1)+, a +node directory's leaf/leaves have a magic value of +XFS_DIR2_LEAFN_MAGIC +(0xd2ff)+ and intermediate nodes have a magic value of +XFS_DA_NODE_MAGIC +(0xfebe)+. + +* The new "freeindex" block(s) only contains the bests for each data block. + +* The freeindex block uses the following structures: + +[source, c] +---- +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; +---- + +* 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 +btree+ array and first +hashval+ in the array that exceeds +the given hash and it can then be found in the block pointed to by the +before+ +value. + +[source, c] +---- +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; +---- + +* The freeindex's +bests+ array starts from the end of the block and grows to the +start of the block. + +* 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 +hdr.nused+ +value is decremented and the associated +bests[]+ entry is set to 0xffff. + +* As the first data block always contains "." and "..", it's invalid for the +directory to have a hole at the start. + +* The freeindex's +hdr.nvalid+ 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 +hdr.nused. hdr.nused+ should be the same as the index of +the last data directory block plus one (i.e. when the last data block is freed, ++nused+ and +nvalid+ are decremented). + +.Node Directory Layout +image::images/54.png[] + +=== Node Directory xfs_db Example + +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: + +---- +xfs_db> sb 0 +xfs_db> p +magicnum = 0x58465342 +blocksize = 4096 +... +dirblklog = 2 +... +xfs_db> inode <inode#> +xfs_db> 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] +---- + +As can already be observed, all extents are allocated is multiples of 4 blocks. + +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 +length+ values +are a lot larger to accommodate the increased directory block size: + +---- +xfs_db> dblock 16 +xfs_db> type dir2 +xfs_db> 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 +---- + +Next, the "node" block, the fields are preceded with 'n' for node blocks: + +---- +xfs_db> dblock 8388608 +xfs_db> type dir2 +xfs_db> 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] +---- + +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 +< 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. + +---- +xfs_db> dblock 8388616 +xfs_db> type dir2 +xfs_db> 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> dblock 8388612 +xfs_db> type dir2 +xfs_db> 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 +---- + +An example lookup using xfs_db: + +---- +xfs_db> 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> fsblock 7482 +xfs_db> type text +xfs_db> 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 +---- + +Looking at the freeindex information (fields with an 'f' tag): + +---- +xfs_db> fsblock 7516 +xfs_db> type dir2 +xfs_db> 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 +---- + +Like the Leaf Directory, each of the +fbests+ values correspond to each data +block's +bestfree[0].length+ value. + +The raw disk layout, old data is not cleared after the array. The fbests array +is highlighted: + +.Node directory freespace detail +image::images/code/57.png[] + +TODO: Example with a hole in the middle + + +[[Btree_Directories]] +== B+tree Directories + +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. + +Refer to the previous section on B+tree xref:Btree_Extent_List[Data Extents] for +more information on XFS B+tree extents. + +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: + +* The node/leaf trees can be more than one level deep. + +* 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. + +=== B+tree Directory xfs_db Example + +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: + +---- +xfs_db> inode <inode#> +xfs_db> 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> fsblock 89 +xfs_db> type bmapbtd +xfs_db> 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] +---- + +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 +firstdb+ field specifies +the starting directory block number for each array: + +---- +xfs_db> dblock 16777216 +xfs_db> type dir2 +xfs_db> p +fhdr.magic = 0x58443246 +fhdr.firstdb = 0 +fhdr.nvalid = 2040 +fhdr.nused = 2040 +fbests[0-2039] = ... +xfs_db> dblock 16777217 +xfs_db> type dir2 +xfs_db> p +fhdr.magic = 0x58443246 +fhdr.firstdb = 2040 +fhdr.nvalid = 2040 +fhdr.nused = 2040 +fbests[0-2039] = ... +xfs_db> dblock 16777218 +xfs_db> type dir2 +xfs_db> p +fhdr.magic = 0x58443246 +fhdr.firstdb = 4080 +fhdr.nvalid = 1476 +fhdr.nused = 1476 +fbests[0-1475] = ... +---- + +Looking at the root node in the node block, it's a pretty deep tree: + +---- +xfs_db> dblock 8388608 +xfs_db> type dir2 +xfs_db> 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> dblock 8389121 +xfs_db> type dir2 +xfs_db> 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] ... +---- + +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: + +.B+tree directory pointer detail +image::images/code/60.png[] + diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml new file mode 100644 index 0000000..d56aaed --- /dev/null +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -0,0 +1,72 @@ +<subtitle>Documentation of the XFS filesystem on-disk structures</subtitle> +<abstract> + <para>This book documents the XFS Filesystem Structure</para> +</abstract> +<corpauthor> +</corpauthor> +<copyright> + <year>2006</year> + <holder>Silicon Graphics Inc.</holder> +</copyright> +<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 <ulink url="http://creativecommons.org/licenses/by-sa/3.0/us/"/>.</para> +</legalnotice> + +<revhistory> + <revision> + <revnumber>0.1</revnumber> + <date>2006</date> + <author> + <firstname>Silicon Graphics, Inc</firstname> + <surname></surname> + <email></email> + </author> + <revdescription> + <simplelist> + <member>Initial Release</member> + </simplelist> + </revdescription> + </revision> + <revision> + <revnumber>1.0</revnumber> + <date>Fri Jul 03 2009</date> + <author> + <firstname>Ryan</firstname> + <surname>Lerch</surname> + <email></email> + </author> + <revdescription> + <simplelist> + <member>Publican Conversion</member> + </simplelist> + </revdescription> + </revision> + <revision> + <revnumber>1.1</revnumber> + <date>March 2010</date> + <author> + <firstname>Eric</firstname> + <surname>Sandeen</surname> + <email></email> + </author> + <revdescription> + <simplelist> + <member>Community Release</member> + </simplelist> + </revdescription> + </revision> + <revision> + <revnumber>1.99</revnumber> + <date>February 2014</date> + <author> + <firstname>Dave</firstname> + <surname>Chinner</surname> + <email></email> + </author> + <revdescription> + <simplelist> + <member>AsciiDoc Conversion</member> + </simplelist> + </revdescription> + </revision> +</revhistory> diff --git a/design/XFS_Filesystem_Structure/extended_attributes.asciidoc b/design/XFS_Filesystem_Structure/extended_attributes.asciidoc new file mode 100644 index 0000000..9887332 --- /dev/null +++ b/design/XFS_Filesystem_Structure/extended_attributes.asciidoc @@ -0,0 +1,609 @@ +[[Extended_Attributes]] += Extended Attributes + +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. + +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. + +Access Control Lists (ACLs) and Data Migration Facility (DMF) use extended +attributes to store their associated metadata with an inode. + +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. + +To view extended attributes from the command line, use the +getfattr+ command. +To set or delete extended attributes, use the +setfattr+ command. ACLs control +should use the +getfacl+ and +setfacl+ commands. + +XFS attributes supports three namespaces: "user", "trusted" (or "root" using +IRIX terminology) and "secure". + +The location of the attribute fork in the inode's literal area is specified by +the +di_forkoff+ 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 = +di_forkoff * 8+, 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 +di_forkoff * 8+. + +The following four sections describe each of the on-disk formats. + + +[[Shortform_Attributes]] +== Shortform Attributes + +When the all extended attributes can fit within the inode's attribute fork, the +inode's +di_aformat+ is set to "local" and the attributes are stored in the +inode's literal area starting at offset +di_forkoff * 8+. + +Shortform attributes use the following structures: + +[source, c] +---- +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; +---- + +.Shortform attribute layout +image::images/64.png[] + + +* +namelen+ and +valuelen+ specify the size of the two byte arrays containing the +name and value pairs. +valuelen+ is zero for extended attributes with no value. + +* +nameval[]+ is a single array where it's size is the sum of +namelen+ and ++valuelen+. The names and values are not null terminated on-disk. The value +immediately follows the name in the array. + +* +flags+ specifies the namespace for the attribute (0 = "user"): + + +.Attribute Namespaces +[options="header"] +|===== +| Flag | Description +| +XFS_ATTR_ROOT+ | The attribute's namespace is "trusted". +| +XFS_ATTR_SECURE+ | The attribute's namespace is "secure". +|===== + +=== Shortform attribute xfs_db example + +A file is created and two attributes are set: + +---- +# setfattr -n user.empty few_attr +# setfattr -n trusted.trust -v val1 few_attr +---- + +Using xfs_db, we dump the inode: + +---- +xfs_db> inode <inode#> +xfs_db> 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" +---- + +We can determine the actual inode offset to be 220 (15 x 8 + 100) or +0xdc+. +Examining the raw dump, the second attribute is highlighted: + +.Shortform Attribute detail +image::images/code/65.png[] + +Adding another attribute with attr1, the format is converted to extents and ++di_forkoff+ remains unchanged (and all those zeros in the dump above remain +unused): + +---- +xfs_db> inode <inode#> +xfs_db> p +... +core.naextents = 1 +core.forkoff = 15 +core.aformat = 2 (extents) +... +a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,37534,1,0] +---- + +Performing the same steps with attr2, adding one attribute at a time, you can +see +di_forkoff+ change as attributes are added: + +---- +xfs_db> inode <inode#> +xfs_db> 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" +---- + +Attribute added: + +---- +xfs_db> 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" +---- + +Another attribute is added: + +.Shortform Multiple Attribute detail +image::images/code/66.png[] + +One more is added: + +---- +xfs_db> 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" +---- + +A raw dump is shown to compare with the attr1 dump on a prior page, the header +is highlighted: + +.Shortform attribute header detail +image::images/code/67.png[] + +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. + + +[[Leaf_Attributes]] +== Leaf Attributes + +When an inode's attribute fork space is used up with shortform attributes and +more are added, the attribute format is migrated to "extents". + +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. + +Each leaf is based on the +xfs_da_blkinfo_t+ block header declared in Leaf +Directories. The structure encapsulating all other structures in the ++xfs_attr_leafblock_t+. + +The structures involved are: + +[source, c] +---- +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> + + Each leaf header uses the following magic number: + +[source, c] +#define XFS_ATTR_LEAF_MAGIC 0xfbee + +The hash/index elements in the +entries[]+ 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 +entries[]+ array, but +only the three largest runs are stored (smaller runs are dropped). When the ++freemap+ 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. + +For attributes with small values (ie. the value can be stored within the leaf), +the +XFS_ATTR_LOCAL+ flag is set for the attribute. The entry details are stored +using the +xfs_attr_leaf_name_local_t+ structure. For large attribute values +that cannot be stored within the leaf, separate filesystem blocks are allocated +to store the value. They use the +xfs_attr_leaf_name_remote_t+ structure. + +.Leaf Attribute layout +image::images/69.png[] + +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. + +Since duplicate hash keys are possible, for each hash that matches during a +lookup, the actual name string must be compared. + +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. + +=== Leaf Attribute xfs_db Example + +A single 30KB extended attribute is added to an inode: + +---- +xfs_db> inode <inode#> +xfs_db> 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> ablock 0 +xfs_db> 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" +---- + +Attribute blocks 1 to 8 (filesystem blocks 37536 to 37543) contain the raw +binary value data for the attribute. + +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: + +---- +xfs_db> type text +xfs_db> 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... +---- + +A 30KB attribute and a couple of small attributes are added to a file: + +---- +xfs_db> inode <inode#> +xfs_db> 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" +---- + +As can be seen in the entries array, the two small attributes have the local +flag set and the values are printed. + +A raw disk dump shows the attributes. The last attribute added is highlighted +(offset 4044 or 0xfcc): + +.Leaf Attribute detail +image::images/code/71.png[] + + +[[Node_Attributes]] +== Node Attributes + +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 +xfs_da_intnode_t+ structure introduced +in Node Directories. + +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 +hashval+ in the array that +exceeds the given hash and it can then be found in the block pointed to by the ++before+ value. + +.Node Attribute layout +image::images/72.png[] + +=== Node Attribute xfs_db Example + +An inode with 1000 small attributes with the naming "attribute_n" where 'n' is a +number: + +---- +xfs_db> inode <inode#> +xfs_db> 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] +---- + +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. + +For example, to lookup attribute "attribute_267": + +---- +xfs_db> hash attribute_267 +0x3437d1a8 +---- + + +In the root btree node, this falls between +0x3437922e+ and +0x3437d22a+, +therefore leaf 11 or attribute block 5 will contain the entry. + +.Node Attribute lookup detail +image::images/code/73-74.png[] + +Each of the hash entries has +XFS_ATTR_LOCAL+ 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: + +.Node Attribute value detail +image::images/code/74.png[] + +Each entry starts on a 32-bit (4 byte) boundary, therefore the highlighted entry +has 2 unused bytes after it. + + +[[Btree_Attributes]] +== B+tree Attributes + +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. + +Refer to the previous section on B+tree Data Extents for more information on XFS +B+tree extents. + +=== B+tree Attribute xfs_db Example + +Added 2000 attributes with 729 byte values to a file: + +---- +xfs_db> inode <inode#> +xfs_db> 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> fsblock 109968 +xfs_db> type bmapbtd +xfs_db> p +magic = 0x424d4150 +level = 0 +numrecs = 147 +leftsib = 83162 +rightsib = null +recs[1-147] = [startoff,startblock,blockcount,extentflag] + ... + (which is fsblock 81870) +xfs_db> ablock 0 +xfs_db> 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] +---- + +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 ++ablock+ command) are intermediate +xfs_da_intnode_t+ nodes that index all the +attribute leaves. + diff --git a/design/XFS_Filesystem_Structure/images/15a.png b/design/XFS_Filesystem_Structure/images/15a.png Binary files differnew file mode 100644 index 0000000..bf25616 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/15a.png diff --git a/design/XFS_Filesystem_Structure/images/15b.png b/design/XFS_Filesystem_Structure/images/15b.png Binary files differnew file mode 100644 index 0000000..21de61a --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/15b.png diff --git a/design/XFS_Filesystem_Structure/images/16.png b/design/XFS_Filesystem_Structure/images/16.png Binary files differnew file mode 100644 index 0000000..5f46c52 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/16.png diff --git a/design/XFS_Filesystem_Structure/images/18.png b/design/XFS_Filesystem_Structure/images/18.png Binary files differnew file mode 100644 index 0000000..4097348 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/18.png diff --git a/design/XFS_Filesystem_Structure/images/20a.png b/design/XFS_Filesystem_Structure/images/20a.png Binary files differnew file mode 100644 index 0000000..52d0c26 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/20a.png diff --git a/design/XFS_Filesystem_Structure/images/20b.png b/design/XFS_Filesystem_Structure/images/20b.png Binary files differnew file mode 100644 index 0000000..977d57d --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/20b.png diff --git a/design/XFS_Filesystem_Structure/images/23.png b/design/XFS_Filesystem_Structure/images/23.png Binary files differnew file mode 100644 index 0000000..a74cd55 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/23.png diff --git a/design/XFS_Filesystem_Structure/images/28.png b/design/XFS_Filesystem_Structure/images/28.png Binary files differnew file mode 100644 index 0000000..e85b2c1 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/28.png diff --git a/design/XFS_Filesystem_Structure/images/30.png b/design/XFS_Filesystem_Structure/images/30.png Binary files differnew file mode 100644 index 0000000..f623fe5 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/30.png diff --git a/design/XFS_Filesystem_Structure/images/31.png b/design/XFS_Filesystem_Structure/images/31.png Binary files differnew file mode 100644 index 0000000..48b0172 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/31.png diff --git a/design/XFS_Filesystem_Structure/images/32.png b/design/XFS_Filesystem_Structure/images/32.png Binary files differnew file mode 100644 index 0000000..05da0b1 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/32.png diff --git a/design/XFS_Filesystem_Structure/images/35.png b/design/XFS_Filesystem_Structure/images/35.png Binary files differnew file mode 100644 index 0000000..25c3160 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/35.png diff --git a/design/XFS_Filesystem_Structure/images/36.png b/design/XFS_Filesystem_Structure/images/36.png Binary files differnew file mode 100644 index 0000000..c1d8b65 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/36.png diff --git a/design/XFS_Filesystem_Structure/images/39.png b/design/XFS_Filesystem_Structure/images/39.png Binary files differnew file mode 100644 index 0000000..0f264f4 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/39.png diff --git a/design/XFS_Filesystem_Structure/images/43.png b/design/XFS_Filesystem_Structure/images/43.png Binary files differnew file mode 100644 index 0000000..c9ef36b --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/43.png diff --git a/design/XFS_Filesystem_Structure/images/48.png b/design/XFS_Filesystem_Structure/images/48.png Binary files differnew file mode 100644 index 0000000..e906f18 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/48.png diff --git a/design/XFS_Filesystem_Structure/images/54.png b/design/XFS_Filesystem_Structure/images/54.png Binary files differnew file mode 100644 index 0000000..9e2ee03 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/54.png diff --git a/design/XFS_Filesystem_Structure/images/6.png b/design/XFS_Filesystem_Structure/images/6.png Binary files differnew file mode 100644 index 0000000..36c22fa --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/6.png diff --git a/design/XFS_Filesystem_Structure/images/61.png b/design/XFS_Filesystem_Structure/images/61.png Binary files differnew file mode 100644 index 0000000..7b18e61 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/61.png diff --git a/design/XFS_Filesystem_Structure/images/62.png b/design/XFS_Filesystem_Structure/images/62.png Binary files differnew file mode 100644 index 0000000..e240fa3 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/62.png diff --git a/design/XFS_Filesystem_Structure/images/64.png b/design/XFS_Filesystem_Structure/images/64.png Binary files differnew file mode 100644 index 0000000..ced8ffc --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/64.png diff --git a/design/XFS_Filesystem_Structure/images/69.png b/design/XFS_Filesystem_Structure/images/69.png Binary files differnew file mode 100644 index 0000000..3efa679 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/69.png diff --git a/design/XFS_Filesystem_Structure/images/72.png b/design/XFS_Filesystem_Structure/images/72.png Binary files differnew file mode 100644 index 0000000..fd7a99f --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/72.png diff --git a/design/XFS_Filesystem_Structure/images/76.png b/design/XFS_Filesystem_Structure/images/76.png Binary files differnew file mode 100644 index 0000000..346aa7d --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/76.png diff --git a/design/XFS_Filesystem_Structure/images/code/33a.png b/design/XFS_Filesystem_Structure/images/code/33a.png Binary files differnew file mode 100644 index 0000000..9ffb4f4 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/33a.png diff --git a/design/XFS_Filesystem_Structure/images/code/33b.png b/design/XFS_Filesystem_Structure/images/code/33b.png Binary files differnew file mode 100644 index 0000000..b45323c --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/33b.png diff --git a/design/XFS_Filesystem_Structure/images/code/40.png b/design/XFS_Filesystem_Structure/images/code/40.png Binary files differnew file mode 100644 index 0000000..38441ea --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/40.png diff --git a/design/XFS_Filesystem_Structure/images/code/46.png b/design/XFS_Filesystem_Structure/images/code/46.png Binary files differnew file mode 100644 index 0000000..df7abd5 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/46.png diff --git a/design/XFS_Filesystem_Structure/images/code/57.png b/design/XFS_Filesystem_Structure/images/code/57.png Binary files differnew file mode 100644 index 0000000..6f3b679 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/57.png diff --git a/design/XFS_Filesystem_Structure/images/code/60.png b/design/XFS_Filesystem_Structure/images/code/60.png Binary files differnew file mode 100644 index 0000000..5795be9 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/60.png diff --git a/design/XFS_Filesystem_Structure/images/code/61.png b/design/XFS_Filesystem_Structure/images/code/61.png Binary files differnew file mode 100644 index 0000000..ecff05e --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/61.png diff --git a/design/XFS_Filesystem_Structure/images/code/65.png b/design/XFS_Filesystem_Structure/images/code/65.png Binary files differnew file mode 100644 index 0000000..dd74d54 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/65.png diff --git a/design/XFS_Filesystem_Structure/images/code/66.png b/design/XFS_Filesystem_Structure/images/code/66.png Binary files differnew file mode 100644 index 0000000..3479ac4 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/66.png diff --git a/design/XFS_Filesystem_Structure/images/code/67.png b/design/XFS_Filesystem_Structure/images/code/67.png Binary files differnew file mode 100644 index 0000000..efec42a --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/67.png diff --git a/design/XFS_Filesystem_Structure/images/code/71.png b/design/XFS_Filesystem_Structure/images/code/71.png Binary files differnew file mode 100644 index 0000000..e66b710 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/71.png diff --git a/design/XFS_Filesystem_Structure/images/code/73-74.png b/design/XFS_Filesystem_Structure/images/code/73-74.png Binary files differnew file mode 100644 index 0000000..e44878c --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/73-74.png diff --git a/design/XFS_Filesystem_Structure/images/code/74.png b/design/XFS_Filesystem_Structure/images/code/74.png Binary files differnew file mode 100644 index 0000000..e50f0a4 --- /dev/null +++ b/design/XFS_Filesystem_Structure/images/code/74.png diff --git a/design/XFS_Filesystem_Structure/images/code/SVG/33a.svg b/design/XFS_Filesystem_Structure/images/code/SVG/33a.svg new file mode 100644 index 0000000..1c2d8e5 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> type text</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan90">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/33b.svg b/design/XFS_Filesystem_Structure/images/code/SVG/33b.svg new file mode 100644 index 0000000..cb6dc2b --- /dev/null +++ b/design/XFS_Filesystem_Structure/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/design/XFS_Filesystem_Structure/images/code/SVG/40.svg b/design/XFS_Filesystem_Structure/images/code/SVG/40.svg new file mode 100644 index 0000000..593d8aa --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> type text</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan1203">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/46.svg b/design/XFS_Filesystem_Structure/images/code/SVG/46.svg new file mode 100644 index 0000000..baffb3f --- /dev/null +++ b/design/XFS_Filesystem_Structure/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/design/XFS_Filesystem_Structure/images/code/SVG/57.svg b/design/XFS_Filesystem_Structure/images/code/SVG/57.svg new file mode 100644 index 0000000..bb50460 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> type text</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan1549">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/60.svg b/design/XFS_Filesystem_Structure/images/code/SVG/60.svg new file mode 100644 index 0000000..b720921 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> dblock 8388928</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan1592">xfs_db> type dir2</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="560.4082" + id="tspan1594">xfs_db> 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> dblock 8388919</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="669.74121" + id="tspan1606">xfs_db> type dir2</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="685.36023" + id="tspan1608">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/61.svg b/design/XFS_Filesystem_Structure/images/code/SVG/61.svg new file mode 100644 index 0000000..2ffd254 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> type text</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan1780">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/65.svg b/design/XFS_Filesystem_Structure/images/code/SVG/65.svg new file mode 100644 index 0000000..8cb2452 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> type text</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan1900">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/66.svg b/design/XFS_Filesystem_Structure/images/code/SVG/66.svg new file mode 100644 index 0000000..1ef8303 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> 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 = "empty_attr"</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 = "trust_a"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="810.31219" + id="tspan2392">a.sfattr.list[1].value = "val1"</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 = "second"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="904.02618" + id="tspan2404">a.sfattr.list[2].value = "second_value"</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/design/XFS_Filesystem_Structure/images/code/SVG/67.svg b/design/XFS_Filesystem_Structure/images/code/SVG/67.svg new file mode 100644 index 0000000..b8a9abc --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> type text</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan2779">xfs_db> 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/design/XFS_Filesystem_Structure/images/code/SVG/71.svg b/design/XFS_Filesystem_Structure/images/code/SVG/71.svg new file mode 100644 index 0000000..1bc5cfa --- /dev/null +++ b/design/XFS_Filesystem_Structure/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/design/XFS_Filesystem_Structure/images/code/SVG/73-74.svg b/design/XFS_Filesystem_Structure/images/code/SVG/73-74.svg new file mode 100644 index 0000000..d200d49 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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> ablock 5</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="544.78925" + id="tspan3025">xfs_db> 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 = "attribute_310"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="904.02618" + id="tspan3071">nvlist[0].value = "value_310\d"</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 = "attribute_309"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="966.50214" + id="tspan3079">nvlist[1].value = "value_309\d"</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 = "attribute_308"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="1028.9781" + id="tspan3087">nvlist[2].value = "value_308\d"</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 = "attribute_307"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="1091.4541" + id="tspan3095">nvlist[3].value = "value_307\d"</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 = "attribute_268"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="1169.5492" + id="tspan3105">nvlist[82].value = "value_268\d"</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 = "attribute_267"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="1232.0251" + id="tspan3113">nvlist[83].value = "value_267\d"</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 = "attribute_266"</tspan><tspan + sodipodi:role="line" + x="40.848923" + y="1294.5011" + id="tspan3121">nvlist[84].value = "value_266\d"</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/design/XFS_Filesystem_Structure/images/code/SVG/74.svg b/design/XFS_Filesystem_Structure/images/code/SVG/74.svg new file mode 100644 index 0000000..b78e618 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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/design/XFS_Filesystem_Structure/images/icon.svg b/design/XFS_Filesystem_Structure/images/icon.svg new file mode 100644 index 0000000..c471a60 --- /dev/null +++ b/design/XFS_Filesystem_Structure/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="path2858" /> + <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/design/XFS_Filesystem_Structure/internal_inodes.asciidoc b/design/XFS_Filesystem_Structure/internal_inodes.asciidoc new file mode 100644 index 0000000..c3a3510 --- /dev/null +++ b/design/XFS_Filesystem_Structure/internal_inodes.asciidoc @@ -0,0 +1,182 @@ +[[Internal_Inodes]] += Internal Inodes + +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. + +[[Quota_Inodes]] +== Quota Inodes + +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. + +* Project quota's primary purpose is to track and monitor disk usage for +directories. For this to occur, the directory inode must have the ++XFS_DIFLAG_PROJINHERIT+ flag set so all inodes created underneath the directory +inherit the project ID. + +* Inodes and blocks owned by ID zero do not have enforced quotas, but only quota +accounting. + +* Extended attributes do not contribute towards the ID's quota. + +* To access each ID's quota information in the file, seek to the ID offset +multiplied by the size of +xfs_dqblk_t+ (136 bytes). + +.Quota inode layout +image::images/76.png[] + +Quota information stored in the two inodes (in data extents) are an array of the ++xfs_dqblk+ structure where there is one instance for each ID in the system: + +[source, c] +---- +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; +}; +struct xfs_dqblk { + struct xfs_disk_dquot dd_diskdq; + char dd_fill[32]; +}; +---- + +.d_magic +Specifies the signature where these two bytes are 0x4451 (+XFS_DQUOT_MAGIC+), +or "DQ" in ASCII. + +.d_version +Specifies the structure version, currently this is one (+XFS_DQUOT_VERSION+). + +.d_flags +Specifies which type of ID the structure applies to: + +[source, c] +---- +#define XFS_DQ_USER 0x0001 +#define XFS_DQ_PROJ 0x0002 +#define XFS_DQ_GROUP 0x0004 +---- + +.d_id</term> +The ID for the quota structure. This will be a uid, gid or projid based on the +value of +d_flags+. + +.d_blk_hardlimit +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, ++ENOSPC+ will be returned. + +.d_blk_softlimit +Specifies the soft limit for the number of filesystem blocks the ID can own. +The ID can temporarily use more space than by +d_blk_softlimit+ up to ++d_blk_hardlimit+. If the space is not freed by the time limit specified by ID +zero's +d_btimer+ value, the ID will be denied more space until the total +blocks owned goes below +d_blk_softlimit+. + +.d_ino_hardlimit +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 +d_icount+ reaches this value. + +.d_ino_softlimit +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. + +.d_bcount +Specifies how many filesystem blocks are actually owned by the ID. + +.d_icount +Specifies how many inodes are actually owned by the ID. + +.d_itimer +Specifies the time when the ID's +d_icount+ exceeded +d_ino_softlimit+. The soft +limit will turn into a hard limit after the elapsed time exceeds ID zero's ++d_itimer+ value. When d_icount goes back below +d_ino_softlimit+, +d_itimer+ +is reset back to zero. + +.d_btimer +Specifies the time when the ID's +d_bcount+ exceeded +d_blk_softlimit+. The soft +limit will turn into a hard limit after the elapsed time exceeds ID zero's ++d_btimer+ value. When d_bcount goes back below +d_blk_softlimit+, +d_btimer+ +is reset back to zero. + +.d_iwarns +.d_bwarns +.d_rtbwarns +Specifies how many times a warning has been issued. Currently not used. + +.d_rtb_hardlimit +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. + +.d_rtb_softlimit +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 +d_rtb_softlimit+ up to ++d_rtb_hardlimit+. If +d_rtbcount+ is not reduced by the time limit specified +by ID zero's +d_rtbtimer value+, the ID will be denied from owning more space +until the count goes below +d_rtb_softlimit+. + +.d_rtbcount +Specifies how many real-time blocks are currently owned by the ID. + +.d_rtbtimer +Specifies the time when the ID's +d_rtbcount+ exceeded +d_rtb_softlimit+. The +soft limit will turn into a hard limit after the elapsed time exceeds ID zero's ++d_rtbtimer+ value. When +d_rtbcount+ goes back below +d_rtb_softlimit+, ++d_rtbtimer+ is reset back to zero. + + +[[Real-time_Inodes]] +== Real-time Inodes + +There are two inodes allocated to managing the real-time device's space, the +Bitmap Inode and the Summary Inode. + +[[Real-Time_Bitmap_Inode]] +=== Real-Time Bitmap Inode + +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 +sb_rextsize+ value. + +The number of blocks used by the bitmap inode is equal to the number of +real-time extents (+sb_rextents+) divided by the block size (+sb_blocksize+) and +bits per byte. This value is stored in +sb_rbmblocks+. The nblocks and extent +array for the inode should match this. + +[source, c] + xfs_ino_t sb_rbmino; + +[[Real-Time_Summary_Inode]] +=== Real-Time Summary Inode + +The Summary Inode keeps the used/free space accounting information for the +real-time device. + +[source, c] + xfs_ino_t sb_rsumino; + diff --git a/design/XFS_Filesystem_Structure/journaling_log.asciidoc b/design/XFS_Filesystem_Structure/journaling_log.asciidoc new file mode 100644 index 0000000..77c4430 --- /dev/null +++ b/design/XFS_Filesystem_Structure/journaling_log.asciidoc @@ -0,0 +1,3 @@ += Journaling Log + TODO: + diff --git a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc new file mode 100644 index 0000000..017f607 --- /dev/null +++ b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc @@ -0,0 +1,448 @@ +[[On-disk_Inode]] += On-disk Inode + +All files, directories and links are stored on disk with inodes and descend from +the root inode with it's number defined in the xref:Superblocks[superblock]. The +previous section on xref:AG_Inode_Management[AG Inode Management] describes the +allocation and management of inodes on disk. This section describes the contents +of inodes themselves. + +An inode is divided into 3 parts: + +.On-disk inode sections +image::images/23.png[] + +* The core contains what the inode represents, stat data and information +describing the data and attribute forks. + +* The +di_u+ "data fork" contains normal data related to the inode. It's contents +depends on the file type specified by +di_core.di_mode+ (eg. regular file, +directory, link, etc) and how much information is contained in the file which +determined by +di_core.di_format+. The following union to represent this data is +declared as follows: + +[source, c] +---- +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; +---- + +* The di_a "attribute fork" contains extended attributes. Its layout is +determined by the +di_core.di_aformat+ value. Its representation is declared as +follows: + +[source, c] +---- +union { + xfs_bmdr_block_t di_abmbt; + xfs_bmbt_rec_t di_abmx[1]; + xfs_attr_shortform_t di_attrsf; +} di_a; +---- + +[NOTE] +The above two unions are rarely used in the XFS code, but the structures +within the union are directly cast depending on the +di_mode/di_format+ and ++di_aformat+ values. They are referenced in this document to make it easier to +explain the various structures in use within the inode. + +The remaining space in the inode after +di_next_unlinked+ where the two forks +are located is called the inode's "literal area". This starts at offset 100 +(0x64) in the inode. + +The space for each of the two forks in the literal area is determined by the +inode size, and +di_core.di_forkoff+. The data fork is located between the start +of the literal area and +di_forkoff+. The attribute fork is located between ++di_forkoff+ and the end of the inode. + + +[[Inode_Core]] +== Inode Core + +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: + +[source, c] +---- +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; +}; +---- + +.di_magic +The inode signature where these two bytes are 0x494e, or "IN" in ASCII. + +.di_mode +Specifies the mode access bits and type of file using the standard S_Ixxx values +defined in stat.h. + +.di_version +Specifies the inode version which currently can only be 1 or 2. The inode +version specifies the usage of the +di_onlink+, +di_nlink+ and +di_projid+ +values in the inode core. Initially, inodes are created as v1 but can be +converted on the fly to v2 when required. + +.di_format + +Specifies the format of the data fork in conjunction with the +di_mode+ 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. + +[source, c] +---- +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; +---- + +.di_onlink +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 +di_nlink+. + +.di_uid +Specifies the owner's UID of the inode. + +.di_gid +Specifies the owner's GID of the inode. + +.di_nlink +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 +di_pad+). + +.di_projid +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. + +.di_pad[8] +Reserved, must be zero. + +.di_flushiter +Incremented on flush. + +.di_atime + +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. + +[source, c] +---- +struct xfs_timestamp { + __int32_t t_sec; + __int32_t t_nsec; +}; +---- + +.di_mtime +Specifies the last time the file was modified. + +.di_ctime +Specifies when the inode's status was last changed. + +.di_size +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. + +.di_nblocks +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. + +.di_extsize +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 +XFS_DIFLAG_EXTSZINHERIT+ flag must be set in +di_flags+ if +this field is used. Inodes created in these directories will inherit the +di_extsize value and have +XFS_DIFLAG_EXTSIZE+ set in their +di_flags+. When a +file is written to beyond allocated space, XFS will attempt to allocate +additional disk space based on this value. + +.di_nextents +Specifies the number of data extents associated with this inode. + +.di_anextents +Specifies the number of extended attribute extents associated with this inode. + +.di_forkoff +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 ++di_forkoff+ depends on the +XFS_SB_VERSION2_ATTR2BIT+ flag in the superblock. +Refer to xref:Extended_Attribute_Versions[Extended Attribute Versions] for more +details. + +.di_aformat + +Specifies the format of the attribute fork. This uses the same values as ++di_format+, but restricted to "local", "extents" and "btree" formats for +extended attribute data. + +.di_dmevmask +DMAPI event mask. + +.di_dmstate +DMAPI state. + +.di_flags +Specifies flags associated with the inode. This can be a combination of the +following values: + +.Version 2 Inode flags +[options="header"] +|===== +| Flag | Description +| +XFS_SB_VERSION_ATTRBIT+ | Set if any inode have extended attributes. +| +XFS_DIFLAG_REALTIME+ | The inode's data is located on the real-time device. +| +XFS_DIFLAG_PREALLOC+ | The inode's extents have been preallocated. +| +XFS_DIFLAG_NEWRTBM+ | +Specifies the +sb_rbmino+ uses the new real-time bitmap format + +| +XFS_DIFLAG_IMMUTABLE+ | Specifies the inode cannot be modified. +| +XFS_DIFLAG_APPEND+ | The inode is in append only mode. +| +XFS_DIFLAG_SYNC+ | The inode is written synchronously. +| +XFS_DIFLAG_NOATIME+ | The inode's +di_atime+ is not updated. +| +XFS_DIFLAG_NODUMP+ | Specifies the inode is to be ignored by xfsdump. +| +XFS_DIFLAG_RTINHERIT+ | +For directory inodes, new inodes inherit the +XFS_DIFLAG_REALTIME+ bit. + +| +XFS_DIFLAG_PROJINHERIT+ | +For directory inodes, new inodes inherit the +di_projid+ value. + +| +XFS_DIFLAG_NOSYMLINKS+ | +For directory inodes, symlinks cannot be created. + +| +XFS_DIFLAG_EXTSIZE+ | +Specifies the extent size for real-time files or a and extent size hint for regular files. + +| +XFS_DIFLAG_EXTSZINHERIT+ | +For directory inodes, new inodes inherit the +di_extsize+ value. + +| +XFS_DIFLAG_NODEFRAG+ | +Specifies the inode is to be ignored when defragmenting the filesystem. + +|===== + +.di_gen +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. + + +[[Unlinked_Pointer]] +== Unlinked Pointer + +The +di_next_unlinked+ 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 +xref:AG_Inode_Management[AGI's] +agi_unlinked+ hash buckets. The AGI unlinked +bucket points to an inode and the +di_next_unlinked+ value points to the next +inode in the chain. The last inode in the chain has +di_next_unlinked+ set to +NULL (-1). + +Once the last reference is released, the inode is removed from the unlinked hash +chain, and +di_next_unlinked+ 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. + +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. + + +.Unlinked inode pointer +image::images/28.png[] + +[[Data_Fork]] +== Data Fork + +The structure of the inode's data fork based is on the inode's type and ++di_format+. 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 ++di_forkoff+. In code, use the +XFS_DFORK_PTR+ macro specifying +XFS_DATA_FORK+ +for the "which" parameter. Alternatively, the +XFS_DFORK_DPTR+ macro can be +used. + +Each of the following sub-sections summarises the contents of the data fork +based on the inode type. + + +[[Regular_Files_S_IFREG]] +=== Regular Files (S_IFREG) + +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: + +* +XFS_DINODE_FMT_EXTENTS+: 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 +XFS_DFORK_DPTR+ to ++xfs_bmbt_rec_t*+. + +* +XFS_DINODE_FMT_BTREE+: 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 +XFS_DFORK_DPTR+ to +xfs_bmdr_block_t*+. + + +Details for each of these data extent formats are covered in the +xref:Data_Extents[Data Extents] later on. + + + +[[Directories_S_IFDIR]] +=== Directories (S_IFDIR) + +The data fork contains the directory's entries and associated data. The format +of the entries is also determined by the +di_format+ value and can be one of 3 +formats: + +* +XFS_DINODE_FMT_LOCAL+: The directory entries are fully contained within the +inode. This is accessed by casting the value from +XFS_DFORK_DPTR+ to ++xfs_dir2_sf_t*+. + +* +XFS_DINODE_FMT_EXTENTS+: The actual directory entries are located in another +filesystem block, the inode contains an array of extents to these filesystem +blocks (+xfs_bmbt_rec_t*+). + +* +XFS_DINODE_FMT_BTREE+: The directory entries are contained in the leaves of a +B+tree. The inode contains the root node (+xfs_bmdr_block_t*+). + +Details for each of these directory formats are covered in the +xref:Directories[Directories] later on. + + +[[Symbolic_Links_S_IFLNK]] +=== Symbolic Links (S_IFLNK) + +The data fork contains the contents of the symbolic link. The format of the link +is determined by the +di_format+ value and can be one of 2 formats: + +* +XFS_DINODE_FMT_LOCAL+: The symbolic link is fully contained within the inode. +This is accessed by casting the return value from +XFS_DFORK_DPTR+ to +char*+. + +* +XFS_DINODE_FMT_EXTENTS+: The actual symlink is located in another filesystem +block, the inode contains the extents to these filesystem blocks +(+xfs_bmbt_rec_t*+). + +Details for symbolic links is covered in the xref:Symbolic_Links[Symbolic Links] +later on. + +[[Other_File_Types]] +=== Other File Types + +For character and block devices (+S_IFCHR+ and +S_IFBLK+), cast the value from ++XFS_DFORK_DPTR+ to +xfs_dev_t*+. + + + + +[[Attribute_Fork]] +== Attribute Fork + +The attribute fork in the inode always contains the location of the extended +attributes associated with the inode. + +The location of the attribute fork in the inode's literal area (offset 100 to +the end of the inode) is specified by the +di_forkoff+ 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 = +di_forkoff+ * 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 +XFS_DFORK_PTR+ macro specifying +XFS_ATTR_FORK+ for the "which" parameter. +Alternatively, the +XFS_DFORK_APTR+ macro can be used. + +Which structure in the attribute fork is used depends on the +di_aformat+ value +in the inode. It can be one of the following values: + +* +XFS_DINODE_FMT_LOCAL+: The extended attributes are contained entirely within +the inode. This is accessed by casting the value from +XFS_DFORK_APTR+ to ++xfs_attr_shortform_t*+. + +* +XFS_DINODE_FMT_EXTENTS+: 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 +XFS_DFORK_APTR+ to +xfs_bmbt_rec_t*+. + +* +XFS_DINODE_FMT_BTREE+: 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 +XFS_DFORK_APTR+ to +xfs_bmdr_block_t*+. + +Detailed information on the layouts of extended attributes are covered in the +xref:Extended_Attributes[Extended Attributes] in this document. + + + +[[Extended_Attribute_Versions]] +=== Extended Attribute Versions + +Extended attributes come in two versions: "attr1" or "attr2". The attribute +version is specified by the +XFS_SB_VERSION2_ATTR2BIT+ flag in the ++sb_features2+ field in the superblock. It determines how the inode's extra +space is split between +di_u+ and +di_a+ forks which also determines how the ++di_forkoff+ value is maintained in the inode's core. + +With "attr1" attributes, the +di_forkoff+ 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 +di_forkoff+, it will move the data to the level +format level (ie. local < extent < 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. + +"Attr2" was introduced to maximum the utilisation of the inode's literal area. +The +di_forkoff+ 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. + +The following diagram compares the two versions: + +.Extended attribute layouts +image::images/30.png[] + diff --git a/design/XFS_Filesystem_Structure/symbolic_links.asciidoc b/design/XFS_Filesystem_Structure/symbolic_links.asciidoc new file mode 100644 index 0000000..9c9ca30 --- /dev/null +++ b/design/XFS_Filesystem_Structure/symbolic_links.asciidoc @@ -0,0 +1,81 @@ +[[Symbolic_Links]] += Symbolic Links + +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 ++di_size+ value. + + +[[Shortform_Symbolic_Links]] +== Shortform Symbolic Links + +Symbolic links are stored with the "local" +di_format+ if the symbolic link can +fit within the inode's data fork. The link data is an array of characters +(+di_symlink+ array in the data fork union). + +.Symbolic link shortform layout +image::images/61.png[] + +=== Shortform symbolic link xfs_db example + +A short symbolic link to a file is created: + +---- +xfs_db> inode <inode#> +xfs_db> 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" +---- + +Raw on-disk data with the link contents highlighted: + +.Shortform symbolic link format +image::images/code/61.png[] + + +[[Extent_Symbolic_Links]] +== Extent Symbolic Links + +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 ++di_format+ is changed to "extents". The location of the block(s) is specified +by the data fork's +di_bmx[]+ array. In the significant majority of cases, this +will be in one filesystem block as a symlink cannot be longer than 1024 +characters. + +.Symbolic link extent layout +image::images/62.png[] + +=== Symbolic link extent xfs_db example + +A longer link is created (greater than 156 bytes): + +---- +xfs_db> inode <inode#> +xfs_db> 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> dblock 0 +xfs_db> type symlink +xfs_db> p +"symlink contents..." +---- + diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc new file mode 100644 index 0000000..226bb25 --- /dev/null +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -0,0 +1,53 @@ +// This is based on a multi-book template where each chapter uses level 1 +// headings. See doc/multi-book.txt as the example from asciidoc documentation. +// +// We pull in the document info in xml format from docinfo.xml. We do this +// because asciidoc is unable to handle multiple entry revision histories, +// and we really need an area to set up various docbook sections like copyright +// and legal notice sections. +// +XFS Filesystem Structure +======================== +:doctype: book +:docinfo1: + +Introduction +============ + +[partintro] +-- +This document describes the layout of an XFS filesystem. + +It shows how to manually inspect it by showing examples using the xfs_db +user-space tool supplied with the XFS filesystem driver. + +TODO: More description. +-- + +// Push titles down one level +:leveloffset: 1 + +include::common_types.asciidoc[] + +// return titles to normal +:leveloffset: 0 + +Global Structures +================= + +:leveloffset: 1 +include::allocation_groups.asciidoc[] +include::journaling_log.asciidoc[] +include::internal_inodes.asciidoc[] +:leveloffset: 0 + +Dynamically Allocated Structures +================================ + +:leveloffset: 1 +include::ondisk_inode.asciidoc[] +include::data_extents.asciidoc[] +include::extended_attributes.asciidoc[] +include::directories.asciidoc[] +include::symbolic_links.asciidoc[] +:leveloffset: 0 |