07 Oct, 2020

1 commit

  • Refactor xfs_getfsmap to improve its performance: instead of indirectly
    calling a function that copies one record to userspace at a time, create
    a shadow buffer in the kernel and copy the whole array once at the end.
    On the author's computer, this reduces the runtime on his /home by ~20%.

    This also eliminates a deadlock when running GETFSMAP against the
    realtime device. The current code locks the rtbitmap to create
    fsmappings and copies them into userspace, having not released the
    rtbitmap lock. If the userspace buffer is an mmap of a sparse file that
    itself resides on the realtime device, the write page fault will recurse
    into the fs for allocation, which will deadlock on the rtbitmap lock.

    Fixes: 4c934c7dd60c ("xfs: report realtime space information via the rtbitmap")
    Signed-off-by: Darrick J. Wong
    Reviewed-by: Christoph Hellwig
    Reviewed-by: Chandan Babu R

    Darrick J. Wong
     

07 Jun, 2018

1 commit

  • Remove the verbose license text from XFS files and replace them
    with SPDX tags. This does not change the license of any of the code,
    merely refers to the common, up-to-date license files in LICENSES/

    This change was mostly scripted. fs/xfs/Makefile and
    fs/xfs/libxfs/xfs_fs.h were modified by hand, the rest were detected
    and modified by the following command:

    for f in `git grep -l "GNU General" fs/xfs/` ; do
    echo $f
    cat $f | awk -f hdr.awk > $f.new
    mv -f $f.new $f
    done

    And the hdr.awk script that did the modification (including
    detecting the difference between GPL-2.0 and GPL-2.0+ licenses)
    is as follows:

    $ cat hdr.awk
    BEGIN {
    hdr = 1.0
    tag = "GPL-2.0"
    str = ""
    }

    /^ \* This program is free software/ {
    hdr = 2.0;
    next
    }

    /any later version./ {
    tag = "GPL-2.0+"
    next
    }

    /^ \*\// {
    if (hdr > 0.0) {
    print "// SPDX-License-Identifier: " tag
    print str
    print $0
    str=""
    hdr = 0.0
    next
    }
    print $0
    next
    }

    /^ \* / {
    if (hdr > 1.0)
    next
    if (hdr > 0.0) {
    if (str != "")
    str = str "\n"
    str = str $0
    next
    }
    print $0
    next
    }

    /^ \*/ {
    if (hdr > 0.0)
    next
    print $0
    next
    }

    // {
    if (hdr > 0.0) {
    if (str != "")
    str = str "\n"
    str = str $0
    next
    }
    print $0
    }

    END { }
    $

    Signed-off-by: Dave Chinner
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    Dave Chinner
     

04 Apr, 2017

1 commit