25 Jul, 2011

2 commits


07 Oct, 2010

1 commit


30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

27 Feb, 2010

3 commits

  • With the ocfs2_cluster_connection hanging off of the ocfs2_dlm_lksb, we
    have access to it in the ast and bast wrapper functions. Attach the
    ocfs2_locking_protocol to the conn.

    Now, instead of refering to a static variable for ast/bast pointers, the
    wrappers can look at the connection. This means different connections
    can have different ast/bast pointers, and it reduces the need for the
    static pointer.

    Signed-off-by: Joel Becker

    Joel Becker
     
  • We're going to want it in the ast functions, so we convert union
    ocfs2_dlm_lksb to struct ocfs2_dlm_lksb and let it carry the connection.

    Signed-off-by: Joel Becker

    Joel Becker
     
  • The stackglue ast and bast functions tried to maintain the fiction that
    their arguments were void pointers. In reality, stack_user.c had to
    know that the argument was an ocfs2_lock_res in order to get the status
    off of the lksb. That's ugly.

    This changes stackglue to always pass the lksb as the argument to ast
    and bast functions. The caller can always use container_of() to get the
    ocfs2_lock_res or user_dlm_lock_res. The net effect to the caller is
    zero. They still get back the lockres in their ast. stackglue gets
    cleaner, and now can use the lksb itself.

    Signed-off-by: Joel Becker

    Joel Becker
     

26 Jan, 2010

1 commit


08 Aug, 2009

1 commit


23 Jun, 2009

1 commit

  • The Lock Value Block (LVB) of a DLM lock can be lost when nodes die and
    the DLM cannot reconstruct its state. Clients of the DLM need to know
    this.

    ocfs2's internal DLM, o2dlm, explicitly zeroes out the LVB when it loses
    track of the state. This is not a standard behavior, but ocfs2 has
    always relied on it. Thus, an o2dlm LVB is always "valid".

    ocfs2 now supports both o2dlm and fs/dlm via the stack glue. When
    fs/dlm loses track of an LVBs state, it sets a flag
    (DLM_SBF_VALNOTVALID) on the Lock Status Block (LKSB). The contents of
    the LVB may be garbage or merely stale.

    ocfs2 doesn't want to try to guess at the validity of the stale LVB.
    Instead, it should be checking the VALNOTVALID flag. As this is the
    'standard' way of treating LVBs, we will promote this behavior.

    We add a stack glue API ocfs2_dlm_lvb_valid(). It returns non-zero when
    the LVB is valid. o2dlm will always return valid, while fs/dlm will
    check VALNOTVALID.

    Signed-off-by: Joel Becker
    Acked-by: Mark Fasheh

    Joel Becker
     

17 Jun, 2008

3 commits


01 May, 2008

1 commit


18 Apr, 2008

2 commits

  • We define the ocfs2_stack_plugin structure to represent a stack driver.
    The o2cb stack code is split into stack_o2cb.c. This becomes the
    ocfs2_stack_o2cb.ko module.

    The stackglue generic functions are similarly split into the
    ocfs2_stackglue.ko module. This module now provides an interface to
    register drivers. The ocfs2_stack_o2cb driver registers itself. As
    part of this interface, ocfs2_stackglue can load drivers on demand.
    This is accomplished in ocfs2_cluster_connect().

    ocfs2_cluster_disconnect() is now notified when a _hangup() is pending.
    If a hangup is pending, it will not release the driver module and will
    let _hangup() do that.

    Signed-off-by: Joel Becker

    Joel Becker
     
  • Define the ocfs2_stack_operations structure. Build o2cb_stack_ops from
    all of the o2cb-specific stack functions. Change the generic stack glue
    functions to call the stack_ops instead of the o2cb functions directly.

    The o2cb functions are moved to stack_o2cb.c. The headers are cleaned up
    to where only needed headers are included.

    In this code, stackglue.c and stack_o2cb.c refer to some shared
    extern variables. When they become modules, that will change.

    Signed-off-by: Joel Becker
    Signed-off-by: Mark Fasheh

    Joel Becker