01 Oct, 2014

1 commit

  • This patch fixes a regression in the patch "GFS2: Remember directory
    insert point", commit 2b47dad866d04f14c328f888ba5406057b8c7d33.
    The problem had to do with the rename function: The function found
    space for the new dirent, and remembered that location. But then the
    old dirent was removed, which often moved the eligible location for
    the renamed dirent. Putting the new dirent at the saved location
    caused file system corruption.

    This patch adds a new "save_loc" variable to struct gfs2_diradd.
    If 1, the dirent location is saved. If 0, the dirent location is not
    saved and the buffer_head is released as per previous behavior.

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

    Bob Peterson
     

06 Jan, 2014

2 commits

  • When we look to see if there is enough space to add a dir
    entry without allocation, we have then been repeating the
    same search later when we do the actual insertion. This
    patch caches the details of the location in the gfs2_diradd
    structure, so that we do not have to repeat the search.

    This will provide a performance improvement which will be
    greater as the size of the directory increases.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The intent is that this structure will hold the information
    required when adding entries to a directory (linking). To
    start with, it will contain only the number of blocks which
    are required to link the new entry into the directory. The
    current calculation returns either 0 or the maximim number of
    blocks that can ever be requested by such a transaction.

    The intent is that in a later patch, we can update the dir
    code to calculate this value more accurately. In addition
    further patches will also add further fields to the new
    structure to increase its utility.

    In addition this patch fixes a bug where the link used during
    inode creation was adding requesting too many blocks in
    some cases. This is harmless unless the fs is close to being
    full.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

03 Jul, 2013

1 commit

  • Pull GFS2 updates from Steven Whitehouse:
    "There are a few bug fixes for various, mostly very minor corner cases,
    plus some interesting new features.

    The new features include atomic_open whose main benefit will be the
    reduction in locking overhead in case of combined lookup/create and
    open operations, sorting the log buffer lists by block number to
    improve the efficiency of AIL writeback, and aggressively issuing
    revokes in gfs2_log_flush to reduce overhead when dropping glocks."

    * git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw:
    GFS2: Reserve journal space for quota change in do_grow
    GFS2: Fix fstrim boundary conditions
    GFS2: fix warning message
    GFS2: aggressively issue revokes in gfs2_log_flush
    GFS2: fix regression in dir_double_exhash
    GFS2: Add atomic_open support
    GFS2: Only do one directory search on create
    GFS2: fix error propagation in init_threads()
    GFS2: Remove no-op wrapper function
    GFS2: Cocci spatch "ptr_ret.spatch"
    GFS2: Eliminate gfs2_rg_lops
    GFS2: Sort buffer lists by inplace block number

    Linus Torvalds
     

29 Jun, 2013

1 commit


11 Jun, 2013

1 commit

  • Creation of a new inode requires a directory search in order to ensure
    that we are not trying to create an inode with the same name as an
    existing one. This was hidden away inside the create_ok() function.

    In the case that there was an existing inode, and a lookup can be
    substituted for a create (which is the case with regular files
    when the O_EXCL flag is not in use) then we were doing a second
    lookup in order to return the inode.

    This patch merges these two lookups into one. This can be done by
    passing a flag to gfs2_dir_search() to tell it to just return -EEXIST
    in the cases where we don't actually want to look up the inode.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

08 Nov, 2011

1 commit

  • This patch adds read-ahead capability to GFS2's
    directory hash table management. It greatly improves
    performance for some directory operations. For example:
    In one of my file systems that has 1000 directories, each
    of which has 1000 files, time to execute a recursive
    ls (time ls -fR /mnt/gfs2 > /dev/null) was reduced
    from 2m2.814s on a stock kernel to 0m45.938s.

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

    Bob Peterson
     

15 Jul, 2011

1 commit

  • This patch adds a cache for the hash table to the directory code
    in order to help simplify the way in which the hash table is
    accessed. This is intended to be a first step towards introducing
    some performance improvements in the directory code.

    There are two follow ups that I'm hoping to see fairly shortly. One
    is to simplify the hash table reading code now that we always read the
    complete hash table, whether we want one entry or all of them. The
    other is to introduce readahead on the heads of the hash chains
    which are referred to from the table.

    The hash table is a maximum of 128k in size, so it is not worth trying
    to read it in small chunks.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

09 May, 2011

2 commits

  • This adds an increment of the link count when we add a new directory
    entry, if that entry is itself a directory. This means that we no
    longer need separate code to perform this operation.

    Now that both adding and removing directory entries automatically
    update the parent directory's link count if required, that makes
    the code shorter and simpler than before.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • When we remove an entry from a directory, we can save ourselves
    some trouble if we know the type of the entry in question, since
    if it is itself a directory, we can update the link count of the
    parent at the same time as removing the directory entry.

    In addition this patch also merges the rmdir and unlink code which
    was almost identical anyway. This eliminates the calls to remove
    the . and .. directory entries on each rmdir (not needed since the
    directory will be deallocated, anyway) which was the only thing preventing
    passing the dentry to gfs2_dir_del(). The passing of the dentry
    rather than just the name allows us to figure out the type of the entry
    which is being removed, and thus adjust the link count when required.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

20 Sep, 2010

1 commit


05 Jan, 2009

1 commit


09 Jul, 2007

1 commit

  • This patch cleans up the inode number handling code. The main difference
    is that instead of looking up the inodes using a struct gfs2_inum_host
    we now use just the no_addr member of this structure. The tests relating
    to no_formal_ino can then be done by the calling code. This has
    advantages in that we want to do different things in different code
    paths if the no_formal_ino doesn't match. In the NFS patch we want to
    return -ESTALE, but in the ->lookup() path, its a bug in the fs if the
    no_formal_ino doesn't match and thus we can withdraw in this case.

    In order to later fix bz #201012, we need to be able to look up an inode
    without knowing no_formal_ino, as the only information that is known to
    us is the on-disk location of the inode in question.

    This patch will also help us to fix bz #236099 at a later date by
    cleaning up a lot of the code in that area.

    There are no user visible changes as a result of this patch and there
    are no changes to the on-disk format either.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

06 Feb, 2007

1 commit

  • This removes the extra filldir callback which gfs2 was using to
    enclose an attempt at readahead for inodes during readdir. The
    code was too complicated and also hurts performance badly in the
    case that the getdents64/readdir call isn't being followed by
    stat() and it wasn't even getting it right all the time when it
    was.

    As a result, on my test box an "ls" of a directory containing 250000
    files fell from about 7mins (freshly mounted, so nothing cached) to
    between about 15 to 25 seconds. When the directory content was cached,
    the time taken fell from about 3mins to about 4 or 5 seconds.

    Interestingly in the cached case, running "ls -l" once reduced the time
    taken for subsequent runs of "ls" to about 6 secs even without this
    patch. Now it turns out that there was a special case of glocks being
    used for prefetching the metadata, but because of the timeouts for these
    locks (set to 10 secs) the metadata was being timed out before it was
    being used and this the prefetch code was constantly trying to prefetch
    the same data over and over.

    Calling "ls -l" meant that the inodes were brought into memory and once
    the inodes are cached, the glocks are not disposed of until the inodes
    are pushed out of the cache, thus extending the lifetime of the glocks,
    and thus bringing down the time for subsequent runs of "ls"
    considerably.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

30 Nov, 2006

1 commit


05 Sep, 2006

3 commits


01 Sep, 2006

1 commit

  • As per comments from Jan Engelhardt this
    updates the copyright message to say "version" in full rather than
    "v.2". Also incore.h has been updated to remove forward structure
    declarations which are not required.

    The gfs2_quota_lvb structure has now had endianess annotations added
    to it. Also quota.c has been updated so that we now store the
    lvb data locally in endian independant format to avoid needing
    a structure in host endianess too. As a result the endianess
    conversions are done as required at various points and thus the
    conversion routines in lvb.[ch] are no longer required. I've
    moved the one remaining constant in lvb.h thats used into lm.h
    and removed the unused lvb.[ch].

    I have not changed the HIF_ constants. That is left to a later patch
    which I hope will unify the gh_flags and gh_iflags fields of the
    struct gfs2_holder.

    Cc: Jan Engelhardt
    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

19 May, 2006

1 commit


24 Apr, 2006

1 commit


29 Mar, 2006

1 commit

  • This reduces the size of the directory code by about 3k and gets
    readdir() to use the functions which were introduced in the previous
    directory code update.

    Two memory allocations are merged into one. Eliminates zeroing of some
    buffers which were never used before they were initialised by
    other data.

    There is still scope for further improvement in the directory code.

    On the logging side, a hand created mutex has been replaced by a
    standard Linux mutex in the log allocation code.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

21 Mar, 2006

1 commit

  • Due to a typo, the dir leaf split operation was (for the first
    split in a directory) writing the new hash vaules at the
    wrong offset. This is now fixed.

    Also some other tidy ups are included:

    - We use GFS2's hash function for dentries (see ops_dentry.c) so that
    we don't have to keep recalculating the hash values.
    - A lot of common code is eliminated between the various directory
    lookup routines.
    - Better error checking on directory lookup (previously different
    routines checked for different errors)
    - The leaf split operation has a couple of redundant operations
    removed from it, so it should be faster.

    There is still further scope for further clean ups in the directory
    code, and readdir in particular could do with slimming down a bit.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

08 Feb, 2006

1 commit

  • This is a very large patch, with a few still to be resolved issues
    so you might want to check out the previous head of the tree since
    this is known to be unstable. Fixes for the various bugs will be
    forthcoming shortly.

    This patch removes the special data format which has been used
    up till now for journaled data files. Directories still retain the
    old format so that they will remain on disk compatible with earlier
    releases. As a result you can now do the following with journaled
    data files:

    1) mmap them
    2) export them over NFS
    3) convert to/from normal files whenever you want to (the zero length
    restriction is gone)

    In addition the level at which GFS' locking is done has changed for all
    files (since they all now use the page cache) such that the locking is
    done at the page cache level rather than the level of the fs operations.
    This should mean that things like loopback mounts and other things which
    touch the page cache directly should now work.

    Current known issues:

    1. There is a lock mode inversion problem related to the resource
    group hold function which needs to be resolved.
    2. Any significant amount of I/O causes an oops with an offset of hex 320
    (NULL pointer dereference) which appears to be related to a journaled data
    buffer appearing on a list where it shouldn't be.
    3. Direct I/O writes are disabled for the time being (will reappear later)
    4. There is probably a deadlock between the page lock and GFS' locks under
    certain combinations of mmap and fs operation I/O.
    5. Issue relating to ref counting on internally used inodes causes a hang
    on umount (discovered before this patch, and not fixed by it)
    6. One part of the directory metadata is different from GFS1 and will need
    to be resolved before next release.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

18 Jan, 2006

1 commit


17 Jan, 2006

1 commit