1. 06 2月, 2007 3 次提交
    • S
      [GFS2] Remove local exclusive glock mode · 1c0f4872
      Steven Whitehouse 提交于
      Here is a patch for GFS2 to remove the local exclusive flag. In
      the places it was used, mutex's are always held earlier in the
      call path, so it appears redundant in the LM_ST_SHARED case.
      
      Also, the GFS2 holders were setting local exclusive in any case where
      the requested lock was LM_ST_EXCLUSIVE. So the other places in the glock
      code where the flag was tested have been replaced with tests for the
      lock state being LM_ST_EXCLUSIVE in order to ensure the logic is the
      same as before (i.e. LM_ST_EXCLUSIVE is always locally exclusive as well
      as globally exclusive).
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      1c0f4872
    • S
      [GFS2] Remove the "greedy" function from glock.[ch] · e5dab552
      Steven Whitehouse 提交于
      The "greedy" code was an attempt to retain glocks for a minimum length
      of time when they relate to mmap()ed files. The current implementation
      of this feature is not, however, ideal in that it required allocating
      memory in order to do this and its overly complicated.
      
      It also misses the mark by ignoring the other I/O operations which are
      just as likely to suffer from the same problem. So the plan is to remove
      this now and then add the functionality back as part of the glock state
      machine at a later date (and thus take into account all the possible
      users of this feature)
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      e5dab552
    • S
      [GFS2] Clean up/speed up readdir · 3699e3a4
      Steven Whitehouse 提交于
      This removes the extra filldir callback which gfs2 was using to
      enclose an attempt at readahead for inodes during readdir. The
      code was too complicated and also hurts performance badly in the
      case that the getdents64/readdir call isn't being followed by
      stat() and it wasn't even getting it right all the time when it
      was.
      
      As a result, on my test box an "ls" of a directory containing 250000
      files fell from about 7mins (freshly mounted, so nothing cached) to
      between about 15 to 25 seconds. When the directory content was cached,
      the time taken fell from about 3mins to about 4 or 5 seconds.
      
      Interestingly in the cached case, running "ls -l" once reduced the time
      taken for subsequent runs of "ls" to about 6 secs even without this
      patch. Now it turns out that there was a special case of glocks being
      used for prefetching the metadata, but because of the timeouts for these
      locks (set to 10 secs) the metadata was being timed out before it was
      being used and this the prefetch code was constantly trying to prefetch
      the same data over and over.
      
      Calling "ls -l" meant that the inodes were brought into memory and once
      the inodes are cached, the glocks are not disposed of until the inodes
      are pushed out of the cache, thus extending the lifetime of the glocks,
      and thus bringing down the time for subsequent runs of "ls"
      considerably.
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      3699e3a4
  2. 30 11月, 2006 3 次提交
    • S
      [GFS2] Fix journal flush problem · b004157a
      Steven Whitehouse 提交于
      This fixes a bug which resulted in poor performance due to flushing
      the journal too often. The code path in question was via the inode_go_sync()
      function in glops.c. The solution is not to flush the journal immediately
      when inodes are ejected from memory, but batch up the work for glockd to
      deal with later on. This means that glocks may now live on beyond the end of
      the lifetime of their inodes (but not very much longer in the normal case).
      
      Also fixed in this patch is a bug (which was hidden by the bug mentioned above) in
      calculation of the number of free journal blocks.
      
      The gfs2_logd process has been altered to be more responsive to the journal
      filling up. We now wake it up when the number of uncommitted journal blocks
      has reached the threshold level rather than trying to flush directly at the
      end of each transaction. This again means doing fewer, but larger, log
      flushes in general.
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      b004157a
    • S
      [GFS2] Fix page lock/glock deadlock · 2ca99501
      Steven Whitehouse 提交于
      This fixes a race between the glock and the page lock encountered
      during truncate in gfs2_readpage and gfs2_prepare_write. The gfs2_readpages
      function doesn't need the same fix since it only uses a try lock anyway, so
      it will fail back to gfs2_readpage in the case of a potential deadlock.
      
      This bug was spotted by Russell Cattelan.
      
      Cc: Russell Cattelan <cattelan@redhat.com>
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      2ca99501
    • S
      [GFS2] Remove unused GL_DUMP flag · c594d886
      Steven Whitehouse 提交于
      There is no way to set the GL_DUMP flag, and in any case the
      same thing can be done with systemtap if required for debugging,
      so this removes it.
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      c594d886
  3. 10 9月, 2006 1 次提交
  4. 08 9月, 2006 3 次提交
    • S
      [GFS2] Use void * instead of typedef for locking module interface · 9b47c11d
      Steven Whitehouse 提交于
      As requested by Jan Engelhardt, this removes the typedefs in the
      locking module interface and replaces them with void *. Also
      since we are changing the interface, I've added a few consts
      as well.
      
      Cc: Jan Engelhardt <jengelh@linux01.gwdg.de>
      Cc: David Teigland <teigland@redhat.com>
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      9b47c11d
    • S
      [GFS2] Remove one typedef · 1c089c32
      Steven Whitehouse 提交于
      This removes one of the typedefs from the locking interface. It
      is replaced by a forward declaration of the gfs2 superblock. The
      other two are not so easy to solve since in their case, they
      can refer to one of two possible structures.
      
      Cc: David Teigland <teigland@redhat.com>
      Cc: Jan Engelhardt <jengelh@linux01.gwdg.de>
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      1c089c32
    • S
      [GFS2] Move glock hash table out of superblock · 85d1da67
      Steven Whitehouse 提交于
      There are several reasons why we want to do this:
       - Firstly its large and thus we'll scale better with multiple
         GFS2 fs mounted at the same time
       - Secondly its easier to scale its size as required (thats a plan
         for later patches)
       - Thirdly, we can use kzalloc rather than vmalloc when allocating
         the superblock (its now only 4888 bytes)
       - Fourth its all part of my plan to eventually be able to use RCU
         with the glock hash.
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      85d1da67
  5. 05 9月, 2006 2 次提交
  6. 04 9月, 2006 1 次提交
  7. 01 9月, 2006 1 次提交
    • S
      [GFS2] Update copyright, tidy up incore.h · e9fc2aa0
      Steven Whitehouse 提交于
      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: NSteven Whitehouse <swhiteho@redhat.com>
      e9fc2aa0
  8. 30 8月, 2006 2 次提交
  9. 15 6月, 2006 1 次提交
    • S
      [GFS2] Fix unlinked file handling · feaa7bba
      Steven Whitehouse 提交于
      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
      superblock
      
      There are a number of future possible optimisations and clean ups
      which have been made possible by this patch.
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      feaa7bba
  10. 19 5月, 2006 2 次提交
  11. 28 4月, 2006 1 次提交
  12. 27 4月, 2006 1 次提交
  13. 21 4月, 2006 1 次提交
  14. 18 4月, 2006 1 次提交
    • S
      [GFS2] Use vmalloc() in dir code · fe1bdedc
      Steven Whitehouse 提交于
      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: NSteven Whitehouse <swhiteho@redhat.com>
      fe1bdedc
  15. 30 3月, 2006 1 次提交
    • S
      [GFS2] Update debugging code · d0dc80db
      Steven Whitehouse 提交于
      Update the debugging code in trans.c and at the same time improve
      the debugging code for gfs2_holders. The new code should be pretty
      fast during the normal case and provide just as much information
      in case of errors (or more).
      
      One small function from glock.c has moved to glock.h as a static inline so
      that its return address won't get in the way of the debugging.
      Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
      d0dc80db
  16. 17 1月, 2006 1 次提交