27 Jul, 2008

3 commits

  • Signed-off-by: Al Viro

    Al Viro
     
  • * kill nameidata * argument; map the 3 bits in ->flags anybody cares
    about to new MAY_... ones and pass with the mask.
    * kill redundant gfs2_iop_permission()
    * sanitize ecryptfs_permission()
    * fix remaining places where ->permission() instances might barf on new
    MAY_... found in mask.

    The obvious next target in that direction is permission(9)

    folded fix for nfs_permission() breakage from Miklos Szeredi

    Signed-off-by: Al Viro

    Al Viro
     
  • Kmem cache passed to constructor is only needed for constructors that are
    themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
    passed kmem cache in non-trivial way, so pass only pointer to object.

    Non-trivial places are:
    arch/powerpc/mm/init_64.c
    arch/powerpc/mm/hugetlbpage.c

    This is flag day, yes.

    Signed-off-by: Alexey Dobriyan
    Acked-by: Pekka Enberg
    Acked-by: Christoph Lameter
    Cc: Jon Tollefson
    Cc: Nick Piggin
    Cc: Matt Mackall
    [akpm@linux-foundation.org: fix arch/powerpc/mm/hugetlbpage.c]
    [akpm@linux-foundation.org: fix mm/slab.c]
    [akpm@linux-foundation.org: fix ubifs]
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     

16 Jul, 2008

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw:
    [GFS2] Fix GFS2's use of do_div() in its quota calculations
    [GFS2] Remove unused declaration
    [GFS2] Remove support for unused and pointless flag
    [GFS2] Replace rgrp "recent list" with mru list
    [GFS2] Allow local DF locks when holding a cached EX glock
    [GFS2] Fix delayed demote race
    [GFS2] don't call permission()
    [GFS2] Fix module building
    [GFS2] Glock documentation
    [GFS2] Remove all_list from lock_dlm
    [GFS2] Remove obsolete conversion deadlock avoidance code
    [GFS2] Remove remote lock dropping code
    [GFS2] kernel panic mounting volume
    [GFS2] Revise readpage locking
    [GFS2] Fix ordering of args for list_add
    [GFS2] trivial sparse lock annotations
    [GFS2] No lock_nolock
    [GFS2] Fix ordering bug in lock_dlm
    [GFS2] Clean up the glock core

    Linus Torvalds
     

15 Jul, 2008

1 commit


11 Jul, 2008

1 commit


10 Jul, 2008

3 commits

  • The implementation of gfs2_inode_attr_in is removed.
    So remove its declaration.

    Signed-off-by: Li Xiaodong
    Signed-off-by: Steven Whitehouse

    Li Xiaodong
     
  • The ability to mark files for direct i/o access when opened
    normally is both unused and pointless, so this patch removes
    support for that feature.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This patch removes the "recent list" which is used during allocation
    and replaces it with the (already existing) mru list used during
    deletion. The "recent list" was not a true mru list leading to a number
    of inefficiencies including a "next" function which made scanning the
    list an order N^2 operation wrt to the number of list elements.

    This should increase allocation performance with large numbers of rgrps.
    Its also a useful preparation and cleanup before some further changes
    which are planned in this area.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

07 Jul, 2008

2 commits

  • We already allow local SH locks while we hold a cached EX glock, so here
    we allow DF locks as well. This works only because we rely on the VFS's
    invalidation for locally cached data, and because if we hold an EX lock,
    then we know that no other node can be caching data relating to this
    file.

    It dramatically speeds up initial writes to O_DIRECT files since we fall
    back to buffered I/O for this and would otherwise bounce between DF and
    EX modes on each and every write call. The lessons to be learned from
    that are to ensure that (for the time being anyway) O_DIRECT files are
    preallocated and that they are written to using reasonably large I/O
    sizes. Even so this change fixes that corner case nicely

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • There is a race in the delayed demote code where it does the wrong thing
    if a demotion to UN has occurred for other reasons before the delay has
    expired. This patch adds an assert to catch that condition as well as
    fixing the root cause by adding an additional check for the UN state.

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

    Steven Whitehouse
     

03 Jul, 2008

2 commits

  • GFS2 calls permission() to verify permissions after locks on the files
    have been taken.

    For this it's sufficient to call gfs2_permission() instead. This
    results in the following changes:

    - IS_RDONLY() check is not performed
    - IS_IMMUTABLE() check is not performed
    - devcgroup_inode_permission() is not called
    - security_inode_permission() is not called

    IS_RDONLY() should be unnecessary anyway, as the per-mount read-only
    flag should provide protection against read-only remounts during
    operations. do_gfs2_set_flags() has been fixed to perform
    mnt_want_write()/mnt_drop_write() to protect against remounting
    read-only.

    IS_IMMUTABLE has been added to gfs2_permission()

    Repeating the security checks seems to be pointless, as they don't
    normally change, and if they do, it's independent of the filesystem
    state.

    Signed-off-by: Miklos Szeredi
    Signed-off-by: Steven Whitehouse

    Miklos Szeredi
     
  • - Replace remote_llseek with generic_file_llseek_unlocked (to force compilation
    failures in all users)
    - Change all users to either use generic_file_llseek_unlocked directly or
    take the BKL around. I changed the file systems who don't use the BKL
    for anything (CIFS, GFS) to call it directly. NCPFS and SMBFS and NFS
    take the BKL, but explicitely in their own source now.

    I moved them all over in a single patch to avoid unbisectable sections.

    Open problem: 32bit kernels can corrupt fpos because its modification
    is not atomic, but they can do that anyways because there's other paths who
    modify it without BKL.

    Do we need a special lock for the pos/f_version = 0 checks?

    Trond says the NFS BKL is likely not needed, but keep it for now
    until his full audit.

    v2: Use generic_file_llseek_unlocked instead of remote_llseek_unlocked
    and factor duplicated code (suggested by hch)

    Cc: Trond.Myklebust@netapp.com
    Cc: swhiteho@redhat.com
    Cc: sfrench@samba.org
    Cc: vandrove@vc.cvut.cz

    Signed-off-by: Andi Kleen
    Signed-off-by: Andi Kleen
    Signed-off-by: Jonathan Corbet

    Andi Kleen
     

27 Jun, 2008

11 commits

  • Two lines missed from the previous patch.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • I discovered that we had a list onto which every lock_dlm
    lock was being put. Its only function was to discover whether
    we'd got any locks left after umount. Since there was already
    a counter for that purpose as well, I removed the list. The
    saving is sizeof(struct list_head) per glock - well worth
    having.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This is only used by GFS1 so can be removed.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • There are several reasons why this is undesirable:

    1. It never happens during normal operation anyway
    2. If it does happen it causes performance to be very, very poor
    3. It isn't likely to solve the original problem (memory shortage
    on remote DLM node) it was supposed to solve
    4. It uses a bunch of arbitrary constants which are unlikely to be
    correct for any particular situation and for which the tuning seems
    to be a black art.
    5. In an N node cluster, only 1/N of the dropped locked will actually
    contribute to solving the problem on average.

    So all in all we are better off without it. This also makes merging
    the lock_dlm module into GFS2 a bit easier.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This patch fixes Red Hat bugzilla bug 450156.

    This started with a not-too-improbable mount failure because the
    locking protocol was never set back to its proper "lock_dlm" after the
    system was rebooted in the middle of a gfs2_fsck. That left a
    (purposely) invalid locking protocol in the superblock, which caused an
    error when the file system was mounted the next time.

    When there's an error mounting, vfs calls DQUOT_OFF, which calls
    vfs_quota_off which calls gfs2_sync_fs. Next, gfs2_sync_fs calls
    gfs2_log_flush passing s_fs_info. But due to the error, s_fs_info
    had been previously set to NULL, and so we have the kernel oops.

    My solution in this patch is to test for the NULL value before passing
    it. I tested this patch and it fixes the problem.

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

    Bob Peterson
     
  • The previous attempt to fix the locking in readpage failed due
    to the use of a "try lock" which resulted in occasional high
    cpu usage during testing (due to repeated tries) and also it
    did not resolve all the ordering problems wrt the transaction
    lock (although it did solve all the inode lock ordering problems).

    This patch avoids the problem by unlocking the page and getting the
    locks in the correct order. This means that we have to retest the
    page to ensure that it hasn't changed when we relock the page.

    This now passes the tests which were previously failing.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The patch to remove lock_nolock managed to get the arguments
    of this list_add backwards. This fixes it.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • Annotate the &sdp->sd_log_lock.

    Signed-off-by: Harvey Harrison
    Signed-off-by: Steven Whitehouse

    Harvey Harrison
     
  • This patch merges the lock_nolock module into GFS2 itself. As well as removing
    some of the overhead of the module, it also means that its now impossible to
    build GFS2 without a lock module (which would be a pointless thing to do
    anyway).

    We also plan to merge lock_dlm into GFS2 in the future, but that is a more
    tricky task, and will therefore be a separate patch.

    Signed-off-by: Steven Whitehouse
    Cc: David Teigland

    Steven Whitehouse
     
  • This looks like a lot of change, but in fact its not. Mostly its
    things moving from one file to another. The change is just that
    instead of queuing lock completions and callbacks from the DLM
    we now pass them directly to GFS2.

    This gives us a net loss of two list heads per glock (a fair
    saving in memory) plus a reduction in the latency of delivering
    the messages to GFS2, plus we now have one thread fewer as well.
    There was a bug where callbacks and completions could be delivered
    in the wrong order due to this unnecessary queuing which is fixed
    by this patch.

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

    Steven Whitehouse
     
  • This patch implements a number of cleanups to the core of the
    GFS2 glock code. As a result a lot of code is removed. It looks
    like a really big change, but actually a large part of this patch
    is either removing or moving existing code.

    There are some new bits too though, such as the new run_queue()
    function which is considerably streamlined. Highlights of this
    patch include:

    o Fixes a cluster coherency bug during SH -> EX lock conversions
    o Removes the "glmutex" code in favour of a single bit lock
    o Removes the ->go_xmote_bh() for inodes since it was duplicating
    ->go_lock()
    o We now only use the ->lm_lock() function for both locks and
    unlocks (i.e. unlock is a lock with target mode LM_ST_UNLOCKED)
    o The fast path is considerably shortly, giving performance gains
    especially with lock_nolock
    o The glock_workqueue is now used for all the callbacks from the DLM
    which allows us to simplify the lock_dlm module (see following patch)
    o The way is now open to make further changes such as eliminating the two
    threads (gfs2_glockd and gfs2_scand) in favour of a more efficient
    scheme.

    This patch has undergone extensive testing with various test suites
    so it should be pretty stable by now.

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

    Steven Whitehouse
     

25 Jun, 2008

1 commit

  • This patch fixes bz 450641.

    This patch changes the computation for zero_metapath_length(), which it
    renames to metapath_branch_start(). When you are extending the metadata
    tree, The indirect blocks that point to the new data block must either
    diverge from the existing tree either at the inode, or at the first
    indirect block. They can diverge at the first indirect block because the
    inode has room for 483 pointers while the indirect blocks have room for
    509 pointers, so when the tree is grown, there is some free space in the
    first indirect block. What metapath_branch_start() now computes is the
    height where the first indirect block for the new data block is located.
    It can either be 1 (if the indirect block diverges from the inode) or 2
    (if it diverges from the first indirect block).

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

    Benjamin Marzinski
     

24 Jun, 2008

1 commit


12 May, 2008

3 commits

  • strlcpy is faster than snprintf when you don't use the returned value.

    Signed-off-by: Jean Delvare
    Signed-off-by: Steven Whitehouse

    Jean Delvare
     
  • This fixes bz 444829 where allocating a new block caused gfs2 file systems to
    report 0 bytes used in df. It was caused by a broken cast from an unsigned int
    in gfs2_block_alloc() to a negative s64 in gfs2_statfs_change(). This patch
    casts the unsigned int to an s64 before the unary minus is applied.

    Signed-off-by: Andrew Price
    Signed-off-by: Steven Whitehouse

    Andrew Price
     
  • This patch fixes a GFS2 filesystem consistency error reported from
    function do_strip. The problem was caused by a timing window
    that allowed two vfs inodes to be created in memory that point
    to the same file. The problem is fixed by making the vfs's
    iget_test, iget_set mechanism check and set a new bit in the
    in-core gfs2_inode structure while the vfs inode spin_lock is held.

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

    Bob Peterson
     

30 Apr, 2008

1 commit


28 Apr, 2008

1 commit

  • Nothing in the tree uses nopage any more. Remove support for it in the
    core mm code and documentation (and a few stray references to it in
    comments).

    Signed-off-by: Nick Piggin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nick Piggin
     

22 Apr, 2008

1 commit


18 Apr, 2008

1 commit


10 Apr, 2008

1 commit

  • There are several places where GFP_KERNEL allocations happen under a glock,
    which will result in hangs if we're under memory pressure and go to re-enter the
    fs in order to flush stuff out. This patch changes the culprits to GFS_NOFS to
    keep this problem from happening. Thank you,

    Signed-off-by: Josef Bacik
    Signed-off-by: Steven Whitehouse

    Josef Bacik
     

31 Mar, 2008

6 commits

  • The function gfs2_inode_lookup always returns either a valid pointer or a
    value made with ERR_PTR, so its result should be tested with IS_ERR, not
    with a test for 0.

    The problem was found using the following semantic match.
    (http://www.emn.fr/x-info/coccinelle/)

    //
    @a@
    expression E, E1;
    statement S,S1;
    position p;
    @@

    E = gfs2_inode_lookup(...)
    ... when != E = E1
    if@p (E) S else S1

    @n@
    position a.p;
    expression E,E1;
    statement S,S1;
    @@

    E = NULL
    ... when != E = E1
    if@p (E) S else S1

    @depends on !n@
    expression E;
    statement S,S1;
    position a.p;
    @@

    * if@p (E)
    S else S1
    //

    Signed-off-by: Julia Lawall
    Signed-off-by: Steven Whitehouse

    Julia Lawall
     
  • GFS2 wasn't invalidating its cache before it called into the lock manager
    with a request that could potentially drop a lock. This was leaving a
    window where the lock could be actually be held by another node, but the
    file's page cache would still appear valid, causing coherency problems.
    This patch moves the cache invalidation to before the lock manager call
    when dropping a lock. It also adds the option to the lock_dlm lock
    manager to not use conversion mode deadlock avoidance, which, on a
    conversion from shared to exclusive, could internally drop the lock, and
    then reacquire in. GFS2 now asks lock_dlm to not do this. Instead, GFS2
    manually drops the lock and reacquires it.

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

    Benjamin Marzinski
     
  • fs/gfs2/recovery.c: In function 'get_log_header':
    fs/gfs2/recovery.c:152: warning: 'lh.lh_sequence' may be used uninitialized in this function
    fs/gfs2/recovery.c:152: warning: 'lh.lh_flags' may be used uninitialized in this function
    fs/gfs2/recovery.c:152: warning: 'lh.lh_tail' may be used uninitialized in this function
    fs/gfs2/recovery.c:152: warning: 'lh.lh_blkno' may be used uninitialized in this function
    fs/gfs2/recovery.c:152: warning: 'lh.lh_hash' may be used uninitialized in this function

    Cc: David Teigland
    Cc: Bob Peterson
    Signed-off-by: Andrew Morton
    Signed-off-by: Steven Whitehouse

    akpm@linux-foundation.org
     
  • This version of the gfs2_bitfit algorithm includes the latest
    suggestions from Steve Whitehouse. It is typically eight to
    ten times faster than the version we're using today. If there
    is a lot of metadata mixed in (lots of small files) the
    algorithm is often 15 times faster, and given the right
    conditions, I've seen peaks of 20 times faster.

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

    Bob Peterson
     
  • This patch streamlines the quota checking in the "no quota" case by
    making the check inline in the calling function, thus reducing the
    number of function calls. Eventually we might be able to remove the
    checks from the gfs2_quota_lock() and gfs2_quota_check() functions, but
    currently we can't as there are a very few places in the code which need
    to call these functions directly still.

    Signed-off-by: Steven Whitehouse
    Cc: Abhijith Das

    Steven Whitehouse
     
  • In an earlier patch "[GFS2] fix file_system_type leak on gfs2meta mount"
    we removed the code to grab a ref to the module which was not needed
    (since we know that the module cannot be unloaded at that time) so
    this patch removes the code to drop that reference.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse