31 Mar, 2011

1 commit


07 Mar, 2011

1 commit

  • Convert the xfs log operations to use the new error logging
    interfaces. This removes the xlog_{warn,panic} wrappers and makes
    almost all errors emit the device they belong to instead of just
    refering to "XFS".

    Signed-off-by: Dave Chinner
    Reviewed-by: Alex Elder
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     

12 Jan, 2011

1 commit

  • We currently have a global error message buffer in cmn_err that is
    protected by a spin lock that disables interrupts. Recently there
    have been reports of NMI timeouts occurring when the console is
    being flooded by SCSI error reports due to cmn_err() getting stuck
    trying to print to the console while holding this lock (i.e. with
    interrupts disabled). The NMI watchdog is seeing this CPU as
    non-responding and so is triggering a panic. While the trigger for
    the reported case is SCSI errors, pretty much anything that spams
    the kernel log could cause this to occur.

    Realistically the only reason that we have the intemediate message
    buffer is to prepend the correct kernel log level prefix to the log
    message. The only reason we have the lock is to protect the global
    message buffer and the only reason the message buffer is global is
    to keep it off the stack. Hence if we can avoid needing a global
    message buffer we avoid needing the lock, and we can do this with a
    small amount of cleanup and some preprocessor tricks:

    1. clean up xfs_cmn_err() panic mask functionality to avoid
    needing debug code in xfs_cmn_err()
    2. remove the couple of "!" message prefixes that still exist that
    the existing cmn_err() code steps over.
    3. redefine CE_* levels directly to KERN_*
    4. redefine cmn_err() and friends to use printk() directly
    via variable argument length macros.

    By doing this, we can completely remove the cmn_err() code and the
    lock that is causing the problems, and rely solely on printk()
    serialisation to ensure that we don't get garbled messages.

    A series of followup patches is really needed to clean up all the
    cmn_err() calls and related messages properly, but that results in a
    series that is not easily back portable to enterprise kernels. Hence
    this initial fix is only to address the direct problem in the lowest
    impact way possible.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Alex Elder

    Dave Chinner
     

21 Dec, 2010

2 commits

  • log->l_tail_lsn is currently protected by the log grant lock. The
    lock is only needed for serialising readers against writers, so we
    don't really need the lock if we make the l_tail_lsn variable an
    atomic. Converting the l_tail_lsn variable to an atomic64_t means we
    can start to peel back the grant lock from various operations.

    Also, provide functions to safely crack an atomic LSN variable into
    it's component pieces and to recombined the components into an
    atomic variable. Use them where appropriate.

    This also removes the need for explicitly holding a spinlock to read
    the l_tail_lsn on 32 bit platforms.

    Signed-off-by: Dave Chinner

    Dave Chinner
     
  • Prepare for switching the grant heads to atomic variables by
    combining the two 32 bit values that make up the grant head into a
    single 64 bit variable. Provide wrapper functions to combine and
    split the grant heads appropriately for calculations and use them as
    necessary.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     

20 Dec, 2010

2 commits

  • We now have two copies of AIL insert operations that are mostly
    duplicate functionality. The single log item updates can be
    implemented via the bulk updates by turning xfs_trans_ail_update()
    into a simple wrapper. This removes all the duplicate insert
    functionality and associated helpers.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     
  • EFI/EFD interactions are protected from races by the AIL lock. They
    are the only type of log items that require the the AIL lock to
    serialise internal state, so they need to be separated from the AIL
    lock before we can do bulk insert operations on the AIL.

    To acheive this, convert the counter of the number of extents in the
    EFI to an atomic so it can be safely manipulated by EFD processing
    without locks. Also, convert the EFI state flag manipulations to use
    atomic bit operations so no locks are needed to record state
    changes. Finally, use the state bits to determine when it is safe to
    free the EFI and clean up the code to do this neatly.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     

17 Dec, 2010

4 commits


03 Dec, 2010

1 commit

  • log->l_last_sync_lsn is updated in only one critical spot - log
    buffer Io completion - and is protected by the grant lock here. This
    requires the grant lock to be taken for every log buffer IO
    completion. Converting the l_last_sync_lsn variable to an atomic64_t
    means that we do not need to take the grant lock in log buffer IO
    completion to update it.

    This also removes the need for explicitly holding a spinlock to read
    the l_last_sync_lsn on 32 bit platforms.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     

19 Oct, 2010

3 commits

  • Stop having two different names for many buffer functions and use
    the more descriptive xfs_buf_* names directly.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Alex Elder

    Christoph Hellwig
     
  • Each buffer contains both a buftarg pointer and a mount pointer. If
    we add a mount pointer into the buftarg, we can avoid needing the
    b_mount field in every buffer and grab it from the buftarg when
    needed instead. This shrinks the xfs_buf by 8 bytes.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Reviewed-by: Alex Elder

    Dave Chinner
     
  • xfs_buf_get_nodaddr() is really used to allocate a buffer that is
    uncached. While it is not directly assigned a disk address, the fact
    that they are not cached is a more important distinction. With the
    upcoming uncached buffer read primitive, we should be consistent
    with this disctinction.

    While there, make page allocation in xfs_buf_get_nodaddr() safe
    against memory reclaim re-entrancy into the filesystem by allowing
    a flags parameter to be passed.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Reviewed-by: Alex Elder

    Dave Chinner
     

27 Jul, 2010

3 commits


24 Jun, 2010

1 commit

  • The block number comes from bulkstat based inode lookups to shortcut
    the mapping calculations. We ar enot able to trust anything from
    bulkstat, so drop the block number as well so that the correct
    lookups and mappings are always done.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     

29 May, 2010

1 commit


24 May, 2010

1 commit

  • Clean up the buffer log format (XFS_BLI_*) flags because they have a
    polluted namespace. They XFS_BLI_ prefix is used for both in-memory
    and on-disk flag feilds, but have overlapping values for different
    flags. Rename the buffer log format flags to use the XFS_BLF_*
    prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed
    flags.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Alex Elder

    Dave Chinner
     

19 May, 2010

12 commits

  • There remains only one user of the l_sectbb_mask field in the log
    structure. Just kill it off and compute the mask where needed from
    the power-of-2 sector size.

    (Only update from last post is to accomodate the changes in the
    previous patch in the series.)

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig

    Alex Elder
     
  • Change struct log so it keeps track of the size (in basic blocks) of
    a log sector in l_sectBBsize rather than the log-base-2 of that
    value (previously, l_sectbb_log). The name was chosen for
    consistency with the other fields in the structure that represent
    a number of basic blocks.

    (Updated so that a variable used in computing and verifying a log's
    sector size is named "log2_size". Also added the "BB" to the
    structure field name, based on feedback from Eric Sandeen. Also
    dropped some superfluous parentheses.)

    Signed-off-by: Alex Elder
    Reviewed-by: Eric Sandeen

    Alex Elder
     
  • This can't be enabled through the build system and has been dead for
    ages. Note that the CRC patches add back log checksumming, but the
    code is quite different from the version removed here anyway.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Dave Chinner

    Christoph Hellwig
     
  • Odds and ends in "xfs_log_recover.c". This patch just contains some
    minor things that didn't seem to warrant their own individual
    patches:
    - In xlog_bread_noalign(), drop an assertion that a pointer is
    non-null (the crash will tell us it was a bad pointer).
    - Add a more descriptive header comment for xlog_find_verify_cycle().
    - Make a few additions to the comments in xlog_find_head(). Also
    rearrange some expressions in a few spots to produce the same
    result, but in a way that seems more clear what's being computed.

    (Updated in response to Dave's review comments. Note I did not
    split this patch like I said I would.)

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig

    Alex Elder
     
  • In xlog_find_cycle_start() use a local variable for some repeated
    operations rather than constantly accessing the memory location
    whose address is passed in.

    (This version drops an assertion that a pointer is non-null.)

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig

    Alex Elder
     
  • Rename a label used in xlog_find_head() that I thought was poorly
    chosen. Also combine two adjacent labels xlog_find_tail() into a
    single label, and give it a more generic name.

    (Now using Dave's suggested "validate_head" name for first label.)

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig

    Alex Elder
     
  • There are a number of places where a log sector size of 1 uses
    special case code. The round_up() and round_down() macros
    produce the correct result even when the log sector size is 1, and
    this eliminates the need for treating this as a special case.

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig

    Alex Elder
     
  • Define a function that encapsulates checking the validity of a log
    block count.

    (Updated from previous version--no longer includes error reporting in the
    encapsulated validation function.)

    Signed-off-by: Alex Elder
    Reviewed-by: Dave Chinner
    Signed-off-by: Dave Chinner

    Alex Elder
     
  • XLOG_SECTOR_ROUNDUP_BBCOUNT() and XLOG_SECTOR_ROUNDDOWN_BLKNO()
    are now fairly simple macro translations. Just get rid of them in
    favor of the round_up() and round_down() macro calls they represent.

    Also, in spots in xlog_get_bp() and xlog_write_log_records(),
    round_up() was being called with value 1, which just evaluates
    to the macro's second argument; so just use that instead.
    In the latter case, make use of that value, as long as it's
    already been computed.

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Dave Chinner

    Alex Elder
     
  • XLOG_SECTOR_ROUNDUP_BBCOUNT() is defined in "fs/xfs/xfs_log_recover.c"
    in an overly-complicated way. It is basically roundup(), but that
    is not at all clear from its definition. (Actually, there is
    another macro round_up() that applies for power-of-two-based masks
    which I'll be using here.)

    The operands in XLOG_SECTOR_ROUNDUP_BBCOUNT() are basically the
    block number (bbs) and the log sector basic block mask
    (log->l_sectbb_mask). I'll call them B and M for this discussion.

    The macro computes is value this way:
    M && (B & M) ? (B + M + 1) & ~M : B

    Put another way, we can break it into 3 cases:
    1) ! M -> B # 0 mask, no effect
    2) ! (B & M) -> B # sector aligned
    3) M && (B & M) -> (B + M + 1) & ~M # round up otherwise

    The round_up() macro is cleverly defined using a value, v, and a
    power-of-2, p, and the result is the nearest multiple of p greater
    than or equal to v. Its value is computed something like this:
    ((v - 1) | (p - 1)) + 1
    Let's consider using this in the context of the 3 cases above.

    When p = 2^0 = 1, the result boils down to ((v - 1) | 0) + 1, so it
    just translates any value v to itself. That handles case (1) above.

    When p = 2^n, n > 0, we know that (p - 1) will be a mask with all n
    bits 0..n-1 set. The condition in this case occurs when none of
    those mask bits is set in the value v provided. If that is the
    case, subtracting 1 from v will have 1's in all those lower bits (at
    least). Therefore, OR-ing the mask with that decremented value has
    no effect, so adding the 1 back again will just translate the v to
    itself. This handles case (2).

    Otherwise, the value v is greater than some multiple of p, and
    decrementing it will produce a result greater than or equal to that
    multiple. OR-ing in the mask will produce a value 1 less than the
    next multiple of p, so finally adding 1 back will result in the
    desired rounded-up value. This handles case (3).

    Hopefully this is convincing.

    While I was at it, I converted XLOG_SECTOR_ROUNDDOWN_BLKNO() to use
    the round_down() macro.

    Signed-off-by: Alex Elder
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Dave Chinner

    Alex Elder
     
  • This fixes a bug in two places that I found by inspection. In
    xlog_find_verify_cycle() and xlog_write_log_records(), the code
    attempts to allocate a buffer to hold as many blocks as possible.
    It gives up if the number of blocks to be allocated gets too small.
    Right now it uses log->l_sectbb_log as that lower bound, but I'm
    sure it's supposed to be the actual log sector size instead. That
    is, the lower bound should be (1 << log->l_sectbb_log).

    Also define a simple macro xlog_sectbb(log) to represent the number
    of basic blocks in a sector for the given log.

    (No change from original submission; I have implemented Christoph's
    suggestion about storing l_sectsize rather than l_sectbb_log in
    a new, separate patch in this series.)

    Signed-off-by: Alex Elder
    Reviewed-by: Dave Chinner
    Signed-off-by: Dave Chinner

    Alex Elder
     
  • Currently there is no tracing in log recovery, so it is difficult to
    determine what is going on when something goes wrong.

    Add tracing for log item recovery to provide visibility into the log
    recovery process. The tracing added shows regions being extracted
    from the log transactions and added to the transaction hash forming
    recovery items, followed by the reordering, cancelling and finally
    recovery of the items.

    Signed-off-by: Dave Chinner
    Reviewed-by: Christoph Hellwig

    Dave Chinner
     

22 Jan, 2010

2 commits

  • Remove the XFS_LOG_FORCE argument which was always set, and the
    XFS_LOG_URGE define, which was never used.

    Split xfs_log_force into a two helpers - xfs_log_force which forces
    the whole log, and xfs_log_force_lsn which forces up to the
    specified LSN. The underlying implementations already were entirely
    separate, as were the users.

    Also re-indent the new _xfs_log_force/_xfs_log_force which
    previously had a weird coding style.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Alex Elder

    Christoph Hellwig
     
  • Currently we define aliases for the buffer flags in various
    namespaces, which only adds confusion. Remove all but the XBF_
    flags to clean this up a bit.

    Note that we still abuse XFS_B_ASYNC/XBF_ASYNC for some non-buffer
    uses, but I'll clean that up later.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Dave Chinner
    Signed-off-by: Alex Elder

    Christoph Hellwig
     

16 Jan, 2010

2 commits


16 Dec, 2009

2 commits


15 Dec, 2009

1 commit

  • Convert the old xfs tracing support that could only be used with the
    out of tree kdb and xfsidbg patches to use the generic event tracer.

    To use it make sure CONFIG_EVENT_TRACING is enabled and then enable
    all xfs trace channels by:

    echo 1 > /sys/kernel/debug/tracing/events/xfs/enable

    or alternatively enable single events by just doing the same in one
    event subdirectory, e.g.

    echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_ihold/enable

    or set more complex filters, etc. In Documentation/trace/events.txt
    all this is desctribed in more detail. To reads the events do a

    cat /sys/kernel/debug/tracing/trace

    Compared to the last posting this patch converts the tracing mostly to
    the one tracepoint per callsite model that other users of the new
    tracing facility also employ. This allows a very fine-grained control
    of the tracing, a cleaner output of the traces and also enables the
    perf tool to use each tracepoint as a virtual performance counter,
    allowing us to e.g. count how often certain workloads git various
    spots in XFS. Take a look at

    http://lwn.net/Articles/346470/

    for some examples.

    Also the btree tracing isn't included at all yet, as it will require
    additional core tracing features not in mainline yet, I plan to
    deliver it later.

    And the really nice thing about this patch is that it actually removes
    many lines of code while adding this nice functionality:

    fs/xfs/Makefile | 8
    fs/xfs/linux-2.6/xfs_acl.c | 1
    fs/xfs/linux-2.6/xfs_aops.c | 52 -
    fs/xfs/linux-2.6/xfs_aops.h | 2
    fs/xfs/linux-2.6/xfs_buf.c | 117 +--
    fs/xfs/linux-2.6/xfs_buf.h | 33
    fs/xfs/linux-2.6/xfs_fs_subr.c | 3
    fs/xfs/linux-2.6/xfs_ioctl.c | 1
    fs/xfs/linux-2.6/xfs_ioctl32.c | 1
    fs/xfs/linux-2.6/xfs_iops.c | 1
    fs/xfs/linux-2.6/xfs_linux.h | 1
    fs/xfs/linux-2.6/xfs_lrw.c | 87 --
    fs/xfs/linux-2.6/xfs_lrw.h | 45 -
    fs/xfs/linux-2.6/xfs_super.c | 104 ---
    fs/xfs/linux-2.6/xfs_super.h | 7
    fs/xfs/linux-2.6/xfs_sync.c | 1
    fs/xfs/linux-2.6/xfs_trace.c | 75 ++
    fs/xfs/linux-2.6/xfs_trace.h | 1369 +++++++++++++++++++++++++++++++++++++++++
    fs/xfs/linux-2.6/xfs_vnode.h | 4
    fs/xfs/quota/xfs_dquot.c | 110 ---
    fs/xfs/quota/xfs_dquot.h | 21
    fs/xfs/quota/xfs_qm.c | 40 -
    fs/xfs/quota/xfs_qm_syscalls.c | 4
    fs/xfs/support/ktrace.c | 323 ---------
    fs/xfs/support/ktrace.h | 85 --
    fs/xfs/xfs.h | 16
    fs/xfs/xfs_ag.h | 14
    fs/xfs/xfs_alloc.c | 230 +-----
    fs/xfs/xfs_alloc.h | 27
    fs/xfs/xfs_alloc_btree.c | 1
    fs/xfs/xfs_attr.c | 107 ---
    fs/xfs/xfs_attr.h | 10
    fs/xfs/xfs_attr_leaf.c | 14
    fs/xfs/xfs_attr_sf.h | 40 -
    fs/xfs/xfs_bmap.c | 507 +++------------
    fs/xfs/xfs_bmap.h | 49 -
    fs/xfs/xfs_bmap_btree.c | 6
    fs/xfs/xfs_btree.c | 5
    fs/xfs/xfs_btree_trace.h | 17
    fs/xfs/xfs_buf_item.c | 87 --
    fs/xfs/xfs_buf_item.h | 20
    fs/xfs/xfs_da_btree.c | 3
    fs/xfs/xfs_da_btree.h | 7
    fs/xfs/xfs_dfrag.c | 2
    fs/xfs/xfs_dir2.c | 8
    fs/xfs/xfs_dir2_block.c | 20
    fs/xfs/xfs_dir2_leaf.c | 21
    fs/xfs/xfs_dir2_node.c | 27
    fs/xfs/xfs_dir2_sf.c | 26
    fs/xfs/xfs_dir2_trace.c | 216 ------
    fs/xfs/xfs_dir2_trace.h | 72 --
    fs/xfs/xfs_filestream.c | 8
    fs/xfs/xfs_fsops.c | 2
    fs/xfs/xfs_iget.c | 111 ---
    fs/xfs/xfs_inode.c | 67 --
    fs/xfs/xfs_inode.h | 76 --
    fs/xfs/xfs_inode_item.c | 5
    fs/xfs/xfs_iomap.c | 85 --
    fs/xfs/xfs_iomap.h | 8
    fs/xfs/xfs_log.c | 181 +----
    fs/xfs/xfs_log_priv.h | 20
    fs/xfs/xfs_log_recover.c | 1
    fs/xfs/xfs_mount.c | 2
    fs/xfs/xfs_quota.h | 8
    fs/xfs/xfs_rename.c | 1
    fs/xfs/xfs_rtalloc.c | 1
    fs/xfs/xfs_rw.c | 3
    fs/xfs/xfs_trans.h | 47 +
    fs/xfs/xfs_trans_buf.c | 62 -
    fs/xfs/xfs_vnodeops.c | 8
    70 files changed, 2151 insertions(+), 2592 deletions(-)

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Alex Elder

    Christoph Hellwig