1. 29 Jul, 2012 8 commits
  2. 22 Jul, 2012 7 commits
  3. 13 Jul, 2012 4 commits
  4. 01 Jul, 2012 9 commits
    • Dave Chinner's avatar
      xfs: factor buffer reading from xfs_dir2_leaf_getdents · 9b73bd7b
      Dave Chinner authored
      The buffer reading code in xfs_dir2_leaf_getdents is complex and difficult to
      follow due to the readahead and all the context is carries. it is also badly
      indented and so difficult to read. Factor it out into a separate function to
      make it easier to understand and optimise in future patches.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      9b73bd7b
    • Dave Chinner's avatar
      xfs: remove struct xfs_dabuf and infrastructure · 1d9025e5
      Dave Chinner authored
      The struct xfs_dabuf now only tracks a single xfs_buf and all the
      information it holds can be gained directly from the xfs_buf. Hence
      we can remove the struct dabuf and pass the xfs_buf around
      everywhere.
      
      Kill the struct dabuf and the associated infrastructure.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      1d9025e5
    • Dave Chinner's avatar
      xfs: use discontiguous xfs_buf support in dabuf wrappers · 3605431f
      Dave Chinner authored
      First step in converting the directory code to use native
      discontiguous buffers and replacing the dabuf construct.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      3605431f
    • Dave Chinner's avatar
      xfs: support discontiguous buffers in the xfs_buf_log_item · 372cc85e
      Dave Chinner authored
      discontigous buffer in separate buffer format structures. This means log
      recovery will recover all the changes on a per segment basis without
      requiring any knowledge of the fact that it was logged from a
      compound buffer.
      
      To do this, we need to be able to determine what buffer segment any
      given offset into the compound buffer sits over. This enables us to
      translate the dirty bitmap in the number of separate buffer format
      structures required.
      
      We also need to be able to determine the number of bitmap elements
      that a given buffer segment has, as this determines the size of the
      buffer format structure. Hence we need to be able to determine the
      both the start offset into the buffer and the length of a given
      segment to be able to calculate this.
      
      With this information, we can preallocate, build and format the
      correct log vector array for each segment in a compound buffer to
      appear exactly the same as individually logged buffers in the log.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      372cc85e
    • Dave Chinner's avatar
      xfs: add discontiguous buffer support to transactions · de2a4f59
      Dave Chinner authored
      Now that the buffer cache supports discontiguous buffers, add
      support to the transaction buffer interface for getting and reading
      buffers.
      
      Note that this patch does not convert the buffer item logging to
      support discontiguous buffers. That will be done as a separate
      commit.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      de2a4f59
    • Dave Chinner's avatar
      xfs: add discontiguous buffer map interface · 6dde2707
      Dave Chinner authored
      With the internal interfaces supporting discontiguous buffer maps,
      add external lookup, read and get interfaces so they can start to be
      used.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      6dde2707
    • Dave Chinner's avatar
      xfs: convert internal buffer functions to pass maps · 3e85c868
      Dave Chinner authored
      While the external interface currently uses separate blockno/length
      variables, we need to move internal interfaces to passing and
      parsing vector maps. This will then allow us to add external
      interfaces to support discontiguous buffer maps as the internal code
      will already support them.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      3e85c868
    • Dave Chinner's avatar
      xfs: separate buffer indexing from block map · cbb7baab
      Dave Chinner authored
      To support discontiguous buffers in the buffer cache, we need to
      separate the cache index variables from the I/O map. While this is
      currently a 1:1 mapping, discontiguous buffer support will break
      this relationship.
      
      However, for caching purposes, we can still treat them the same as a
      contiguous buffer - the block number of the first block and the
      length of the buffer - as that is still a unique representation.
      Also, the only way we will ever access the discontiguous regions of
      buffers is via bulding the complete buffer in the first place, so
      using the initial block number and entire buffer length is a sane
      way to index the buffers.
      
      Add a block mapping vector construct to the xfs_buf and use it in
      the places where we are doing IO instead of the current
      b_bn/b_length variables.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      cbb7baab
    • Dave Chinner's avatar
      xfs: struct xfs_buf_log_format isn't variable sized. · 77c1a08f
      Dave Chinner authored
      The struct xfs_buf_log_format wants to think the dirty bitmap is
      variable sized.  In fact, it is variable size on disk simply due to
      the way we map it from the in-memory structure, but we still just
      use a fixed size memory allocation for the in-memory structure.
      
      Hence it makes no sense to set the function up as a variable sized
      structure when we already know it's maximum size, and we always
      allocate it as such. Simplify the structure by making the dirty
      bitmap a fixed sized array and just using the size of the structure
      for the allocation size.
      
      This will make it much simpler to allocate and manipulate an array
      of format structures for discontiguous buffer support.
      
      The previous struct xfs_buf_log_item size according to
      /proc/slabinfo was 224 bytes. pahole doesn't give the same size
      because of the variable size definition. With this modification,
      pahole reports the same as /proc/slabinfo:
      
      	/* size: 224, cachelines: 4, members: 6 */
      
      Because the xfs_buf_log_item size is now determined by the maximum
      supported block size we introduce a dependency on xfs_alloc_btree.h.
      Avoid this dependency by moving the idefines for the maximum block
      sizes supported to xfs_types.h with all the other max/min type
      defines to avoid any new dependencies.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      77c1a08f
  5. 21 Jun, 2012 6 commits
  6. 14 Jun, 2012 6 commits
    • Chen Baozi's avatar
      xfs: fix typo in comment of xfs_dinode_t. · 51c84223
      Chen Baozi authored
      There should be "XFS_DFORK_DPTR, XFS_DFORK_APTR, and XFS_DFORK_PTR" instead
      of "XFS_DFORK_PTR, XFS_DFORK_DPTR, and XFS_DFORK_PTR".
      Signed-off-by: default avatarChen Baozi <baozich@gmail.com>
      Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      51c84223
    • Dave Chinner's avatar
      xfs: kill copy and paste segment checks in xfs_file_aio_read · 52764329
      Dave Chinner authored
      The generic segment check code now returns a count of the number of
      bytes in the iovec, so we don't need to roll our own anymore.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      52764329
    • Dave Chinner's avatar
      xfs: make largest supported offset less shouty · 32972383
      Dave Chinner authored
      XFS_MAXIOFFSET() is just a simple macro that resolves to
      mp->m_maxioffset. It doesn't need to exist, and it just makes the
      code unnecessarily loud and shouty.
      
      Make it quiet and easy to read.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarEric Sandeen <sandeen@redhat.com>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      32972383
    • Dave Chinner's avatar
      xfs: m_maxioffset is redundant · d2c28191
      Dave Chinner authored
      The m_maxioffset field in the struct xfs_mount contains the same
      value as the superblock s_maxbytes field. There is no need to carry
      two copies of this limit around, so use the VFS superblock version.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarEric Sandeen <sandeen@redhat.com>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      d2c28191
    • Jeff Liu's avatar
      xfs: fix debug_object WARN at xfs_alloc_vextent() · 0f2cf9d3
      Jeff Liu authored
      Fengguang reports:
      
      [  780.529603] XFS (vdd): Ending clean mount
      [  781.454590] ODEBUG: object is on stack, but not annotated
      [  781.455433] ------------[ cut here ]------------
      [  781.455433] WARNING: at /c/kernel-tests/sound/lib/debugobjects.c:301 __debug_object_init+0x173/0x1f1()
      [  781.455433] Hardware name: Bochs
      [  781.455433] Modules linked in:
      [  781.455433] Pid: 26910, comm: kworker/0:2 Not tainted 3.4.0+ #51
      [  781.455433] Call Trace:
      [  781.455433]  [<ffffffff8106bc84>] warn_slowpath_common+0x83/0x9b
      [  781.455433]  [<ffffffff8106bcb6>] warn_slowpath_null+0x1a/0x1c
      [  781.455433]  [<ffffffff814919a5>] __debug_object_init+0x173/0x1f1
      [  781.455433]  [<ffffffff81491c65>] debug_object_init+0x14/0x16
      [  781.455433]  [<ffffffff8108842a>] __init_work+0x20/0x22
      [  781.455433]  [<ffffffff8134ea56>] xfs_alloc_vextent+0x6c/0xd5
      
      Use INIT_WORK_ONSTACK in xfs_alloc_vextent instead of INIT_WORK.
      Reported-by: default avatarWu Fengguang <wfg@linux.intel.com>
      Signed-off-by: default avatarJie Liu <jeff.liu@oracle.com>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      0f2cf9d3
    • Alain Renaud's avatar
      xfs: xfs_vm_writepage clear iomap_valid when !buffer_uptodate (REV2) · 7d0fa3ec
      Alain Renaud authored
      On filesytems with a block size smaller than PAGE_SIZE we currently have
      a problem with unwritten extents.  If a we have multi-block page for
      which an unwritten extent has been allocated, and only some of the
      buffers have been written to, and they are not contiguous, we can expose
      stale data from disk in the blocks between the writes after extent
      conversion.
      
      Example of a page with unwritten and real data.
      buffer  content
      0       empty  b_state = 0
      1       DATA   b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten
      2       DATA   b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten
      3       empty  b_state = 0
      4       empty  b_state = 0
      5       DATA   b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten
      6       DATA   b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten
      7       empty  b_state = 0
      
      Buffers 1, 2, 5, and 6 have been written to, leaving 0, 3, 4, and 7
      empty.  Currently buffers 1, 2, 5, and 6 are added to a single ioend,
      and when IO has completed, extent conversion creates a real extent from
      block 1 through block 6, leaving 0 and 7 unwritten.  However buffers 3
      and 4 were not written to disk, so stale data is exposed from those
      blocks on a subsequent read.
      
      Fix this by setting iomap_valid = 0 when we find a buffer that is not
      Uptodate.  This ensures that buffers 5 and 6 are not added to the same
      ioend as buffers 1 and 2.  Later these blocks will be converted into two
      separate real extents, leaving the blocks in between unwritten.
      Signed-off-by: default avatarAlain Renaud <arenaud@sgi.com>
      Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      7d0fa3ec