1. 02 Oct, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Remove uneeded endian conversion · 48516ced
      Steven Whitehouse authored
      In many places GFS2 was calling the endian conversion routines
      for an inode even when only a single field, or a few fields might
      have changed. As a result we were copying lots of data needlessly.
      This patch replaces those calls with conversion of just the
      required fields in each case. This should be faster and easier
      to understand. There are still other places which suffer from this
      problem, but this is a start in the right direction.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  2. 25 Sep, 2006 1 commit
  3. 21 Sep, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Tidy up meta_io code · 7276b3b0
      Steven Whitehouse authored
      Fix a bug in the directory reading code, where we might have dereferenced
      a NULL pointer in case of OOM. Updated the directory code to use the new
      & improved version of gfs2_meta_ra() which now returns the first block
      that was being read. Previously it was releasing it requiring following
      code to grab the block again at each point it was called.
      Also turned off readahead on directory lookups since we are reading a
      hash table, and therefore reading the entries in order is very
      unlikely. Readahead is still used for all other calls to the
      directory reading function (e.g. when growing the hash table).
      Removed the DIO_START constant. Everywhere this was used, it was
      used to unconditionally start i/o aside from a couple of places, so
      I've removed it and made the couple of exceptions to this rule into
      separate functions.
      Also hunted through the other DIO flags and removed them as arguments
      from functions which were always called with the same combination of
      Updated gfs2_meta_indirect_buffer to be a bit more efficient and
      hopefully also be a bit easier to read.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  4. 20 Sep, 2006 1 commit
  5. 19 Sep, 2006 1 commit
  6. 18 Sep, 2006 3 commits
    • Steven Whitehouse's avatar
      [GFS2] Tweek unlock test in readpage() · 07903c02
      Steven Whitehouse authored
      This make the unlock test a bit simpler.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
    • Russell Cattelan's avatar
      [GFS2] Fix for mmap() bug in readpage · dc41aeed
      Russell Cattelan authored
      Fix for Red Hat bz 205307. Don't need to lock in readpage if
      the higher level code has already grabbed the lock.
      Signed-off-by: default avatarRussell Cattelan <cattelan@redhat.com>
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
    • Steven Whitehouse's avatar
      [GFS2] Map multiple blocks at once where possible · 7a6bbacb
      Steven Whitehouse authored
      This is a tidy up of the GFS2 bmap code. The main change is that the
      bh is passed to gfs2_block_map allowing the flags to be set directly
      rather than having to repeat that code several times in ops_address.c.
      At the same time, the extent mapping code from gfs2_extent_map has
      been moved into gfs2_block_map. This allows all calls to gfs2_block_map
      to map extents in the case that no allocation is taking place. As a
      result reads and non-allocating writes should be faster. A quick test
      with postmark appears to support this.
      There is a limit on the number of blocks mapped in a single bmap
      call in that it will only ever map blocks which are pointed to
      from a single pointer block. So in other words, it will never try
      to do additional i/o in order to satisfy read-ahead. The maximum
      number of blocks is thus somewhat less than 512 (the GFS2 4k block
      size minus the header divided by sizeof(u64)). I've further limited
      the mapping of "normal" blocks to 32 blocks (to avoid extra work)
      since readpages() will currently read a maximum of 32 blocks ahead (128k).
      Some further work will probably be needed to set a suitable value
      for DIO as well, but for now thats left at the maximum 512 (see
      There is probably a lot more that can be done to improve bmap for GFS2,
      but this is a good first step.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  7. 04 Sep, 2006 3 commits
  8. 01 Sep, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Update copyright, tidy up incore.h · e9fc2aa0
      Steven Whitehouse authored
      As per comments from Jan Engelhardt <jengelh@linux01.gwdg.de> this
      updates the copyright message to say "version" in full rather than
      "v.2". Also incore.h has been updated to remove forward structure
      declarations which are not required.
      The gfs2_quota_lvb structure has now had endianess annotations added
      to it. Also quota.c has been updated so that we now store the
      lvb data locally in endian independant format to avoid needing
      a structure in host endianess too. As a result the endianess
      conversions are done as required at various points and thus the
      conversion routines in lvb.[ch] are no longer required. I've
      moved the one remaining constant in lvb.h thats used into lm.h
      and removed the unused lvb.[ch].
      I have not changed the HIF_ constants. That is left to a later patch
      which I hope will unify the gh_flags and gh_iflags fields of the
      struct gfs2_holder.
      Cc: Jan Engelhardt <jengelh@linux01.gwdg.de>
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  9. 31 Aug, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Fix releasepage bug (fixes direct i/o writes) · 623d9355
      Steven Whitehouse authored
      This patch fixes three main bugs. Firstly the direct i/o get_block
      was returning the wrong return code in certain cases. Secondly, the
      GFS2's releasepage function was not dealing with cases when clean,
      ordered buffers were found still queued on a transaction (which can
      happen depending on the ordering of journal flushes). Thirdly, the
      journaling code itself needed altering to take account of the
      after effects of removing the clean ordered buffers from the transactions
      before a journal flush.
      The releasepage bug did also show up under "normal" buffered i/o
      as well, so its not just a fix for direct i/o. In fact its not
      normally used in the direct i/o path at all, except when flushing
      existing buffers after performing a direct i/o write, but that was
      the code path that led us to spot this.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  10. 24 Aug, 2006 1 commit
  11. 18 Aug, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Fix leak of gfs2_bufdata · 15d00c0b
      Steven Whitehouse authored
      This fixes a memory leak of struct gfs2_bufdata and also some
      problems in the ordered write handling code. It needs a bit
      more testing, but I believe that the reference counting of
      ordered write buffers should now be correct.
      This is aimed at fixing Red Hat bugzilla: #201028 and #201082
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  12. 08 Aug, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Fix lack of buffers in writepage bug · f4387149
      Steven Whitehouse authored
      In some cases we can enter write page without there being buffers
      attached to the page. In this case the function to add gfs2_bufdata
      to the buffers fails sliently causing further failures down the
      This fix ensures that we always add buffers in writepage if they
      didn't already exist (mmap is one way to trigger this).
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  13. 04 Aug, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Fix lock ordering bug in page fault path · 59a1cc6b
      Steven Whitehouse authored
      Mmapped files were able to trigger a lock ordering bug. Private
      maps do not need to take the glock so early on. Shared maps do
      unfortunately, however we can get around that by adding a flag
      into the flags for the struct gfs2_file. This only works because
      we are taking an exclusive lock at this point, so we know that
      nobody else can be racing with us.
      Fixes Red Hat bugzilla: #201196
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  14. 26 Jul, 2006 2 commits
  15. 25 Jul, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Alter direct I/O path · a9e5f4d0
      Steven Whitehouse authored
      As per comments received, alter the GFS2 direct I/O path so that
      it uses the standard read functions "out of the box". Needs a
      small change to one of the VFS functions. This reduces the size
      of the code quite a lot and also removes the need for one new export.
      Some more work remains to be done, but this is the bones of the
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  16. 11 Jul, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Add generation number · 4340fe62
      Steven Whitehouse authored
      This adds a generation number for the eventual use of NFS to the
      ondisk inode. Its backward compatible with the current code since
      it doesn't really matter what the generation number is to start with,
      and indeed since its set to zero, due to it being taken from padding
      in both the inode and rgrp header, it should be fine.
      The eventual plan is to use this rather than no_formal_ino in the
      NFS filehandles. At that point no_formal_ino will be unused.
      At the same time we also add a releasepages call back to the
      "normal" address space for gfs2 inodes. Also I've removed a
      one-linrer function thats not required any more.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  17. 10 Jul, 2006 1 commit
  18. 05 Jul, 2006 1 commit
  19. 03 Jul, 2006 1 commit
  20. 14 Jun, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Fix unlinked file handling · feaa7bba
      Steven Whitehouse authored
      This patch fixes the way we have been dealing with unlinked,
      but still open files. It removes all limits (other than memory
      for inodes, as per every other filesystem) on numbers of these
      which we can support on GFS2. It also means that (like other
      fs) its the responsibility of the last process to close the file
      to deallocate the storage, rather than the person who did the
      unlinking. Note that with GFS2, those two events might take place
      on different nodes.
      Also there are a number of other changes:
       o We use the Linux inode subsystem as it was intended to be
      used, wrt allocating GFS2 inodes
       o The Linux inode cache is now the point which we use for
      local enforcement of only holding one copy of the inode in
      core at once (previous to this we used the glock layer).
       o We no longer use the unlinked "special" file. We just ignore it
      completely. This makes unlinking more efficient.
       o We now use the 4th block allocation state. The previously unused
      state is used to track unlinked but still open inodes.
       o gfs2_inoded is no longer needed
       o Several fields are now no longer needed (and removed) from the in
      core struct gfs2_inode
       o Several fields are no longer needed (and removed) from the in core
      There are a number of future possible optimisations and clean ups
      which have been made possible by this patch.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  21. 18 May, 2006 2 commits
  22. 05 May, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Readpages support · fd88de56
      Steven Whitehouse authored
      This adds readpages support (and also corrects a small bug in
      the readpage error path at the same time). Hopefully this will
      improve performance by allowing GFS to submit larger lumps of
      I/O at a time.
      In order to simplify the setting of BH_Boundary, it currently gets
      set when we hit the end of a indirect pointer block. There is
      always a boundary at this point with the current allocation code.
      It doesn't get all the boundaries right though, so there is still
      room for improvement in this.
      See comments in fs/gfs2/ops_address.c for further information about
      readpages with GFS2.
      Signed-off-by: Steven Whitehouse
  23. 02 May, 2006 1 commit
  24. 18 Apr, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Use vmalloc() in dir code · fe1bdedc
      Steven Whitehouse authored
      When allocating memory to sort directory entries, use vmalloc()
      rather than kmalloc() since for larger directories, the required
      size can easily be graeter than the 128k maximum of kmalloc().
      Also adding the first steps towards getting the AOP_TRUNCATED_PAGE
      return code get in the glock code by flagging all places where we
      request a glock and we are holding a page lock.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  25. 31 Mar, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Update GFS2 for the recent pull from Linus · 8628de05
      Steven Whitehouse authored
      Some interfaces have changed. In particular one of the posix
      locking functions has changed prototype, along with the
      address space operation invalidatepage and the block getting
      callback to the direct IO function.
      In addition add the splice file operations. These will need to
      be updated to support AOP_TRUNCATED_PAGE before they will be
      of much use to us.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  26. 27 Feb, 2006 2 commits
  27. 23 Feb, 2006 1 commit
  28. 21 Feb, 2006 1 commit
  29. 15 Feb, 2006 2 commits
  30. 14 Feb, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Put back O_DIRECT support · d1665e41
      Steven Whitehouse authored
      This patch adds back O_DIRECT support with various caveats
       1. Journaled data can be read via O_DIRECT since its now the
          same on disk format as normal data files.
       2. Journaled data writes with O_DIRECT will be failed sliently
          back to normal writes (should we really do this I wonder or
          should we return an error instead?)
       3. Stuffed files will be failed back to normal buffered I/O
       4. All the usual corner cases (write beyond current end of file,
          write to an unallocated block) will also revert to normal buffered I/O.
      The I/O path is slightly odd as reads arrive at the page cache layer
      with the lock for the file already held, but writes arrive unlocked.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  31. 08 Feb, 2006 1 commit
    • Steven Whitehouse's avatar
      [GFS2] Make journaled data files identical to normal files on disk · 18ec7d5c
      Steven Whitehouse authored
      This is a very large patch, with a few still to be resolved issues
      so you might want to check out the previous head of the tree since
      this is known to be unstable. Fixes for the various bugs will be
      forthcoming shortly.
      This patch removes the special data format which has been used
      up till now for journaled data files. Directories still retain the
      old format so that they will remain on disk compatible with earlier
      releases. As a result you can now do the following with journaled
      data files:
       1) mmap them
       2) export them over NFS
       3) convert to/from normal files whenever you want to (the zero length
          restriction is gone)
      In addition the level at which GFS' locking is done has changed for all
      files (since they all now use the page cache) such that the locking is
      done at the page cache level rather than the level of the fs operations.
      This should mean that things like loopback mounts and other things which
      touch the page cache directly should now work.
      Current known issues:
       1. There is a lock mode inversion problem related to the resource
          group hold function which needs to be resolved.
       2. Any significant amount of I/O causes an oops with an offset of hex 320
          (NULL pointer dereference) which appears to be related to a journaled data
          buffer appearing on a list where it shouldn't be.
       3. Direct I/O writes are disabled for the time being (will reappear later)
       4. There is probably a deadlock between the page lock and GFS' locks under
          certain combinations of mmap and fs operation I/O.
       5. Issue relating to ref counting on internally used inodes causes a hang
          on umount (discovered before this patch, and not fixed by it)
       6. One part of the directory metadata is different from GFS1 and will need
          to be resolved before next release.
      Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
  32. 31 Jan, 2006 1 commit