19 Dec, 2013

1 commit

  • Although it was removed in commit 051e7cd44ab8, ilock needs to be taken in
    xfs_readdir because we might have to read the extent list in from disk. This
    keeps other threads from reading from or writing to the extent list while it is
    being read in and is still in a transitional state.

    This has been associated with "Access to block zero" messages on directories
    with large numbers of extents resulting from excessive filesytem fragmentation,
    as well as extent list corruption. Unfortunately no test case at this point.

    Signed-off-by: Ben Myers
    Reviewed-by: Dave Chinner

    Ben Myers
     

31 Oct, 2013

5 commits

  • Many of the vectorised function calls now take no parameters and
    return a constant value. There is no reason for these to be vectored
    functions, so convert them to constants

    Binary sizes:

    text data bss dec hex filename
    794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig
    792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1
    792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2
    789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3
    789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4
    789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5
    789733 96802 1096 887631 d8b4f fs/xfs/xfs.o.p6
    791421 96802 1096 889319 d91e7 fs/xfs/xfs.o.p7
    791701 96802 1096 889599 d92ff fs/xfs/xfs.o.p8
    791205 96802 1096 889103 d91cf fs/xfs/xfs.o.p9

    Signed-off-by: Dave Chinner
    Reviewed-by: Ben Myers
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • Convert the rest of the directory data block encode/decode
    operations to vector format.

    This further reduces the size of the built binary:

    text data bss dec hex filename
    794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig
    792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1
    792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2
    789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3
    789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • Following from the initial patches to vectorise the shortform
    directory encode/decode operations, convert half the data block
    operations to use the vector. The rest will be done in a second
    patch.

    This further reduces the size of the built binary:

    text data bss dec hex filename
    794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig
    792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1
    792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2
    789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • Following from the initial patch to introduce the directory
    operations vector, convert the rest of the shortform directory
    operations to use vectored ops rather than superblock feature
    checks. This further reduces the size of the built binary:

    text data bss dec hex filename
    794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig
    792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1
    792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • Lots of the dir code now goes through switches to determine what is
    the correct on-disk format to parse. It generally involves a
    "xfs_sbversion_hasfoo" check, deferencing the superblock version and
    feature fields and hence touching several cache lines per operation
    in the process. Some operations do multiple checks because they nest
    conditional operations and they don't pass the information in a
    direct fashion between each other.

    Hence, add an ops vector to the xfs_inode structure that is
    configured when the inode is initialised to point to all the correct
    decode and encoding operations. This will significantly reduce the
    branchiness and cacheline footprint of the directory object decoding
    and encoding.

    This is the first patch in a series of conversion patches. It will
    introduce the ops structure, the setup of it and add the first
    operation to the vector. Subsequent patches will convert directory
    ops one at a time to keep the changes simple and obvious.

    Just this patch shows the benefit of such an approach on code size.
    Just converting the two shortform dir operations as this patch does
    decreases the built binary size by ~1500 bytes:

    $ size fs/xfs/xfs.o.orig fs/xfs/xfs.o.p1
    text data bss dec hex filename
    794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig
    792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1
    $

    That's a significant decrease in the instruction cache footprint of
    the directory code for such a simple change, and indicates that this
    approach is definitely worth pursuing further.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Ben Myers

    Dave Chinner
     

24 Oct, 2013

3 commits

  • Currently the xfs_inode.h header has a dependency on the definition
    of the BMAP btree records as the inode fork includes an array of
    xfs_bmbt_rec_host_t objects in it's definition.

    Move all the btree format definitions from xfs_btree.h,
    xfs_bmap_btree.h, xfs_alloc_btree.h and xfs_ialloc_btree.h to
    xfs_format.h to continue the process of centralising the on-disk
    format definitions. With this done, the xfs inode definitions are no
    longer dependent on btree header files.

    The enables a massive culling of unnecessary includes, with close to
    200 #include directives removed from the XFS kernel code base.

    Signed-off-by: Dave Chinner
    Reviewed-by: Ben Myers
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • xfs_trans.h has a dependency on xfs_log.h for a couple of
    structures. Most code that does transactions doesn't need to know
    anything about the log, but this dependency means that they have to
    include xfs_log.h. Decouple the xfs_trans.h and xfs_log.h header
    files and clean up the includes to be in dependency order.

    In doing this, remove the direct include of xfs_trans_reserve.h from
    xfs_trans.h so that we remove the dependency between xfs_trans.h and
    xfs_mount.h. Hence the xfs_trans.h include can be moved to the
    indicate the actual dependencies other header files have on it.

    Note that these are kernel only header files, so this does not
    translate to any userspace changes at all.

    Signed-off-by: Dave Chinner
    Reviewed-by: Ben Myers
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • The on-disk format definitions for the directory and attribute
    structures are spread across 3 header files right now, only one of
    which is dedicated to defining on-disk structures and their
    manipulation (xfs_dir2_format.h). Pull all the format definitions
    into a single header file - xfs_da_format.h - and switch all the
    code over to point at that.

    Signed-off-by: Dave Chinner
    Reviewed-by: Ben Myers
    Signed-off-by: Ben Myers

    Dave Chinner
     

01 Oct, 2013

1 commit

  • The determination of whether a directory entry contains a dtype
    field originally was dependent on the filesystem having CRCs
    enabled. This meant that the format for dtype beign enabled could be
    determined by checking the directory block magic number rather than
    doing a feature bit check. This was useful in that it meant that we
    didn't need to pass a struct xfs_mount around to functions that
    were already supplied with a directory block header.

    Unfortunately, the introduction of dtype fields into the v4
    structure via a feature bit meant this "use the directory block
    magic number" method of discriminating the dirent entry sizes is
    broken. Hence we need to convert the places that use magic number
    checks to use feature bit checks so that they work correctly and not
    by chance.

    The current code works on v4 filesystems only because the dirent
    size roundup covers the extra byte needed by the dtype field in the
    places where this problem occurs.

    Signed-off-by: Dave Chinner
    Reviewed-by: Ben Myers
    Signed-off-by: Ben Myers

    Dave Chinner
     

22 Aug, 2013

1 commit

  • Add support for the file type field in directory entries so that
    readdir can return the type of the inode the dirent points to to
    userspace without first having to read the inode off disk.

    The encoding of the type field is a single byte that is added to the
    end of the directory entry name length. For all intents and
    purposes, it appends a "hidden" byte to the name field which
    contains the type information. As the directory entry is already of
    dynamic size, helpers are already required to access and decode the
    direct entry structures.

    Hence the relevent extraction and iteration helpers are updated to
    understand the hidden byte. Helpers for reading and writing the
    filetype field from the directory entries are also added. Only the
    read helpers are used by this patch. It also adds all the code
    necessary to read the type information out of the dirents on disk.

    Further we add the superblock feature bit and helpers to indicate
    that we understand the on-disk format change. This is not a
    compatible change - existing kernels cannot read the new format
    successfully - so an incompatible feature flag is added. We don't
    yet allow filesystems to mount with this flag yet - that will be
    added once write support is added.

    Finally, the code to take the type from the VFS, convert it to an
    XFS on-disk type and put it into the xfs_name structures passed
    around is added, but the directory code does not use this field yet.
    That will be in the next patch.

    Signed-off-by: Dave Chinner
    Reviewed-by: Mark Tinguely
    Signed-off-by: Ben Myers

    Dave Chinner
     

13 Aug, 2013

2 commits

  • Many of the definitions within xfs_dir2_priv.h are needed in
    userspace outside libxfs. Definitions within xfs_dir2_priv.h are
    wholly contained within libxfs, so we need to shuffle some of the
    definitions around to keep consistency across files shared between
    user and kernel space.

    Signed-off-by: Dave Chinner
    Reviewed-by: Brian Foster
    Reviewed-by: Mark Tinguely
    Signed-off-by: Ben Myers

    Dave Chinner
     
  • The directory readdir code is not used by userspace, but it is
    intermingled with files that are shared with userspace. This makes
    it difficult to compare the differences between the userspac eand
    kernel files are the userspace files don't have the getdents code in
    them. Move all the kernel getdents code to a separate file to bring
    the shared content between userspace and kernel files closer
    together.

    Signed-off-by: Dave Chinner
    Reviewed-by: Brian Foster
    Reviewed-by: Mark Tinguely
    Signed-off-by: Ben Myers

    Dave Chinner