xfs
[Top] [All Lists]

TAKE 928864 - [SUSE#76685] Inode extent management causes high order pag

To: linux-xfs@xxxxxxx, sgi.bugs.xfs@xxxxxxx
Subject: TAKE 928864 - [SUSE#76685] Inode extent management causes high order page allocations
From: alkirkco@xxxxxxx (Amanda Kirkconnell)
Date: Thu, 2 Mar 2006 18:43:18 -0600 (CST)
Sender: linux-xfs-bounce@xxxxxxxxxxx
This mod introduces multi-level in-core file extent functionality,
building upon the new layout introduced in mod xfs-linux:xfs-kern:207390a.

The new multi-level extent allocations are only required for heavily
fragmented files, so the old-style linear extent list is used on files
until the extents reach a pre-determined size of 4k. 4k buffers are
used because this is the system page size on Linux i386 and systems
with larger page sizes don't seem to gain much, if anything, by using
their native page size as the extent buffer size. Also, using 4k extent
buffers everywhere provides a consistent interface for CXFS across
different platforms.

The 4k extent buffers are managed by an indirection array (xfs_ext_irec_t)
which is basically just a pointer array with a bit of extra information
to keep track of the number of extents in each buffer as well as the
extent offset of each buffer.

Major changes include:

- Add multi-level in-core file extent functionality to the xfs_iext_
  subroutines introduced in mod:  xfs-linux:xfs-kern:207390a

- Introduce 13 new subroutines which add functionality for multi-level
  in-core file extents:
        xfs_iext_add_indirect_multi()
        xfs_iext_remove_indirect()
        xfs_iext_realloc_indirect()
        xfs_iext_indirect_to_direct()
        xfs_iext_bno_to_irec()
        xfs_iext_idx_to_irec()
        xfs_iext_irec_init()
        xfs_iext_irec_new()
        xfs_iext_irec_remove()
        xfs_iext_irec_compact()
        xfs_iext_irec_compact_pages()
        xfs_iext_irec_compact_full()
        xfs_iext_irec_update_extoffs()

Date:  Thu Mar  2 16:40:32 PST 2006
Workarea:  attica.americas.sgi.com:/data/lwork/attica2/alkirkco/XFS/2.6.x-xfs
Inspected by:  olaf,gwehrman,dgc,nathans

The following file(s) were checked into:
  bonnie.engr.sgi.com:/isms/linux/2.6.x-xfs


Modid:  xfs-linux:xfs-kern:207393a
fs/xfs/xfs_bmap_btree.h - 1.72 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_bmap_btree.h.diff?r1=text&tr1=1.72&r2=text&tr2=1.71&f=h
        - Remove xfs_bmap_do_search_extents() prototype, move to xfs_bmap.h
          (which is where it should have gone in the first place).

fs/xfs/xfs_inode.c - 1.427 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_inode.c.diff?r1=text&tr1=1.427&r2=text&tr2=1.426&f=h
        - Add multi-level in-core extent functionality to xfs_iext_* subroutines
          introduced in mod xfs-linux:xfs-kern:207390a.
        - Add 13 new subroutines which add functionality for multi-level in-core
          file extents:
          xfs_iext_add_indirect_multi()
          xfs_iext_remove_indirect()
          xfs_iext_realloc_indirect()
          xfs_iext_indirect_to_direct()
          xfs_iext_bno_to_irec()
          xfs_iext_idx_to_irec()
          xfs_iext_irec_init()
          xfs_iext_irec_new()
          xfs_iext_irec_remove()
          xfs_iext_irec_compact()
          xfs_iext_irec_compact_pages()
          xfs_iext_irec_compact_full()
          xfs_iext_irec_update_extoffs()

fs/xfs/xfs_inode.h - 1.209 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_inode.h.diff?r1=text&tr1=1.209&r2=text&tr2=1.208&f=h
        - Define xfs_ext_irec_t struct to manage multiple extent buffers
        - Define macro for XFS_IEXT_BUFSZ, hard-coded to 4k
        - Define macro for XFS_LINEAR_EXTS (ext buf size / ext rec size)
        - Define XFS_IFEXTIREC ifork flag (if_flag ) to switch between regular
          (linear) extent allocations and multi-level extent allocations
        - Add prototypes for new xfs_iext_* functions in xfs_inode.c.

fs/xfs/xfs_bmap.h - 1.94 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_bmap.h.diff?r1=text&tr1=1.94&r2=text&tr2=1.93&f=h
        - Move xfs_bmap_do_search_extents() prototype from xfs_bmap_btree.h to
          xfs_bmap.h (which is where it should have gone in the first place)
        - Define prototype for new xfs_bmap_search_multi_extents().

fs/xfs/xfs_bmap.c - 1.341 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_bmap.c.diff?r1=text&tr1=1.341&r2=text&tr2=1.340&f=h
        - Add a new subroutine called xfs_bmap_search_multi_extents(), which 
locates
          the target extent buffer, if in multi-level allocation mode, then 
calls
          xfs_bmap_do_search_extents() with either the target extent list or the
          direct extent list (depending on which allocation mode is being used).
        - Modify xfs_bmap_search_extents() to call 
xfs_bmap_search_multi_extents()
          rather than xfs_bmap_do_search_extents().

fs/xfs/linux-2.6/xfs_ksyms.c - 1.40 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_ksyms.c.diff?r1=text&tr1=1.40&r2=text&tr2=1.39&f=h
        - Export new function needed by CXFS 4.1: xfs_iext_idx_to_irec()

fs/xfs/linux-2.4/xfs_ksyms.c - 1.35 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.4/xfs_ksyms.c.diff?r1=text&tr1=1.35&r2=text&tr2=1.34&f=h
        - Export new function needed by CXFS 4.1: xfs_iext_idx_to_irec()



<Prev in Thread] Current Thread [Next in Thread>