On Mon, Mar 4, 2013 at 7:57 PM, Aastha Mehta <aasth...@gmail.com> wrote:
> I must admit, it is quite convoluted :-)
>
> Please tell me if I understand this. A file system tree (containing
> the inodes, the extents of all the inodes, etc.) is itself laid out in
> the leaf extents of another big tree, which is the root tree. This is
> why you say that inode and other such metadata may be lying in the
> leaf nodes. Correct?
>

Sort of.  We have lot's of tree's, but the inode data is laid out in
what we refer to as fs trees.  All these trees are just b-trees that
have different data in them.  In the fs-trees they will hold inode
items, directory items, file extent items, xattr items and orphan
items.  So any given leaf in this tree could have any number of those
items in them referring to any number of inodes.  You could have

[inode item for inode 1][file extent item for inode 1][inode item for
inode 2][xattr for inode 2][file extent item for inode 2]

all contained within one leaf.  Does that make sense?

> I did not completely understand what you meant when you said that the
> metadata (the file extent items and such) for the inodes are stored
> inside the same tree that the inode resides in. I thought the
> btrfs_file_extent_item associated with EXTENT_DATA_KEY corresponds to
> the actual data of a file.
>

Yes the btrfs_file_extent_item points to a [offset, size] pair that
describes a data extent.

> Okay, now I am not even sure if in btrfs there is something like an
> indirect block for a huge file. In file systems with fixed block size,
> one can hold only as many pointers to data blocks and hence when the
> file size grows indirects are added in the file's tree. Is there any
> equivalent indirect extent required for huge files in btrfs, or do all
> the files fit within one level? If there are indirects, what item type
> do they have? Would something like btrfs_get_extent() be useful to get
> the indirect extents of a file?
>

So there are no indirects, there are just btrfs_file_extent_items that
are held within the btree that describe all of the extents that relate
to a particular file.  So you can have (in the case of large
fragmented files) hundreds of leaves within the btree that just
contain btrfs_file_extent_items for all the ranges for a file.
btrfs_get_extent() just looks up the relevant btrfs_file_extent_item
for the range that you are wondering about, and maps it to our
extent_map structure internally.  Hth,

Josef
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to