02 Jan, 2013

4 commits

  • In function rg_mblk_search, it's searching for multiple blocks in
    a given state (e.g. "free"). If there's an active block reservation
    its goal is the next free block of that. If the resource group
    contains the dinode's goal block, that's used for the search. But
    if neither is the case, it uses the rgrp's last allocated block.
    That way, consecutive allocations appear after one another on media.
    The problem comes in when you hit the end of the rgrp; it would never
    start over and search from the beginning. This became a problem,
    since if you deleted all the files and data from the rgrp, it would
    never start over and find free blocks. So it had to keep searching
    further out on the media to allocate blocks. This patch resets the
    rd_last_alloc after it does an unsuccessful search at the end of
    the rgrp.

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

    Bob Peterson
     
  • This patch adds a return code check after calling function
    gfs2_rbm_from_block while determining the free extent size.
    That way, when the end of an rgrp is reached, it won't try
    to process unaligned blocks after the end.

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

    Bob Peterson
     
  • QE aio tests uncovered a race condition in gfs2_rs_alloc where it's possible
    to come out of the function with a valid ip->i_res allocation but it gets
    freed before use resulting in a NULL ptr dereference.

    This patch envelopes the initial short-circuit check for non-NULL ip->i_res
    into the mutex lock. With this patch, I was able to successfully run the
    reproducer test multiple times.

    Resolves: rhbz#878476
    Signed-off-by: Abhi Das
    Signed-off-by: Steven Whitehouse

    Abhijith Das
     
  • When generating the DLM lock name, a value of 0 would skip
    the loop and leave the string unchanged. This left locks with
    a value of 0 unlabeled. Initializing the string to '0' fixes this.

    Signed-off-by: Nathan Straz
    Signed-off-by: Steven Whitehouse

    Nathan Straz
     

18 Dec, 2012

1 commit


16 Dec, 2012

1 commit

  • Pull GFS2 updates from Steven Whitehouse:
    "The main feature this time is the new Orlov allocator and the patches
    leading up to it which allow us to allocate new inodes from their own
    allocation context, rather than borrowing that of their parent
    directory. It is this change which then allows us to choose a
    different location for subdirectories when required. This works
    exactly as per the ext3 implementation from the users point of view.

    In addition to that, we've got a speed up in gfs2_rbm_from_block()
    from Bob Peterson, three locking related improvements from Dave
    Teigland plus a selection of smaller bug fixes and clean ups."

    * git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw:
    GFS2: Set gl_object during inode create
    GFS2: add error check while allocating new inodes
    GFS2: don't reference inode's glock during block allocation trace
    GFS2: remove redundant lvb pointer
    GFS2: only use lvb on glocks that need it
    GFS2: skip dlm_unlock calls in unmount
    GFS2: Fix one RG corner case
    GFS2: Eliminate redundant buffer_head manipulation in gfs2_unlink_inode
    GFS2: Use dirty_inode in gfs2_dir_add
    GFS2: Fix truncation of journaled data files
    GFS2: Add Orlov allocator
    GFS2: Use proper allocation context for new inodes
    GFS2: Add test for resource group congestion status
    GFS2: Rename glops go_xmote_th to go_sync
    GFS2: Speed up gfs2_rbm_from_block
    GFS2: Review bug traps in glops.c

    Linus Torvalds
     

12 Dec, 2012

1 commit

  • Overhaul struct address_space.assoc_mapping renaming it to
    address_space.private_data and its type is redefined to void*. By this
    approach we consistently name the .private_* elements from struct
    address_space as well as allow extended usage for address_space
    association with other data structures through ->private_data.

    Also, all users of old ->assoc_mapping element are converted to reflect
    its new name and type change (->private_data).

    Signed-off-by: Rafael Aquini
    Cc: Rusty Russell
    Cc: "Michael S. Tsirkin"
    Cc: Rik van Riel
    Cc: Mel Gorman
    Cc: Andi Kleen
    Cc: Konrad Rzeszutek Wilk
    Cc: Minchan Kim
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rafael Aquini
     

21 Nov, 2012

1 commit

  • This patch fixes a cluster coherency problem that occurs when one
    node creates a file, does several writes, then a different node
    tries to write to the same file. When the inode's glock is demoted,
    the inode wasn't synced to the media properly because the gl_object
    wasn't set. Later, the flush daemon noticed the uncommitted data
    and tried to flush it, only to discover the glock was no longer locked
    properly in exclusive mode. That caused an assert withdraw.

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

    Bob Peterson
     

16 Nov, 2012

2 commits


15 Nov, 2012

2 commits


14 Nov, 2012

1 commit

  • When unmounting, gfs2 does a full dlm_unlock operation on every
    cached lock. This can create a very large amount of work and can
    take a long time to complete. However, the vast majority of these
    dlm unlock operations are unnecessary because after all the unlocks
    are done, gfs2 leaves the dlm lockspace, which automatically clears
    the locks of the leaving node, without unlocking each one individually.
    So, gfs2 can skip explicit dlm unlocks, and use dlm_release_lockspace to
    remove the locks implicitly. The one exception is when the lock's lvb is
    being used. In this case, dlm_unlock is called because it may update the
    lvb of the resource.

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

    David Teigland
     

13 Nov, 2012

4 commits


07 Nov, 2012

13 commits

  • Just like ext3, this works on the root directory and any directory
    with the +T flag set. Also, just like ext3, any subdirectory created
    in one of the just mentioned cases will be allocated to a random
    resource group (GFS2 equivalent of a block group).

    If you are creating a set of directories, each of which will contain a
    job running on a different node, then by setting +T on the parent
    directory before creating the subdirectories, each will land up in a
    different resource group, and thus resource group contention between
    nodes will be kept to a minimum.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • Rather than using the parent directory's allocation context, this
    patch allocated the new inode earlier in the process and then uses
    it to contain all the information required. As a result, we can now
    use the new inode's own allocation context to allocate it rather
    than having to use the parent directory's context. This give us a
    lot more flexibility in where the inode is placed on disk.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This patch uses information gathered by the recent glock statistics
    patch in order to derrive a boolean verdict on the congestion
    status of a resource group. This is then used when making decisions
    on which resource group to choose during block allocation.

    The aim is to avoid resource groups which are heavily contended
    by other nodes, while still ensuring locality of access wherever
    possible.

    Once a reservation has been made in a particular resource group
    we continue to use that resource group until a new reservation is
    required. This should help to ensure that we do not change resource
    groups too often.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • [Editorial: This is a nit, but has been a minor irritation for a long time:]

    This patch renames glops structure item for go_xmote_th to go_sync.
    The functionality is unchanged; it's just for readability.

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

    Bob Peterson
     
  • This patch is a rewrite of function gfs2_rbm_from_block. Rather than
    looping to find the right bitmap, the code now does a few simple
    math calculations.

    I compared the performance of both algorithms side by side and the new
    algorithm is noticeably faster. Sample instrumentation output from a
    "fast" machine:

    5 million calls: millisec spent: Orig: 166 New: 113
    5 million calls: millisec spent: Orig: 189 New: 114

    In addition, I ran postmark (on a somewhat slowr CPU) before the after
    the new algorithm was put in place and postmark showed a decent
    improvement:

    Before the new algorithm:
    -------------------------
    Time:
    645 seconds total
    584 seconds of transactions (171 per second)

    Files:
    150087 created (232 per second)
    Creation alone: 100000 files (2083 per second)
    Mixed with transactions: 50087 files (85 per second)
    49995 read (85 per second)
    49991 appended (85 per second)
    150087 deleted (232 per second)
    Deletion alone: 100174 files (7705 per second)
    Mixed with transactions: 49913 files (85 per second)

    Data:
    273.42 megabytes read (434.08 kilobytes per second)
    852.13 megabytes written (1.32 megabytes per second)

    With the new algorithm:
    -----------------------
    Time:
    599 seconds total
    530 seconds of transactions (188 per second)

    Files:
    150087 created (250 per second)
    Creation alone: 100000 files (1886 per second)
    Mixed with transactions: 50087 files (94 per second)
    49995 read (94 per second)
    49991 appended (94 per second)
    150087 deleted (250 per second)
    Deletion alone: 100174 files (6260 per second)
    Mixed with transactions: 49913 files (94 per second)

    Data:
    273.42 megabytes read (467.42 kilobytes per second)
    852.13 megabytes written (1.42 megabytes per second)

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

    Bob Peterson
     
  • Two of the bug traps here could really be warnings. The others are
    converted from BUG() to GLOCK_BUG_ON() since we'll most likely
    need to know the glock state in order to debug any issues which
    arise. As a result of this, __dump_glock has to be renamed and
    is no longer static.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • In gfs2_trans_add_bh(), gfs2 was testing if a there was a bd attached to the
    buffer without having the gfs2_log_lock held. It was then assuming it would
    stay attached for the rest of the function. However, without either the log
    lock being held of the buffer locked, __gfs2_ail_flush() could detach bd at any
    time. This patch moves the locking before the test. If there isn't a bd
    already attached, gfs2 can safely allocate one and attach it before locking.
    There is no way that the newly allocated bd could be on the ail list,
    and thus no way for __gfs2_ail_flush() to detach it.

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

    Benjamin Marzinski
     
  • file_accessed() was being called by gfs2_mmap() with a shared glock. If it
    needed to update the atime, it was crashing because it dirtied the inode in
    gfs2_dirty_inode() without holding an exclusive lock. gfs2_dirty_inode()
    checked if the caller was already holding a glock, but it didn't make sure that
    the glock was in the exclusive state. Now, instead of calling file_accessed()
    while holding the shared lock in gfs2_mmap(), file_accessed() is called after
    grabbing and releasing the glock to update the inode. If file_accessed() needs
    to update the atime, it will grab an exclusive lock in gfs2_dirty_inode().

    gfs2_dirty_inode() now also checks to make sure that if the calling process has
    already locked the glock, it has an exclusive lock.

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

    Benjamin Marzinski
     
  • Currently implementation in gfs2 uses FITRIM arguments as it were in
    file system blocks units which is wrong. The FITRIM arguments
    (fstrim_range.start, fstrim_range.len and fstrim_range.minlen) are
    actually in bytes.

    Moreover, check for start argument beyond the end of file system, len
    argument being smaller than file system block and minlen argument being
    bigger than biggest resource group were missing.

    This commit converts the code to convert FITRIM argument to file system
    blocks and also adds appropriate checks mentioned above.

    All the problems were recognised by xfstests 251 and 260.

    Signed-off-by: Lukas Czerner
    Signed-off-by: Steven Whitehouse

    Lukas Czerner
     
  • When the fstrim_range argument is not provided by user in FITRIM ioctl
    we should just return EFAULT and not promoting bad behaviour by filling
    the structure in kernel. Let the user deal with it.

    Signed-off-by: Lukas Czerner
    Signed-off-by: Steven Whitehouse

    Lukas Czerner
     
  • Cleans up two cases where variables were assigned values but then never
    used again.

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

    Andrew Price
     
  • Despite the return value from kmem_cache_zalloc() being checked, the
    error wasn't being returned until after a possible null pointer
    dereference. This patch returns the error immediately, allowing the
    removal of the error variable.

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

    Andrew Price
     
  • Check the return value of gfs2_rs_alloc(ip) and avoid a possible null
    pointer dereference.

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

    Andrew Price
     

10 Oct, 2012

1 commit

  • Fuzzing with trinity oopsed on the 1st instruction of shmem_fh_to_dentry(),
    u64 inum = fid->raw[2];
    which is unhelpfully reported as at the end of shmem_alloc_inode():

    BUG: unable to handle kernel paging request at ffff880061cd3000
    IP: [] shmem_alloc_inode+0x40/0x40
    Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
    Call Trace:
    [] ? exportfs_decode_fh+0x79/0x2d0
    [] do_handle_open+0x163/0x2c0
    [] sys_open_by_handle_at+0xc/0x10
    [] tracesys+0xe1/0xe6

    Right, tmpfs is being stupid to access fid->raw[2] before validating that
    fh_len includes it: the buffer kmalloc'ed by do_sys_name_to_handle() may
    fall at the end of a page, and the next page not be present.

    But some other filesystems (ceph, gfs2, isofs, reiserfs, xfs) are being
    careless about fh_len too, in fh_to_dentry() and/or fh_to_parent(), and
    could oops in the same way: add the missing fh_len checks to those.

    Reported-by: Sasha Levin
    Signed-off-by: Hugh Dickins
    Cc: Al Viro
    Cc: Sage Weil
    Cc: Steven Whitehouse
    Cc: Christoph Hellwig
    Cc: stable@vger.kernel.org
    Signed-off-by: Al Viro

    Hugh Dickins
     

09 Oct, 2012

1 commit

  • Move actual pte filling for non-linear file mappings into the new special
    vma operation: ->remap_pages().

    Filesystems must implement this method to get non-linear mapping support,
    if it uses filemap_fault() then generic_file_remap_pages() can be used.

    Now device drivers can implement this method and obtain nonlinear vma support.

    Signed-off-by: Konstantin Khlebnikov
    Cc: Alexander Viro
    Cc: Carsten Otte
    Cc: Chris Metcalf #arch/tile
    Cc: Cyrill Gorcunov
    Cc: Eric Paris
    Cc: H. Peter Anvin
    Cc: Hugh Dickins
    Cc: Ingo Molnar
    Cc: James Morris
    Cc: Jason Baron
    Cc: Kentaro Takeda
    Cc: Matt Helsley
    Cc: Nick Piggin
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Robert Richter
    Cc: Suresh Siddha
    Cc: Tetsuo Handa
    Cc: Venkatesh Pallipadi
    Acked-by: Linus Torvalds
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Konstantin Khlebnikov
     

03 Oct, 2012

2 commits

  • Pull user namespace changes from Eric Biederman:
    "This is a mostly modest set of changes to enable basic user namespace
    support. This allows the code to code to compile with user namespaces
    enabled and removes the assumption there is only the initial user
    namespace. Everything is converted except for the most complex of the
    filesystems: autofs4, 9p, afs, ceph, cifs, coda, fuse, gfs2, ncpfs,
    nfs, ocfs2 and xfs as those patches need a bit more review.

    The strategy is to push kuid_t and kgid_t values are far down into
    subsystems and filesystems as reasonable. Leaving the make_kuid and
    from_kuid operations to happen at the edge of userspace, as the values
    come off the disk, and as the values come in from the network.
    Letting compile type incompatible compile errors (present when user
    namespaces are enabled) guide me to find the issues.

    The most tricky areas have been the places where we had an implicit
    union of uid and gid values and were storing them in an unsigned int.
    Those places were converted into explicit unions. I made certain to
    handle those places with simple trivial patches.

    Out of that work I discovered we have generic interfaces for storing
    quota by projid. I had never heard of the project identifiers before.
    Adding full user namespace support for project identifiers accounts
    for most of the code size growth in my git tree.

    Ultimately there will be work to relax privlige checks from
    "capable(FOO)" to "ns_capable(user_ns, FOO)" where it is safe allowing
    root in a user names to do those things that today we only forbid to
    non-root users because it will confuse suid root applications.

    While I was pushing kuid_t and kgid_t changes deep into the audit code
    I made a few other cleanups. I capitalized on the fact we process
    netlink messages in the context of the message sender. I removed
    usage of NETLINK_CRED, and started directly using current->tty.

    Some of these patches have also made it into maintainer trees, with no
    problems from identical code from different trees showing up in
    linux-next.

    After reading through all of this code I feel like I might be able to
    win a game of kernel trivial pursuit."

    Fix up some fairly trivial conflicts in netfilter uid/git logging code.

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: (107 commits)
    userns: Convert the ufs filesystem to use kuid/kgid where appropriate
    userns: Convert the udf filesystem to use kuid/kgid where appropriate
    userns: Convert ubifs to use kuid/kgid
    userns: Convert squashfs to use kuid/kgid where appropriate
    userns: Convert reiserfs to use kuid and kgid where appropriate
    userns: Convert jfs to use kuid/kgid where appropriate
    userns: Convert jffs2 to use kuid and kgid where appropriate
    userns: Convert hpfs to use kuid and kgid where appropriate
    userns: Convert btrfs to use kuid/kgid where appropriate
    userns: Convert bfs to use kuid/kgid where appropriate
    userns: Convert affs to use kuid/kgid wherwe appropriate
    userns: On alpha modify linux_to_osf_stat to use convert from kuids and kgids
    userns: On ia64 deal with current_uid and current_gid being kuid and kgid
    userns: On ppc convert current_uid from a kuid before printing.
    userns: Convert s390 getting uid and gid system calls to use kuid and kgid
    userns: Convert s390 hypfs to use kuid and kgid where appropriate
    userns: Convert binder ipc to use kuids
    userns: Teach security_path_chown to take kuids and kgids
    userns: Add user namespace support to IMA
    userns: Convert EVM to deal with kuids and kgids in it's hmac computation
    ...

    Linus Torvalds
     
  • Pull workqueue changes from Tejun Heo:
    "This is workqueue updates for v3.7-rc1. A lot of activities this
    round including considerable API and behavior cleanups.

    * delayed_work combines a timer and a work item. The handling of the
    timer part has always been a bit clunky leading to confusing
    cancelation API with weird corner-case behaviors. delayed_work is
    updated to use new IRQ safe timer and cancelation now works as
    expected.

    * Another deficiency of delayed_work was lack of the counterpart of
    mod_timer() which led to cancel+queue combinations or open-coded
    timer+work usages. mod_delayed_work[_on]() are added.

    These two delayed_work changes make delayed_work provide interface
    and behave like timer which is executed with process context.

    * A work item could be executed concurrently on multiple CPUs, which
    is rather unintuitive and made flush_work() behavior confusing and
    half-broken under certain circumstances. This problem doesn't
    exist for non-reentrant workqueues. While non-reentrancy check
    isn't free, the overhead is incurred only when a work item bounces
    across different CPUs and even in simulated pathological scenario
    the overhead isn't too high.

    All workqueues are made non-reentrant. This removes the
    distinction between flush_[delayed_]work() and
    flush_[delayed_]_work_sync(). The former is now as strong as the
    latter and the specified work item is guaranteed to have finished
    execution of any previous queueing on return.

    * In addition to the various bug fixes, Lai redid and simplified CPU
    hotplug handling significantly.

    * Joonsoo introduced system_highpri_wq and used it during CPU
    hotplug.

    There are two merge commits - one to pull in IRQ safe timer from
    tip/timers/core and the other to pull in CPU hotplug fixes from
    wq/for-3.6-fixes as Lai's hotplug restructuring depended on them."

    Fixed a number of trivial conflicts, but the more interesting conflicts
    were silent ones where the deprecated interfaces had been used by new
    code in the merge window, and thus didn't cause any real data conflicts.

    Tejun pointed out a few of them, I fixed a couple more.

    * 'for-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: (46 commits)
    workqueue: remove spurious WARN_ON_ONCE(in_irq()) from try_to_grab_pending()
    workqueue: use cwq_set_max_active() helper for workqueue_set_max_active()
    workqueue: introduce cwq_set_max_active() helper for thaw_workqueues()
    workqueue: remove @delayed from cwq_dec_nr_in_flight()
    workqueue: fix possible stall on try_to_grab_pending() of a delayed work item
    workqueue: use hotcpu_notifier() for workqueue_cpu_down_callback()
    workqueue: use __cpuinit instead of __devinit for cpu callbacks
    workqueue: rename manager_mutex to assoc_mutex
    workqueue: WORKER_REBIND is no longer necessary for idle rebinding
    workqueue: WORKER_REBIND is no longer necessary for busy rebinding
    workqueue: reimplement idle worker rebinding
    workqueue: deprecate __cancel_delayed_work()
    workqueue: reimplement cancel_delayed_work() using try_to_grab_pending()
    workqueue: use mod_delayed_work() instead of __cancel + queue
    workqueue: use irqsafe timer for delayed_work
    workqueue: clean up delayed_work initializers and add missing one
    workqueue: make deferrable delayed_work initializer names consistent
    workqueue: cosmetic whitespace updates for macro definitions
    workqueue: deprecate system_nrt[_freezable]_wq
    workqueue: deprecate flush[_delayed]_work_sync()
    ...

    Linus Torvalds
     

24 Sep, 2012

6 commits

  • If a dirty GFS2 inode was being deleted but was in use by another node, its
    metadata was not getting written out before GFS2 checked for dirty buffers in
    gfs2_ail_flush(). GFS2 was relying on inode_go_sync() to write out the
    metadata when the other node tried to free the file, but it failed the error
    check before it got that far. This patch writes out the metadata before calling
    gfs2_ail_flush()

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

    Benjamin Marzinski
     
  • gfs2_ail_empty_gl() contains an "inline version" of gfs2_trans_begin(),
    so it needs an explicit sb_start_intwrite() as well, to balance the
    sb_end_intwrite() which will be called by gfs2_trans_end().

    With this, xfstest 068 passes on lock_nolock local gfs2.
    Without it, we reach a writer count of -1 and get stuck.

    Signed-off-by: Eric Sandeen
    Signed-off-by: Steven Whitehouse

    Eric Sandeen
     
  • This patch fixes an infinite loop in gfs2_rbm_find that was introduced
    by the previous patch. The problem occurred when the length was less
    than 3 but the rbm block was byte-aligned, causing it to improperly
    return a extent length of zero, which caused it to spin.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse
    Tested-by: Bob Peterson
    Tested-by: Barry Marson

    Bob Peterson
     
  • With the recently added block reservation code, an additional function
    was added to search for free blocks. This had a restriction of only being
    able to search for aligned extents of free blocks. As a result the
    allocation patterns when reserving blocks were suboptimal when the
    existing allocation of blocks for an inode was not aligned to the same
    boundary.

    This patch resolves that problem by adding the ability for gfs2_rbm_find
    to search for extents of a particular minimum size. We can then use
    gfs2_rbm_find for both looking for reservations, and also looking for
    free blocks on an individual basis when we actually come to do the
    allocation later on. As a result we only need a single set of code
    to deal with both situations.

    The function gfs2_rbm_from_block() is moved up rgrp.c so that it
    occurs before all of its callers.

    Many thanks are due to Bob for helping track down the final issue in
    this patch. That fix to the rb_tree traversal and to not share
    block reservations from a dirctory to its children is included here.

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

    Steven Whitehouse
     
  • GFS2 uses i_mutex on its system quota inode to synchronize writes to
    quota file. Since this is an internal inode to GFS2 (not part of directory
    hiearchy or visible by user) we are safe to define locking rules for it. So
    let's just get it its own locking class to make it clear.

    Signed-off-by: Jan Kara
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Steven Whitehouse

    Jan Kara
     
  • This patch stops multiple block allocations if a nonzero
    return code is received from gfs2_rbm_from_block. Without
    this patch, if enough pressure is put on the file system,
    you get a kernel warning quickly followed by:
    BUG: unable to handle kernel NULL pointer dereference at (null)
    IP: [] gfs2_alloc_blocks+0x2c8/0x880 [gfs2]
    With this patch, things run normally.

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

    Bob Peterson