21 Oct, 2011

2 commits

  • Some items picked up through automated code analysis. A few bits
    of unreachable code and two unchecked return values.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • Here is an update of Bob's original rbtree patch which, in addition, also
    resolves the rather strange ref counting that was being done relating to
    the bitmap blocks.

    Originally we had a dual system for journaling resource groups. The metadata
    blocks were journaled and also the rgrp itself was added to a list. The reason
    for adding the rgrp to the list in the journal was so that the "repolish
    clones" code could be run to update the free space, and potentially send any
    discard requests when the log was flushed. This was done by comparing the
    "cloned" bitmap with what had been written back on disk during the transaction
    commit.

    Due to this, there was a requirement to hang on to the rgrps' bitmap buffers
    until the journal had been flushed. For that reason, there was a rather
    complicated set up in the ->go_lock ->go_unlock functions for rgrps involving
    both a mutex and a spinlock (the ->sd_rindex_spin) to maintain a reference
    count on the buffers.

    However, the journal maintains a reference count on the buffers anyway, since
    they are being journaled as metadata buffers. So by moving the code which deals
    with the post-journal accounting for bitmap blocks to the metadata journaling
    code, we can entirely dispense with the rather strange buffer ref counting
    scheme and also the requirement to journal the rgrps.

    The net result of all this is that the ->sd_rindex_spin is left to do exactly
    one job, and that is to look after the rbtree or rgrps.

    This patch is designed to be a stepping stone towards using RCU for the rbtree
    of resource groups, however the reduction in the number of uses of the
    ->sd_rindex_spin is likely to have benefits for multi-threaded workloads,
    anyway.

    The patch retains ->go_lock and ->go_unlock for rgrps, however these maybe also
    be removed in future in favour of calling the functions directly where required
    in the code. That will allow locking of resource groups without needing to
    actually read them in - something that could be useful in speeding up statfs.

    In the mean time though it is valid to dereference ->bi_bh only when the rgrp
    is locked. This is basically the same rule as before, modulo the references not
    being valid until the following journal flush.

    Signed-off-by: Steven Whitehouse
    Signed-off-by: Bob Peterson
    Cc: Benjamin Marzinski

    Bob Peterson
     

20 Apr, 2011

2 commits

  • The GLF_LRU flag introduced in the previous patch can be
    used to check if a glock is on the lru list when a new
    holder is queued and if so remove it, without having first
    to get the lru_lock.

    The main purpose of this patch however is to optimise the
    glocks left over when an inode at end of life is being
    evicted. Previously such glocks were left with the GLF_LFLUSH
    flag set, so that when reclaimed, each one required a log flush.
    This patch resets the GLF_LFLUSH flag when there is nothing
    left to flush thus preventing later log flushes as glocks are
    reused or demoted.

    In order to do this, we need to keep track of the number of
    revokes which are outstanding, and also to clear the GLF_LFLUSH
    bit after a log commit when only revokes have been processed.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • Rather than allowing the glocks to be scheduled for possible
    reclaim as soon as they have exited the journal, this patch
    delays their entry to the list until the glocks in question
    are no longer in use.

    This means that we will rely on the vm for writeback of all
    dirty data and metadata from now on. When glocks are added
    to the lru list they should be freeable much faster since all
    the I/O required to free them should have already been completed.

    This should lead to much better I/O patterns under low memory
    conditions.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

25 Mar, 2011

1 commit

  • * 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block: (65 commits)
    Documentation/iostats.txt: bit-size reference etc.
    cfq-iosched: removing unnecessary think time checking
    cfq-iosched: Don't clear queue stats when preempt.
    blk-throttle: Reset group slice when limits are changed
    blk-cgroup: Only give unaccounted_time under debug
    cfq-iosched: Don't set active queue in preempt
    block: fix non-atomic access to genhd inflight structures
    block: attempt to merge with existing requests on plug flush
    block: NULL dereference on error path in __blkdev_get()
    cfq-iosched: Don't update group weights when on service tree
    fs: assign sb->s_bdi to default_backing_dev_info if the bdi is going away
    block: Require subsystems to explicitly allocate bio_set integrity mempool
    jbd2: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
    jbd: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
    fs: make fsync_buffers_list() plug
    mm: make generic_writepages() use plugging
    blk-cgroup: Add unaccounted time to timeslice_used.
    block: fixup plugging stubs for !CONFIG_BLOCK
    block: remove obsolete comments for blkdev_issue_zeroout.
    blktrace: Use rq->cmd_flags directly in blk_add_trace_rq.
    ...

    Fix up conflicts in fs/{aio.c,super.c}

    Linus Torvalds
     

14 Mar, 2011

1 commit


11 Mar, 2011

1 commit

  • The log lock is currently used to protect the AIL lists and
    the movements of buffers into and out of them. The lists
    are self contained and no log specific items outside the
    lists are accessed when starting or emptying the AIL lists.

    Hence the operation of the AIL does not require the protection
    of the log lock so split them out into a new AIL specific lock
    to reduce the amount of traffic on the log lock. This will
    also reduce the amount of serialisation that occurs when
    the gfs2_logd pushes on the AIL to move it forward.

    This reduces the impact of log pushing on sequential write
    throughput.

    Signed-off-by: Dave Chinner
    Signed-off-by: Steven Whitehouse

    Dave Chinner
     

10 Mar, 2011

1 commit

  • With the plugging now being explicitly controlled by the
    submitter, callers need not pass down unplugging hints
    to the block layer. If they want to unplug, it's because they
    manually plugged on their own - in which case, they should just
    unplug at will.

    Signed-off-by: Jens Axboe

    Jens Axboe
     

21 Jan, 2011

1 commit

  • This has a number of advantages:

    - Reduces contention on the hash table lock
    - Makes the code smaller and simpler
    - Should speed up glock dumps when under load
    - Removes ref count changing in examine_bucket
    - No longer need hash chain lock in glock_put() in common case

    There are some further changes which this enables and which
    we may do in the future. One is to look at using SLAB_RCU,
    and another is to look at using a per-cpu counter for the
    per-sb glock counter, since that is touched twice in the
    lifetime of each glock (but only used at umount time).

    Signed-off-by: Steven Whitehouse
    Cc: Paul E. McKenney

    Steven Whitehouse
     

05 May, 2010

1 commit

  • This patch contains various tweaks to how log flushes and active item writeback
    work. gfs2_logd is now managed by a waitqueue, and gfs2_log_reseve now waits
    for gfs2_logd to do the log flushing. Multiple functions were rewritten to
    remove the need to call gfs2_log_lock(). Instead of using one test to see if
    gfs2_logd had work to do, there are now seperate tests to check if there
    are two many buffers in the incore log or if there are two many items on the
    active items list.

    This patch is a port of a patch Steve Whitehouse wrote about a year ago, with
    some minor changes. Since gfs2_ail1_start always submits all the active items,
    it no longer needs to keep track of the first ai submitted, so this has been
    removed. In gfs2_log_reserve(), the order of the calls to
    prepare_to_wait_exclusive() and wake_up() when firing off the logd thread has
    been switched. If it called wake_up first there was a small window for a race,
    where logd could run and return before gfs2_log_reserve was ready to get woken
    up. If gfs2_logd ran, but did not free up enough blocks, gfs2_log_reserve()
    would be left waiting for gfs2_logd to eventualy run because it timed out.
    Finally, gt_logd_secs, which controls how long to wait before gfs2_logd times
    out, and flushes the log, can now be set on mount with ar_commit.

    Signed-off-by: Benjamin Marzinski
    Signed-off-by: Steven Whitehouse

    Benjamin Marzinski
     

01 Mar, 2010

1 commit

  • When we queue data buffers for ordered write, the buffers are added
    to the head of the ordered write list. When the log needs to push
    these buffers to disk, it also walks the list from the head. The
    result is that the the ordered buffers are submitted to disk in
    reverse order.

    For large writes, this means that whenever the log flushes large
    streams of reverse sequential order buffers are pushed down into the
    block layers. The elevators don't handle this particularly well, so
    IO rates tend to be significantly lower than if the IO was issued in
    ascending block order.

    Queue new ordered buffers to the tail of the ordered buffer list to
    ensure that IO is dispatched in the order it was submitted. This
    should significantly improve large sequential write speeds. On a
    disk capable of 85MB/s, speeds increase from 50MB/s to 65MB/s for
    noop and from 38MB/s to 50MB/s for cfq.

    Signed-off-by: Dave Chinner
    Signed-off-by: Steven Whitehouse

    Dave Chinner
     

03 Dec, 2009

1 commit

  • There are two spare field in the header common to all GFS2
    metadata. One is just the right size to fit a journal id
    in it, and this patch updates the journal code so that each
    time a metadata block is modified, we tag it with the journal
    id of the node which is performing the modification.

    The reason for this is that it should make it much easier to
    debug issues which arise if we can tell which node was the
    last to modify a particular metadata block.

    Since the field is updated before the block is written into
    the journal, each journal should only contain metadata which
    is tagged with its own journal id. The one exception to this
    is the journal header block, which might have a different node's
    id in it, if that journal was recovered by another node in the
    cluster.

    Thus each journal will contain a record of which nodes recovered
    it, via the journal header.

    The other field in the metadata header could potentially be
    used to hold information about what kind of operation was
    performed, but for the time being we just zero it on each
    transaction so that if we use it for that in future, we'll
    know that the information (where it exists) is reliable.

    I did consider using the other field to hold the journal
    sequence number, however since in GFS2's journaling we write
    the modified data into the journal and not the original
    data, this gives no information as to what action caused the
    modification, so I think we can probably come up with a better
    use for those 64 bits in the future.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

12 Jun, 2009

1 commit

  • This patch adds the ability to trace various aspects of the GFS2
    filesystem. The trace points are divided into three groups,
    glocks, logging and bmap. These points have been chosen because
    they allow inspection of the major internal functions of GFS2
    and they are also generic enough that they are unlikely to need
    any major changes as the filesystem evolves.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

11 May, 2009

1 commit

  • After Jens recent updates:
    http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=a1f242524c3c1f5d40f1c9c343427e34d1aadd6e
    et al. this is a patch to bring gfs2 uptodate with the core
    code. Also I've managed to squash another call to ll_rw_block()
    along the way.

    There is still one part of the GFS2 I/O paths which are not correctly
    annotated and that is due to the sharing of the writeback code between
    the data and metadata address spaces. I would like to change that too,
    but this patch is still worth doing on its own, I think.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

24 Mar, 2009

1 commit

  • This is the big patch that I've been working on for some time
    now. There are many reasons for wanting to make this change
    such as:
    o Reducing overhead by eliminating duplicated fields between structures
    o Simplifcation of the code (reduces the code size by a fair bit)
    o The locking interface is now the DLM interface itself as proposed
    some time ago.
    o Fewer lookups of glocks when processing replies from the DLM
    o Fewer memory allocations/deallocations for each glock
    o Scope to do further optimisations in the future (but this patch is
    more than big enough for now!)

    Please note that (a) this patch relates to the lock_dlm module and
    not the DLM itself, that is still a separate module; and (b) that
    we retain the ability to build GFS2 as a standalone single node
    filesystem with out requiring the DLM.

    This patch needs a lot of testing, hence my keeping it I restarted
    my -git tree after the last merge window. That way, this has the maximum
    exposure before its merged. This is (modulo a few minor bug fixes) the
    same patch that I've been posting on and off the the last three months
    and its passed a number of different tests so far.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

31 Mar, 2008

2 commits

  • Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     
  • This patch is performance related. When we're doing a log flush,
    I noticed we were calling buf_lo_incore_commit twice: once for
    data bufs and once for metadata bufs. Since this is the same
    function and does the same thing in both cases, there should be
    no reason to call it twice. Since we only need to call it once,
    we can also make it faster by removing it from the generic "lops"
    code and making it a stand-along static function.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     

25 Jan, 2008

2 commits

  • The only reason for adding glocks to the journal was to keep track
    of which locks required a log flush prior to release. We add a
    flag to the glock to allow this check to be made in a simpler way.

    This reduces the size of a glock (by 12 bytes on i386, 24 on x86_64)
    and means that we can avoid extra work during the journal flush.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This patch splits gfs2_writepage into separate functions for each of
    the three cases: writeback, ordered and journalled. As a result
    it becomes a lot easier to see what each one is doing. The common
    code is moved into gfs2_writepage_common.

    This fixes a performance bug where we were doing more work than
    strictly required in the ordered write case.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

10 Oct, 2007

8 commits

  • This patch cleans up the code for writing journaled data into the log.
    It also removes the need to allocate a small "tag" structure for each
    block written into the log. Instead we just keep count of the outstanding
    I/O so that we can be sure that its all been written at the correct time.
    Another result of this patch is that a number of ll_rw_block() calls
    have become submit_bh() calls, closing some races at the same time.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The following alters gfs2_trans_add_revoke() to take a struct
    gfs2_bufdata as an argument. This eliminates the memory allocation which
    was previously required by making use of the already existing struct
    gfs2_bufdata. It makes some sanity checks to ensure that the
    gfs2_bufdata has been removed from all the lists before its recycled as
    a revoke structure. This saves one memory allocation and one free per
    revoke structure.

    Also as a result, and to simplify the locking, since there is no longer
    any blocking code in gfs2_trans_add_revoke() we must hold the log lock
    whenever this function is called. This reduces the amount of times we
    take and unlock the log lock.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The old revoke structure was allocated using kalloc/kfree but
    there is a slab cache for gfs2_bufdata, so we should use that
    now that the structures have been converted.

    This is part two of the patch series to merge the revoke
    and gfs2_bufdata structures.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • Both the revoke structure and the bufdata structure are quite similar.
    They are basically small tags which are put on lists. In addition to
    which the revoke structure is always allocated when there is a bufdata
    structure which is (or can be) freed. As such it should be possible to
    reduce the number of frees and allocations by using the same structure
    for both purposes.

    This patch is the first step along that path. It replaces existing uses
    of the revoke structure with the bufdata structure.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The following patch removes the ordered write processing from
    databuf_lo_before_commit() and moves it to log.c. This has the effect of
    greatly simplyfying databuf_lo_before_commit() and well as potentially
    making the ordered write code more efficient.

    As a side effect of this, its now possible to remove ordered buffers
    from the ordered buffer list at any time, so we now make use of this in
    invalidatepage and releasepage to ensure timely release of these
    buffers.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • gfs2_pin and gfs2_unpin are only used in lops.c, despite being
    defined in meta_io.c, so this patch moves them into lops.c and
    makes them static. At the same time, its possible to clean up
    the locking in the buf and databuf _lo_add() functions so that
    we only need to grab the spinlock once. Also we have to move
    lock_buffer() around the _lo_add() functions since we can't
    do that in gfs2_pin() any more since we hold the spinlock
    for the duration of that function.

    As a result, the code shrinks by 12 lines and we do far fewer
    operations when adding buffers to the log. It also makes the
    code somewhat easier to read & understand.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This is a patch to GFS2 to protect sd_log_num_jdata with the
    gfs2_log_lock. Without this patch, there is a timing window
    where you can get hit the following assert from function
    gfs2_log_flush():

    gfs2_assert_withdraw(sdp,
    sdp->sd_log_num_buf + sdp->sd_log_num_jdata ==
    sdp->sd_log_commited_buf +
    sdp->sd_log_commited_databuf);

    I've tested it on my roth cluster and it fixes the problem.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     
  • This is the first of five patches for bug #248176:

    There were still some critical variables being manipulated outside
    the log_lock spinlock. That usually resulted in a hang.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     

14 Aug, 2007

1 commit

  • This is part 2 of the patch for bug #245832, part 1 of which is already
    in the git tree.

    The problem was that sdp->sd_log_num_databuf was not always being
    protected by the gfs2_log_lock spinlock, but the sd_log_le_databuf
    (which it is supposed to reflect) was protected. That meant there
    was a timing window during which gfs2_log_flush called
    databuf_lo_before_commit and the count didn't match what was
    really on the linked list in that window. So when it ran out of
    items on the linked list, it decremented total_dbuf from 0 to -1 and
    thus never left the "while(total_dbuf)" loop.

    The solution is to protect the variable sdp->sd_log_num_databuf so
    that the value will always match the contents of the linked list,
    and therefore the number will never go negative, and therefore, the
    loop will be exited properly.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     

09 Jul, 2007

4 commits

  • This patch is an addendum to the previous journaled file/unmount patch.
    It fixes a problem discovered during testing.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Robert Peterson
     
  • This patch passes all my nasty tests that were causing the code to
    fail under one circumstance or another. Here is a complete summary
    of all changes from today's git tree, in order of appearance:

    1. There are now separate variables for metadata buffer accounting.
    2. Variable sd_log_num_hdrs is no longer needed, since the header
    accounting is taken care of by the reserve/refund sequence.
    3. Fixed a tiny grammatical problem in a comment.
    4. Added a new function "calc_reserved" to calculate the reserved
    log space. This isn't entirely necessary, but it has two benefits:
    First, it simplifies the gfs2_log_refund function greatly.
    Second, it allows for easier debugging because I could sprinkle the
    code with calls to this function to make sure the accounting is
    proper (by adding asserts and printks) at strategic point of the code.
    5. In log_pull_tail there apparently was a kludge to fix up the
    accounting based on a "pull" parameter. The buffer accounting is
    now done properly, so the kludge was removed.
    6. File sync operations were making a call to gfs2_log_flush that
    writes another journal header. Since that header was unplanned
    for (reserved) by the reserve/refund sequence, the free space had
    to be decremented so that when log_pull_tail gets called, the free
    space is be adjusted properly. (Did I hear you call that a kludge?
    well, maybe, but a lot more justifiable than the one I removed).
    7. In the gfs2_log_shutdown code, it optionally syncs the log by
    specifying the PULL parameter to log_write_header. I'm not sure
    this is necessary anymore. It just seems to me there could be
    cases where shutdown is called while there are outstanding log
    buffers.
    8. In the (data)buf_lo_before_commit functions, I changed some offset
    values from being calculated on the fly to being constants. That
    simplified some code and we might as well let the compiler do the
    calculation once rather than redoing those cycles at run time.
    9. This version has my rewritten databuf_lo_add function.
    This version is much more like its predecessor, buf_lo_add, which
    makes it easier to understand. Again, this might not be necessary,
    but it seems as if this one works as well as the previous one,
    maybe even better, so I decided to leave it in.
    10. In databuf_lo_before_commit, a previous data corruption problem
    was caused by going off the end of the buffer. The proper solution
    is to have the proper limit in place, rather than stopping earlier.
    (Thus my previous attempt to fix it is wrong).
    If you don't wrap the buffer, you're stopping too early and that
    causes more log buffer accounting problems.
    11. In lops.h there are two new (previously mentioned) constants for
    figuring out the data offset for the journal buffers.
    12. There are also two new functions, buf_limit and databuf_limit to
    calculate how many entries will fit in the buffer.
    13. In function gfs2_meta_wipe, it needs to distinguish between pinned
    metadata buffers and journaled data buffers for proper journal buffer
    accounting. It can't use the JDATA gfs2_inode flag because it's
    sometimes passed the "real" inode and sometimes the "metadata
    inode" and the inode flags will be random bits in a metadata
    gfs2_inode. It needs to base its decision on which was passed in.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Robert Peterson
     
  • This patch is for bugzilla bug 283162, which uncovered a number of
    bugs pertaining to writing to files that have the journaled bit on.
    These bugs happen most often when writing to the meta_fs because
    the files are always journaled. So operations like gfs2_grow were
    particularly vulnerable, although many of the problems could be
    recreated with normal files after setting the journaled bit on.
    The problems fixed are:

    -GFS2 wasn't ever writing unstuffed journaled data blocks to their
    in-place location on disk. Now it does.

    -If you unmounted too quickly after doing IO to a journaled file,
    GFS2 was crashing because you would discard a buffer whose bufdata
    was still on the active items list. GFS2 now deals with this
    gracefully.

    -GFS2 was losing track of the bufdata for journaled data blocks,
    and it wasn't getting freed, causing an error when you tried to
    unmount the module. GFS2 now frees all the bufdata structures.

    -There was a memory corruption occurring because GFS2 wrote
    twice as many log entries for journaled buffers.

    -It was occasionally trying to write journal headers in buffers
    that weren't currently mapped.

    Signed-off-by: Bob Peterson
    Signed-off-by: Benjamin Marzinski
    Signed-off-by: Steven Whitehouse

    Robert Peterson
     
  • This is a patch for the first three issues of RHBZ #238162

    The first issue is that when you allocate a new page for a file, it will not
    start off uptodate. This makes sense, since you haven't written anything to that
    part of the file yet. Unfortunately, gfs2_pin() checks to make sure that the
    buffers are uptodate. The solution to this is to mark the buffers uptodate in
    gfs2_commit_write(), after they have been zeroed out and have the data written
    into them. I'm pretty confident with this fix, although it's not completely
    obvious that there is no problem with marking the buffers uptodate here.

    The second issue is simply that you can try to pin a data buffer that is already
    on the incore log, and thus, already pinned. This patch checks to see if this
    buffer is already on the log, and exits databuf_lo_add() if it is, just like
    buf_lo_add() does.

    The third issue is that gfs2_log_flush() doesn't do it's block accounting
    correctly. Both metadata and journaled data are logged, but gfs2_log_flush()
    only compares the number of metadata blocks with the number of blocks to commit
    to the ondisk journal. This patch also counts the journaled data blocks.

    Signed-off-by: Benjamin Marzinski
    Signed-off-by: Steven Whitehouse

    Benjamin Marzinski
     

01 May, 2007

1 commit

  • When glock_lo_add and rg_lo_add attempt to add an element to the log, they
    check to see if has already been added before locking the log. If another
    process adds that element to the log in this window between the check and
    locking the log, the element will be added to the list twice. This causes
    the log element list to become corrupted in such a way that the log element
    can never be successfully removed from the list. This patch pulls the
    list_empty() check inside the log lock, to remove this window.

    Signed-off-by: Benjamin E. Marzinski
    Signed-off-by: Steven Whitehouse

    Benjamin Marzinski
     

06 Feb, 2007

1 commit

  • The patch below appears to fix the list corruption that we are seeing on
    occasion. Although the transaction structure is private to a single
    thread, when the queued structures are dismantled during an in-core
    commit, its possible for a different thread to be trying to add the same
    structure to another, new, transaction at the same time.

    To avoid this, this patch takes the log spinlock during this operation.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

30 Nov, 2006

2 commits


13 Oct, 2006

1 commit


25 Sep, 2006

1 commit


22 Sep, 2006

1 commit

  • 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
    arguments.

    Updated gfs2_meta_indirect_buffer to be a bit more efficient and
    hopefully also be a bit easier to read.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

19 Sep, 2006

1 commit

  • lm_interface.h has a few out of the tree clients such as GFS1
    and userland tools.

    Right now, these clients keeps a copy of the file in their build tree
    that can go out of sync.

    Move lm_interface.h to include/linux, export it to userland and
    clean up fs/gfs2 to use the new location.

    Signed-off-by: Fabio M. Di Nitto
    Signed-off-by: Steven Whitehouse

    Fabio Massimo Di Nitto